@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
package/dist/loading/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/loading/loading.ts
|
|
2
2
|
/**
|
|
3
|
-
* Loading 契约 — 原型 A(无状态),
|
|
3
|
+
* Loading 契约 — 原型 A(无状态),Core 无 machine,承载三栈共享的类型与渲染契约。
|
|
4
4
|
* 可访问性契约:`role="status"` + `aria-live="polite"`;无文案时兜底
|
|
5
5
|
* `aria-label="Loading"` 保证可访问名;spinner 纯 CSS 动画并尊重
|
|
6
6
|
* `prefers-reduced-motion`。
|
|
@@ -13,7 +13,50 @@ const LOADING_SIZES = [
|
|
|
13
13
|
"md",
|
|
14
14
|
"lg"
|
|
15
15
|
];
|
|
16
|
+
const LOADING_PARTS = [
|
|
17
|
+
"root",
|
|
18
|
+
"spinner",
|
|
19
|
+
"label"
|
|
20
|
+
];
|
|
21
|
+
/** Shared content presence, language fallback and display semantics; no DOM access. */
|
|
22
|
+
function resolveLoadingState(props = {}, options = {}) {
|
|
23
|
+
const labelSource = options.hasRichLabel ? "rich" : props.label != null ? "scalar" : "none";
|
|
24
|
+
const hasLabel = labelSource !== "none";
|
|
25
|
+
return {
|
|
26
|
+
size: LOADING_SIZES.includes(props.size) ? props.size : "md",
|
|
27
|
+
surface: props.surface ?? false,
|
|
28
|
+
block: props.block ?? false,
|
|
29
|
+
hasLabel,
|
|
30
|
+
labelSource,
|
|
31
|
+
label: props.label,
|
|
32
|
+
ariaLabel: options.accessibleLabel ?? (hasLabel ? void 0 : options.loadingAria ?? "Loading"),
|
|
33
|
+
labelledBy: options.labelledBy ?? void 0,
|
|
34
|
+
describedBy: options.describedBy ?? void 0
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** Core-managed attributes take priority over conflicting passthrough attributes. */
|
|
38
|
+
function getLoadingRootProps(state) {
|
|
39
|
+
return {
|
|
40
|
+
"data-scope": "loading",
|
|
41
|
+
"data-part": "root",
|
|
42
|
+
"data-size": state.size,
|
|
43
|
+
"data-surface": state.surface ? "true" : void 0,
|
|
44
|
+
"data-block": state.block ? "true" : void 0,
|
|
45
|
+
role: "status",
|
|
46
|
+
"aria-live": "polite",
|
|
47
|
+
"aria-label": state.ariaLabel,
|
|
48
|
+
"aria-labelledby": state.labelledBy,
|
|
49
|
+
"aria-describedby": state.describedBy
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function getLoadingPartProps(part) {
|
|
53
|
+
return {
|
|
54
|
+
"data-scope": "loading",
|
|
55
|
+
"data-part": part,
|
|
56
|
+
"aria-hidden": part === "spinner" ? "true" : void 0
|
|
57
|
+
};
|
|
58
|
+
}
|
|
16
59
|
//#endregion
|
|
17
|
-
export { LOADING_SIZES };
|
|
60
|
+
export { LOADING_PARTS, LOADING_SIZES, getLoadingPartProps, getLoadingRootProps, resolveLoadingState };
|
|
18
61
|
|
|
19
62
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/loading/loading.ts"],"sourcesContent":["/**\n * Loading 契约 — 原型 A(无状态),
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/loading/loading.ts"],"sourcesContent":["/**\n * Loading 契约 — 原型 A(无状态),Core 无 machine,承载三栈共享的类型与渲染契约。\n * 可访问性契约:`role=\"status\"` + `aria-live=\"polite\"`;无文案时兜底\n * `aria-label=\"Loading\"` 保证可访问名;spinner 纯 CSS 动画并尊重\n * `prefers-reduced-motion`。\n *\n * 尺寸词表以运行时常量数组为唯一事实源(类型从常量推导),__test__ 直接锁死。\n */\n\n/** spinner 尺寸全集:sm / md(默认)/ lg。 */\nexport const LOADING_SIZES = [\"sm\", \"md\", \"lg\"] as const;\n\n/** spinner 尺寸。 */\nexport type LoadingSize = (typeof LOADING_SIZES)[number];\n\n/**\n * QwLoadingProps — 双栈共享的行为契约。`label` 的富内容形式是框架特有\n * (React 收 `ReactNode`,Vue 走 default slot),此处以基础文案 `string` 收口契约。\n */\nexport interface QwLoadingProps {\n /** spinner 尺寸,默认 md。 */\n size?: LoadingSize;\n /** 块级居中占位(整页/区域加载)。 */\n block?: boolean;\n /** 加载文案(显示于 logo 下方,并作为可访问名)。 */\n label?: string | null;\n /** 带白底浮层卡片(内边距 + 圆角 + 阴影)。 */\n surface?: boolean;\n}\n\n\nexport const LOADING_PARTS = [\"root\", \"spinner\", \"label\"] as const;\nexport type LoadingPart = (typeof LOADING_PARTS)[number];\nexport interface LoadingRenderOptions {\n hasRichLabel?: boolean;\n /** Current Provider/explicit native locale key; defaults to historical Loading. */\n loadingAria?: string;\n accessibleLabel?: string | null;\n labelledBy?: string | null;\n describedBy?: string | null;\n}\nexport interface ResolvedLoadingState {\n size: LoadingSize; surface: boolean; block: boolean; hasLabel: boolean;\n labelSource: \"rich\" | \"scalar\" | \"none\"; label?: string | null;\n ariaLabel?: string; labelledBy?: string; describedBy?: string;\n}\n/** Shared content presence, language fallback and display semantics; no DOM access. */\nexport function resolveLoadingState(props: QwLoadingProps = {}, options: LoadingRenderOptions = {}): ResolvedLoadingState {\n const labelSource = options.hasRichLabel ? \"rich\" : props.label != null ? \"scalar\" : \"none\";\n const hasLabel = labelSource !== \"none\";\n return {\n size: LOADING_SIZES.includes(props.size!) ? props.size! : \"md\", surface: props.surface ?? false, block: props.block ?? false,\n hasLabel, labelSource, label: props.label,\n ariaLabel: options.accessibleLabel ?? (hasLabel ? undefined : options.loadingAria ?? \"Loading\"),\n labelledBy: options.labelledBy ?? undefined, describedBy: options.describedBy ?? undefined,\n };\n}\nexport interface LoadingRootProps {\n \"data-scope\": \"loading\"; \"data-part\": \"root\"; \"data-size\": LoadingSize; \"data-surface\"?: \"true\"; \"data-block\"?: \"true\";\n role: \"status\"; \"aria-live\": \"polite\"; \"aria-label\"?: string; \"aria-labelledby\"?: string; \"aria-describedby\"?: string;\n}\n/** Core-managed attributes take priority over conflicting passthrough attributes. */\nexport function getLoadingRootProps(state: ResolvedLoadingState): LoadingRootProps {\n return { \"data-scope\": \"loading\", \"data-part\": \"root\", \"data-size\": state.size, \"data-surface\": state.surface ? \"true\" : undefined,\n \"data-block\": state.block ? \"true\" : undefined, role: \"status\", \"aria-live\": \"polite\", \"aria-label\": state.ariaLabel,\n \"aria-labelledby\": state.labelledBy, \"aria-describedby\": state.describedBy };\n}\nexport interface LoadingPartProps { \"data-scope\": \"loading\"; \"data-part\": Exclude<LoadingPart, \"root\">; \"aria-hidden\"?: \"true\" }\nexport function getLoadingPartProps(part: Exclude<LoadingPart, \"root\">): LoadingPartProps {\n return { \"data-scope\": \"loading\", \"data-part\": part, \"aria-hidden\": part === \"spinner\" ? \"true\" : undefined };\n}\n"],"mappings":";;;;;;;;;;AAUA,MAAa,gBAAgB;CAAC;CAAM;CAAM;AAAI;AAqB9C,MAAa,gBAAgB;CAAC;CAAQ;CAAW;AAAO;;AAgBxD,SAAgB,oBAAoB,QAAwB,CAAC,GAAG,UAAgC,CAAC,GAAyB;CACxH,MAAM,cAAc,QAAQ,eAAe,SAAS,MAAM,SAAS,OAAO,WAAW;CACrF,MAAM,WAAW,gBAAgB;CACjC,OAAO;EACL,MAAM,cAAc,SAAS,MAAM,IAAK,IAAI,MAAM,OAAQ;EAAM,SAAS,MAAM,WAAW;EAAO,OAAO,MAAM,SAAS;EACvH;EAAU;EAAa,OAAO,MAAM;EACpC,WAAW,QAAQ,oBAAoB,WAAW,KAAA,IAAY,QAAQ,eAAe;EACrF,YAAY,QAAQ,cAAc,KAAA;EAAW,aAAa,QAAQ,eAAe,KAAA;CACnF;AACF;;AAMA,SAAgB,oBAAoB,OAA+C;CACjF,OAAO;EAAE,cAAc;EAAW,aAAa;EAAQ,aAAa,MAAM;EAAM,gBAAgB,MAAM,UAAU,SAAS,KAAA;EACvH,cAAc,MAAM,QAAQ,SAAS,KAAA;EAAW,MAAM;EAAU,aAAa;EAAU,cAAc,MAAM;EAC3G,mBAAmB,MAAM;EAAY,oBAAoB,MAAM;CAAY;AAC/E;AAEA,SAAgB,oBAAoB,MAAsD;CACxF,OAAO;EAAE,cAAc;EAAW,aAAa;EAAM,eAAe,SAAS,YAAY,SAAS,KAAA;CAAU;AAC9G"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Loading 契约 — 原型 A(无状态),
|
|
2
|
+
* Loading 契约 — 原型 A(无状态),Core 无 machine,承载三栈共享的类型与渲染契约。
|
|
3
3
|
* 可访问性契约:`role="status"` + `aria-live="polite"`;无文案时兜底
|
|
4
4
|
* `aria-label="Loading"` 保证可访问名;spinner 纯 CSS 动画并尊重
|
|
5
5
|
* `prefers-reduced-motion`。
|
|
@@ -20,7 +20,50 @@ export interface QwLoadingProps {
|
|
|
20
20
|
/** 块级居中占位(整页/区域加载)。 */
|
|
21
21
|
block?: boolean;
|
|
22
22
|
/** 加载文案(显示于 logo 下方,并作为可访问名)。 */
|
|
23
|
-
label?: string;
|
|
23
|
+
label?: string | null;
|
|
24
24
|
/** 带白底浮层卡片(内边距 + 圆角 + 阴影)。 */
|
|
25
25
|
surface?: boolean;
|
|
26
26
|
}
|
|
27
|
+
export declare const LOADING_PARTS: readonly ["root", "spinner", "label"];
|
|
28
|
+
export type LoadingPart = (typeof LOADING_PARTS)[number];
|
|
29
|
+
export interface LoadingRenderOptions {
|
|
30
|
+
hasRichLabel?: boolean;
|
|
31
|
+
/** Current Provider/explicit native locale key; defaults to historical Loading. */
|
|
32
|
+
loadingAria?: string;
|
|
33
|
+
accessibleLabel?: string | null;
|
|
34
|
+
labelledBy?: string | null;
|
|
35
|
+
describedBy?: string | null;
|
|
36
|
+
}
|
|
37
|
+
export interface ResolvedLoadingState {
|
|
38
|
+
size: LoadingSize;
|
|
39
|
+
surface: boolean;
|
|
40
|
+
block: boolean;
|
|
41
|
+
hasLabel: boolean;
|
|
42
|
+
labelSource: "rich" | "scalar" | "none";
|
|
43
|
+
label?: string | null;
|
|
44
|
+
ariaLabel?: string;
|
|
45
|
+
labelledBy?: string;
|
|
46
|
+
describedBy?: string;
|
|
47
|
+
}
|
|
48
|
+
/** Shared content presence, language fallback and display semantics; no DOM access. */
|
|
49
|
+
export declare function resolveLoadingState(props?: QwLoadingProps, options?: LoadingRenderOptions): ResolvedLoadingState;
|
|
50
|
+
export interface LoadingRootProps {
|
|
51
|
+
"data-scope": "loading";
|
|
52
|
+
"data-part": "root";
|
|
53
|
+
"data-size": LoadingSize;
|
|
54
|
+
"data-surface"?: "true";
|
|
55
|
+
"data-block"?: "true";
|
|
56
|
+
role: "status";
|
|
57
|
+
"aria-live": "polite";
|
|
58
|
+
"aria-label"?: string;
|
|
59
|
+
"aria-labelledby"?: string;
|
|
60
|
+
"aria-describedby"?: string;
|
|
61
|
+
}
|
|
62
|
+
/** Core-managed attributes take priority over conflicting passthrough attributes. */
|
|
63
|
+
export declare function getLoadingRootProps(state: ResolvedLoadingState): LoadingRootProps;
|
|
64
|
+
export interface LoadingPartProps {
|
|
65
|
+
"data-scope": "loading";
|
|
66
|
+
"data-part": Exclude<LoadingPart, "root">;
|
|
67
|
+
"aria-hidden"?: "true";
|
|
68
|
+
}
|
|
69
|
+
export declare function getLoadingPartProps(part: Exclude<LoadingPart, "root">): LoadingPartProps;
|
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
import { MachineStatus } from "@zag-js/core";
|
|
2
|
+
import { contains, getActiveElement, getParentElement, isHTMLElement, isShadowRoot, queryAll, raf } from "@zag-js/dom-query";
|
|
3
|
+
import { machine } from "@zag-js/dialog";
|
|
4
|
+
import { trackDismissableElement } from "@zag-js/dismissable";
|
|
5
|
+
//#region src/modal-dismissable-lifetime.ts
|
|
6
|
+
/** 这个层的声明节点:显式 origin 优先,退回 trigger。准入与归属两处同一口径。 */
|
|
7
|
+
function modalDeclaration(scope) {
|
|
8
|
+
const node = scope.getById(`dialog:${scope.id}:origin`) ?? scope.getById(`dialog:${scope.id}:trigger`);
|
|
9
|
+
return isHTMLElement(node) ? node : null;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 实例的物理身份 = 它的 effect 起步时拿到的声明节点。id 查不出实例:同一个 id 先后渲染
|
|
13
|
+
* 两遍时,旧实例按 id 回查只会查到新实例的节点。所以起步时的声明一旦离树、又有别的节点
|
|
14
|
+
* 顶着同一个 id 回答查询,就说明声明与内容都已经换了实例,旧的既不能再认领,也不能在
|
|
15
|
+
* 清理时把新实例的层摘走。
|
|
16
|
+
*
|
|
17
|
+
* 起步时本来就没有声明的调用方(headless 自绘)没有可被顶替的身份,保持原口径不变。
|
|
18
|
+
*/
|
|
19
|
+
function modalDeclarationOwned(scope, declaredAtStart) {
|
|
20
|
+
if (!declaredAtStart) return true;
|
|
21
|
+
if (declaredAtStart.isConnected) return true;
|
|
22
|
+
return !modalDeclaration(scope);
|
|
23
|
+
}
|
|
24
|
+
const waiting = /* @__PURE__ */ new Map();
|
|
25
|
+
let flushing = false;
|
|
26
|
+
/** 在任何层开始监听之前调用;只推进既有的等待,不改变任何层的关闭政策。 */
|
|
27
|
+
function admitWaitingModalLayers(declaration) {
|
|
28
|
+
if (!declaration || flushing) return;
|
|
29
|
+
flushing = true;
|
|
30
|
+
try {
|
|
31
|
+
for (const [admit, ticket] of [...waiting]) if (ticket.owned() && contains(ticket.content(), declaration)) admit();
|
|
32
|
+
} finally {
|
|
33
|
+
flushing = false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Wait for the physical node once; keep the public Zag dismissal policy intact. */
|
|
37
|
+
function trackModalDismissableElement({ scope, send, prop }) {
|
|
38
|
+
const getIds = () => scope.ids;
|
|
39
|
+
const id = (part) => getIds()?.[part] ?? `dialog:${scope.id}:${part}`;
|
|
40
|
+
const customTrigger = getIds()?.trigger;
|
|
41
|
+
const triggerId = typeof customTrigger === "function" ? customTrigger(void 0) : customTrigger ?? `dialog:${scope.id}:trigger`;
|
|
42
|
+
const triggers = () => queryAll(scope.getRootNode(), "[data-scope=\"dialog\"][data-part=\"trigger\"], [data-scope=\"popup\"][data-part=\"trigger\"]").filter((node) => node.getAttribute("data-ownedby")?.split(/\s+/).filter(Boolean).includes(String(scope.id)));
|
|
43
|
+
const options = {
|
|
44
|
+
type: "dialog",
|
|
45
|
+
defer: false,
|
|
46
|
+
pointerBlocking: prop("modal"),
|
|
47
|
+
layerStyleTargets: [() => scope.getById(id("backdrop")), () => scope.getById(id("positioner"))],
|
|
48
|
+
exclude: () => [scope.getById(triggerId), ...triggers()].filter(Boolean),
|
|
49
|
+
onInteractOutside(event) {
|
|
50
|
+
prop("onInteractOutside")?.(event);
|
|
51
|
+
if (!prop("closeOnInteractOutside")) event.preventDefault();
|
|
52
|
+
},
|
|
53
|
+
persistentElements: prop("persistentElements"),
|
|
54
|
+
onFocusOutside: prop("onFocusOutside"),
|
|
55
|
+
onPointerDownOutside: prop("onPointerDownOutside"),
|
|
56
|
+
onRequestDismiss: prop("onRequestDismiss"),
|
|
57
|
+
onEscapeKeyDown(event) {
|
|
58
|
+
prop("onEscapeKeyDown")?.(event);
|
|
59
|
+
if (!prop("closeOnEscape")) event.preventDefault();
|
|
60
|
+
},
|
|
61
|
+
onDismiss() {
|
|
62
|
+
send({
|
|
63
|
+
type: "CLOSE",
|
|
64
|
+
src: "interact-outside"
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
let release;
|
|
69
|
+
let cancelFrame;
|
|
70
|
+
let observer;
|
|
71
|
+
let canceled = false;
|
|
72
|
+
const contentNode = () => scope.getById(id("content"));
|
|
73
|
+
const declaredAtStart = modalDeclaration(scope);
|
|
74
|
+
const owned = () => modalDeclarationOwned(scope, declaredAtStart);
|
|
75
|
+
const admit = () => {
|
|
76
|
+
if (canceled || release || !owned()) return;
|
|
77
|
+
const content = contentNode();
|
|
78
|
+
if (canceled || release || !content) return;
|
|
79
|
+
waiting.delete(admit);
|
|
80
|
+
cancelFrame?.();
|
|
81
|
+
cancelFrame = void 0;
|
|
82
|
+
observer?.disconnect();
|
|
83
|
+
observer = void 0;
|
|
84
|
+
release = trackDismissableElement(content, options);
|
|
85
|
+
};
|
|
86
|
+
waiting.set(admit, {
|
|
87
|
+
content: contentNode,
|
|
88
|
+
owned
|
|
89
|
+
});
|
|
90
|
+
queueMicrotask(() => {
|
|
91
|
+
if (canceled || release) return;
|
|
92
|
+
admit();
|
|
93
|
+
if (release || canceled) return;
|
|
94
|
+
const doc = scope.getDoc();
|
|
95
|
+
const Observer = doc?.defaultView?.MutationObserver;
|
|
96
|
+
if (Observer) {
|
|
97
|
+
observer = new Observer(() => admit());
|
|
98
|
+
observer.observe(doc, {
|
|
99
|
+
childList: true,
|
|
100
|
+
subtree: true
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
cancelFrame = raf(admit);
|
|
104
|
+
});
|
|
105
|
+
return () => {
|
|
106
|
+
if (canceled) return;
|
|
107
|
+
canceled = true;
|
|
108
|
+
waiting.delete(admit);
|
|
109
|
+
cancelFrame?.();
|
|
110
|
+
observer?.disconnect();
|
|
111
|
+
observer = void 0;
|
|
112
|
+
release?.();
|
|
113
|
+
release = void 0;
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//#endregion
|
|
117
|
+
//#region src/modal-registry.ts
|
|
118
|
+
/**
|
|
119
|
+
* 模态登记。Dialog 与 Popup 共用,只放在模块内存,不读 document。
|
|
120
|
+
* 被拒打开「只通知一次」也记在这里:createPopupProps 每次渲染都会重入,纯函数记不住。
|
|
121
|
+
*/
|
|
122
|
+
const modals = /* @__PURE__ */ new Map();
|
|
123
|
+
const rejectedOpenNotices = /* @__PURE__ */ new Set();
|
|
124
|
+
const modalSessionTokens = /* @__PURE__ */ new Map();
|
|
125
|
+
/** Private read-only qualification; does not register a DOM node or change admission. */
|
|
126
|
+
function registeredModalKind(id) {
|
|
127
|
+
return modals.get(id);
|
|
128
|
+
}
|
|
129
|
+
/** Private finite effect snapshot of current registrations; no DOM or historical state. */
|
|
130
|
+
function registeredModalEntries() {
|
|
131
|
+
return [...modals];
|
|
132
|
+
}
|
|
133
|
+
/** open 为 true 时登记(同 id 覆盖,不计两次);为 false 时注销。幂等。 */
|
|
134
|
+
function syncModalRegistration(id, kind, open) {
|
|
135
|
+
if (open) modals.set(id, kind);
|
|
136
|
+
else modals.delete(id);
|
|
137
|
+
}
|
|
138
|
+
/** 是否存在 id 不同的已登记模态。 */
|
|
139
|
+
function hasOtherModal(id) {
|
|
140
|
+
if (modals.size === 0) return false;
|
|
141
|
+
if (modals.size === 1 && modals.has(id)) return false;
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
/** 本次被拒的打开尝试还没通知过时返回 true。不从包入口导出。 */
|
|
145
|
+
function claimRejectedOpenNotice(id) {
|
|
146
|
+
if (rejectedOpenNotices.has(id)) return false;
|
|
147
|
+
rejectedOpenNotices.add(id);
|
|
148
|
+
if (!modalSessionTokens.has(id)) modalSessionTokens.set(id, Symbol(id));
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
/** 调用方撤回打开,或阻塞模态消失后,允许下一次尝试再通知。 */
|
|
152
|
+
function releaseRejectedOpenNotice(id) {
|
|
153
|
+
rejectedOpenNotices.delete(id);
|
|
154
|
+
}
|
|
155
|
+
/** Internal token: invalidates deferred notices when the session is disposed. */
|
|
156
|
+
function rejectedOpenNoticeToken(id) {
|
|
157
|
+
return modalSessionTokens.get(id);
|
|
158
|
+
}
|
|
159
|
+
/** Dispose a modal session on unmount/disconnect, including its pending rejection notice. */
|
|
160
|
+
function disposeModalSession(id) {
|
|
161
|
+
modals.delete(id);
|
|
162
|
+
modalSessionTokens.delete(id);
|
|
163
|
+
releaseRejectedOpenNotice(id);
|
|
164
|
+
}
|
|
165
|
+
/** Internal identity replacement: ignore only the same runtime's retiring sessions. */
|
|
166
|
+
function hasOtherModalExcept(id, ignored) {
|
|
167
|
+
return [...modals.keys()].some((owner) => owner !== id && !ignored.includes(owner));
|
|
168
|
+
}
|
|
169
|
+
//#endregion
|
|
170
|
+
//#region src/modal-dialog-machine.ts
|
|
171
|
+
const closeToken = Symbol("qw-modal-close");
|
|
172
|
+
const requests = /* @__PURE__ */ new WeakMap();
|
|
173
|
+
const beforeClose = /* @__PURE__ */ new WeakMap();
|
|
174
|
+
/** Pinned Zag adapters recreate scopes on render; their bindable state ref owns the service lifetime. */
|
|
175
|
+
function modalInstance(target) {
|
|
176
|
+
return target.state.ref;
|
|
177
|
+
}
|
|
178
|
+
/** A composed modal may restore its draft before the owner receives a close request. */
|
|
179
|
+
function onModalBeforeClose(target, prepare) {
|
|
180
|
+
const instance = modalInstance(target);
|
|
181
|
+
beforeClose.set(instance, prepare);
|
|
182
|
+
return () => {
|
|
183
|
+
if (beforeClose.get(instance) === prepare) beforeClose.delete(instance);
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
function cancelModalClose(target) {
|
|
187
|
+
const token = requests.get(modalInstance(target))?.current;
|
|
188
|
+
if (token) token.cancelled = true;
|
|
189
|
+
}
|
|
190
|
+
function delivered(event) {
|
|
191
|
+
return event[closeToken];
|
|
192
|
+
}
|
|
193
|
+
/** Client request boundary shared by connectors and native dismissal effects. Never run during render. */
|
|
194
|
+
function modalRequestSend(target) {
|
|
195
|
+
return (event) => {
|
|
196
|
+
const lifetime = requests.get(modalInstance(target));
|
|
197
|
+
if (!lifetime) return;
|
|
198
|
+
if (event.type === "OPEN") {
|
|
199
|
+
if (lifetime.current) lifetime.current.cancelled = true;
|
|
200
|
+
target.send(event);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (!((event.type === "CLOSE" || event.type === "TOGGLE") && target.state.matches("open"))) {
|
|
204
|
+
target.send(event);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (lifetime.current) return;
|
|
208
|
+
const token = {
|
|
209
|
+
cancelled: false,
|
|
210
|
+
lifetime
|
|
211
|
+
};
|
|
212
|
+
lifetime.current = token;
|
|
213
|
+
try {
|
|
214
|
+
beforeClose.get(modalInstance(target))?.();
|
|
215
|
+
if (token.cancelled || requests.get(modalInstance(target)) !== lifetime) return;
|
|
216
|
+
target.prop("onOpenChange")?.({ open: false });
|
|
217
|
+
if (!token.cancelled && requests.get(modalInstance(target)) === lifetime) target.send({
|
|
218
|
+
...event,
|
|
219
|
+
[closeToken]: token
|
|
220
|
+
});
|
|
221
|
+
} finally {
|
|
222
|
+
lifetime.current = void 0;
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/** Preserve the upstream service and its method receiver; replace only its request transport. */
|
|
227
|
+
function modalRequestService(service) {
|
|
228
|
+
const active = () => service.getStatus() === MachineStatus.Started;
|
|
229
|
+
const send = modalRequestSend({
|
|
230
|
+
...service,
|
|
231
|
+
send: (event) => {
|
|
232
|
+
if (active()) service.send(event);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
return {
|
|
236
|
+
...service,
|
|
237
|
+
send: (event) => {
|
|
238
|
+
if (service.getStatus() === MachineStatus.NotStarted) service.send(event);
|
|
239
|
+
else if (active()) send(event);
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
function closeAllowed(params) {
|
|
244
|
+
const token = delivered(params.event);
|
|
245
|
+
return !token || !token.cancelled && requests.get(modalInstance(params)) === token.lifetime;
|
|
246
|
+
}
|
|
247
|
+
function guardClose(input) {
|
|
248
|
+
return input && (Array.isArray(input) ? input : [input]).map((item) => ({
|
|
249
|
+
...item,
|
|
250
|
+
guard: (params) => closeAllowed(params) && (!item.guard || (typeof item.guard === "function" ? item.guard(params) : params.guard(item.guard)) === true)
|
|
251
|
+
}));
|
|
252
|
+
}
|
|
253
|
+
const HTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
|
|
254
|
+
let removingContent = null;
|
|
255
|
+
/** Pure declaration facts; not modal registration or trigger behavior. */
|
|
256
|
+
function modalOriginAttrs(id, kind) {
|
|
257
|
+
return {
|
|
258
|
+
id: `dialog:${id}:origin`,
|
|
259
|
+
"data-qw-modal-origin": kind
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
const installed = /* @__PURE__ */ new WeakSet();
|
|
263
|
+
const parts = {
|
|
264
|
+
backdrop: "backdrop",
|
|
265
|
+
positioner: "positioner",
|
|
266
|
+
content: "content",
|
|
267
|
+
title: "title",
|
|
268
|
+
description: "description",
|
|
269
|
+
close: "close-trigger"
|
|
270
|
+
};
|
|
271
|
+
/** Keep the physical scope; resolve only this instance's generated owner-body parts. */
|
|
272
|
+
function installModalLookup(scope) {
|
|
273
|
+
if (installed.has(scope)) return;
|
|
274
|
+
installed.add(scope);
|
|
275
|
+
const getById = scope.getById;
|
|
276
|
+
scope.getById = (id) => {
|
|
277
|
+
const found = getById(id);
|
|
278
|
+
if (found) return found;
|
|
279
|
+
const root = scope.getRootNode();
|
|
280
|
+
if (!isShadowRoot(root) || !root.host.isConnected) return null;
|
|
281
|
+
const prefix = `dialog:${scope.id}:`;
|
|
282
|
+
const suffix = id.slice(prefix.length);
|
|
283
|
+
if (!id.startsWith(prefix) || !Object.hasOwn(parts, suffix)) return null;
|
|
284
|
+
const doc = root.ownerDocument;
|
|
285
|
+
const node = doc.getElementById(id);
|
|
286
|
+
const kind = node?.getAttribute("data-scope");
|
|
287
|
+
if (!node || node.namespaceURI !== HTML_NAMESPACE || kind !== "dialog" && kind !== "popup" || node.getAttribute("data-part") !== parts[suffix]) return null;
|
|
288
|
+
const positioner = suffix === "backdrop" ? node : node.closest(`[data-scope="${kind}"][data-part="positioner"]`);
|
|
289
|
+
if (positioner?.namespaceURI !== HTML_NAMESPACE || positioner.parentElement !== doc.body || positioner.id !== prefix + (suffix === "backdrop" ? "backdrop" : "positioner")) return null;
|
|
290
|
+
if (suffix !== "backdrop" && suffix !== "positioner") {
|
|
291
|
+
const content = node.closest(`[data-scope="${kind}"][data-part="content"]`);
|
|
292
|
+
if (content?.namespaceURI !== HTML_NAMESPACE || content.id !== prefix + "content") return null;
|
|
293
|
+
}
|
|
294
|
+
return node;
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
/** Share ownership and focus delegation while selecting the component's effect. */
|
|
298
|
+
function createModalDialogMachine(trackDismissableElement = machine.implementations.effects.trackDismissableElement) {
|
|
299
|
+
return {
|
|
300
|
+
...machine,
|
|
301
|
+
entry(params) {
|
|
302
|
+
requests.set(modalInstance(params), {});
|
|
303
|
+
return typeof machine.entry === "function" ? machine.entry(params) : machine.entry;
|
|
304
|
+
},
|
|
305
|
+
exit(params) {
|
|
306
|
+
const lifetime = requests.get(modalInstance(params));
|
|
307
|
+
if (lifetime?.current) lifetime.current.cancelled = true;
|
|
308
|
+
requests.delete(modalInstance(params));
|
|
309
|
+
return typeof machine.exit === "function" ? machine.exit(params) : machine.exit;
|
|
310
|
+
},
|
|
311
|
+
states: {
|
|
312
|
+
...machine.states,
|
|
313
|
+
open: {
|
|
314
|
+
...machine.states.open,
|
|
315
|
+
on: {
|
|
316
|
+
...machine.states.open.on,
|
|
317
|
+
CLOSE: guardClose(machine.states.open.on.CLOSE),
|
|
318
|
+
TOGGLE: guardClose(machine.states.open.on.TOGGLE)
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
},
|
|
322
|
+
implementations: {
|
|
323
|
+
...machine.implementations,
|
|
324
|
+
actions: {
|
|
325
|
+
...machine.implementations.actions,
|
|
326
|
+
invokeOnClose(params) {
|
|
327
|
+
if (delivered(params.event)) return;
|
|
328
|
+
machine.implementations.actions.invokeOnClose(params);
|
|
329
|
+
}
|
|
330
|
+
},
|
|
331
|
+
effects: {
|
|
332
|
+
...machine.implementations.effects,
|
|
333
|
+
trackDismissableElement(params) {
|
|
334
|
+
const declaredAtStart = modalDeclaration(params.scope);
|
|
335
|
+
admitWaitingModalLayers(declaredAtStart);
|
|
336
|
+
let content = null;
|
|
337
|
+
let origin = null;
|
|
338
|
+
let parents = [];
|
|
339
|
+
let kind;
|
|
340
|
+
const sources = /* @__PURE__ */ new Set();
|
|
341
|
+
const captureSources = () => {
|
|
342
|
+
const doc = params.scope.getDoc();
|
|
343
|
+
for (const [id, registered] of registeredModalEntries()) {
|
|
344
|
+
const node = doc.getElementById(`dialog:${id}:content`);
|
|
345
|
+
const positioner = node?.parentElement;
|
|
346
|
+
if (isHTMLElement(node) && node.namespaceURI === HTML_NAMESPACE && node.getAttribute("data-scope") === registered && node.getAttribute("data-part") === "content" && node.getAttribute("role") === "dialog" && positioner?.namespaceURI === HTML_NAMESPACE && positioner.id === `dialog:${id}:positioner` && positioner.getAttribute("data-scope") === registered && positioner.getAttribute("data-part") === "positioner" && positioner.parentElement === doc.body) sources.add(node);
|
|
347
|
+
}
|
|
348
|
+
};
|
|
349
|
+
const readParents = (node) => {
|
|
350
|
+
const found = [];
|
|
351
|
+
for (let parent = getParentElement(node); isHTMLElement(parent); parent = getParentElement(parent)) {
|
|
352
|
+
if (parent.namespaceURI !== HTML_NAMESPACE || parent.getAttribute("data-part") !== "content" || parent.getAttribute("role") !== "dialog") continue;
|
|
353
|
+
const id = parent.id;
|
|
354
|
+
if (!id.startsWith("dialog:") || !id.endsWith(":content")) continue;
|
|
355
|
+
const owner = id.slice(7, -8);
|
|
356
|
+
const registered = registeredModalKind(owner);
|
|
357
|
+
if (owner !== params.scope.id && (registered && parent.getAttribute("data-scope") === registered && parent.ownerDocument.getElementById(id) === parent || parents.includes(parent))) found.push(parent);
|
|
358
|
+
}
|
|
359
|
+
return found;
|
|
360
|
+
};
|
|
361
|
+
const scope = {
|
|
362
|
+
...params.scope,
|
|
363
|
+
getById(id) {
|
|
364
|
+
const node = params.scope.getById(id);
|
|
365
|
+
if (!origin && params.scope.id !== void 0 && id === `dialog:${params.scope.id}:content` && isHTMLElement(node) && node.namespaceURI === HTML_NAMESPACE && modalDeclarationOwned(params.scope, declaredAtStart)) {
|
|
366
|
+
kind ??= registeredModalKind(params.scope.id);
|
|
367
|
+
if (kind) {
|
|
368
|
+
const declaration = modalDeclaration(params.scope);
|
|
369
|
+
if (declaration && declaration.namespaceURI === HTML_NAMESPACE && declaration.ownerDocument === node.ownerDocument && (declaration.getAttribute("data-qw-modal-origin") === kind || declaration.getAttribute("data-scope") === kind && declaration.getAttribute("data-part") === "trigger")) {
|
|
370
|
+
content = node;
|
|
371
|
+
origin = declaration;
|
|
372
|
+
parents = readParents(declaration);
|
|
373
|
+
captureSources();
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return node;
|
|
378
|
+
}
|
|
379
|
+
};
|
|
380
|
+
const overrides = { get onRequestDismiss() {
|
|
381
|
+
const original = params.prop("onRequestDismiss");
|
|
382
|
+
const handler = function(event) {
|
|
383
|
+
original?.call(this, event);
|
|
384
|
+
if (event.defaultPrevented || !origin || !content || kind !== "dialog" || event.detail.originalLayer !== content || event.target !== content) return;
|
|
385
|
+
const parent = event.detail.targetLayer;
|
|
386
|
+
if (!parent || parent === content) return;
|
|
387
|
+
if (parent.ownerDocument !== content.ownerDocument) {
|
|
388
|
+
if (parent === removingContent) event.preventDefault();
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
if (!sources.has(parent)) {
|
|
392
|
+
captureSources();
|
|
393
|
+
if (!sources.has(parent)) return;
|
|
394
|
+
}
|
|
395
|
+
if (!(origin.isConnected ? readParents(origin) : parents).includes(parent)) event.preventDefault();
|
|
396
|
+
};
|
|
397
|
+
return handler;
|
|
398
|
+
} };
|
|
399
|
+
const prop = (key) => overrides[key] ?? params.prop(key);
|
|
400
|
+
let active = true;
|
|
401
|
+
const send = modalRequestSend(params);
|
|
402
|
+
const cleanup = trackDismissableElement?.call(machine.implementations.effects, {
|
|
403
|
+
...params,
|
|
404
|
+
scope,
|
|
405
|
+
prop,
|
|
406
|
+
send: (event) => {
|
|
407
|
+
if (active) send(event);
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
return () => {
|
|
411
|
+
active = false;
|
|
412
|
+
const previous = removingContent;
|
|
413
|
+
removingContent = content && sources.has(content) ? content : null;
|
|
414
|
+
try {
|
|
415
|
+
cleanup?.();
|
|
416
|
+
} finally {
|
|
417
|
+
removingContent = previous;
|
|
418
|
+
sources.clear();
|
|
419
|
+
parents = [];
|
|
420
|
+
origin = null;
|
|
421
|
+
content = null;
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
},
|
|
425
|
+
trapFocus(params) {
|
|
426
|
+
const docBeforeTrap = params.scope.getDoc();
|
|
427
|
+
const focusBeforeTrap = docBeforeTrap ? getActiveElement(docBeforeTrap) : null;
|
|
428
|
+
const contentBeforeTrap = params.scope.getById(`dialog:${params.scope.id}:content`);
|
|
429
|
+
let kind;
|
|
430
|
+
const scope = {
|
|
431
|
+
...params.scope,
|
|
432
|
+
getById(id) {
|
|
433
|
+
const node = params.scope.getById(id);
|
|
434
|
+
if (params.scope.id !== void 0 && id === `dialog:${params.scope.id}:content` && node?.namespaceURI === HTML_NAMESPACE && node.getAttribute("data-part") === "content") kind ??= registeredModalKind(params.scope.id);
|
|
435
|
+
return node;
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
const overrides = { finalFocusEl: () => {
|
|
439
|
+
const original = params.prop("finalFocusEl");
|
|
440
|
+
if (original) return original();
|
|
441
|
+
const doc = params.scope.getDoc();
|
|
442
|
+
if (kind === "popup") {
|
|
443
|
+
if (isHTMLElement(focusBeforeTrap) && focusBeforeTrap.isConnected && focusBeforeTrap.ownerDocument === doc && focusBeforeTrap !== doc.body && !contentBeforeTrap?.contains(focusBeforeTrap)) return null;
|
|
444
|
+
for (const trigger of params.scope.getRootNode().querySelectorAll("[data-scope=\"popup\"][data-part=\"trigger\"][data-ownedby]")) if (trigger.getAttribute("data-ownedby") === params.scope.id && isHTMLElement(trigger) && trigger.isConnected) return trigger;
|
|
445
|
+
return null;
|
|
446
|
+
}
|
|
447
|
+
if (kind !== "dialog") return null;
|
|
448
|
+
const fallback = () => {
|
|
449
|
+
if (!isHTMLElement(focusBeforeTrap) || !focusBeforeTrap.isConnected || focusBeforeTrap.ownerDocument !== doc || focusBeforeTrap === doc.body || contentBeforeTrap?.contains(focusBeforeTrap) || params.prop("ids")?.trigger != null) return null;
|
|
450
|
+
const root = params.scope.getRootNode();
|
|
451
|
+
for (const trigger of root.querySelectorAll("[data-scope=\"dialog\"][data-part=\"trigger\"][data-ownedby]")) if (trigger.getAttribute("data-ownedby") === params.scope.id) return null;
|
|
452
|
+
return focusBeforeTrap;
|
|
453
|
+
};
|
|
454
|
+
const active = getActiveElement(doc);
|
|
455
|
+
if (!active || active.ownerDocument !== doc) return fallback();
|
|
456
|
+
for (let node = active; isHTMLElement(node); node = getParentElement(node)) {
|
|
457
|
+
if (node.namespaceURI !== HTML_NAMESPACE || node.getAttribute("data-scope") !== "dialog" || node.getAttribute("data-part") !== "content") continue;
|
|
458
|
+
const id = node.id;
|
|
459
|
+
if (!id.startsWith("dialog:") || !id.endsWith(":content")) return null;
|
|
460
|
+
const owner = id.slice(7, -8);
|
|
461
|
+
const positioner = node.parentElement;
|
|
462
|
+
if (owner !== params.scope.id && registeredModalKind(owner) === "dialog" && doc.getElementById(id) === node && node.getAttribute("role") === "dialog" && positioner?.namespaceURI === HTML_NAMESPACE && positioner.id === `dialog:${owner}:positioner` && positioner.getAttribute("data-scope") === "dialog" && positioner.getAttribute("data-part") === "positioner" && positioner.parentElement === doc.body) return active;
|
|
463
|
+
return fallback();
|
|
464
|
+
}
|
|
465
|
+
return fallback();
|
|
466
|
+
} };
|
|
467
|
+
const prop = (key) => overrides[key] ?? params.prop(key);
|
|
468
|
+
return machine.implementations.effects.trapFocus({
|
|
469
|
+
...params,
|
|
470
|
+
scope,
|
|
471
|
+
prop
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
},
|
|
476
|
+
props(params) {
|
|
477
|
+
installModalLookup(params.scope);
|
|
478
|
+
return machine.props(params);
|
|
479
|
+
}
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
/** Props initialization receives the real instance scope; all DOM reads stay lazy. */
|
|
483
|
+
const modalDialogMachine = createModalDialogMachine();
|
|
484
|
+
//#endregion
|
|
485
|
+
export { modalRequestSend as a, claimRejectedOpenNotice as c, hasOtherModalExcept as d, rejectedOpenNoticeToken as f, trackModalDismissableElement as h, modalOriginAttrs as i, disposeModalSession as l, syncModalRegistration as m, createModalDialogMachine as n, modalRequestService as o, releaseRejectedOpenNotice as p, modalDialogMachine as r, onModalBeforeClose as s, cancelModalClose as t, hasOtherModal as u };
|
|
486
|
+
|
|
487
|
+
//# sourceMappingURL=modal-dialog-machine-CF9_z3Dm.js.map
|