@qw-ui/core 0.3.0-next.8 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -37
- package/dist/action-sheet/action-sheet.d.ts +110 -0
- package/dist/action-sheet/index.d.ts +2 -0
- package/dist/action-sheet/index.js +2 -0
- package/dist/action-sheet-Cvcr1S_m.js +183 -0
- package/dist/action-sheet-Cvcr1S_m.js.map +1 -0
- package/dist/area-picker/area-picker.d.ts +113 -0
- package/dist/area-picker/index.d.ts +1 -0
- package/dist/area-picker/index.js +348 -0
- package/dist/area-picker/index.js.map +1 -0
- package/dist/aria-description-CimD2M_C.js +13 -0
- package/dist/aria-description-CimD2M_C.js.map +1 -0
- package/dist/aria-description.d.ts +2 -0
- package/dist/avatar/avatar-load.d.ts +76 -0
- package/dist/avatar/avatar.d.ts +22 -5
- package/dist/avatar/index.d.ts +1 -0
- package/dist/avatar/index.js +57 -18
- package/dist/avatar/index.js.map +1 -1
- package/dist/avatar-load-w9dq05oV.js +139 -0
- package/dist/avatar-load-w9dq05oV.js.map +1 -0
- package/dist/back-top/back-top.d.ts +77 -0
- package/dist/back-top/index.d.ts +1 -0
- package/dist/back-top/index.js +189 -0
- package/dist/back-top/index.js.map +1 -0
- package/dist/badge/badge.d.ts +85 -0
- package/dist/badge/index.d.ts +1 -0
- package/dist/badge/index.js +88 -0
- package/dist/badge/index.js.map +1 -0
- package/dist/button/button.d.ts +13 -0
- package/dist/button/index.js +3 -5
- package/dist/button/index.js.map +1 -1
- package/dist/calendar/calendar.d.ts +100 -0
- package/dist/calendar/index.d.ts +1 -0
- package/dist/calendar/index.js +2 -0
- package/dist/calendar-CmpK3stz.js +363 -0
- package/dist/calendar-CmpK3stz.js.map +1 -0
- package/dist/card/card.d.ts +68 -0
- package/dist/card/index.d.ts +2 -0
- package/dist/card/index.js +2 -0
- package/dist/card-DRtWa6Cr.js +107 -0
- package/dist/card-DRtWa6Cr.js.map +1 -0
- package/dist/cascader/cascader.d.ts +115 -0
- package/dist/cascader/index.d.ts +1 -0
- package/dist/cascader/index.js +2 -0
- package/dist/cascader-D-xMjs7P.js +333 -0
- package/dist/cascader-D-xMjs7P.js.map +1 -0
- package/dist/cell/cell.d.ts +41 -0
- package/dist/cell/index.d.ts +1 -0
- package/dist/cell/index.js +43 -0
- package/dist/cell/index.js.map +1 -0
- package/dist/check-list/check-list.d.ts +78 -0
- package/dist/check-list/index.d.ts +2 -0
- package/dist/check-list/index.js +2 -0
- package/dist/check-list-BvZHQt5w.js +60 -0
- package/dist/check-list-BvZHQt5w.js.map +1 -0
- package/dist/checkbox/checkbox.d.ts +59 -0
- package/dist/checkbox/index.d.ts +2 -0
- package/dist/checkbox/index.js +2 -0
- package/dist/checkbox-BlndJrz5.js +127 -0
- package/dist/checkbox-BlndJrz5.js.map +1 -0
- package/dist/checkbox-group/checkbox-group.d.ts +86 -0
- package/dist/checkbox-group/index.d.ts +3 -0
- package/dist/checkbox-group/index.js +2 -0
- package/dist/checkbox-group-gGfsTv-e.js +223 -0
- package/dist/checkbox-group-gGfsTv-e.js.map +1 -0
- package/dist/choice-group-C4c9m0qe.js +373 -0
- package/dist/choice-group-C4c9m0qe.js.map +1 -0
- package/dist/circle/circle.d.ts +97 -0
- package/dist/circle/index.d.ts +1 -0
- package/dist/circle/index.js +119 -0
- package/dist/circle/index.js.map +1 -0
- package/dist/collapse/collapse.d.ts +98 -0
- package/dist/collapse/index.d.ts +2 -0
- package/dist/collapse/index.js +2 -0
- package/dist/collapse-B969h7-H.js +226 -0
- package/dist/collapse-B969h7-H.js.map +1 -0
- package/dist/countdown/countdown.d.ts +114 -0
- package/dist/countdown/index.d.ts +1 -0
- package/dist/countdown/index.js +309 -0
- package/dist/countdown/index.js.map +1 -0
- package/dist/date-picker/date-picker.d.ts +168 -0
- package/dist/date-picker/index.d.ts +1 -0
- package/dist/date-picker/index.js +401 -0
- package/dist/date-picker/index.js.map +1 -0
- package/dist/descriptions/descriptions.d.ts +69 -0
- package/dist/descriptions/index.d.ts +1 -0
- package/dist/descriptions/index.js +86 -0
- package/dist/descriptions/index.js.map +1 -0
- package/dist/dialog/dialog.d.ts +61 -43
- package/dist/dialog/index.js +73 -19
- package/dist/dialog/index.js.map +1 -1
- package/dist/divider/divider.d.ts +18 -2
- package/dist/divider/index.js +20 -2
- package/dist/divider/index.js.map +1 -1
- package/dist/dropdown/dropdown.d.ts +172 -0
- package/dist/dropdown/index.d.ts +2 -0
- package/dist/dropdown/index.js +467 -0
- package/dist/dropdown/index.js.map +1 -0
- package/dist/ellipsis/ellipsis-layout.d.ts +34 -0
- package/dist/ellipsis/ellipsis.d.ts +88 -0
- package/dist/ellipsis/index.d.ts +2 -0
- package/dist/ellipsis/index.js +320 -0
- package/dist/ellipsis/index.js.map +1 -0
- package/dist/empty/empty-illustration.d.ts +3 -0
- package/dist/empty/empty.d.ts +43 -1
- package/dist/empty/index.js +2 -21
- package/dist/empty-CAgyvhUI.js +166 -0
- package/dist/empty-CAgyvhUI.js.map +1 -0
- package/dist/field/field.d.ts +95 -0
- package/dist/field/index.d.ts +2 -0
- package/dist/field/index.js +2 -0
- package/dist/field-DMHGIMZF.js +241 -0
- package/dist/field-DMHGIMZF.js.map +1 -0
- package/dist/floating-bubble/floating-bubble.d.ts +116 -0
- package/dist/floating-bubble/index.d.ts +1 -0
- package/dist/floating-bubble/index.js +333 -0
- package/dist/floating-bubble/index.js.map +1 -0
- package/dist/floating-panel/floating-panel.d.ts +80 -0
- package/dist/floating-panel/index.d.ts +2 -0
- package/dist/floating-panel/index.js +2 -0
- package/dist/floating-panel-Cbm5njBJ.js +363 -0
- package/dist/floating-panel-Cbm5njBJ.js.map +1 -0
- package/dist/footer/footer.d.ts +94 -0
- package/dist/footer/index.d.ts +1 -0
- package/dist/footer/index.js +154 -0
- package/dist/footer/index.js.map +1 -0
- package/dist/form/connect.d.ts +6 -0
- package/dist/form/form.d.ts +100 -0
- package/dist/form/ids.d.ts +14 -0
- package/dist/form/index.d.ts +13 -0
- package/dist/form/index.js +3 -0
- package/dist/form/methods.d.ts +5 -0
- package/dist/form/model.d.ts +24 -0
- package/dist/form/native.d.ts +25 -0
- package/dist/form/rules.d.ts +40 -0
- package/dist/form/ssr.d.ts +7 -0
- package/dist/form/types.d.ts +150 -0
- package/dist/form-BAGkIEMY.js +1354 -0
- package/dist/form-BAGkIEMY.js.map +1 -0
- package/dist/format-BDUY0C_c.js +89 -0
- package/dist/format-BDUY0C_c.js.map +1 -0
- package/dist/gesture-_SRHIvBm.js +30 -0
- package/dist/gesture-_SRHIvBm.js.map +1 -0
- package/dist/grid/grid-item.d.ts +22 -0
- package/dist/grid/grid.d.ts +42 -0
- package/dist/grid/index.d.ts +2 -0
- package/dist/grid/index.js +73 -0
- package/dist/grid/index.js.map +1 -0
- package/dist/icon/icon.d.ts +37 -1
- package/dist/icon/identity.d.ts +3 -0
- package/dist/icon/index.js +2 -20
- package/dist/icon-Cgdbnk1u.js +77 -0
- package/dist/icon-Cgdbnk1u.js.map +1 -0
- package/dist/image/image-load.d.ts +24 -0
- package/dist/image/image.d.ts +45 -8
- package/dist/image/index.d.ts +1 -0
- package/dist/image/index.js +116 -14
- package/dist/image/index.js.map +1 -1
- package/dist/image-preview/image-preview.d.ts +124 -0
- package/dist/image-preview/index.d.ts +1 -0
- package/dist/image-preview/index.js +450 -0
- package/dist/image-preview/index.js.map +1 -0
- package/dist/index-bar/index-bar.d.ts +121 -0
- package/dist/index-bar/index.d.ts +1 -0
- package/dist/index-bar/index.js +386 -0
- package/dist/index-bar/index.js.map +1 -0
- package/dist/index.d.ts +115 -10
- package/dist/index.js +151 -11
- package/dist/index.js.map +1 -0
- package/dist/infinite-scroll/index.d.ts +1 -0
- package/dist/infinite-scroll/index.js +248 -0
- package/dist/infinite-scroll/index.js.map +1 -0
- package/dist/infinite-scroll/infinite-scroll.d.ts +95 -0
- package/dist/input/index.js +181 -22
- package/dist/input/index.js.map +1 -1
- package/dist/input/input.d.ts +44 -1
- package/dist/layer-IpFrl5--.js +414 -0
- package/dist/layer-IpFrl5--.js.map +1 -0
- package/dist/layout-BRSqi4AQ.js +43 -0
- package/dist/layout-BRSqi4AQ.js.map +1 -0
- package/dist/layout.d.ts +13 -0
- package/dist/list/index.d.ts +2 -0
- package/dist/list/index.js +2 -0
- package/dist/list/list.d.ts +30 -0
- package/dist/list-6-iz-Irh.js +28 -0
- package/dist/list-6-iz-Irh.js.map +1 -0
- package/dist/loading/index.js +45 -2
- package/dist/loading/index.js.map +1 -1
- package/dist/loading/loading.d.ts +45 -2
- package/dist/modal-dialog-machine-CF9_z3Dm.js +487 -0
- package/dist/modal-dialog-machine-CF9_z3Dm.js.map +1 -0
- package/dist/modal-dialog-machine.d.ts +21 -0
- package/dist/modal-dismissable-lifetime.d.ts +21 -0
- package/dist/modal-registry.d.ts +24 -0
- package/dist/modal-render-hydration.d.ts +35 -0
- package/dist/modal-render-runtime.d.ts +19 -0
- package/dist/modal-render-scope.d.ts +63 -0
- package/dist/nav-bar/index.d.ts +1 -0
- package/dist/nav-bar/index.js +115 -0
- package/dist/nav-bar/index.js.map +1 -0
- package/dist/nav-bar/nav-bar.d.ts +76 -0
- package/dist/notice-bar/index.d.ts +2 -0
- package/dist/notice-bar/index.js +2 -0
- package/dist/notice-bar/notice-bar.d.ts +103 -0
- package/dist/notice-bar-DMpwLvRb.js +231 -0
- package/dist/notice-bar-DMpwLvRb.js.map +1 -0
- package/dist/notify/index.d.ts +1 -0
- package/dist/notify/index.js +251 -0
- package/dist/notify/index.js.map +1 -0
- package/dist/notify/notify.d.ts +123 -0
- package/dist/number-keyboard/index.d.ts +1 -0
- package/dist/number-keyboard/index.js +333 -0
- package/dist/number-keyboard/index.js.map +1 -0
- package/dist/number-keyboard/number-keyboard.d.ts +141 -0
- package/dist/overlay-panel/index.d.ts +2 -0
- package/dist/overlay-panel/index.js +2 -0
- package/dist/overlay-panel/overlay-panel.d.ts +20 -0
- package/dist/overlay-panel-Z_qdKeBj.js +26 -0
- package/dist/overlay-panel-Z_qdKeBj.js.map +1 -0
- package/dist/page-indicator/index.d.ts +1 -0
- package/dist/page-indicator/index.js +138 -0
- package/dist/page-indicator/index.js.map +1 -0
- package/dist/page-indicator/page-indicator.d.ts +93 -0
- package/dist/pagination/index.d.ts +1 -0
- package/dist/pagination/index.js +198 -0
- package/dist/pagination/index.js.map +1 -0
- package/dist/pagination/pagination.d.ts +125 -0
- package/dist/password-input/index.d.ts +1 -0
- package/dist/password-input/index.js +317 -0
- package/dist/password-input/index.js.map +1 -0
- package/dist/password-input/password-input.d.ts +144 -0
- package/dist/picker/index.d.ts +8 -0
- package/dist/picker/index.js +2 -0
- package/dist/picker/picker-machine.d.ts +80 -0
- package/dist/picker/picker.d.ts +121 -0
- package/dist/picker/platform.d.ts +84 -0
- package/dist/picker/selection-connect.d.ts +90 -0
- package/dist/picker/selection-model.d.ts +211 -0
- package/dist/picker-BykFntQN.js +1675 -0
- package/dist/picker-BykFntQN.js.map +1 -0
- package/dist/popover/index.d.ts +3 -0
- package/dist/popover/index.js +253 -0
- package/dist/popover/index.js.map +1 -0
- package/dist/popover/layer.d.ts +44 -0
- package/dist/popover/popover.d.ts +104 -0
- package/dist/popover/positioning.d.ts +132 -0
- package/dist/popup/index.d.ts +2 -0
- package/dist/popup/index.js +2 -0
- package/dist/popup/popup.d.ts +60 -0
- package/dist/popup-z5d8IYCt.js +576 -0
- package/dist/popup-z5d8IYCt.js.map +1 -0
- package/dist/portal-BHCNTWhg.js +78 -0
- package/dist/portal-BHCNTWhg.js.map +1 -0
- package/dist/portal.d.ts +61 -0
- package/dist/price/format.d.ts +19 -0
- package/dist/price/index.d.ts +1 -0
- package/dist/price/index.js +154 -0
- package/dist/price/index.js.map +1 -0
- package/dist/price/price.d.ts +88 -0
- package/dist/progress/index.d.ts +1 -0
- package/dist/progress/index.js +2 -0
- package/dist/progress/progress.d.ts +32 -0
- package/dist/progress-f3iYEfdA.js +37 -0
- package/dist/progress-f3iYEfdA.js.map +1 -0
- package/dist/pull-refresh/index.d.ts +1 -0
- package/dist/pull-refresh/index.js +414 -0
- package/dist/pull-refresh/index.js.map +1 -0
- package/dist/pull-refresh/pull-refresh.d.ts +118 -0
- package/dist/radio-group/index.d.ts +3 -0
- package/dist/radio-group/index.js +2 -0
- package/dist/radio-group/radio-group.d.ts +78 -0
- package/dist/radio-group-BOIMuqnS.js +230 -0
- package/dist/radio-group-BOIMuqnS.js.map +1 -0
- package/dist/rate/index.d.ts +1 -0
- package/dist/rate/index.js +2 -0
- package/dist/rate/rate-form.d.ts +28 -0
- package/dist/rate/rate.d.ts +144 -0
- package/dist/rate-5XsU2QkY.js +631 -0
- package/dist/rate-5XsU2QkY.js.map +1 -0
- package/dist/reorder/index.d.ts +1 -0
- package/dist/reorder/index.js +720 -0
- package/dist/reorder/index.js.map +1 -0
- package/dist/reorder/reorder.d.ts +190 -0
- package/dist/result/index.d.ts +1 -0
- package/dist/result/index.js +123 -0
- package/dist/result/index.js.map +1 -0
- package/dist/result/result.d.ts +88 -0
- package/dist/safe-area/index.d.ts +1 -0
- package/dist/safe-area/index.js +42 -0
- package/dist/safe-area/index.js.map +1 -0
- package/dist/safe-area/safe-area.d.ts +28 -0
- package/dist/search-bar/index.js +4 -2
- package/dist/search-bar/index.js.map +1 -1
- package/dist/search-bar/search-bar.d.ts +6 -0
- package/dist/segmented/index.d.ts +2 -0
- package/dist/segmented/index.js +2 -0
- package/dist/segmented/segmented.d.ts +127 -0
- package/dist/segmented-BaU38_L4.js +367 -0
- package/dist/segmented-BaU38_L4.js.map +1 -0
- package/dist/selection-form-BOM_odUk.js +88 -0
- package/dist/selection-form-BOM_odUk.js.map +1 -0
- package/dist/selection-form.d.ts +27 -0
- package/dist/selection-ivXqO1eu.js +55 -0
- package/dist/selection-ivXqO1eu.js.map +1 -0
- package/dist/selection.d.ts +29 -0
- package/dist/selector/choice-group.d.ts +114 -0
- package/dist/selector/index.d.ts +2 -0
- package/dist/selector/index.js +2 -0
- package/dist/selector/selector.d.ts +90 -0
- package/dist/selector-BU2MMJ4N.js +93 -0
- package/dist/selector-BU2MMJ4N.js.map +1 -0
- package/dist/share-sheet/index.d.ts +1 -0
- package/dist/share-sheet/index.js +138 -0
- package/dist/share-sheet/index.js.map +1 -0
- package/dist/share-sheet/share-sheet.d.ts +139 -0
- package/dist/side-nav/index.d.ts +1 -0
- package/dist/side-nav/index.js +99 -0
- package/dist/side-nav/index.js.map +1 -0
- package/dist/side-nav/side-nav.d.ts +94 -0
- package/dist/skeleton/index.js +51 -2
- package/dist/skeleton/index.js.map +1 -1
- package/dist/skeleton/skeleton.d.ts +34 -3
- package/dist/slider/index.d.ts +1 -0
- package/dist/slider/index.js +482 -0
- package/dist/slider/index.js.map +1 -0
- package/dist/slider/slider.d.ts +174 -0
- package/dist/space/index.d.ts +1 -0
- package/dist/space/index.js +52 -0
- package/dist/space/index.js.map +1 -0
- package/dist/space/space.d.ts +46 -0
- package/dist/statistic/index.d.ts +1 -0
- package/dist/statistic/index.js +152 -0
- package/dist/statistic/index.js.map +1 -0
- package/dist/statistic/statistic.d.ts +101 -0
- package/dist/stepper/index.d.ts +1 -0
- package/dist/stepper/index.js +172 -0
- package/dist/stepper/index.js.map +1 -0
- package/dist/stepper/stepper.d.ts +161 -0
- package/dist/steps/index.d.ts +1 -0
- package/dist/steps/index.js +72 -0
- package/dist/steps/index.js.map +1 -0
- package/dist/steps/steps.d.ts +67 -0
- package/dist/sticky/index.d.ts +1 -0
- package/dist/sticky/index.js +145 -0
- package/dist/sticky/index.js.map +1 -0
- package/dist/sticky/sticky.d.ts +70 -0
- package/dist/swipe-action/index.d.ts +1 -0
- package/dist/swipe-action/index.js +417 -0
- package/dist/swipe-action/index.js.map +1 -0
- package/dist/swipe-action/swipe-action.d.ts +148 -0
- package/dist/swiper/gesture.d.ts +32 -0
- package/dist/swiper/index.d.ts +1 -0
- package/dist/swiper/index.js +2 -0
- package/dist/swiper/swiper.d.ts +177 -0
- package/dist/swiper-BKivDkHp.js +550 -0
- package/dist/swiper-BKivDkHp.js.map +1 -0
- package/dist/switch/index.d.ts +1 -0
- package/dist/switch/index.js +168 -0
- package/dist/switch/index.js.map +1 -0
- package/dist/switch/switch.d.ts +142 -0
- package/dist/tabbar/index.d.ts +1 -0
- package/dist/tabbar/index.js +95 -0
- package/dist/tabbar/index.js.map +1 -0
- package/dist/tabbar/tabbar.d.ts +119 -0
- package/dist/tabs/index.js +22 -1
- package/dist/tabs/index.js.map +1 -1
- package/dist/tabs/tabs.d.ts +12 -8
- package/dist/tag/index.js +123 -2
- package/dist/tag/index.js.map +1 -1
- package/dist/tag/tag.d.ts +67 -1
- package/dist/textarea/index.d.ts +2 -0
- package/dist/textarea/index.js +2 -242
- package/dist/textarea/platform.d.ts +22 -0
- package/dist/textarea/textarea.d.ts +169 -46
- package/dist/textarea-qbnruDUG.js +775 -0
- package/dist/textarea-qbnruDUG.js.map +1 -0
- package/dist/time-picker/index.d.ts +1 -0
- package/dist/time-picker/index.js +228 -0
- package/dist/time-picker/index.js.map +1 -0
- package/dist/time-picker/time-picker.d.ts +83 -0
- package/dist/timeline/index.d.ts +1 -0
- package/dist/timeline/index.js +131 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/timeline/timeline.d.ts +79 -0
- package/dist/toast/index.js +47 -4
- package/dist/toast/index.js.map +1 -1
- package/dist/toast/toast.d.ts +26 -3
- package/dist/top-bar/index.js +16 -2
- package/dist/top-bar/index.js.map +1 -1
- package/dist/top-bar/top-bar.d.ts +13 -2
- package/dist/tree-select/index.d.ts +1 -0
- package/dist/tree-select/index.js +512 -0
- package/dist/tree-select/index.js.map +1 -0
- package/dist/tree-select/tree-select.d.ts +215 -0
- package/dist/typography/index.d.ts +1 -0
- package/dist/typography/index.js +82 -0
- package/dist/typography/index.js.map +1 -0
- package/dist/typography/typography.d.ts +54 -0
- package/dist/upload/index.d.ts +1 -0
- package/dist/upload/index.js +458 -0
- package/dist/upload/index.js.map +1 -0
- package/dist/upload/upload.d.ts +172 -0
- package/dist/virtual-list/index.d.ts +1 -0
- package/dist/virtual-list/index.js +445 -0
- package/dist/virtual-list/index.js.map +1 -0
- package/dist/virtual-list/virtual-list.d.ts +160 -0
- package/dist/visual-manifest.d.ts +27 -0
- package/dist/watermark/index.d.ts +1 -0
- package/dist/watermark/index.js +260 -0
- package/dist/watermark/index.js.map +1 -0
- package/dist/watermark/watermark.d.ts +106 -0
- package/package.json +417 -44
- package/dist/empty/index.js.map +0 -1
- package/dist/icon/index.js.map +0 -1
- package/dist/textarea/index.js.map +0 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { Machine, Service } from "@zag-js/core";
|
|
2
|
+
import { popupMachine } from "../popup/popup.js";
|
|
3
|
+
import { PickerSelectionModel, type PickerColumnSignal, type PickerColumnToken, type PickerKeyboardMove, type PickerMode, type PickerSelectionNotice, type PickerSelectionProps, type PickerSelectionSnapshot, type PickerValue } from "./selection-model.js";
|
|
4
|
+
/**
|
|
5
|
+
* Picker 的单一 Foundation service(T002)。
|
|
6
|
+
*
|
|
7
|
+
* 不是第二个 machine:它是锁定的上游 `popupMachine` 的显式 typed 投影 —— props / context / states /
|
|
8
|
+
* transitions / actions / effects 全部来自同一个 Popup machine,只追加选择会话的 context、refs 与事件。
|
|
9
|
+
* 工具栏(popup)形态的开合、焦点、滚动锁、portal id 与模态票据都由这一个 service 承担;
|
|
10
|
+
* 内嵌(inline)形态把所有上游打开路径守卫为 closed:没有锁、没有 portal、没有模态登记。
|
|
11
|
+
*
|
|
12
|
+
* 迁移自 specs/054-mobile-picker/spike/machine-foundation.ts(T002 + T035–T039 证据),
|
|
13
|
+
* 仅删去 spike 的 PREVIEW.SET 探针并增加离散选择/键盘/列焦点事件。
|
|
14
|
+
*/
|
|
15
|
+
type PopupSchema = typeof popupMachine extends Machine<infer Schema> ? Schema : never;
|
|
16
|
+
export interface QwPickerSchema extends Omit<PopupSchema, "action" | "event" | "effect"> {
|
|
17
|
+
props: PopupSchema["props"] & {
|
|
18
|
+
mode: PickerMode;
|
|
19
|
+
selection?: PickerSelectionProps;
|
|
20
|
+
onSelectionNotice?: (event: PickerSelectionNotice) => void;
|
|
21
|
+
};
|
|
22
|
+
context: {
|
|
23
|
+
rendered: PopupSchema["context"]["rendered"];
|
|
24
|
+
triggerValue: PopupSchema["context"]["triggerValue"];
|
|
25
|
+
preview: PickerValue;
|
|
26
|
+
selectionSnapshot: PickerSelectionSnapshot | null;
|
|
27
|
+
surfaceTokens: readonly (PickerColumnToken | undefined)[];
|
|
28
|
+
};
|
|
29
|
+
refs: {
|
|
30
|
+
/** 构造时固定的形态;切换形态须重新挂载。 */
|
|
31
|
+
mode: PickerMode;
|
|
32
|
+
selectionModel: PickerSelectionModel;
|
|
33
|
+
selectionTransport: {
|
|
34
|
+
notice?: (event: PickerSelectionNotice) => void;
|
|
35
|
+
closeIntent: boolean;
|
|
36
|
+
session: number;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
action: PopupSchema["action"] | "selectionInput";
|
|
40
|
+
effect: PopupSchema["effect"] | "selectionLifetime";
|
|
41
|
+
event: PopupSchema["event"] | {
|
|
42
|
+
type: "SELECTION.MOUNT";
|
|
43
|
+
columnIndex: number;
|
|
44
|
+
} | {
|
|
45
|
+
type: "SELECTION.UNMOUNT";
|
|
46
|
+
token: PickerColumnToken;
|
|
47
|
+
} | {
|
|
48
|
+
type: "SELECTION.INPUT";
|
|
49
|
+
token: PickerColumnToken;
|
|
50
|
+
signal: PickerColumnSignal;
|
|
51
|
+
} | {
|
|
52
|
+
type: "SELECTION.SELECT";
|
|
53
|
+
columnIndex: number;
|
|
54
|
+
optionIndex: number;
|
|
55
|
+
} | {
|
|
56
|
+
type: "SELECTION.MOVE";
|
|
57
|
+
columnIndex: number;
|
|
58
|
+
move: PickerKeyboardMove;
|
|
59
|
+
} | {
|
|
60
|
+
type: "SELECTION.FOCUS";
|
|
61
|
+
columnIndex: number;
|
|
62
|
+
} | {
|
|
63
|
+
type: "SELECTION.CONFIRM";
|
|
64
|
+
} | {
|
|
65
|
+
type: "SELECTION.CANCEL";
|
|
66
|
+
} | {
|
|
67
|
+
type: "SELECTION.CLOSE";
|
|
68
|
+
session: number;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export type QwPickerService = Service<QwPickerSchema>;
|
|
72
|
+
export type QwPickerMachine = Machine<QwPickerSchema>;
|
|
73
|
+
/** Typed pinned upstream projection: one service, the original two modal states. */
|
|
74
|
+
export declare const pickerMachine: QwPickerMachine;
|
|
75
|
+
/** Project the one service for the upstream Popup connector; never instantiate another. */
|
|
76
|
+
export declare function toPopupService(service: Service<QwPickerSchema>): Service<PopupSchema>;
|
|
77
|
+
type SelectionEvent = QwPickerSchema["event"];
|
|
78
|
+
/** Keep input ordering when the machine scheduler has not consumed an earlier selection yet. */
|
|
79
|
+
export declare function sendPickerSelection(service: QwPickerService, event: SelectionEvent): void;
|
|
80
|
+
export {};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { ModalRenderRuntime } from "../modal-render-runtime.js";
|
|
2
|
+
import { connectPopup, type QwPopupProps } from "../popup/popup.js";
|
|
3
|
+
import type { QwPickerSchema, QwPickerService } from "./picker-machine.js";
|
|
4
|
+
import { type PickerChangeDetails, type PickerColumn, type PickerColumnSignal, type PickerColumnToken, type PickerDiagnostic, type PickerKeyboardMove, type PickerMode, type PickerScrollCommand, type PickerValue } from "./selection-model.js";
|
|
5
|
+
/**
|
|
6
|
+
* Picker 公开 Core 面:props 归一化、模态 runtime 透传与 getters。
|
|
7
|
+
* 物理层是同一个 pickerMachine service(见 picker-machine.ts):工具栏形态复用 Popup 的
|
|
8
|
+
* 遮罩/焦点/滚动锁/portal/票据;内嵌形态不进入打开态,不使用 runtime。
|
|
9
|
+
*/
|
|
10
|
+
/** Picker 输入。继承 Popup 同义 props;固定底部,不接受 placement。 */
|
|
11
|
+
export interface QwPickerProps extends Omit<QwPopupProps, "placement"> {
|
|
12
|
+
/** 缺省 "popup"(带确定/取消工具栏)。只在构造时读取;切换形态须重新挂载。 */
|
|
13
|
+
mode?: PickerMode;
|
|
14
|
+
/** 按逻辑顺序的列。联动列由调用方在 onPreviewChange 中同步替换。 */
|
|
15
|
+
columns: readonly PickerColumn[];
|
|
16
|
+
/** 受控已提交值。传入即受控,组件只发出变更请求。 */
|
|
17
|
+
value?: PickerValue;
|
|
18
|
+
/** 非受控初值;缺省为各列第一可选项。 */
|
|
19
|
+
defaultValue?: PickerValue;
|
|
20
|
+
/** 确定按钮文字,缺省「确定」。 */
|
|
21
|
+
confirmLabel?: string;
|
|
22
|
+
/** 取消按钮文字,缺省「取消」。 */
|
|
23
|
+
cancelLabel?: string;
|
|
24
|
+
/** 工具栏确定(等待落定后)或内嵌落定时通知一次。 */
|
|
25
|
+
onValueChange?: (details: PickerChangeDetails) => void;
|
|
26
|
+
/** 预览变化时通知;取消/关闭离开时通知一次恢复后的预览。 */
|
|
27
|
+
onPreviewChange?: (details: PickerChangeDetails) => void;
|
|
28
|
+
}
|
|
29
|
+
/** createPickerProps 的输出:同一 Popup machine 的 context + 选择会话输入(只供 Core 读取)。 */
|
|
30
|
+
export type QwPickerMachineProps = Partial<QwPickerSchema["props"]>;
|
|
31
|
+
/** Core 派生的渲染数据。适配层只渲染,不判断 disabled/duplicate/selected。 */
|
|
32
|
+
export interface QwResolvedPickerOption {
|
|
33
|
+
readonly index: number;
|
|
34
|
+
readonly value: string;
|
|
35
|
+
readonly label: string;
|
|
36
|
+
/** 禁用或重复值后项:可见、不可落定。 */
|
|
37
|
+
readonly disabled: boolean;
|
|
38
|
+
readonly duplicate: boolean;
|
|
39
|
+
readonly selected: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface QwResolvedPickerColumn {
|
|
42
|
+
readonly index: number;
|
|
43
|
+
/** 可访问列名:column.label → 「第 N 列」。 */
|
|
44
|
+
readonly label: string;
|
|
45
|
+
readonly options: readonly QwResolvedPickerOption[];
|
|
46
|
+
/** 当前预览项索引;无效时 -1(不伪造选中)。 */
|
|
47
|
+
readonly selectedIndex: number;
|
|
48
|
+
/** 没有任何可选项。 */
|
|
49
|
+
readonly empty: boolean;
|
|
50
|
+
}
|
|
51
|
+
type PickerNormalize = Parameters<typeof connectPopup>[1];
|
|
52
|
+
type NormalizedProps = ReturnType<PickerNormalize["element"]>;
|
|
53
|
+
type PopupApi = ReturnType<typeof connectPopup>;
|
|
54
|
+
export type QwPickerApi = PopupApi & {
|
|
55
|
+
readonly mode: PickerMode;
|
|
56
|
+
readonly columns: readonly QwResolvedPickerColumn[];
|
|
57
|
+
/** 已提交值(受控时即调用方值)。 */
|
|
58
|
+
readonly value: PickerValue;
|
|
59
|
+
/** 滚轮当前预览。 */
|
|
60
|
+
readonly preview: PickerValue;
|
|
61
|
+
/** 所有列都有有效项且外部值有效。为 false 时确定不可用。 */
|
|
62
|
+
readonly valid: boolean;
|
|
63
|
+
/** 已按确定,正在等待滚动落定。 */
|
|
64
|
+
readonly pendingConfirm: boolean;
|
|
65
|
+
/** 选择会话是否接收输入(工具栏打开时,或内嵌)。 */
|
|
66
|
+
readonly active: boolean;
|
|
67
|
+
/** roving tabindex 的逻辑列。 */
|
|
68
|
+
readonly focusedColumn: number;
|
|
69
|
+
readonly selectedIndices: readonly number[];
|
|
70
|
+
/** 待桥执行的 scrollTo 请求。 */
|
|
71
|
+
readonly commands: readonly PickerScrollCommand[];
|
|
72
|
+
readonly diagnostics: readonly PickerDiagnostic[];
|
|
73
|
+
readonly accessibleName: string;
|
|
74
|
+
readonly confirmLabel: string;
|
|
75
|
+
readonly cancelLabel: string;
|
|
76
|
+
confirm(): void;
|
|
77
|
+
cancel(): void;
|
|
78
|
+
selectOption(columnIndex: number, optionIndex: number): void;
|
|
79
|
+
moveColumn(columnIndex: number, move: PickerKeyboardMove): void;
|
|
80
|
+
/** 机械桥:真实列节点挂载后调用;票据随 getColumnToken 发布。 */
|
|
81
|
+
mountColumn(columnIndex: number): void;
|
|
82
|
+
getColumnToken(columnIndex: number): PickerColumnToken | undefined;
|
|
83
|
+
unmountColumn(token: PickerColumnToken): void;
|
|
84
|
+
input(token: PickerColumnToken, signal: PickerColumnSignal): void;
|
|
85
|
+
getRootProps(): NormalizedProps;
|
|
86
|
+
getColumnsProps(): NormalizedProps;
|
|
87
|
+
getColumnProps(details: {
|
|
88
|
+
index: number;
|
|
89
|
+
}): NormalizedProps;
|
|
90
|
+
getOptionProps(details: {
|
|
91
|
+
columnIndex: number;
|
|
92
|
+
index: number;
|
|
93
|
+
}): NormalizedProps;
|
|
94
|
+
getIndicatorProps(): NormalizedProps;
|
|
95
|
+
getToolbarProps(): NormalizedProps;
|
|
96
|
+
getCancelProps(): NormalizedProps;
|
|
97
|
+
getConfirmProps(): NormalizedProps;
|
|
98
|
+
};
|
|
99
|
+
/** 未知 mode 回退 popup。 */
|
|
100
|
+
export declare function resolvePickerMode(mode: unknown): PickerMode;
|
|
101
|
+
/** 可访问名称:title → ariaLabel → 「选择器」。空白视为缺省。 */
|
|
102
|
+
export declare function getPickerAccessibleName(props: Pick<QwPickerProps, "title" | "ariaLabel">): string;
|
|
103
|
+
/** 业务值只接受 string/null 数组。 */
|
|
104
|
+
export declare function isPickerValue(value: unknown): value is PickerValue;
|
|
105
|
+
/** 列结构校验:label 可选字符串,options 的 value/label 为字符串,disabled 可选布尔。 */
|
|
106
|
+
export declare function isPickerColumns(value: unknown): value is readonly PickerColumn[];
|
|
107
|
+
/** 渲染数据:保留全部可见项,标出禁用/重复后项与当前预览项。 */
|
|
108
|
+
export declare function resolvePickerColumns(columns: readonly PickerColumn[], preview?: PickerValue): readonly QwResolvedPickerColumn[];
|
|
109
|
+
/** Popup 的 data 属性(placement 固定 bottom)。 */
|
|
110
|
+
export declare function getPickerDataAttrs(props: Pick<QwPickerProps, "safeArea">): Record<string, string | undefined>;
|
|
111
|
+
/**
|
|
112
|
+
* 公开 props → 同一 pickerMachine 的 props。机械委托 createPopupProps(props, runtime):
|
|
113
|
+
* 受控优先、初态许可/拒绝仍由 Popup Core 决定;runtime 只在工具栏形态透传(WC 带 owner "wc:picker")。
|
|
114
|
+
*/
|
|
115
|
+
export declare function createPickerProps(props: QwPickerProps, runtime?: ModalRenderRuntime): QwPickerMachineProps;
|
|
116
|
+
/**
|
|
117
|
+
* 包装同一 service 的 connectPopup:继承开合/getters 与单层模态拒绝,增加滚轮 root/column/option、
|
|
118
|
+
* 工具栏 cancel/confirm getters。确定/取消/键盘/点击都只发 typed 事件,由 selection-model 决定结果。
|
|
119
|
+
*/
|
|
120
|
+
export declare function connectPicker(service: QwPickerService, normalize: PickerNormalize, props: QwPickerProps, runtime?: ModalRenderRuntime): QwPickerApi;
|
|
121
|
+
export {};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { PickerColumnSignal, PickerColumnToken, PickerScrollCommand } from "./selection-model.js";
|
|
2
|
+
/**
|
|
3
|
+
* Picker 列的平台装配:监听、测量、执行 Core 的 scrollTo 与回 ACK。
|
|
4
|
+
* 只运输原始数值与 Core 票据 —— 不排序、不回退、不选值、不判断确定(那些只在 selection-model)。
|
|
5
|
+
* 各栈适配层只保留生命周期胶水:挂载后 connectPickerColumn(...),每次渲染后 sync(),卸载时 dispose()。
|
|
6
|
+
* 模块顶层不访问 DOM;所有 DOM 读取都在调用时发生(SSR-safe)。
|
|
7
|
+
*
|
|
8
|
+
* attachPickerColumn 迁移自 specs/054-mobile-picker/spike/column-surface.ts(T039 证据)。
|
|
9
|
+
*/
|
|
10
|
+
/** 原始事件事实,仅作运输元数据。 */
|
|
11
|
+
export type PickerRawEventFacts = {
|
|
12
|
+
type: string;
|
|
13
|
+
timeStamp: number;
|
|
14
|
+
isTrusted: boolean;
|
|
15
|
+
clientX?: number;
|
|
16
|
+
clientY?: number;
|
|
17
|
+
pointerId?: number;
|
|
18
|
+
pointerType?: string;
|
|
19
|
+
deltaX?: number;
|
|
20
|
+
deltaY?: number;
|
|
21
|
+
deltaMode?: number;
|
|
22
|
+
};
|
|
23
|
+
export type PickerBridgeNotice = {
|
|
24
|
+
type: "SURFACE.MOUNTED" | "SURFACE.DETACHED";
|
|
25
|
+
token: PickerColumnToken;
|
|
26
|
+
} | {
|
|
27
|
+
type: "INPUT";
|
|
28
|
+
token: PickerColumnToken;
|
|
29
|
+
signal: PickerColumnSignal;
|
|
30
|
+
event?: PickerRawEventFacts;
|
|
31
|
+
sampledAt?: number;
|
|
32
|
+
} | {
|
|
33
|
+
type: "RAW.POINTER.MOVE";
|
|
34
|
+
token: PickerColumnToken;
|
|
35
|
+
event: PickerRawEventFacts;
|
|
36
|
+
} | {
|
|
37
|
+
type: "COMMAND.FAILED";
|
|
38
|
+
token: PickerColumnToken;
|
|
39
|
+
commandId: number;
|
|
40
|
+
reason: "unbound" | "exception";
|
|
41
|
+
};
|
|
42
|
+
export type PickerBridgeCommand = {
|
|
43
|
+
type: "SCROLL_TO";
|
|
44
|
+
command: PickerScrollCommand;
|
|
45
|
+
} | {
|
|
46
|
+
type: "MEASURE";
|
|
47
|
+
token: PickerColumnToken;
|
|
48
|
+
} | {
|
|
49
|
+
type: "FOCUS_COLUMN";
|
|
50
|
+
token: PickerColumnToken;
|
|
51
|
+
};
|
|
52
|
+
export interface PickerColumnBinding {
|
|
53
|
+
execute(command: PickerBridgeCommand): boolean;
|
|
54
|
+
release(): void;
|
|
55
|
+
}
|
|
56
|
+
export interface PickerColumnSurface {
|
|
57
|
+
readonly binding: PickerColumnBinding;
|
|
58
|
+
bind(token: PickerColumnToken, rows: readonly HTMLElement[]): PickerColumnBinding;
|
|
59
|
+
dispose(): void;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 一个物理列挂载:先按 Core 票据校验物理归属,再替换可换的输入绑定。
|
|
63
|
+
* 票据刷新(epoch/generation)只换 binding;真实卸载才 dispose 并送 SURFACE.DETACHED。
|
|
64
|
+
*/
|
|
65
|
+
export declare function attachPickerColumn(viewport: HTMLElement, initial: PickerColumnToken, rows: readonly HTMLElement[], sink: (notice: PickerBridgeNotice) => void): PickerColumnSurface;
|
|
66
|
+
/** connectPicker 的 api 满足这个宿主接口;桥只调用这些运输方法。 */
|
|
67
|
+
export interface PickerColumnHost {
|
|
68
|
+
readonly commands: readonly PickerScrollCommand[];
|
|
69
|
+
mountColumn(columnIndex: number): void;
|
|
70
|
+
getColumnToken(columnIndex: number): PickerColumnToken | undefined;
|
|
71
|
+
unmountColumn(token: PickerColumnToken): void;
|
|
72
|
+
input(token: PickerColumnToken, signal: PickerColumnSignal): void;
|
|
73
|
+
}
|
|
74
|
+
export interface PickerColumnController {
|
|
75
|
+
/** 每次渲染/更新后调用:请求挂载、按新票据换绑定、执行属于当前绑定的 scroll 命令。 */
|
|
76
|
+
sync(): void;
|
|
77
|
+
/** 真实卸载时调用一次:释放监听与观察器,并送 SURFACE.DETACHED。 */
|
|
78
|
+
dispose(): void;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 三栈共用的列生命周期胶水。getHost 每次返回最新 api(React/Vue/WC 每次渲染都会 connect 一次)。
|
|
82
|
+
* Core 未签发票据(工具栏关闭、会话失效)时保持物理挂载但不输入;票据回来后只换绑定。
|
|
83
|
+
*/
|
|
84
|
+
export declare function connectPickerColumn(getHost: () => PickerColumnHost, viewport: HTMLElement, columnIndex: number, getRows: () => readonly HTMLElement[]): PickerColumnController;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { connectPopup, type QwPopupProps } from "../popup/popup.js";
|
|
2
|
+
import type { ModalRenderRuntime } from "../modal-render-runtime.js";
|
|
3
|
+
import { type QwPickerService } from "./picker-machine.js";
|
|
4
|
+
import type { PickerColumnSignal, PickerColumnToken, PickerKeyboardMove } from "./selection-model.js";
|
|
5
|
+
/**
|
|
6
|
+
* 机械连接层(包内):同一 service 投影给原 Popup connector,选择输入保留 typed 队列;confirm/cancel 同步排空先前输入再请求关闭。
|
|
7
|
+
* 原生 IO 只运输捕获的票据与原始信号。connectPicker 在其上增加 ARIA/工具栏 getters。
|
|
8
|
+
*/
|
|
9
|
+
export declare function connectSelection(service: QwPickerService, normalize: Parameters<typeof connectPopup>[1], popupProps: QwPopupProps, runtime?: ModalRenderRuntime): {
|
|
10
|
+
popup: import("../popup/popup.js").QwPopupApi & {
|
|
11
|
+
getOriginProps(): ReturnType<((props: never) => {
|
|
12
|
+
[x: string]: any;
|
|
13
|
+
}) & ((props: ({
|
|
14
|
+
"data-selected"?: any | undefined;
|
|
15
|
+
"data-expanded"?: any | undefined;
|
|
16
|
+
"data-highlighted"?: any | undefined;
|
|
17
|
+
"data-readonly"?: any | undefined;
|
|
18
|
+
"data-indeterminate"?: any | undefined;
|
|
19
|
+
"data-invalid"?: any | undefined;
|
|
20
|
+
"data-hover"?: any | undefined;
|
|
21
|
+
"data-active"?: any | undefined;
|
|
22
|
+
"data-focus"?: any | undefined;
|
|
23
|
+
"data-focus-visible"?: any | undefined;
|
|
24
|
+
"data-disabled"?: any | undefined;
|
|
25
|
+
"data-open"?: any | undefined;
|
|
26
|
+
"data-checked"?: any | undefined;
|
|
27
|
+
"data-pressed"?: any | undefined;
|
|
28
|
+
"data-complete"?: any | undefined;
|
|
29
|
+
"data-side"?: any | undefined;
|
|
30
|
+
"data-align"?: any | undefined;
|
|
31
|
+
"data-empty"?: any | undefined;
|
|
32
|
+
"data-placeholder-shown"?: any | undefined;
|
|
33
|
+
"data-half"?: any | undefined;
|
|
34
|
+
"data-scope"?: string | undefined;
|
|
35
|
+
"data-uid"?: string | undefined;
|
|
36
|
+
"data-name"?: string | undefined;
|
|
37
|
+
"data-ownedby"?: string | undefined;
|
|
38
|
+
"data-type"?: string | undefined;
|
|
39
|
+
"data-valuetext"?: string | undefined;
|
|
40
|
+
"data-placement"?: string | undefined;
|
|
41
|
+
"data-controls"?: string | undefined;
|
|
42
|
+
"data-part"?: string | undefined;
|
|
43
|
+
"data-label"?: string | undefined;
|
|
44
|
+
"data-state"?: string | null | undefined;
|
|
45
|
+
"data-value"?: string | number | undefined;
|
|
46
|
+
"data-orientation"?: "horizontal" | "vertical" | undefined;
|
|
47
|
+
"data-count"?: number | undefined;
|
|
48
|
+
"data-index"?: number | undefined;
|
|
49
|
+
} & {
|
|
50
|
+
[x: `data-${string}`]: any;
|
|
51
|
+
}) & import("@zag-js/types").JSX.HTMLAttributes<HTMLElement> & Record<string, any>) => {
|
|
52
|
+
[x: string]: any;
|
|
53
|
+
})>;
|
|
54
|
+
};
|
|
55
|
+
snapshot: {
|
|
56
|
+
mode: import("./selection-model.js").PickerMode;
|
|
57
|
+
userRevision: number;
|
|
58
|
+
committed: (string | null)[];
|
|
59
|
+
preview: (string | null)[];
|
|
60
|
+
source: "external" | "restore" | "user";
|
|
61
|
+
selectedIndices: number[];
|
|
62
|
+
valid: boolean;
|
|
63
|
+
pendingConfirm: boolean;
|
|
64
|
+
active: boolean;
|
|
65
|
+
focusedColumn: number;
|
|
66
|
+
tokens: (PickerColumnToken | undefined)[];
|
|
67
|
+
commands: {
|
|
68
|
+
commandId: number;
|
|
69
|
+
offset: number;
|
|
70
|
+
behavior: "auto";
|
|
71
|
+
reason: "alignment" | "settlement";
|
|
72
|
+
token: {
|
|
73
|
+
serviceId: string;
|
|
74
|
+
epoch: number;
|
|
75
|
+
columnIndex: number;
|
|
76
|
+
generation: number;
|
|
77
|
+
mountEpoch: number;
|
|
78
|
+
};
|
|
79
|
+
}[];
|
|
80
|
+
};
|
|
81
|
+
mountColumn(columnIndex: number): void;
|
|
82
|
+
getColumnToken(columnIndex: number): PickerColumnToken | undefined;
|
|
83
|
+
unmountColumn(token: PickerColumnToken): void;
|
|
84
|
+
input(token: PickerColumnToken, signal: PickerColumnSignal): void;
|
|
85
|
+
select(columnIndex: number, optionIndex: number): void;
|
|
86
|
+
move(columnIndex: number, move: PickerKeyboardMove): void;
|
|
87
|
+
focusColumn(columnIndex: number): void;
|
|
88
|
+
confirm(): void;
|
|
89
|
+
cancel(): void;
|
|
90
|
+
};
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Picker 选择内核 —— 选值的唯一权威。无 DOM、无 Popup 实例、无模态状态;
|
|
3
|
+
* 唯一的模态输出是 `close` 请求,由同一 Foundation service 经继承的 Popup CLOSE 转移执行。
|
|
4
|
+
*
|
|
5
|
+
* 迁移自 specs/054-mobile-picker/spike/selection-model.ts:输入代次(epoch/generation)、
|
|
6
|
+
* 物理挂载(mountEpoch)、会话代次与等待落定的守卫原样保留(T035–T039 证据)。
|
|
7
|
+
* 本文件在其上增加:内嵌落定提交、离散选择(点击/键盘)、列焦点与重复值诊断。
|
|
8
|
+
*/
|
|
9
|
+
/** 按列顺序的业务值;null 表示该列没有有效项。 */
|
|
10
|
+
export type PickerValue = readonly (string | null)[];
|
|
11
|
+
/** popup:带工具栏,确定才提交;inline:内嵌滚轮,落定即提交。 */
|
|
12
|
+
export type PickerMode = "popup" | "inline";
|
|
13
|
+
export interface PickerOption {
|
|
14
|
+
value: string;
|
|
15
|
+
label: string;
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface PickerColumn {
|
|
19
|
+
label?: string;
|
|
20
|
+
options: readonly PickerOption[];
|
|
21
|
+
}
|
|
22
|
+
export interface PickerChangeDetails {
|
|
23
|
+
value: PickerValue;
|
|
24
|
+
}
|
|
25
|
+
/** 选择内核输入:列与外部值。 */
|
|
26
|
+
export interface PickerSelectionProps {
|
|
27
|
+
columns: readonly PickerColumn[];
|
|
28
|
+
value?: PickerValue;
|
|
29
|
+
defaultValue?: PickerValue;
|
|
30
|
+
}
|
|
31
|
+
/** Core 签发的列输入票据。桥只原样运输,不推导选值。 */
|
|
32
|
+
export interface PickerColumnToken {
|
|
33
|
+
serviceId: string;
|
|
34
|
+
epoch: number;
|
|
35
|
+
columnIndex: number;
|
|
36
|
+
generation: number;
|
|
37
|
+
mountEpoch: number;
|
|
38
|
+
}
|
|
39
|
+
/** 桥测得的原始几何(像素)。rows 与该列 options 一一对应。 */
|
|
40
|
+
export interface PickerGeometry {
|
|
41
|
+
viewportHeight: number;
|
|
42
|
+
scrollHeight: number;
|
|
43
|
+
scrollTop: number;
|
|
44
|
+
rows: readonly {
|
|
45
|
+
top: number;
|
|
46
|
+
height: number;
|
|
47
|
+
}[];
|
|
48
|
+
}
|
|
49
|
+
/** Core 输出的滚动请求;桥只执行 scrollTo 并回 ACK。 */
|
|
50
|
+
export interface PickerScrollCommand {
|
|
51
|
+
token: PickerColumnToken;
|
|
52
|
+
commandId: number;
|
|
53
|
+
offset: number;
|
|
54
|
+
behavior: "auto";
|
|
55
|
+
reason: "alignment" | "settlement";
|
|
56
|
+
}
|
|
57
|
+
export type PickerSelectionNotice = {
|
|
58
|
+
type: "preview" | "value";
|
|
59
|
+
value: PickerValue;
|
|
60
|
+
} | {
|
|
61
|
+
type: "close";
|
|
62
|
+
open: false;
|
|
63
|
+
};
|
|
64
|
+
/** 桥送入的原始信号;pointer/wheel/scroll 只是数值事实,落点与是否提交由 Core 决定。 */
|
|
65
|
+
export type PickerColumnSignal = {
|
|
66
|
+
type: "MEASURE";
|
|
67
|
+
geometry: PickerGeometry;
|
|
68
|
+
} | {
|
|
69
|
+
type: "POINTER.START";
|
|
70
|
+
pointerId: number;
|
|
71
|
+
} | {
|
|
72
|
+
type: "POINTER.END" | "POINTER.CANCEL";
|
|
73
|
+
pointerId: number;
|
|
74
|
+
} | {
|
|
75
|
+
type: "WHEEL";
|
|
76
|
+
deltaY: number;
|
|
77
|
+
} | {
|
|
78
|
+
type: "SCROLL";
|
|
79
|
+
scrollTop: number;
|
|
80
|
+
lastCommandId?: number;
|
|
81
|
+
} | {
|
|
82
|
+
type: "COMMAND.APPLIED";
|
|
83
|
+
commandId: number;
|
|
84
|
+
geometry: PickerGeometry;
|
|
85
|
+
};
|
|
86
|
+
/** 列内键盘移动。page-* 一次跨 5 项。 */
|
|
87
|
+
export type PickerKeyboardMove = "next" | "previous" | "first" | "last" | "page-next" | "page-previous";
|
|
88
|
+
/** 开发诊断:重复值后项可见但永不可选。 */
|
|
89
|
+
export interface PickerDiagnostic {
|
|
90
|
+
type: "duplicate-value";
|
|
91
|
+
columnIndex: number;
|
|
92
|
+
optionIndex: number;
|
|
93
|
+
firstIndex: number;
|
|
94
|
+
value: string;
|
|
95
|
+
}
|
|
96
|
+
/** 可选 = 存在、未禁用、且是该值的逻辑第一项(第一项禁用也不提升后项)。 */
|
|
97
|
+
export declare function isPickerOptionSelectable(column: PickerColumn, index: number): boolean;
|
|
98
|
+
/** 列的第一可选值;没有可选项时为 null。 */
|
|
99
|
+
export declare function getPickerFirstValue(column: PickerColumn): string | null;
|
|
100
|
+
/** 值在列中的可选索引;不可选或不存在时为 -1(不伪造选中)。 */
|
|
101
|
+
export declare function getPickerOptionIndex(column: PickerColumn, value: string | null): number;
|
|
102
|
+
/** 重复值诊断:每个后项一条,指向逻辑第一项。 */
|
|
103
|
+
export declare function getPickerDiagnostics(columns: readonly PickerColumn[]): readonly PickerDiagnostic[];
|
|
104
|
+
/** 键盘目标索引:跳过禁用与重复后项;没有可去的项时返回 -1。当前无效时向下类从首项、向上类从末项找。 */
|
|
105
|
+
export declare function getPickerKeyboardTarget(column: PickerColumn, current: number, move: PickerKeyboardMove): number;
|
|
106
|
+
/** Core 选择会话。由 pickerMachine 的 refs 持有;context 中的 snapshot 只是它的可观察投影。 */
|
|
107
|
+
export declare class PickerSelectionModel {
|
|
108
|
+
private props;
|
|
109
|
+
private accepted;
|
|
110
|
+
private restore;
|
|
111
|
+
private preview;
|
|
112
|
+
private source;
|
|
113
|
+
private externalInvalid;
|
|
114
|
+
private lastUserColumn;
|
|
115
|
+
private columns;
|
|
116
|
+
private epoch;
|
|
117
|
+
private sessionEpoch;
|
|
118
|
+
private active;
|
|
119
|
+
private disposed;
|
|
120
|
+
private pendingConfirm;
|
|
121
|
+
private inlineDirty;
|
|
122
|
+
private discreteTimer?;
|
|
123
|
+
private ownerTimer?;
|
|
124
|
+
private focusedColumn;
|
|
125
|
+
private userRevision;
|
|
126
|
+
private nextCommand;
|
|
127
|
+
private nextGeneration;
|
|
128
|
+
private nextMountEpoch;
|
|
129
|
+
private readonly serviceId;
|
|
130
|
+
private readonly notificationSink;
|
|
131
|
+
readonly mode: PickerMode;
|
|
132
|
+
constructor(serviceId: string, props: PickerSelectionProps, notificationSink: (event: PickerSelectionNotice) => void, mode?: PickerMode);
|
|
133
|
+
private observer?;
|
|
134
|
+
observe(observer: (snapshot: PickerSelectionSnapshot) => void): () => void;
|
|
135
|
+
private publish;
|
|
136
|
+
private notify;
|
|
137
|
+
get isDisposed(): boolean;
|
|
138
|
+
get snapshot(): {
|
|
139
|
+
mode: PickerMode;
|
|
140
|
+
userRevision: number;
|
|
141
|
+
committed: (string | null)[];
|
|
142
|
+
preview: (string | null)[];
|
|
143
|
+
source: "external" | "restore" | "user";
|
|
144
|
+
selectedIndices: number[];
|
|
145
|
+
valid: boolean;
|
|
146
|
+
pendingConfirm: boolean;
|
|
147
|
+
active: boolean;
|
|
148
|
+
focusedColumn: number;
|
|
149
|
+
tokens: (PickerColumnToken | undefined)[];
|
|
150
|
+
commands: {
|
|
151
|
+
commandId: number;
|
|
152
|
+
offset: number;
|
|
153
|
+
behavior: "auto";
|
|
154
|
+
reason: "alignment" | "settlement";
|
|
155
|
+
token: {
|
|
156
|
+
serviceId: string;
|
|
157
|
+
epoch: number;
|
|
158
|
+
columnIndex: number;
|
|
159
|
+
generation: number;
|
|
160
|
+
mountEpoch: number;
|
|
161
|
+
};
|
|
162
|
+
}[];
|
|
163
|
+
};
|
|
164
|
+
private previewValid;
|
|
165
|
+
private valid;
|
|
166
|
+
private token;
|
|
167
|
+
private current;
|
|
168
|
+
attach(columnIndex: number): PickerColumnToken;
|
|
169
|
+
detach(token: PickerColumnToken): void;
|
|
170
|
+
dispatch(token: PickerColumnToken, signal: PickerColumnSignal): void;
|
|
171
|
+
/** Captured identity must survive queueing; never relabel an old input. */
|
|
172
|
+
queue(token: PickerColumnToken, signal: PickerColumnSignal): void;
|
|
173
|
+
/** 离散选择(点击/键盘):等同一次立即落定的用户选择;正在滚的本列被它取代。 */
|
|
174
|
+
select(columnIndex: number, optionIndex: number): void;
|
|
175
|
+
/**
|
|
176
|
+
* 离散选择的落定:与滚轮相同的静默窗口后才提交(内嵌)或兑现已按下的确定(工具栏)。
|
|
177
|
+
* 让框架下一次渲染才送达的联动后列先到,避免以旧后列冒充新数据(FR-011)。
|
|
178
|
+
*/
|
|
179
|
+
private scheduleDiscrete;
|
|
180
|
+
private clearDiscrete;
|
|
181
|
+
/** 列内键盘移动;目标不存在时只更新列焦点。 */
|
|
182
|
+
move(columnIndex: number, move: PickerKeyboardMove): void;
|
|
183
|
+
/** 记录逻辑列焦点(roving tabindex)。不发业务通知。 */
|
|
184
|
+
focus(columnIndex: number): void;
|
|
185
|
+
private setUserPreview;
|
|
186
|
+
private clearTimer;
|
|
187
|
+
private schedule;
|
|
188
|
+
private align;
|
|
189
|
+
private settle;
|
|
190
|
+
private waiting;
|
|
191
|
+
confirm(): void;
|
|
192
|
+
private commit;
|
|
193
|
+
/** 内嵌:所有列落定且有效、并且与已提交值不同,才通知一次 value。不关闭、不使在途输入失效。 */
|
|
194
|
+
private flushInline;
|
|
195
|
+
/**
|
|
196
|
+
* 受控请求发出后:调用方在 OWNER_MS 内没有改写 value(拒绝),且用户未再操作,
|
|
197
|
+
* 则显示回到调用方的值(同外部回写路径:新代次、桥重新测量并对齐),并通知一次恢复后的预览。
|
|
198
|
+
* 工具栏若已真实关闭,会话结束即可,重开本就从已提交值开始。
|
|
199
|
+
*/
|
|
200
|
+
private awaitOwner;
|
|
201
|
+
private clearOwner;
|
|
202
|
+
cancel(requestClose?: boolean): void;
|
|
203
|
+
/** Actual inherited Popup close fact, not another modal state transition. */
|
|
204
|
+
closed(): void;
|
|
205
|
+
stop(): void;
|
|
206
|
+
private invalidate;
|
|
207
|
+
update(props: PickerSelectionProps): void;
|
|
208
|
+
/** Begin a later actual Popup opening from the accepted entry value. */
|
|
209
|
+
reopened(): void;
|
|
210
|
+
}
|
|
211
|
+
export type PickerSelectionSnapshot = PickerSelectionModel["snapshot"];
|