@qw-ui/core 0.3.0-next.40 → 0.3.0-next.43
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/README.md +21 -37
- package/dist/action-sheet/action-sheet.d.ts +110 -0
- package/dist/action-sheet/index.d.ts +2 -0
- package/dist/action-sheet/index.js +2 -0
- package/dist/action-sheet-Cvcr1S_m.js +183 -0
- package/dist/action-sheet-Cvcr1S_m.js.map +1 -0
- package/dist/area-picker/area-picker.d.ts +113 -0
- package/dist/area-picker/index.d.ts +1 -0
- package/dist/area-picker/index.js +348 -0
- package/dist/area-picker/index.js.map +1 -0
- package/dist/aria-description-CimD2M_C.js +13 -0
- package/dist/aria-description-CimD2M_C.js.map +1 -0
- package/dist/aria-description.d.ts +2 -0
- package/dist/avatar/avatar-load.d.ts +76 -0
- package/dist/avatar/avatar.d.ts +22 -5
- package/dist/avatar/index.d.ts +1 -0
- package/dist/avatar/index.js +57 -18
- package/dist/avatar/index.js.map +1 -1
- package/dist/avatar-load-w9dq05oV.js +139 -0
- package/dist/avatar-load-w9dq05oV.js.map +1 -0
- package/dist/back-top/back-top.d.ts +77 -0
- package/dist/back-top/index.d.ts +1 -0
- package/dist/back-top/index.js +189 -0
- package/dist/back-top/index.js.map +1 -0
- package/dist/badge/badge.d.ts +9 -0
- package/dist/badge/index.js +14 -1
- package/dist/badge/index.js.map +1 -1
- package/dist/button/button.d.ts +13 -0
- package/dist/button/index.js +3 -5
- package/dist/button/index.js.map +1 -1
- package/dist/calendar/calendar.d.ts +100 -0
- package/dist/calendar/index.d.ts +1 -0
- package/dist/calendar/index.js +2 -0
- package/dist/calendar-CmpK3stz.js +363 -0
- package/dist/calendar-CmpK3stz.js.map +1 -0
- package/dist/card/card.d.ts +68 -0
- package/dist/card/index.d.ts +2 -0
- package/dist/card/index.js +2 -0
- package/dist/card-DRtWa6Cr.js +107 -0
- package/dist/card-DRtWa6Cr.js.map +1 -0
- package/dist/cascader/cascader.d.ts +115 -0
- package/dist/cascader/index.d.ts +1 -0
- package/dist/cascader/index.js +2 -0
- package/dist/cascader-D-xMjs7P.js +333 -0
- package/dist/cascader-D-xMjs7P.js.map +1 -0
- package/dist/cell/cell.d.ts +41 -0
- package/dist/cell/index.d.ts +1 -0
- package/dist/cell/index.js +43 -0
- package/dist/cell/index.js.map +1 -0
- package/dist/check-list/check-list.d.ts +78 -0
- package/dist/check-list/index.d.ts +2 -0
- package/dist/check-list/index.js +2 -0
- package/dist/check-list-BvZHQt5w.js +60 -0
- package/dist/check-list-BvZHQt5w.js.map +1 -0
- package/dist/checkbox/checkbox.d.ts +59 -0
- package/dist/checkbox/index.d.ts +2 -0
- package/dist/checkbox/index.js +2 -0
- package/dist/checkbox-BlndJrz5.js +127 -0
- package/dist/checkbox-BlndJrz5.js.map +1 -0
- package/dist/checkbox-group/checkbox-group.d.ts +86 -0
- package/dist/checkbox-group/index.d.ts +3 -0
- package/dist/checkbox-group/index.js +2 -0
- package/dist/checkbox-group-gGfsTv-e.js +223 -0
- package/dist/checkbox-group-gGfsTv-e.js.map +1 -0
- package/dist/choice-group-C4c9m0qe.js +373 -0
- package/dist/choice-group-C4c9m0qe.js.map +1 -0
- package/dist/circle/circle.d.ts +97 -0
- package/dist/circle/index.d.ts +1 -0
- package/dist/circle/index.js +119 -0
- package/dist/circle/index.js.map +1 -0
- package/dist/collapse/collapse.d.ts +98 -0
- package/dist/collapse/index.d.ts +2 -0
- package/dist/collapse/index.js +2 -0
- package/dist/collapse-B969h7-H.js +226 -0
- package/dist/collapse-B969h7-H.js.map +1 -0
- package/dist/countdown/countdown.d.ts +114 -0
- package/dist/countdown/index.d.ts +1 -0
- package/dist/countdown/index.js +309 -0
- package/dist/countdown/index.js.map +1 -0
- package/dist/date-picker/date-picker.d.ts +168 -0
- package/dist/date-picker/index.d.ts +1 -0
- package/dist/date-picker/index.js +401 -0
- package/dist/date-picker/index.js.map +1 -0
- package/dist/descriptions/descriptions.d.ts +69 -0
- package/dist/descriptions/index.d.ts +1 -0
- package/dist/descriptions/index.js +86 -0
- package/dist/descriptions/index.js.map +1 -0
- package/dist/dialog/dialog.d.ts +32 -3
- package/dist/dialog/index.js +58 -3
- package/dist/dialog/index.js.map +1 -1
- package/dist/divider/divider.d.ts +18 -2
- package/dist/divider/index.js +20 -2
- package/dist/divider/index.js.map +1 -1
- package/dist/dropdown/dropdown.d.ts +172 -0
- package/dist/dropdown/index.d.ts +2 -0
- package/dist/dropdown/index.js +467 -0
- package/dist/dropdown/index.js.map +1 -0
- package/dist/ellipsis/ellipsis-layout.d.ts +34 -0
- package/dist/ellipsis/ellipsis.d.ts +88 -0
- package/dist/ellipsis/index.d.ts +2 -0
- package/dist/ellipsis/index.js +320 -0
- package/dist/ellipsis/index.js.map +1 -0
- package/dist/empty/empty-illustration.d.ts +3 -0
- package/dist/empty/empty.d.ts +43 -1
- package/dist/empty/index.js +2 -21
- package/dist/empty-CAgyvhUI.js +166 -0
- package/dist/empty-CAgyvhUI.js.map +1 -0
- package/dist/field/field.d.ts +95 -0
- package/dist/field/index.d.ts +2 -0
- package/dist/field/index.js +2 -0
- package/dist/field-DMHGIMZF.js +241 -0
- package/dist/field-DMHGIMZF.js.map +1 -0
- package/dist/floating-bubble/floating-bubble.d.ts +116 -0
- package/dist/floating-bubble/index.d.ts +1 -0
- package/dist/floating-bubble/index.js +333 -0
- package/dist/floating-bubble/index.js.map +1 -0
- package/dist/floating-panel/floating-panel.d.ts +80 -0
- package/dist/floating-panel/index.d.ts +2 -0
- package/dist/floating-panel/index.js +2 -0
- package/dist/floating-panel-Cbm5njBJ.js +363 -0
- package/dist/floating-panel-Cbm5njBJ.js.map +1 -0
- package/dist/footer/footer.d.ts +94 -0
- package/dist/footer/index.d.ts +1 -0
- package/dist/footer/index.js +154 -0
- package/dist/footer/index.js.map +1 -0
- package/dist/form/connect.d.ts +6 -0
- package/dist/form/form.d.ts +100 -0
- package/dist/form/ids.d.ts +14 -0
- package/dist/form/index.d.ts +13 -0
- package/dist/form/index.js +3 -0
- package/dist/form/methods.d.ts +5 -0
- package/dist/form/model.d.ts +24 -0
- package/dist/form/native.d.ts +25 -0
- package/dist/form/rules.d.ts +40 -0
- package/dist/form/ssr.d.ts +7 -0
- package/dist/form/types.d.ts +150 -0
- package/dist/form-BAGkIEMY.js +1354 -0
- package/dist/form-BAGkIEMY.js.map +1 -0
- package/dist/format-BDUY0C_c.js +89 -0
- package/dist/format-BDUY0C_c.js.map +1 -0
- package/dist/gesture-_SRHIvBm.js +30 -0
- package/dist/gesture-_SRHIvBm.js.map +1 -0
- package/dist/grid/grid-item.d.ts +22 -0
- package/dist/grid/grid.d.ts +42 -0
- package/dist/grid/index.d.ts +2 -0
- package/dist/grid/index.js +73 -0
- package/dist/grid/index.js.map +1 -0
- package/dist/icon/icon.d.ts +37 -1
- package/dist/icon/identity.d.ts +3 -0
- package/dist/icon/index.js +2 -20
- package/dist/icon-Cgdbnk1u.js +77 -0
- package/dist/icon-Cgdbnk1u.js.map +1 -0
- package/dist/image/image-load.d.ts +24 -0
- package/dist/image/image.d.ts +45 -8
- package/dist/image/index.d.ts +1 -0
- package/dist/image/index.js +116 -14
- package/dist/image/index.js.map +1 -1
- package/dist/image-preview/image-preview.d.ts +124 -0
- package/dist/image-preview/index.d.ts +1 -0
- package/dist/image-preview/index.js +450 -0
- package/dist/image-preview/index.js.map +1 -0
- package/dist/index-bar/index-bar.d.ts +121 -0
- package/dist/index-bar/index.d.ts +1 -0
- package/dist/index-bar/index.js +386 -0
- package/dist/index-bar/index.js.map +1 -0
- package/dist/index.d.ts +107 -14
- package/dist/index.js +148 -14
- package/dist/index.js.map +1 -0
- package/dist/infinite-scroll/index.d.ts +1 -0
- package/dist/infinite-scroll/index.js +248 -0
- package/dist/infinite-scroll/index.js.map +1 -0
- package/dist/infinite-scroll/infinite-scroll.d.ts +95 -0
- package/dist/input/index.js +181 -22
- package/dist/input/index.js.map +1 -1
- package/dist/input/input.d.ts +44 -1
- package/dist/layer-IpFrl5--.js +414 -0
- package/dist/layer-IpFrl5--.js.map +1 -0
- package/dist/layout-BRSqi4AQ.js +43 -0
- package/dist/layout-BRSqi4AQ.js.map +1 -0
- package/dist/layout.d.ts +13 -0
- package/dist/list/index.d.ts +2 -0
- package/dist/list/index.js +2 -0
- package/dist/list/list.d.ts +30 -0
- package/dist/list-6-iz-Irh.js +28 -0
- package/dist/list-6-iz-Irh.js.map +1 -0
- package/dist/loading/index.js +45 -2
- package/dist/loading/index.js.map +1 -1
- package/dist/loading/loading.d.ts +45 -2
- package/dist/modal-dialog-machine-CF9_z3Dm.js +487 -0
- package/dist/modal-dialog-machine-CF9_z3Dm.js.map +1 -0
- package/dist/modal-dialog-machine.d.ts +21 -0
- package/dist/modal-dismissable-lifetime.d.ts +21 -0
- package/dist/modal-registry.d.ts +24 -0
- package/dist/modal-render-hydration.d.ts +35 -0
- package/dist/modal-render-runtime.d.ts +19 -0
- package/dist/modal-render-scope.d.ts +63 -0
- package/dist/nav-bar/index.d.ts +1 -0
- package/dist/nav-bar/index.js +115 -0
- package/dist/nav-bar/index.js.map +1 -0
- package/dist/nav-bar/nav-bar.d.ts +76 -0
- package/dist/notice-bar/index.d.ts +2 -0
- package/dist/notice-bar/index.js +2 -0
- package/dist/notice-bar/notice-bar.d.ts +103 -0
- package/dist/notice-bar-DMpwLvRb.js +231 -0
- package/dist/notice-bar-DMpwLvRb.js.map +1 -0
- package/dist/notify/index.d.ts +1 -0
- package/dist/notify/index.js +251 -0
- package/dist/notify/index.js.map +1 -0
- package/dist/notify/notify.d.ts +123 -0
- package/dist/number-keyboard/index.d.ts +1 -0
- package/dist/number-keyboard/index.js +333 -0
- package/dist/number-keyboard/index.js.map +1 -0
- package/dist/number-keyboard/number-keyboard.d.ts +141 -0
- package/dist/page-indicator/index.d.ts +1 -0
- package/dist/page-indicator/index.js +138 -0
- package/dist/page-indicator/index.js.map +1 -0
- package/dist/page-indicator/page-indicator.d.ts +93 -0
- package/dist/pagination/index.d.ts +1 -0
- package/dist/pagination/index.js +198 -0
- package/dist/pagination/index.js.map +1 -0
- package/dist/pagination/pagination.d.ts +125 -0
- package/dist/password-input/index.d.ts +1 -0
- package/dist/password-input/index.js +317 -0
- package/dist/password-input/index.js.map +1 -0
- package/dist/password-input/password-input.d.ts +144 -0
- package/dist/picker/index.d.ts +8 -0
- package/dist/picker/index.js +2 -0
- package/dist/picker/picker-machine.d.ts +80 -0
- package/dist/picker/picker.d.ts +121 -0
- package/dist/picker/platform.d.ts +84 -0
- package/dist/picker/selection-connect.d.ts +90 -0
- package/dist/picker/selection-model.d.ts +211 -0
- package/dist/picker-BykFntQN.js +1675 -0
- package/dist/picker-BykFntQN.js.map +1 -0
- package/dist/popover/index.d.ts +3 -0
- package/dist/popover/index.js +253 -0
- package/dist/popover/index.js.map +1 -0
- package/dist/popover/layer.d.ts +44 -0
- package/dist/popover/popover.d.ts +104 -0
- package/dist/popover/positioning.d.ts +132 -0
- package/dist/popup/index.d.ts +2 -0
- package/dist/popup/index.js +2 -0
- package/dist/popup/popup.d.ts +60 -0
- package/dist/popup-z5d8IYCt.js +576 -0
- package/dist/popup-z5d8IYCt.js.map +1 -0
- package/dist/portal-BHCNTWhg.js +78 -0
- package/dist/portal-BHCNTWhg.js.map +1 -0
- package/dist/portal.d.ts +61 -0
- package/dist/price/format.d.ts +19 -0
- package/dist/price/index.d.ts +1 -0
- package/dist/price/index.js +154 -0
- package/dist/price/index.js.map +1 -0
- package/dist/price/price.d.ts +88 -0
- package/dist/progress/index.d.ts +1 -0
- package/dist/progress/index.js +2 -0
- package/dist/progress/progress.d.ts +32 -0
- package/dist/progress-f3iYEfdA.js +37 -0
- package/dist/progress-f3iYEfdA.js.map +1 -0
- package/dist/pull-refresh/index.d.ts +1 -0
- package/dist/pull-refresh/index.js +414 -0
- package/dist/pull-refresh/index.js.map +1 -0
- package/dist/pull-refresh/pull-refresh.d.ts +118 -0
- package/dist/radio-group/index.d.ts +3 -0
- package/dist/radio-group/index.js +2 -0
- package/dist/radio-group/radio-group.d.ts +78 -0
- package/dist/radio-group-BOIMuqnS.js +230 -0
- package/dist/radio-group-BOIMuqnS.js.map +1 -0
- package/dist/rate/index.d.ts +1 -0
- package/dist/rate/index.js +2 -0
- package/dist/rate/rate-form.d.ts +28 -0
- package/dist/rate/rate.d.ts +144 -0
- package/dist/rate-5XsU2QkY.js +631 -0
- package/dist/rate-5XsU2QkY.js.map +1 -0
- package/dist/reorder/index.d.ts +1 -0
- package/dist/reorder/index.js +720 -0
- package/dist/reorder/index.js.map +1 -0
- package/dist/reorder/reorder.d.ts +190 -0
- package/dist/result/index.d.ts +1 -0
- package/dist/result/index.js +123 -0
- package/dist/result/index.js.map +1 -0
- package/dist/result/result.d.ts +88 -0
- package/dist/safe-area/index.d.ts +1 -0
- package/dist/safe-area/index.js +42 -0
- package/dist/safe-area/index.js.map +1 -0
- package/dist/safe-area/safe-area.d.ts +28 -0
- package/dist/search-bar/index.js +3 -1
- package/dist/search-bar/index.js.map +1 -1
- package/dist/search-bar/search-bar.d.ts +4 -0
- package/dist/segmented/index.d.ts +2 -0
- package/dist/segmented/index.js +2 -0
- package/dist/segmented/segmented.d.ts +127 -0
- package/dist/segmented-BaU38_L4.js +367 -0
- package/dist/segmented-BaU38_L4.js.map +1 -0
- package/dist/selection-form-BOM_odUk.js +88 -0
- package/dist/selection-form-BOM_odUk.js.map +1 -0
- package/dist/selection-form.d.ts +27 -0
- package/dist/selection-ivXqO1eu.js +55 -0
- package/dist/selection-ivXqO1eu.js.map +1 -0
- package/dist/selection.d.ts +29 -0
- package/dist/selector/choice-group.d.ts +114 -0
- package/dist/selector/index.d.ts +2 -0
- package/dist/selector/index.js +2 -0
- package/dist/selector/selector.d.ts +90 -0
- package/dist/selector-BU2MMJ4N.js +93 -0
- package/dist/selector-BU2MMJ4N.js.map +1 -0
- package/dist/share-sheet/index.d.ts +1 -0
- package/dist/share-sheet/index.js +138 -0
- package/dist/share-sheet/index.js.map +1 -0
- package/dist/share-sheet/share-sheet.d.ts +139 -0
- package/dist/skeleton/index.js +51 -2
- package/dist/skeleton/index.js.map +1 -1
- package/dist/skeleton/skeleton.d.ts +34 -3
- package/dist/slider/index.d.ts +1 -0
- package/dist/slider/index.js +482 -0
- package/dist/slider/index.js.map +1 -0
- package/dist/slider/slider.d.ts +174 -0
- package/dist/space/index.d.ts +1 -0
- package/dist/space/index.js +52 -0
- package/dist/space/index.js.map +1 -0
- package/dist/space/space.d.ts +46 -0
- package/dist/statistic/index.d.ts +1 -0
- package/dist/statistic/index.js +152 -0
- package/dist/statistic/index.js.map +1 -0
- package/dist/statistic/statistic.d.ts +101 -0
- package/dist/stepper/index.js +62 -3
- package/dist/stepper/index.js.map +1 -1
- package/dist/stepper/stepper.d.ts +44 -4
- package/dist/steps/index.d.ts +1 -0
- package/dist/steps/index.js +72 -0
- package/dist/steps/index.js.map +1 -0
- package/dist/steps/steps.d.ts +67 -0
- package/dist/sticky/index.d.ts +1 -0
- package/dist/sticky/index.js +145 -0
- package/dist/sticky/index.js.map +1 -0
- package/dist/sticky/sticky.d.ts +70 -0
- package/dist/swipe-action/index.d.ts +1 -0
- package/dist/swipe-action/index.js +417 -0
- package/dist/swipe-action/index.js.map +1 -0
- package/dist/swipe-action/swipe-action.d.ts +148 -0
- package/dist/swiper/gesture.d.ts +32 -0
- package/dist/swiper/index.d.ts +1 -0
- package/dist/swiper/index.js +2 -0
- package/dist/swiper/swiper.d.ts +177 -0
- package/dist/swiper-BKivDkHp.js +550 -0
- package/dist/swiper-BKivDkHp.js.map +1 -0
- package/dist/switch/index.js +135 -10
- package/dist/switch/index.js.map +1 -1
- package/dist/switch/switch.d.ts +93 -6
- package/dist/tabbar/index.js +46 -1
- package/dist/tabbar/index.js.map +1 -1
- package/dist/tabbar/tabbar.d.ts +50 -0
- package/dist/tabs/index.js +22 -1
- package/dist/tabs/index.js.map +1 -1
- package/dist/tabs/tabs.d.ts +12 -8
- package/dist/tag/index.js +123 -2
- package/dist/tag/index.js.map +1 -1
- package/dist/tag/tag.d.ts +67 -1
- package/dist/textarea/index.d.ts +2 -0
- package/dist/textarea/index.js +2 -242
- package/dist/textarea/platform.d.ts +22 -0
- package/dist/textarea/textarea.d.ts +165 -46
- package/dist/textarea-qbnruDUG.js +775 -0
- package/dist/textarea-qbnruDUG.js.map +1 -0
- package/dist/time-picker/index.d.ts +1 -0
- package/dist/time-picker/index.js +228 -0
- package/dist/time-picker/index.js.map +1 -0
- package/dist/time-picker/time-picker.d.ts +83 -0
- package/dist/timeline/index.d.ts +1 -0
- package/dist/timeline/index.js +131 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/timeline/timeline.d.ts +79 -0
- package/dist/toast/index.js +47 -4
- package/dist/toast/index.js.map +1 -1
- package/dist/toast/toast.d.ts +26 -3
- package/dist/top-bar/index.js +16 -2
- package/dist/top-bar/index.js.map +1 -1
- package/dist/top-bar/top-bar.d.ts +13 -2
- package/dist/tree-select/index.d.ts +1 -0
- package/dist/tree-select/index.js +512 -0
- package/dist/tree-select/index.js.map +1 -0
- package/dist/tree-select/tree-select.d.ts +215 -0
- package/dist/typography/index.d.ts +1 -0
- package/dist/typography/index.js +82 -0
- package/dist/typography/index.js.map +1 -0
- package/dist/typography/typography.d.ts +54 -0
- package/dist/upload/index.d.ts +1 -0
- package/dist/upload/index.js +458 -0
- package/dist/upload/index.js.map +1 -0
- package/dist/upload/upload.d.ts +172 -0
- package/dist/virtual-list/index.d.ts +1 -0
- package/dist/virtual-list/index.js +445 -0
- package/dist/virtual-list/index.js.map +1 -0
- package/dist/virtual-list/virtual-list.d.ts +160 -0
- package/dist/visual-manifest.d.ts +6 -0
- package/dist/watermark/index.d.ts +1 -0
- package/dist/watermark/index.js +260 -0
- package/dist/watermark/index.js.map +1 -0
- package/dist/watermark/watermark.d.ts +106 -0
- package/package.json +399 -50
- package/dist/empty/index.js.map +0 -1
- package/dist/icon/index.js.map +0 -1
- package/dist/textarea/index.js.map +0 -1
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { type Machine, type Service } from "@zag-js/core";
|
|
2
|
+
import type { QwPickerProps } from "../picker/picker.js";
|
|
3
|
+
import type { PickerColumn, PickerValue } from "../picker/selection-model.js";
|
|
4
|
+
/**
|
|
5
|
+
* DatePicker(Beta)Core —— 日期规则的唯一来源,建在公开 Picker 之上。
|
|
6
|
+
*
|
|
7
|
+
* 本文件只把「真实 Date + 精度 + 边界」映射成 Picker 的列与值,再把 Picker 的预览/提交映射回 Date:
|
|
8
|
+
* 年/月/日/时/分列、min/max 边界、闰年与月长联动、标签格式化、受控请求与拒绝。
|
|
9
|
+
* 确定/取消、等待落定、键盘、工具栏/内嵌形态与模态宿主全部继承 Picker,本层不新增模态状态。
|
|
10
|
+
*
|
|
11
|
+
* 日期字段按 UTC 读写(`getUTC*`),因此纯日期在任何时区都确定;字符串输入按 UTC 解析。
|
|
12
|
+
*/
|
|
13
|
+
export declare const DATE_PICKER_COLUMN_TYPES: readonly ["year", "month", "day", "hour", "minute"];
|
|
14
|
+
/** 列类型,按逻辑顺序。 */
|
|
15
|
+
export type DatePickerColumnType = (typeof DATE_PICKER_COLUMN_TYPES)[number];
|
|
16
|
+
/** 精度 = 最细的一列。缺省 "day"(年/月/日三列)。 */
|
|
17
|
+
export type DatePickerPrecision = DatePickerColumnType;
|
|
18
|
+
/** 输入值:真实 Date,或 UTC ISO 字符串(`YYYY`、`YYYY-MM`、`YYYY-MM-DD`、`YYYY-MM-DDTHH:mm`)。 */
|
|
19
|
+
export type DatePickerInput = Date | string;
|
|
20
|
+
export interface DatePickerParts {
|
|
21
|
+
year: number;
|
|
22
|
+
month: number;
|
|
23
|
+
day: number;
|
|
24
|
+
hour: number;
|
|
25
|
+
minute: number;
|
|
26
|
+
}
|
|
27
|
+
/** 通知载荷:真实 Date 副本与同精度 ISO 字符串(便于 WC/SSR 回写)。 */
|
|
28
|
+
export interface DatePickerChangeDetails {
|
|
29
|
+
value: Date;
|
|
30
|
+
iso: string;
|
|
31
|
+
}
|
|
32
|
+
/** 选项标签格式化;缺省为「2024年」「02月」「29日」「08时」「30分」。 */
|
|
33
|
+
export type DatePickerFormatter = (type: DatePickerColumnType, value: number) => string;
|
|
34
|
+
export interface DatePickerBounds {
|
|
35
|
+
min: Date;
|
|
36
|
+
max: Date;
|
|
37
|
+
}
|
|
38
|
+
export type DatePickerRanges = Partial<Record<DatePickerColumnType, readonly [number, number]>>;
|
|
39
|
+
/** DatePicker 输入:Picker 的形态/开合/文案 props 原样继承,列与值改由 Core 从 Date 派生。 */
|
|
40
|
+
export interface QwDatePickerProps extends Omit<QwPickerProps, "columns" | "value" | "defaultValue" | "onValueChange" | "onPreviewChange"> {
|
|
41
|
+
/** 受控已提交值。传入即受控,组件只发出变更请求;无效输入回退到 defaultValue/今天。 */
|
|
42
|
+
value?: DatePickerInput;
|
|
43
|
+
/** 非受控初值;缺省为今天(UTC)。 */
|
|
44
|
+
defaultValue?: DatePickerInput;
|
|
45
|
+
/** 最早可选(含)。缺省为初值所在年 −10 年的 1 月 1 日。 */
|
|
46
|
+
min?: DatePickerInput;
|
|
47
|
+
/** 最晚可选(含)。缺省为初值所在年 +10 年的 12 月 31 日。min > max 时两者互换。 */
|
|
48
|
+
max?: DatePickerInput;
|
|
49
|
+
/** 最细的列,缺省 "day"。未知值回退 "day"。 */
|
|
50
|
+
precision?: DatePickerPrecision;
|
|
51
|
+
/** 选项标签。 */
|
|
52
|
+
formatter?: DatePickerFormatter;
|
|
53
|
+
/** 每列的可访问列名,缺省「年」「月」「日」「时」「分」。 */
|
|
54
|
+
columnLabels?: Partial<Record<DatePickerColumnType, string>>;
|
|
55
|
+
/** 缺省标签的单位后缀(可序列化,SSR 可用),缺省「年」「月」「日」「时」「分」;传 formatter 时不使用。 */
|
|
56
|
+
units?: Partial<Record<DatePickerColumnType, string>>;
|
|
57
|
+
/** 工具栏确定(落定后)或内嵌落定时通知一次。受控时这是一次请求。 */
|
|
58
|
+
onValueChange?: (details: DatePickerChangeDetails) => void;
|
|
59
|
+
/** 滚轮预览对应的日期变化时通知(已按边界与月长收口)。 */
|
|
60
|
+
onPreviewChange?: (details: DatePickerChangeDetails) => void;
|
|
61
|
+
}
|
|
62
|
+
/** UTC 构造(支持 0100 年以前,不走 Date.UTC 的两位年映射)。 */
|
|
63
|
+
export declare function createDatePickerUtcDate(year: number, month?: number, day?: number, hour?: number, minute?: number): Date;
|
|
64
|
+
export declare function toDatePickerParts(date: Date): DatePickerParts;
|
|
65
|
+
export declare function fromDatePickerParts(parts: DatePickerParts): Date;
|
|
66
|
+
export declare function resolveDatePickerPrecision(precision: unknown): DatePickerPrecision;
|
|
67
|
+
/** 精度对应的列类型(从年开始)。 */
|
|
68
|
+
export declare function getDatePickerColumnTypes(precision: DatePickerPrecision): readonly DatePickerColumnType[];
|
|
69
|
+
/** Date 或 UTC ISO 字符串 → 新 Date;不合法(含 2 月 30 日这类溢出)返回 undefined。 */
|
|
70
|
+
export declare function parseDatePickerInput(input: unknown): Date | undefined;
|
|
71
|
+
/** 把比精度更细的字段归零(月→1 月,日→1 日,时/分→0)。 */
|
|
72
|
+
export declare function truncateDatePickerDate(date: Date, precision: DatePickerPrecision): Date;
|
|
73
|
+
/** 同精度 ISO:`2024`、`2024-02`、`2024-02-29`、`2024-02-29T08:00`、`2024-02-29T08:30`。 */
|
|
74
|
+
export declare function toDatePickerIso(date: Date, precision: DatePickerPrecision): string;
|
|
75
|
+
/** 确定性展示文本(不依赖运行时区/Intl);传 format 时由调用方决定。 */
|
|
76
|
+
export declare function formatDatePickerValue(date: Date, precision: DatePickerPrecision, format?: (value: Date) => string): string;
|
|
77
|
+
export declare function defaultDatePickerFormatter(type: DatePickerColumnType, value: number, units?: Partial<Record<DatePickerColumnType, string>>): string;
|
|
78
|
+
/** 今天(UTC 日期,时分为 0)。 */
|
|
79
|
+
export declare function getDatePickerToday(): Date;
|
|
80
|
+
/** 边界:解析、按精度截断、缺省取锚点年 ±10 年,min > max 时互换。 */
|
|
81
|
+
export declare function resolveDatePickerBounds(min: unknown, max: unknown, precision: DatePickerPrecision, anchorYear: number): DatePickerBounds;
|
|
82
|
+
/** 截断后夹进边界。 */
|
|
83
|
+
export declare function clampDatePickerDate(date: Date, bounds: DatePickerBounds, precision: DatePickerPrecision): Date;
|
|
84
|
+
/** 任意输入 → 已截断、已夹紧的 Date;无效时用 fallback。 */
|
|
85
|
+
export declare function normalizeDatePickerValue(input: unknown, bounds: DatePickerBounds, precision: DatePickerPrecision, fallback: Date): Date;
|
|
86
|
+
/**
|
|
87
|
+
* 逐列收口:每列先按前列结果求合法区间(边界只在前列都贴边时生效;日按闰年/月长),再把期望值夹进区间。
|
|
88
|
+
* 缺失或非整数的期望值取 fallback 的同列值。返回收口后的字段与每列区间。
|
|
89
|
+
*/
|
|
90
|
+
export declare function resolveDatePickerParts(wanted: Partial<Record<DatePickerColumnType, number | undefined>>, bounds: DatePickerBounds, precision: DatePickerPrecision, fallback: DatePickerParts): {
|
|
91
|
+
parts: DatePickerParts;
|
|
92
|
+
ranges: DatePickerRanges;
|
|
93
|
+
};
|
|
94
|
+
/** 字段 → 规范 Picker 值(按列序的十进制字符串)。 */
|
|
95
|
+
export declare function toDatePickerPickerValue(date: Date, precision: DatePickerPrecision): PickerValue;
|
|
96
|
+
/**
|
|
97
|
+
* 由收口结果生成 Picker 列。每列只列合法区间内的项。
|
|
98
|
+
* 联动保持:当前列的锚点(前列变化那一刻滚轮上的值,例如 31 日)落在新区间外时,
|
|
99
|
+
* 收口目标项(例如 2 月 29 日)沿用锚点的 value,滚轮停在收口项上而不是回退到第一项;
|
|
100
|
+
* 锚点只在前列变化或提交后重置,所以用户正在滚的列形状不变。
|
|
101
|
+
*/
|
|
102
|
+
export declare function getDatePickerColumns(ranges: DatePickerRanges, precision: DatePickerPrecision, anchors?: PickerValue, formatter?: DatePickerFormatter, labels?: Partial<Record<DatePickerColumnType, string>>, units?: Partial<Record<DatePickerColumnType, string>>, anchorValues?: PickerValue): PickerColumn[];
|
|
103
|
+
/** 预览会话:base 是开始预览时的已提交值;已提交值变化后会话自动回到规范值。 */
|
|
104
|
+
export interface DatePickerPreviewState {
|
|
105
|
+
base: number;
|
|
106
|
+
raw: PickerValue;
|
|
107
|
+
anchors: PickerValue;
|
|
108
|
+
anchorValues: PickerValue;
|
|
109
|
+
}
|
|
110
|
+
/** 机器 props(只供 Core 读取)。 */
|
|
111
|
+
export interface QwDatePickerMachineProps {
|
|
112
|
+
id?: string;
|
|
113
|
+
value?: DatePickerInput;
|
|
114
|
+
defaultValue?: DatePickerInput;
|
|
115
|
+
min?: DatePickerInput;
|
|
116
|
+
max?: DatePickerInput;
|
|
117
|
+
precision: DatePickerPrecision;
|
|
118
|
+
onValueChange?: (details: DatePickerChangeDetails) => void;
|
|
119
|
+
onPreviewChange?: (details: DatePickerChangeDetails) => void;
|
|
120
|
+
}
|
|
121
|
+
export interface QwDatePickerSchema {
|
|
122
|
+
props: QwDatePickerMachineProps;
|
|
123
|
+
context: {
|
|
124
|
+
value: Date;
|
|
125
|
+
preview: DatePickerPreviewState;
|
|
126
|
+
anchorYear: number;
|
|
127
|
+
};
|
|
128
|
+
state: "idle";
|
|
129
|
+
action: "preview" | "commit" | "reset";
|
|
130
|
+
event: {
|
|
131
|
+
type: "PREVIEW";
|
|
132
|
+
value: PickerValue;
|
|
133
|
+
} | {
|
|
134
|
+
type: "COMMIT";
|
|
135
|
+
value: PickerValue;
|
|
136
|
+
} | {
|
|
137
|
+
type: "RESET";
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
export type QwDatePickerMachine = Machine<QwDatePickerSchema>;
|
|
141
|
+
export type QwDatePickerService = Service<QwDatePickerSchema>;
|
|
142
|
+
/** 公开 props → 机器 props(精度归一;其余 Picker props 由 connect 透传)。 */
|
|
143
|
+
export declare function createDatePickerProps(props: QwDatePickerProps): QwDatePickerMachineProps;
|
|
144
|
+
export declare const datePickerMachine: QwDatePickerMachine;
|
|
145
|
+
/** Core 派生的渲染数据与公开 Picker 的完整 props。适配层只把 pickerProps 交给各栈 Picker。 */
|
|
146
|
+
export interface QwDatePickerApi {
|
|
147
|
+
readonly precision: DatePickerPrecision;
|
|
148
|
+
readonly columnTypes: readonly DatePickerColumnType[];
|
|
149
|
+
/** 已提交值(新 Date 副本)。 */
|
|
150
|
+
readonly value: Date;
|
|
151
|
+
readonly iso: string;
|
|
152
|
+
/** 滚轮预览对应的收口日期。 */
|
|
153
|
+
readonly previewValue: Date;
|
|
154
|
+
/** 同精度 `YYYY-MM-DD HH:mm` 文本(确定性,不依赖时区/Intl)。 */
|
|
155
|
+
readonly formattedValue: string;
|
|
156
|
+
readonly bounds: DatePickerBounds;
|
|
157
|
+
readonly columns: readonly PickerColumn[];
|
|
158
|
+
readonly pickerValue: PickerValue;
|
|
159
|
+
/** 交给公开 Picker 的 props:列、受控值、通知与原样继承的形态/开合/文案。 */
|
|
160
|
+
readonly pickerProps: QwPickerProps;
|
|
161
|
+
/** 机械运输:Picker 预览/提交通知(WC 从嵌套 qw-picker 事件转来)。 */
|
|
162
|
+
notifyPreview(value: PickerValue): void;
|
|
163
|
+
notifyCommit(value: PickerValue): void;
|
|
164
|
+
getRootProps(): Record<string, string | undefined>;
|
|
165
|
+
}
|
|
166
|
+
/** 嵌套 Picker 的 id:`<id>-picker`(不与 DatePicker 宿主重复)。 */
|
|
167
|
+
export declare function getDatePickerPickerId(id: string | undefined): string | undefined;
|
|
168
|
+
export declare function connectDatePicker(service: QwDatePickerService, props: QwDatePickerProps): QwDatePickerApi;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./date-picker.js";
|
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
import { c as daysInMonth } from "../calendar-CmpK3stz.js";
|
|
2
|
+
import { createMachine } from "@zag-js/core";
|
|
3
|
+
//#region src/date-picker/date-picker.ts
|
|
4
|
+
/**
|
|
5
|
+
* DatePicker(Beta)Core —— 日期规则的唯一来源,建在公开 Picker 之上。
|
|
6
|
+
*
|
|
7
|
+
* 本文件只把「真实 Date + 精度 + 边界」映射成 Picker 的列与值,再把 Picker 的预览/提交映射回 Date:
|
|
8
|
+
* 年/月/日/时/分列、min/max 边界、闰年与月长联动、标签格式化、受控请求与拒绝。
|
|
9
|
+
* 确定/取消、等待落定、键盘、工具栏/内嵌形态与模态宿主全部继承 Picker,本层不新增模态状态。
|
|
10
|
+
*
|
|
11
|
+
* 日期字段按 UTC 读写(`getUTC*`),因此纯日期在任何时区都确定;字符串输入按 UTC 解析。
|
|
12
|
+
*/
|
|
13
|
+
const DATE_PICKER_COLUMN_TYPES = [
|
|
14
|
+
"year",
|
|
15
|
+
"month",
|
|
16
|
+
"day",
|
|
17
|
+
"hour",
|
|
18
|
+
"minute"
|
|
19
|
+
];
|
|
20
|
+
const UNITS = {
|
|
21
|
+
year: "年",
|
|
22
|
+
month: "月",
|
|
23
|
+
day: "日",
|
|
24
|
+
hour: "时",
|
|
25
|
+
minute: "分"
|
|
26
|
+
};
|
|
27
|
+
const DEFAULT_SPAN = 10;
|
|
28
|
+
const ISO = /^(\d{4})(?:-(\d{2})(?:-(\d{2})(?:[T ](\d{2}):(\d{2})(?::(\d{2})(?:\.\d{1,3})?)?)?)?)?Z?$/;
|
|
29
|
+
const pad = (value, length = 2) => String(value).padStart(length, "0");
|
|
30
|
+
const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
|
|
31
|
+
const toInt = (value) => typeof value === "string" && /^-?\d+(?:@-?\d+)?$/.test(value) ? Number(value.split("@").at(-1)) : void 0;
|
|
32
|
+
/** UTC 构造(支持 0100 年以前,不走 Date.UTC 的两位年映射)。 */
|
|
33
|
+
function createDatePickerUtcDate(year, month = 1, day = 1, hour = 0, minute = 0) {
|
|
34
|
+
const date = /* @__PURE__ */ new Date(0);
|
|
35
|
+
date.setUTCFullYear(year, month - 1, day);
|
|
36
|
+
date.setUTCHours(hour, minute, 0, 0);
|
|
37
|
+
return date;
|
|
38
|
+
}
|
|
39
|
+
const isValidDate = (value) => value instanceof Date && Number.isFinite(value.getTime());
|
|
40
|
+
function toDatePickerParts(date) {
|
|
41
|
+
return {
|
|
42
|
+
year: date.getUTCFullYear(),
|
|
43
|
+
month: date.getUTCMonth() + 1,
|
|
44
|
+
day: date.getUTCDate(),
|
|
45
|
+
hour: date.getUTCHours(),
|
|
46
|
+
minute: date.getUTCMinutes()
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function fromDatePickerParts(parts) {
|
|
50
|
+
return createDatePickerUtcDate(parts.year, parts.month, parts.day, parts.hour, parts.minute);
|
|
51
|
+
}
|
|
52
|
+
function resolveDatePickerPrecision(precision) {
|
|
53
|
+
return DATE_PICKER_COLUMN_TYPES.includes(precision) ? precision : "day";
|
|
54
|
+
}
|
|
55
|
+
/** 精度对应的列类型(从年开始)。 */
|
|
56
|
+
function getDatePickerColumnTypes(precision) {
|
|
57
|
+
return DATE_PICKER_COLUMN_TYPES.slice(0, DATE_PICKER_COLUMN_TYPES.indexOf(resolveDatePickerPrecision(precision)) + 1);
|
|
58
|
+
}
|
|
59
|
+
/** Date 或 UTC ISO 字符串 → 新 Date;不合法(含 2 月 30 日这类溢出)返回 undefined。 */
|
|
60
|
+
function parseDatePickerInput(input) {
|
|
61
|
+
if (isValidDate(input)) return new Date(input.getTime());
|
|
62
|
+
if (typeof input !== "string") return void 0;
|
|
63
|
+
const match = ISO.exec(input.trim());
|
|
64
|
+
if (!match) return void 0;
|
|
65
|
+
const [year, month = 1, day = 1, hour = 0, minute = 0, second = 0] = match.slice(1).map((part) => part === void 0 ? void 0 : Number(part));
|
|
66
|
+
if (year < 1 || month < 1 || month > 12 || day < 1 || day > daysInMonth(year, month) || hour > 23 || minute > 59 || second > 59) return void 0;
|
|
67
|
+
return createDatePickerUtcDate(year, month, day, hour, minute);
|
|
68
|
+
}
|
|
69
|
+
/** 把比精度更细的字段归零(月→1 月,日→1 日,时/分→0)。 */
|
|
70
|
+
function truncateDatePickerDate(date, precision) {
|
|
71
|
+
const parts = toDatePickerParts(date);
|
|
72
|
+
const types = getDatePickerColumnTypes(precision);
|
|
73
|
+
return fromDatePickerParts({
|
|
74
|
+
year: parts.year,
|
|
75
|
+
month: types.includes("month") ? parts.month : 1,
|
|
76
|
+
day: types.includes("day") ? parts.day : 1,
|
|
77
|
+
hour: types.includes("hour") ? parts.hour : 0,
|
|
78
|
+
minute: types.includes("minute") ? parts.minute : 0
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/** 同精度 ISO:`2024`、`2024-02`、`2024-02-29`、`2024-02-29T08:00`、`2024-02-29T08:30`。 */
|
|
82
|
+
function toDatePickerIso(date, precision) {
|
|
83
|
+
const p = toDatePickerParts(date);
|
|
84
|
+
const types = getDatePickerColumnTypes(precision);
|
|
85
|
+
let text = pad(p.year, 4);
|
|
86
|
+
if (types.includes("month")) text += `-${pad(p.month)}`;
|
|
87
|
+
if (types.includes("day")) text += `-${pad(p.day)}`;
|
|
88
|
+
if (types.includes("hour")) text += `T${pad(p.hour)}:${types.includes("minute") ? pad(p.minute) : "00"}`;
|
|
89
|
+
return text;
|
|
90
|
+
}
|
|
91
|
+
/** 确定性展示文本(不依赖运行时区/Intl);传 format 时由调用方决定。 */
|
|
92
|
+
function formatDatePickerValue(date, precision, format) {
|
|
93
|
+
return format ? format(new Date(date.getTime())) : toDatePickerIso(date, precision).replace("T", " ");
|
|
94
|
+
}
|
|
95
|
+
function defaultDatePickerFormatter(type, value, units = {}) {
|
|
96
|
+
return `${type === "year" ? value : pad(value)}${units[type] ?? UNITS[type]}`;
|
|
97
|
+
}
|
|
98
|
+
/** 今天(UTC 日期,时分为 0)。 */
|
|
99
|
+
function getDatePickerToday() {
|
|
100
|
+
const now = /* @__PURE__ */ new Date();
|
|
101
|
+
return createDatePickerUtcDate(now.getUTCFullYear(), now.getUTCMonth() + 1, now.getUTCDate());
|
|
102
|
+
}
|
|
103
|
+
/** 边界:解析、按精度截断、缺省取锚点年 ±10 年,min > max 时互换。 */
|
|
104
|
+
function resolveDatePickerBounds(min, max, precision, anchorYear) {
|
|
105
|
+
const lower = truncateDatePickerDate(parseDatePickerInput(min) ?? createDatePickerUtcDate(Math.max(1, anchorYear - DEFAULT_SPAN)), precision);
|
|
106
|
+
const upper = truncateDatePickerDate(parseDatePickerInput(max) ?? createDatePickerUtcDate(Math.min(9999, anchorYear + DEFAULT_SPAN), 12, 31, 23, 59), precision);
|
|
107
|
+
return lower.getTime() <= upper.getTime() ? {
|
|
108
|
+
min: lower,
|
|
109
|
+
max: upper
|
|
110
|
+
} : {
|
|
111
|
+
min: upper,
|
|
112
|
+
max: lower
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/** 截断后夹进边界。 */
|
|
116
|
+
function clampDatePickerDate(date, bounds, precision) {
|
|
117
|
+
const time = truncateDatePickerDate(date, precision).getTime();
|
|
118
|
+
return new Date(clamp(time, bounds.min.getTime(), bounds.max.getTime()));
|
|
119
|
+
}
|
|
120
|
+
/** 任意输入 → 已截断、已夹紧的 Date;无效时用 fallback。 */
|
|
121
|
+
function normalizeDatePickerValue(input, bounds, precision, fallback) {
|
|
122
|
+
return clampDatePickerDate(parseDatePickerInput(input) ?? fallback, bounds, precision);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 逐列收口:每列先按前列结果求合法区间(边界只在前列都贴边时生效;日按闰年/月长),再把期望值夹进区间。
|
|
126
|
+
* 缺失或非整数的期望值取 fallback 的同列值。返回收口后的字段与每列区间。
|
|
127
|
+
*/
|
|
128
|
+
function resolveDatePickerParts(wanted, bounds, precision, fallback) {
|
|
129
|
+
const lo = toDatePickerParts(bounds.min), hi = toDatePickerParts(bounds.max);
|
|
130
|
+
const types = getDatePickerColumnTypes(precision);
|
|
131
|
+
const parts = {
|
|
132
|
+
year: lo.year,
|
|
133
|
+
month: 1,
|
|
134
|
+
day: 1,
|
|
135
|
+
hour: 0,
|
|
136
|
+
minute: 0
|
|
137
|
+
};
|
|
138
|
+
const ranges = {};
|
|
139
|
+
let atLo = true, atHi = true;
|
|
140
|
+
for (const type of types) {
|
|
141
|
+
const full = type === "year" ? [lo.year, hi.year] : type === "month" ? [1, 12] : type === "day" ? [1, daysInMonth(parts.year, parts.month)] : type === "hour" ? [0, 23] : [0, 59];
|
|
142
|
+
const range = [atLo ? lo[type] : full[0], atHi ? hi[type] : full[1]];
|
|
143
|
+
ranges[type] = range;
|
|
144
|
+
const want = wanted[type];
|
|
145
|
+
parts[type] = clamp(Number.isInteger(want) ? want : fallback[type], range[0], range[1]);
|
|
146
|
+
atLo = atLo && parts[type] === lo[type];
|
|
147
|
+
atHi = atHi && parts[type] === hi[type];
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
parts,
|
|
151
|
+
ranges
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/** Picker 值 → 期望字段(按列序)。 */
|
|
155
|
+
function wantedFrom(raw, types) {
|
|
156
|
+
return Object.fromEntries(types.map((type, index) => [type, toInt(raw[index])]));
|
|
157
|
+
}
|
|
158
|
+
/** 字段 → 规范 Picker 值(按列序的十进制字符串)。 */
|
|
159
|
+
function toDatePickerPickerValue(date, precision) {
|
|
160
|
+
const parts = toDatePickerParts(date);
|
|
161
|
+
return getDatePickerColumnTypes(precision).map((type) => String(parts[type]));
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* 由收口结果生成 Picker 列。每列只列合法区间内的项。
|
|
165
|
+
* 联动保持:当前列的锚点(前列变化那一刻滚轮上的值,例如 31 日)落在新区间外时,
|
|
166
|
+
* 收口目标项(例如 2 月 29 日)沿用锚点的 value,滚轮停在收口项上而不是回退到第一项;
|
|
167
|
+
* 锚点只在前列变化或提交后重置,所以用户正在滚的列形状不变。
|
|
168
|
+
*/
|
|
169
|
+
function getDatePickerColumns(ranges, precision, anchors = [], formatter, labels = {}, units = {}, anchorValues = anchors) {
|
|
170
|
+
const label = formatter ?? ((type, value) => defaultDatePickerFormatter(type, value, units));
|
|
171
|
+
return getDatePickerColumnTypes(precision).map((type, index) => {
|
|
172
|
+
const [from, to] = ranges[type] ?? [0, -1];
|
|
173
|
+
const anchor = toInt(anchors[index]);
|
|
174
|
+
const represented = toInt(anchorValues[index]);
|
|
175
|
+
const alias = anchor !== void 0 && represented !== void 0 && anchor !== clamp(represented, from, to) ? clamp(represented, from, to) : void 0;
|
|
176
|
+
const options = Array.from({ length: Math.max(0, to - from + 1) }, (_, offset) => {
|
|
177
|
+
const value = from + offset;
|
|
178
|
+
return {
|
|
179
|
+
value: value === alias ? String(anchor) : alias !== void 0 && value === anchor ? `${value}@${value}` : String(value),
|
|
180
|
+
label: label(type, value)
|
|
181
|
+
};
|
|
182
|
+
});
|
|
183
|
+
return {
|
|
184
|
+
label: labels[type]?.trim() || UNITS[type],
|
|
185
|
+
options
|
|
186
|
+
};
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
/** 公开 props → 机器 props(精度归一;其余 Picker props 由 connect 透传)。 */
|
|
190
|
+
function createDatePickerProps(props) {
|
|
191
|
+
return {
|
|
192
|
+
id: props.id,
|
|
193
|
+
value: props.value,
|
|
194
|
+
defaultValue: props.defaultValue,
|
|
195
|
+
min: props.min,
|
|
196
|
+
max: props.max,
|
|
197
|
+
precision: resolveDatePickerPrecision(props.precision),
|
|
198
|
+
onValueChange: props.onValueChange,
|
|
199
|
+
onPreviewChange: props.onPreviewChange
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
function boundsOf({ prop, context }) {
|
|
203
|
+
return resolveDatePickerBounds(prop("min"), prop("max"), prop("precision"), context.get("anchorYear"));
|
|
204
|
+
}
|
|
205
|
+
/** 已提交值:受控取调用方值;任何时候都按当前边界/精度收口。 */
|
|
206
|
+
function committedOf(reader) {
|
|
207
|
+
const precision = reader.prop("precision");
|
|
208
|
+
return clampDatePickerDate(reader.context.get("value"), boundsOf(reader), precision);
|
|
209
|
+
}
|
|
210
|
+
function sessionOf(reader) {
|
|
211
|
+
const committed = committedOf(reader);
|
|
212
|
+
const preview = reader.context.get("preview");
|
|
213
|
+
if (preview.base === committed.getTime()) return preview;
|
|
214
|
+
const raw = toDatePickerPickerValue(committed, reader.prop("precision"));
|
|
215
|
+
return {
|
|
216
|
+
base: committed.getTime(),
|
|
217
|
+
raw,
|
|
218
|
+
anchors: raw,
|
|
219
|
+
anchorValues: raw
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
function resolveRaw(reader, raw) {
|
|
223
|
+
const precision = reader.prop("precision");
|
|
224
|
+
const types = getDatePickerColumnTypes(precision);
|
|
225
|
+
const session = sessionOf(reader);
|
|
226
|
+
const { parts, ranges } = resolveDatePickerParts(wantedFrom(raw.map((value, index) => value === session.anchors[index] ? session.anchorValues[index] ?? value : value), types), boundsOf(reader), precision, toDatePickerParts(committedOf(reader)));
|
|
227
|
+
return {
|
|
228
|
+
date: fromDatePickerParts(parts),
|
|
229
|
+
parts,
|
|
230
|
+
ranges
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
const details = (date, precision) => ({
|
|
234
|
+
value: new Date(date.getTime()),
|
|
235
|
+
iso: toDatePickerIso(date, precision)
|
|
236
|
+
});
|
|
237
|
+
const datePickerMachine = createMachine({
|
|
238
|
+
props: ({ props }) => ({
|
|
239
|
+
...props,
|
|
240
|
+
precision: resolveDatePickerPrecision(props.precision)
|
|
241
|
+
}),
|
|
242
|
+
initialState: () => "idle",
|
|
243
|
+
states: { idle: {} },
|
|
244
|
+
context: ({ bindable, prop }) => {
|
|
245
|
+
const precision = prop("precision");
|
|
246
|
+
const seed = parseDatePickerInput(prop("value")) ?? parseDatePickerInput(prop("defaultValue")) ?? getDatePickerToday();
|
|
247
|
+
const anchorYear = seed.getUTCFullYear();
|
|
248
|
+
const bounds = resolveDatePickerBounds(prop("min"), prop("max"), precision, anchorYear);
|
|
249
|
+
const initial = normalizeDatePickerValue(prop("defaultValue"), bounds, precision, clampDatePickerDate(seed, bounds, precision));
|
|
250
|
+
const raw = toDatePickerPickerValue(initial, precision);
|
|
251
|
+
return {
|
|
252
|
+
anchorYear: bindable(() => ({ defaultValue: anchorYear })),
|
|
253
|
+
value: bindable(() => ({
|
|
254
|
+
defaultValue: initial,
|
|
255
|
+
value: prop("value") === void 0 ? void 0 : normalizeDatePickerValue(prop("value"), resolveDatePickerBounds(prop("min"), prop("max"), prop("precision"), anchorYear), prop("precision"), initial),
|
|
256
|
+
hash: (date) => String(date.getTime())
|
|
257
|
+
})),
|
|
258
|
+
preview: bindable(() => ({
|
|
259
|
+
defaultValue: {
|
|
260
|
+
base: initial.getTime(),
|
|
261
|
+
raw,
|
|
262
|
+
anchors: raw,
|
|
263
|
+
anchorValues: raw
|
|
264
|
+
},
|
|
265
|
+
hash: (state) => JSON.stringify(state)
|
|
266
|
+
}))
|
|
267
|
+
};
|
|
268
|
+
},
|
|
269
|
+
on: {
|
|
270
|
+
PREVIEW: { actions: ["preview"] },
|
|
271
|
+
COMMIT: { actions: ["commit"] },
|
|
272
|
+
RESET: { actions: ["reset"] }
|
|
273
|
+
},
|
|
274
|
+
implementations: { actions: {
|
|
275
|
+
reset({ context, prop }) {
|
|
276
|
+
const committed = committedOf({
|
|
277
|
+
context,
|
|
278
|
+
prop
|
|
279
|
+
});
|
|
280
|
+
const raw = toDatePickerPickerValue(committed, prop("precision"));
|
|
281
|
+
context.set("preview", {
|
|
282
|
+
base: committed.getTime(),
|
|
283
|
+
raw,
|
|
284
|
+
anchors: raw,
|
|
285
|
+
anchorValues: raw
|
|
286
|
+
});
|
|
287
|
+
},
|
|
288
|
+
preview({ context, prop, event }) {
|
|
289
|
+
if (event.type !== "PREVIEW") return;
|
|
290
|
+
const reader = {
|
|
291
|
+
context,
|
|
292
|
+
prop
|
|
293
|
+
};
|
|
294
|
+
const session = sessionOf(reader);
|
|
295
|
+
const raw = [...event.value];
|
|
296
|
+
const changed = raw.findIndex((item, index) => item !== session.raw[index]);
|
|
297
|
+
if (changed < 0 && raw.length === session.raw.length) return;
|
|
298
|
+
const canonical = toDatePickerPickerValue(committedOf(reader), prop("precision"));
|
|
299
|
+
const restoring = JSON.stringify(raw) === JSON.stringify(canonical);
|
|
300
|
+
const previous = resolveRaw(reader, session.raw);
|
|
301
|
+
const displayed = toDatePickerPickerValue(previous.date, prop("precision"));
|
|
302
|
+
const anchors = restoring ? canonical : raw.map((item, index) => changed >= 0 && index > changed ? item : session.anchors[index] ?? item);
|
|
303
|
+
const anchorValues = restoring ? canonical : raw.map((item, index) => changed >= 0 && index > changed ? displayed[index] ?? item : session.anchorValues[index] ?? item);
|
|
304
|
+
const before = previous.date.getTime();
|
|
305
|
+
context.set("preview", {
|
|
306
|
+
base: session.base,
|
|
307
|
+
raw,
|
|
308
|
+
anchors,
|
|
309
|
+
anchorValues
|
|
310
|
+
});
|
|
311
|
+
const { date } = resolveRaw(reader, raw);
|
|
312
|
+
if (date.getTime() !== before) prop("onPreviewChange")?.(details(date, prop("precision")));
|
|
313
|
+
},
|
|
314
|
+
commit({ context, prop, event }) {
|
|
315
|
+
if (event.type !== "COMMIT") return;
|
|
316
|
+
const { date } = resolveRaw({
|
|
317
|
+
context,
|
|
318
|
+
prop
|
|
319
|
+
}, event.value);
|
|
320
|
+
context.set("value", date);
|
|
321
|
+
prop("onValueChange")?.(details(date, prop("precision")));
|
|
322
|
+
}
|
|
323
|
+
} }
|
|
324
|
+
});
|
|
325
|
+
const OWN_KEYS = [
|
|
326
|
+
"value",
|
|
327
|
+
"defaultValue",
|
|
328
|
+
"min",
|
|
329
|
+
"max",
|
|
330
|
+
"precision",
|
|
331
|
+
"formatter",
|
|
332
|
+
"columnLabels",
|
|
333
|
+
"units",
|
|
334
|
+
"onValueChange",
|
|
335
|
+
"onPreviewChange"
|
|
336
|
+
];
|
|
337
|
+
/** 嵌套 Picker 的 id:`<id>-picker`(不与 DatePicker 宿主重复)。 */
|
|
338
|
+
function getDatePickerPickerId(id) {
|
|
339
|
+
return id ? `${id}-picker` : void 0;
|
|
340
|
+
}
|
|
341
|
+
function connectDatePicker(service, props) {
|
|
342
|
+
const reader = {
|
|
343
|
+
prop: service.prop,
|
|
344
|
+
context: service.context
|
|
345
|
+
};
|
|
346
|
+
const precision = service.prop("precision");
|
|
347
|
+
const columnTypes = getDatePickerColumnTypes(precision);
|
|
348
|
+
const committed = committedOf(reader);
|
|
349
|
+
const session = sessionOf(reader);
|
|
350
|
+
const resolved = resolveRaw(reader, session.raw);
|
|
351
|
+
const columns = getDatePickerColumns(resolved.ranges, precision, session.anchors, props.formatter, props.columnLabels, props.units, session.anchorValues);
|
|
352
|
+
const pickerValue = toDatePickerPickerValue(committed, precision);
|
|
353
|
+
const preview = (value) => service.send({
|
|
354
|
+
type: "PREVIEW",
|
|
355
|
+
value: [...value]
|
|
356
|
+
});
|
|
357
|
+
const commit = (value) => service.send({
|
|
358
|
+
type: "COMMIT",
|
|
359
|
+
value: [...value]
|
|
360
|
+
});
|
|
361
|
+
const rest = { ...props };
|
|
362
|
+
for (const key of OWN_KEYS) delete rest[key];
|
|
363
|
+
const pickerProps = {
|
|
364
|
+
...rest,
|
|
365
|
+
id: getDatePickerPickerId(props.id),
|
|
366
|
+
ariaLabel: props.ariaLabel ?? (props.title?.trim() ? void 0 : "选择日期"),
|
|
367
|
+
columns,
|
|
368
|
+
value: pickerValue,
|
|
369
|
+
onOpenChange: (open) => {
|
|
370
|
+
if (open) service.send({ type: "RESET" });
|
|
371
|
+
props.onOpenChange?.(open);
|
|
372
|
+
},
|
|
373
|
+
onPreviewChange: ({ value }) => preview(value),
|
|
374
|
+
onValueChange: ({ value }) => commit(value)
|
|
375
|
+
};
|
|
376
|
+
return {
|
|
377
|
+
precision,
|
|
378
|
+
columnTypes,
|
|
379
|
+
value: new Date(committed.getTime()),
|
|
380
|
+
iso: toDatePickerIso(committed, precision),
|
|
381
|
+
previewValue: resolved.date,
|
|
382
|
+
formattedValue: formatDatePickerValue(committed, precision),
|
|
383
|
+
bounds: boundsOf(reader),
|
|
384
|
+
columns,
|
|
385
|
+
pickerValue,
|
|
386
|
+
pickerProps,
|
|
387
|
+
notifyPreview: preview,
|
|
388
|
+
notifyCommit: commit,
|
|
389
|
+
getRootProps: () => ({
|
|
390
|
+
"data-scope": "date-picker",
|
|
391
|
+
"data-part": "root",
|
|
392
|
+
"data-visual-target": "date-picker-root",
|
|
393
|
+
"data-mode": props.mode === "inline" ? "inline" : "popup",
|
|
394
|
+
"data-precision": precision
|
|
395
|
+
})
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
//#endregion
|
|
399
|
+
export { DATE_PICKER_COLUMN_TYPES, clampDatePickerDate, connectDatePicker, createDatePickerProps, createDatePickerUtcDate, datePickerMachine, defaultDatePickerFormatter, formatDatePickerValue, fromDatePickerParts, getDatePickerColumnTypes, getDatePickerColumns, getDatePickerPickerId, getDatePickerToday, normalizeDatePickerValue, parseDatePickerInput, resolveDatePickerBounds, resolveDatePickerParts, resolveDatePickerPrecision, toDatePickerIso, toDatePickerParts, toDatePickerPickerValue, truncateDatePickerDate };
|
|
400
|
+
|
|
401
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/date-picker/date-picker.ts"],"sourcesContent":["import { createMachine, type Machine, type Service } from \"@zag-js/core\";\nimport { daysInMonth } from \"../calendar/calendar.js\";\nimport type { QwPickerProps } from \"../picker/picker.js\";\nimport type { PickerChangeDetails, PickerColumn, PickerValue } from \"../picker/selection-model.js\";\n\n/**\n * DatePicker(Beta)Core —— 日期规则的唯一来源,建在公开 Picker 之上。\n *\n * 本文件只把「真实 Date + 精度 + 边界」映射成 Picker 的列与值,再把 Picker 的预览/提交映射回 Date:\n * 年/月/日/时/分列、min/max 边界、闰年与月长联动、标签格式化、受控请求与拒绝。\n * 确定/取消、等待落定、键盘、工具栏/内嵌形态与模态宿主全部继承 Picker,本层不新增模态状态。\n *\n * 日期字段按 UTC 读写(`getUTC*`),因此纯日期在任何时区都确定;字符串输入按 UTC 解析。\n */\n\nexport const DATE_PICKER_COLUMN_TYPES = [\"year\", \"month\", \"day\", \"hour\", \"minute\"] as const;\n/** 列类型,按逻辑顺序。 */\nexport type DatePickerColumnType = (typeof DATE_PICKER_COLUMN_TYPES)[number];\n/** 精度 = 最细的一列。缺省 \"day\"(年/月/日三列)。 */\nexport type DatePickerPrecision = DatePickerColumnType;\n/** 输入值:真实 Date,或 UTC ISO 字符串(`YYYY`、`YYYY-MM`、`YYYY-MM-DD`、`YYYY-MM-DDTHH:mm`)。 */\nexport type DatePickerInput = Date | string;\nexport interface DatePickerParts { year: number; month: number; day: number; hour: number; minute: number }\n/** 通知载荷:真实 Date 副本与同精度 ISO 字符串(便于 WC/SSR 回写)。 */\nexport interface DatePickerChangeDetails { value: Date; iso: string }\n/** 选项标签格式化;缺省为「2024年」「02月」「29日」「08时」「30分」。 */\nexport type DatePickerFormatter = (type: DatePickerColumnType, value: number) => string;\nexport interface DatePickerBounds { min: Date; max: Date }\nexport type DatePickerRanges = Partial<Record<DatePickerColumnType, readonly [number, number]>>;\n\n/** DatePicker 输入:Picker 的形态/开合/文案 props 原样继承,列与值改由 Core 从 Date 派生。 */\nexport interface QwDatePickerProps extends Omit<QwPickerProps, \"columns\" | \"value\" | \"defaultValue\" | \"onValueChange\" | \"onPreviewChange\"> {\n /** 受控已提交值。传入即受控,组件只发出变更请求;无效输入回退到 defaultValue/今天。 */\n value?: DatePickerInput;\n /** 非受控初值;缺省为今天(UTC)。 */\n defaultValue?: DatePickerInput;\n /** 最早可选(含)。缺省为初值所在年 −10 年的 1 月 1 日。 */\n min?: DatePickerInput;\n /** 最晚可选(含)。缺省为初值所在年 +10 年的 12 月 31 日。min > max 时两者互换。 */\n max?: DatePickerInput;\n /** 最细的列,缺省 \"day\"。未知值回退 \"day\"。 */\n precision?: DatePickerPrecision;\n /** 选项标签。 */\n formatter?: DatePickerFormatter;\n /** 每列的可访问列名,缺省「年」「月」「日」「时」「分」。 */\n columnLabels?: Partial<Record<DatePickerColumnType, string>>;\n /** 缺省标签的单位后缀(可序列化,SSR 可用),缺省「年」「月」「日」「时」「分」;传 formatter 时不使用。 */\n units?: Partial<Record<DatePickerColumnType, string>>;\n /** 工具栏确定(落定后)或内嵌落定时通知一次。受控时这是一次请求。 */\n onValueChange?: (details: DatePickerChangeDetails) => void;\n /** 滚轮预览对应的日期变化时通知(已按边界与月长收口)。 */\n onPreviewChange?: (details: DatePickerChangeDetails) => void;\n}\n\nconst UNITS: Record<DatePickerColumnType, string> = { year: \"年\", month: \"月\", day: \"日\", hour: \"时\", minute: \"分\" };\nconst DEFAULT_SPAN = 10;\nconst ISO = /^(\\d{4})(?:-(\\d{2})(?:-(\\d{2})(?:[T ](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.\\d{1,3})?)?)?)?)?Z?$/;\nconst pad = (value: number, length = 2) => String(value).padStart(length, \"0\");\nconst clamp = (value: number, min: number, max: number) => Math.min(max, Math.max(min, value));\nconst toInt = (value: string | null | undefined): number | undefined => (typeof value === \"string\" && /^-?\\d+(?:@-?\\d+)?$/.test(value) ? Number(value.split(\"@\").at(-1)) : undefined);\n\n/** UTC 构造(支持 0100 年以前,不走 Date.UTC 的两位年映射)。 */\nexport function createDatePickerUtcDate(year: number, month = 1, day = 1, hour = 0, minute = 0): Date {\n const date = new Date(0);\n date.setUTCFullYear(year, month - 1, day);\n date.setUTCHours(hour, minute, 0, 0);\n return date;\n}\nconst isValidDate = (value: unknown): value is Date => value instanceof Date && Number.isFinite(value.getTime());\nexport function toDatePickerParts(date: Date): DatePickerParts {\n return { year: date.getUTCFullYear(), month: date.getUTCMonth() + 1, day: date.getUTCDate(), hour: date.getUTCHours(), minute: date.getUTCMinutes() };\n}\nexport function fromDatePickerParts(parts: DatePickerParts): Date {\n return createDatePickerUtcDate(parts.year, parts.month, parts.day, parts.hour, parts.minute);\n}\nexport function resolveDatePickerPrecision(precision: unknown): DatePickerPrecision {\n return (DATE_PICKER_COLUMN_TYPES as readonly unknown[]).includes(precision) ? (precision as DatePickerPrecision) : \"day\";\n}\n/** 精度对应的列类型(从年开始)。 */\nexport function getDatePickerColumnTypes(precision: DatePickerPrecision): readonly DatePickerColumnType[] {\n return DATE_PICKER_COLUMN_TYPES.slice(0, DATE_PICKER_COLUMN_TYPES.indexOf(resolveDatePickerPrecision(precision)) + 1);\n}\n/** Date 或 UTC ISO 字符串 → 新 Date;不合法(含 2 月 30 日这类溢出)返回 undefined。 */\nexport function parseDatePickerInput(input: unknown): Date | undefined {\n if (isValidDate(input)) return new Date(input.getTime());\n if (typeof input !== \"string\") return undefined;\n const match = ISO.exec(input.trim());\n if (!match) return undefined;\n const [year, month = 1, day = 1, hour = 0, minute = 0, second = 0] = match.slice(1).map((part) => (part === undefined ? undefined : Number(part))) as number[];\n if (year! < 1 || month < 1 || month > 12 || day < 1 || day > daysInMonth(year!, month) || hour > 23 || minute > 59 || second > 59) return undefined;\n return createDatePickerUtcDate(year!, month, day, hour, minute);\n}\n/** 把比精度更细的字段归零(月→1 月,日→1 日,时/分→0)。 */\nexport function truncateDatePickerDate(date: Date, precision: DatePickerPrecision): Date {\n const parts = toDatePickerParts(date);\n const types = getDatePickerColumnTypes(precision);\n return fromDatePickerParts({\n year: parts.year,\n month: types.includes(\"month\") ? parts.month : 1,\n day: types.includes(\"day\") ? parts.day : 1,\n hour: types.includes(\"hour\") ? parts.hour : 0,\n minute: types.includes(\"minute\") ? parts.minute : 0,\n });\n}\n/** 同精度 ISO:`2024`、`2024-02`、`2024-02-29`、`2024-02-29T08:00`、`2024-02-29T08:30`。 */\nexport function toDatePickerIso(date: Date, precision: DatePickerPrecision): string {\n const p = toDatePickerParts(date);\n const types = getDatePickerColumnTypes(precision);\n let text = pad(p.year, 4);\n if (types.includes(\"month\")) text += `-${pad(p.month)}`;\n if (types.includes(\"day\")) text += `-${pad(p.day)}`;\n if (types.includes(\"hour\")) text += `T${pad(p.hour)}:${types.includes(\"minute\") ? pad(p.minute) : \"00\"}`;\n return text;\n}\n/** 确定性展示文本(不依赖运行时区/Intl);传 format 时由调用方决定。 */\nexport function formatDatePickerValue(date: Date, precision: DatePickerPrecision, format?: (value: Date) => string): string {\n return format ? format(new Date(date.getTime())) : toDatePickerIso(date, precision).replace(\"T\", \" \");\n}\nexport function defaultDatePickerFormatter(type: DatePickerColumnType, value: number, units: Partial<Record<DatePickerColumnType, string>> = {}): string {\n return `${type === \"year\" ? value : pad(value)}${units[type] ?? UNITS[type]}`;\n}\n/** 今天(UTC 日期,时分为 0)。 */\nexport function getDatePickerToday(): Date {\n const now = new Date();\n return createDatePickerUtcDate(now.getUTCFullYear(), now.getUTCMonth() + 1, now.getUTCDate());\n}\n/** 边界:解析、按精度截断、缺省取锚点年 ±10 年,min > max 时互换。 */\nexport function resolveDatePickerBounds(min: unknown, max: unknown, precision: DatePickerPrecision, anchorYear: number): DatePickerBounds {\n const lower = truncateDatePickerDate(parseDatePickerInput(min) ?? createDatePickerUtcDate(Math.max(1, anchorYear - DEFAULT_SPAN)), precision);\n const upper = truncateDatePickerDate(parseDatePickerInput(max) ?? createDatePickerUtcDate(Math.min(9999, anchorYear + DEFAULT_SPAN), 12, 31, 23, 59), precision);\n return lower.getTime() <= upper.getTime() ? { min: lower, max: upper } : { min: upper, max: lower };\n}\n/** 截断后夹进边界。 */\nexport function clampDatePickerDate(date: Date, bounds: DatePickerBounds, precision: DatePickerPrecision): Date {\n const time = truncateDatePickerDate(date, precision).getTime();\n return new Date(clamp(time, bounds.min.getTime(), bounds.max.getTime()));\n}\n/** 任意输入 → 已截断、已夹紧的 Date;无效时用 fallback。 */\nexport function normalizeDatePickerValue(input: unknown, bounds: DatePickerBounds, precision: DatePickerPrecision, fallback: Date): Date {\n return clampDatePickerDate(parseDatePickerInput(input) ?? fallback, bounds, precision);\n}\n\n/**\n * 逐列收口:每列先按前列结果求合法区间(边界只在前列都贴边时生效;日按闰年/月长),再把期望值夹进区间。\n * 缺失或非整数的期望值取 fallback 的同列值。返回收口后的字段与每列区间。\n */\nexport function resolveDatePickerParts(\n wanted: Partial<Record<DatePickerColumnType, number | undefined>>,\n bounds: DatePickerBounds,\n precision: DatePickerPrecision,\n fallback: DatePickerParts,\n): { parts: DatePickerParts; ranges: DatePickerRanges } {\n const lo = toDatePickerParts(bounds.min), hi = toDatePickerParts(bounds.max);\n const types = getDatePickerColumnTypes(precision);\n const parts: DatePickerParts = { year: lo.year, month: 1, day: 1, hour: 0, minute: 0 };\n const ranges: DatePickerRanges = {};\n let atLo = true, atHi = true;\n for (const type of types) {\n const full: readonly [number, number] = type === \"year\" ? [lo.year, hi.year] : type === \"month\" ? [1, 12] : type === \"day\" ? [1, daysInMonth(parts.year, parts.month)] : type === \"hour\" ? [0, 23] : [0, 59];\n const range = [atLo ? lo[type] : full[0], atHi ? hi[type] : full[1]] as const;\n ranges[type] = range;\n const want = wanted[type];\n parts[type] = clamp(Number.isInteger(want) ? want! : fallback[type], range[0], range[1]);\n atLo = atLo && parts[type] === lo[type];\n atHi = atHi && parts[type] === hi[type];\n }\n return { parts, ranges };\n}\n\n/** Picker 值 → 期望字段(按列序)。 */\nfunction wantedFrom(raw: PickerValue, types: readonly DatePickerColumnType[]): Partial<Record<DatePickerColumnType, number | undefined>> {\n return Object.fromEntries(types.map((type, index) => [type, toInt(raw[index])]));\n}\n/** 字段 → 规范 Picker 值(按列序的十进制字符串)。 */\nexport function toDatePickerPickerValue(date: Date, precision: DatePickerPrecision): PickerValue {\n const parts = toDatePickerParts(date);\n return getDatePickerColumnTypes(precision).map((type) => String(parts[type]));\n}\n\n/**\n * 由收口结果生成 Picker 列。每列只列合法区间内的项。\n * 联动保持:当前列的锚点(前列变化那一刻滚轮上的值,例如 31 日)落在新区间外时,\n * 收口目标项(例如 2 月 29 日)沿用锚点的 value,滚轮停在收口项上而不是回退到第一项;\n * 锚点只在前列变化或提交后重置,所以用户正在滚的列形状不变。\n */\nexport function getDatePickerColumns(\n ranges: DatePickerRanges,\n precision: DatePickerPrecision,\n anchors: PickerValue = [],\n formatter?: DatePickerFormatter,\n labels: Partial<Record<DatePickerColumnType, string>> = {},\n units: Partial<Record<DatePickerColumnType, string>> = {},\n anchorValues: PickerValue = anchors,\n): PickerColumn[] {\n const label = formatter ?? ((type: DatePickerColumnType, value: number) => defaultDatePickerFormatter(type, value, units));\n return getDatePickerColumnTypes(precision).map((type, index) => {\n const [from, to] = ranges[type] ?? [0, -1];\n const anchor = toInt(anchors[index]);\n const represented = toInt(anchorValues[index]);\n const alias = anchor !== undefined && represented !== undefined && (anchor !== clamp(represented, from, to)) ? clamp(represented, from, to) : undefined;\n const options = Array.from({ length: Math.max(0, to - from + 1) }, (_, offset) => {\n const value = from + offset;\n return { value: value === alias ? String(anchor) : alias !== undefined && value === anchor ? `${value}@${value}` : String(value), label: label(type, value) };\n });\n return { label: labels[type]?.trim() || UNITS[type], options };\n });\n}\n\n/** 预览会话:base 是开始预览时的已提交值;已提交值变化后会话自动回到规范值。 */\nexport interface DatePickerPreviewState { base: number; raw: PickerValue; anchors: PickerValue; anchorValues: PickerValue }\n\n/** 机器 props(只供 Core 读取)。 */\nexport interface QwDatePickerMachineProps {\n id?: string;\n value?: DatePickerInput;\n defaultValue?: DatePickerInput;\n min?: DatePickerInput;\n max?: DatePickerInput;\n precision: DatePickerPrecision;\n onValueChange?: (details: DatePickerChangeDetails) => void;\n onPreviewChange?: (details: DatePickerChangeDetails) => void;\n}\nexport interface QwDatePickerSchema {\n props: QwDatePickerMachineProps;\n context: { value: Date; preview: DatePickerPreviewState; anchorYear: number };\n state: \"idle\";\n action: \"preview\" | \"commit\" | \"reset\";\n event: { type: \"PREVIEW\"; value: PickerValue } | { type: \"COMMIT\"; value: PickerValue } | { type: \"RESET\" };\n}\nexport type QwDatePickerMachine = Machine<QwDatePickerSchema>;\nexport type QwDatePickerService = Service<QwDatePickerSchema>;\n\n/** 公开 props → 机器 props(精度归一;其余 Picker props 由 connect 透传)。 */\nexport function createDatePickerProps(props: QwDatePickerProps): QwDatePickerMachineProps {\n return { id: props.id, value: props.value, defaultValue: props.defaultValue, min: props.min, max: props.max, precision: resolveDatePickerPrecision(props.precision), onValueChange: props.onValueChange, onPreviewChange: props.onPreviewChange };\n}\n\ntype Reader = { prop: Service<QwDatePickerSchema>[\"prop\"]; context: Service<QwDatePickerSchema>[\"context\"] };\nfunction boundsOf({ prop, context }: Reader): DatePickerBounds {\n return resolveDatePickerBounds(prop(\"min\"), prop(\"max\"), prop(\"precision\"), context.get(\"anchorYear\"));\n}\n/** 已提交值:受控取调用方值;任何时候都按当前边界/精度收口。 */\nfunction committedOf(reader: Reader): Date {\n const precision = reader.prop(\"precision\");\n return clampDatePickerDate(reader.context.get(\"value\"), boundsOf(reader), precision);\n}\nfunction sessionOf(reader: Reader): DatePickerPreviewState {\n const committed = committedOf(reader);\n const preview = reader.context.get(\"preview\");\n if (preview.base === committed.getTime()) return preview;\n const raw = toDatePickerPickerValue(committed, reader.prop(\"precision\"));\n return { base: committed.getTime(), raw, anchors: raw, anchorValues: raw };\n}\nfunction resolveRaw(reader: Reader, raw: PickerValue): { date: Date; parts: DatePickerParts; ranges: DatePickerRanges } {\n const precision = reader.prop(\"precision\");\n const types = getDatePickerColumnTypes(precision);\n const session = sessionOf(reader);\n const decoded = raw.map((value, index) => value === session.anchors[index] ? session.anchorValues[index] ?? value : value);\n const { parts, ranges } = resolveDatePickerParts(wantedFrom(decoded, types), boundsOf(reader), precision, toDatePickerParts(committedOf(reader)));\n return { date: fromDatePickerParts(parts), parts, ranges };\n}\nconst details = (date: Date, precision: DatePickerPrecision): DatePickerChangeDetails => ({ value: new Date(date.getTime()), iso: toDatePickerIso(date, precision) });\n\nexport const datePickerMachine: QwDatePickerMachine = createMachine<QwDatePickerSchema>({\n props: ({ props }) => ({ ...props, precision: resolveDatePickerPrecision(props.precision) }),\n initialState: () => \"idle\",\n states: { idle: {} },\n context: ({ bindable, prop }) => {\n const precision = prop(\"precision\");\n const seed = parseDatePickerInput(prop(\"value\")) ?? parseDatePickerInput(prop(\"defaultValue\")) ?? getDatePickerToday();\n const anchorYear = seed.getUTCFullYear();\n const bounds = resolveDatePickerBounds(prop(\"min\"), prop(\"max\"), precision, anchorYear);\n const initial = normalizeDatePickerValue(prop(\"defaultValue\"), bounds, precision, clampDatePickerDate(seed, bounds, precision));\n const raw = toDatePickerPickerValue(initial, precision);\n return {\n anchorYear: bindable(() => ({ defaultValue: anchorYear })),\n value: bindable(() => ({\n defaultValue: initial,\n value: prop(\"value\") === undefined ? undefined : normalizeDatePickerValue(prop(\"value\"), resolveDatePickerBounds(prop(\"min\"), prop(\"max\"), prop(\"precision\"), anchorYear), prop(\"precision\"), initial),\n hash: (date: Date) => String(date.getTime()),\n })),\n preview: bindable(() => ({ defaultValue: { base: initial.getTime(), raw, anchors: raw, anchorValues: raw }, hash: (state: DatePickerPreviewState) => JSON.stringify(state) })),\n };\n },\n on: { PREVIEW: { actions: [\"preview\"] }, COMMIT: { actions: [\"commit\"] }, RESET: { actions: [\"reset\"] } },\n implementations: {\n actions: {\n reset({ context, prop }) {\n const committed = committedOf({ context, prop } as Reader);\n const raw = toDatePickerPickerValue(committed, prop(\"precision\"));\n context.set(\"preview\", { base: committed.getTime(), raw, anchors: raw, anchorValues: raw });\n },\n preview({ context, prop, event }) {\n if (event.type !== \"PREVIEW\") return;\n const reader = { context, prop } as Reader;\n const session = sessionOf(reader);\n const raw = [...event.value];\n const changed = raw.findIndex((item, index) => item !== session.raw[index]);\n if (changed < 0 && raw.length === session.raw.length) return;\n // Picker cancellation/rejection restores the canonical owner value. It is not a new linked edit.\n const canonical = toDatePickerPickerValue(committedOf(reader), prop(\"precision\"));\n const restoring = JSON.stringify(raw) === JSON.stringify(canonical);\n const previous = resolveRaw(reader, session.raw);\n const displayed = toDatePickerPickerValue(previous.date, prop(\"precision\"));\n // Keep the physical wheel token, but anchor its meaning to the legal value displayed now.\n // E.g. February's token \"31\" represents 29; changing to March must retain 29, not resurrect 31.\n const anchors = restoring ? canonical : raw.map((item, index) => (changed >= 0 && index > changed ? item : session.anchors[index] ?? item));\n const anchorValues = restoring ? canonical : raw.map((item, index) => (changed >= 0 && index > changed ? displayed[index] ?? item : session.anchorValues[index] ?? item));\n const before = previous.date.getTime();\n context.set(\"preview\", { base: session.base, raw, anchors, anchorValues });\n const { date } = resolveRaw(reader, raw);\n if (date.getTime() !== before) prop(\"onPreviewChange\")?.(details(date, prop(\"precision\")));\n },\n commit({ context, prop, event }) {\n if (event.type !== \"COMMIT\") return;\n const reader = { context, prop } as Reader;\n const { date } = resolveRaw(reader, event.value);\n context.set(\"value\", date);\n prop(\"onValueChange\")?.(details(date, prop(\"precision\")));\n },\n },\n },\n});\n\n/** Core 派生的渲染数据与公开 Picker 的完整 props。适配层只把 pickerProps 交给各栈 Picker。 */\nexport interface QwDatePickerApi {\n readonly precision: DatePickerPrecision;\n readonly columnTypes: readonly DatePickerColumnType[];\n /** 已提交值(新 Date 副本)。 */\n readonly value: Date;\n readonly iso: string;\n /** 滚轮预览对应的收口日期。 */\n readonly previewValue: Date;\n /** 同精度 `YYYY-MM-DD HH:mm` 文本(确定性,不依赖时区/Intl)。 */\n readonly formattedValue: string;\n readonly bounds: DatePickerBounds;\n readonly columns: readonly PickerColumn[];\n readonly pickerValue: PickerValue;\n /** 交给公开 Picker 的 props:列、受控值、通知与原样继承的形态/开合/文案。 */\n readonly pickerProps: QwPickerProps;\n /** 机械运输:Picker 预览/提交通知(WC 从嵌套 qw-picker 事件转来)。 */\n notifyPreview(value: PickerValue): void;\n notifyCommit(value: PickerValue): void;\n getRootProps(): Record<string, string | undefined>;\n}\n\nconst OWN_KEYS = [\"value\", \"defaultValue\", \"min\", \"max\", \"precision\", \"formatter\", \"columnLabels\", \"units\", \"onValueChange\", \"onPreviewChange\"] as const;\n\n/** 嵌套 Picker 的 id:`<id>-picker`(不与 DatePicker 宿主重复)。 */\nexport function getDatePickerPickerId(id: string | undefined): string | undefined {\n return id ? `${id}-picker` : undefined;\n}\n\nexport function connectDatePicker(service: QwDatePickerService, props: QwDatePickerProps): QwDatePickerApi {\n const reader = { prop: service.prop, context: service.context } as Reader;\n const precision = service.prop(\"precision\");\n const columnTypes = getDatePickerColumnTypes(precision);\n const committed = committedOf(reader);\n const session = sessionOf(reader);\n const resolved = resolveRaw(reader, session.raw);\n const columns = getDatePickerColumns(resolved.ranges, precision, session.anchors, props.formatter, props.columnLabels, props.units, session.anchorValues);\n const pickerValue = toDatePickerPickerValue(committed, precision);\n const preview = (value: PickerValue) => service.send({ type: \"PREVIEW\", value: [...value] });\n const commit = (value: PickerValue) => service.send({ type: \"COMMIT\", value: [...value] });\n const rest: Record<string, unknown> = { ...props };\n for (const key of OWN_KEYS) delete rest[key];\n const pickerProps: QwPickerProps = {\n ...(rest as Omit<QwPickerProps, \"columns\">),\n id: getDatePickerPickerId(props.id),\n ariaLabel: props.ariaLabel ?? (props.title?.trim() ? undefined : \"选择日期\"),\n columns,\n value: pickerValue,\n onOpenChange: (open) => { if (open) service.send({ type: \"RESET\" }); props.onOpenChange?.(open); },\n onPreviewChange: ({ value }: PickerChangeDetails) => preview(value),\n onValueChange: ({ value }: PickerChangeDetails) => commit(value),\n };\n return {\n precision,\n columnTypes,\n value: new Date(committed.getTime()),\n iso: toDatePickerIso(committed, precision),\n previewValue: resolved.date,\n formattedValue: formatDatePickerValue(committed, precision),\n bounds: boundsOf(reader),\n columns,\n pickerValue,\n pickerProps,\n notifyPreview: preview,\n notifyCommit: commit,\n getRootProps: () => ({\n \"data-scope\": \"date-picker\",\n \"data-part\": \"root\",\n \"data-visual-target\": \"date-picker-root\",\n \"data-mode\": props.mode === \"inline\" ? \"inline\" : \"popup\",\n \"data-precision\": precision,\n }),\n };\n}\n"],"mappings":"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"}
|