@beeq/core 1.12.14-beta.0 → 1.13.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.
- package/dist/beeq/beeq.esm.js +1 -1
- package/dist/beeq/beeq.esm.js.map +1 -1
- package/dist/beeq/index.esm.js +1 -1
- package/dist/beeq/{p-9d1503bd.entry.js → p-0d078519.entry.js} +2 -2
- package/dist/beeq/{p-9d1503bd.entry.js.map → p-0d078519.entry.js.map} +1 -1
- package/dist/beeq/{p-7f9d895b.entry.js → p-1a2c4878.entry.js} +2 -2
- package/dist/beeq/{p-7f9d895b.entry.js.map → p-1a2c4878.entry.js.map} +1 -1
- package/dist/beeq/p-21db4f39.entry.js +6 -0
- package/dist/beeq/p-21db4f39.entry.js.map +1 -0
- package/dist/beeq/{p-f47905ae.entry.js → p-24bb2588.entry.js} +2 -2
- package/dist/beeq/{p-f47905ae.entry.js.map → p-24bb2588.entry.js.map} +1 -1
- package/dist/beeq/{p-41910dc5.entry.js → p-2a081a54.entry.js} +2 -2
- package/dist/beeq/{p-41910dc5.entry.js.map → p-2a081a54.entry.js.map} +1 -1
- package/dist/beeq/{p-515a1162.entry.js → p-2e1fffcd.entry.js} +2 -2
- package/dist/beeq/{p-515a1162.entry.js.map → p-2e1fffcd.entry.js.map} +1 -1
- package/dist/beeq/p-2fd6ea70.entry.js +6 -0
- package/dist/beeq/{p-2283258e.entry.js.map → p-2fd6ea70.entry.js.map} +1 -1
- package/dist/beeq/{p-7d356cce.entry.js → p-30d1bd84.entry.js} +2 -2
- package/dist/beeq/p-30d1bd84.entry.js.map +1 -0
- package/dist/beeq/{p-882966dd.entry.js → p-38006c8e.entry.js} +2 -2
- package/dist/beeq/p-3d754d97.entry.js +6 -0
- package/dist/beeq/p-3d754d97.entry.js.map +1 -0
- package/dist/beeq/{p-e9535627.entry.js → p-45ae19aa.entry.js} +2 -2
- package/dist/beeq/p-45ae19aa.entry.js.map +1 -0
- package/dist/beeq/{p-54bfb042.entry.js → p-56b49d4e.entry.js} +2 -2
- package/dist/beeq/{p-54bfb042.entry.js.map → p-56b49d4e.entry.js.map} +1 -1
- package/dist/beeq/{p-0d8618d2.entry.js → p-58813f83.entry.js} +2 -2
- package/dist/beeq/{p-0d8618d2.entry.js.map → p-58813f83.entry.js.map} +1 -1
- package/dist/beeq/{p-050c757b.entry.js → p-5eba392c.entry.js} +2 -2
- package/dist/beeq/{p-050c757b.entry.js.map → p-5eba392c.entry.js.map} +1 -1
- package/dist/beeq/{p-debcabde.entry.js → p-6a38fcaf.entry.js} +2 -2
- package/dist/beeq/{p-debcabde.entry.js.map → p-6a38fcaf.entry.js.map} +1 -1
- package/dist/beeq/{p-8dfd0329.entry.js → p-6b0f896f.entry.js} +2 -2
- package/dist/beeq/{p-a0ef4135.entry.js → p-6be3f23a.entry.js} +2 -2
- package/dist/beeq/{p-a0ef4135.entry.js.map → p-6be3f23a.entry.js.map} +1 -1
- package/dist/beeq/{p-ea473f56.entry.js → p-72ff2fe2.entry.js} +2 -2
- package/dist/beeq/{p-7527b08d.entry.js → p-79fd999a.entry.js} +2 -2
- package/dist/beeq/{p-7527b08d.entry.js.map → p-79fd999a.entry.js.map} +1 -1
- package/dist/beeq/{p-0323869d.entry.js → p-7ebe6b9d.entry.js} +2 -2
- package/dist/beeq/p-7ebe6b9d.entry.js.map +1 -0
- package/dist/beeq/{p-250ee94e.entry.js → p-817f7a5e.entry.js} +2 -2
- package/dist/beeq/{p-250ee94e.entry.js.map → p-817f7a5e.entry.js.map} +1 -1
- package/dist/beeq/{p-ad419446.entry.js → p-8bd7f4c2.entry.js} +2 -2
- package/dist/beeq/{p-e63d6c4f.entry.js → p-8be7ceb5.entry.js} +2 -2
- package/dist/beeq/{p-e63d6c4f.entry.js.map → p-8be7ceb5.entry.js.map} +1 -1
- package/dist/beeq/{p-42e388d0.entry.js → p-9413a4d3.entry.js} +2 -2
- package/dist/beeq/{p-42e388d0.entry.js.map → p-9413a4d3.entry.js.map} +1 -1
- package/dist/beeq/{p-c25c20bf.entry.js → p-96f72671.entry.js} +2 -2
- package/dist/beeq/p-96f72671.entry.js.map +1 -0
- package/dist/beeq/{p-CO2T68hs.js → p-BSSRzVAz.js} +2 -2
- package/dist/beeq/p-BSSRzVAz.js.map +1 -0
- package/dist/beeq/p-DbxZ8FhA.js +6 -0
- package/dist/beeq/p-DbxZ8FhA.js.map +1 -0
- package/dist/beeq/p-DdvbF5yL.js.map +1 -1
- package/dist/beeq/p-Dx-CEPSQ.js.map +1 -1
- package/dist/beeq/p-a0a8ea5b.entry.js +6 -0
- package/dist/beeq/p-a0a8ea5b.entry.js.map +1 -0
- package/dist/beeq/{p-2e9bc398.entry.js → p-a55354ee.entry.js} +2 -2
- package/dist/beeq/{p-2e9bc398.entry.js.map → p-a55354ee.entry.js.map} +1 -1
- package/dist/beeq/{p-7adb6e2e.entry.js → p-a72671f9.entry.js} +2 -2
- package/dist/beeq/p-a72671f9.entry.js.map +1 -0
- package/dist/beeq/{p-40bb4e2c.entry.js → p-bb99b400.entry.js} +2 -2
- package/dist/beeq/{p-40bb4e2c.entry.js.map → p-bb99b400.entry.js.map} +1 -1
- package/dist/beeq/p-bdb983f9.entry.js +6 -0
- package/dist/beeq/{p-bb46524f.entry.js.map → p-bdb983f9.entry.js.map} +1 -1
- package/dist/beeq/{p-cfe07fad.entry.js → p-cf2e4d57.entry.js} +2 -2
- package/dist/beeq/{p-cfe07fad.entry.js.map → p-cf2e4d57.entry.js.map} +1 -1
- package/dist/beeq/{p-6cd90918.entry.js → p-d6c35472.entry.js} +2 -2
- package/dist/beeq/{p-6cd90918.entry.js.map → p-d6c35472.entry.js.map} +1 -1
- package/dist/beeq/p-d792e3d3.entry.js +6 -0
- package/dist/beeq/{p-edc81a31.entry.js.map → p-d792e3d3.entry.js.map} +1 -1
- package/dist/beeq/{p-bae91da4.entry.js → p-e91ee0da.entry.js} +2 -2
- package/dist/beeq/{p-bae91da4.entry.js.map → p-e91ee0da.entry.js.map} +1 -1
- package/dist/beeq/{p-1fb43de2.entry.js → p-e9a1b183.entry.js} +2 -2
- package/dist/beeq/{p-580f0a77.entry.js → p-f3184477.entry.js} +2 -2
- package/dist/beeq/{p-580f0a77.entry.js.map → p-f3184477.entry.js.map} +1 -1
- package/dist/beeq/p-f688d230.entry.js +6 -0
- package/dist/beeq/{p-1e675bdc.entry.js.map → p-f688d230.entry.js.map} +1 -1
- package/dist/beeq/{p-3c77308c.entry.js → p-f891fb4b.entry.js} +2 -2
- package/dist/beeq/{p-40163197.entry.js → p-fa123a10.entry.js} +2 -2
- package/dist/beeq/{p-40163197.entry.js.map → p-fa123a10.entry.js.map} +1 -1
- package/dist/beeq/p-kY6d9Evy.js +6 -0
- package/dist/beeq/p-kY6d9Evy.js.map +1 -0
- package/dist/beeq/p-uqkxeAeG.js.map +1 -1
- package/dist/beeq/svg/.icons-meta.json +13 -0
- package/dist/beeq.html-custom-data.json +2214 -106
- package/dist/cjs/beeq.cjs.js +3 -3
- package/dist/cjs/beeq.cjs.js.map +1 -1
- package/dist/cjs/bq-accordion-group.cjs.entry.js +2 -2
- package/dist/cjs/bq-accordion-group.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-accordion.cjs.entry.js +3 -3
- package/dist/cjs/bq-accordion.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-alert.cjs.entry.js +3 -3
- package/dist/cjs/bq-alert.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-avatar.cjs.entry.js +3 -3
- package/dist/cjs/bq-avatar.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-badge.cjs.entry.js +3 -3
- package/dist/cjs/bq-breadcrumb-item.cjs.entry.js +3 -3
- package/dist/cjs/bq-breadcrumb-item.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-breadcrumb.cjs.entry.js +2 -2
- package/dist/cjs/bq-breadcrumb.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-button_2.cjs.entry.js +6 -6
- package/dist/cjs/bq-button_2.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-card.cjs.entry.js +3 -3
- package/dist/cjs/bq-card.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-checkbox.cjs.entry.js +35 -22
- package/dist/cjs/bq-checkbox.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-date-picker.cjs.entry.js +1743 -366
- package/dist/cjs/bq-date-picker.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-dialog.cjs.entry.js +7 -7
- package/dist/cjs/bq-dialog.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-divider.cjs.entry.js +7 -7
- package/dist/cjs/bq-drawer.cjs.entry.js +7 -7
- package/dist/cjs/bq-drawer.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-dropdown_2.cjs.entry.js +6 -6
- package/dist/cjs/bq-dropdown_2.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-empty-state.cjs.entry.js +8 -8
- package/dist/cjs/bq-empty-state.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-input.cjs.entry.js +17 -10
- package/dist/cjs/bq-input.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-notification.cjs.entry.js +8 -8
- package/dist/cjs/bq-notification.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-option-group.cjs.entry.js +3 -3
- package/dist/cjs/bq-option-group.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-option-list_2.cjs.entry.js +10 -10
- package/dist/cjs/bq-option-list_2.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-option.cjs.entry.js +5 -5
- package/dist/cjs/bq-page-title.cjs.entry.js +6 -6
- package/dist/cjs/bq-page-title.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-progress.cjs.entry.js +7 -7
- package/dist/cjs/bq-progress.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-radio-group.cjs.entry.js +8 -12
- package/dist/cjs/bq-radio-group.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-radio.cjs.entry.js +5 -5
- package/dist/cjs/bq-radio.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-select.cjs.entry.js +39 -10
- package/dist/cjs/bq-select.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-side-menu-item.cjs.entry.js +2 -2
- package/dist/cjs/bq-side-menu-item.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-side-menu.cjs.entry.js +3 -3
- package/dist/cjs/bq-slider.cjs.entry.js +4 -4
- package/dist/cjs/bq-slider.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-spinner.cjs.entry.js +8 -8
- package/dist/cjs/bq-spinner.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-status.cjs.entry.js +4 -4
- package/dist/cjs/bq-status.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-step-item.cjs.entry.js +7 -7
- package/dist/cjs/bq-step-item.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-steps.cjs.entry.js +4 -4
- package/dist/cjs/bq-switch.cjs.entry.js +9 -20
- package/dist/cjs/bq-switch.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-tab-group.cjs.entry.js +5 -5
- package/dist/cjs/bq-tab.cjs.entry.js +6 -6
- package/dist/cjs/bq-tab.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-textarea.cjs.entry.js +17 -15
- package/dist/cjs/bq-textarea.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-toast.cjs.entry.js +5 -7
- package/dist/cjs/bq-toast.cjs.entry.js.map +1 -1
- package/dist/cjs/bq-tooltip.cjs.entry.js +6 -6
- package/dist/cjs/bq-tooltip.cjs.entry.js.map +1 -1
- package/dist/cjs/{cssVariables-exM7Oz37.js → cssVariables-DuVz7KcV.js} +3 -3
- package/dist/cjs/cssVariables-DuVz7KcV.js.map +1 -0
- package/dist/cjs/event-BhuEFC-I.js.map +1 -1
- package/dist/cjs/{index-BSrsKFVG.js → index-J9jJ-fFQ.js} +47 -12
- package/dist/cjs/index-J9jJ-fFQ.js.map +1 -0
- package/dist/cjs/index.cjs.js +2 -2
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/{props-DzFXZXSF.js → props-BXpv3G-e.js} +6 -5
- package/dist/cjs/props-BXpv3G-e.js.map +1 -0
- package/dist/cjs/slot-DKWrtk4b.js.map +1 -1
- package/dist/cjs/transition-C0S-pYqN.js.map +1 -1
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/accordion-group/scss/bq-accordion-group.css +1 -1
- package/dist/collection/components/alert/scss/bq-alert.css +1 -1
- package/dist/collection/components/avatar/scss/bq-avatar.css +1 -1
- package/dist/collection/components/breadcrumb/scss/bq-breadcrumb.css +1 -1
- package/dist/collection/components/breadcrumb-item/bq-breadcrumb-item.js +1 -1
- package/dist/collection/components/breadcrumb-item/bq-breadcrumb-item.js.map +1 -1
- package/dist/collection/components/breadcrumb-item/scss/bq-breadcrumb-item.css +1 -1
- package/dist/collection/components/button/scss/bq-button.css +1 -1
- package/dist/collection/components/card/scss/bq-card.css +1 -1
- package/dist/collection/components/checkbox/bq-checkbox.js +35 -21
- package/dist/collection/components/checkbox/bq-checkbox.js.map +1 -1
- package/dist/collection/components/checkbox/scss/bq-checkbox.css +1 -1
- package/dist/collection/components/date-picker/bq-date-picker.js +1141 -457
- package/dist/collection/components/date-picker/bq-date-picker.js.map +1 -1
- package/dist/collection/components/date-picker/bq-date-picker.types.js +29 -0
- package/dist/collection/components/date-picker/bq-date-picker.types.js.map +1 -1
- package/dist/collection/components/date-picker/components/CalendarDayView.js +96 -0
- package/dist/collection/components/date-picker/components/CalendarDayView.js.map +1 -0
- package/dist/collection/components/date-picker/components/CalendarHeader.js +18 -0
- package/dist/collection/components/date-picker/components/CalendarHeader.js.map +1 -0
- package/dist/collection/components/date-picker/components/CalendarMonthView.js +70 -0
- package/dist/collection/components/date-picker/components/CalendarMonthView.js.map +1 -0
- package/dist/collection/components/date-picker/components/CalendarYearView.js +68 -0
- package/dist/collection/components/date-picker/components/CalendarYearView.js.map +1 -0
- package/dist/collection/components/date-picker/helper/bounds.js +114 -0
- package/dist/collection/components/date-picker/helper/bounds.js.map +1 -0
- package/dist/collection/components/date-picker/helper/calendar.js +156 -0
- package/dist/collection/components/date-picker/helper/calendar.js.map +1 -0
- package/dist/collection/components/date-picker/helper/constants.js +62 -16
- package/dist/collection/components/date-picker/helper/constants.js.map +1 -1
- package/dist/collection/components/date-picker/helper/input.js +37 -0
- package/dist/collection/components/date-picker/helper/input.js.map +1 -0
- package/dist/collection/components/date-picker/helper/intl.js +78 -0
- package/dist/collection/components/date-picker/helper/intl.js.map +1 -0
- package/dist/collection/components/date-picker/helper/labels.js +61 -0
- package/dist/collection/components/date-picker/helper/labels.js.map +1 -0
- package/dist/collection/components/date-picker/helper/navigation.js +45 -0
- package/dist/collection/components/date-picker/helper/navigation.js.map +1 -0
- package/dist/collection/components/date-picker/helper/selection.js +167 -0
- package/dist/collection/components/date-picker/helper/selection.js.map +1 -0
- package/dist/collection/components/date-picker/helper/value.js +49 -0
- package/dist/collection/components/date-picker/helper/value.js.map +1 -0
- package/dist/collection/components/date-picker/scss/bq-date-picker.css +1 -1
- package/dist/collection/components/dialog/bq-dialog.js +4 -4
- package/dist/collection/components/dialog/scss/bq-dialog.css +1 -1
- package/dist/collection/components/divider/bq-divider.js +4 -4
- package/dist/collection/components/drawer/bq-drawer.js +4 -4
- package/dist/collection/components/drawer/scss/bq-drawer.css +1 -1
- package/dist/collection/components/dropdown/bq-dropdown.js +1 -1
- package/dist/collection/components/dropdown/scss/bq-dropdown.css +1 -1
- package/dist/collection/components/empty-state/bq-empty-state.js +5 -5
- package/dist/collection/components/empty-state/scss/bq-empty-state.css +1 -1
- package/dist/collection/components/icon/bq-icon.js +1 -1
- package/dist/collection/components/icon/helper/request.js +1 -1
- package/dist/collection/components/icon/helper/request.js.map +1 -1
- package/dist/collection/components/icon/svg/.icons-meta.json +13 -0
- package/dist/collection/components/input/bq-input.js +15 -8
- package/dist/collection/components/input/bq-input.js.map +1 -1
- package/dist/collection/components/input/scss/bq-input.css +1 -1
- package/dist/collection/components/notification/bq-notification.js +5 -5
- package/dist/collection/components/notification/bq-notification.js.map +1 -1
- package/dist/collection/components/notification/scss/bq-notification.css +1 -1
- package/dist/collection/components/option/bq-option.js +4 -4
- package/dist/collection/components/option-group/bq-option-group.js +1 -1
- package/dist/collection/components/option-group/scss/bq-option-group.css +1 -1
- package/dist/collection/components/option-list/bq-option-list.js +1 -1
- package/dist/collection/components/option-list/scss/bq-option-list.css +1 -1
- package/dist/collection/components/page-title/bq-page-title.js +4 -4
- package/dist/collection/components/page-title/scss/bq-page-title.css +1 -1
- package/dist/collection/components/panel/bq-panel.js +2 -2
- package/dist/collection/components/panel/scss/bq-panel.css +1 -1
- package/dist/collection/components/progress/bq-progress.js +4 -4
- package/dist/collection/components/progress/scss/bq-progress.css +1 -1
- package/dist/collection/components/radio/bq-radio.js +5 -4
- package/dist/collection/components/radio/bq-radio.js.map +1 -1
- package/dist/collection/components/radio/scss/bq-radio.css +1 -1
- package/dist/collection/components/radio-group/bq-radio-group.js +6 -10
- package/dist/collection/components/radio-group/bq-radio-group.js.map +1 -1
- package/dist/collection/components/select/bq-select.js +59 -10
- package/dist/collection/components/select/bq-select.js.map +1 -1
- package/dist/collection/components/select/scss/bq-select.css +1 -1
- package/dist/collection/components/side-menu/bq-side-menu.js +2 -2
- package/dist/collection/components/side-menu-item/scss/bq-side-menu-item.css +1 -1
- package/dist/collection/components/slider/bq-slider.js +2 -2
- package/dist/collection/components/spinner/bq-spinner.js +4 -4
- package/dist/collection/components/spinner/scss/bq-spinner.css +1 -1
- package/dist/collection/components/status/bq-status.js +1 -1
- package/dist/collection/components/status/scss/bq-status.css +1 -1
- package/dist/collection/components/step-item/bq-step-item.js +4 -4
- package/dist/collection/components/step-item/scss/bq-step-item.css +1 -1
- package/dist/collection/components/steps/bq-steps.js +2 -2
- package/dist/collection/components/switch/bq-switch.js +9 -18
- package/dist/collection/components/switch/bq-switch.js.map +1 -1
- package/dist/collection/components/switch/scss/bq-switch.css +1 -1
- package/dist/collection/components/tab/bq-tab.js +3 -3
- package/dist/collection/components/tab/scss/bq-tab.css +1 -1
- package/dist/collection/components/tab-group/bq-tab-group.js +3 -3
- package/dist/collection/components/tag/bq-tag.js +4 -4
- package/dist/collection/components/tag/scss/bq-tag.css +1 -1
- package/dist/collection/components/textarea/bq-textarea.js +15 -13
- package/dist/collection/components/textarea/bq-textarea.js.map +1 -1
- package/dist/collection/components/textarea/scss/bq-textarea.css +1 -1
- package/dist/collection/components/toast/bq-toast.js +2 -4
- package/dist/collection/components/toast/bq-toast.js.map +1 -1
- package/dist/collection/components/toast/scss/bq-toast.css +1 -1
- package/dist/collection/components/tooltip/bq-tooltip.js +4 -4
- package/dist/collection/components/tooltip/scss/bq-tooltip.css +1 -1
- package/dist/collection/shared/test-utils/computedStyle.js +24 -24
- package/dist/collection/shared/test-utils/computedStyle.js.map +1 -1
- package/dist/collection/shared/test-utils/sleep.js +5 -1
- package/dist/collection/shared/test-utils/sleep.js.map +1 -1
- package/dist/collection/shared/utils/cssVariables.js +1 -1
- package/dist/collection/shared/utils/cssVariables.js.map +1 -1
- package/dist/collection/shared/utils/event.js.map +1 -1
- package/dist/collection/shared/utils/props.js +4 -3
- package/dist/collection/shared/utils/props.js.map +1 -1
- package/dist/collection/shared/utils/slot.js.map +1 -1
- package/dist/collection/shared/utils/transition.js.map +1 -1
- package/dist/components/bq-accordion-group.js +1 -1
- package/dist/components/bq-accordion.js +1 -1
- package/dist/components/bq-alert.js +1 -1
- package/dist/components/bq-avatar.js +1 -1
- package/dist/components/bq-badge.js +1 -1
- package/dist/components/bq-breadcrumb-item.js +1 -1
- package/dist/components/bq-breadcrumb-item.js.map +1 -1
- package/dist/components/bq-breadcrumb.js +1 -1
- package/dist/components/bq-button.js +1 -1
- package/dist/components/bq-card.js +1 -1
- package/dist/components/bq-checkbox.js +1 -1
- package/dist/components/bq-checkbox.js.map +1 -1
- package/dist/components/bq-date-picker.js +1 -1
- package/dist/components/bq-date-picker.js.map +1 -1
- package/dist/components/bq-dialog.js +1 -1
- package/dist/components/bq-dialog.js.map +1 -1
- package/dist/components/bq-divider.js +1 -1
- package/dist/components/bq-drawer.js +1 -1
- package/dist/components/bq-drawer.js.map +1 -1
- package/dist/components/bq-dropdown.js +1 -1
- package/dist/components/bq-empty-state.js +1 -1
- package/dist/components/bq-icon.js +1 -1
- package/dist/components/bq-input.js +1 -1
- package/dist/components/bq-input.js.map +1 -1
- package/dist/components/bq-notification.js +1 -1
- package/dist/components/bq-notification.js.map +1 -1
- package/dist/components/bq-option-group.js +1 -1
- package/dist/components/bq-option-group.js.map +1 -1
- package/dist/components/bq-option-list.js +1 -1
- package/dist/components/bq-option.js +1 -1
- package/dist/components/bq-page-title.js +1 -1
- package/dist/components/bq-page-title.js.map +1 -1
- package/dist/components/bq-panel.js +1 -1
- package/dist/components/bq-progress.js +1 -1
- package/dist/components/bq-radio-group.js +1 -1
- package/dist/components/bq-radio-group.js.map +1 -1
- package/dist/components/bq-radio.js +1 -1
- package/dist/components/bq-radio.js.map +1 -1
- package/dist/components/bq-select.js +1 -1
- package/dist/components/bq-select.js.map +1 -1
- package/dist/components/bq-side-menu-item.js +1 -1
- package/dist/components/bq-side-menu.js +1 -1
- package/dist/components/bq-slider.js +1 -1
- package/dist/components/bq-spinner.js +1 -1
- package/dist/components/bq-status.js +1 -1
- package/dist/components/bq-status.js.map +1 -1
- package/dist/components/bq-step-item.js +1 -1
- package/dist/components/bq-step-item.js.map +1 -1
- package/dist/components/bq-steps.js +1 -1
- package/dist/components/bq-switch.js +1 -1
- package/dist/components/bq-switch.js.map +1 -1
- package/dist/components/bq-tab-group.js +1 -1
- package/dist/components/bq-tab.js +1 -1
- package/dist/components/bq-tag.js +1 -1
- package/dist/components/bq-textarea.js +1 -1
- package/dist/components/bq-textarea.js.map +1 -1
- package/dist/components/bq-toast.js +1 -1
- package/dist/components/bq-toast.js.map +1 -1
- package/dist/components/bq-tooltip.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/{p-YjPwN7vu.js → p-2eUC8A3N.js} +2 -2
- package/dist/components/p-2eUC8A3N.js.map +1 -0
- package/dist/components/{p-D3RCJ1ti.js → p-BBCVL6R0.js} +2 -2
- package/dist/components/{p-BY4GkNoQ.js → p-BMHXMsVR.js} +2 -2
- package/dist/components/{p-4ksDMBf6.js → p-BS8hIETL.js} +2 -2
- package/dist/components/{p-DTsYGX5p.js → p-CWawcXxA.js} +2 -2
- package/dist/components/{p-DTsYGX5p.js.map → p-CWawcXxA.js.map} +1 -1
- package/dist/components/{p-fdkSHq2G.js → p-D6ngGq0Y.js} +2 -2
- package/dist/components/p-D6ngGq0Y.js.map +1 -0
- package/dist/components/{p-B99eLANt.js → p-DMKBBBUE.js} +2 -2
- package/dist/components/p-DbxZ8FhA.js +6 -0
- package/dist/components/p-DbxZ8FhA.js.map +1 -0
- package/dist/components/{p-CvvcRGDG.js → p-Dd3v3b2E.js} +2 -2
- package/dist/components/p-DdvbF5yL.js.map +1 -1
- package/dist/components/p-Dx-CEPSQ.js.map +1 -1
- package/dist/components/{p-Dj-mQvqv.js → p-iyX-PhkX.js} +2 -2
- package/dist/components/p-kY6d9Evy.js +6 -0
- package/dist/components/p-kY6d9Evy.js.map +1 -0
- package/dist/components/p-uqkxeAeG.js.map +1 -1
- package/dist/{beeq/p-edc81a31.entry.js → components/p-v3c5-Hhf.js} +2 -2
- package/dist/components/p-v3c5-Hhf.js.map +1 -0
- package/dist/custom-elements.json +25954 -1583
- package/dist/esm/beeq.js +4 -4
- package/dist/esm/beeq.js.map +1 -1
- package/dist/esm/bq-accordion-group.entry.js +2 -2
- package/dist/esm/bq-accordion-group.entry.js.map +1 -1
- package/dist/esm/bq-accordion.entry.js +3 -3
- package/dist/esm/bq-accordion.entry.js.map +1 -1
- package/dist/esm/bq-alert.entry.js +3 -3
- package/dist/esm/bq-alert.entry.js.map +1 -1
- package/dist/esm/bq-avatar.entry.js +3 -3
- package/dist/esm/bq-avatar.entry.js.map +1 -1
- package/dist/esm/bq-badge.entry.js +3 -3
- package/dist/esm/bq-breadcrumb-item.entry.js +3 -3
- package/dist/esm/bq-breadcrumb-item.entry.js.map +1 -1
- package/dist/esm/bq-breadcrumb.entry.js +2 -2
- package/dist/esm/bq-breadcrumb.entry.js.map +1 -1
- package/dist/esm/bq-button_2.entry.js +6 -6
- package/dist/esm/bq-button_2.entry.js.map +1 -1
- package/dist/esm/bq-card.entry.js +3 -3
- package/dist/esm/bq-card.entry.js.map +1 -1
- package/dist/esm/bq-checkbox.entry.js +35 -22
- package/dist/esm/bq-checkbox.entry.js.map +1 -1
- package/dist/esm/bq-date-picker.entry.js +1744 -367
- package/dist/esm/bq-date-picker.entry.js.map +1 -1
- package/dist/esm/bq-dialog.entry.js +7 -7
- package/dist/esm/bq-dialog.entry.js.map +1 -1
- package/dist/esm/bq-divider.entry.js +7 -7
- package/dist/esm/bq-drawer.entry.js +7 -7
- package/dist/esm/bq-drawer.entry.js.map +1 -1
- package/dist/esm/bq-dropdown_2.entry.js +6 -6
- package/dist/esm/bq-dropdown_2.entry.js.map +1 -1
- package/dist/esm/bq-empty-state.entry.js +8 -8
- package/dist/esm/bq-empty-state.entry.js.map +1 -1
- package/dist/esm/bq-input.entry.js +17 -10
- package/dist/esm/bq-input.entry.js.map +1 -1
- package/dist/esm/bq-notification.entry.js +8 -8
- package/dist/esm/bq-notification.entry.js.map +1 -1
- package/dist/esm/bq-option-group.entry.js +3 -3
- package/dist/esm/bq-option-group.entry.js.map +1 -1
- package/dist/esm/bq-option-list_2.entry.js +10 -10
- package/dist/esm/bq-option-list_2.entry.js.map +1 -1
- package/dist/esm/bq-option.entry.js +5 -5
- package/dist/esm/bq-page-title.entry.js +6 -6
- package/dist/esm/bq-page-title.entry.js.map +1 -1
- package/dist/esm/bq-progress.entry.js +7 -7
- package/dist/esm/bq-progress.entry.js.map +1 -1
- package/dist/esm/bq-radio-group.entry.js +8 -12
- package/dist/esm/bq-radio-group.entry.js.map +1 -1
- package/dist/esm/bq-radio.entry.js +5 -5
- package/dist/esm/bq-radio.entry.js.map +1 -1
- package/dist/esm/bq-select.entry.js +39 -10
- package/dist/esm/bq-select.entry.js.map +1 -1
- package/dist/esm/bq-side-menu-item.entry.js +2 -2
- package/dist/esm/bq-side-menu-item.entry.js.map +1 -1
- package/dist/esm/bq-side-menu.entry.js +3 -3
- package/dist/esm/bq-slider.entry.js +4 -4
- package/dist/esm/bq-slider.entry.js.map +1 -1
- package/dist/esm/bq-spinner.entry.js +8 -8
- package/dist/esm/bq-spinner.entry.js.map +1 -1
- package/dist/esm/bq-status.entry.js +4 -4
- package/dist/esm/bq-status.entry.js.map +1 -1
- package/dist/esm/bq-step-item.entry.js +7 -7
- package/dist/esm/bq-step-item.entry.js.map +1 -1
- package/dist/esm/bq-steps.entry.js +4 -4
- package/dist/esm/bq-switch.entry.js +9 -20
- package/dist/esm/bq-switch.entry.js.map +1 -1
- package/dist/esm/bq-tab-group.entry.js +5 -5
- package/dist/esm/bq-tab.entry.js +6 -6
- package/dist/esm/bq-tab.entry.js.map +1 -1
- package/dist/esm/bq-textarea.entry.js +17 -15
- package/dist/esm/bq-textarea.entry.js.map +1 -1
- package/dist/esm/bq-toast.entry.js +5 -7
- package/dist/esm/bq-toast.entry.js.map +1 -1
- package/dist/esm/bq-tooltip.entry.js +6 -6
- package/dist/esm/bq-tooltip.entry.js.map +1 -1
- package/dist/esm/{cssVariables-CyiWA5Ok.js → cssVariables-DhGXeOL_.js} +3 -3
- package/dist/esm/cssVariables-DhGXeOL_.js.map +1 -0
- package/dist/esm/event-Dx-CEPSQ.js.map +1 -1
- package/dist/esm/{index-CO2T68hs.js → index-BSSRzVAz.js} +47 -12
- package/dist/esm/index-BSSRzVAz.js.map +1 -0
- package/dist/esm/index.js +2 -2
- package/dist/esm/loader.js +3 -3
- package/dist/esm/{props-zh4P02Kn.js → props-DbxZ8FhA.js} +6 -5
- package/dist/esm/props-DbxZ8FhA.js.map +1 -0
- package/dist/esm/slot-uqkxeAeG.js.map +1 -1
- package/dist/esm/transition-DdvbF5yL.js.map +1 -1
- package/dist/hydrate/index.js +2142 -675
- package/dist/hydrate/index.mjs +2142 -675
- package/dist/stencil.config.js +7 -0
- package/dist/stencil.config.js.map +1 -1
- package/dist/types/components/checkbox/bq-checkbox.d.ts +4 -3
- package/dist/types/components/date-picker/bq-date-picker.d.ts +330 -238
- package/dist/types/components/date-picker/bq-date-picker.types.d.ts +30 -39
- package/dist/types/components/date-picker/components/CalendarDayView.d.ts +42 -0
- package/dist/types/components/date-picker/components/CalendarHeader.d.ts +34 -0
- package/dist/types/components/date-picker/components/CalendarMonthView.d.ts +34 -0
- package/dist/types/components/date-picker/components/CalendarYearView.d.ts +32 -0
- package/dist/types/components/date-picker/helper/bounds.d.ts +49 -0
- package/dist/types/components/date-picker/helper/calendar.d.ts +78 -0
- package/dist/types/components/date-picker/helper/constants.d.ts +62 -16
- package/dist/types/components/date-picker/helper/input.d.ts +23 -0
- package/dist/types/components/date-picker/helper/intl.d.ts +38 -0
- package/dist/types/components/date-picker/helper/labels.d.ts +29 -0
- package/dist/types/components/date-picker/helper/navigation.d.ts +23 -0
- package/dist/types/components/date-picker/helper/selection.d.ts +44 -0
- package/dist/types/components/date-picker/helper/value.d.ts +31 -0
- package/dist/types/components/input/bq-input.d.ts +1 -0
- package/dist/types/components/radio/bq-radio.d.ts +2 -1
- package/dist/types/components/select/bq-select.d.ts +5 -0
- package/dist/types/components/switch/bq-switch.d.ts +2 -3
- package/dist/types/components.d.ts +450 -350
- package/dist/types/home/runner/work/BEEQ/BEEQ/.stencil/packages/beeq/vitest.config.d.ts +2 -0
- package/dist/types/shared/test-utils/computedStyle.d.ts +7 -6
- package/dist/types/shared/test-utils/setProperties.d.ts +1 -1
- package/dist/types/shared/test-utils/sleep.d.ts +5 -1
- package/dist/types/shared/utils/event.d.ts +1 -1
- package/dist/types/shared/utils/slot.d.ts +1 -1
- package/dist/types/stencil-public-runtime.d.ts +1 -0
- package/dist/vitest.config.js +81 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +1 -1
- package/dist/beeq/p-0323869d.entry.js.map +0 -1
- package/dist/beeq/p-1e675bdc.entry.js +0 -6
- package/dist/beeq/p-2283258e.entry.js +0 -6
- package/dist/beeq/p-654c7701.entry.js +0 -6
- package/dist/beeq/p-654c7701.entry.js.map +0 -1
- package/dist/beeq/p-7a6a89f1.entry.js +0 -6
- package/dist/beeq/p-7a6a89f1.entry.js.map +0 -1
- package/dist/beeq/p-7adb6e2e.entry.js.map +0 -1
- package/dist/beeq/p-7d356cce.entry.js.map +0 -1
- package/dist/beeq/p-CO2T68hs.js.map +0 -1
- package/dist/beeq/p-_RvVpeh2.js +0 -6
- package/dist/beeq/p-_RvVpeh2.js.map +0 -1
- package/dist/beeq/p-a83ce5aa.entry.js +0 -6
- package/dist/beeq/p-a83ce5aa.entry.js.map +0 -1
- package/dist/beeq/p-bb46524f.entry.js +0 -6
- package/dist/beeq/p-c25c20bf.entry.js.map +0 -1
- package/dist/beeq/p-e9535627.entry.js.map +0 -1
- package/dist/beeq/p-zh4P02Kn.js +0 -6
- package/dist/beeq/p-zh4P02Kn.js.map +0 -1
- package/dist/cjs/cssVariables-exM7Oz37.js.map +0 -1
- package/dist/cjs/index-BSrsKFVG.js.map +0 -1
- package/dist/cjs/props-DzFXZXSF.js.map +0 -1
- package/dist/collection/components/date-picker/libs/callyLibrary.js +0 -92
- package/dist/collection/components/date-picker/libs/callyLibrary.js.map +0 -1
- package/dist/components/p-DnqmdkvK.js +0 -6
- package/dist/components/p-DnqmdkvK.js.map +0 -1
- package/dist/components/p-YjPwN7vu.js.map +0 -1
- package/dist/components/p-_RvVpeh2.js +0 -6
- package/dist/components/p-_RvVpeh2.js.map +0 -1
- package/dist/components/p-fdkSHq2G.js.map +0 -1
- package/dist/components/p-zh4P02Kn.js +0 -6
- package/dist/components/p-zh4P02Kn.js.map +0 -1
- package/dist/esm/cssVariables-CyiWA5Ok.js.map +0 -1
- package/dist/esm/index-CO2T68hs.js.map +0 -1
- package/dist/esm/props-zh4P02Kn.js.map +0 -1
- package/dist/jest.config.js +0 -23
- package/dist/jest.config.js.map +0 -1
- package/dist/types/Users/dramos/PROJECTs/ENDAVA/BEEQ-Design-System/.stencil/packages/beeq/jest.config.d.ts +0 -19
- package/dist/types/components/date-picker/libs/callyLibrary.d.ts +0 -15
- /package/dist/beeq/{p-882966dd.entry.js.map → p-38006c8e.entry.js.map} +0 -0
- /package/dist/beeq/{p-8dfd0329.entry.js.map → p-6b0f896f.entry.js.map} +0 -0
- /package/dist/beeq/{p-ea473f56.entry.js.map → p-72ff2fe2.entry.js.map} +0 -0
- /package/dist/beeq/{p-ad419446.entry.js.map → p-8bd7f4c2.entry.js.map} +0 -0
- /package/dist/beeq/{p-1fb43de2.entry.js.map → p-e9a1b183.entry.js.map} +0 -0
- /package/dist/beeq/{p-3c77308c.entry.js.map → p-f891fb4b.entry.js.map} +0 -0
- /package/dist/components/{p-D3RCJ1ti.js.map → p-BBCVL6R0.js.map} +0 -0
- /package/dist/components/{p-BY4GkNoQ.js.map → p-BMHXMsVR.js.map} +0 -0
- /package/dist/components/{p-4ksDMBf6.js.map → p-BS8hIETL.js.map} +0 -0
- /package/dist/components/{p-B99eLANt.js.map → p-DMKBBBUE.js.map} +0 -0
- /package/dist/components/{p-CvvcRGDG.js.map → p-Dd3v3b2E.js.map} +0 -0
- /package/dist/components/{p-Dj-mQvqv.js.map → p-iyX-PhkX.js.map} +0 -0
- /package/dist/types/{Users/dramos/PROJECTs/ENDAVA/BEEQ-Design-System → home/runner/work/BEEQ/BEEQ}/.stencil/packages/beeq/stencil.config.d.ts +0 -0
- /package/dist/types/{Users/dramos/PROJECTs/ENDAVA/BEEQ-Design-System → home/runner/work/BEEQ/BEEQ}/.stencil/tailwind.config.d.ts +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Built by Endavans
|
|
3
|
+
* © https://beeq.design - Apache 2 License.
|
|
4
|
+
*/
|
|
5
|
+
import { h } from "@stencil/core";
|
|
6
|
+
import { isMonthWithinBounds } from "../helper/bounds";
|
|
7
|
+
import { CALENDAR_PARTS } from "../helper/constants";
|
|
8
|
+
import { getMonthNames } from "../helper/intl";
|
|
9
|
+
import { isRangeEnd, isRangeInner, isRangeStart, isSelected } from "../helper/selection";
|
|
10
|
+
/** ISO used to compare a month cell against the internal selection. */
|
|
11
|
+
const monthCellISO = (year, month) => `${year}-${String(month + 1).padStart(2, '0')}-01`;
|
|
12
|
+
const buildMonthParts = (state) => {
|
|
13
|
+
const parts = [CALENDAR_PARTS.month];
|
|
14
|
+
if (state.selected)
|
|
15
|
+
parts.push(CALENDAR_PARTS.monthSelected);
|
|
16
|
+
if (state.rangeStart)
|
|
17
|
+
parts.push(CALENDAR_PARTS.rangeStart);
|
|
18
|
+
if (state.rangeEnd)
|
|
19
|
+
parts.push(CALENDAR_PARTS.rangeEnd);
|
|
20
|
+
if (state.rangeInner)
|
|
21
|
+
parts.push(CALENDAR_PARTS.rangeInner);
|
|
22
|
+
if (state.disabled)
|
|
23
|
+
parts.push(CALENDAR_PARTS.disabled);
|
|
24
|
+
return parts.join(' ');
|
|
25
|
+
};
|
|
26
|
+
const buildMonthCellState = (year, month, focusedMonth, minISO, maxISO, selection, type) => {
|
|
27
|
+
const iso = monthCellISO(year, month);
|
|
28
|
+
const disabled = !isMonthWithinBounds(year, month, minISO, maxISO);
|
|
29
|
+
return {
|
|
30
|
+
iso,
|
|
31
|
+
disabled,
|
|
32
|
+
selected: isSelected(iso, selection, type),
|
|
33
|
+
rangeStart: isRangeStart(iso, selection, type),
|
|
34
|
+
rangeEnd: isRangeEnd(iso, selection, type),
|
|
35
|
+
rangeInner: isRangeInner(iso, selection, type),
|
|
36
|
+
isFocused: focusedMonth === month,
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
const chunkMonths = (months, columns) => {
|
|
40
|
+
const rows = [];
|
|
41
|
+
for (let month = 0; month < months.length; month += columns) {
|
|
42
|
+
rows.push(months.slice(month, month + columns).map((name, offset) => ({ month: month + offset, name })));
|
|
43
|
+
}
|
|
44
|
+
return rows;
|
|
45
|
+
};
|
|
46
|
+
const renderMonthCell = ({ month, name, state, onMonthSelect, onMonthFocus, onMonthHover }) => (
|
|
47
|
+
// biome-ignore lint/a11y/useFocusableInteractive: gridcell is a structural ARIA container; focus is managed by the child <button> via roving tabindex
|
|
48
|
+
h("div", { "aria-selected": state.selected ? 'true' : undefined, class: "bq-date-picker__month-gridcell", role: "gridcell", key: month }, h("button", { "aria-disabled": state.disabled ? 'true' : undefined, class: {
|
|
49
|
+
'bq-date-picker__month-cell': true,
|
|
50
|
+
'is-selected': state.selected,
|
|
51
|
+
'is-range-start': state.rangeStart,
|
|
52
|
+
'is-range-end': state.rangeEnd,
|
|
53
|
+
'is-range-inner': state.rangeInner,
|
|
54
|
+
'is-out-of-bounds': state.disabled,
|
|
55
|
+
}, "data-month": month, disabled: state.disabled, onClick: (ev) => !state.disabled && onMonthSelect(month, ev), onFocus: () => onMonthFocus(month), onMouseEnter: () => onMonthHover(state.iso), onMouseLeave: () => onMonthHover(undefined), part: `${CALENDAR_PARTS.button} ${buildMonthParts(state)}`, tabIndex: state.isFocused ? 0 : -1, type: "button" }, name)));
|
|
56
|
+
/**
|
|
57
|
+
* Month picker — 12 buttons in a 3×4 grid.
|
|
58
|
+
*/
|
|
59
|
+
export const CalendarMonthView = ({ year, focusedMonth, locale, minISO, maxISO, selection, tentativeRange, type, onMonthSelect, onMonthFocus, onMonthHover, onGridKeyDown, gridColumns, }) => {
|
|
60
|
+
const months = getMonthNames(locale, 'short');
|
|
61
|
+
const effectiveSelection = type === 'range' && tentativeRange.length === 2 ? tentativeRange : selection;
|
|
62
|
+
const rows = chunkMonths(months, gridColumns);
|
|
63
|
+
return (h("div", { class: "bq-date-picker__months", "data-grid-columns": String(gridColumns), onKeyDown: onGridKeyDown, part: CALENDAR_PARTS.months, role: "grid", tabIndex: -1 }, rows.map((row) => (
|
|
64
|
+
// biome-ignore lint/a11y/useFocusableInteractive: gridcell is a structural ARIA container; focus is managed by the child <button> via roving tabindex
|
|
65
|
+
h("div", { class: "bq-date-picker__month-row", role: "row", key: `month-row-${row.map(({ month }) => month).join('-')}` }, row.map(({ month, name }) => {
|
|
66
|
+
const state = buildMonthCellState(year, month, focusedMonth, minISO, maxISO, effectiveSelection, type);
|
|
67
|
+
return renderMonthCell({ month, name, state, onMonthSelect, onMonthFocus, onMonthHover });
|
|
68
|
+
}))))));
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=CalendarMonthView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CalendarMonthView.js","sourceRoot":"","sources":["../../../../../../../packages/beeq/src/components/date-picker/components/CalendarMonthView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,CAAC,EAAE,MAAM,eAAe,CAAC;AAG5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AA+BzF,uEAAuE;AACvE,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,KAAa,EAAU,EAAE,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;AAYjH,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAU,EAAE;IACzD,MAAM,KAAK,GAAa,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IAC7D,IAAI,KAAK,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAC1B,IAAY,EACZ,KAAa,EACb,YAAoB,EACpB,MAA0B,EAC1B,MAA0B,EAC1B,SAAqB,EACrB,IAAqB,EACJ,EAAE;IACnB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnE,OAAO;QACL,GAAG;QACH,QAAQ;QACR,QAAQ,EAAE,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC;QAC1C,UAAU,EAAE,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC;QAC9C,QAAQ,EAAE,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC;QAC1C,UAAU,EAAE,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC;QAC9C,SAAS,EAAE,YAAY,KAAK,KAAK;KAClC,CAAC;AACJ,CAAC,CAAC;AAWF,MAAM,WAAW,GAAG,CAAC,MAAgB,EAAE,OAAe,EAAiD,EAAE;IACvG,MAAM,IAAI,GAAkD,EAAE,CAAC;IAC/D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAwB,EAAE,EAAE,CAAC;AACnH,sJAAsJ;AACtJ,4BACiB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAClD,KAAK,EAAC,gCAAgC,EACtC,IAAI,EAAC,UAAU,EACf,GAAG,EAAE,KAAK;IAEV,+BACiB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAClD,KAAK,EAAE;YACL,4BAA4B,EAAE,IAAI;YAClC,aAAa,EAAE,KAAK,CAAC,QAAQ;YAC7B,gBAAgB,EAAE,KAAK,CAAC,UAAU;YAClC,cAAc,EAAE,KAAK,CAAC,QAAQ;YAC9B,gBAAgB,EAAE,KAAK,CAAC,UAAU;YAClC,kBAAkB,EAAE,KAAK,CAAC,QAAQ;SACnC,gBACW,KAAK,EACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC,EAC5D,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAClC,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAC3C,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,EAC3C,IAAI,EAAE,GAAG,cAAc,CAAC,MAAM,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,EAC1D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAClC,IAAI,EAAC,QAAQ,IAEZ,IAAI,CACE,CACL,CACP,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAiD,CAAC,EAC9E,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,MAAM,EACN,MAAM,EACN,SAAS,EACT,cAAc,EACd,IAAI,EACJ,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,WAAW,GACZ,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,kBAAkB,GAAe,IAAI,KAAK,OAAO,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IACpH,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAE9C,OAAO,CACL,WACE,KAAK,EAAC,wBAAwB,uBACX,MAAM,CAAC,WAAW,CAAC,EACtC,SAAS,EAAE,aAAa,EACxB,IAAI,EAAE,cAAc,CAAC,MAAM,EAC3B,IAAI,EAAC,MAAM,EACX,QAAQ,EAAE,CAAC,CAAC,IAEX,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;IACjB,sJAAsJ;IACtJ,WAAK,KAAK,EAAC,2BAA2B,EAAC,IAAI,EAAC,KAAK,EAAC,GAAG,EAAE,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAC1G,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;QACvG,OAAO,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;IAC5F,CAAC,CAAC,CACE,CACP,CAAC,CACE,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { type FunctionalComponent, h } from '@stencil/core';\n\nimport type { TDatePickerType, TSelection } from '../bq-date-picker.types';\nimport { isMonthWithinBounds } from '../helper/bounds';\nimport { CALENDAR_PARTS } from '../helper/constants';\nimport { getMonthNames } from '../helper/intl';\nimport { isRangeEnd, isRangeInner, isRangeStart, isSelected } from '../helper/selection';\n\nexport type TCalendarMonthViewProps = {\n /** Year currently shown in the header. */\n year: number;\n /** Focused month (0-based), used for the roving tabindex. */\n focusedMonth: number;\n /** Locale used for localized month names. */\n locale: Intl.LocalesArgument;\n /** Min year/month to keep enabled. */\n minISO?: string;\n /** Max year/month to keep enabled. */\n maxISO?: string;\n /** Current selection (as stored internally: array of YYYY-MM-DD). */\n selection: TSelection;\n /** In-progress range preview while hovering a second endpoint. */\n tentativeRange: TSelection;\n /** Selection type — drives multi / range highlighting. */\n type: TDatePickerType;\n /** Callback fired when the user picks a month. */\n onMonthSelect: (month: number, ev: MouseEvent | KeyboardEvent) => void;\n /** Callback fired when a month button receives focus. */\n onMonthFocus: (month: number) => void;\n /** Callback fired when hovering a month cell (range preview). */\n onMonthHover: (iso: string | undefined) => void;\n /** Optional keydown handler for the grid (roving tabindex management). */\n onGridKeyDown: (ev: KeyboardEvent) => void;\n /** Number of columns rendered by the month grid. */\n gridColumns: number;\n};\n\n/** ISO used to compare a month cell against the internal selection. */\nconst monthCellISO = (year: number, month: number): string => `${year}-${String(month + 1).padStart(2, '0')}-01`;\n\ntype TMonthCellState = {\n iso: string;\n disabled: boolean;\n selected: boolean;\n rangeStart: boolean;\n rangeEnd: boolean;\n rangeInner: boolean;\n isFocused: boolean;\n};\n\nconst buildMonthParts = (state: TMonthCellState): string => {\n const parts: string[] = [CALENDAR_PARTS.month];\n if (state.selected) parts.push(CALENDAR_PARTS.monthSelected);\n if (state.rangeStart) parts.push(CALENDAR_PARTS.rangeStart);\n if (state.rangeEnd) parts.push(CALENDAR_PARTS.rangeEnd);\n if (state.rangeInner) parts.push(CALENDAR_PARTS.rangeInner);\n if (state.disabled) parts.push(CALENDAR_PARTS.disabled);\n return parts.join(' ');\n};\n\nconst buildMonthCellState = (\n year: number,\n month: number,\n focusedMonth: number,\n minISO: string | undefined,\n maxISO: string | undefined,\n selection: TSelection,\n type: TDatePickerType,\n): TMonthCellState => {\n const iso = monthCellISO(year, month);\n const disabled = !isMonthWithinBounds(year, month, minISO, maxISO);\n return {\n iso,\n disabled,\n selected: isSelected(iso, selection, type),\n rangeStart: isRangeStart(iso, selection, type),\n rangeEnd: isRangeEnd(iso, selection, type),\n rangeInner: isRangeInner(iso, selection, type),\n isFocused: focusedMonth === month,\n };\n};\n\ntype TRenderMonthCellArgs = {\n month: number;\n name: string;\n state: TMonthCellState;\n onMonthSelect: (month: number, ev: MouseEvent | KeyboardEvent) => void;\n onMonthFocus: (month: number) => void;\n onMonthHover: (iso: string | undefined) => void;\n};\n\nconst chunkMonths = (months: string[], columns: number): Array<Array<{ month: number; name: string }>> => {\n const rows: Array<Array<{ month: number; name: string }>> = [];\n for (let month = 0; month < months.length; month += columns) {\n rows.push(months.slice(month, month + columns).map((name, offset) => ({ month: month + offset, name })));\n }\n return rows;\n};\n\nconst renderMonthCell = ({ month, name, state, onMonthSelect, onMonthFocus, onMonthHover }: TRenderMonthCellArgs) => (\n // biome-ignore lint/a11y/useFocusableInteractive: gridcell is a structural ARIA container; focus is managed by the child <button> via roving tabindex\n <div\n aria-selected={state.selected ? 'true' : undefined}\n class=\"bq-date-picker__month-gridcell\"\n role=\"gridcell\"\n key={month}\n >\n <button\n aria-disabled={state.disabled ? 'true' : undefined}\n class={{\n 'bq-date-picker__month-cell': true,\n 'is-selected': state.selected,\n 'is-range-start': state.rangeStart,\n 'is-range-end': state.rangeEnd,\n 'is-range-inner': state.rangeInner,\n 'is-out-of-bounds': state.disabled,\n }}\n data-month={month}\n disabled={state.disabled}\n onClick={(ev) => !state.disabled && onMonthSelect(month, ev)}\n onFocus={() => onMonthFocus(month)}\n onMouseEnter={() => onMonthHover(state.iso)}\n onMouseLeave={() => onMonthHover(undefined)}\n part={`${CALENDAR_PARTS.button} ${buildMonthParts(state)}`}\n tabIndex={state.isFocused ? 0 : -1}\n type=\"button\"\n >\n {name}\n </button>\n </div>\n);\n\n/**\n * Month picker — 12 buttons in a 3×4 grid.\n */\nexport const CalendarMonthView: FunctionalComponent<TCalendarMonthViewProps> = ({\n year,\n focusedMonth,\n locale,\n minISO,\n maxISO,\n selection,\n tentativeRange,\n type,\n onMonthSelect,\n onMonthFocus,\n onMonthHover,\n onGridKeyDown,\n gridColumns,\n}) => {\n const months = getMonthNames(locale, 'short');\n const effectiveSelection: TSelection = type === 'range' && tentativeRange.length === 2 ? tentativeRange : selection;\n const rows = chunkMonths(months, gridColumns);\n\n return (\n <div\n class=\"bq-date-picker__months\"\n data-grid-columns={String(gridColumns)}\n onKeyDown={onGridKeyDown}\n part={CALENDAR_PARTS.months}\n role=\"grid\"\n tabIndex={-1}\n >\n {rows.map((row) => (\n // biome-ignore lint/a11y/useFocusableInteractive: gridcell is a structural ARIA container; focus is managed by the child <button> via roving tabindex\n <div class=\"bq-date-picker__month-row\" role=\"row\" key={`month-row-${row.map(({ month }) => month).join('-')}`}>\n {row.map(({ month, name }) => {\n const state = buildMonthCellState(year, month, focusedMonth, minISO, maxISO, effectiveSelection, type);\n return renderMonthCell({ month, name, state, onMonthSelect, onMonthFocus, onMonthHover });\n })}\n </div>\n ))}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Built by Endavans
|
|
3
|
+
* © https://beeq.design - Apache 2 License.
|
|
4
|
+
*/
|
|
5
|
+
import { h } from "@stencil/core";
|
|
6
|
+
import { isYearWithinBounds } from "../helper/bounds";
|
|
7
|
+
import { CALENDAR_PARTS } from "../helper/constants";
|
|
8
|
+
import { isRangeEnd, isRangeInner, isRangeStart, isSelected } from "../helper/selection";
|
|
9
|
+
/** ISO used to compare a year cell against the internal selection. */
|
|
10
|
+
const yearCellISO = (year) => `${year}-01-01`;
|
|
11
|
+
const buildYearParts = (state) => {
|
|
12
|
+
const parts = [CALENDAR_PARTS.year];
|
|
13
|
+
if (state.selected)
|
|
14
|
+
parts.push(CALENDAR_PARTS.yearSelected);
|
|
15
|
+
if (state.rangeStart)
|
|
16
|
+
parts.push(CALENDAR_PARTS.rangeStart);
|
|
17
|
+
if (state.rangeEnd)
|
|
18
|
+
parts.push(CALENDAR_PARTS.rangeEnd);
|
|
19
|
+
if (state.rangeInner)
|
|
20
|
+
parts.push(CALENDAR_PARTS.rangeInner);
|
|
21
|
+
if (state.disabled)
|
|
22
|
+
parts.push(CALENDAR_PARTS.disabled);
|
|
23
|
+
return parts.join(' ');
|
|
24
|
+
};
|
|
25
|
+
const buildYearCellState = (year, focusedYear, minISO, maxISO, selection, type) => {
|
|
26
|
+
const iso = yearCellISO(year);
|
|
27
|
+
const disabled = !isYearWithinBounds(year, minISO, maxISO);
|
|
28
|
+
return {
|
|
29
|
+
iso,
|
|
30
|
+
disabled,
|
|
31
|
+
selected: isSelected(iso, selection, type),
|
|
32
|
+
rangeStart: isRangeStart(iso, selection, type),
|
|
33
|
+
rangeEnd: isRangeEnd(iso, selection, type),
|
|
34
|
+
rangeInner: isRangeInner(iso, selection, type),
|
|
35
|
+
isFocused: focusedYear === year,
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
const chunkYears = (years, columns) => {
|
|
39
|
+
const rows = [];
|
|
40
|
+
for (let index = 0; index < years.length; index += columns) {
|
|
41
|
+
rows.push(years.slice(index, index + columns));
|
|
42
|
+
}
|
|
43
|
+
return rows;
|
|
44
|
+
};
|
|
45
|
+
const renderYearCell = ({ year, state, onYearSelect, onYearFocus, onYearHover }) => (
|
|
46
|
+
// biome-ignore lint/a11y/useFocusableInteractive: gridcell is a structural ARIA container; focus is managed by the child <button> via roving tabindex
|
|
47
|
+
h("div", { "aria-selected": state.selected ? 'true' : undefined, class: "bq-date-picker__year-gridcell", key: year, role: "gridcell" }, h("button", { "aria-disabled": state.disabled ? 'true' : undefined, class: {
|
|
48
|
+
'bq-date-picker__year-cell': true,
|
|
49
|
+
'is-selected': state.selected,
|
|
50
|
+
'is-range-start': state.rangeStart,
|
|
51
|
+
'is-range-end': state.rangeEnd,
|
|
52
|
+
'is-range-inner': state.rangeInner,
|
|
53
|
+
'is-out-of-bounds': state.disabled,
|
|
54
|
+
}, "data-year": year, disabled: state.disabled, onClick: (ev) => !state.disabled && onYearSelect(year, ev), onFocus: () => onYearFocus(year), onMouseEnter: () => onYearHover(state.iso), onMouseLeave: () => onYearHover(undefined), part: `${CALENDAR_PARTS.button} ${buildYearParts(state)}`, tabIndex: state.isFocused ? 0 : -1, type: "button" }, year)));
|
|
55
|
+
/**
|
|
56
|
+
* Year picker — 12 buttons for a decade grid.
|
|
57
|
+
*/
|
|
58
|
+
export const CalendarYearView = ({ years, focusedYear, minISO, maxISO, selection, tentativeRange, type, onYearSelect, onYearFocus, onYearHover, onGridKeyDown, gridColumns, }) => {
|
|
59
|
+
const effectiveSelection = type === 'range' && tentativeRange.length === 2 ? tentativeRange : selection;
|
|
60
|
+
const rows = chunkYears(years, gridColumns);
|
|
61
|
+
return (h("div", { class: "bq-date-picker__years", "data-grid-columns": String(gridColumns), onKeyDown: onGridKeyDown, part: CALENDAR_PARTS.years, role: "grid", tabIndex: -1 }, rows.map((row) => (
|
|
62
|
+
// biome-ignore lint/a11y/useFocusableInteractive: gridcell is a structural ARIA container; focus is managed by the child <button> via roving tabindex
|
|
63
|
+
h("div", { class: "bq-date-picker__year-row", key: `year-row-${row.join('-')}`, role: "row" }, row.map((year) => {
|
|
64
|
+
const state = buildYearCellState(year, focusedYear, minISO, maxISO, effectiveSelection, type);
|
|
65
|
+
return renderYearCell({ year, state, onYearSelect, onYearFocus, onYearHover });
|
|
66
|
+
}))))));
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=CalendarYearView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CalendarYearView.js","sourceRoot":"","sources":["../../../../../../../packages/beeq/src/components/date-picker/components/CalendarYearView.tsx"],"names":[],"mappings":"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","sourcesContent":["import { type FunctionalComponent, h } from '@stencil/core';\n\nimport type { TDatePickerType, TSelection } from '../bq-date-picker.types';\nimport { isYearWithinBounds } from '../helper/bounds';\nimport { CALENDAR_PARTS } from '../helper/constants';\nimport { isRangeEnd, isRangeInner, isRangeStart, isSelected } from '../helper/selection';\n\nexport type TCalendarYearViewProps = {\n /** Years to render (typically 12). */\n years: number[];\n /** Focused year (roving tabindex target). */\n focusedYear: number;\n /** Optional min bound (any precision — `YYYY`, `YYYY-MM`, `YYYY-MM-DD`). */\n minISO?: string;\n /** Optional max bound (any precision). */\n maxISO?: string;\n /** Current selection (as stored internally: array of YYYY-MM-DD). */\n selection: TSelection;\n /** In-progress range preview while hovering a second endpoint. */\n tentativeRange: TSelection;\n /** Selection type — drives multi / range highlighting. */\n type: TDatePickerType;\n /** Callback fired when the user picks a year. */\n onYearSelect: (year: number, ev: MouseEvent | KeyboardEvent) => void;\n /** Callback fired when a year button receives focus. */\n onYearFocus: (year: number) => void;\n /** Callback fired when hovering a year cell (range preview). */\n onYearHover: (iso: string | undefined) => void;\n /** Optional keydown handler for the grid (roving tabindex management). */\n onGridKeyDown: (ev: KeyboardEvent) => void;\n /** Number of columns rendered by the year grid. */\n gridColumns: number;\n};\n\n/** ISO used to compare a year cell against the internal selection. */\nconst yearCellISO = (year: number): string => `${year}-01-01`;\n\ntype TYearCellState = {\n iso: string;\n disabled: boolean;\n selected: boolean;\n rangeStart: boolean;\n rangeEnd: boolean;\n rangeInner: boolean;\n isFocused: boolean;\n};\n\nconst buildYearParts = (state: TYearCellState): string => {\n const parts: string[] = [CALENDAR_PARTS.year];\n if (state.selected) parts.push(CALENDAR_PARTS.yearSelected);\n if (state.rangeStart) parts.push(CALENDAR_PARTS.rangeStart);\n if (state.rangeEnd) parts.push(CALENDAR_PARTS.rangeEnd);\n if (state.rangeInner) parts.push(CALENDAR_PARTS.rangeInner);\n if (state.disabled) parts.push(CALENDAR_PARTS.disabled);\n return parts.join(' ');\n};\n\nconst buildYearCellState = (\n year: number,\n focusedYear: number,\n minISO: string | undefined,\n maxISO: string | undefined,\n selection: TSelection,\n type: TDatePickerType,\n): TYearCellState => {\n const iso = yearCellISO(year);\n const disabled = !isYearWithinBounds(year, minISO, maxISO);\n return {\n iso,\n disabled,\n selected: isSelected(iso, selection, type),\n rangeStart: isRangeStart(iso, selection, type),\n rangeEnd: isRangeEnd(iso, selection, type),\n rangeInner: isRangeInner(iso, selection, type),\n isFocused: focusedYear === year,\n };\n};\n\ntype TRenderYearCellArgs = {\n year: number;\n state: TYearCellState;\n onYearSelect: (year: number, ev: MouseEvent | KeyboardEvent) => void;\n onYearFocus: (year: number) => void;\n onYearHover: (iso: string | undefined) => void;\n};\n\nconst chunkYears = (years: number[], columns: number): number[][] => {\n const rows: number[][] = [];\n for (let index = 0; index < years.length; index += columns) {\n rows.push(years.slice(index, index + columns));\n }\n return rows;\n};\n\nconst renderYearCell = ({ year, state, onYearSelect, onYearFocus, onYearHover }: TRenderYearCellArgs) => (\n // biome-ignore lint/a11y/useFocusableInteractive: gridcell is a structural ARIA container; focus is managed by the child <button> via roving tabindex\n <div\n aria-selected={state.selected ? 'true' : undefined}\n class=\"bq-date-picker__year-gridcell\"\n key={year}\n role=\"gridcell\"\n >\n <button\n aria-disabled={state.disabled ? 'true' : undefined}\n class={{\n 'bq-date-picker__year-cell': true,\n 'is-selected': state.selected,\n 'is-range-start': state.rangeStart,\n 'is-range-end': state.rangeEnd,\n 'is-range-inner': state.rangeInner,\n 'is-out-of-bounds': state.disabled,\n }}\n data-year={year}\n disabled={state.disabled}\n onClick={(ev) => !state.disabled && onYearSelect(year, ev)}\n onFocus={() => onYearFocus(year)}\n onMouseEnter={() => onYearHover(state.iso)}\n onMouseLeave={() => onYearHover(undefined)}\n part={`${CALENDAR_PARTS.button} ${buildYearParts(state)}`}\n tabIndex={state.isFocused ? 0 : -1}\n type=\"button\"\n >\n {year}\n </button>\n </div>\n);\n\n/**\n * Year picker — 12 buttons for a decade grid.\n */\nexport const CalendarYearView: FunctionalComponent<TCalendarYearViewProps> = ({\n years,\n focusedYear,\n minISO,\n maxISO,\n selection,\n tentativeRange,\n type,\n onYearSelect,\n onYearFocus,\n onYearHover,\n onGridKeyDown,\n gridColumns,\n}) => {\n const effectiveSelection: TSelection = type === 'range' && tentativeRange.length === 2 ? tentativeRange : selection;\n const rows = chunkYears(years, gridColumns);\n\n return (\n <div\n class=\"bq-date-picker__years\"\n data-grid-columns={String(gridColumns)}\n onKeyDown={onGridKeyDown}\n part={CALENDAR_PARTS.years}\n role=\"grid\"\n tabIndex={-1}\n >\n {rows.map((row) => (\n // biome-ignore lint/a11y/useFocusableInteractive: gridcell is a structural ARIA container; focus is managed by the child <button> via roving tabindex\n <div class=\"bq-date-picker__year-row\" key={`year-row-${row.join('-')}`} role=\"row\">\n {row.map((year) => {\n const state = buildYearCellState(year, focusedYear, minISO, maxISO, effectiveSelection, type);\n return renderYearCell({ year, state, onYearSelect, onYearFocus, onYearHover });\n })}\n </div>\n ))}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Built by Endavans
|
|
3
|
+
* © https://beeq.design - Apache 2 License.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Bounds predicates for the calendar.
|
|
7
|
+
*
|
|
8
|
+
* `min` and `max` may be at any wire precision (`YYYY`, `YYYY-MM`, or
|
|
9
|
+
* `YYYY-MM-DD`); internal cell values are always full `YYYY-MM-DD` strings.
|
|
10
|
+
* All predicates are pure and rely on lexicographic comparison, which is
|
|
11
|
+
* safe for ISO 8601 dates.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Extract the `YYYY` prefix (as a number) from a bound string.
|
|
15
|
+
* Returns `null` if the string does not begin with a 4-digit year.
|
|
16
|
+
*/
|
|
17
|
+
export const boundYear = (iso) => {
|
|
18
|
+
if (!iso)
|
|
19
|
+
return null;
|
|
20
|
+
const match = /^(\d{4})/.exec(iso);
|
|
21
|
+
return match ? Number(match[1]) : null;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Extract `{ year, month }` (month is 0-based) from a bound string. Falls
|
|
25
|
+
* back to `null` when the string doesn't contain a `YYYY-MM` prefix.
|
|
26
|
+
*/
|
|
27
|
+
export const boundYearMonth = (iso) => {
|
|
28
|
+
if (!iso)
|
|
29
|
+
return null;
|
|
30
|
+
const match = /^(\d{4})-(\d{2})/.exec(iso);
|
|
31
|
+
if (!match)
|
|
32
|
+
return null;
|
|
33
|
+
const month = Number(match[2]) - 1;
|
|
34
|
+
if (month < 0 || month > 11)
|
|
35
|
+
return null;
|
|
36
|
+
return { year: Number(match[1]), month };
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Whether a given year is within the (inclusive) `min`/`max` range.
|
|
40
|
+
* A year cell is considered in-range when any day inside that year is
|
|
41
|
+
* still selectable — i.e. we compare on the year prefix only, ignoring
|
|
42
|
+
* the month/day components of `min` / `max`.
|
|
43
|
+
*/
|
|
44
|
+
export const isYearWithinBounds = (year, min, max) => {
|
|
45
|
+
const minYear = boundYear(min);
|
|
46
|
+
const maxYear = boundYear(max);
|
|
47
|
+
if (minYear !== null && year < minYear)
|
|
48
|
+
return false;
|
|
49
|
+
if (maxYear !== null && year > maxYear)
|
|
50
|
+
return false;
|
|
51
|
+
return true;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Whether a `(year, month)` pair sits at-or-after the given lower bound.
|
|
55
|
+
* A `null`/`undefined` bound is treated as "no lower bound".
|
|
56
|
+
*/
|
|
57
|
+
const monthAtOrAfter = (year, month, bound) => {
|
|
58
|
+
const ym = boundYearMonth(bound);
|
|
59
|
+
if (ym)
|
|
60
|
+
return year > ym.year || (year === ym.year && month >= ym.month);
|
|
61
|
+
const y = boundYear(bound);
|
|
62
|
+
return y === null || year >= y;
|
|
63
|
+
};
|
|
64
|
+
/** Whether a `(year, month)` pair sits at-or-before the given upper bound. */
|
|
65
|
+
const monthAtOrBefore = (year, month, bound) => {
|
|
66
|
+
const ym = boundYearMonth(bound);
|
|
67
|
+
if (ym)
|
|
68
|
+
return year < ym.year || (year === ym.year && month <= ym.month);
|
|
69
|
+
const y = boundYear(bound);
|
|
70
|
+
return y === null || year <= y;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Whether a given `(year, month)` pair is within the (inclusive) `min`/`max`
|
|
74
|
+
* range. A month cell is considered in-range when any day inside that month
|
|
75
|
+
* would still satisfy the bounds — we compare on the year-month prefix and
|
|
76
|
+
* ignore the day component of `min` / `max`.
|
|
77
|
+
*/
|
|
78
|
+
export const isMonthWithinBounds = (year, month, min, max) => monthAtOrAfter(year, month, min) && monthAtOrBefore(year, month, max);
|
|
79
|
+
/**
|
|
80
|
+
* Whether a full `YYYY-MM-DD` iso date is within the (inclusive) `min`/`max`
|
|
81
|
+
* range. Bounds may be at any precision — we pad `min` to the earliest day
|
|
82
|
+
* (`YYYY-01-01`) and `max` to the latest day (`YYYY-12-31`) before doing a
|
|
83
|
+
* lexical compare (safe because ISO 8601 sorts by calendar order).
|
|
84
|
+
*/
|
|
85
|
+
export const isDateWithinBounds = (iso, min, max) => {
|
|
86
|
+
if (!iso)
|
|
87
|
+
return false;
|
|
88
|
+
const paddedMin = padBound(min, 'min');
|
|
89
|
+
const paddedMax = padBound(max, 'max');
|
|
90
|
+
if (paddedMin !== null && iso < paddedMin)
|
|
91
|
+
return false;
|
|
92
|
+
if (paddedMax !== null && iso > paddedMax)
|
|
93
|
+
return false;
|
|
94
|
+
return true;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Pad a bound string up to full `YYYY-MM-DD` length so it can be lexically
|
|
98
|
+
* compared with a full ISO date. `min` widens down (missing pieces become
|
|
99
|
+
* `-01`), `max` widens up (missing month → `-12`, missing day → last day of
|
|
100
|
+
* that month, honoring leap years).
|
|
101
|
+
*/
|
|
102
|
+
export const padBound = (iso, kind) => {
|
|
103
|
+
if (!iso)
|
|
104
|
+
return null;
|
|
105
|
+
const yearMatch = /^(\d{4})(?:-(\d{2}))?(?:-(\d{2}))?$/.exec(iso);
|
|
106
|
+
if (!yearMatch)
|
|
107
|
+
return null;
|
|
108
|
+
const year = yearMatch[1];
|
|
109
|
+
const month = yearMatch[2] ?? (kind === 'min' ? '01' : '12');
|
|
110
|
+
const day = yearMatch[3] ??
|
|
111
|
+
(kind === 'min' ? '01' : String(new Date(Number(year), Number(month), 0).getDate()).padStart(2, '0'));
|
|
112
|
+
return `${year}-${month}-${day}`;
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=bounds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounds.js","sourceRoot":"","sources":["../../../../../../../packages/beeq/src/components/date-picker/helper/bounds.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Bounds predicates for the calendar.\n *\n * `min` and `max` may be at any wire precision (`YYYY`, `YYYY-MM`, or\n * `YYYY-MM-DD`); internal cell values are always full `YYYY-MM-DD` strings.\n * All predicates are pure and rely on lexicographic comparison, which is\n * safe for ISO 8601 dates.\n */\n\n/**\n * Extract the `YYYY` prefix (as a number) from a bound string.\n * Returns `null` if the string does not begin with a 4-digit year.\n */\nexport const boundYear = (iso: string | undefined | null): number | null => {\n if (!iso) return null;\n const match = /^(\\d{4})/.exec(iso);\n return match ? Number(match[1]) : null;\n};\n\n/**\n * Extract `{ year, month }` (month is 0-based) from a bound string. Falls\n * back to `null` when the string doesn't contain a `YYYY-MM` prefix.\n */\nexport const boundYearMonth = (iso: string | undefined | null): { year: number; month: number } | null => {\n if (!iso) return null;\n const match = /^(\\d{4})-(\\d{2})/.exec(iso);\n if (!match) return null;\n const month = Number(match[2]) - 1;\n if (month < 0 || month > 11) return null;\n return { year: Number(match[1]), month };\n};\n\n/**\n * Whether a given year is within the (inclusive) `min`/`max` range.\n * A year cell is considered in-range when any day inside that year is\n * still selectable — i.e. we compare on the year prefix only, ignoring\n * the month/day components of `min` / `max`.\n */\nexport const isYearWithinBounds = (year: number, min?: string | null, max?: string | null): boolean => {\n const minYear = boundYear(min);\n const maxYear = boundYear(max);\n if (minYear !== null && year < minYear) return false;\n if (maxYear !== null && year > maxYear) return false;\n return true;\n};\n\n/**\n * Whether a `(year, month)` pair sits at-or-after the given lower bound.\n * A `null`/`undefined` bound is treated as \"no lower bound\".\n */\nconst monthAtOrAfter = (year: number, month: number, bound: string | undefined | null): boolean => {\n const ym = boundYearMonth(bound);\n if (ym) return year > ym.year || (year === ym.year && month >= ym.month);\n const y = boundYear(bound);\n return y === null || year >= y;\n};\n\n/** Whether a `(year, month)` pair sits at-or-before the given upper bound. */\nconst monthAtOrBefore = (year: number, month: number, bound: string | undefined | null): boolean => {\n const ym = boundYearMonth(bound);\n if (ym) return year < ym.year || (year === ym.year && month <= ym.month);\n const y = boundYear(bound);\n return y === null || year <= y;\n};\n\n/**\n * Whether a given `(year, month)` pair is within the (inclusive) `min`/`max`\n * range. A month cell is considered in-range when any day inside that month\n * would still satisfy the bounds — we compare on the year-month prefix and\n * ignore the day component of `min` / `max`.\n */\nexport const isMonthWithinBounds = (year: number, month: number, min?: string | null, max?: string | null): boolean =>\n monthAtOrAfter(year, month, min) && monthAtOrBefore(year, month, max);\n\n/**\n * Whether a full `YYYY-MM-DD` iso date is within the (inclusive) `min`/`max`\n * range. Bounds may be at any precision — we pad `min` to the earliest day\n * (`YYYY-01-01`) and `max` to the latest day (`YYYY-12-31`) before doing a\n * lexical compare (safe because ISO 8601 sorts by calendar order).\n */\nexport const isDateWithinBounds = (iso: string, min?: string | null, max?: string | null): boolean => {\n if (!iso) return false;\n const paddedMin = padBound(min, 'min');\n const paddedMax = padBound(max, 'max');\n if (paddedMin !== null && iso < paddedMin) return false;\n if (paddedMax !== null && iso > paddedMax) return false;\n return true;\n};\n\n/**\n * Pad a bound string up to full `YYYY-MM-DD` length so it can be lexically\n * compared with a full ISO date. `min` widens down (missing pieces become\n * `-01`), `max` widens up (missing month → `-12`, missing day → last day of\n * that month, honoring leap years).\n */\nexport const padBound = (iso: string | undefined | null, kind: 'min' | 'max'): string | null => {\n if (!iso) return null;\n const yearMatch = /^(\\d{4})(?:-(\\d{2}))?(?:-(\\d{2}))?$/.exec(iso);\n if (!yearMatch) return null;\n const year = yearMatch[1];\n const month = yearMatch[2] ?? (kind === 'min' ? '01' : '12');\n const day =\n yearMatch[3] ??\n (kind === 'min' ? '01' : String(new Date(Number(year), Number(month), 0).getDate()).padStart(2, '0'));\n return `${year}-${month}-${day}`;\n};\n"]}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Built by Endavans
|
|
3
|
+
* © https://beeq.design - Apache 2 License.
|
|
4
|
+
*/
|
|
5
|
+
import { ISO_DATE_LOCALE } from "../../../shared/utils/date";
|
|
6
|
+
import { DECADE_GRID_SIZE } from "./constants";
|
|
7
|
+
/* -------------------------------------------------------------------------- */
|
|
8
|
+
/* Date parsing */
|
|
9
|
+
/* -------------------------------------------------------------------------- */
|
|
10
|
+
/**
|
|
11
|
+
* Parse an ISO 8601 date string (`YYYY-MM-DD`) into a local-time `Date`.
|
|
12
|
+
* Returns `null` when the string is missing or invalid.
|
|
13
|
+
*/
|
|
14
|
+
export const parseISO = (iso) => {
|
|
15
|
+
if (!iso || !/^\d{4}-\d{2}-\d{2}$/.test(iso))
|
|
16
|
+
return null;
|
|
17
|
+
const [y, m, d] = iso.split('-').map(Number);
|
|
18
|
+
const date = new Date(y, m - 1, d);
|
|
19
|
+
if (date.getFullYear() !== y || date.getMonth() !== m - 1 || date.getDate() !== d)
|
|
20
|
+
return null;
|
|
21
|
+
return date;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Convert a `Date` to `YYYY-MM-DD` in local time.
|
|
25
|
+
*/
|
|
26
|
+
export const toISO = (date) => date.toLocaleDateString(ISO_DATE_LOCALE);
|
|
27
|
+
/**
|
|
28
|
+
* Extract the calendar year and 0-based month from an ISO date string.
|
|
29
|
+
* Returns `null` for missing or malformed input — safer than `Number(iso.slice(...))`
|
|
30
|
+
* which silently produces `NaN` for invalid bounds.
|
|
31
|
+
*/
|
|
32
|
+
export const getISOYearMonth = (iso) => {
|
|
33
|
+
const parsed = parseISO(iso);
|
|
34
|
+
if (!parsed)
|
|
35
|
+
return null;
|
|
36
|
+
return { year: parsed.getFullYear(), month: parsed.getMonth() };
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Whether the ISO string is a valid `YYYY-MM-DD` date (round-trips through
|
|
40
|
+
* `parseISO`). Convenience predicate for input filtering.
|
|
41
|
+
*/
|
|
42
|
+
export const isValidISO = (iso) => parseISO(iso) !== null;
|
|
43
|
+
/* -------------------------------------------------------------------------- */
|
|
44
|
+
/* Date builders */
|
|
45
|
+
/* -------------------------------------------------------------------------- */
|
|
46
|
+
export const startOfDay = (date) => new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
|
47
|
+
export const startOfMonth = (date) => new Date(date.getFullYear(), date.getMonth(), 1);
|
|
48
|
+
export const endOfMonth = (date) => new Date(date.getFullYear(), date.getMonth() + 1, 0);
|
|
49
|
+
export const addDays = (date, amount) => {
|
|
50
|
+
const next = new Date(date);
|
|
51
|
+
next.setDate(next.getDate() + amount);
|
|
52
|
+
return next;
|
|
53
|
+
};
|
|
54
|
+
export const addMonths = (date, amount) => {
|
|
55
|
+
const next = new Date(date.getFullYear(), date.getMonth() + amount, 1);
|
|
56
|
+
// Preserve the day when possible.
|
|
57
|
+
const day = Math.min(date.getDate(), endOfMonth(next).getDate());
|
|
58
|
+
next.setDate(day);
|
|
59
|
+
return next;
|
|
60
|
+
};
|
|
61
|
+
export const addYears = (date, amount) => {
|
|
62
|
+
const next = new Date(date);
|
|
63
|
+
next.setFullYear(next.getFullYear() + amount);
|
|
64
|
+
return next;
|
|
65
|
+
};
|
|
66
|
+
/* -------------------------------------------------------------------------- */
|
|
67
|
+
/* Comparators */
|
|
68
|
+
/* -------------------------------------------------------------------------- */
|
|
69
|
+
export const isSameDay = (a, b) => !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
|
|
70
|
+
export const isSameMonth = (a, b) => !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();
|
|
71
|
+
export const isSameYear = (a, b) => !!a && !!b && a.getFullYear() === b.getFullYear();
|
|
72
|
+
/** ISO-string based comparison; safe for `YYYY-MM-DD`. */
|
|
73
|
+
export const compareISO = (a, b) => {
|
|
74
|
+
if (a === b)
|
|
75
|
+
return 0;
|
|
76
|
+
return a < b ? -1 : 1;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Build a 6x7 matrix for the given month starting on `firstDayOfWeek`.
|
|
80
|
+
* The matrix always has 42 cells so the calendar keeps a stable height.
|
|
81
|
+
*
|
|
82
|
+
* @param anchor Any date within the target month.
|
|
83
|
+
* @param firstDayOfWeek 0 = Sunday, 1 = Monday, ...
|
|
84
|
+
*/
|
|
85
|
+
export const buildMonthMatrix = (anchor, firstDayOfWeek) => {
|
|
86
|
+
const start = startOfMonth(anchor);
|
|
87
|
+
const offset = (start.getDay() - firstDayOfWeek + 7) % 7;
|
|
88
|
+
const gridStart = addDays(start, -offset);
|
|
89
|
+
const cells = [];
|
|
90
|
+
for (let i = 0; i < 42; i++) {
|
|
91
|
+
const date = addDays(gridStart, i);
|
|
92
|
+
cells.push({
|
|
93
|
+
date,
|
|
94
|
+
iso: toISO(date),
|
|
95
|
+
outside: date.getMonth() !== anchor.getMonth(),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
const rows = [];
|
|
99
|
+
for (let r = 0; r < 6; r++)
|
|
100
|
+
rows.push(cells.slice(r * 7, r * 7 + 7));
|
|
101
|
+
return rows;
|
|
102
|
+
};
|
|
103
|
+
/* -------------------------------------------------------------------------- */
|
|
104
|
+
/* Decade grid */
|
|
105
|
+
/* -------------------------------------------------------------------------- */
|
|
106
|
+
/**
|
|
107
|
+
* Given any year, return the anchor year of the decade grid.
|
|
108
|
+
*
|
|
109
|
+
* The reference image shows a grid like `2016 – 2027` containing the current
|
|
110
|
+
* year (`2026`). We anchor the grid so the "round" decade start (e.g. 2020,
|
|
111
|
+
* 2010, ...) appears at index 1 - i.e. one extra year before the decade and
|
|
112
|
+
* one extra year after, filling the 3x4 grid cleanly.
|
|
113
|
+
*/
|
|
114
|
+
export const getDecadeStart = (year) => Math.floor(year / 10) * 10 - 1;
|
|
115
|
+
/**
|
|
116
|
+
* Build the 12-year decade grid for the year that contains `anchor`.
|
|
117
|
+
* Returns `{ start, end, years }` where `years.length === DECADE_GRID_SIZE`.
|
|
118
|
+
*/
|
|
119
|
+
export const buildDecade = (anchor) => {
|
|
120
|
+
const start = getDecadeStart(anchor.getFullYear());
|
|
121
|
+
const end = start + DECADE_GRID_SIZE - 1;
|
|
122
|
+
const years = Array.from({ length: DECADE_GRID_SIZE }, (_, i) => start + i);
|
|
123
|
+
return { start, end, years };
|
|
124
|
+
};
|
|
125
|
+
/* -------------------------------------------------------------------------- */
|
|
126
|
+
/* Range helpers */
|
|
127
|
+
/* -------------------------------------------------------------------------- */
|
|
128
|
+
import { padBound } from "./bounds";
|
|
129
|
+
/**
|
|
130
|
+
* Clamp a `Date` between an optional min and max. Bounds may be at any
|
|
131
|
+
* ISO precision (`YYYY`, `YYYY-MM`, `YYYY-MM-DD`) and are padded to the
|
|
132
|
+
* widest matching day before comparing (`min` → first day, `max` → last day).
|
|
133
|
+
*/
|
|
134
|
+
export const clampDate = (date, minISO, maxISO) => {
|
|
135
|
+
const min = parseISO(padBound(minISO, 'min'));
|
|
136
|
+
const max = parseISO(padBound(maxISO, 'max'));
|
|
137
|
+
if (min && date < min)
|
|
138
|
+
return min;
|
|
139
|
+
if (max && date > max)
|
|
140
|
+
return max;
|
|
141
|
+
return date;
|
|
142
|
+
};
|
|
143
|
+
/** Whether the given `Date` is within `[min, max]` ISO bounds (inclusive). */
|
|
144
|
+
export const isWithinBounds = (date, minISO, maxISO) => {
|
|
145
|
+
const iso = toISO(date);
|
|
146
|
+
const minPadded = padBound(minISO, 'min');
|
|
147
|
+
const maxPadded = padBound(maxISO, 'max');
|
|
148
|
+
if (minPadded && iso < minPadded)
|
|
149
|
+
return false;
|
|
150
|
+
if (maxPadded && iso > maxPadded)
|
|
151
|
+
return false;
|
|
152
|
+
return true;
|
|
153
|
+
};
|
|
154
|
+
/** Sort two ISO strings and return `[start, end]`. */
|
|
155
|
+
export const sortRange = (a, b) => (a <= b ? [a, b] : [b, a]);
|
|
156
|
+
//# sourceMappingURL=calendar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../../../../../../packages/beeq/src/components/date-picker/helper/calendar.ts"],"names":[],"mappings":"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","sourcesContent":["import { ISO_DATE_LOCALE } from '../../../shared/utils/date';\nimport { DECADE_GRID_SIZE } from './constants';\n\n/* -------------------------------------------------------------------------- */\n/* Date parsing */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Parse an ISO 8601 date string (`YYYY-MM-DD`) into a local-time `Date`.\n * Returns `null` when the string is missing or invalid.\n */\nexport const parseISO = (iso: string | undefined | null): Date | null => {\n if (!iso || !/^\\d{4}-\\d{2}-\\d{2}$/.test(iso)) return null;\n const [y, m, d] = iso.split('-').map(Number);\n const date = new Date(y, m - 1, d);\n if (date.getFullYear() !== y || date.getMonth() !== m - 1 || date.getDate() !== d) return null;\n return date;\n};\n\n/**\n * Convert a `Date` to `YYYY-MM-DD` in local time.\n */\nexport const toISO = (date: Date): string => date.toLocaleDateString(ISO_DATE_LOCALE);\n\n/**\n * Extract the calendar year and 0-based month from an ISO date string.\n * Returns `null` for missing or malformed input — safer than `Number(iso.slice(...))`\n * which silently produces `NaN` for invalid bounds.\n */\nexport const getISOYearMonth = (iso: string | undefined | null): { year: number; month: number } | null => {\n const parsed = parseISO(iso);\n if (!parsed) return null;\n return { year: parsed.getFullYear(), month: parsed.getMonth() };\n};\n\n/**\n * Whether the ISO string is a valid `YYYY-MM-DD` date (round-trips through\n * `parseISO`). Convenience predicate for input filtering.\n */\nexport const isValidISO = (iso: string | undefined | null): boolean => parseISO(iso) !== null;\n\n/* -------------------------------------------------------------------------- */\n/* Date builders */\n/* -------------------------------------------------------------------------- */\n\nexport const startOfDay = (date: Date): Date => new Date(date.getFullYear(), date.getMonth(), date.getDate());\n\nexport const startOfMonth = (date: Date): Date => new Date(date.getFullYear(), date.getMonth(), 1);\n\nexport const endOfMonth = (date: Date): Date => new Date(date.getFullYear(), date.getMonth() + 1, 0);\n\nexport const addDays = (date: Date, amount: number): Date => {\n const next = new Date(date);\n next.setDate(next.getDate() + amount);\n return next;\n};\n\nexport const addMonths = (date: Date, amount: number): Date => {\n const next = new Date(date.getFullYear(), date.getMonth() + amount, 1);\n // Preserve the day when possible.\n const day = Math.min(date.getDate(), endOfMonth(next).getDate());\n next.setDate(day);\n return next;\n};\n\nexport const addYears = (date: Date, amount: number): Date => {\n const next = new Date(date);\n next.setFullYear(next.getFullYear() + amount);\n return next;\n};\n\n/* -------------------------------------------------------------------------- */\n/* Comparators */\n/* -------------------------------------------------------------------------- */\n\nexport const isSameDay = (a: Date | null, b: Date | null): boolean =>\n !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n\nexport const isSameMonth = (a: Date | null, b: Date | null): boolean =>\n !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n\nexport const isSameYear = (a: Date | null, b: Date | null): boolean =>\n !!a && !!b && a.getFullYear() === b.getFullYear();\n\n/** ISO-string based comparison; safe for `YYYY-MM-DD`. */\nexport const compareISO = (a: string, b: string): number => {\n if (a === b) return 0;\n return a < b ? -1 : 1;\n};\n\n/* -------------------------------------------------------------------------- */\n/* Month matrix */\n/* -------------------------------------------------------------------------- */\n\nexport type TCalendarCell = {\n /** The day's `Date`. */\n date: Date;\n /** `YYYY-MM-DD` representation. */\n iso: string;\n /** `true` when the cell belongs to a month other than the current view. */\n outside: boolean;\n};\n\n/**\n * Build a 6x7 matrix for the given month starting on `firstDayOfWeek`.\n * The matrix always has 42 cells so the calendar keeps a stable height.\n *\n * @param anchor Any date within the target month.\n * @param firstDayOfWeek 0 = Sunday, 1 = Monday, ...\n */\nexport const buildMonthMatrix = (anchor: Date, firstDayOfWeek: number): TCalendarCell[][] => {\n const start = startOfMonth(anchor);\n const offset = (start.getDay() - firstDayOfWeek + 7) % 7;\n const gridStart = addDays(start, -offset);\n\n const cells: TCalendarCell[] = [];\n for (let i = 0; i < 42; i++) {\n const date = addDays(gridStart, i);\n cells.push({\n date,\n iso: toISO(date),\n outside: date.getMonth() !== anchor.getMonth(),\n });\n }\n\n const rows: TCalendarCell[][] = [];\n for (let r = 0; r < 6; r++) rows.push(cells.slice(r * 7, r * 7 + 7));\n return rows;\n};\n\n/* -------------------------------------------------------------------------- */\n/* Decade grid */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Given any year, return the anchor year of the decade grid.\n *\n * The reference image shows a grid like `2016 – 2027` containing the current\n * year (`2026`). We anchor the grid so the \"round\" decade start (e.g. 2020,\n * 2010, ...) appears at index 1 - i.e. one extra year before the decade and\n * one extra year after, filling the 3x4 grid cleanly.\n */\nexport const getDecadeStart = (year: number): number => Math.floor(year / 10) * 10 - 1;\n\n/**\n * Build the 12-year decade grid for the year that contains `anchor`.\n * Returns `{ start, end, years }` where `years.length === DECADE_GRID_SIZE`.\n */\nexport const buildDecade = (anchor: Date): { start: number; end: number; years: number[] } => {\n const start = getDecadeStart(anchor.getFullYear());\n const end = start + DECADE_GRID_SIZE - 1;\n const years = Array.from({ length: DECADE_GRID_SIZE }, (_, i) => start + i);\n return { start, end, years };\n};\n\n/* -------------------------------------------------------------------------- */\n/* Range helpers */\n/* -------------------------------------------------------------------------- */\n\nimport { padBound } from './bounds';\n\n/**\n * Clamp a `Date` between an optional min and max. Bounds may be at any\n * ISO precision (`YYYY`, `YYYY-MM`, `YYYY-MM-DD`) and are padded to the\n * widest matching day before comparing (`min` → first day, `max` → last day).\n */\nexport const clampDate = (date: Date, minISO?: string, maxISO?: string): Date => {\n const min = parseISO(padBound(minISO, 'min'));\n const max = parseISO(padBound(maxISO, 'max'));\n if (min && date < min) return min;\n if (max && date > max) return max;\n return date;\n};\n\n/** Whether the given `Date` is within `[min, max]` ISO bounds (inclusive). */\nexport const isWithinBounds = (date: Date, minISO?: string, maxISO?: string): boolean => {\n const iso = toISO(date);\n const minPadded = padBound(minISO, 'min');\n const maxPadded = padBound(maxISO, 'max');\n if (minPadded && iso < minPadded) return false;\n if (maxPadded && iso > maxPadded) return false;\n return true;\n};\n\n/** Sort two ISO strings and return `[start, end]`. */\nexport const sortRange = (a: string, b: string): [string, string] => (a <= b ? [a, b] : [b, a]);\n"]}
|
|
@@ -2,22 +2,68 @@
|
|
|
2
2
|
* Built by Endavans
|
|
3
3
|
* © https://beeq.design - Apache 2 License.
|
|
4
4
|
*/
|
|
5
|
-
import { ISO_DATE_LOCALE } from "../../../shared/utils/date";
|
|
6
5
|
/** Default fallback input ID */
|
|
7
|
-
const DEFAULT_INPUT_ID = 'date-picker';
|
|
8
|
-
/**
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
multi: 'calendar-multi',
|
|
20
|
-
range: 'calendar-range',
|
|
6
|
+
export const DEFAULT_INPUT_ID = 'date-picker';
|
|
7
|
+
/** Default aria labels used by the calendar navigation */
|
|
8
|
+
export const DEFAULT_ARIA_LABELS = {
|
|
9
|
+
previousMonth: 'Previous month',
|
|
10
|
+
nextMonth: 'Next month',
|
|
11
|
+
previousYear: 'Previous year',
|
|
12
|
+
nextYear: 'Next year',
|
|
13
|
+
previousDecade: 'Previous decade',
|
|
14
|
+
nextDecade: 'Next decade',
|
|
15
|
+
chooseMonth: 'Choose month',
|
|
16
|
+
chooseYear: 'Choose year',
|
|
17
|
+
chooseDate: 'Choose date',
|
|
21
18
|
};
|
|
22
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Shadow DOM parts exposed by the component.
|
|
21
|
+
* Kept as a single list so it is easy to audit against the JSDoc @part list.
|
|
22
|
+
*/
|
|
23
|
+
export const CALENDAR_PARTS = {
|
|
24
|
+
base: 'base',
|
|
25
|
+
label: 'label',
|
|
26
|
+
control: 'control',
|
|
27
|
+
prefix: 'prefix',
|
|
28
|
+
suffix: 'suffix',
|
|
29
|
+
input: 'input',
|
|
30
|
+
clearBtn: 'clear-btn',
|
|
31
|
+
button: 'button',
|
|
32
|
+
panel: 'panel',
|
|
33
|
+
container: 'calendar__container',
|
|
34
|
+
header: 'calendar__header',
|
|
35
|
+
heading: 'calendar__heading',
|
|
36
|
+
previous: 'calendar__previous',
|
|
37
|
+
next: 'calendar__next',
|
|
38
|
+
table: 'calendar__table',
|
|
39
|
+
head: 'calendar__head',
|
|
40
|
+
tr: 'calendar__tr',
|
|
41
|
+
th: 'calendar__th',
|
|
42
|
+
week: 'calendar__week',
|
|
43
|
+
td: 'calendar__td',
|
|
44
|
+
day: 'calendar__day',
|
|
45
|
+
today: 'calendar__today',
|
|
46
|
+
selected: 'calendar__selected',
|
|
47
|
+
outside: 'calendar__outside',
|
|
48
|
+
disallowed: 'calendar__disallowed',
|
|
49
|
+
disabled: 'calendar__disabled',
|
|
50
|
+
rangeStart: 'calendar__range-start',
|
|
51
|
+
rangeEnd: 'calendar__range-end',
|
|
52
|
+
rangeInner: 'calendar__range-inner',
|
|
53
|
+
months: 'calendar__months',
|
|
54
|
+
month: 'calendar__month',
|
|
55
|
+
monthSelected: 'calendar__month-selected',
|
|
56
|
+
years: 'calendar__years',
|
|
57
|
+
year: 'calendar__year',
|
|
58
|
+
yearSelected: 'calendar__year-selected',
|
|
59
|
+
calendarTrigger: 'calendar-trigger',
|
|
60
|
+
};
|
|
61
|
+
/** Number of years shown in the decade view grid. Uses 12 to fill a 3x4 grid. */
|
|
62
|
+
export const DECADE_GRID_SIZE = 12;
|
|
63
|
+
/**
|
|
64
|
+
* Maximum number of month panels rendered side-by-side. Range pickers only
|
|
65
|
+
* benefit from up to 2 panels — beyond that the popover overflows most
|
|
66
|
+
* viewports and roving keyboard navigation becomes confusing.
|
|
67
|
+
*/
|
|
68
|
+
export const MAX_MONTHS_PER_VIEW = 2;
|
|
23
69
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../../../packages/beeq/src/components/date-picker/helper/constants.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../../../packages/beeq/src/components/date-picker/helper/constants.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAE9C,0DAA0D;AAC1D,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,aAAa,EAAE,gBAAgB;IAC/B,SAAS,EAAE,YAAY;IACvB,YAAY,EAAE,eAAe;IAC7B,QAAQ,EAAE,WAAW;IACrB,cAAc,EAAE,iBAAiB;IACjC,UAAU,EAAE,aAAa;IACzB,WAAW,EAAE,cAAc;IAC3B,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,aAAa;CACjB,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,WAAW;IACrB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,qBAAqB;IAChC,MAAM,EAAE,kBAAkB;IAC1B,OAAO,EAAE,mBAAmB;IAC5B,QAAQ,EAAE,oBAAoB;IAC9B,IAAI,EAAE,gBAAgB;IACtB,KAAK,EAAE,iBAAiB;IACxB,IAAI,EAAE,gBAAgB;IACtB,EAAE,EAAE,cAAc;IAClB,EAAE,EAAE,cAAc;IAClB,IAAI,EAAE,gBAAgB;IACtB,EAAE,EAAE,cAAc;IAClB,GAAG,EAAE,eAAe;IACpB,KAAK,EAAE,iBAAiB;IACxB,QAAQ,EAAE,oBAAoB;IAC9B,OAAO,EAAE,mBAAmB;IAC5B,UAAU,EAAE,sBAAsB;IAClC,QAAQ,EAAE,oBAAoB;IAC9B,UAAU,EAAE,uBAAuB;IACnC,QAAQ,EAAE,qBAAqB;IAC/B,UAAU,EAAE,uBAAuB;IACnC,MAAM,EAAE,kBAAkB;IAC1B,KAAK,EAAE,iBAAiB;IACxB,aAAa,EAAE,0BAA0B;IACzC,KAAK,EAAE,iBAAiB;IACxB,IAAI,EAAE,gBAAgB;IACtB,YAAY,EAAE,yBAAyB;IACvC,eAAe,EAAE,kBAAkB;CAC3B,CAAC;AAEX,iFAAiF;AACjF,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC","sourcesContent":["/** Default fallback input ID */\nexport const DEFAULT_INPUT_ID = 'date-picker';\n\n/** Default aria labels used by the calendar navigation */\nexport const DEFAULT_ARIA_LABELS = {\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n previousYear: 'Previous year',\n nextYear: 'Next year',\n previousDecade: 'Previous decade',\n nextDecade: 'Next decade',\n chooseMonth: 'Choose month',\n chooseYear: 'Choose year',\n chooseDate: 'Choose date',\n} as const;\n\n/**\n * Shadow DOM parts exposed by the component.\n * Kept as a single list so it is easy to audit against the JSDoc @part list.\n */\nexport const CALENDAR_PARTS = {\n base: 'base',\n label: 'label',\n control: 'control',\n prefix: 'prefix',\n suffix: 'suffix',\n input: 'input',\n clearBtn: 'clear-btn',\n button: 'button',\n panel: 'panel',\n container: 'calendar__container',\n header: 'calendar__header',\n heading: 'calendar__heading',\n previous: 'calendar__previous',\n next: 'calendar__next',\n table: 'calendar__table',\n head: 'calendar__head',\n tr: 'calendar__tr',\n th: 'calendar__th',\n week: 'calendar__week',\n td: 'calendar__td',\n day: 'calendar__day',\n today: 'calendar__today',\n selected: 'calendar__selected',\n outside: 'calendar__outside',\n disallowed: 'calendar__disallowed',\n disabled: 'calendar__disabled',\n rangeStart: 'calendar__range-start',\n rangeEnd: 'calendar__range-end',\n rangeInner: 'calendar__range-inner',\n months: 'calendar__months',\n month: 'calendar__month',\n monthSelected: 'calendar__month-selected',\n years: 'calendar__years',\n year: 'calendar__year',\n yearSelected: 'calendar__year-selected',\n calendarTrigger: 'calendar-trigger',\n} as const;\n\n/** Number of years shown in the decade view grid. Uses 12 to fill a 3x4 grid. */\nexport const DECADE_GRID_SIZE = 12;\n\n/**\n * Maximum number of month panels rendered side-by-side. Range pickers only\n * benefit from up to 2 panels — beyond that the popover overflows most\n * viewports and roving keyboard navigation becomes confusing.\n */\nexport const MAX_MONTHS_PER_VIEW = 2;\n"]}
|