@qw-ui/core 0.3.0-next.4 → 0.3.0-next.42
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,26 @@
|
|
|
1
|
+
//#region src/overlay-panel/overlay-panel.ts
|
|
2
|
+
/**
|
|
3
|
+
* OverlayPanel 契约 — 原型 A(无状态),core 无 machine。
|
|
4
|
+
* 渲染契约:`data-scope="overlay-panel"`,根/header/title/actions/content/footer
|
|
5
|
+
* 以 data-part 摊平,React/Vue 适配层同名同义。
|
|
6
|
+
*/
|
|
7
|
+
/** OverlayPanel 各渲染部位全集(data-part 取值)。 */
|
|
8
|
+
const OVERLAY_PANEL_PARTS = [
|
|
9
|
+
"root",
|
|
10
|
+
"header",
|
|
11
|
+
"title",
|
|
12
|
+
"actions",
|
|
13
|
+
"content",
|
|
14
|
+
"footer"
|
|
15
|
+
];
|
|
16
|
+
/** 默认 header 高度,对齐 Figma H5 浮层导航。 */
|
|
17
|
+
const DEFAULT_OVERLAY_PANEL_HEADER_HEIGHT = 60;
|
|
18
|
+
/** 将外部传入的 height 归一化为 CSS height 值。 */
|
|
19
|
+
function resolveOverlayPanelHeight(height) {
|
|
20
|
+
if (height == null) return void 0;
|
|
21
|
+
return typeof height === "number" ? `${height}px` : height;
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
export { OVERLAY_PANEL_PARTS as n, resolveOverlayPanelHeight as r, DEFAULT_OVERLAY_PANEL_HEADER_HEIGHT as t };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=overlay-panel-Z_qdKeBj.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay-panel-Z_qdKeBj.js","names":[],"sources":["../src/overlay-panel/overlay-panel.ts"],"sourcesContent":["/**\n * OverlayPanel 契约 — 原型 A(无状态),core 无 machine。\n * 渲染契约:`data-scope=\"overlay-panel\"`,根/header/title/actions/content/footer\n * 以 data-part 摊平,React/Vue 适配层同名同义。\n */\n\n/** OverlayPanel 各渲染部位全集(data-part 取值)。 */\nexport const OVERLAY_PANEL_PARTS = [\n \"root\",\n \"header\",\n \"title\",\n \"actions\",\n \"content\",\n \"footer\",\n] as const;\n\n/** 默认 header 高度,对齐 Figma H5 浮层导航。 */\nexport const DEFAULT_OVERLAY_PANEL_HEADER_HEIGHT = 60;\n\nexport type OverlayPanelPart = (typeof OVERLAY_PANEL_PARTS)[number];\nexport type OverlayPanelHeight = number | string;\n\n/** QwOverlayPanelProps — 双栈共享的容器契约。 */\nexport interface QwOverlayPanelProps {\n /** 容器高度;数字按 px 归一化,字符串原样透传。 */\n height?: OverlayPanelHeight;\n /** 默认 header 的标题内容。 */\n title?: unknown;\n}\n\n/** 将外部传入的 height 归一化为 CSS height 值。 */\nexport function resolveOverlayPanelHeight(height?: OverlayPanelHeight): string | undefined {\n if (height == null) return undefined;\n return typeof height === \"number\" ? `${height}px` : height;\n}\n"],"mappings":";;;;;;;AAOA,MAAa,sBAAsB;CACjC;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAa,sCAAsC;;AAcnD,SAAgB,0BAA0B,QAAiD;CACzF,IAAI,UAAU,MAAM,OAAO,KAAA;CAC3B,OAAO,OAAO,WAAW,WAAW,GAAG,OAAO,MAAM;AACtD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./page-indicator.js";
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { createMachine } from "@zag-js/core";
|
|
2
|
+
import { visuallyHiddenStyle } from "@zag-js/dom-query";
|
|
3
|
+
//#region src/page-indicator/page-indicator.ts
|
|
4
|
+
/** Layout direction of the dots. */
|
|
5
|
+
const PAGE_INDICATOR_DIRECTIONS = ["horizontal", "vertical"];
|
|
6
|
+
/** default sits on surfaces; inverse sits on media (carousel images). */
|
|
7
|
+
const PAGE_INDICATOR_TONES = ["default", "inverse"];
|
|
8
|
+
/** Stable DOM parts shared by every adapter. */
|
|
9
|
+
const PAGE_INDICATOR_PARTS = [
|
|
10
|
+
"root",
|
|
11
|
+
"dot",
|
|
12
|
+
"status"
|
|
13
|
+
];
|
|
14
|
+
const MAX_DOTS = 1e3;
|
|
15
|
+
const whole = (value, fallback) => typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.floor(value) : fallback;
|
|
16
|
+
const text = (value, fallback) => typeof value === "string" && value.trim() ? value : fallback;
|
|
17
|
+
const fill = (template, page, total) => template.replace(/\{page\}/g, String(page)).replace(/\{total\}/g, String(total));
|
|
18
|
+
/** One normalization for every adapter: empty total, clamped 0-based current, closed enums. */
|
|
19
|
+
function resolvePageIndicatorState(props = {}) {
|
|
20
|
+
const total = Math.min(MAX_DOTS, whole(props.total, 0));
|
|
21
|
+
return {
|
|
22
|
+
total,
|
|
23
|
+
current: total ? Math.min(total - 1, whole(props.current ?? props.defaultCurrent, 0)) : 0,
|
|
24
|
+
direction: PAGE_INDICATOR_DIRECTIONS.includes(props.direction) ? props.direction : "horizontal",
|
|
25
|
+
tone: PAGE_INDICATOR_TONES.includes(props.tone) ? props.tone : "default",
|
|
26
|
+
selectable: !!props.selectable,
|
|
27
|
+
disabled: !!props.disabled,
|
|
28
|
+
dir: typeof props.dir === "string" ? props.dir : void 0,
|
|
29
|
+
label: text(props.label, "页面指示器"),
|
|
30
|
+
dotLabelTemplate: text(props.dotLabelTemplate, "第 {page} 页"),
|
|
31
|
+
statusLabelTemplate: text(props.statusLabelTemplate, "第 {page} / {total} 页")
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** Ascending dots; labels are 1-based. */
|
|
35
|
+
function getPageIndicatorDots(state) {
|
|
36
|
+
return Array.from({ length: state.total }, (_, index) => ({
|
|
37
|
+
index,
|
|
38
|
+
key: `dot-${index}`,
|
|
39
|
+
label: fill(state.dotLabelTemplate, index + 1, state.total),
|
|
40
|
+
current: index === state.current
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
/** Keep an uncontrolled default uncontrolled; normalize numeric inputs once. */
|
|
44
|
+
function createPageIndicatorProps(props = {}) {
|
|
45
|
+
return {
|
|
46
|
+
...props,
|
|
47
|
+
defaultCurrent: whole(props.defaultCurrent, 0),
|
|
48
|
+
current: props.current === void 0 ? void 0 : whole(props.current, 0)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const liveProps = (service) => ({
|
|
52
|
+
total: service.prop("total"),
|
|
53
|
+
current: service.context.get("current"),
|
|
54
|
+
direction: service.prop("direction"),
|
|
55
|
+
tone: service.prop("tone"),
|
|
56
|
+
selectable: service.prop("selectable"),
|
|
57
|
+
disabled: service.prop("disabled"),
|
|
58
|
+
dir: service.prop("dir"),
|
|
59
|
+
label: service.prop("label"),
|
|
60
|
+
dotLabelTemplate: service.prop("dotLabelTemplate"),
|
|
61
|
+
statusLabelTemplate: service.prop("statusLabelTemplate")
|
|
62
|
+
});
|
|
63
|
+
/** Zag bindable state shared by controlled requests and Core-owned paging. */
|
|
64
|
+
const pageIndicatorMachine = createMachine({
|
|
65
|
+
props: ({ props }) => createPageIndicatorProps(props),
|
|
66
|
+
initialState: () => "ready",
|
|
67
|
+
states: { ready: {} },
|
|
68
|
+
context: ({ bindable, prop }) => ({ current: bindable(() => ({
|
|
69
|
+
defaultValue: prop("defaultCurrent") ?? 0,
|
|
70
|
+
value: prop("current"),
|
|
71
|
+
onChange(current) {
|
|
72
|
+
prop("onCurrentChange")?.({ current });
|
|
73
|
+
}
|
|
74
|
+
})) }),
|
|
75
|
+
on: { "CURRENT.SET": { actions: ["setCurrent"] } },
|
|
76
|
+
implementations: { actions: { setCurrent(params) {
|
|
77
|
+
const state = resolvePageIndicatorState(liveProps(params));
|
|
78
|
+
if (!state.selectable || state.disabled || !state.total) return;
|
|
79
|
+
const next = Math.min(state.total - 1, whole(params.event.index, 0));
|
|
80
|
+
if (next !== state.current) params.context.set("current", next);
|
|
81
|
+
} } }
|
|
82
|
+
});
|
|
83
|
+
/** Adapters render `api.selectable ? button : span` for each dot and never interpret paging. */
|
|
84
|
+
function connectPageIndicator(service, normalize) {
|
|
85
|
+
const state = resolvePageIndicatorState(liveProps(service));
|
|
86
|
+
const setCurrent = (current) => service.send({
|
|
87
|
+
type: "CURRENT.SET",
|
|
88
|
+
index: current
|
|
89
|
+
});
|
|
90
|
+
const part = (name) => ({
|
|
91
|
+
"data-scope": "page-indicator",
|
|
92
|
+
"data-part": name
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
current: state.current,
|
|
96
|
+
total: state.total,
|
|
97
|
+
selectable: state.selectable,
|
|
98
|
+
dots: getPageIndicatorDots(state),
|
|
99
|
+
statusText: state.total && !state.selectable ? fill(state.statusLabelTemplate, state.current + 1, state.total) : "",
|
|
100
|
+
setCurrent,
|
|
101
|
+
getRootProps: () => normalize.element({
|
|
102
|
+
...part("root"),
|
|
103
|
+
dir: state.dir,
|
|
104
|
+
role: state.selectable ? "group" : void 0,
|
|
105
|
+
"aria-label": state.selectable ? state.label : void 0,
|
|
106
|
+
"data-direction": state.direction,
|
|
107
|
+
"data-tone": state.tone,
|
|
108
|
+
"data-empty": state.total ? void 0 : "true",
|
|
109
|
+
"data-disabled": state.selectable && state.disabled ? "true" : void 0
|
|
110
|
+
}),
|
|
111
|
+
getDotProps: (dot) => normalize.button(state.selectable ? {
|
|
112
|
+
...part("dot"),
|
|
113
|
+
type: "button",
|
|
114
|
+
"data-index": dot.index,
|
|
115
|
+
"data-current": dot.current ? "true" : void 0,
|
|
116
|
+
"aria-label": dot.label,
|
|
117
|
+
"aria-current": dot.current ? "true" : void 0,
|
|
118
|
+
disabled: state.disabled,
|
|
119
|
+
onClick(event) {
|
|
120
|
+
if (!event.defaultPrevented) setCurrent(dot.index);
|
|
121
|
+
}
|
|
122
|
+
} : {
|
|
123
|
+
...part("dot"),
|
|
124
|
+
"data-index": dot.index,
|
|
125
|
+
"data-current": dot.current ? "true" : void 0,
|
|
126
|
+
"aria-hidden": true
|
|
127
|
+
}),
|
|
128
|
+
getStatusProps: () => normalize.element({
|
|
129
|
+
...part("status"),
|
|
130
|
+
hidden: !state.total || state.selectable ? true : void 0,
|
|
131
|
+
style: visuallyHiddenStyle
|
|
132
|
+
})
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//#endregion
|
|
136
|
+
export { PAGE_INDICATOR_DIRECTIONS, PAGE_INDICATOR_PARTS, PAGE_INDICATOR_TONES, connectPageIndicator, createPageIndicatorProps, getPageIndicatorDots, pageIndicatorMachine, resolvePageIndicatorState };
|
|
137
|
+
|
|
138
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/page-indicator/page-indicator.ts"],"sourcesContent":["import { createMachine, type Machine, type Service } from \"@zag-js/core\";\nimport { visuallyHiddenStyle } from \"@zag-js/dom-query\";\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\";\n\n/** Layout direction of the dots. */\nexport const PAGE_INDICATOR_DIRECTIONS = [\"horizontal\", \"vertical\"] as const;\n/** default sits on surfaces; inverse sits on media (carousel images). */\nexport const PAGE_INDICATOR_TONES = [\"default\", \"inverse\"] as const;\n/** Stable DOM parts shared by every adapter. */\nexport const PAGE_INDICATOR_PARTS = [\"root\", \"dot\", \"status\"] as const;\nexport type PageIndicatorDirection = (typeof PAGE_INDICATOR_DIRECTIONS)[number];\nexport type PageIndicatorTone = (typeof PAGE_INDICATOR_TONES)[number];\n/** Requested 0-based page; the owner decides in controlled mode. */\nexport interface PageIndicatorCurrentChangeDetails { current: number }\n/** Scalar, SSR-safe contract. */\nexport interface QwPageIndicatorProps {\n /** Number of pages; nonfinite or negative is empty. */\n total?: number;\n /** Controlled 0-based current page. Undefined enables Core-owned state. */\n current?: number;\n /** Initial Core-owned page; defaults to 0. */\n defaultCurrent?: number;\n direction?: PageIndicatorDirection;\n tone?: PageIndicatorTone;\n /** Render every dot as a named native button that requests a page change. */\n selectable?: boolean;\n /** Blocks selectable requests; passive indicators ignore it. */\n disabled?: boolean;\n /** Standard HTML direction. RTL reverses horizontal visual order only. */\n dir?: string;\n /** Group name for selectable mode; defaults to 页面指示器. */\n label?: string;\n /** Dot button name with {page}/{total}; defaults to 第 {page} 页. */\n dotLabelTemplate?: string;\n /** Visually hidden passive status with {page}/{total}; defaults to 第 {page} / {total} 页. */\n statusLabelTemplate?: string;\n onCurrentChange?: (details: PageIndicatorCurrentChangeDetails) => void;\n}\nexport interface ResolvedPageIndicatorState {\n total: number; current: number; direction: PageIndicatorDirection; tone: PageIndicatorTone;\n selectable: boolean; disabled: boolean; dir: string | undefined; label: string; dotLabelTemplate: string; statusLabelTemplate: string;\n}\nexport interface PageIndicatorDot { index: number; key: string; label: string; current: boolean }\n\nconst MAX_DOTS = 1000;\nconst whole = (value: number | undefined, fallback: number): number =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? Math.floor(value) : fallback;\nconst text = (value: string | undefined, fallback: string): string => typeof value === \"string\" && value.trim() ? value : fallback;\nconst fill = (template: string, page: number, total: number): string => template.replace(/\\{page\\}/g, String(page)).replace(/\\{total\\}/g, String(total));\n\n/** One normalization for every adapter: empty total, clamped 0-based current, closed enums. */\nexport function resolvePageIndicatorState(props: QwPageIndicatorProps = {}): ResolvedPageIndicatorState {\n const total = Math.min(MAX_DOTS, whole(props.total, 0));\n const current = total ? Math.min(total - 1, whole(props.current ?? props.defaultCurrent, 0)) : 0;\n return {\n total, current,\n direction: PAGE_INDICATOR_DIRECTIONS.includes(props.direction!) ? props.direction! : \"horizontal\",\n tone: PAGE_INDICATOR_TONES.includes(props.tone!) ? props.tone! : \"default\",\n selectable: !!props.selectable, disabled: !!props.disabled, dir: typeof props.dir === \"string\" ? props.dir : undefined,\n label: text(props.label, \"页面指示器\"), dotLabelTemplate: text(props.dotLabelTemplate, \"第 {page} 页\"), statusLabelTemplate: text(props.statusLabelTemplate, \"第 {page} / {total} 页\"),\n };\n}\n/** Ascending dots; labels are 1-based. */\nexport function getPageIndicatorDots(state: ResolvedPageIndicatorState): PageIndicatorDot[] {\n return Array.from({ length: state.total }, (_, index) => ({ index, key: `dot-${index}`, label: fill(state.dotLabelTemplate, index + 1, state.total), current: index === state.current }));\n}\n/** Keep an uncontrolled default uncontrolled; normalize numeric inputs once. */\nexport function createPageIndicatorProps(props: QwPageIndicatorProps = {}): QwPageIndicatorProps {\n return { ...props, defaultCurrent: whole(props.defaultCurrent, 0), current: props.current === undefined ? undefined : whole(props.current, 0) };\n}\n\nexport interface QwPageIndicatorSchema {\n props: QwPageIndicatorProps;\n context: { current: number };\n state: \"ready\";\n action: \"setCurrent\";\n /** `current` is reserved by Zag event objects, so the payload is named `index`. */\n event: { type: \"CURRENT.SET\"; index: number };\n}\nexport type QwPageIndicatorMachine = Machine<QwPageIndicatorSchema>;\nexport type QwPageIndicatorService = Service<QwPageIndicatorSchema>;\nconst liveProps = (service: Pick<QwPageIndicatorService, \"prop\" | \"context\">): QwPageIndicatorProps => ({\n total: service.prop(\"total\"), current: service.context.get(\"current\"), direction: service.prop(\"direction\"), tone: service.prop(\"tone\"),\n selectable: service.prop(\"selectable\"), disabled: service.prop(\"disabled\"), dir: service.prop(\"dir\"), label: service.prop(\"label\"),\n dotLabelTemplate: service.prop(\"dotLabelTemplate\"), statusLabelTemplate: service.prop(\"statusLabelTemplate\"),\n});\n\n/** Zag bindable state shared by controlled requests and Core-owned paging. */\nexport const pageIndicatorMachine: QwPageIndicatorMachine = createMachine<QwPageIndicatorSchema>({\n props: ({ props }) => createPageIndicatorProps(props), initialState: () => \"ready\", states: { ready: {} },\n context: ({ bindable, prop }) => ({ current: bindable(() => ({ defaultValue: prop(\"defaultCurrent\") ?? 0, value: prop(\"current\"), onChange(current) { prop(\"onCurrentChange\")?.({ current }); } })) }),\n on: { \"CURRENT.SET\": { actions: [\"setCurrent\"] } },\n implementations: { actions: { setCurrent(params) {\n const state = resolvePageIndicatorState(liveProps(params));\n if (!state.selectable || state.disabled || !state.total) return;\n const next = Math.min(state.total - 1, whole(params.event.index, 0));\n if (next !== state.current) params.context.set(\"current\", next);\n } } },\n});\n\nexport interface QwPageIndicatorApi<T extends PropTypes = PropTypes> {\n current: number; total: number; selectable: boolean; dots: PageIndicatorDot[]; statusText: string;\n setCurrent(current: number): void;\n getRootProps(): T[\"element\"];\n /** Passive dots are spans; selectable dots are buttons. Same getter, element type chosen by `selectable`. */\n getDotProps(dot: PageIndicatorDot): T[\"button\"];\n getStatusProps(): T[\"element\"];\n}\n/** Adapters render `api.selectable ? button : span` for each dot and never interpret paging. */\nexport function connectPageIndicator<T extends PropTypes>(service: QwPageIndicatorService, normalize: NormalizeProps<T>): QwPageIndicatorApi<T> {\n const state = resolvePageIndicatorState(liveProps(service));\n const setCurrent = (current: number) => service.send({ type: \"CURRENT.SET\", index: current });\n const part = (name: string) => ({ \"data-scope\": \"page-indicator\", \"data-part\": name });\n return {\n current: state.current, total: state.total, selectable: state.selectable, dots: getPageIndicatorDots(state),\n statusText: state.total && !state.selectable ? fill(state.statusLabelTemplate, state.current + 1, state.total) : \"\",\n setCurrent,\n getRootProps: () => normalize.element({ ...part(\"root\"), dir: state.dir, role: state.selectable ? \"group\" : undefined, \"aria-label\": state.selectable ? state.label : undefined,\n \"data-direction\": state.direction, \"data-tone\": state.tone, \"data-empty\": state.total ? undefined : \"true\", \"data-disabled\": state.selectable && state.disabled ? \"true\" : undefined }),\n getDotProps: (dot) => normalize.button(state.selectable\n ? { ...part(\"dot\"), type: \"button\", \"data-index\": dot.index, \"data-current\": dot.current ? \"true\" : undefined, \"aria-label\": dot.label, \"aria-current\": dot.current ? \"true\" : undefined,\n disabled: state.disabled, onClick(event: { defaultPrevented: boolean }) { if (!event.defaultPrevented) setCurrent(dot.index); } }\n : { ...part(\"dot\"), \"data-index\": dot.index, \"data-current\": dot.current ? \"true\" : undefined, \"aria-hidden\": true }),\n getStatusProps: () => normalize.element({ ...part(\"status\"), hidden: !state.total || state.selectable ? true : undefined, style: visuallyHiddenStyle }),\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { type Machine, type Service } from "@zag-js/core";
|
|
2
|
+
import type { NormalizeProps, PropTypes } from "@zag-js/types";
|
|
3
|
+
/** Layout direction of the dots. */
|
|
4
|
+
export declare const PAGE_INDICATOR_DIRECTIONS: readonly ["horizontal", "vertical"];
|
|
5
|
+
/** default sits on surfaces; inverse sits on media (carousel images). */
|
|
6
|
+
export declare const PAGE_INDICATOR_TONES: readonly ["default", "inverse"];
|
|
7
|
+
/** Stable DOM parts shared by every adapter. */
|
|
8
|
+
export declare const PAGE_INDICATOR_PARTS: readonly ["root", "dot", "status"];
|
|
9
|
+
export type PageIndicatorDirection = (typeof PAGE_INDICATOR_DIRECTIONS)[number];
|
|
10
|
+
export type PageIndicatorTone = (typeof PAGE_INDICATOR_TONES)[number];
|
|
11
|
+
/** Requested 0-based page; the owner decides in controlled mode. */
|
|
12
|
+
export interface PageIndicatorCurrentChangeDetails {
|
|
13
|
+
current: number;
|
|
14
|
+
}
|
|
15
|
+
/** Scalar, SSR-safe contract. */
|
|
16
|
+
export interface QwPageIndicatorProps {
|
|
17
|
+
/** Number of pages; nonfinite or negative is empty. */
|
|
18
|
+
total?: number;
|
|
19
|
+
/** Controlled 0-based current page. Undefined enables Core-owned state. */
|
|
20
|
+
current?: number;
|
|
21
|
+
/** Initial Core-owned page; defaults to 0. */
|
|
22
|
+
defaultCurrent?: number;
|
|
23
|
+
direction?: PageIndicatorDirection;
|
|
24
|
+
tone?: PageIndicatorTone;
|
|
25
|
+
/** Render every dot as a named native button that requests a page change. */
|
|
26
|
+
selectable?: boolean;
|
|
27
|
+
/** Blocks selectable requests; passive indicators ignore it. */
|
|
28
|
+
disabled?: boolean;
|
|
29
|
+
/** Standard HTML direction. RTL reverses horizontal visual order only. */
|
|
30
|
+
dir?: string;
|
|
31
|
+
/** Group name for selectable mode; defaults to 页面指示器. */
|
|
32
|
+
label?: string;
|
|
33
|
+
/** Dot button name with {page}/{total}; defaults to 第 {page} 页. */
|
|
34
|
+
dotLabelTemplate?: string;
|
|
35
|
+
/** Visually hidden passive status with {page}/{total}; defaults to 第 {page} / {total} 页. */
|
|
36
|
+
statusLabelTemplate?: string;
|
|
37
|
+
onCurrentChange?: (details: PageIndicatorCurrentChangeDetails) => void;
|
|
38
|
+
}
|
|
39
|
+
export interface ResolvedPageIndicatorState {
|
|
40
|
+
total: number;
|
|
41
|
+
current: number;
|
|
42
|
+
direction: PageIndicatorDirection;
|
|
43
|
+
tone: PageIndicatorTone;
|
|
44
|
+
selectable: boolean;
|
|
45
|
+
disabled: boolean;
|
|
46
|
+
dir: string | undefined;
|
|
47
|
+
label: string;
|
|
48
|
+
dotLabelTemplate: string;
|
|
49
|
+
statusLabelTemplate: string;
|
|
50
|
+
}
|
|
51
|
+
export interface PageIndicatorDot {
|
|
52
|
+
index: number;
|
|
53
|
+
key: string;
|
|
54
|
+
label: string;
|
|
55
|
+
current: boolean;
|
|
56
|
+
}
|
|
57
|
+
/** One normalization for every adapter: empty total, clamped 0-based current, closed enums. */
|
|
58
|
+
export declare function resolvePageIndicatorState(props?: QwPageIndicatorProps): ResolvedPageIndicatorState;
|
|
59
|
+
/** Ascending dots; labels are 1-based. */
|
|
60
|
+
export declare function getPageIndicatorDots(state: ResolvedPageIndicatorState): PageIndicatorDot[];
|
|
61
|
+
/** Keep an uncontrolled default uncontrolled; normalize numeric inputs once. */
|
|
62
|
+
export declare function createPageIndicatorProps(props?: QwPageIndicatorProps): QwPageIndicatorProps;
|
|
63
|
+
export interface QwPageIndicatorSchema {
|
|
64
|
+
props: QwPageIndicatorProps;
|
|
65
|
+
context: {
|
|
66
|
+
current: number;
|
|
67
|
+
};
|
|
68
|
+
state: "ready";
|
|
69
|
+
action: "setCurrent";
|
|
70
|
+
/** `current` is reserved by Zag event objects, so the payload is named `index`. */
|
|
71
|
+
event: {
|
|
72
|
+
type: "CURRENT.SET";
|
|
73
|
+
index: number;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export type QwPageIndicatorMachine = Machine<QwPageIndicatorSchema>;
|
|
77
|
+
export type QwPageIndicatorService = Service<QwPageIndicatorSchema>;
|
|
78
|
+
/** Zag bindable state shared by controlled requests and Core-owned paging. */
|
|
79
|
+
export declare const pageIndicatorMachine: QwPageIndicatorMachine;
|
|
80
|
+
export interface QwPageIndicatorApi<T extends PropTypes = PropTypes> {
|
|
81
|
+
current: number;
|
|
82
|
+
total: number;
|
|
83
|
+
selectable: boolean;
|
|
84
|
+
dots: PageIndicatorDot[];
|
|
85
|
+
statusText: string;
|
|
86
|
+
setCurrent(current: number): void;
|
|
87
|
+
getRootProps(): T["element"];
|
|
88
|
+
/** Passive dots are spans; selectable dots are buttons. Same getter, element type chosen by `selectable`. */
|
|
89
|
+
getDotProps(dot: PageIndicatorDot): T["button"];
|
|
90
|
+
getStatusProps(): T["element"];
|
|
91
|
+
}
|
|
92
|
+
/** Adapters render `api.selectable ? button : span` for each dot and never interpret paging. */
|
|
93
|
+
export declare function connectPageIndicator<T extends PropTypes>(service: QwPageIndicatorService, normalize: NormalizeProps<T>): QwPageIndicatorApi<T>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./pagination.js";
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { createMachine } from "@zag-js/core";
|
|
2
|
+
//#region src/pagination/pagination.ts
|
|
3
|
+
/** Supported pagination presentations. */
|
|
4
|
+
const PAGINATION_MODES = ["multi", "simple"];
|
|
5
|
+
/** Stable DOM parts shared by all adapters. */
|
|
6
|
+
const PAGINATION_PARTS = [
|
|
7
|
+
"root",
|
|
8
|
+
"list",
|
|
9
|
+
"list-item",
|
|
10
|
+
"item",
|
|
11
|
+
"previous",
|
|
12
|
+
"next",
|
|
13
|
+
"status"
|
|
14
|
+
];
|
|
15
|
+
const integer = (value, fallback, min = 0, max = Number.MAX_SAFE_INTEGER) => typeof value === "number" && Number.isFinite(value) && value >= min ? Math.min(max, Math.floor(value)) : fallback;
|
|
16
|
+
const label = (value, fallback) => typeof value === "string" && value.trim() ? value : fallback;
|
|
17
|
+
const windowCount = (value) => typeof value === "number" && Number.isFinite(value) ? Math.max(0, Math.min(5, Math.floor(value))) : 1;
|
|
18
|
+
const format = (template, page, count) => template.replace(/\{page\}/g, String(page)).replace(/\{count\}/g, String(count));
|
|
19
|
+
/** Shared validation: no adapter recomputes boundaries or labels. */
|
|
20
|
+
function resolvePaginationState(props = {}) {
|
|
21
|
+
const count = integer(props.count, 0), pageSize = integer(props.pageSize, 10, 1);
|
|
22
|
+
const pageCount = integer(props.pageCount, Math.ceil(count / pageSize));
|
|
23
|
+
const page = pageCount ? Math.min(pageCount, integer(props.page ?? props.defaultPage, 1, 1)) : 0;
|
|
24
|
+
const disabled = !!props.disabled;
|
|
25
|
+
return {
|
|
26
|
+
page,
|
|
27
|
+
count,
|
|
28
|
+
pageSize,
|
|
29
|
+
pageCount,
|
|
30
|
+
disabled,
|
|
31
|
+
mode: PAGINATION_MODES.includes(props.mode) ? props.mode : "multi",
|
|
32
|
+
siblingCount: windowCount(props.siblingCount),
|
|
33
|
+
boundaryCount: windowCount(props.boundaryCount),
|
|
34
|
+
dir: typeof props.dir === "string" ? props.dir : void 0,
|
|
35
|
+
canPrevious: !disabled && page > 1,
|
|
36
|
+
canNext: !disabled && page > 0 && page < pageCount,
|
|
37
|
+
navigationLabel: label(props.navigationLabel, "分页导航"),
|
|
38
|
+
previousLabel: label(props.previousLabel, "上一页"),
|
|
39
|
+
nextLabel: label(props.nextLabel, "下一页"),
|
|
40
|
+
pageLabelTemplate: label(props.pageLabelTemplate, "第 {page} 页"),
|
|
41
|
+
statusLabelTemplate: label(props.statusLabelTemplate, "第 {page} / {count} 页"),
|
|
42
|
+
previousJumpLabel: label(props.previousJumpLabel, "向前跳页,目标第 {page} 页"),
|
|
43
|
+
nextJumpLabel: label(props.nextJumpLabel, "向后跳页,目标第 {page} 页")
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** Bounded O(window) construction, never allocates a range from the total page count. */
|
|
47
|
+
function getPaginationItems(state) {
|
|
48
|
+
if (!state.pageCount || state.mode === "simple") return [];
|
|
49
|
+
const pages = /* @__PURE__ */ new Set();
|
|
50
|
+
const add = (start, end) => {
|
|
51
|
+
for (let page = start; page <= end; page++) pages.add(page);
|
|
52
|
+
};
|
|
53
|
+
add(1, Math.min(state.pageCount, state.boundaryCount));
|
|
54
|
+
add(Math.max(1, state.pageCount - state.boundaryCount + 1), state.pageCount);
|
|
55
|
+
add(Math.max(1, state.page - state.siblingCount), Math.min(state.pageCount, state.page + state.siblingCount));
|
|
56
|
+
const sorted = [...pages].sort((a, b) => a - b), items = [];
|
|
57
|
+
const makePage = (page) => ({
|
|
58
|
+
type: "page",
|
|
59
|
+
key: `page-${page}`,
|
|
60
|
+
page,
|
|
61
|
+
text: String(page),
|
|
62
|
+
label: format(state.pageLabelTemplate, page, state.pageCount),
|
|
63
|
+
selected: page === state.page
|
|
64
|
+
});
|
|
65
|
+
for (const [index, page] of sorted.entries()) {
|
|
66
|
+
const previous = sorted[index - 1];
|
|
67
|
+
if (previous !== void 0 && page - previous === 2) items.push(makePage(previous + 1));
|
|
68
|
+
else if (previous !== void 0 && page - previous > 2) {
|
|
69
|
+
const before = page <= state.page, step = 2 * state.siblingCount + 1;
|
|
70
|
+
const target = Math.min(page - 1, Math.max(previous + 1, state.page + (before ? -step : step)));
|
|
71
|
+
items.push({
|
|
72
|
+
type: "ellipsis",
|
|
73
|
+
key: `gap-${previous}-${page}`,
|
|
74
|
+
page: target,
|
|
75
|
+
text: "…",
|
|
76
|
+
label: format(before ? state.previousJumpLabel : state.nextJumpLabel, target, state.pageCount),
|
|
77
|
+
selected: false
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
items.push(makePage(page));
|
|
81
|
+
}
|
|
82
|
+
return items;
|
|
83
|
+
}
|
|
84
|
+
/** Prepare machine props without converting an uncontrolled page into a controlled one. */
|
|
85
|
+
function createPaginationProps(props = {}) {
|
|
86
|
+
return {
|
|
87
|
+
...props,
|
|
88
|
+
defaultPage: integer(props.defaultPage, 1, 1),
|
|
89
|
+
page: props.page === void 0 ? void 0 : integer(props.page, 1, 1)
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const liveProps = (service) => ({
|
|
93
|
+
page: service.context.get("page"),
|
|
94
|
+
count: service.prop("count"),
|
|
95
|
+
pageSize: service.prop("pageSize"),
|
|
96
|
+
pageCount: service.prop("pageCount"),
|
|
97
|
+
mode: service.prop("mode"),
|
|
98
|
+
siblingCount: service.prop("siblingCount"),
|
|
99
|
+
boundaryCount: service.prop("boundaryCount"),
|
|
100
|
+
disabled: service.prop("disabled"),
|
|
101
|
+
dir: service.prop("dir"),
|
|
102
|
+
navigationLabel: service.prop("navigationLabel"),
|
|
103
|
+
previousLabel: service.prop("previousLabel"),
|
|
104
|
+
nextLabel: service.prop("nextLabel"),
|
|
105
|
+
pageLabelTemplate: service.prop("pageLabelTemplate"),
|
|
106
|
+
statusLabelTemplate: service.prop("statusLabelTemplate"),
|
|
107
|
+
previousJumpLabel: service.prop("previousJumpLabel"),
|
|
108
|
+
nextJumpLabel: service.prop("nextJumpLabel")
|
|
109
|
+
});
|
|
110
|
+
/** Pure Zag state for both controlled requests and Core-owned paging. */
|
|
111
|
+
const paginationMachine = createMachine({
|
|
112
|
+
props: ({ props }) => createPaginationProps(props),
|
|
113
|
+
initialState: () => "ready",
|
|
114
|
+
states: { ready: {} },
|
|
115
|
+
context: ({ bindable, prop }) => ({ page: bindable(() => ({
|
|
116
|
+
defaultValue: prop("defaultPage") ?? 1,
|
|
117
|
+
value: prop("page"),
|
|
118
|
+
onChange(page) {
|
|
119
|
+
prop("onPageChange")?.({
|
|
120
|
+
page,
|
|
121
|
+
pageSize: resolvePaginationState({ pageSize: prop("pageSize") }).pageSize
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
})) }),
|
|
125
|
+
on: { "PAGE.SET": { actions: ["setPage"] } },
|
|
126
|
+
implementations: { actions: { setPage(params) {
|
|
127
|
+
const state = resolvePaginationState(liveProps(params));
|
|
128
|
+
if (state.disabled || !state.pageCount) return;
|
|
129
|
+
const next = Math.min(state.pageCount, integer(params.event.page, 1, 1));
|
|
130
|
+
if (next !== state.page) params.context.set("page", next);
|
|
131
|
+
} } }
|
|
132
|
+
});
|
|
133
|
+
/** Normalize ARIA and native button handlers for all frameworks. */
|
|
134
|
+
function connect(service, normalize) {
|
|
135
|
+
const state = resolvePaginationState(liveProps(service));
|
|
136
|
+
const setPage = (page) => service.send({
|
|
137
|
+
type: "PAGE.SET",
|
|
138
|
+
page
|
|
139
|
+
});
|
|
140
|
+
const button = (part, page, name, disabled, selected = false) => normalize.button({
|
|
141
|
+
type: "button",
|
|
142
|
+
"data-scope": "pagination",
|
|
143
|
+
"data-part": part,
|
|
144
|
+
"data-page": page,
|
|
145
|
+
disabled,
|
|
146
|
+
"data-disabled": disabled ? "true" : void 0,
|
|
147
|
+
"aria-label": name,
|
|
148
|
+
"aria-current": selected ? "page" : void 0,
|
|
149
|
+
"data-selected": selected ? "true" : void 0,
|
|
150
|
+
onClick(event) {
|
|
151
|
+
if (!event.defaultPrevented) setPage(page);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
page: state.page,
|
|
156
|
+
pageCount: state.pageCount,
|
|
157
|
+
pageSize: state.pageSize,
|
|
158
|
+
items: getPaginationItems(state),
|
|
159
|
+
statusText: format(state.statusLabelTemplate, state.page, state.pageCount),
|
|
160
|
+
previousText: state.previousLabel,
|
|
161
|
+
nextText: state.nextLabel,
|
|
162
|
+
setPage,
|
|
163
|
+
previous: () => setPage(state.page - 1),
|
|
164
|
+
next: () => setPage(state.page + 1),
|
|
165
|
+
getRootProps: () => normalize.element({
|
|
166
|
+
"data-scope": "pagination",
|
|
167
|
+
"data-part": "root",
|
|
168
|
+
"data-mode": state.mode,
|
|
169
|
+
"data-disabled": state.disabled ? "true" : void 0,
|
|
170
|
+
"aria-label": state.navigationLabel,
|
|
171
|
+
dir: state.dir
|
|
172
|
+
}),
|
|
173
|
+
getListProps: () => normalize.element({
|
|
174
|
+
"data-scope": "pagination",
|
|
175
|
+
"data-part": "list"
|
|
176
|
+
}),
|
|
177
|
+
getListItemProps: () => normalize.element({
|
|
178
|
+
"data-scope": "pagination",
|
|
179
|
+
"data-part": "list-item"
|
|
180
|
+
}),
|
|
181
|
+
getPreviousProps: () => button("previous", state.page - 1, state.previousLabel, !state.canPrevious),
|
|
182
|
+
getNextProps: () => button("next", state.page + 1, state.nextLabel, !state.canNext),
|
|
183
|
+
getItemProps: (item) => ({
|
|
184
|
+
...button("item", item.page, item.label, state.disabled, item.selected),
|
|
185
|
+
...normalize.button({ "data-type": item.type })
|
|
186
|
+
}),
|
|
187
|
+
getStatusProps: () => normalize.element({
|
|
188
|
+
"data-scope": "pagination",
|
|
189
|
+
"data-part": "status",
|
|
190
|
+
"aria-live": "polite",
|
|
191
|
+
"aria-atomic": true
|
|
192
|
+
})
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
//#endregion
|
|
196
|
+
export { PAGINATION_MODES, PAGINATION_PARTS, connect, createPaginationProps, getPaginationItems, paginationMachine, resolvePaginationState };
|
|
197
|
+
|
|
198
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/pagination/pagination.ts"],"sourcesContent":["import { createMachine, type Machine, type Service } from \"@zag-js/core\";\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\";\n\n/** Supported pagination presentations. */\nexport const PAGINATION_MODES = [\"multi\", \"simple\"] as const;\n/** Stable DOM parts shared by all adapters. */\nexport const PAGINATION_PARTS = [\"root\", \"list\", \"list-item\", \"item\", \"previous\", \"next\", \"status\"] as const;\nexport type PaginationMode = (typeof PAGINATION_MODES)[number];\n/** Navigation request; the owner loads data after receiving it. */\nexport interface PaginationPageChangeDetails { page: number; pageSize: number }\n/** Scalar, SSR-safe paging contract. Labels do not follow lang automatically. */\nexport interface QwPaginationProps {\n /** Controlled one-based page. Undefined enables Core-owned state. */\n page?: number;\n /** Initial Core-owned page; defaults to 1. */\n defaultPage?: number;\n /** Total number of records; defaults to 0. */\n count?: number;\n /** Records per page; defaults to 10. */\n pageSize?: number;\n /** Explicit page count overriding count/pageSize. Zero denotes empty. */\n pageCount?: number;\n /** Numbered buttons or compact status; defaults to multi. */\n mode?: PaginationMode;\n /** Pages on each side of the current page; defaults to 1, bounded 0..5. */\n siblingCount?: number;\n /** Pages retained at each boundary; defaults to 1, bounded 0..5. */\n boundaryCount?: number;\n /** Prevent every user and API page request. */\n disabled?: boolean;\n /** Standard HTML direction (including auto/empty); previous always decreases the page. */\n dir?: string;\n /** Accessible navigation region name; defaults to 分页导航. */\n navigationLabel?: string;\n /** Previous button label; defaults to 上一页. */\n previousLabel?: string;\n /** Next button label; defaults to 下一页. */\n nextLabel?: string;\n /** Page name with {page}/{count} placeholders; defaults to 第 {page} 页. */\n pageLabelTemplate?: string;\n /** Polite live status template; defaults to 第 {page} / {count} 页. */\n statusLabelTemplate?: string;\n /** Backward page-group jump template; defaults to 向前跳页,目标第 {page} 页. */\n previousJumpLabel?: string;\n /** Forward page-group jump template; defaults to 向后跳页,目标第 {page} 页. */\n nextJumpLabel?: string;\n /** Invoked once for a different enabled page request, including controlled requests. */\n onPageChange?: (details: PaginationPageChangeDetails) => void;\n}\n/** Core-normalized model; empty page count has page 0. */\nexport interface ResolvedPaginationState {\n page: number; count: number; pageSize: number; pageCount: number;\n mode: PaginationMode; siblingCount: number; boundaryCount: number; disabled: boolean;\n dir: string | undefined; canPrevious: boolean; canNext: boolean;\n navigationLabel: string; previousLabel: string; nextLabel: string;\n pageLabelTemplate: string; statusLabelTemplate: string; previousJumpLabel: string; nextJumpLabel: string;\n}\n/** A numbered button or an executable page-group jump. */\nexport interface PaginationItem {\n type: \"page\" | \"ellipsis\"; key: string; page: number; text: string; label: string; selected: boolean;\n}\nconst integer=(value:number|undefined,fallback:number,min=0,max=Number.MAX_SAFE_INTEGER):number=>\n typeof value === \"number\" && Number.isFinite(value) && value>=min ? Math.min(max,Math.floor(value)) : fallback;\nconst label=(value:string|undefined,fallback:string):string=>typeof value === \"string\" && value.trim() ? value : fallback;\nconst windowCount=(value:number|undefined):number=>typeof value === \"number\" && Number.isFinite(value) ? Math.max(0,Math.min(5,Math.floor(value))) : 1;\nconst format=(template:string,page:number,count:number):string=>template.replace(/\\{page\\}/g,String(page)).replace(/\\{count\\}/g,String(count));\n/** Shared validation: no adapter recomputes boundaries or labels. */\nexport function resolvePaginationState(props:QwPaginationProps = {}):ResolvedPaginationState {\n const count=integer(props.count,0),pageSize=integer(props.pageSize,10,1);\n const pageCount=integer(props.pageCount,Math.ceil(count/pageSize));\n const page=pageCount ? Math.min(pageCount,integer(props.page ?? props.defaultPage,1,1)) : 0;\n const disabled=!!props.disabled;\n return {page,count,pageSize,pageCount,disabled,mode:PAGINATION_MODES.includes(props.mode!) ? props.mode! : \"multi\",\n siblingCount:windowCount(props.siblingCount),boundaryCount:windowCount(props.boundaryCount),\n dir:typeof props.dir === \"string\" ? props.dir : undefined,\n canPrevious:!disabled && page>1,canNext:!disabled && page>0 && page<pageCount,\n navigationLabel:label(props.navigationLabel,\"分页导航\"),previousLabel:label(props.previousLabel,\"上一页\"),nextLabel:label(props.nextLabel,\"下一页\"),\n pageLabelTemplate:label(props.pageLabelTemplate,\"第 {page} 页\"),statusLabelTemplate:label(props.statusLabelTemplate,\"第 {page} / {count} 页\"),\n previousJumpLabel:label(props.previousJumpLabel,\"向前跳页,目标第 {page} 页\"),nextJumpLabel:label(props.nextJumpLabel,\"向后跳页,目标第 {page} 页\"),\n };\n}\n/** Bounded O(window) construction, never allocates a range from the total page count. */\nexport function getPaginationItems(state:ResolvedPaginationState):PaginationItem[] {\n if (!state.pageCount || state.mode === \"simple\") return [];\n const pages=new Set<number>();\n const add=(start:number,end:number)=>{for(let page=start;page<=end;page++)pages.add(page);};\n add(1,Math.min(state.pageCount,state.boundaryCount));\n add(Math.max(1,state.pageCount-state.boundaryCount+1),state.pageCount);\n add(Math.max(1,state.page-state.siblingCount),Math.min(state.pageCount,state.page+state.siblingCount));\n const sorted=[...pages].sort((a,b)=>a-b),items:PaginationItem[]=[];\n const makePage=(page:number):PaginationItem=>({type:\"page\",key:`page-${page}`,page,text:String(page),label:format(state.pageLabelTemplate,page,state.pageCount),selected:page===state.page});\n for (const [index,page] of sorted.entries()) {\n const previous=sorted[index-1];\n if (previous !== undefined && page-previous===2) items.push(makePage(previous+1));\n else if(previous !== undefined && page-previous>2) {\n const before=page<=state.page,step=2*state.siblingCount+1;\n const target=Math.min(page-1,Math.max(previous+1,state.page+(before ? -step : step)));\n items.push({type:\"ellipsis\",key:`gap-${previous}-${page}`,page:target,text:\"…\",label:format(before ? state.previousJumpLabel : state.nextJumpLabel,target,state.pageCount),selected:false});\n }\n items.push(makePage(page));\n }\n return items;\n}\n/** Prepare machine props without converting an uncontrolled page into a controlled one. */\nexport function createPaginationProps(props:QwPaginationProps = {}):QwPaginationProps {\n return {...props,defaultPage:integer(props.defaultPage,1,1),page:props.page === undefined ? undefined : integer(props.page,1,1)};\n}\nexport interface QwPaginationSchema {\n props: QwPaginationProps;\n context: {page:number};\n state: \"ready\";\n action: \"setPage\";\n event: {type:\"PAGE.SET\";page:number};\n}\nexport type QwPaginationMachine = Machine<QwPaginationSchema>;\nexport type QwPaginationService = Service<QwPaginationSchema>;\nconst liveProps=(service:Pick<QwPaginationService,\"prop\"|\"context\">):QwPaginationProps=>({\n page:service.context.get(\"page\"),count:service.prop(\"count\"),pageSize:service.prop(\"pageSize\"),pageCount:service.prop(\"pageCount\"),\n mode:service.prop(\"mode\"),siblingCount:service.prop(\"siblingCount\"),boundaryCount:service.prop(\"boundaryCount\"),disabled:service.prop(\"disabled\"),dir:service.prop(\"dir\"),\n navigationLabel:service.prop(\"navigationLabel\"),previousLabel:service.prop(\"previousLabel\"),nextLabel:service.prop(\"nextLabel\"),\n pageLabelTemplate:service.prop(\"pageLabelTemplate\"),statusLabelTemplate:service.prop(\"statusLabelTemplate\"),previousJumpLabel:service.prop(\"previousJumpLabel\"),nextJumpLabel:service.prop(\"nextJumpLabel\"),\n});\n/** Pure Zag state for both controlled requests and Core-owned paging. */\nexport const paginationMachine:QwPaginationMachine=createMachine<QwPaginationSchema>({\n props:({props})=>createPaginationProps(props),initialState:()=>\"ready\",states:{ready:{}},\n context:({bindable,prop})=>({page:bindable(()=>({defaultValue:prop(\"defaultPage\") ?? 1,value:prop(\"page\"),onChange(page){prop(\"onPageChange\")?.({page,pageSize:resolvePaginationState({pageSize:prop(\"pageSize\")}).pageSize});}}))}),\n on:{\"PAGE.SET\":{actions:[\"setPage\"]}},\n implementations:{actions:{setPage(params){\n const state=resolvePaginationState(liveProps(params));\n if(state.disabled || !state.pageCount)return;\n const next=Math.min(state.pageCount,integer(params.event.page,1,1));\n if(next!==state.page)params.context.set(\"page\",next);\n }}},\n});\n/** Adapters consume this API without interpreting paging state. */\nexport interface QwPaginationApi<T extends PropTypes = PropTypes> {\n page:number; pageCount:number; pageSize:number; items:PaginationItem[]; statusText:string;\n previousText:string; nextText:string;\n setPage(page:number):void; previous():void; next():void;\n getRootProps():T[\"element\"]; getListProps():T[\"element\"]; getListItemProps():T[\"element\"];\n getPreviousProps():T[\"button\"]; getNextProps():T[\"button\"]; getItemProps(item:PaginationItem):T[\"button\"]; getStatusProps():T[\"element\"];\n}\n/** Normalize ARIA and native button handlers for all frameworks. */\nexport function connect<T extends PropTypes>(service:QwPaginationService,normalize:NormalizeProps<T>):QwPaginationApi<T> {\n const state=resolvePaginationState(liveProps(service));\n const setPage=(page:number)=>service.send({type:\"PAGE.SET\",page});\n const button=(part:string,page:number,name:string,disabled:boolean,selected=false)=>normalize.button({\n type:\"button\",\"data-scope\":\"pagination\",\"data-part\":part,\"data-page\":page,disabled,\"data-disabled\":disabled ? \"true\" : undefined,\n \"aria-label\":name,\"aria-current\":selected ? \"page\" : undefined,\"data-selected\":selected ? \"true\" : undefined,\n onClick(event:{defaultPrevented:boolean}){if(!event.defaultPrevented)setPage(page);},\n });\n return {page:state.page,pageCount:state.pageCount,pageSize:state.pageSize,items:getPaginationItems(state),\n statusText:format(state.statusLabelTemplate,state.page,state.pageCount),previousText:state.previousLabel,nextText:state.nextLabel,\n setPage,previous:()=>setPage(state.page-1),next:()=>setPage(state.page+1),\n getRootProps:()=>normalize.element({\"data-scope\":\"pagination\",\"data-part\":\"root\",\"data-mode\":state.mode,\"data-disabled\":state.disabled ? \"true\" : undefined,\"aria-label\":state.navigationLabel,dir:state.dir}),\n getListProps:()=>normalize.element({\"data-scope\":\"pagination\",\"data-part\":\"list\"}),\n getListItemProps:()=>normalize.element({\"data-scope\":\"pagination\",\"data-part\":\"list-item\"}),\n getPreviousProps:()=>button(\"previous\",state.page-1,state.previousLabel,!state.canPrevious),\n getNextProps:()=>button(\"next\",state.page+1,state.nextLabel,!state.canNext),\n getItemProps:item=>({...button(\"item\",item.page,item.label,state.disabled,item.selected),...normalize.button({\"data-type\":item.type})}),\n getStatusProps:()=>normalize.element({\"data-scope\":\"pagination\",\"data-part\":\"status\",\"aria-live\":\"polite\",\"aria-atomic\":true}),\n };\n}\n"],"mappings":"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"}
|