@qw-ui/core 0.3.0-next.9 → 0.3.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/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 +85 -0
- package/dist/badge/index.d.ts +1 -0
- package/dist/badge/index.js +88 -0
- package/dist/badge/index.js.map +1 -0
- 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 +61 -43
- package/dist/dialog/index.js +73 -19
- 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 +115 -10
- package/dist/index.js +151 -11
- 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/overlay-panel/index.d.ts +2 -0
- package/dist/overlay-panel/index.js +2 -0
- package/dist/overlay-panel/overlay-panel.d.ts +20 -0
- package/dist/overlay-panel-Z_qdKeBj.js +26 -0
- package/dist/overlay-panel-Z_qdKeBj.js.map +1 -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 +4 -2
- package/dist/search-bar/index.js.map +1 -1
- package/dist/search-bar/search-bar.d.ts +6 -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/side-nav/index.d.ts +1 -0
- package/dist/side-nav/index.js +99 -0
- package/dist/side-nav/index.js.map +1 -0
- package/dist/side-nav/side-nav.d.ts +94 -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.d.ts +1 -0
- package/dist/stepper/index.js +172 -0
- package/dist/stepper/index.js.map +1 -0
- package/dist/stepper/stepper.d.ts +161 -0
- 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.d.ts +1 -0
- package/dist/switch/index.js +168 -0
- package/dist/switch/index.js.map +1 -0
- package/dist/switch/switch.d.ts +142 -0
- package/dist/tabbar/index.d.ts +1 -0
- package/dist/tabbar/index.js +95 -0
- package/dist/tabbar/index.js.map +1 -0
- package/dist/tabbar/tabbar.d.ts +119 -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 +169 -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 +27 -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 +417 -44
- 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,348 @@
|
|
|
1
|
+
import { l as resolveCascaderPath, s as normalizeCascaderOptions, u as updateCascaderChildren } from "../cascader-D-xMjs7P.js";
|
|
2
|
+
import { createMachine } from "@zag-js/core";
|
|
3
|
+
//#region src/area-picker/area-picker.ts
|
|
4
|
+
const AREA_PICKER_PARTS = [
|
|
5
|
+
"root",
|
|
6
|
+
"status",
|
|
7
|
+
"retry-trigger",
|
|
8
|
+
"input"
|
|
9
|
+
];
|
|
10
|
+
function toAreaPickerOptions(data) {
|
|
11
|
+
return normalizeCascaderOptions(data.map((node) => ({
|
|
12
|
+
value: node.code,
|
|
13
|
+
label: node.label,
|
|
14
|
+
disabled: node.disabled,
|
|
15
|
+
leaf: node.leaf,
|
|
16
|
+
children: node.children ? toAreaPickerOptions(node.children) : void 0
|
|
17
|
+
})), "AreaPicker");
|
|
18
|
+
}
|
|
19
|
+
function toNode(node) {
|
|
20
|
+
return {
|
|
21
|
+
code: node.value,
|
|
22
|
+
label: node.label,
|
|
23
|
+
disabled: node.disabled,
|
|
24
|
+
leaf: node.leaf,
|
|
25
|
+
children: node.children?.map(toNode)
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const depthOf = (props) => Number.isInteger(props.maxDepth) && props.maxDepth > 0 ? props.maxDepth : 3;
|
|
29
|
+
/** Fill enabled descendants; a disabled ancestor invalidates its entire branch. */
|
|
30
|
+
function resolveAreaPickerValue(options, value, maxDepth = 3) {
|
|
31
|
+
const path = [];
|
|
32
|
+
let level = options;
|
|
33
|
+
for (let depth = 0; depth < maxDepth; depth++) {
|
|
34
|
+
const selected = level.find((node) => node.value === value[depth] && !node.disabled) ?? level.find((node) => !node.disabled);
|
|
35
|
+
if (!selected) break;
|
|
36
|
+
path.push(selected.value);
|
|
37
|
+
if (selected.leaf) break;
|
|
38
|
+
level = selected.children ?? [];
|
|
39
|
+
}
|
|
40
|
+
return path;
|
|
41
|
+
}
|
|
42
|
+
function details(options, value) {
|
|
43
|
+
const path = resolveCascaderPath(options, value).map(toNode);
|
|
44
|
+
return {
|
|
45
|
+
value: [...value],
|
|
46
|
+
labels: path.map((node) => node.label),
|
|
47
|
+
path,
|
|
48
|
+
code: value.at(-1)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function createAreaPickerProps(props) {
|
|
52
|
+
toAreaPickerOptions(props.data ?? []);
|
|
53
|
+
return {
|
|
54
|
+
...props,
|
|
55
|
+
data: props.data ?? [],
|
|
56
|
+
maxDepth: depthOf(props)
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function invalidate({ context, refs }) {
|
|
60
|
+
refs.get("controller")?.abort();
|
|
61
|
+
refs.set("controller", null);
|
|
62
|
+
refs.set("request", refs.get("request") + 1);
|
|
63
|
+
context.set("loading", []);
|
|
64
|
+
}
|
|
65
|
+
function currentOptions({ context, refs }) {
|
|
66
|
+
return refs.get("options") ?? context.get("options");
|
|
67
|
+
}
|
|
68
|
+
function load(params, path, options = currentOptions(params)) {
|
|
69
|
+
const { context, prop, refs, send } = params, loader = prop("loadChildren"), option = resolveCascaderPath(options, path).at(-1);
|
|
70
|
+
if (!loader || !option || option.disabled || option.leaf || option.children !== void 0 || path.length >= (prop("maxDepth") ?? 3)) return;
|
|
71
|
+
invalidate(params);
|
|
72
|
+
const controller = new AbortController(), request = refs.get("request"), sourceData = prop("data"), sourceDepth = prop("maxDepth");
|
|
73
|
+
refs.set("controller", controller);
|
|
74
|
+
context.set("loading", path);
|
|
75
|
+
context.set("error", []);
|
|
76
|
+
Promise.resolve().then(() => {
|
|
77
|
+
if (!refs.get("active") || controller.signal.aborted || refs.get("request") !== request || prop("data") !== sourceData || prop("maxDepth") !== sourceDepth || prop("loadChildren") !== loader) return void 0;
|
|
78
|
+
return loader({
|
|
79
|
+
node: toNode(option),
|
|
80
|
+
path: [...path],
|
|
81
|
+
signal: controller.signal
|
|
82
|
+
});
|
|
83
|
+
}).then((data) => {
|
|
84
|
+
if (data === void 0) return void 0;
|
|
85
|
+
toAreaPickerOptions(data);
|
|
86
|
+
return data;
|
|
87
|
+
}).then((data) => {
|
|
88
|
+
if (data !== void 0 && refs.get("active") && !controller.signal.aborted && refs.get("request") === request) send({
|
|
89
|
+
type: "SUCCESS",
|
|
90
|
+
request,
|
|
91
|
+
path,
|
|
92
|
+
data
|
|
93
|
+
});
|
|
94
|
+
}).catch(() => {
|
|
95
|
+
if (refs.get("active") && !controller.signal.aborted) send({
|
|
96
|
+
type: "ERROR",
|
|
97
|
+
request,
|
|
98
|
+
path
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
const loaderIdentities = /* @__PURE__ */ new WeakMap();
|
|
103
|
+
let nextLoaderIdentity = 0;
|
|
104
|
+
function loaderIdentity(loader) {
|
|
105
|
+
if (!loader) return 0;
|
|
106
|
+
const known = loaderIdentities.get(loader);
|
|
107
|
+
if (known !== void 0) return known;
|
|
108
|
+
const identity = ++nextLoaderIdentity;
|
|
109
|
+
loaderIdentities.set(loader, identity);
|
|
110
|
+
return identity;
|
|
111
|
+
}
|
|
112
|
+
const areaPickerMachine = createMachine({
|
|
113
|
+
props: ({ props }) => createAreaPickerProps({
|
|
114
|
+
...props,
|
|
115
|
+
data: props.data ?? []
|
|
116
|
+
}),
|
|
117
|
+
initialState: () => "idle",
|
|
118
|
+
states: { idle: {} },
|
|
119
|
+
context: ({ bindable, prop }) => ({
|
|
120
|
+
value: bindable(() => ({
|
|
121
|
+
defaultValue: prop("defaultValue") ?? [],
|
|
122
|
+
value: prop("value"),
|
|
123
|
+
hash: JSON.stringify
|
|
124
|
+
})),
|
|
125
|
+
preview: bindable(() => ({
|
|
126
|
+
defaultValue: [],
|
|
127
|
+
hash: JSON.stringify
|
|
128
|
+
})),
|
|
129
|
+
base: bindable(() => ({ defaultValue: "" })),
|
|
130
|
+
options: bindable(() => ({
|
|
131
|
+
defaultValue: toAreaPickerOptions(prop("data") ?? []),
|
|
132
|
+
hash: JSON.stringify
|
|
133
|
+
})),
|
|
134
|
+
loading: bindable(() => ({
|
|
135
|
+
defaultValue: [],
|
|
136
|
+
hash: JSON.stringify
|
|
137
|
+
})),
|
|
138
|
+
error: bindable(() => ({
|
|
139
|
+
defaultValue: [],
|
|
140
|
+
hash: JSON.stringify
|
|
141
|
+
}))
|
|
142
|
+
}),
|
|
143
|
+
refs: () => ({
|
|
144
|
+
controller: null,
|
|
145
|
+
active: false,
|
|
146
|
+
request: 0,
|
|
147
|
+
options: void 0
|
|
148
|
+
}),
|
|
149
|
+
effects: ["lifecycle"],
|
|
150
|
+
watch({ track, prop, send }) {
|
|
151
|
+
track([
|
|
152
|
+
() => JSON.stringify(prop("data") ?? []),
|
|
153
|
+
() => prop("maxDepth"),
|
|
154
|
+
() => loaderIdentity(prop("loadChildren"))
|
|
155
|
+
], () => send({ type: "SYNC" }));
|
|
156
|
+
track([() => JSON.stringify(prop("value"))], () => send({ type: "OPEN" }));
|
|
157
|
+
track([() => prop("open")], () => send({ type: prop("open") ? "OPEN" : "RESET" }));
|
|
158
|
+
},
|
|
159
|
+
on: {
|
|
160
|
+
PREVIEW: { actions: ["preview"] },
|
|
161
|
+
COMMIT: { actions: ["commit"] },
|
|
162
|
+
SYNC: { actions: ["sync"] },
|
|
163
|
+
RETRY: { actions: ["retry"] },
|
|
164
|
+
RESET: { actions: ["reset"] },
|
|
165
|
+
OPEN: { actions: ["open"] },
|
|
166
|
+
SUCCESS: { actions: ["success"] },
|
|
167
|
+
ERROR: { actions: ["error"] }
|
|
168
|
+
},
|
|
169
|
+
implementations: {
|
|
170
|
+
actions: {
|
|
171
|
+
preview(params) {
|
|
172
|
+
const { context, prop, event } = params;
|
|
173
|
+
if (event.type !== "PREVIEW") return;
|
|
174
|
+
const value = resolveAreaPickerValue(currentOptions(params), event.value, prop("maxDepth"));
|
|
175
|
+
context.set("base", JSON.stringify(context.get("value")));
|
|
176
|
+
context.set("preview", value);
|
|
177
|
+
context.set("error", []);
|
|
178
|
+
invalidate(params);
|
|
179
|
+
load(params, value);
|
|
180
|
+
prop("onPreviewChange")?.(details(currentOptions(params), value));
|
|
181
|
+
},
|
|
182
|
+
commit(params) {
|
|
183
|
+
const { context, prop, event } = params;
|
|
184
|
+
if (event.type !== "COMMIT" || context.get("loading").length || context.get("error").length) return;
|
|
185
|
+
const options = currentOptions(params), value = resolveAreaPickerValue(options, event.value, prop("maxDepth")), last = resolveCascaderPath(options, value).at(-1);
|
|
186
|
+
if (!last || !last.leaf && value.length < (prop("maxDepth") ?? 3)) return;
|
|
187
|
+
context.set("value", value);
|
|
188
|
+
context.set("preview", []);
|
|
189
|
+
prop("onValueChange")?.(details(options, value));
|
|
190
|
+
},
|
|
191
|
+
sync(params) {
|
|
192
|
+
invalidate(params);
|
|
193
|
+
const options = toAreaPickerOptions(params.prop("data"));
|
|
194
|
+
params.refs.set("options", options);
|
|
195
|
+
params.context.set("options", options);
|
|
196
|
+
params.context.set("preview", []);
|
|
197
|
+
params.context.set("error", []);
|
|
198
|
+
load(params, resolveAreaPickerValue(options, params.context.get("value"), params.prop("maxDepth")), options);
|
|
199
|
+
},
|
|
200
|
+
reset(params) {
|
|
201
|
+
invalidate(params);
|
|
202
|
+
params.context.set("preview", []);
|
|
203
|
+
params.context.set("error", []);
|
|
204
|
+
},
|
|
205
|
+
open(params) {
|
|
206
|
+
invalidate(params);
|
|
207
|
+
params.context.set("preview", []);
|
|
208
|
+
params.context.set("error", []);
|
|
209
|
+
load(params, resolveAreaPickerValue(currentOptions(params), params.context.get("value"), params.prop("maxDepth")));
|
|
210
|
+
},
|
|
211
|
+
success(params) {
|
|
212
|
+
const { context, event, refs } = params;
|
|
213
|
+
if (event.type !== "SUCCESS" || event.request !== refs.get("request")) return;
|
|
214
|
+
params.refs.set("controller", null);
|
|
215
|
+
const options = updateCascaderChildren(currentOptions(params), event.path, toAreaPickerOptions(event.data));
|
|
216
|
+
refs.set("options", options);
|
|
217
|
+
context.set("options", options);
|
|
218
|
+
context.set("loading", []);
|
|
219
|
+
const value = resolveAreaPickerValue(options, context.get("base") === JSON.stringify(context.get("value")) && context.get("preview").length ? context.get("preview") : context.get("value"), params.prop("maxDepth"));
|
|
220
|
+
context.set("base", JSON.stringify(context.get("value")));
|
|
221
|
+
context.set("preview", value);
|
|
222
|
+
load(params, value, options);
|
|
223
|
+
},
|
|
224
|
+
error({ context, event, refs }) {
|
|
225
|
+
if (event.type !== "ERROR" || event.request !== refs.get("request")) return;
|
|
226
|
+
refs.set("controller", null);
|
|
227
|
+
context.set("loading", []);
|
|
228
|
+
context.set("error", event.path);
|
|
229
|
+
},
|
|
230
|
+
retry(params) {
|
|
231
|
+
const path = params.context.get("error");
|
|
232
|
+
if (path.length) load(params, path);
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
effects: { lifecycle(params) {
|
|
236
|
+
params.refs.set("active", true);
|
|
237
|
+
load(params, resolveAreaPickerValue(params.context.get("options"), params.prop("value") ?? params.prop("defaultValue") ?? [], params.prop("maxDepth")));
|
|
238
|
+
return () => {
|
|
239
|
+
params.refs.set("active", false);
|
|
240
|
+
params.refs.get("controller")?.abort();
|
|
241
|
+
};
|
|
242
|
+
} }
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
function connectAreaPicker(service, props) {
|
|
246
|
+
const options = service.context.get("options"), owner = service.context.get("value"), value = resolveAreaPickerValue(options, owner, depthOf(props));
|
|
247
|
+
const preview = resolveAreaPickerValue(options, service.context.get("base") === JSON.stringify(owner) && service.context.get("preview").length ? service.context.get("preview") : value, depthOf(props)), last = resolveCascaderPath(options, preview).at(-1);
|
|
248
|
+
const loading = service.context.get("loading").length > 0, error = service.context.get("error").length > 0;
|
|
249
|
+
const committedLast = resolveCascaderPath(options, value).at(-1);
|
|
250
|
+
const committedValid = !!committedLast && (committedLast.leaf === true || value.length === depthOf(props));
|
|
251
|
+
const valid = !!last && (last.leaf === true || preview.length === depthOf(props)) && !loading && !error;
|
|
252
|
+
const columns = [];
|
|
253
|
+
let level = options;
|
|
254
|
+
for (let depth = 0; depth < depthOf(props); depth++) {
|
|
255
|
+
columns.push({
|
|
256
|
+
label: props.columnLabels?.[depth] ?? [
|
|
257
|
+
"省",
|
|
258
|
+
"市",
|
|
259
|
+
"区"
|
|
260
|
+
][depth] ?? `第 ${depth + 1} 级`,
|
|
261
|
+
options: level.map((node) => ({
|
|
262
|
+
value: node.value,
|
|
263
|
+
label: node.label,
|
|
264
|
+
disabled: node.disabled
|
|
265
|
+
}))
|
|
266
|
+
});
|
|
267
|
+
const selected = level.find((node) => node.value === preview[depth]);
|
|
268
|
+
if (selected?.leaf) break;
|
|
269
|
+
level = selected?.children ?? [];
|
|
270
|
+
}
|
|
271
|
+
const notifyPreview = (v) => service.send({
|
|
272
|
+
type: "PREVIEW",
|
|
273
|
+
value: v
|
|
274
|
+
}), notifyCommit = (v) => service.send({
|
|
275
|
+
type: "COMMIT",
|
|
276
|
+
value: v
|
|
277
|
+
});
|
|
278
|
+
const rest = { ...props };
|
|
279
|
+
for (const key of [
|
|
280
|
+
"data",
|
|
281
|
+
"value",
|
|
282
|
+
"defaultValue",
|
|
283
|
+
"maxDepth",
|
|
284
|
+
"columnLabels",
|
|
285
|
+
"loadChildren",
|
|
286
|
+
"loadingText",
|
|
287
|
+
"errorText",
|
|
288
|
+
"retryText",
|
|
289
|
+
"name",
|
|
290
|
+
"onValueChange",
|
|
291
|
+
"onPreviewChange"
|
|
292
|
+
]) delete rest[key];
|
|
293
|
+
return {
|
|
294
|
+
value,
|
|
295
|
+
labels: details(options, value).labels,
|
|
296
|
+
previewValue: preview,
|
|
297
|
+
valid,
|
|
298
|
+
loading,
|
|
299
|
+
error,
|
|
300
|
+
statusText: error ? props.errorText ?? "地区加载失败" : loading ? props.loadingText ?? "地区加载中" : "",
|
|
301
|
+
retryText: props.retryText ?? "重试",
|
|
302
|
+
columns,
|
|
303
|
+
pickerProps: {
|
|
304
|
+
...rest,
|
|
305
|
+
id: props.id ? `${props.id}-picker` : void 0,
|
|
306
|
+
ariaLabel: props.ariaLabel ?? "选择地区",
|
|
307
|
+
columns,
|
|
308
|
+
value,
|
|
309
|
+
onPreviewChange: (d) => notifyPreview(d.value),
|
|
310
|
+
onValueChange: (d) => notifyCommit(d.value),
|
|
311
|
+
onOpenChange: (open) => {
|
|
312
|
+
service.send({ type: open ? "OPEN" : "RESET" });
|
|
313
|
+
props.onOpenChange?.(open);
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
notifyPreview,
|
|
317
|
+
notifyCommit,
|
|
318
|
+
retry: () => service.send({ type: "RETRY" }),
|
|
319
|
+
getRootProps: () => ({
|
|
320
|
+
lang: props.lang,
|
|
321
|
+
dir: props.dir,
|
|
322
|
+
"data-scope": "area-picker",
|
|
323
|
+
"data-part": "root",
|
|
324
|
+
"data-visual-target": "area-picker-root"
|
|
325
|
+
}),
|
|
326
|
+
getStatusProps: () => ({
|
|
327
|
+
"data-scope": "area-picker",
|
|
328
|
+
"data-part": "status",
|
|
329
|
+
role: error ? "alert" : "status",
|
|
330
|
+
hidden: !loading && !error
|
|
331
|
+
}),
|
|
332
|
+
getRetryProps: () => ({
|
|
333
|
+
type: "button",
|
|
334
|
+
hidden: !error,
|
|
335
|
+
onClick: () => service.send({ type: "RETRY" })
|
|
336
|
+
}),
|
|
337
|
+
getInputProps: () => ({
|
|
338
|
+
type: "hidden",
|
|
339
|
+
name: props.name,
|
|
340
|
+
value: value.join("/"),
|
|
341
|
+
disabled: !committedValid
|
|
342
|
+
})
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
//#endregion
|
|
346
|
+
export { AREA_PICKER_PARTS, areaPickerMachine, connectAreaPicker, createAreaPickerProps, resolveAreaPickerValue, toAreaPickerOptions };
|
|
347
|
+
|
|
348
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/area-picker/area-picker.ts"],"sourcesContent":["import { createMachine, type Machine, type Params, type Service } from \"@zag-js/core\";\nimport { normalizeCascaderOptions, resolveCascaderPath, updateCascaderChildren, type CascaderOption } from \"../cascader/cascader.js\";\nimport type { QwPickerProps } from \"../picker/picker.js\";\nimport type { PickerColumn, PickerValue } from \"../picker/selection-model.js\";\n\n/** Caller-owned region data. No national administrative dataset is bundled. Codes are opaque strings. */\nexport interface AreaPickerNode { code: string; label: string; disabled?: boolean; leaf?: boolean; children?: AreaPickerNode[] }\nexport interface AreaPickerChangeDetails { value: string[]; labels: string[]; path: AreaPickerNode[]; code: string | undefined }\nexport interface AreaPickerLoadDetails { node: AreaPickerNode; path: string[]; signal: AbortSignal }\nexport interface QwAreaPickerProps extends Omit<QwPickerProps, \"columns\" | \"value\" | \"defaultValue\" | \"onValueChange\" | \"onPreviewChange\"> {\n data: readonly AreaPickerNode[];\n /** Explicit locale boundary copied by the real Picker portal. */\n lang?: string;\n dir?: string;\n value?: string[];\n defaultValue?: string[];\n /** Maximum hierarchy depth, default 3. Explicit leaf nodes may terminate earlier. */\n maxDepth?: number;\n columnLabels?: string[];\n loadChildren?: (details: AreaPickerLoadDetails) => Promise<AreaPickerNode[]>;\n loadingText?: string;\n errorText?: string;\n retryText?: string;\n name?: string;\n onValueChange?: (details: AreaPickerChangeDetails) => void;\n onPreviewChange?: (details: AreaPickerChangeDetails) => void;\n}\nexport const AREA_PICKER_PARTS = [\"root\", \"status\", \"retry-trigger\", \"input\"] as const;\nexport function toAreaPickerOptions(data: readonly AreaPickerNode[]): CascaderOption[] {\n return normalizeCascaderOptions(data.map(node => ({ value: node.code, label: node.label, disabled: node.disabled, leaf: node.leaf, children: node.children ? toAreaPickerOptions(node.children) : undefined })), \"AreaPicker\");\n}\nfunction toNode(node: CascaderOption): AreaPickerNode { return { code: node.value, label: node.label, disabled: node.disabled, leaf: node.leaf, children: node.children?.map(toNode) }; }\nconst depthOf = (props: QwAreaPickerProps) => Number.isInteger(props.maxDepth) && props.maxDepth! > 0 ? props.maxDepth! : 3;\n/** Fill enabled descendants; a disabled ancestor invalidates its entire branch. */\nexport function resolveAreaPickerValue(options: readonly CascaderOption[], value: readonly (string | null)[], maxDepth = 3): string[] {\n const path: string[] = []; let level = options;\n for (let depth = 0; depth < maxDepth; depth++) {\n const selected = level.find(node => node.value === value[depth] && !node.disabled) ?? level.find(node => !node.disabled);\n if (!selected) break;\n path.push(selected.value);\n if (selected.leaf) break;\n level = selected.children ?? [];\n }\n return path;\n}\nfunction details(options: readonly CascaderOption[], value: string[]): AreaPickerChangeDetails {\n const path = resolveCascaderPath(options, value).map(toNode);\n return { value: [...value], labels: path.map(node => node.label), path, code: value.at(-1) };\n}\nexport interface QwAreaPickerSchema {\n props: QwAreaPickerProps;\n context: { value: string[]; preview: string[]; base: string; options: CascaderOption[]; loading: string[]; error: string[] };\n refs: { controller: AbortController | null; active: boolean; request: number; options: CascaderOption[] | undefined };\n state: \"idle\";\n action: \"preview\" | \"commit\" | \"sync\" | \"success\" | \"error\" | \"retry\" | \"reset\" | \"open\";\n effect: \"lifecycle\";\n event: { type: \"PREVIEW\" | \"COMMIT\"; value: PickerValue } | { type: \"SYNC\" | \"RETRY\" | \"RESET\" | \"OPEN\" } | { type: \"SUCCESS\"; request: number; path: string[]; data: AreaPickerNode[] } | { type: \"ERROR\"; request: number; path: string[] };\n}\nexport type QwAreaPickerMachine = Machine<QwAreaPickerSchema>;\nexport type QwAreaPickerService = Service<QwAreaPickerSchema>;\nexport function createAreaPickerProps(props: QwAreaPickerProps): QwAreaPickerProps { toAreaPickerOptions(props.data ?? []); return { ...props, data: props.data ?? [], maxDepth: depthOf(props) }; }\ntype LoadParams = Pick<Params<QwAreaPickerSchema>, \"context\" | \"prop\" | \"refs\" | \"send\">;\nfunction invalidate({ context, refs }: LoadParams) { refs.get(\"controller\")?.abort(); refs.set(\"controller\", null); refs.set(\"request\", refs.get(\"request\") + 1); context.set(\"loading\", []); }\nfunction currentOptions({ context, refs }: LoadParams): CascaderOption[] { return refs.get(\"options\") ?? context.get(\"options\"); }\nfunction load(params: LoadParams, path: string[], options: CascaderOption[] = currentOptions(params)) {\n const { context, prop, refs, send } = params, loader = prop(\"loadChildren\"), option = resolveCascaderPath(options, path).at(-1);\n if (!loader || !option || option.disabled || option.leaf || option.children !== undefined || path.length >= (prop(\"maxDepth\") ?? 3)) return;\n invalidate(params); const controller = new AbortController(), request = refs.get(\"request\"), sourceData = prop(\"data\"), sourceDepth = prop(\"maxDepth\"); refs.set(\"controller\", controller); context.set(\"loading\", path); context.set(\"error\", []);\n // Deferred invocation also catches synchronous loader throws and validates data within the rejection chain.\n Promise.resolve().then(() => { if (!refs.get(\"active\") || controller.signal.aborted || refs.get(\"request\") !== request || prop(\"data\") !== sourceData || prop(\"maxDepth\") !== sourceDepth || prop(\"loadChildren\") !== loader) return undefined; return loader({ node: toNode(option), path: [...path], signal: controller.signal }); }).then(data => { if (data === undefined) return undefined; toAreaPickerOptions(data); return data; }).then(data => { if (data !== undefined && refs.get(\"active\") && !controller.signal.aborted && refs.get(\"request\") === request) send({ type: \"SUCCESS\", request, path, data }); }).catch(() => { if (refs.get(\"active\") && !controller.signal.aborted) send({ type: \"ERROR\", request, path }); });\n}\nconst loaderIdentities = new WeakMap<NonNullable<QwAreaPickerProps[\"loadChildren\"]>, number>();\nlet nextLoaderIdentity = 0;\nfunction loaderIdentity(loader: QwAreaPickerProps[\"loadChildren\"]): number {\n if (!loader) return 0;\n const known = loaderIdentities.get(loader);\n if (known !== undefined) return known;\n const identity = ++nextLoaderIdentity; loaderIdentities.set(loader, identity); return identity;\n}\nexport const areaPickerMachine: QwAreaPickerMachine = createMachine<QwAreaPickerSchema>({\n props: ({ props }) => createAreaPickerProps({ ...props, data: props.data ?? [] }), initialState: () => \"idle\", states: { idle: {} },\n context: ({ bindable, prop }) => ({\n value: bindable(() => ({ defaultValue: prop(\"defaultValue\") ?? [], value: prop(\"value\"), hash: JSON.stringify })),\n preview: bindable<string[]>(() => ({ defaultValue: [], hash: JSON.stringify })), base: bindable(() => ({ defaultValue: \"\" })),\n options: bindable(() => ({ defaultValue: toAreaPickerOptions(prop(\"data\") ?? []), hash: JSON.stringify })),\n loading: bindable<string[]>(() => ({ defaultValue: [], hash: JSON.stringify })), error: bindable<string[]>(() => ({ defaultValue: [], hash: JSON.stringify })),\n }), refs: () => ({ controller: null, active: false, request: 0, options: undefined }), effects: [\"lifecycle\"],\n watch({ track, prop, send }) { track([() => JSON.stringify(prop(\"data\") ?? []), () => prop(\"maxDepth\"), () => loaderIdentity(prop(\"loadChildren\"))], () => send({ type: \"SYNC\" })); track([() => JSON.stringify(prop(\"value\"))], () => send({ type: \"OPEN\" })); track([() => prop(\"open\")], () => send({ type: prop(\"open\") ? \"OPEN\" : \"RESET\" })); },\n on: { PREVIEW: { actions: [\"preview\"] }, COMMIT: { actions: [\"commit\"] }, SYNC: { actions: [\"sync\"] }, RETRY: { actions: [\"retry\"] }, RESET: { actions: [\"reset\"] }, OPEN: { actions: [\"open\"] }, SUCCESS: { actions: [\"success\"] }, ERROR: { actions: [\"error\"] } },\n implementations: { actions: {\n preview(params) {\n const { context, prop, event } = params; if (event.type !== \"PREVIEW\") return;\n const value = resolveAreaPickerValue(currentOptions(params), event.value, prop(\"maxDepth\"));\n context.set(\"base\", JSON.stringify(context.get(\"value\"))); context.set(\"preview\", value); context.set(\"error\", []); invalidate(params); load(params, value);\n prop(\"onPreviewChange\")?.(details(currentOptions(params), value));\n },\n commit(params) {\n const { context, prop, event } = params;\n if (event.type !== \"COMMIT\" || context.get(\"loading\").length || context.get(\"error\").length) return;\n const options = currentOptions(params), value = resolveAreaPickerValue(options, event.value, prop(\"maxDepth\")), last = resolveCascaderPath(options, value).at(-1);\n if (!last || (!last.leaf && value.length < (prop(\"maxDepth\") ?? 3))) return;\n context.set(\"value\", value); context.set(\"preview\", []); prop(\"onValueChange\")?.(details(options, value));\n },\n sync(params) { invalidate(params); const options = toAreaPickerOptions(params.prop(\"data\")); params.refs.set(\"options\", options); params.context.set(\"options\", options); params.context.set(\"preview\", []); params.context.set(\"error\", []); const value = resolveAreaPickerValue(options, params.context.get(\"value\"), params.prop(\"maxDepth\")); load(params, value, options); },\n reset(params) { invalidate(params); params.context.set(\"preview\", []); params.context.set(\"error\", []); },\n open(params) { invalidate(params); params.context.set(\"preview\", []); params.context.set(\"error\", []); const value = resolveAreaPickerValue(currentOptions(params), params.context.get(\"value\"), params.prop(\"maxDepth\")); load(params, value); },\n success(params) { const { context, event, refs } = params; if (event.type !== \"SUCCESS\" || event.request !== refs.get(\"request\")) return; params.refs.set(\"controller\", null); const options = updateCascaderChildren(currentOptions(params), event.path, toAreaPickerOptions(event.data)); refs.set(\"options\", options); context.set(\"options\", options); context.set(\"loading\", []); const draft = context.get(\"base\") === JSON.stringify(context.get(\"value\")) && context.get(\"preview\").length ? context.get(\"preview\") : context.get(\"value\"); const value = resolveAreaPickerValue(options, draft, params.prop(\"maxDepth\")); context.set(\"base\", JSON.stringify(context.get(\"value\"))); context.set(\"preview\", value); load(params, value, options); },\n error({ context, event, refs }) { if (event.type !== \"ERROR\" || event.request !== refs.get(\"request\")) return; refs.set(\"controller\", null); context.set(\"loading\", []); context.set(\"error\", event.path); },\n retry(params) { const path = params.context.get(\"error\"); if (path.length) load(params, path); },\n }, effects: { lifecycle(params) { params.refs.set(\"active\", true); const value = resolveAreaPickerValue(params.context.get(\"options\"), params.prop(\"value\") ?? params.prop(\"defaultValue\") ?? [], params.prop(\"maxDepth\")); load(params, value); return () => { params.refs.set(\"active\", false); params.refs.get(\"controller\")?.abort(); }; } } },\n});\nexport interface QwAreaPickerApi {\n value: string[]; labels: string[]; previewValue: string[]; valid: boolean; loading: boolean; error: boolean; statusText: string; retryText: string; columns: PickerColumn[]; pickerProps: QwPickerProps;\n notifyPreview(value: PickerValue): void; notifyCommit(value: PickerValue): void; retry(): void;\n getRootProps(): Record<string, string | undefined>;\n getStatusProps(): Record<string, string | boolean>;\n getRetryProps(): { type: \"button\"; hidden: boolean; onClick(): void };\n getInputProps(): { type: \"hidden\"; name: string | undefined; value: string; disabled: boolean };\n}\nexport function connectAreaPicker(service: QwAreaPickerService, props: QwAreaPickerProps): QwAreaPickerApi {\n const options = service.context.get(\"options\"), owner = service.context.get(\"value\"), value = resolveAreaPickerValue(options, owner, depthOf(props));\n const draft = service.context.get(\"base\") === JSON.stringify(owner) && service.context.get(\"preview\").length ? service.context.get(\"preview\") : value;\n const preview = resolveAreaPickerValue(options, draft, depthOf(props)), path = resolveCascaderPath(options, preview), last = path.at(-1);\n const loading = service.context.get(\"loading\").length > 0, error = service.context.get(\"error\").length > 0;\n const committedLast = resolveCascaderPath(options, value).at(-1);\n const committedValid = !!committedLast && (committedLast.leaf === true || value.length === depthOf(props));\n const valid = !!last && (last.leaf === true || preview.length === depthOf(props)) && !loading && !error;\n const columns: PickerColumn[] = []; let level: readonly CascaderOption[] = options;\n for (let depth = 0; depth < depthOf(props); depth++) {\n columns.push({ label: props.columnLabels?.[depth] ?? [\"省\", \"市\", \"区\"][depth] ?? `第 ${depth + 1} 级`, options: level.map(node => ({ value: node.value, label: node.label, disabled: node.disabled })) });\n const selected = level.find(node => node.value === preview[depth]); if (selected?.leaf) break; level = selected?.children ?? [];\n }\n const notifyPreview = (v: PickerValue) => service.send({ type: \"PREVIEW\", value: v }), notifyCommit = (v: PickerValue) => service.send({ type: \"COMMIT\", value: v });\n const rest: Record<string, unknown> = { ...props }; for (const key of [\"data\", \"value\", \"defaultValue\", \"maxDepth\", \"columnLabels\", \"loadChildren\", \"loadingText\", \"errorText\", \"retryText\", \"name\", \"onValueChange\", \"onPreviewChange\"]) delete rest[key];\n return { value, labels: details(options, value).labels, previewValue: preview, valid, loading, error, statusText: error ? props.errorText ?? \"地区加载失败\" : loading ? props.loadingText ?? \"地区加载中\" : \"\", retryText: props.retryText ?? \"重试\", columns,\n pickerProps: { ...rest, id: props.id ? `${props.id}-picker` : undefined, ariaLabel: props.ariaLabel ?? \"选择地区\", columns, value, onPreviewChange: d => notifyPreview(d.value), onValueChange: d => notifyCommit(d.value), onOpenChange: open => { service.send({ type: open ? \"OPEN\" : \"RESET\" }); props.onOpenChange?.(open); } }, notifyPreview, notifyCommit, retry: () => service.send({ type: \"RETRY\" }),\n getRootProps: () => ({ lang: props.lang, dir: props.dir, \"data-scope\": \"area-picker\", \"data-part\": \"root\", \"data-visual-target\": \"area-picker-root\" }),\n getStatusProps: () => ({ \"data-scope\": \"area-picker\", \"data-part\": \"status\", role: error ? \"alert\" : \"status\", hidden: !loading && !error }),\n getRetryProps: () => ({ type: \"button\", hidden: !error, onClick: () => service.send({ type: \"RETRY\" }) }),\n getInputProps: () => ({ type: \"hidden\", name: props.name, value: value.join(\"/\"), disabled: !committedValid }),\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/aria-description.ts
|
|
2
|
+
/** Preserve control-owned descriptions while linking distinct external help/errors. */
|
|
3
|
+
function mergeDescriptionIds(...values) {
|
|
4
|
+
const ids = /* @__PURE__ */ new Set();
|
|
5
|
+
for (const value of values) if (typeof value === "string") {
|
|
6
|
+
for (const id of value.split(/\s+/)) if (id) ids.add(id);
|
|
7
|
+
}
|
|
8
|
+
return ids.size ? [...ids].join(" ") : void 0;
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { mergeDescriptionIds as t };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=aria-description-CimD2M_C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aria-description-CimD2M_C.js","names":[],"sources":["../src/aria-description.ts"],"sourcesContent":["/** Preserve control-owned descriptions while linking distinct external help/errors. */\nexport function mergeDescriptionIds(...values: readonly (string | undefined)[]): string | undefined {\n const ids = new Set<string>();\n for (const value of values) if (typeof value === \"string\") for (const id of value.split(/\\s+/)) if (id) ids.add(id);\n return ids.size ? [...ids].join(\" \") : undefined;\n}\n"],"mappings":";;AACA,SAAgB,oBAAoB,GAAG,QAA6D;CAClG,MAAM,sBAAM,IAAI,IAAY;CAC5B,KAAK,MAAM,SAAS,QAAQ,IAAI,OAAO,UAAU;OAAe,MAAM,MAAM,MAAM,MAAM,KAAK,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE;CAAA;CAClH,OAAO,IAAI,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,KAAA;AACzC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type Machine, type Service } from "@zag-js/core";
|
|
2
|
+
import type { AvatarLoadStatus } from "./avatar.js";
|
|
3
|
+
/** A render request does not become active until its resource is committed. */
|
|
4
|
+
export interface ImageRequestFrame {
|
|
5
|
+
readonly epoch: number;
|
|
6
|
+
readonly src: string;
|
|
7
|
+
readonly active: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ImageRequestDescriptor {
|
|
10
|
+
src: string;
|
|
11
|
+
active: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface ImageResourceSnapshot {
|
|
14
|
+
srcAttribute: string | null;
|
|
15
|
+
complete: boolean;
|
|
16
|
+
naturalWidth: number;
|
|
17
|
+
}
|
|
18
|
+
export interface ImageRequestResult {
|
|
19
|
+
epoch: number;
|
|
20
|
+
src: string;
|
|
21
|
+
status: AvatarLoadStatus;
|
|
22
|
+
}
|
|
23
|
+
export interface ImageResourceBinding {
|
|
24
|
+
commit(snapshot: ImageResourceSnapshot): void;
|
|
25
|
+
snapshot(snapshot: ImageResourceSnapshot): void;
|
|
26
|
+
detach(): void;
|
|
27
|
+
}
|
|
28
|
+
export interface ImageRequestFrames {
|
|
29
|
+
create(src: string | undefined, active: boolean): ImageRequestFrame;
|
|
30
|
+
resolve(descriptor: ImageRequestDescriptor): ImageRequestFrame;
|
|
31
|
+
}
|
|
32
|
+
/** Per-instance monotonic identity; aborted renders never activate a frame. */
|
|
33
|
+
export declare function createImageRequestFrames(initial?: ImageRequestFrame): ImageRequestFrames;
|
|
34
|
+
export declare function getImageRequestStatus(frame: ImageRequestFrame, result?: ImageRequestResult): AvatarLoadStatus;
|
|
35
|
+
export interface QwAvatarLoadProps {
|
|
36
|
+
frame: ImageRequestFrame;
|
|
37
|
+
}
|
|
38
|
+
type ResourceEvent = {
|
|
39
|
+
type: "RESOURCE.COMMIT" | "RESOURCE.SNAPSHOT";
|
|
40
|
+
frame: ImageRequestFrame;
|
|
41
|
+
session: number;
|
|
42
|
+
snapshot: ImageResourceSnapshot;
|
|
43
|
+
} | {
|
|
44
|
+
type: "RESOURCE.DETACH";
|
|
45
|
+
frame: ImageRequestFrame;
|
|
46
|
+
session: number;
|
|
47
|
+
};
|
|
48
|
+
export interface QwAvatarLoadSchema {
|
|
49
|
+
props: QwAvatarLoadProps;
|
|
50
|
+
context: {
|
|
51
|
+
result: ImageRequestResult | undefined;
|
|
52
|
+
};
|
|
53
|
+
refs: {
|
|
54
|
+
active: boolean;
|
|
55
|
+
session: number;
|
|
56
|
+
committed: ImageRequestFrame | undefined;
|
|
57
|
+
};
|
|
58
|
+
state: "ready";
|
|
59
|
+
effect: "lifecycle";
|
|
60
|
+
action: "commit" | "snapshot" | "detach";
|
|
61
|
+
event: ResourceEvent;
|
|
62
|
+
}
|
|
63
|
+
export type QwAvatarLoadService = Service<QwAvatarLoadSchema>;
|
|
64
|
+
export type QwAvatarLoadMachine = Machine<QwAvatarLoadSchema>;
|
|
65
|
+
/** Pure Zag state: resource bridges supply scalars, never DOM objects. */
|
|
66
|
+
export declare const avatarLoadMachine: QwAvatarLoadMachine;
|
|
67
|
+
export interface QwAvatarLoadApi {
|
|
68
|
+
readonly frame: ImageRequestFrame;
|
|
69
|
+
readonly status: AvatarLoadStatus;
|
|
70
|
+
readonly imageKey: string;
|
|
71
|
+
bindResource(): ImageResourceBinding;
|
|
72
|
+
}
|
|
73
|
+
/** A committed renderer binds without reading reactive result state. */
|
|
74
|
+
export declare function createAvatarResourceBinding(service: QwAvatarLoadService, frame: ImageRequestFrame): ImageResourceBinding;
|
|
75
|
+
export declare function connectAvatarLoad(service: QwAvatarLoadService, frame?: ImageRequestFrame): QwAvatarLoadApi;
|
|
76
|
+
export {};
|
package/dist/avatar/avatar.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Avatar 的跨框架行为契约。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Core 归一化 props、推导降级模式和徽标状态;Zag 管图片请求生命周期。
|
|
5
5
|
* 生成 root/image/badge 的 data 属性。React/Vue 适配器只投影内容通道并渲染固定 DOM。
|
|
6
|
-
*
|
|
6
|
+
* 图片请求生命周期由同目录的纯 Zag load machine 决定,适配器仅运输资源标量快照。
|
|
7
7
|
*/
|
|
8
8
|
export declare const AVATAR_SHAPES: readonly ["circle", "square"];
|
|
9
9
|
export declare const AVATAR_SIZES: readonly ["s", "m", "l"];
|
|
@@ -57,6 +57,8 @@ export interface AvatarContentPresence {
|
|
|
57
57
|
/** 是否提供 `badge` 配置。 */
|
|
58
58
|
hasBadge: boolean;
|
|
59
59
|
}
|
|
60
|
+
/** Frameworks only report whether a content channel was supplied. */
|
|
61
|
+
export declare function getAvatarContentPresence(props: QwAvatarProps, channels: Readonly<Record<string, boolean>>): AvatarContentPresence;
|
|
60
62
|
/** 内容展示模式,按优先级互斥推导:children > image > icon > name。 */
|
|
61
63
|
export type DisplayMode = "children" | "image" | "icon" | "initials";
|
|
62
64
|
/** 图片加载失败时的降级展示模式。 */
|
|
@@ -118,6 +120,7 @@ export interface AvatarBadgeProps {
|
|
|
118
120
|
"data-part": "badge";
|
|
119
121
|
"data-badge-type": BadgeType;
|
|
120
122
|
"aria-label"?: string;
|
|
123
|
+
role?: "img";
|
|
121
124
|
}
|
|
122
125
|
/**
|
|
123
126
|
* 从名称提取文字缩写。
|
|
@@ -128,13 +131,27 @@ export interface AvatarBadgeProps {
|
|
|
128
131
|
* - 上限 2 字符
|
|
129
132
|
* - 空字符串返回空字符串
|
|
130
133
|
*
|
|
131
|
-
*
|
|
134
|
+
* 按 grapheme 边界截取,不切开组合字符和 emoji 序列。
|
|
132
135
|
*/
|
|
133
136
|
export declare function extractInitials(name: string): string;
|
|
134
137
|
/** 将公开输入和内容通道归一化为唯一的跨框架状态。 */
|
|
135
138
|
export declare function resolveAvatarState(props?: QwAvatarProps, presence?: AvatarContentPresence): ResolvedAvatarState;
|
|
136
139
|
/** 将归一化结果转成 root 属性。 */
|
|
137
|
-
export
|
|
140
|
+
export interface AvatarRootOptions {
|
|
141
|
+
name?: string;
|
|
142
|
+
badge?: BadgeConfig;
|
|
143
|
+
loadStatus?: AvatarLoadStatus;
|
|
144
|
+
lang?: string;
|
|
145
|
+
dir?: string;
|
|
146
|
+
hidden?: boolean;
|
|
147
|
+
}
|
|
148
|
+
export declare function getAvatarRootProps(state: ResolvedAvatarState, options?: AvatarRootOptions): AvatarRootProps & Pick<AvatarRootOptions, "lang" | "dir" | "hidden">;
|
|
149
|
+
export declare function getAvatarImageDescriptor(state: ResolvedAvatarState, src?: string): {
|
|
150
|
+
src: string;
|
|
151
|
+
active: boolean;
|
|
152
|
+
};
|
|
153
|
+
export declare function getAvatarRootStyle(state: ResolvedAvatarState): Record<string, string> | undefined;
|
|
154
|
+
export declare function getAvatarBadgeContent(state: ResolvedAvatarState): string;
|
|
138
155
|
/** 将归一化结果转成图片包装元素的属性。 */
|
|
139
156
|
export declare function getAvatarImageProps(_state: ResolvedAvatarState): AvatarImageProps;
|
|
140
157
|
/** 将归一化结果转成 img 元素的属性。 */
|
|
@@ -142,4 +159,4 @@ export declare function getAvatarImageElementProps(_state: ResolvedAvatarState):
|
|
|
142
159
|
/** 将归一化结果转成降级内容元素的属性。 */
|
|
143
160
|
export declare function getAvatarFallbackProps(_state: ResolvedAvatarState): AvatarFallbackProps;
|
|
144
161
|
/** 将归一化结果转成徽标元素的属性。 */
|
|
145
|
-
export declare function getAvatarBadgeProps(state: ResolvedAvatarState): AvatarBadgeProps;
|
|
162
|
+
export declare function getAvatarBadgeProps(state: ResolvedAvatarState, badge?: BadgeConfig): AvatarBadgeProps;
|
package/dist/avatar/index.d.ts
CHANGED