@qw-ui/core 0.3.0-next.40 → 0.3.0-next.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -37
- package/dist/action-sheet/action-sheet.d.ts +110 -0
- package/dist/action-sheet/index.d.ts +2 -0
- package/dist/action-sheet/index.js +2 -0
- package/dist/action-sheet-Cvcr1S_m.js +183 -0
- package/dist/action-sheet-Cvcr1S_m.js.map +1 -0
- package/dist/area-picker/area-picker.d.ts +113 -0
- package/dist/area-picker/index.d.ts +1 -0
- package/dist/area-picker/index.js +348 -0
- package/dist/area-picker/index.js.map +1 -0
- package/dist/aria-description-CimD2M_C.js +13 -0
- package/dist/aria-description-CimD2M_C.js.map +1 -0
- package/dist/aria-description.d.ts +2 -0
- package/dist/avatar/avatar-load.d.ts +76 -0
- package/dist/avatar/avatar.d.ts +22 -5
- package/dist/avatar/index.d.ts +1 -0
- package/dist/avatar/index.js +57 -18
- package/dist/avatar/index.js.map +1 -1
- package/dist/avatar-load-w9dq05oV.js +139 -0
- package/dist/avatar-load-w9dq05oV.js.map +1 -0
- package/dist/back-top/back-top.d.ts +77 -0
- package/dist/back-top/index.d.ts +1 -0
- package/dist/back-top/index.js +189 -0
- package/dist/back-top/index.js.map +1 -0
- package/dist/badge/badge.d.ts +9 -0
- package/dist/badge/index.js +14 -1
- package/dist/badge/index.js.map +1 -1
- package/dist/button/button.d.ts +13 -0
- package/dist/button/index.js +3 -5
- package/dist/button/index.js.map +1 -1
- package/dist/calendar/calendar.d.ts +100 -0
- package/dist/calendar/index.d.ts +1 -0
- package/dist/calendar/index.js +2 -0
- package/dist/calendar-CmpK3stz.js +363 -0
- package/dist/calendar-CmpK3stz.js.map +1 -0
- package/dist/card/card.d.ts +68 -0
- package/dist/card/index.d.ts +2 -0
- package/dist/card/index.js +2 -0
- package/dist/card-DRtWa6Cr.js +107 -0
- package/dist/card-DRtWa6Cr.js.map +1 -0
- package/dist/cascader/cascader.d.ts +115 -0
- package/dist/cascader/index.d.ts +1 -0
- package/dist/cascader/index.js +2 -0
- package/dist/cascader-D-xMjs7P.js +333 -0
- package/dist/cascader-D-xMjs7P.js.map +1 -0
- package/dist/cell/cell.d.ts +41 -0
- package/dist/cell/index.d.ts +1 -0
- package/dist/cell/index.js +43 -0
- package/dist/cell/index.js.map +1 -0
- package/dist/check-list/check-list.d.ts +78 -0
- package/dist/check-list/index.d.ts +2 -0
- package/dist/check-list/index.js +2 -0
- package/dist/check-list-BvZHQt5w.js +60 -0
- package/dist/check-list-BvZHQt5w.js.map +1 -0
- package/dist/checkbox/checkbox.d.ts +59 -0
- package/dist/checkbox/index.d.ts +2 -0
- package/dist/checkbox/index.js +2 -0
- package/dist/checkbox-BlndJrz5.js +127 -0
- package/dist/checkbox-BlndJrz5.js.map +1 -0
- package/dist/checkbox-group/checkbox-group.d.ts +86 -0
- package/dist/checkbox-group/index.d.ts +3 -0
- package/dist/checkbox-group/index.js +2 -0
- package/dist/checkbox-group-gGfsTv-e.js +223 -0
- package/dist/checkbox-group-gGfsTv-e.js.map +1 -0
- package/dist/choice-group-C4c9m0qe.js +373 -0
- package/dist/choice-group-C4c9m0qe.js.map +1 -0
- package/dist/circle/circle.d.ts +97 -0
- package/dist/circle/index.d.ts +1 -0
- package/dist/circle/index.js +119 -0
- package/dist/circle/index.js.map +1 -0
- package/dist/collapse/collapse.d.ts +98 -0
- package/dist/collapse/index.d.ts +2 -0
- package/dist/collapse/index.js +2 -0
- package/dist/collapse-B969h7-H.js +226 -0
- package/dist/collapse-B969h7-H.js.map +1 -0
- package/dist/countdown/countdown.d.ts +114 -0
- package/dist/countdown/index.d.ts +1 -0
- package/dist/countdown/index.js +309 -0
- package/dist/countdown/index.js.map +1 -0
- package/dist/date-picker/date-picker.d.ts +168 -0
- package/dist/date-picker/index.d.ts +1 -0
- package/dist/date-picker/index.js +401 -0
- package/dist/date-picker/index.js.map +1 -0
- package/dist/descriptions/descriptions.d.ts +69 -0
- package/dist/descriptions/index.d.ts +1 -0
- package/dist/descriptions/index.js +86 -0
- package/dist/descriptions/index.js.map +1 -0
- package/dist/dialog/dialog.d.ts +32 -3
- package/dist/dialog/index.js +58 -3
- package/dist/dialog/index.js.map +1 -1
- package/dist/divider/divider.d.ts +18 -2
- package/dist/divider/index.js +20 -2
- package/dist/divider/index.js.map +1 -1
- package/dist/dropdown/dropdown.d.ts +172 -0
- package/dist/dropdown/index.d.ts +2 -0
- package/dist/dropdown/index.js +467 -0
- package/dist/dropdown/index.js.map +1 -0
- package/dist/ellipsis/ellipsis-layout.d.ts +34 -0
- package/dist/ellipsis/ellipsis.d.ts +88 -0
- package/dist/ellipsis/index.d.ts +2 -0
- package/dist/ellipsis/index.js +320 -0
- package/dist/ellipsis/index.js.map +1 -0
- package/dist/empty/empty-illustration.d.ts +3 -0
- package/dist/empty/empty.d.ts +43 -1
- package/dist/empty/index.js +2 -21
- package/dist/empty-CAgyvhUI.js +166 -0
- package/dist/empty-CAgyvhUI.js.map +1 -0
- package/dist/field/field.d.ts +95 -0
- package/dist/field/index.d.ts +2 -0
- package/dist/field/index.js +2 -0
- package/dist/field-DMHGIMZF.js +241 -0
- package/dist/field-DMHGIMZF.js.map +1 -0
- package/dist/floating-bubble/floating-bubble.d.ts +116 -0
- package/dist/floating-bubble/index.d.ts +1 -0
- package/dist/floating-bubble/index.js +333 -0
- package/dist/floating-bubble/index.js.map +1 -0
- package/dist/floating-panel/floating-panel.d.ts +80 -0
- package/dist/floating-panel/index.d.ts +2 -0
- package/dist/floating-panel/index.js +2 -0
- package/dist/floating-panel-Cbm5njBJ.js +363 -0
- package/dist/floating-panel-Cbm5njBJ.js.map +1 -0
- package/dist/footer/footer.d.ts +94 -0
- package/dist/footer/index.d.ts +1 -0
- package/dist/footer/index.js +154 -0
- package/dist/footer/index.js.map +1 -0
- package/dist/form/connect.d.ts +6 -0
- package/dist/form/form.d.ts +100 -0
- package/dist/form/ids.d.ts +14 -0
- package/dist/form/index.d.ts +13 -0
- package/dist/form/index.js +3 -0
- package/dist/form/methods.d.ts +5 -0
- package/dist/form/model.d.ts +24 -0
- package/dist/form/native.d.ts +25 -0
- package/dist/form/rules.d.ts +40 -0
- package/dist/form/ssr.d.ts +7 -0
- package/dist/form/types.d.ts +150 -0
- package/dist/form-BAGkIEMY.js +1354 -0
- package/dist/form-BAGkIEMY.js.map +1 -0
- package/dist/format-BDUY0C_c.js +89 -0
- package/dist/format-BDUY0C_c.js.map +1 -0
- package/dist/gesture-_SRHIvBm.js +30 -0
- package/dist/gesture-_SRHIvBm.js.map +1 -0
- package/dist/grid/grid-item.d.ts +22 -0
- package/dist/grid/grid.d.ts +42 -0
- package/dist/grid/index.d.ts +2 -0
- package/dist/grid/index.js +73 -0
- package/dist/grid/index.js.map +1 -0
- package/dist/icon/icon.d.ts +37 -1
- package/dist/icon/identity.d.ts +3 -0
- package/dist/icon/index.js +2 -20
- package/dist/icon-Cgdbnk1u.js +77 -0
- package/dist/icon-Cgdbnk1u.js.map +1 -0
- package/dist/image/image-load.d.ts +24 -0
- package/dist/image/image.d.ts +45 -8
- package/dist/image/index.d.ts +1 -0
- package/dist/image/index.js +116 -14
- package/dist/image/index.js.map +1 -1
- package/dist/image-preview/image-preview.d.ts +124 -0
- package/dist/image-preview/index.d.ts +1 -0
- package/dist/image-preview/index.js +450 -0
- package/dist/image-preview/index.js.map +1 -0
- package/dist/index-bar/index-bar.d.ts +121 -0
- package/dist/index-bar/index.d.ts +1 -0
- package/dist/index-bar/index.js +386 -0
- package/dist/index-bar/index.js.map +1 -0
- package/dist/index.d.ts +107 -14
- package/dist/index.js +148 -14
- package/dist/index.js.map +1 -0
- package/dist/infinite-scroll/index.d.ts +1 -0
- package/dist/infinite-scroll/index.js +248 -0
- package/dist/infinite-scroll/index.js.map +1 -0
- package/dist/infinite-scroll/infinite-scroll.d.ts +95 -0
- package/dist/input/index.js +181 -22
- package/dist/input/index.js.map +1 -1
- package/dist/input/input.d.ts +44 -1
- package/dist/layer-IpFrl5--.js +414 -0
- package/dist/layer-IpFrl5--.js.map +1 -0
- package/dist/layout-BRSqi4AQ.js +43 -0
- package/dist/layout-BRSqi4AQ.js.map +1 -0
- package/dist/layout.d.ts +13 -0
- package/dist/list/index.d.ts +2 -0
- package/dist/list/index.js +2 -0
- package/dist/list/list.d.ts +30 -0
- package/dist/list-6-iz-Irh.js +28 -0
- package/dist/list-6-iz-Irh.js.map +1 -0
- package/dist/loading/index.js +45 -2
- package/dist/loading/index.js.map +1 -1
- package/dist/loading/loading.d.ts +45 -2
- package/dist/modal-dialog-machine-CF9_z3Dm.js +487 -0
- package/dist/modal-dialog-machine-CF9_z3Dm.js.map +1 -0
- package/dist/modal-dialog-machine.d.ts +21 -0
- package/dist/modal-dismissable-lifetime.d.ts +21 -0
- package/dist/modal-registry.d.ts +24 -0
- package/dist/modal-render-hydration.d.ts +35 -0
- package/dist/modal-render-runtime.d.ts +19 -0
- package/dist/modal-render-scope.d.ts +63 -0
- package/dist/nav-bar/index.d.ts +1 -0
- package/dist/nav-bar/index.js +115 -0
- package/dist/nav-bar/index.js.map +1 -0
- package/dist/nav-bar/nav-bar.d.ts +76 -0
- package/dist/notice-bar/index.d.ts +2 -0
- package/dist/notice-bar/index.js +2 -0
- package/dist/notice-bar/notice-bar.d.ts +103 -0
- package/dist/notice-bar-DMpwLvRb.js +231 -0
- package/dist/notice-bar-DMpwLvRb.js.map +1 -0
- package/dist/notify/index.d.ts +1 -0
- package/dist/notify/index.js +251 -0
- package/dist/notify/index.js.map +1 -0
- package/dist/notify/notify.d.ts +123 -0
- package/dist/number-keyboard/index.d.ts +1 -0
- package/dist/number-keyboard/index.js +333 -0
- package/dist/number-keyboard/index.js.map +1 -0
- package/dist/number-keyboard/number-keyboard.d.ts +141 -0
- package/dist/page-indicator/index.d.ts +1 -0
- package/dist/page-indicator/index.js +138 -0
- package/dist/page-indicator/index.js.map +1 -0
- package/dist/page-indicator/page-indicator.d.ts +93 -0
- package/dist/pagination/index.d.ts +1 -0
- package/dist/pagination/index.js +198 -0
- package/dist/pagination/index.js.map +1 -0
- package/dist/pagination/pagination.d.ts +125 -0
- package/dist/password-input/index.d.ts +1 -0
- package/dist/password-input/index.js +317 -0
- package/dist/password-input/index.js.map +1 -0
- package/dist/password-input/password-input.d.ts +144 -0
- package/dist/picker/index.d.ts +8 -0
- package/dist/picker/index.js +2 -0
- package/dist/picker/picker-machine.d.ts +80 -0
- package/dist/picker/picker.d.ts +121 -0
- package/dist/picker/platform.d.ts +84 -0
- package/dist/picker/selection-connect.d.ts +90 -0
- package/dist/picker/selection-model.d.ts +211 -0
- package/dist/picker-BykFntQN.js +1675 -0
- package/dist/picker-BykFntQN.js.map +1 -0
- package/dist/popover/index.d.ts +3 -0
- package/dist/popover/index.js +253 -0
- package/dist/popover/index.js.map +1 -0
- package/dist/popover/layer.d.ts +44 -0
- package/dist/popover/popover.d.ts +104 -0
- package/dist/popover/positioning.d.ts +132 -0
- package/dist/popup/index.d.ts +2 -0
- package/dist/popup/index.js +2 -0
- package/dist/popup/popup.d.ts +60 -0
- package/dist/popup-z5d8IYCt.js +576 -0
- package/dist/popup-z5d8IYCt.js.map +1 -0
- package/dist/portal-BHCNTWhg.js +78 -0
- package/dist/portal-BHCNTWhg.js.map +1 -0
- package/dist/portal.d.ts +61 -0
- package/dist/price/format.d.ts +19 -0
- package/dist/price/index.d.ts +1 -0
- package/dist/price/index.js +154 -0
- package/dist/price/index.js.map +1 -0
- package/dist/price/price.d.ts +88 -0
- package/dist/progress/index.d.ts +1 -0
- package/dist/progress/index.js +2 -0
- package/dist/progress/progress.d.ts +32 -0
- package/dist/progress-f3iYEfdA.js +37 -0
- package/dist/progress-f3iYEfdA.js.map +1 -0
- package/dist/pull-refresh/index.d.ts +1 -0
- package/dist/pull-refresh/index.js +414 -0
- package/dist/pull-refresh/index.js.map +1 -0
- package/dist/pull-refresh/pull-refresh.d.ts +118 -0
- package/dist/radio-group/index.d.ts +3 -0
- package/dist/radio-group/index.js +2 -0
- package/dist/radio-group/radio-group.d.ts +78 -0
- package/dist/radio-group-BOIMuqnS.js +230 -0
- package/dist/radio-group-BOIMuqnS.js.map +1 -0
- package/dist/rate/index.d.ts +1 -0
- package/dist/rate/index.js +2 -0
- package/dist/rate/rate-form.d.ts +28 -0
- package/dist/rate/rate.d.ts +144 -0
- package/dist/rate-5XsU2QkY.js +631 -0
- package/dist/rate-5XsU2QkY.js.map +1 -0
- package/dist/reorder/index.d.ts +1 -0
- package/dist/reorder/index.js +720 -0
- package/dist/reorder/index.js.map +1 -0
- package/dist/reorder/reorder.d.ts +190 -0
- package/dist/result/index.d.ts +1 -0
- package/dist/result/index.js +123 -0
- package/dist/result/index.js.map +1 -0
- package/dist/result/result.d.ts +88 -0
- package/dist/safe-area/index.d.ts +1 -0
- package/dist/safe-area/index.js +42 -0
- package/dist/safe-area/index.js.map +1 -0
- package/dist/safe-area/safe-area.d.ts +28 -0
- package/dist/search-bar/index.js +3 -1
- package/dist/search-bar/index.js.map +1 -1
- package/dist/search-bar/search-bar.d.ts +4 -0
- package/dist/segmented/index.d.ts +2 -0
- package/dist/segmented/index.js +2 -0
- package/dist/segmented/segmented.d.ts +127 -0
- package/dist/segmented-BaU38_L4.js +367 -0
- package/dist/segmented-BaU38_L4.js.map +1 -0
- package/dist/selection-form-BOM_odUk.js +88 -0
- package/dist/selection-form-BOM_odUk.js.map +1 -0
- package/dist/selection-form.d.ts +27 -0
- package/dist/selection-ivXqO1eu.js +55 -0
- package/dist/selection-ivXqO1eu.js.map +1 -0
- package/dist/selection.d.ts +29 -0
- package/dist/selector/choice-group.d.ts +114 -0
- package/dist/selector/index.d.ts +2 -0
- package/dist/selector/index.js +2 -0
- package/dist/selector/selector.d.ts +90 -0
- package/dist/selector-BU2MMJ4N.js +93 -0
- package/dist/selector-BU2MMJ4N.js.map +1 -0
- package/dist/share-sheet/index.d.ts +1 -0
- package/dist/share-sheet/index.js +138 -0
- package/dist/share-sheet/index.js.map +1 -0
- package/dist/share-sheet/share-sheet.d.ts +139 -0
- package/dist/skeleton/index.js +51 -2
- package/dist/skeleton/index.js.map +1 -1
- package/dist/skeleton/skeleton.d.ts +34 -3
- package/dist/slider/index.d.ts +1 -0
- package/dist/slider/index.js +482 -0
- package/dist/slider/index.js.map +1 -0
- package/dist/slider/slider.d.ts +174 -0
- package/dist/space/index.d.ts +1 -0
- package/dist/space/index.js +52 -0
- package/dist/space/index.js.map +1 -0
- package/dist/space/space.d.ts +46 -0
- package/dist/statistic/index.d.ts +1 -0
- package/dist/statistic/index.js +152 -0
- package/dist/statistic/index.js.map +1 -0
- package/dist/statistic/statistic.d.ts +101 -0
- package/dist/stepper/index.js +62 -3
- package/dist/stepper/index.js.map +1 -1
- package/dist/stepper/stepper.d.ts +44 -4
- package/dist/steps/index.d.ts +1 -0
- package/dist/steps/index.js +72 -0
- package/dist/steps/index.js.map +1 -0
- package/dist/steps/steps.d.ts +67 -0
- package/dist/sticky/index.d.ts +1 -0
- package/dist/sticky/index.js +145 -0
- package/dist/sticky/index.js.map +1 -0
- package/dist/sticky/sticky.d.ts +70 -0
- package/dist/swipe-action/index.d.ts +1 -0
- package/dist/swipe-action/index.js +417 -0
- package/dist/swipe-action/index.js.map +1 -0
- package/dist/swipe-action/swipe-action.d.ts +148 -0
- package/dist/swiper/gesture.d.ts +32 -0
- package/dist/swiper/index.d.ts +1 -0
- package/dist/swiper/index.js +2 -0
- package/dist/swiper/swiper.d.ts +177 -0
- package/dist/swiper-BKivDkHp.js +550 -0
- package/dist/swiper-BKivDkHp.js.map +1 -0
- package/dist/switch/index.js +135 -10
- package/dist/switch/index.js.map +1 -1
- package/dist/switch/switch.d.ts +93 -6
- package/dist/tabbar/index.js +46 -1
- package/dist/tabbar/index.js.map +1 -1
- package/dist/tabbar/tabbar.d.ts +50 -0
- package/dist/tabs/index.js +22 -1
- package/dist/tabs/index.js.map +1 -1
- package/dist/tabs/tabs.d.ts +12 -8
- package/dist/tag/index.js +123 -2
- package/dist/tag/index.js.map +1 -1
- package/dist/tag/tag.d.ts +67 -1
- package/dist/textarea/index.d.ts +2 -0
- package/dist/textarea/index.js +2 -242
- package/dist/textarea/platform.d.ts +22 -0
- package/dist/textarea/textarea.d.ts +165 -46
- package/dist/textarea-qbnruDUG.js +775 -0
- package/dist/textarea-qbnruDUG.js.map +1 -0
- package/dist/time-picker/index.d.ts +1 -0
- package/dist/time-picker/index.js +228 -0
- package/dist/time-picker/index.js.map +1 -0
- package/dist/time-picker/time-picker.d.ts +83 -0
- package/dist/timeline/index.d.ts +1 -0
- package/dist/timeline/index.js +131 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/timeline/timeline.d.ts +79 -0
- package/dist/toast/index.js +47 -4
- package/dist/toast/index.js.map +1 -1
- package/dist/toast/toast.d.ts +26 -3
- package/dist/top-bar/index.js +16 -2
- package/dist/top-bar/index.js.map +1 -1
- package/dist/top-bar/top-bar.d.ts +13 -2
- package/dist/tree-select/index.d.ts +1 -0
- package/dist/tree-select/index.js +512 -0
- package/dist/tree-select/index.js.map +1 -0
- package/dist/tree-select/tree-select.d.ts +215 -0
- package/dist/typography/index.d.ts +1 -0
- package/dist/typography/index.js +82 -0
- package/dist/typography/index.js.map +1 -0
- package/dist/typography/typography.d.ts +54 -0
- package/dist/upload/index.d.ts +1 -0
- package/dist/upload/index.js +458 -0
- package/dist/upload/index.js.map +1 -0
- package/dist/upload/upload.d.ts +172 -0
- package/dist/virtual-list/index.d.ts +1 -0
- package/dist/virtual-list/index.js +445 -0
- package/dist/virtual-list/index.js.map +1 -0
- package/dist/virtual-list/virtual-list.d.ts +160 -0
- package/dist/visual-manifest.d.ts +6 -0
- package/dist/watermark/index.d.ts +1 -0
- package/dist/watermark/index.js +260 -0
- package/dist/watermark/index.js.map +1 -0
- package/dist/watermark/watermark.d.ts +106 -0
- package/package.json +399 -50
- package/dist/empty/index.js.map +0 -1
- package/dist/icon/index.js.map +0 -1
- package/dist/textarea/index.js.map +0 -1
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import { n as resolveSwipeIntent, r as sampleVelocity, t as lockGestureAxis } from "../gesture-_SRHIvBm.js";
|
|
2
|
+
import { createMachine } from "@zag-js/core";
|
|
3
|
+
import { visuallyHiddenStyle } from "@zag-js/dom-query";
|
|
4
|
+
//#region src/swipe-action/swipe-action.ts
|
|
5
|
+
/** Logical sides: start actions sit at inline-start (left in LTR, right in RTL). */
|
|
6
|
+
const SWIPE_ACTION_SIDES = ["start", "end"];
|
|
7
|
+
const SWIPE_ACTION_COLORS = [
|
|
8
|
+
"default",
|
|
9
|
+
"primary",
|
|
10
|
+
"warning",
|
|
11
|
+
"danger"
|
|
12
|
+
];
|
|
13
|
+
/** Stable DOM parts shared by every adapter. */
|
|
14
|
+
const SWIPE_ACTION_PARTS = [
|
|
15
|
+
"root",
|
|
16
|
+
"track",
|
|
17
|
+
"actions",
|
|
18
|
+
"action",
|
|
19
|
+
"content",
|
|
20
|
+
"status"
|
|
21
|
+
];
|
|
22
|
+
/** Share of an action group's width that commits opening/closing; flicks commit earlier. */
|
|
23
|
+
const SWIPE_ACTION_DISTANCE_RATIO = .4;
|
|
24
|
+
const MAX_ACTIONS = 8;
|
|
25
|
+
const items = (value, side) => {
|
|
26
|
+
const seen = /* @__PURE__ */ new Set(), result = [];
|
|
27
|
+
for (const item of Array.isArray(value) ? value : []) {
|
|
28
|
+
if (!item || typeof item.key !== "string" || !item.key || seen.has(item.key) || typeof item.text !== "string" || !item.text.trim()) continue;
|
|
29
|
+
seen.add(item.key);
|
|
30
|
+
result.push({
|
|
31
|
+
key: item.key,
|
|
32
|
+
text: item.text,
|
|
33
|
+
color: SWIPE_ACTION_COLORS.includes(item.color) ? item.color : "default",
|
|
34
|
+
disabled: !!item.disabled,
|
|
35
|
+
side
|
|
36
|
+
});
|
|
37
|
+
if (result.length === MAX_ACTIONS) break;
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
const side = (value) => value === "start" || value === "end" ? value : null;
|
|
42
|
+
/** Invalid/duplicate/empty actions are dropped; at most 8 per side. */
|
|
43
|
+
function resolveSwipeActionState(props = {}) {
|
|
44
|
+
return {
|
|
45
|
+
start: items(props.startActions, "start"),
|
|
46
|
+
end: items(props.endActions, "end"),
|
|
47
|
+
closeOnAction: props.closeOnAction !== false,
|
|
48
|
+
closeOnTouchOutside: props.closeOnTouchOutside !== false,
|
|
49
|
+
disabled: !!props.disabled,
|
|
50
|
+
openedText: typeof props.openedText === "string" && props.openedText.trim() ? props.openedText : "已展开 {count} 个操作"
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** A side can only be open when it has actions and the component is enabled. */
|
|
54
|
+
function resolveSwipeActionOpen(state, open) {
|
|
55
|
+
const value = side(open);
|
|
56
|
+
return !value || state.disabled || !state[value].length ? null : value;
|
|
57
|
+
}
|
|
58
|
+
/** Resting logical offset: positive reveals start actions. */
|
|
59
|
+
function getSwipeActionRestOffset(open, widths) {
|
|
60
|
+
return open === "start" ? widths.start : open === "end" ? -widths.end : 0;
|
|
61
|
+
}
|
|
62
|
+
/** Logical drag offset from the resting position, clamped to the measured action widths. */
|
|
63
|
+
function clampSwipeActionOffset(offset, widths) {
|
|
64
|
+
return Math.min(Math.max(0, widths.start), Math.max(-Math.max(0, widths.end), Number.isFinite(offset) ? offset : 0));
|
|
65
|
+
}
|
|
66
|
+
/** Release decision. `delta` is the logical drag distance (positive = toward inline-end). */
|
|
67
|
+
function resolveSwipeActionRelease(input) {
|
|
68
|
+
const { open, delta, velocity, widths } = input;
|
|
69
|
+
const intent = (size) => resolveSwipeIntent({
|
|
70
|
+
distance: delta,
|
|
71
|
+
velocity,
|
|
72
|
+
size,
|
|
73
|
+
ratio: SWIPE_ACTION_DISTANCE_RATIO
|
|
74
|
+
});
|
|
75
|
+
if (open === "end") return intent(widths.end) > 0 ? null : "end";
|
|
76
|
+
if (open === "start") return intent(widths.start) < 0 ? null : "start";
|
|
77
|
+
if (delta > 0 && widths.start > 0 && intent(widths.start) > 0) return "start";
|
|
78
|
+
if (delta < 0 && widths.end > 0 && intent(widths.end) < 0) return "end";
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
function createSwipeActionProps(props = {}) {
|
|
82
|
+
if (props.id !== void 0 && (typeof props.id !== "string" || !props.id.trim())) throw new TypeError("SwipeAction requires a nonempty instance id when provided");
|
|
83
|
+
return {
|
|
84
|
+
...props,
|
|
85
|
+
defaultOpen: side(props.defaultOpen),
|
|
86
|
+
open: props.open === void 0 ? void 0 : side(props.open)
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const ids = (scope) => ({
|
|
90
|
+
root: `swipe-action:${scope.id}`,
|
|
91
|
+
track: `swipe-action:${scope.id}:track`,
|
|
92
|
+
content: `swipe-action:${scope.id}:content`,
|
|
93
|
+
start: `swipe-action:${scope.id}:start`,
|
|
94
|
+
end: `swipe-action:${scope.id}:end`
|
|
95
|
+
});
|
|
96
|
+
const live = (service) => resolveSwipeActionState({
|
|
97
|
+
startActions: service.prop("startActions"),
|
|
98
|
+
endActions: service.prop("endActions"),
|
|
99
|
+
closeOnAction: service.prop("closeOnAction"),
|
|
100
|
+
closeOnTouchOutside: service.prop("closeOnTouchOutside"),
|
|
101
|
+
disabled: service.prop("disabled"),
|
|
102
|
+
openedText: service.prop("openedText")
|
|
103
|
+
});
|
|
104
|
+
/** Measured widths, zeroed for a side without actions (its hidden group may still report a stale size). */
|
|
105
|
+
const widthsOf = (context, state) => ({
|
|
106
|
+
start: state.start.length && !state.disabled ? context.get("startWidth") : 0,
|
|
107
|
+
end: state.end.length && !state.disabled ? context.get("endWidth") : 0
|
|
108
|
+
});
|
|
109
|
+
/** Move focus off an action that is about to be hidden, so it never stays on clipped content. */
|
|
110
|
+
function releaseFocus(scope) {
|
|
111
|
+
const root = scope.getById(ids(scope).root), active = root?.ownerDocument.activeElement;
|
|
112
|
+
if (root && active && active !== root && active.closest?.("[data-scope=\"swipe-action\"][data-part=\"actions\"]") && root.contains(active)) root.focus({ preventScroll: true });
|
|
113
|
+
}
|
|
114
|
+
/** Core owns gestures, axis locking, outside/close handling, focus-driven opening and cleanup. */
|
|
115
|
+
const swipeActionMachine = createMachine({
|
|
116
|
+
props: ({ props }) => createSwipeActionProps(props),
|
|
117
|
+
initialState: () => "ready",
|
|
118
|
+
states: { ready: {} },
|
|
119
|
+
context: ({ bindable, prop }) => ({
|
|
120
|
+
open: bindable(() => ({
|
|
121
|
+
defaultValue: prop("defaultOpen") ?? null,
|
|
122
|
+
value: prop("open"),
|
|
123
|
+
onChange(open) {
|
|
124
|
+
prop("onOpenChange")?.({ open });
|
|
125
|
+
}
|
|
126
|
+
})),
|
|
127
|
+
offset: bindable(() => ({ defaultValue: 0 })),
|
|
128
|
+
dragging: bindable(() => ({ defaultValue: false })),
|
|
129
|
+
startWidth: bindable(() => ({ defaultValue: 0 })),
|
|
130
|
+
endWidth: bindable(() => ({ defaultValue: 0 }))
|
|
131
|
+
}),
|
|
132
|
+
watch({ track, prop, action }) {
|
|
133
|
+
track([() => prop("disabled")], () => action(["closeIfDisabled"]));
|
|
134
|
+
},
|
|
135
|
+
on: {
|
|
136
|
+
"OPEN.SET": { actions: ["setOpen"] },
|
|
137
|
+
CLOSE: { actions: ["close"] },
|
|
138
|
+
"DRAG.MOVE": { actions: ["dragMove"] },
|
|
139
|
+
"DRAG.END": { actions: ["dragEnd"] },
|
|
140
|
+
MEASURE: { actions: ["measure"] },
|
|
141
|
+
ACTION: { actions: ["activate"] }
|
|
142
|
+
},
|
|
143
|
+
effects: ["trackGestures"],
|
|
144
|
+
implementations: {
|
|
145
|
+
actions: {
|
|
146
|
+
setOpen({ event, context, prop }) {
|
|
147
|
+
if (event.type !== "OPEN.SET") return;
|
|
148
|
+
const state = live({ prop }), next = resolveSwipeActionOpen(state, event.side);
|
|
149
|
+
if (next !== resolveSwipeActionOpen(state, context.get("open"))) context.set("open", next);
|
|
150
|
+
},
|
|
151
|
+
close({ event, context, prop, scope }) {
|
|
152
|
+
if (event.type === "CLOSE" && event.restoreFocus) releaseFocus(scope);
|
|
153
|
+
if (resolveSwipeActionOpen(live({ prop }), context.get("open")) !== null) context.set("open", null);
|
|
154
|
+
},
|
|
155
|
+
closeIfDisabled({ context, prop }) {
|
|
156
|
+
if (prop("disabled") && side(context.get("open"))) context.set("open", null);
|
|
157
|
+
},
|
|
158
|
+
dragMove({ event, context }) {
|
|
159
|
+
if (event.type === "DRAG.MOVE") {
|
|
160
|
+
context.set("dragging", true);
|
|
161
|
+
context.set("offset", event.offset);
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
dragEnd({ event, context, prop }) {
|
|
165
|
+
if (event.type !== "DRAG.END") return;
|
|
166
|
+
context.set("dragging", false);
|
|
167
|
+
context.set("offset", 0);
|
|
168
|
+
const state = live({ prop }), next = resolveSwipeActionOpen(state, event.side);
|
|
169
|
+
if (next !== resolveSwipeActionOpen(state, context.get("open"))) context.set("open", next);
|
|
170
|
+
},
|
|
171
|
+
measure({ event, context }) {
|
|
172
|
+
if (event.type === "MEASURE") {
|
|
173
|
+
context.set("startWidth", event.start);
|
|
174
|
+
context.set("endWidth", event.end);
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
activate({ event, context, prop, scope }) {
|
|
178
|
+
if (event.type !== "ACTION") return;
|
|
179
|
+
const state = live({ prop }), item = state[event.side].find((action) => action.key === event.key);
|
|
180
|
+
if (!item || item.disabled || state.disabled) return;
|
|
181
|
+
prop("onAction")?.({
|
|
182
|
+
key: item.key,
|
|
183
|
+
side: item.side
|
|
184
|
+
});
|
|
185
|
+
if (state.closeOnAction && side(context.get("open"))) {
|
|
186
|
+
releaseFocus(scope);
|
|
187
|
+
context.set("open", null);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
effects: { trackGestures({ scope, prop, context, send }) {
|
|
192
|
+
const id = ids(scope), root = scope.getById(id.root), track = scope.getById(id.track), win = root?.ownerDocument.defaultView;
|
|
193
|
+
if (!root || !track || !win) return;
|
|
194
|
+
const doc = root.ownerDocument;
|
|
195
|
+
const openNow = () => resolveSwipeActionOpen(live({ prop }), context.get("open"));
|
|
196
|
+
const measure = () => {
|
|
197
|
+
const start = scope.getById(id.start)?.offsetWidth ?? 0, end = scope.getById(id.end)?.offsetWidth ?? 0;
|
|
198
|
+
if (start !== context.get("startWidth") || end !== context.get("endWidth")) send({
|
|
199
|
+
type: "MEASURE",
|
|
200
|
+
start,
|
|
201
|
+
end
|
|
202
|
+
});
|
|
203
|
+
};
|
|
204
|
+
let gesture = null;
|
|
205
|
+
let suppressClick = false;
|
|
206
|
+
const logical = (dx, rtl) => rtl ? -dx : dx;
|
|
207
|
+
const onDown = (event) => {
|
|
208
|
+
gesture = null;
|
|
209
|
+
if (live({ prop }).disabled || event.pointerType === "mouse" && event.button !== 0) return;
|
|
210
|
+
measure();
|
|
211
|
+
gesture = {
|
|
212
|
+
id: event.pointerId,
|
|
213
|
+
x: event.clientX,
|
|
214
|
+
y: event.clientY,
|
|
215
|
+
axis: "pending",
|
|
216
|
+
rtl: win.getComputedStyle(root).direction === "rtl",
|
|
217
|
+
base: getSwipeActionRestOffset(openNow(), widthsOf(context, live({ prop }))),
|
|
218
|
+
samples: [],
|
|
219
|
+
captured: false
|
|
220
|
+
};
|
|
221
|
+
suppressClick = false;
|
|
222
|
+
};
|
|
223
|
+
const onMove = (event) => {
|
|
224
|
+
if (!gesture || event.pointerId !== gesture.id) return;
|
|
225
|
+
const dx = event.clientX - gesture.x, dy = event.clientY - gesture.y;
|
|
226
|
+
if (gesture.axis === "pending") gesture.axis = lockGestureAxis(dx, dy);
|
|
227
|
+
if (gesture.axis === "cross") {
|
|
228
|
+
gesture = null;
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (gesture.axis !== "main") return;
|
|
232
|
+
if (!gesture.captured) {
|
|
233
|
+
gesture.captured = true;
|
|
234
|
+
try {
|
|
235
|
+
track.setPointerCapture?.(event.pointerId);
|
|
236
|
+
} catch {}
|
|
237
|
+
}
|
|
238
|
+
const delta = logical(dx, gesture.rtl);
|
|
239
|
+
gesture.samples.push({
|
|
240
|
+
position: delta,
|
|
241
|
+
time: event.timeStamp
|
|
242
|
+
});
|
|
243
|
+
send({
|
|
244
|
+
type: "DRAG.MOVE",
|
|
245
|
+
offset: clampSwipeActionOffset(gesture.base + delta, widthsOf(context, live({ prop })))
|
|
246
|
+
});
|
|
247
|
+
};
|
|
248
|
+
const onUp = (event) => {
|
|
249
|
+
if (!gesture || event.pointerId !== gesture.id) return;
|
|
250
|
+
const done = gesture;
|
|
251
|
+
gesture = null;
|
|
252
|
+
if (done.axis !== "main") return;
|
|
253
|
+
suppressClick = true;
|
|
254
|
+
const delta = logical(event.clientX - done.x, done.rtl);
|
|
255
|
+
done.samples.push({
|
|
256
|
+
position: delta,
|
|
257
|
+
time: event.timeStamp
|
|
258
|
+
});
|
|
259
|
+
send({
|
|
260
|
+
type: "DRAG.END",
|
|
261
|
+
side: resolveSwipeActionRelease({
|
|
262
|
+
open: openNow(),
|
|
263
|
+
delta,
|
|
264
|
+
velocity: sampleVelocity(done.samples, event.timeStamp),
|
|
265
|
+
widths: widthsOf(context, live({ prop }))
|
|
266
|
+
})
|
|
267
|
+
});
|
|
268
|
+
};
|
|
269
|
+
const onCancel = (event) => {
|
|
270
|
+
if (!gesture || event.pointerId !== gesture.id) return;
|
|
271
|
+
const done = gesture;
|
|
272
|
+
gesture = null;
|
|
273
|
+
if (done.axis === "main") send({
|
|
274
|
+
type: "DRAG.END",
|
|
275
|
+
side: openNow()
|
|
276
|
+
});
|
|
277
|
+
};
|
|
278
|
+
const onContentClick = (event) => {
|
|
279
|
+
const inContent = !!event.target?.closest?.(`[id="${id.content}"]`);
|
|
280
|
+
if (suppressClick || inContent && openNow()) {
|
|
281
|
+
event.preventDefault();
|
|
282
|
+
event.stopPropagation();
|
|
283
|
+
if (!suppressClick) send({ type: "CLOSE" });
|
|
284
|
+
}
|
|
285
|
+
suppressClick = false;
|
|
286
|
+
};
|
|
287
|
+
const onOutside = (event) => {
|
|
288
|
+
const target = event.target;
|
|
289
|
+
if (openNow() && live({ prop }).closeOnTouchOutside && target && !root.contains(target)) send({ type: "CLOSE" });
|
|
290
|
+
};
|
|
291
|
+
const onFocusIn = (event) => {
|
|
292
|
+
const which = (event.target?.closest?.("[data-scope=\"swipe-action\"][data-part=\"actions\"]"))?.getAttribute("data-side");
|
|
293
|
+
if ((which === "start" || which === "end") && openNow() !== which) {
|
|
294
|
+
measure();
|
|
295
|
+
send({
|
|
296
|
+
type: "OPEN.SET",
|
|
297
|
+
side: which
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
const onFocusOut = (event) => {
|
|
302
|
+
const next = event.relatedTarget;
|
|
303
|
+
if (openNow() && (!next || !root.contains(next))) send({ type: "CLOSE" });
|
|
304
|
+
};
|
|
305
|
+
track.addEventListener("pointerdown", onDown);
|
|
306
|
+
track.addEventListener("pointermove", onMove);
|
|
307
|
+
track.addEventListener("pointerup", onUp);
|
|
308
|
+
track.addEventListener("pointercancel", onCancel);
|
|
309
|
+
track.addEventListener("click", onContentClick, true);
|
|
310
|
+
root.addEventListener("focusin", onFocusIn);
|
|
311
|
+
root.addEventListener("focusout", onFocusOut);
|
|
312
|
+
doc.addEventListener("pointerdown", onOutside, true);
|
|
313
|
+
const Observer = win.ResizeObserver, observer = Observer ? new Observer(measure) : null;
|
|
314
|
+
for (const group of [scope.getById(id.start), scope.getById(id.end)]) if (group) observer?.observe(group);
|
|
315
|
+
measure();
|
|
316
|
+
return () => {
|
|
317
|
+
gesture = null;
|
|
318
|
+
observer?.disconnect();
|
|
319
|
+
track.removeEventListener("pointerdown", onDown);
|
|
320
|
+
track.removeEventListener("pointermove", onMove);
|
|
321
|
+
track.removeEventListener("pointerup", onUp);
|
|
322
|
+
track.removeEventListener("pointercancel", onCancel);
|
|
323
|
+
track.removeEventListener("click", onContentClick, true);
|
|
324
|
+
root.removeEventListener("focusin", onFocusIn);
|
|
325
|
+
root.removeEventListener("focusout", onFocusOut);
|
|
326
|
+
doc.removeEventListener("pointerdown", onOutside, true);
|
|
327
|
+
};
|
|
328
|
+
} }
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
const callKeyDown = (handler, event) => {
|
|
332
|
+
for (const item of Array.isArray(handler) ? handler : [handler]) if (typeof item === "function") item(event);
|
|
333
|
+
};
|
|
334
|
+
function connectSwipeAction(service, normalize, options = {}) {
|
|
335
|
+
const state = live(service), id = ids(service.scope), open = resolveSwipeActionOpen(state, service.context.get("open"));
|
|
336
|
+
const dragging = service.context.get("dragging"), offset = dragging ? service.context.get("offset") : getSwipeActionRestOffset(open, widthsOf(service.context, state));
|
|
337
|
+
const count = open ? state[open].length : 0;
|
|
338
|
+
const part = (name) => ({
|
|
339
|
+
"data-scope": "swipe-action",
|
|
340
|
+
"data-part": name
|
|
341
|
+
});
|
|
342
|
+
const show = (which = state.end.length ? "end" : "start") => service.send({
|
|
343
|
+
type: "OPEN.SET",
|
|
344
|
+
side: which
|
|
345
|
+
});
|
|
346
|
+
const close = () => service.send({ type: "CLOSE" });
|
|
347
|
+
return {
|
|
348
|
+
open,
|
|
349
|
+
dragging,
|
|
350
|
+
startActions: state.start,
|
|
351
|
+
endActions: state.end,
|
|
352
|
+
statusText: open ? state.openedText.replace(/\{count\}/g, String(count)) : "",
|
|
353
|
+
show,
|
|
354
|
+
close,
|
|
355
|
+
getRootProps: () => normalize.element({
|
|
356
|
+
...part("root"),
|
|
357
|
+
id: id.root,
|
|
358
|
+
tabIndex: -1,
|
|
359
|
+
"data-state": open ? "open" : "closed",
|
|
360
|
+
"data-open": open ?? void 0,
|
|
361
|
+
"data-disabled": state.disabled ? "true" : void 0,
|
|
362
|
+
"data-dragging": dragging ? "true" : void 0,
|
|
363
|
+
onKeyDown(event) {
|
|
364
|
+
callKeyDown(options.onKeyDown, event);
|
|
365
|
+
if (!event.defaultPrevented && event.key === "Escape" && open) {
|
|
366
|
+
event.preventDefault();
|
|
367
|
+
service.send({
|
|
368
|
+
type: "CLOSE",
|
|
369
|
+
restoreFocus: true
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}),
|
|
374
|
+
getTrackProps: () => normalize.element({
|
|
375
|
+
...part("track"),
|
|
376
|
+
id: id.track,
|
|
377
|
+
"data-dragging": dragging ? "true" : void 0,
|
|
378
|
+
style: { "--qw-swipe-action-offset": `${offset}px` }
|
|
379
|
+
}),
|
|
380
|
+
getActionsProps: (which) => normalize.element({
|
|
381
|
+
...part("actions"),
|
|
382
|
+
id: id[which],
|
|
383
|
+
"data-side": which,
|
|
384
|
+
"data-open": open === which ? "true" : void 0,
|
|
385
|
+
hidden: !state[which].length || void 0
|
|
386
|
+
}),
|
|
387
|
+
getActionProps: (item) => normalize.button({
|
|
388
|
+
...part("action"),
|
|
389
|
+
type: "button",
|
|
390
|
+
"data-key": item.key,
|
|
391
|
+
"data-side": item.side,
|
|
392
|
+
"data-color": item.color,
|
|
393
|
+
disabled: item.disabled || state.disabled,
|
|
394
|
+
onClick(event) {
|
|
395
|
+
if (!event.defaultPrevented) service.send({
|
|
396
|
+
type: "ACTION",
|
|
397
|
+
key: item.key,
|
|
398
|
+
side: item.side
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
}),
|
|
402
|
+
getContentProps: () => normalize.element({
|
|
403
|
+
...part("content"),
|
|
404
|
+
id: id.content
|
|
405
|
+
}),
|
|
406
|
+
getStatusProps: () => normalize.element({
|
|
407
|
+
...part("status"),
|
|
408
|
+
role: "status",
|
|
409
|
+
"aria-live": "polite",
|
|
410
|
+
style: visuallyHiddenStyle
|
|
411
|
+
})
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
//#endregion
|
|
415
|
+
export { SWIPE_ACTION_COLORS, SWIPE_ACTION_DISTANCE_RATIO, SWIPE_ACTION_PARTS, SWIPE_ACTION_SIDES, clampSwipeActionOffset, connectSwipeAction, createSwipeActionProps, getSwipeActionRestOffset, resolveSwipeActionOpen, resolveSwipeActionRelease, resolveSwipeActionState, swipeActionMachine };
|
|
416
|
+
|
|
417
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/swipe-action/swipe-action.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\";\nimport { lockGestureAxis, resolveSwipeIntent, sampleVelocity, type GestureAxis, type GestureSample } from \"../swiper/gesture.js\";\n\n/** Logical sides: start actions sit at inline-start (left in LTR, right in RTL). */\nexport const SWIPE_ACTION_SIDES = [\"start\", \"end\"] as const;\nexport const SWIPE_ACTION_COLORS = [\"default\", \"primary\", \"warning\", \"danger\"] as const;\n/** Stable DOM parts shared by every adapter. */\nexport const SWIPE_ACTION_PARTS = [\"root\", \"track\", \"actions\", \"action\", \"content\", \"status\"] as const;\n/** Share of an action group's width that commits opening/closing; flicks commit earlier. */\nexport const SWIPE_ACTION_DISTANCE_RATIO = 0.4;\nexport type SwipeActionSide = (typeof SWIPE_ACTION_SIDES)[number];\nexport type SwipeActionColor = (typeof SWIPE_ACTION_COLORS)[number];\n/** Scalar action. Rich action content is intentionally not supported so all stacks render the same button. */\nexport interface SwipeActionItem { key: string; text: string; color?: SwipeActionColor; disabled?: boolean }\nexport interface SwipeActionOpenChangeDetails { open: SwipeActionSide | null }\nexport interface SwipeActionActionDetails { key: string; side: SwipeActionSide }\n\nexport interface QwSwipeActionProps {\n /** Page-unique instance identity; adapters generate one when omitted. */\n id?: string;\n /** Actions revealed by swiping toward inline-end (antd-mobile leftActions in LTR). */\n startActions?: readonly SwipeActionItem[];\n /** Actions revealed by swiping toward inline-start (antd-mobile rightActions in LTR). */\n endActions?: readonly SwipeActionItem[];\n /** Controlled open side; null is controlled closed, undefined enables Core-owned state. */\n open?: SwipeActionSide | null;\n defaultOpen?: SwipeActionSide | null;\n /** Close after an action is activated; defaults to true. */\n closeOnAction?: boolean;\n /** Close when the user presses outside the component; defaults to true. */\n closeOnTouchOutside?: boolean;\n /** Ignore gestures and disable actions; an open item closes. */\n disabled?: boolean;\n /** Visually hidden status while open, with {count}; defaults to 已展开 {count} 个操作. */\n openedText?: string;\n onOpenChange?: (details: SwipeActionOpenChangeDetails) => void;\n onAction?: (details: SwipeActionActionDetails) => void;\n}\nexport interface ResolvedSwipeActionItem { key: string; text: string; color: SwipeActionColor; disabled: boolean; side: SwipeActionSide }\nexport interface ResolvedSwipeActionState {\n start: ResolvedSwipeActionItem[]; end: ResolvedSwipeActionItem[]; closeOnAction: boolean; closeOnTouchOutside: boolean; disabled: boolean; openedText: string;\n}\n\nconst MAX_ACTIONS = 8;\nconst items = (value: readonly SwipeActionItem[] | undefined, side: SwipeActionSide): ResolvedSwipeActionItem[] => {\n const seen = new Set<string>(), result: ResolvedSwipeActionItem[] = [];\n for (const item of Array.isArray(value) ? value : []) {\n if (!item || typeof item.key !== \"string\" || !item.key || seen.has(item.key) || typeof item.text !== \"string\" || !item.text.trim()) continue;\n seen.add(item.key);\n result.push({ key: item.key, text: item.text, color: SWIPE_ACTION_COLORS.includes(item.color!) ? item.color! : \"default\", disabled: !!item.disabled, side });\n if (result.length === MAX_ACTIONS) break;\n }\n return result;\n};\nconst side = (value: unknown): SwipeActionSide | null => value === \"start\" || value === \"end\" ? value : null;\n\n/** Invalid/duplicate/empty actions are dropped; at most 8 per side. */\nexport function resolveSwipeActionState(props: QwSwipeActionProps = {}): ResolvedSwipeActionState {\n return {\n start: items(props.startActions, \"start\"), end: items(props.endActions, \"end\"),\n closeOnAction: props.closeOnAction !== false, closeOnTouchOutside: props.closeOnTouchOutside !== false, disabled: !!props.disabled,\n openedText: typeof props.openedText === \"string\" && props.openedText.trim() ? props.openedText : \"已展开 {count} 个操作\",\n };\n}\n/** A side can only be open when it has actions and the component is enabled. */\nexport function resolveSwipeActionOpen(state: ResolvedSwipeActionState, open: SwipeActionSide | null | undefined): SwipeActionSide | null {\n const value = side(open);\n return !value || state.disabled || !state[value].length ? null : value;\n}\n/** Resting logical offset: positive reveals start actions. */\nexport function getSwipeActionRestOffset(open: SwipeActionSide | null, widths: { start: number; end: number }): number {\n return open === \"start\" ? widths.start : open === \"end\" ? -widths.end : 0;\n}\n/** Logical drag offset from the resting position, clamped to the measured action widths. */\nexport function clampSwipeActionOffset(offset: number, widths: { start: number; end: number }): number {\n return Math.min(Math.max(0, widths.start), Math.max(-Math.max(0, widths.end), Number.isFinite(offset) ? offset : 0));\n}\n/** Release decision. `delta` is the logical drag distance (positive = toward inline-end). */\nexport function resolveSwipeActionRelease(input: { open: SwipeActionSide | null; delta: number; velocity: number; widths: { start: number; end: number } }): SwipeActionSide | null {\n const { open, delta, velocity, widths } = input;\n const intent = (size: number) => resolveSwipeIntent({ distance: delta, velocity, size, ratio: SWIPE_ACTION_DISTANCE_RATIO });\n if (open === \"end\") return intent(widths.end) > 0 ? null : \"end\";\n if (open === \"start\") return intent(widths.start) < 0 ? null : \"start\";\n if (delta > 0 && widths.start > 0 && intent(widths.start) > 0) return \"start\";\n if (delta < 0 && widths.end > 0 && intent(widths.end) < 0) return \"end\";\n return null;\n}\nexport function createSwipeActionProps(props: QwSwipeActionProps = {}): QwSwipeActionProps {\n if (props.id !== undefined && (typeof props.id !== \"string\" || !props.id.trim())) throw new TypeError(\"SwipeAction requires a nonempty instance id when provided\");\n return { ...props, defaultOpen: side(props.defaultOpen), open: props.open === undefined ? undefined : side(props.open) };\n}\n\nexport interface QwSwipeActionSchema {\n props: QwSwipeActionProps;\n context: { open: SwipeActionSide | null; offset: number; dragging: boolean; startWidth: number; endWidth: number };\n state: \"ready\";\n action: \"setOpen\" | \"dragMove\" | \"dragEnd\" | \"measure\" | \"activate\" | \"close\" | \"closeIfDisabled\";\n effect: \"trackGestures\";\n event:\n | { type: \"OPEN.SET\"; side: SwipeActionSide | null }\n | { type: \"CLOSE\"; restoreFocus?: boolean }\n | { type: \"DRAG.MOVE\"; offset: number }\n | { type: \"DRAG.END\"; side: SwipeActionSide | null }\n | { type: \"MEASURE\"; start: number; end: number }\n | { type: \"ACTION\"; key: string; side: SwipeActionSide };\n}\nexport type QwSwipeActionMachine = Machine<QwSwipeActionSchema>;\nexport type QwSwipeActionService = Service<QwSwipeActionSchema>;\nconst ids = (scope: QwSwipeActionService[\"scope\"]) => ({ root: `swipe-action:${scope.id}`, track: `swipe-action:${scope.id}:track`, content: `swipe-action:${scope.id}:content`,\n start: `swipe-action:${scope.id}:start`, end: `swipe-action:${scope.id}:end` });\nconst live = (service: Pick<QwSwipeActionService, \"prop\">) => resolveSwipeActionState({\n startActions: service.prop(\"startActions\"), endActions: service.prop(\"endActions\"), closeOnAction: service.prop(\"closeOnAction\"),\n closeOnTouchOutside: service.prop(\"closeOnTouchOutside\"), disabled: service.prop(\"disabled\"), openedText: service.prop(\"openedText\"),\n});\n/** Measured widths, zeroed for a side without actions (its hidden group may still report a stale size). */\nconst widthsOf = (context: Pick<QwSwipeActionService[\"context\"], \"get\">, state: ResolvedSwipeActionState) => ({\n start: state.start.length && !state.disabled ? context.get(\"startWidth\") : 0, end: state.end.length && !state.disabled ? context.get(\"endWidth\") : 0 });\n/** Move focus off an action that is about to be hidden, so it never stays on clipped content. */\nfunction releaseFocus(scope: QwSwipeActionService[\"scope\"]): void {\n const root = scope.getById<HTMLElement>(ids(scope).root), active = root?.ownerDocument.activeElement;\n if (root && active && active !== root && active.closest?.('[data-scope=\"swipe-action\"][data-part=\"actions\"]') && root.contains(active)) root.focus({ preventScroll: true });\n}\n\n/** Core owns gestures, axis locking, outside/close handling, focus-driven opening and cleanup. */\nexport const swipeActionMachine: QwSwipeActionMachine = createMachine<QwSwipeActionSchema>({\n props: ({ props }) => createSwipeActionProps(props), initialState: () => \"ready\", states: { ready: {} },\n context: ({ bindable, prop }) => ({\n open: bindable<SwipeActionSide | null>(() => ({ defaultValue: prop(\"defaultOpen\") ?? null, value: prop(\"open\"), onChange(open) { prop(\"onOpenChange\")?.({ open }); } })),\n offset: bindable(() => ({ defaultValue: 0 })), dragging: bindable(() => ({ defaultValue: false })),\n startWidth: bindable(() => ({ defaultValue: 0 })), endWidth: bindable(() => ({ defaultValue: 0 })),\n }),\n watch({ track, prop, action }) { track([() => prop(\"disabled\")], () => action([\"closeIfDisabled\"])); },\n on: {\n \"OPEN.SET\": { actions: [\"setOpen\"] }, CLOSE: { actions: [\"close\"] }, \"DRAG.MOVE\": { actions: [\"dragMove\"] }, \"DRAG.END\": { actions: [\"dragEnd\"] },\n MEASURE: { actions: [\"measure\"] }, ACTION: { actions: [\"activate\"] },\n },\n effects: [\"trackGestures\"],\n implementations: {\n actions: {\n setOpen({ event, context, prop }) {\n if (event.type !== \"OPEN.SET\") return;\n const state = live({ prop }), next = resolveSwipeActionOpen(state, event.side);\n if (next !== resolveSwipeActionOpen(state, context.get(\"open\"))) context.set(\"open\", next);\n },\n close({ event, context, prop, scope }) {\n if (event.type === \"CLOSE\" && event.restoreFocus) releaseFocus(scope);\n if (resolveSwipeActionOpen(live({ prop }), context.get(\"open\")) !== null) context.set(\"open\", null);\n },\n closeIfDisabled({ context, prop }) { if (prop(\"disabled\") && side(context.get(\"open\"))) context.set(\"open\", null); },\n dragMove({ event, context }) { if (event.type === \"DRAG.MOVE\") { context.set(\"dragging\", true); context.set(\"offset\", event.offset); } },\n dragEnd({ event, context, prop }) {\n if (event.type !== \"DRAG.END\") return;\n context.set(\"dragging\", false); context.set(\"offset\", 0);\n const state = live({ prop }), next = resolveSwipeActionOpen(state, event.side);\n if (next !== resolveSwipeActionOpen(state, context.get(\"open\"))) context.set(\"open\", next);\n },\n measure({ event, context }) { if (event.type === \"MEASURE\") { context.set(\"startWidth\", event.start); context.set(\"endWidth\", event.end); } },\n activate({ event, context, prop, scope }) {\n if (event.type !== \"ACTION\") return;\n const state = live({ prop }), item = state[event.side].find((action) => action.key === event.key);\n if (!item || item.disabled || state.disabled) return;\n prop(\"onAction\")?.({ key: item.key, side: item.side });\n if (state.closeOnAction && side(context.get(\"open\"))) { releaseFocus(scope); context.set(\"open\", null); }\n },\n },\n effects: {\n trackGestures({ scope, prop, context, send }) {\n const id = ids(scope), root = scope.getById<HTMLElement>(id.root), track = scope.getById<HTMLElement>(id.track), win = root?.ownerDocument.defaultView;\n if (!root || !track || !win) return;\n const doc = root.ownerDocument;\n const openNow = () => resolveSwipeActionOpen(live({ prop }), context.get(\"open\"));\n const measure = () => {\n const start = scope.getById<HTMLElement>(id.start)?.offsetWidth ?? 0, end = scope.getById<HTMLElement>(id.end)?.offsetWidth ?? 0;\n if (start !== context.get(\"startWidth\") || end !== context.get(\"endWidth\")) send({ type: \"MEASURE\", start, end });\n };\n let gesture: { id: number; x: number; y: number; axis: GestureAxis; rtl: boolean; base: number; samples: GestureSample[]; captured: boolean } | null = null;\n let suppressClick = false;\n const logical = (dx: number, rtl: boolean) => rtl ? -dx : dx;\n const onDown = (event: PointerEvent) => {\n gesture = null;\n if (live({ prop }).disabled || (event.pointerType === \"mouse\" && event.button !== 0)) return;\n measure();\n gesture = { id: event.pointerId, x: event.clientX, y: event.clientY, axis: \"pending\", rtl: win.getComputedStyle(root).direction === \"rtl\",\n base: getSwipeActionRestOffset(openNow(), widthsOf(context, live({ prop }))), samples: [], captured: false };\n suppressClick = false;\n };\n const onMove = (event: PointerEvent) => {\n if (!gesture || event.pointerId !== gesture.id) return;\n const dx = event.clientX - gesture.x, dy = event.clientY - gesture.y;\n if (gesture.axis === \"pending\") gesture.axis = lockGestureAxis(dx, dy);\n // Vertical intent: let the page or list scroll natively and forget this gesture.\n if (gesture.axis === \"cross\") { gesture = null; return; }\n if (gesture.axis !== \"main\") return;\n if (!gesture.captured) { gesture.captured = true; try { track.setPointerCapture?.(event.pointerId); } catch { /* pointer already released */ } }\n const delta = logical(dx, gesture.rtl);\n gesture.samples.push({ position: delta, time: event.timeStamp });\n send({ type: \"DRAG.MOVE\", offset: clampSwipeActionOffset(gesture.base + delta, widthsOf(context, live({ prop }))) });\n };\n const onUp = (event: PointerEvent) => {\n if (!gesture || event.pointerId !== gesture.id) return;\n const done = gesture; gesture = null;\n if (done.axis !== \"main\") return;\n suppressClick = true;\n const delta = logical(event.clientX - done.x, done.rtl);\n done.samples.push({ position: delta, time: event.timeStamp });\n send({ type: \"DRAG.END\", side: resolveSwipeActionRelease({ open: openNow(), delta, velocity: sampleVelocity(done.samples, event.timeStamp), widths: widthsOf(context, live({ prop })) }) });\n };\n const onCancel = (event: PointerEvent) => {\n if (!gesture || event.pointerId !== gesture.id) return;\n const done = gesture; gesture = null;\n if (done.axis === \"main\") send({ type: \"DRAG.END\", side: openNow() });\n };\n // A drag never clicks; a tap on open content closes instead of activating it.\n const onContentClick = (event: Event) => {\n const inContent = !!(event.target as Element | null)?.closest?.(`[id=\"${id.content}\"]`);\n if (suppressClick || (inContent && openNow())) {\n event.preventDefault(); event.stopPropagation();\n if (!suppressClick) send({ type: \"CLOSE\" });\n }\n suppressClick = false;\n };\n const onOutside = (event: Event) => {\n const target = event.target as Node | null;\n if (openNow() && live({ prop }).closeOnTouchOutside && target && !root.contains(target)) send({ type: \"CLOSE\" });\n };\n // Keyboard alternative: focusing an action reveals its side; leaving the component closes it.\n const onFocusIn = (event: FocusEvent) => {\n const group = (event.target as Element | null)?.closest?.('[data-scope=\"swipe-action\"][data-part=\"actions\"]');\n const which = group?.getAttribute(\"data-side\");\n if ((which === \"start\" || which === \"end\") && openNow() !== which) { measure(); send({ type: \"OPEN.SET\", side: which }); }\n };\n const onFocusOut = (event: FocusEvent) => { const next = event.relatedTarget as Node | null; if (openNow() && (!next || !root.contains(next))) send({ type: \"CLOSE\" }); };\n track.addEventListener(\"pointerdown\", onDown); track.addEventListener(\"pointermove\", onMove); track.addEventListener(\"pointerup\", onUp);\n track.addEventListener(\"pointercancel\", onCancel); track.addEventListener(\"click\", onContentClick, true);\n root.addEventListener(\"focusin\", onFocusIn); root.addEventListener(\"focusout\", onFocusOut);\n doc.addEventListener(\"pointerdown\", onOutside, true);\n const Observer = win.ResizeObserver, observer = Observer ? new Observer(measure) : null;\n for (const group of [scope.getById<HTMLElement>(id.start), scope.getById<HTMLElement>(id.end)]) if (group) observer?.observe(group);\n measure();\n return () => {\n gesture = null; observer?.disconnect();\n track.removeEventListener(\"pointerdown\", onDown); track.removeEventListener(\"pointermove\", onMove); track.removeEventListener(\"pointerup\", onUp);\n track.removeEventListener(\"pointercancel\", onCancel); track.removeEventListener(\"click\", onContentClick, true);\n root.removeEventListener(\"focusin\", onFocusIn); root.removeEventListener(\"focusout\", onFocusOut);\n doc.removeEventListener(\"pointerdown\", onOutside, true);\n };\n },\n },\n },\n});\n\nexport interface QwSwipeActionApi<T extends PropTypes = PropTypes> {\n open: SwipeActionSide | null; dragging: boolean;\n startActions: ResolvedSwipeActionItem[]; endActions: ResolvedSwipeActionItem[];\n statusText: string;\n show(side?: SwipeActionSide): void; close(): void;\n getRootProps(): T[\"element\"];\n getTrackProps(): T[\"element\"];\n getActionsProps(side: SwipeActionSide): T[\"element\"];\n getActionProps(item: ResolvedSwipeActionItem): T[\"button\"];\n getContentProps(): T[\"element\"];\n getStatusProps(): T[\"element\"];\n}\nexport interface SwipeActionDomEvent { key: string; defaultPrevented: boolean; preventDefault(): void }\ntype SwipeActionCallerHandler = (event: SwipeActionDomEvent) => void;\nexport interface SwipeActionConnectOptions { onKeyDown?(event: SwipeActionDomEvent): void }\nconst callKeyDown = (handler: unknown, event: SwipeActionDomEvent) => {\n for (const item of Array.isArray(handler) ? handler : [handler]) if (typeof item === \"function\") (item as SwipeActionCallerHandler)(event);\n};\n\nexport function connectSwipeAction<T extends PropTypes>(service: QwSwipeActionService, normalize: NormalizeProps<T>, options: SwipeActionConnectOptions = {}): QwSwipeActionApi<T> {\n const state = live(service), id = ids(service.scope), open = resolveSwipeActionOpen(state, service.context.get(\"open\"));\n const dragging = service.context.get(\"dragging\"), offset = dragging ? service.context.get(\"offset\") : getSwipeActionRestOffset(open, widthsOf(service.context, state));\n const count = open ? state[open].length : 0;\n const part = (name: string) => ({ \"data-scope\": \"swipe-action\", \"data-part\": name });\n const show = (which: SwipeActionSide = state.end.length ? \"end\" : \"start\") => service.send({ type: \"OPEN.SET\", side: which });\n const close = () => service.send({ type: \"CLOSE\" });\n return {\n open, dragging, startActions: state.start, endActions: state.end,\n statusText: open ? state.openedText.replace(/\\{count\\}/g, String(count)) : \"\",\n show, close,\n getRootProps: () => normalize.element({ ...part(\"root\"), id: id.root, tabIndex: -1, \"data-state\": open ? \"open\" : \"closed\", \"data-open\": open ?? undefined,\n \"data-disabled\": state.disabled ? \"true\" : undefined, \"data-dragging\": dragging ? \"true\" : undefined,\n onKeyDown(event: SwipeActionDomEvent) {\n callKeyDown(options.onKeyDown, event);\n if (!event.defaultPrevented && event.key === \"Escape\" && open) { event.preventDefault(); service.send({ type: \"CLOSE\", restoreFocus: true }); }\n } }),\n getTrackProps: () => normalize.element({ ...part(\"track\"), id: id.track, \"data-dragging\": dragging ? \"true\" : undefined, style: { \"--qw-swipe-action-offset\": `${offset}px` } }),\n getActionsProps: (which) => normalize.element({ ...part(\"actions\"), id: id[which], \"data-side\": which, \"data-open\": open === which ? \"true\" : undefined, hidden: !state[which].length || undefined }),\n getActionProps: (item) => normalize.button({ ...part(\"action\"), type: \"button\", \"data-key\": item.key, \"data-side\": item.side, \"data-color\": item.color,\n disabled: item.disabled || state.disabled, onClick(event: { defaultPrevented: boolean }) { if (!event.defaultPrevented) service.send({ type: \"ACTION\", key: item.key, side: item.side }); } }),\n getContentProps: () => normalize.element({ ...part(\"content\"), id: id.content }),\n getStatusProps: () => normalize.element({ ...part(\"status\"), role: \"status\", \"aria-live\": \"polite\", style: visuallyHiddenStyle }),\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { type Machine, type Service } from "@zag-js/core";
|
|
2
|
+
import type { NormalizeProps, PropTypes } from "@zag-js/types";
|
|
3
|
+
/** Logical sides: start actions sit at inline-start (left in LTR, right in RTL). */
|
|
4
|
+
export declare const SWIPE_ACTION_SIDES: readonly ["start", "end"];
|
|
5
|
+
export declare const SWIPE_ACTION_COLORS: readonly ["default", "primary", "warning", "danger"];
|
|
6
|
+
/** Stable DOM parts shared by every adapter. */
|
|
7
|
+
export declare const SWIPE_ACTION_PARTS: readonly ["root", "track", "actions", "action", "content", "status"];
|
|
8
|
+
/** Share of an action group's width that commits opening/closing; flicks commit earlier. */
|
|
9
|
+
export declare const SWIPE_ACTION_DISTANCE_RATIO = 0.4;
|
|
10
|
+
export type SwipeActionSide = (typeof SWIPE_ACTION_SIDES)[number];
|
|
11
|
+
export type SwipeActionColor = (typeof SWIPE_ACTION_COLORS)[number];
|
|
12
|
+
/** Scalar action. Rich action content is intentionally not supported so all stacks render the same button. */
|
|
13
|
+
export interface SwipeActionItem {
|
|
14
|
+
key: string;
|
|
15
|
+
text: string;
|
|
16
|
+
color?: SwipeActionColor;
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface SwipeActionOpenChangeDetails {
|
|
20
|
+
open: SwipeActionSide | null;
|
|
21
|
+
}
|
|
22
|
+
export interface SwipeActionActionDetails {
|
|
23
|
+
key: string;
|
|
24
|
+
side: SwipeActionSide;
|
|
25
|
+
}
|
|
26
|
+
export interface QwSwipeActionProps {
|
|
27
|
+
/** Page-unique instance identity; adapters generate one when omitted. */
|
|
28
|
+
id?: string;
|
|
29
|
+
/** Actions revealed by swiping toward inline-end (antd-mobile leftActions in LTR). */
|
|
30
|
+
startActions?: readonly SwipeActionItem[];
|
|
31
|
+
/** Actions revealed by swiping toward inline-start (antd-mobile rightActions in LTR). */
|
|
32
|
+
endActions?: readonly SwipeActionItem[];
|
|
33
|
+
/** Controlled open side; null is controlled closed, undefined enables Core-owned state. */
|
|
34
|
+
open?: SwipeActionSide | null;
|
|
35
|
+
defaultOpen?: SwipeActionSide | null;
|
|
36
|
+
/** Close after an action is activated; defaults to true. */
|
|
37
|
+
closeOnAction?: boolean;
|
|
38
|
+
/** Close when the user presses outside the component; defaults to true. */
|
|
39
|
+
closeOnTouchOutside?: boolean;
|
|
40
|
+
/** Ignore gestures and disable actions; an open item closes. */
|
|
41
|
+
disabled?: boolean;
|
|
42
|
+
/** Visually hidden status while open, with {count}; defaults to 已展开 {count} 个操作. */
|
|
43
|
+
openedText?: string;
|
|
44
|
+
onOpenChange?: (details: SwipeActionOpenChangeDetails) => void;
|
|
45
|
+
onAction?: (details: SwipeActionActionDetails) => void;
|
|
46
|
+
}
|
|
47
|
+
export interface ResolvedSwipeActionItem {
|
|
48
|
+
key: string;
|
|
49
|
+
text: string;
|
|
50
|
+
color: SwipeActionColor;
|
|
51
|
+
disabled: boolean;
|
|
52
|
+
side: SwipeActionSide;
|
|
53
|
+
}
|
|
54
|
+
export interface ResolvedSwipeActionState {
|
|
55
|
+
start: ResolvedSwipeActionItem[];
|
|
56
|
+
end: ResolvedSwipeActionItem[];
|
|
57
|
+
closeOnAction: boolean;
|
|
58
|
+
closeOnTouchOutside: boolean;
|
|
59
|
+
disabled: boolean;
|
|
60
|
+
openedText: string;
|
|
61
|
+
}
|
|
62
|
+
/** Invalid/duplicate/empty actions are dropped; at most 8 per side. */
|
|
63
|
+
export declare function resolveSwipeActionState(props?: QwSwipeActionProps): ResolvedSwipeActionState;
|
|
64
|
+
/** A side can only be open when it has actions and the component is enabled. */
|
|
65
|
+
export declare function resolveSwipeActionOpen(state: ResolvedSwipeActionState, open: SwipeActionSide | null | undefined): SwipeActionSide | null;
|
|
66
|
+
/** Resting logical offset: positive reveals start actions. */
|
|
67
|
+
export declare function getSwipeActionRestOffset(open: SwipeActionSide | null, widths: {
|
|
68
|
+
start: number;
|
|
69
|
+
end: number;
|
|
70
|
+
}): number;
|
|
71
|
+
/** Logical drag offset from the resting position, clamped to the measured action widths. */
|
|
72
|
+
export declare function clampSwipeActionOffset(offset: number, widths: {
|
|
73
|
+
start: number;
|
|
74
|
+
end: number;
|
|
75
|
+
}): number;
|
|
76
|
+
/** Release decision. `delta` is the logical drag distance (positive = toward inline-end). */
|
|
77
|
+
export declare function resolveSwipeActionRelease(input: {
|
|
78
|
+
open: SwipeActionSide | null;
|
|
79
|
+
delta: number;
|
|
80
|
+
velocity: number;
|
|
81
|
+
widths: {
|
|
82
|
+
start: number;
|
|
83
|
+
end: number;
|
|
84
|
+
};
|
|
85
|
+
}): SwipeActionSide | null;
|
|
86
|
+
export declare function createSwipeActionProps(props?: QwSwipeActionProps): QwSwipeActionProps;
|
|
87
|
+
export interface QwSwipeActionSchema {
|
|
88
|
+
props: QwSwipeActionProps;
|
|
89
|
+
context: {
|
|
90
|
+
open: SwipeActionSide | null;
|
|
91
|
+
offset: number;
|
|
92
|
+
dragging: boolean;
|
|
93
|
+
startWidth: number;
|
|
94
|
+
endWidth: number;
|
|
95
|
+
};
|
|
96
|
+
state: "ready";
|
|
97
|
+
action: "setOpen" | "dragMove" | "dragEnd" | "measure" | "activate" | "close" | "closeIfDisabled";
|
|
98
|
+
effect: "trackGestures";
|
|
99
|
+
event: {
|
|
100
|
+
type: "OPEN.SET";
|
|
101
|
+
side: SwipeActionSide | null;
|
|
102
|
+
} | {
|
|
103
|
+
type: "CLOSE";
|
|
104
|
+
restoreFocus?: boolean;
|
|
105
|
+
} | {
|
|
106
|
+
type: "DRAG.MOVE";
|
|
107
|
+
offset: number;
|
|
108
|
+
} | {
|
|
109
|
+
type: "DRAG.END";
|
|
110
|
+
side: SwipeActionSide | null;
|
|
111
|
+
} | {
|
|
112
|
+
type: "MEASURE";
|
|
113
|
+
start: number;
|
|
114
|
+
end: number;
|
|
115
|
+
} | {
|
|
116
|
+
type: "ACTION";
|
|
117
|
+
key: string;
|
|
118
|
+
side: SwipeActionSide;
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
export type QwSwipeActionMachine = Machine<QwSwipeActionSchema>;
|
|
122
|
+
export type QwSwipeActionService = Service<QwSwipeActionSchema>;
|
|
123
|
+
/** Core owns gestures, axis locking, outside/close handling, focus-driven opening and cleanup. */
|
|
124
|
+
export declare const swipeActionMachine: QwSwipeActionMachine;
|
|
125
|
+
export interface QwSwipeActionApi<T extends PropTypes = PropTypes> {
|
|
126
|
+
open: SwipeActionSide | null;
|
|
127
|
+
dragging: boolean;
|
|
128
|
+
startActions: ResolvedSwipeActionItem[];
|
|
129
|
+
endActions: ResolvedSwipeActionItem[];
|
|
130
|
+
statusText: string;
|
|
131
|
+
show(side?: SwipeActionSide): void;
|
|
132
|
+
close(): void;
|
|
133
|
+
getRootProps(): T["element"];
|
|
134
|
+
getTrackProps(): T["element"];
|
|
135
|
+
getActionsProps(side: SwipeActionSide): T["element"];
|
|
136
|
+
getActionProps(item: ResolvedSwipeActionItem): T["button"];
|
|
137
|
+
getContentProps(): T["element"];
|
|
138
|
+
getStatusProps(): T["element"];
|
|
139
|
+
}
|
|
140
|
+
export interface SwipeActionDomEvent {
|
|
141
|
+
key: string;
|
|
142
|
+
defaultPrevented: boolean;
|
|
143
|
+
preventDefault(): void;
|
|
144
|
+
}
|
|
145
|
+
export interface SwipeActionConnectOptions {
|
|
146
|
+
onKeyDown?(event: SwipeActionDomEvent): void;
|
|
147
|
+
}
|
|
148
|
+
export declare function connectSwipeAction<T extends PropTypes>(service: QwSwipeActionService, normalize: NormalizeProps<T>, options?: SwipeActionConnectOptions): QwSwipeActionApi<T>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal pointer-gesture helpers shared by Swiper and SwipeAction.
|
|
3
|
+
* Pure functions only (no DOM); not exported from any index.
|
|
4
|
+
*/
|
|
5
|
+
/** Movement in CSS pixels before the gesture axis is decided. */
|
|
6
|
+
export declare const GESTURE_SLOP = 8;
|
|
7
|
+
/** Release velocity in px/ms that counts as a flick. */
|
|
8
|
+
export declare const GESTURE_FLICK_VELOCITY = 0.3;
|
|
9
|
+
/** Minimum travel in px for a flick to count. */
|
|
10
|
+
export declare const GESTURE_FLICK_DISTANCE = 12;
|
|
11
|
+
/** Velocity samples older than this window (ms) are ignored. */
|
|
12
|
+
export declare const GESTURE_VELOCITY_WINDOW = 100;
|
|
13
|
+
/** pending: still under the slop; main: the component owns the drag; cross: hand it back to native scrolling. */
|
|
14
|
+
export type GestureAxis = "pending" | "main" | "cross";
|
|
15
|
+
export interface GestureSample {
|
|
16
|
+
position: number;
|
|
17
|
+
time: number;
|
|
18
|
+
}
|
|
19
|
+
/** Decide once per gesture which axis dominates. `vertical` means the component's main axis is block. */
|
|
20
|
+
export declare function lockGestureAxis(dx: number, dy: number, vertical?: boolean, slop?: number): GestureAxis;
|
|
21
|
+
/** Keep only the recent window and return the newest-minus-oldest velocity in px/ms. */
|
|
22
|
+
export declare function sampleVelocity(samples: readonly GestureSample[], now: number, window?: number): number;
|
|
23
|
+
/**
|
|
24
|
+
* Release decision along a signed logical axis (positive = forward).
|
|
25
|
+
* Commits when travel reaches `max(GESTURE_FLICK_DISTANCE, size * ratio)`, or on a same-direction flick.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveSwipeIntent(input: {
|
|
28
|
+
distance: number;
|
|
29
|
+
velocity: number;
|
|
30
|
+
size: number;
|
|
31
|
+
ratio: number;
|
|
32
|
+
}): -1 | 0 | 1;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./swiper.js";
|