@ruixinkeji/prism-ui 1.0.14 → 1.0.16
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 +6 -2
- package/dist/build/h5/assets/PrismCode-D1lrgx1M.css +1 -0
- package/dist/build/h5/assets/PrismCode.CNOtat_X.js +1 -0
- package/dist/build/h5/assets/PrismGroupSticky-CBFeo0AB.css +1 -0
- package/dist/build/h5/assets/PrismGroupSticky.CmJXt6ws.js +1 -0
- package/dist/build/h5/assets/PrismMusicPlayer-CHVtYDn7.css +1 -0
- package/dist/build/h5/assets/PrismMusicPlayer.DAW3y5Km.js +1 -0
- package/dist/build/h5/assets/PrismNavBar-CYetauMR.css +1 -0
- package/dist/build/h5/assets/PrismNavBar.CFM58fal.js +1 -0
- package/dist/build/h5/assets/PrismSwiper-CDtZrfyq.css +1 -0
- package/dist/build/h5/assets/PrismSwiper.DTGFNn5Q.js +1 -0
- package/dist/build/h5/assets/PrismTabBar-BW0exu0j.css +1 -0
- package/dist/build/h5/assets/PrismTabBar.DPe-iC_F.js +1 -0
- package/dist/build/h5/assets/basic-tn0RQdqM.css +0 -0
- package/dist/build/h5/assets/card-layout-BZuodKCJ.css +1 -0
- package/dist/build/h5/assets/colors-RgTfwcKp.css +1 -0
- package/dist/build/h5/assets/data-DSHiB3Xs.css +1 -0
- package/dist/build/h5/assets/effects-CNFDtZjf.css +1 -0
- package/dist/build/h5/assets/examples-CSzKlb8B.css +1 -0
- package/dist/build/h5/assets/fa-brands-400-C99Yv4gD.woff2 +0 -0
- package/dist/build/h5/assets/fa-regular-400-OOsPf1xj.woff2 +0 -0
- package/dist/build/h5/assets/fa-solid-900-DAI24fNt.woff2 +0 -0
- package/dist/build/h5/assets/feedback-BaC8qSUp.css +1 -0
- package/dist/build/h5/assets/form-va-eFD7k.css +1 -0
- package/dist/build/h5/assets/group-CDa_hQkB.css +1 -0
- package/dist/build/h5/assets/iconfont-CW81RyG4.ttf +0 -0
- package/dist/build/h5/assets/icons-83wAdmdh.css +1 -0
- package/dist/build/h5/assets/index-BQ-qpvZH.css +1 -0
- package/dist/build/h5/assets/index-BQnv3xQ8.css +1 -0
- package/dist/build/h5/assets/index-C83xA4hX.css +1 -0
- package/dist/build/h5/assets/index-Cvc14mto.css +1 -0
- package/dist/build/h5/assets/index-D2djL_pA.js +32 -0
- package/dist/build/h5/assets/navigation-D0rlyjtK.css +1 -0
- package/dist/build/h5/assets/pages-demo-basic.BsC9sqol.js +1 -0
- package/dist/build/h5/assets/pages-demo-code-index.BXECig1w.js +1 -0
- package/dist/build/h5/assets/pages-demo-colors.Dl__3Mv9.js +1 -0
- package/dist/build/h5/assets/pages-demo-container.Cy-M9f41.js +1 -0
- package/dist/build/h5/assets/pages-demo-data.CK2JdeBK.js +1 -0
- package/dist/build/h5/assets/pages-demo-effects.CV0rqKht.js +1 -0
- package/dist/build/h5/assets/pages-demo-feedback.BO-G3E1J.js +1 -0
- package/dist/build/h5/assets/pages-demo-form.CsUNLqqe.js +1 -0
- package/dist/build/h5/assets/pages-demo-layout-card-layout.CQ6fF8IK.js +1 -0
- package/dist/build/h5/assets/pages-demo-layout.261GXW2o.js +1 -0
- package/dist/build/h5/assets/pages-demo-navigation.C5hFijVt.js +1 -0
- package/dist/build/h5/assets/pages-demo-other.CVdLVU3_.js +1 -0
- package/dist/build/h5/assets/pages-demo-sticky-group.MDzv6I5L.js +1 -0
- package/dist/build/h5/assets/pages-demo-sticky-index.D2UJUdon.js +1 -0
- package/dist/build/h5/assets/pages-examples-examples.hyUWuu8C.js +1 -0
- package/dist/build/h5/assets/pages-icons-icons.R2erKYQX.js +1 -0
- package/dist/build/h5/assets/pages-index-index.BlfkIjJo.js +1 -0
- package/dist/build/h5/assets/pages-tools-tools.tm3Y1cFN.js +1 -0
- package/dist/build/h5/assets/tools-C1YBcrWJ.css +1 -0
- package/dist/build/h5/assets/uni-app.es.DfNmMcUd.js +1 -0
- package/dist/build/h5/assets/uni.e2868147.css +1 -0
- package/dist/build/h5/assets/useNavbar.BdajVjjC.js +1 -0
- package/dist/build/h5/index.html +23 -0
- package/dist/build/h5/static/fonts/all-icons.txt +453 -0
- package/dist/build/h5/static/fonts/fa-brands-400.woff2 +0 -0
- package/dist/build/h5/static/fonts/fa-regular-400.woff2 +0 -0
- package/dist/build/h5/static/fonts/fa-solid-900.woff2 +0 -0
- package/dist/build/h5/static/fonts/fa-v4compatibility.woff2 +0 -0
- package/dist/build/h5/static/fonts/font-awesome.css +943 -0
- package/dist/build/h5/static/fonts/iconfont.css +62 -0
- package/dist/build/h5/static/fonts/iconfont.js +1 -0
- package/dist/build/h5/static/fonts/iconfont.json +79 -0
- package/dist/build/h5/static/fonts/iconfont.ttf +0 -0
- package/dist/build/h5/static/fonts/iconfont.woff +0 -0
- package/dist/build/h5/static/fonts/iconfont.woff2 +0 -0
- package/dist/build/h5/static/fonts/icons-list.txt +453 -0
- package/dist/build/h5/static/tabbar/examples-active.png +0 -0
- package/dist/build/h5/static/tabbar/examples.png +0 -0
- package/dist/build/h5/static/tabbar/home-active.png +0 -0
- package/dist/build/h5/static/tabbar/home.png +0 -0
- package/dist/build/h5/static/tabbar/icons-active.png +0 -0
- package/dist/build/h5/static/tabbar/icons.png +0 -0
- package/dist/build/h5/static/tabbar/tools-active.png +0 -0
- package/dist/build/h5/static/tabbar/tools.png +0 -0
- package/dist/dev/.nvue/app.css.js +11 -0
- package/dist/dev/.nvue/app.js +2 -0
- package/dist/dev/.sourcemap/mp-weixin/app.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismAddressInput/PrismAddressInput.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismCityCascadeSelect/PrismCityCascadeSelect.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismCityPicker/PrismCityPicker.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismCitySelect/PrismCitySelect.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismCode/PrismCode.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismCodeInput/PrismCodeInput.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismDateTimePicker/PrismDateTimePicker.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismDropdown/PrismDropdown.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismGroupSticky/PrismGroupSticky.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismIdCardInput/PrismIdCardInput.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismIndexBar/PrismIndexBar.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismLicensePlateInput/PrismLicensePlateInput.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismMusicPlayer/PrismMusicPlayer.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismNavBar/PrismNavBar.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismSecureInput/PrismSecureInput.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismSticky/PrismSticky.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismSwiper/PrismSwiper.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismSwitch/PrismSwitch.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismTabBar/PrismTabBar.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismTabs/PrismTabs.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/components/PrismVoiceInput/PrismVoiceInput.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/composables/useNavbar.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/config/theme-colors.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/basic.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/card.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/code/index.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/colors.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/container.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/data.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/effects.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/feedback.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/form.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/layout/card-layout.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/layout.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/navigation.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/other.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/sticky/group.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/sticky/index.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/examples/examples.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/icons/icons.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/pages/tools/tools.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/store/app.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/utils/lunar.js.map +1 -0
- package/dist/dev/.sourcemap/mp-weixin/utils/system.js.map +1 -0
- package/dist/dev/app-plus/__uniappautomator.js +16 -0
- package/dist/dev/app-plus/__uniappchooselocation.js +32 -0
- package/dist/dev/app-plus/__uniapperror.png +0 -0
- package/dist/dev/app-plus/__uniappopenlocation.js +32 -0
- package/dist/dev/app-plus/__uniapppicker.js +33 -0
- package/dist/dev/app-plus/__uniappquill.js +8 -0
- package/dist/dev/app-plus/__uniappquillimageresize.js +1 -0
- package/dist/dev/app-plus/__uniappscan.js +32 -0
- package/dist/dev/app-plus/__uniappsuccess.png +0 -0
- package/dist/dev/app-plus/__uniappview.html +24 -0
- package/dist/dev/app-plus/app-config-service.js +11 -0
- package/dist/dev/app-plus/app-config.js +1 -0
- package/dist/dev/app-plus/app-service.js +23663 -0
- package/dist/dev/app-plus/app.css +8955 -0
- package/dist/dev/app-plus/manifest.json +91 -0
- package/dist/dev/app-plus/pages/demo/basic.css +524 -0
- package/dist/dev/app-plus/pages/demo/code/index.css +541 -0
- package/dist/dev/app-plus/pages/demo/colors.css +4008 -0
- package/dist/dev/app-plus/pages/demo/container.css +524 -0
- package/dist/dev/app-plus/pages/demo/data.css +705 -0
- package/dist/dev/app-plus/pages/demo/effects.css +530 -0
- package/dist/dev/app-plus/pages/demo/feedback.css +590 -0
- package/dist/dev/app-plus/pages/demo/form.css +3422 -0
- package/dist/dev/app-plus/pages/demo/layout/card-layout.css +785 -0
- package/dist/dev/app-plus/pages/demo/layout.css +524 -0
- package/dist/dev/app-plus/pages/demo/navigation.css +769 -0
- package/dist/dev/app-plus/pages/demo/other.css +524 -0
- package/dist/dev/app-plus/pages/demo/sticky/group.css +788 -0
- package/dist/dev/app-plus/pages/demo/sticky/index.css +894 -0
- package/dist/dev/app-plus/pages/examples/examples.css +1031 -0
- package/dist/dev/app-plus/pages/icons/icons.css +3310 -0
- package/dist/dev/app-plus/pages/index/index.css +696 -0
- package/dist/dev/app-plus/pages/tools/tools.css +378 -0
- package/dist/dev/app-plus/static/fonts/all-icons.txt +453 -0
- package/dist/dev/app-plus/static/fonts/fa-brands-400.woff2 +0 -0
- package/dist/dev/app-plus/static/fonts/fa-regular-400.woff2 +0 -0
- package/dist/dev/app-plus/static/fonts/fa-solid-900.woff2 +0 -0
- package/dist/dev/app-plus/static/fonts/fa-v4compatibility.woff2 +0 -0
- package/dist/dev/app-plus/static/fonts/font-awesome.css +943 -0
- package/dist/dev/app-plus/static/fonts/iconfont.css +62 -0
- package/dist/dev/app-plus/static/fonts/iconfont.js +1 -0
- package/dist/dev/app-plus/static/fonts/iconfont.json +79 -0
- package/dist/dev/app-plus/static/fonts/iconfont.ttf +0 -0
- package/dist/dev/app-plus/static/fonts/iconfont.woff +0 -0
- package/dist/dev/app-plus/static/fonts/iconfont.woff2 +0 -0
- package/dist/dev/app-plus/static/fonts/icons-list.txt +453 -0
- package/dist/dev/app-plus/static/tabbar/examples-active.png +0 -0
- package/dist/dev/app-plus/static/tabbar/examples.png +0 -0
- package/dist/dev/app-plus/static/tabbar/home-active.png +0 -0
- package/dist/dev/app-plus/static/tabbar/home.png +0 -0
- package/dist/dev/app-plus/static/tabbar/icons-active.png +0 -0
- package/dist/dev/app-plus/static/tabbar/icons.png +0 -0
- package/dist/dev/app-plus/static/tabbar/tools-active.png +0 -0
- package/dist/dev/app-plus/static/tabbar/tools.png +0 -0
- package/dist/dev/app-plus/uni-app-view.umd.js +7 -0
- package/dist/dev/mp-weixin/app.js +49 -0
- package/dist/dev/mp-weixin/app.json +29 -0
- package/dist/dev/mp-weixin/app.wxss +9072 -0
- package/dist/dev/mp-weixin/common/vendor.js +15968 -0
- package/dist/dev/mp-weixin/components/PrismAddressInput/PrismAddressInput.js +200 -0
- package/dist/dev/mp-weixin/components/PrismAddressInput/PrismAddressInput.json +4 -0
- package/dist/dev/mp-weixin/components/PrismAddressInput/PrismAddressInput.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismAddressInput/PrismAddressInput.wxss +327 -0
- package/dist/dev/mp-weixin/components/PrismCityCascadeSelect/PrismCityCascadeSelect.js +449 -0
- package/dist/dev/mp-weixin/components/PrismCityCascadeSelect/PrismCityCascadeSelect.json +4 -0
- package/dist/dev/mp-weixin/components/PrismCityCascadeSelect/PrismCityCascadeSelect.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismCityCascadeSelect/PrismCityCascadeSelect.wxss +264 -0
- package/dist/dev/mp-weixin/components/PrismCityPicker/PrismCityPicker.js +531 -0
- package/dist/dev/mp-weixin/components/PrismCityPicker/PrismCityPicker.json +4 -0
- package/dist/dev/mp-weixin/components/PrismCityPicker/PrismCityPicker.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismCityPicker/PrismCityPicker.wxss +309 -0
- package/dist/dev/mp-weixin/components/PrismCitySelect/PrismCitySelect.js +200 -0
- package/dist/dev/mp-weixin/components/PrismCitySelect/PrismCitySelect.json +6 -0
- package/dist/dev/mp-weixin/components/PrismCitySelect/PrismCitySelect.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismCitySelect/PrismCitySelect.wxss +225 -0
- package/dist/dev/mp-weixin/components/PrismCode/PrismCode.js +337 -0
- package/dist/dev/mp-weixin/components/PrismCode/PrismCode.json +4 -0
- package/dist/dev/mp-weixin/components/PrismCode/PrismCode.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismCode/PrismCode.wxss +345 -0
- package/dist/dev/mp-weixin/components/PrismCodeInput/PrismCodeInput.js +70 -0
- package/dist/dev/mp-weixin/components/PrismCodeInput/PrismCodeInput.json +4 -0
- package/dist/dev/mp-weixin/components/PrismCodeInput/PrismCodeInput.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismCodeInput/PrismCodeInput.wxss +115 -0
- package/dist/dev/mp-weixin/components/PrismDateTimePicker/PrismDateTimePicker.js +468 -0
- package/dist/dev/mp-weixin/components/PrismDateTimePicker/PrismDateTimePicker.json +4 -0
- package/dist/dev/mp-weixin/components/PrismDateTimePicker/PrismDateTimePicker.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismDateTimePicker/PrismDateTimePicker.wxss +309 -0
- package/dist/dev/mp-weixin/components/PrismDropdown/PrismDropdown.js +63 -0
- package/dist/dev/mp-weixin/components/PrismDropdown/PrismDropdown.json +4 -0
- package/dist/dev/mp-weixin/components/PrismDropdown/PrismDropdown.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismDropdown/PrismDropdown.wxss +0 -0
- package/dist/dev/mp-weixin/components/PrismGroupSticky/PrismGroupSticky.js +128 -0
- package/dist/dev/mp-weixin/components/PrismGroupSticky/PrismGroupSticky.json +4 -0
- package/dist/dev/mp-weixin/components/PrismGroupSticky/PrismGroupSticky.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismGroupSticky/PrismGroupSticky.wxss +191 -0
- package/dist/dev/mp-weixin/components/PrismIdCardInput/PrismIdCardInput.js +123 -0
- package/dist/dev/mp-weixin/components/PrismIdCardInput/PrismIdCardInput.json +4 -0
- package/dist/dev/mp-weixin/components/PrismIdCardInput/PrismIdCardInput.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismIdCardInput/PrismIdCardInput.wxss +114 -0
- package/dist/dev/mp-weixin/components/PrismIndexBar/PrismIndexBar.js +108 -0
- package/dist/dev/mp-weixin/components/PrismIndexBar/PrismIndexBar.json +4 -0
- package/dist/dev/mp-weixin/components/PrismIndexBar/PrismIndexBar.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismIndexBar/PrismIndexBar.wxss +135 -0
- package/dist/dev/mp-weixin/components/PrismLicensePlateInput/PrismLicensePlateInput.js +449 -0
- package/dist/dev/mp-weixin/components/PrismLicensePlateInput/PrismLicensePlateInput.json +4 -0
- package/dist/dev/mp-weixin/components/PrismLicensePlateInput/PrismLicensePlateInput.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismLicensePlateInput/PrismLicensePlateInput.wxss +445 -0
- package/dist/dev/mp-weixin/components/PrismMusicPlayer/PrismMusicPlayer.js +200 -0
- package/dist/dev/mp-weixin/components/PrismMusicPlayer/PrismMusicPlayer.json +4 -0
- package/dist/dev/mp-weixin/components/PrismMusicPlayer/PrismMusicPlayer.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismMusicPlayer/PrismMusicPlayer.wxss +334 -0
- package/dist/dev/mp-weixin/components/PrismNavBar/PrismNavBar.js +71 -0
- package/dist/dev/mp-weixin/components/PrismNavBar/PrismNavBar.json +4 -0
- package/dist/dev/mp-weixin/components/PrismNavBar/PrismNavBar.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismNavBar/PrismNavBar.wxss +150 -0
- package/dist/dev/mp-weixin/components/PrismSecureInput/PrismSecureInput.js +140 -0
- package/dist/dev/mp-weixin/components/PrismSecureInput/PrismSecureInput.json +4 -0
- package/dist/dev/mp-weixin/components/PrismSecureInput/PrismSecureInput.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismSecureInput/PrismSecureInput.wxss +215 -0
- package/dist/dev/mp-weixin/components/PrismSticky/PrismSticky.js +120 -0
- package/dist/dev/mp-weixin/components/PrismSticky/PrismSticky.json +4 -0
- package/dist/dev/mp-weixin/components/PrismSticky/PrismSticky.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismSticky/PrismSticky.wxss +62 -0
- package/dist/dev/mp-weixin/components/PrismSwiper/PrismSwiper.js +163 -0
- package/dist/dev/mp-weixin/components/PrismSwiper/PrismSwiper.json +4 -0
- package/dist/dev/mp-weixin/components/PrismSwiper/PrismSwiper.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismSwiper/PrismSwiper.wxss +203 -0
- package/dist/dev/mp-weixin/components/PrismSwitch/PrismSwitch.js +69 -0
- package/dist/dev/mp-weixin/components/PrismSwitch/PrismSwitch.json +4 -0
- package/dist/dev/mp-weixin/components/PrismSwitch/PrismSwitch.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismSwitch/PrismSwitch.wxss +151 -0
- package/dist/dev/mp-weixin/components/PrismTabBar/PrismTabBar.js +58 -0
- package/dist/dev/mp-weixin/components/PrismTabBar/PrismTabBar.json +4 -0
- package/dist/dev/mp-weixin/components/PrismTabBar/PrismTabBar.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismTabBar/PrismTabBar.wxss +119 -0
- package/dist/dev/mp-weixin/components/PrismTabs/PrismTabs.js +51 -0
- package/dist/dev/mp-weixin/components/PrismTabs/PrismTabs.json +4 -0
- package/dist/dev/mp-weixin/components/PrismTabs/PrismTabs.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismTabs/PrismTabs.wxss +51 -0
- package/dist/dev/mp-weixin/components/PrismVoiceInput/PrismVoiceInput.js +182 -0
- package/dist/dev/mp-weixin/components/PrismVoiceInput/PrismVoiceInput.json +4 -0
- package/dist/dev/mp-weixin/components/PrismVoiceInput/PrismVoiceInput.wxml +1 -0
- package/dist/dev/mp-weixin/components/PrismVoiceInput/PrismVoiceInput.wxss +329 -0
- package/dist/dev/mp-weixin/composables/useNavbar.js +19 -0
- package/dist/dev/mp-weixin/config/theme-colors.js +73 -0
- package/dist/dev/mp-weixin/pages/demo/basic.js +77 -0
- package/dist/dev/mp-weixin/pages/demo/basic.json +7 -0
- package/dist/dev/mp-weixin/pages/demo/basic.wxml +1 -0
- package/dist/dev/mp-weixin/pages/demo/basic.wxss +54 -0
- package/dist/dev/mp-weixin/pages/demo/code/index.js +190 -0
- package/dist/dev/mp-weixin/pages/demo/code/index.json +7 -0
- package/dist/dev/mp-weixin/pages/demo/code/index.wxml +1 -0
- package/dist/dev/mp-weixin/pages/demo/code/index.wxss +71 -0
- package/dist/dev/mp-weixin/pages/demo/colors.js +130 -0
- package/dist/dev/mp-weixin/pages/demo/colors.json +7 -0
- package/dist/dev/mp-weixin/pages/demo/colors.wxml +1 -0
- package/dist/dev/mp-weixin/pages/demo/colors.wxss +3793 -0
- package/dist/dev/mp-weixin/pages/demo/container.js +65 -0
- package/dist/dev/mp-weixin/pages/demo/container.json +7 -0
- package/dist/dev/mp-weixin/pages/demo/container.wxml +1 -0
- package/dist/dev/mp-weixin/pages/demo/container.wxss +54 -0
- package/dist/dev/mp-weixin/pages/demo/data.js +398 -0
- package/dist/dev/mp-weixin/pages/demo/data.json +7 -0
- package/dist/dev/mp-weixin/pages/demo/data.wxml +1 -0
- package/dist/dev/mp-weixin/pages/demo/data.wxss +235 -0
- package/dist/dev/mp-weixin/pages/demo/effects.js +62 -0
- package/dist/dev/mp-weixin/pages/demo/effects.json +7 -0
- package/dist/dev/mp-weixin/pages/demo/effects.wxml +1 -0
- package/dist/dev/mp-weixin/pages/demo/effects.wxss +60 -0
- package/dist/dev/mp-weixin/pages/demo/feedback.js +256 -0
- package/dist/dev/mp-weixin/pages/demo/feedback.json +7 -0
- package/dist/dev/mp-weixin/pages/demo/feedback.wxml +1 -0
- package/dist/dev/mp-weixin/pages/demo/feedback.wxss +120 -0
- package/dist/dev/mp-weixin/pages/demo/form.js +689 -0
- package/dist/dev/mp-weixin/pages/demo/form.json +18 -0
- package/dist/dev/mp-weixin/pages/demo/form.wxml +1 -0
- package/dist/dev/mp-weixin/pages/demo/form.wxss +54 -0
- package/dist/dev/mp-weixin/pages/demo/layout/card-layout.js +61 -0
- package/dist/dev/mp-weixin/pages/demo/layout/card-layout.json +7 -0
- package/dist/dev/mp-weixin/pages/demo/layout/card-layout.wxml +1 -0
- package/dist/dev/mp-weixin/pages/demo/layout/card-layout.wxss +326 -0
- package/dist/dev/mp-weixin/pages/demo/layout.js +96 -0
- package/dist/dev/mp-weixin/pages/demo/layout.json +7 -0
- package/dist/dev/mp-weixin/pages/demo/layout.wxml +1 -0
- package/dist/dev/mp-weixin/pages/demo/layout.wxss +54 -0
- package/dist/dev/mp-weixin/pages/demo/navigation.js +142 -0
- package/dist/dev/mp-weixin/pages/demo/navigation.json +10 -0
- package/dist/dev/mp-weixin/pages/demo/navigation.wxml +1 -0
- package/dist/dev/mp-weixin/pages/demo/navigation.wxss +61 -0
- package/dist/dev/mp-weixin/pages/demo/other.js +50 -0
- package/dist/dev/mp-weixin/pages/demo/other.json +7 -0
- package/dist/dev/mp-weixin/pages/demo/other.wxml +1 -0
- package/dist/dev/mp-weixin/pages/demo/other.wxss +54 -0
- package/dist/dev/mp-weixin/pages/demo/sticky/group.js +212 -0
- package/dist/dev/mp-weixin/pages/demo/sticky/group.json +8 -0
- package/dist/dev/mp-weixin/pages/demo/sticky/group.wxml +1 -0
- package/dist/dev/mp-weixin/pages/demo/sticky/group.wxss +135 -0
- package/dist/dev/mp-weixin/pages/demo/sticky/index.js +90 -0
- package/dist/dev/mp-weixin/pages/demo/sticky/index.json +9 -0
- package/dist/dev/mp-weixin/pages/demo/sticky/index.wxml +1 -0
- package/dist/dev/mp-weixin/pages/demo/sticky/index.wxss +175 -0
- package/dist/dev/mp-weixin/pages/examples/examples.js +65 -0
- package/dist/dev/mp-weixin/pages/examples/examples.json +8 -0
- package/dist/dev/mp-weixin/pages/examples/examples.wxml +1 -0
- package/dist/dev/mp-weixin/pages/examples/examples.wxss +461 -0
- package/dist/dev/mp-weixin/pages/icons/icons.js +350 -0
- package/dist/dev/mp-weixin/pages/icons/icons.json +8 -0
- package/dist/dev/mp-weixin/pages/icons/icons.wxml +1 -0
- package/dist/dev/mp-weixin/pages/icons/icons.wxss +3079 -0
- package/dist/dev/mp-weixin/pages/index/index.js +118 -0
- package/dist/dev/mp-weixin/pages/index/index.json +8 -0
- package/dist/dev/mp-weixin/pages/index/index.wxml +1 -0
- package/dist/dev/mp-weixin/pages/index/index.wxss +123 -0
- package/dist/dev/mp-weixin/pages/tools/tools.js +37 -0
- package/dist/dev/mp-weixin/pages/tools/tools.json +7 -0
- package/dist/dev/mp-weixin/pages/tools/tools.wxml +1 -0
- package/dist/dev/mp-weixin/pages/tools/tools.wxss +134 -0
- package/dist/dev/mp-weixin/project.config.json +36 -0
- package/dist/dev/mp-weixin/project.private.config.json +23 -0
- package/dist/dev/mp-weixin/static/fonts/all-icons.txt +453 -0
- package/dist/dev/mp-weixin/static/fonts/fa-brands-400.woff2 +0 -0
- package/dist/dev/mp-weixin/static/fonts/fa-regular-400.woff2 +0 -0
- package/dist/dev/mp-weixin/static/fonts/fa-solid-900.woff2 +0 -0
- package/dist/dev/mp-weixin/static/fonts/fa-v4compatibility.woff2 +0 -0
- package/dist/dev/mp-weixin/static/fonts/font-awesome.css +943 -0
- package/dist/dev/mp-weixin/static/fonts/iconfont.css +62 -0
- package/dist/dev/mp-weixin/static/fonts/iconfont.js +1 -0
- package/dist/dev/mp-weixin/static/fonts/iconfont.json +79 -0
- package/dist/dev/mp-weixin/static/fonts/iconfont.ttf +0 -0
- package/dist/dev/mp-weixin/static/fonts/iconfont.woff +0 -0
- package/dist/dev/mp-weixin/static/fonts/iconfont.woff2 +0 -0
- package/dist/dev/mp-weixin/static/fonts/icons-list.txt +453 -0
- package/dist/dev/mp-weixin/static/tabbar/examples-active.png +0 -0
- package/dist/dev/mp-weixin/static/tabbar/examples.png +0 -0
- package/dist/dev/mp-weixin/static/tabbar/home-active.png +0 -0
- package/dist/dev/mp-weixin/static/tabbar/home.png +0 -0
- package/dist/dev/mp-weixin/static/tabbar/icons-active.png +0 -0
- package/dist/dev/mp-weixin/static/tabbar/icons.png +0 -0
- package/dist/dev/mp-weixin/static/tabbar/tools-active.png +0 -0
- package/dist/dev/mp-weixin/static/tabbar/tools.png +0 -0
- package/dist/dev/mp-weixin/store/app.js +64 -0
- package/dist/dev/mp-weixin/utils/lunar.js +330 -0
- package/dist/dev/mp-weixin/utils/system.js +18 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.esm.js +33 -0
- package/dist/index.js +33 -0
- package/dist/prism-ui.css +7776 -0
- package/dist/prism-ui.min.css +1 -0
- package/dist/styles/base.scss +213 -0
- package/dist/styles/button.scss +120 -0
- package/dist/styles/card.scss +306 -0
- package/dist/styles/data.scss +1229 -0
- package/dist/styles/effects.scss +407 -0
- package/dist/styles/feedback.scss +698 -0
- package/dist/styles/form.scss +1574 -0
- package/dist/styles/index.scss +43 -0
- package/dist/styles/list.scss +184 -0
- package/dist/styles/navigation.scss +501 -0
- package/dist/styles/overlay.scss +182 -0
- package/dist/styles/utilities.scss +134 -0
- package/dist/styles/variables.scss +154 -0
- package/package.json +2 -5
- package/styles/base.scss +0 -1
- package/styles/card.scss +0 -1
- package/styles/colors.scss +0 -1
- package/styles/effects.scss +0 -1
- package/styles/form.scss +0 -1
- package/styles/index.scss +13 -13
- package/styles/navigation.scss +0 -1
- package/styles/variables.scss +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrismAddressInput.js","sources":["components/PrismAddressInput/PrismAddressInput.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21BZGRyZXNzSW5wdXQvUHJpc21BZGRyZXNzSW5wdXQudnVl"],"sourcesContent":["<template>\n <view class=\"prism-address-input\" :class=\"{ 'dark-mode': appStore.isDarkMode }\">\n <!-- 模式1: textarea模式(默认) -->\n <view class=\"address-wrapper\" v-if=\"mode === 'textarea'\">\n <textarea\n class=\"address-textarea\"\n v-model=\"addressValue\"\n :placeholder=\"placeholder\"\n placeholder-class=\"address-placeholder\"\n :auto-height=\"true\"\n :disabled=\"disabled\"\n @input=\"handleInput\"\n ></textarea>\n <view class=\"location-btn\" @click=\"chooseLocation\">\n <text class=\"fa fa-location-dot\"></text>\n </view>\n </view>\n\n <!-- 模式2: input模式(单行输入) -->\n <view class=\"address-wrapper input-mode\" v-else-if=\"mode === 'input'\">\n <view class=\"prism-input-box\">\n <input\n :placeholder=\"placeholder\"\n v-model=\"addressValue\"\n :disabled=\"disabled\"\n @input=\"handleInput\"\n />\n </view>\n <view class=\"location-btn\" @click=\"chooseLocation\">\n <text class=\"fa fa-location-crosshairs\"></text>\n </view>\n </view>\n\n <!-- 地图展示区域(两种模式都可以显示) -->\n <view class=\"map-container\" v-if=\"showMap && latitude && longitude\" @click=\"chooseLocation\">\n <image\n class=\"location-map\"\n :src=\"staticMapUrl\"\n mode=\"aspectFill\"\n ></image>\n <view class=\"relocate-tip\">\n <text class=\"fa fa-location-crosshairs\"></text>\n <text>点击重新选择位置</text>\n </view>\n </view>\n\n <!-- 选择模式弹窗(both模式时显示) -->\n <view class=\"select-popup\" v-if=\"showSelectPopup\" @click=\"closePopup\">\n <view class=\"select-content\" @click.stop>\n <view class=\"select-title\">选择方式</view>\n <view class=\"select-options\">\n <view class=\"select-option\" @click=\"handleSelectMode('map')\">\n <text class=\"fa fa-map-location-dot\"></text>\n <text>地图选择</text>\n </view>\n <view class=\"select-option\" @click=\"handleSelectMode('list')\">\n <text class=\"fa fa-list-ul\"></text>\n <text>位置列表</text>\n </view>\n </view>\n <view class=\"select-cancel\" @click=\"closePopup\">取消</view>\n </view>\n </view>\n\n <!-- 位置列表弹窗 -->\n <view class=\"list-popup\" v-if=\"showListPopup\" @click=\"closePopup\">\n <view class=\"list-content\" @click.stop>\n <view class=\"list-header\">\n <text class=\"list-title\">选择位置</text>\n <text class=\"fa fa-times list-close\" @click=\"closePopup\"></text>\n </view>\n <scroll-view class=\"list-scroll\" scroll-y>\n <view\n v-for=\"(item, index) in locationList\"\n :key=\"index\"\n class=\"list-item\"\n @click=\"selectLocationItem(item)\"\n >\n <view class=\"item-icon\">\n <text class=\"fa fa-location-dot\"></text>\n </view>\n <view class=\"item-info\">\n <view class=\"item-name\">{{ item.name }}</view>\n <view class=\"item-address\" v-if=\"item.address\">{{ item.address }}</view>\n </view>\n </view>\n <view class=\"list-empty\" v-if=\"!locationList.length\">\n <text class=\"fa fa-inbox\"></text>\n <text>暂无位置数据</text>\n </view>\n </scroll-view>\n <!-- 地图选择入口 -->\n <view class=\"list-footer\" v-if=\"selectMode === 'both'\" @click=\"handleSelectMode('map')\">\n <text class=\"fa fa-map-location-dot\"></text>\n <text>从地图选择</text>\n </view>\n </view>\n </view>\n </view>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue';\nimport { useAppStore } from '@/store/app';\n\nconst props = defineProps({\n modelValue: {\n type: String,\n default: ''\n },\n // 输入模式:textarea(多行)或 input(单行)\n mode: {\n type: String,\n default: 'textarea',\n validator: (val) => ['textarea', 'input'].includes(val)\n },\n // 选择模式:map(地图选择)或 list(位置列表)或 both(都支持)\n selectMode: {\n type: String,\n default: 'map',\n validator: (val) => ['map', 'list', 'both'].includes(val)\n },\n // 位置列表数据(selectMode为list或both时使用)\n locationList: {\n type: Array,\n default: () => []\n },\n latitude: {\n type: [Number, String],\n default: null\n },\n longitude: {\n type: [Number, String],\n default: null\n },\n placeholder: {\n type: String,\n default: '请输入地址'\n },\n disabled: {\n type: Boolean,\n default: false\n },\n showMap: {\n type: Boolean,\n default: true\n },\n mapKey: {\n type: String,\n default: ''\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'update:latitude', 'update:longitude', 'location-change']);\n\nconst appStore = useAppStore();\nconst addressValue = ref(props.modelValue);\nconst showListPopup = ref(false);\nconst showSelectPopup = ref(false);\n\n// 静态地图URL\nconst staticMapUrl = computed(() => {\n if (!props.latitude || !props.longitude || !props.mapKey) return '';\n const lat = props.latitude;\n const lng = props.longitude;\n const style = appStore.isDarkMode ? '&style=4' : '';\n return `https://apis.map.qq.com/ws/staticmap/v2/?center=${lat},${lng}&zoom=16&size=600*300&maptype=roadmap&markers=size:large|color:red|${lat},${lng}&key=${props.mapKey}${style}`;\n});\n\nfunction handleInput(e) {\n const value = e.detail.value;\n addressValue.value = value;\n emit('update:modelValue', value);\n}\n\n// 点击选择位置\nfunction chooseLocation() {\n if (props.disabled) return;\n\n if (props.selectMode === 'map') {\n openMapPicker();\n } else if (props.selectMode === 'list') {\n showListPopup.value = true;\n } else {\n // both模式,显示选择弹窗\n showSelectPopup.value = true;\n }\n}\n\n// 打开地图选择\nfunction openMapPicker() {\n uni.chooseLocation({\n latitude: props.latitude || undefined,\n longitude: props.longitude || undefined,\n success: (res) => {\n if (res.name || res.address) {\n const fullAddress = res.name\n ? (res.address ? `${res.name}(${res.address})` : res.name)\n : res.address;\n addressValue.value = fullAddress;\n emit('update:modelValue', fullAddress);\n }\n emit('update:latitude', res.latitude);\n emit('update:longitude', res.longitude);\n emit('location-change', {\n address: addressValue.value,\n latitude: res.latitude,\n longitude: res.longitude,\n name: res.name\n });\n },\n fail: (err) => {\n console.log('选择位置失败', err);\n }\n });\n}\n\n// 选择列表中的位置\nfunction selectLocationItem(item) {\n addressValue.value = item.address || item.name;\n emit('update:modelValue', addressValue.value);\n emit('update:latitude', item.latitude);\n emit('update:longitude', item.longitude);\n emit('location-change', {\n address: addressValue.value,\n latitude: item.latitude,\n longitude: item.longitude,\n name: item.name\n });\n showListPopup.value = false;\n}\n\n// 关闭弹窗\nfunction closePopup() {\n showListPopup.value = false;\n showSelectPopup.value = false;\n}\n\n// 选择模式后的操作\nfunction handleSelectMode(mode) {\n showSelectPopup.value = false;\n if (mode === 'map') {\n openMapPicker();\n } else {\n showListPopup.value = true;\n }\n}\n\nwatch(() => props.modelValue, (val) => {\n addressValue.value = val;\n});\n\n// 暴露方法\ndefineExpose({\n chooseLocation,\n openMapPicker\n});\n</script>\n\n<style lang=\"scss\">\n// 白色常量(用于深色背景上的固定白色文字)\n$color-white: #FFFFFF;\n\n.prism-address-input {\n .address-wrapper {\n display: flex;\n align-items: center;\n min-height: 88rpx;\n background: var(--prism-input-bg, #EBEEF2);\n border-radius: 12rpx;\n padding: 0 28rpx;\n\n // input模式样式\n &.input-mode {\n padding: 0;\n background: transparent;\n gap: 16rpx;\n\n .prism-input-box {\n flex: 1;\n }\n\n .location-btn {\n padding: 0;\n width: 80rpx;\n height: 80rpx;\n background: var(--prism-primary-color, #3478F6);\n border-radius: 12rpx;\n flex-shrink: 0;\n\n .fa {\n color: #FFFFFF;\n font-size: 36rpx;\n }\n\n &:active {\n opacity: 0.8;\n }\n }\n }\n }\n\n .address-textarea {\n flex: 1;\n min-height: 48rpx;\n max-height: none;\n font-size: 30rpx;\n color: var(--prism-text-primary, #1D2129);\n line-height: 1.5;\n background: transparent;\n }\n\n .address-placeholder {\n color: var(--prism-text-placeholder, #86909C);\n }\n\n .location-btn {\n padding: 8rpx 0 8rpx 16rpx;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n\n .fa {\n font-size: 40rpx;\n color: var(--prism-primary-color, #3478F6);\n }\n }\n\n .map-container {\n margin-top: 16rpx;\n position: relative;\n border-radius: 16rpx;\n overflow: hidden;\n height: 300rpx;\n }\n\n .location-map {\n width: 100%;\n height: 100%;\n border-radius: 16rpx;\n }\n\n .relocate-tip {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n background: var(--prism-mask-bg, rgba(0, 0, 0, 0.5));\n padding: 16rpx;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8rpx;\n\n text, .fa {\n font-size: 24rpx;\n color: $color-white;\n }\n }\n\n // 选择模式弹窗\n .select-popup,\n .list-popup {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--prism-mask-bg, rgba(0, 0, 0, 0.5));\n display: flex;\n align-items: flex-end;\n justify-content: center;\n z-index: 9999;\n }\n\n .select-content {\n width: 100%;\n background: var(--prism-bg-color-card, #FFFFFF);\n border-radius: 24rpx 24rpx 0 0;\n padding: 32rpx;\n padding-bottom: calc(32rpx + env(safe-area-inset-bottom));\n }\n\n .select-title {\n font-size: 32rpx;\n font-weight: 600;\n color: var(--prism-text-primary, #1D2129);\n text-align: center;\n margin-bottom: 32rpx;\n }\n\n .select-options {\n display: flex;\n gap: 24rpx;\n }\n\n .select-option {\n flex: 1;\n height: 160rpx;\n background: var(--prism-bg-color-container, #F7F8FA);\n border-radius: 16rpx;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16rpx;\n transition: all 0.2s;\n\n .fa {\n font-size: 48rpx;\n color: var(--prism-primary-color, #3478F6);\n }\n\n text:last-child {\n font-size: 28rpx;\n color: var(--prism-text-primary, #1D2129);\n }\n\n &:active {\n background: var(--prism-primary-light, rgba(52, 120, 246, 0.1));\n }\n }\n\n .select-cancel {\n margin-top: 24rpx;\n height: 88rpx;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32rpx;\n color: var(--prism-text-secondary, #86909C);\n }\n\n // 位置列表弹窗\n .list-content {\n width: 100%;\n max-height: 70vh;\n background: var(--prism-bg-color-card, #FFFFFF);\n border-radius: 24rpx 24rpx 0 0;\n display: flex;\n flex-direction: column;\n }\n\n .list-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 32rpx;\n border-bottom: 1rpx solid var(--prism-border-color-light, #E5E6EB);\n }\n\n .list-title {\n font-size: 32rpx;\n font-weight: 600;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .list-close {\n font-size: 36rpx;\n color: var(--prism-text-secondary, #86909C);\n padding: 8rpx;\n }\n\n .list-scroll {\n flex: 1;\n max-height: 600rpx;\n }\n\n .list-item {\n display: flex;\n align-items: center;\n padding: 24rpx 32rpx;\n border-bottom: 1rpx solid var(--prism-border-color-light, #E5E6EB);\n transition: all 0.2s;\n\n &:active {\n background: var(--prism-bg-color-container, #F7F8FA);\n }\n }\n\n .item-icon {\n width: 64rpx;\n height: 64rpx;\n background: var(--prism-primary-light, rgba(52, 120, 246, 0.1));\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 24rpx;\n flex-shrink: 0;\n\n .fa {\n font-size: 28rpx;\n color: var(--prism-primary-color, #3478F6);\n }\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n }\n\n .item-name {\n font-size: 30rpx;\n color: var(--prism-text-primary, #1D2129);\n margin-bottom: 8rpx;\n }\n\n .item-address {\n font-size: 24rpx;\n color: var(--prism-text-secondary, #86909C);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .list-empty {\n padding: 80rpx 32rpx;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16rpx;\n\n .fa {\n font-size: 64rpx;\n color: var(--prism-text-placeholder, #C9CDD4);\n }\n\n text:last-child {\n font-size: 28rpx;\n color: var(--prism-text-secondary, #86909C);\n }\n }\n\n .list-footer {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12rpx;\n padding: 24rpx 32rpx;\n padding-bottom: calc(24rpx + env(safe-area-inset-bottom));\n border-top: 1rpx solid var(--prism-border-color-light, #E5E6EB);\n background: var(--prism-bg-color-card, #FFFFFF);\n\n .fa {\n font-size: 32rpx;\n color: var(--prism-primary-color, #3478F6);\n }\n\n text:last-child {\n font-size: 28rpx;\n color: var(--prism-primary-color, #3478F6);\n }\n\n &:active {\n opacity: 0.7;\n }\n }\n}\n\n.dark-mode .prism-address-input {\n .address-wrapper {\n background: var(--prism-input-bg, #2A2A2A);\n\n &.input-mode {\n background: transparent;\n }\n }\n\n .address-textarea {\n color: var(--prism-text-primary, #E5E6EB);\n }\n\n .address-placeholder {\n color: var(--prism-text-placeholder, #6B7785);\n }\n\n .select-content,\n .list-content,\n .list-footer {\n background: var(--prism-bg-color-card, #1A1A1A);\n }\n\n .select-option {\n background: var(--prism-bg-color-container, #2A2A2A);\n\n &:active {\n background: rgba(52, 120, 246, 0.15);\n }\n }\n\n .list-item:active {\n background: var(--prism-bg-color-container, #2A2A2A);\n }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismAddressInput/PrismAddressInput.vue'\nwx.createComponent(Component)"],"names":["useAppStore","ref","computed","uni","watch","Component"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrismCityCascadeSelect.js","sources":["components/PrismCityCascadeSelect/PrismCityCascadeSelect.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21DaXR5Q2FzY2FkZVNlbGVjdC9QcmlzbUNpdHlDYXNjYWRlU2VsZWN0LnZ1ZQ"],"sourcesContent":["<template>\n <view class=\"prism-city-cascade-select\" :class=\"{ 'dark-mode': appStore.isDarkMode }\">\n <!-- 触发器 -->\n <view class=\"select-trigger\" @click=\"openSelect\">\n <slot>\n <view class=\"prism-select-box\">\n <text :class=\"{ 'placeholder': !displayValue, 'select-text': displayValue }\">\n {{ displayValue || placeholder }}\n </text>\n <text class=\"select-arrow fa fa-map-marker-alt\"></text>\n </view>\n </slot>\n </view>\n\n <!-- 全屏选择页面 -->\n <view class=\"select-page\" v-if=\"showSelect\">\n <!-- 头部 -->\n <view class=\"page-header\">\n <view class=\"header-back\" @click=\"handleBack\">\n <text class=\"fa fa-arrow-left\"></text>\n </view>\n <view class=\"header-title\">{{ title }}</view>\n <view class=\"header-right\"></view>\n </view>\n\n <!-- 搜索框 -->\n <view class=\"search-box\" v-if=\"showSearch\">\n <view class=\"search-input-wrap\">\n <text class=\"fa fa-search\"></text>\n <input\n class=\"search-input\"\n type=\"text\"\n v-model=\"searchKeyword\"\n :placeholder=\"searchPlaceholder\"\n @input=\"onSearch\"\n />\n <text class=\"fa fa-times-circle\" v-if=\"searchKeyword\" @click=\"clearSearch\"></text>\n </view>\n </view>\n\n <!-- 内容区域 -->\n <scroll-view class=\"page-content\" scroll-y @touchmove.stop>\n <!-- 搜索结果 -->\n <view class=\"search-results\" v-if=\"searchKeyword && searchResults.length\">\n <view\n v-for=\"item in searchResults\"\n :key=\"item.code\"\n class=\"result-item\"\n @click=\"selectCity(item)\"\n >\n <text class=\"item-name\">{{ item.fullName || item.name }}</text>\n </view>\n </view>\n\n <!-- 搜索无结果 -->\n <view class=\"search-empty\" v-else-if=\"searchKeyword && !searchResults.length\">\n <text class=\"fa fa-search\"></text>\n <text>未找到相关城市</text>\n </view>\n\n <!-- 正常列表 -->\n <view v-else>\n <!-- 热门城市 -->\n <view class=\"hot-cities\" v-if=\"showHotCities && currentLevel === 0\">\n <view class=\"section-title\">\n <text class=\"fa fa-fire\"></text>\n <text>热门城市</text>\n </view>\n <view class=\"hot-cities-grid\">\n <view\n v-for=\"city in hotCities\"\n :key=\"city.code\"\n class=\"hot-city-item\"\n @click=\"selectCity(city)\"\n >\n {{ city.name }}\n </view>\n </view>\n </view>\n\n <!-- 已选择的面包屑 -->\n <view class=\"breadcrumb\" v-if=\"tempSelected.length\">\n <view class=\"section-title\">\n <text>当前选择</text>\n </view>\n <view class=\"breadcrumb-content\">\n <view\n v-for=\"(item, index) in tempSelected\"\n :key=\"index\"\n class=\"breadcrumb-item\"\n @click=\"backToLevel(index)\"\n >\n <text>{{ item.name }}</text>\n <text class=\"fa fa-chevron-right\" v-if=\"index < tempSelected.length - 1\"></text>\n </view>\n <view class=\"breadcrumb-clear\" @click=\"clearSelection\">\n <text class=\"fa fa-times\"></text>\n </view>\n </view>\n </view>\n\n <!-- 全部城市列表 -->\n <view class=\"city-list\">\n <view class=\"section-title\" v-if=\"currentLevel === 0\">\n <text>全部省份</text>\n </view>\n <view class=\"section-title\" v-else>\n <text>请选择{{ levelNames[currentLevel] }}</text>\n </view>\n <view\n v-for=\"item in currentLevelList\"\n :key=\"item.code\"\n class=\"city-item\"\n :class=\"{ 'selected': isItemSelected(item) }\"\n @click=\"selectItem(item)\"\n >\n <text class=\"item-name\">{{ item.name }}</text>\n <text class=\"fa fa-chevron-right item-arrow\" v-if=\"hasChildren(item)\"></text>\n <text class=\"fa fa-check item-check\" v-else-if=\"isItemSelected(item)\"></text>\n </view>\n </view>\n </view>\n </scroll-view>\n </view>\n </view>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue';\nimport { useAppStore } from '@/store/app';\n\nconst props = defineProps({\n modelValue: {\n type: Array,\n default: () => []\n },\n // 城市数据\n data: {\n type: Array,\n default: () => []\n },\n level: {\n type: Number,\n default: 2\n },\n placeholder: {\n type: String,\n default: '请选择城市'\n },\n title: {\n type: String,\n default: '选择城市'\n },\n separator: {\n type: String,\n default: '/'\n },\n showSearch: {\n type: Boolean,\n default: true\n },\n searchPlaceholder: {\n type: String,\n default: '搜索城市'\n },\n showHotCities: {\n type: Boolean,\n default: true\n },\n hotCities: {\n type: Array,\n default: () => [\n { name: '北京', code: '110000' },\n { name: '上海', code: '310000' },\n { name: '广州', code: '440100' },\n { name: '深圳', code: '440300' },\n { name: '杭州', code: '330100' },\n { name: '成都', code: '510100' },\n { name: '武汉', code: '420100' },\n { name: '南京', code: '320100' }\n ]\n },\n disabled: {\n type: Boolean,\n default: false\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'change', 'confirm', 'cancel']);\n\nconst appStore = useAppStore();\nconst showSelect = ref(false);\nconst tempSelected = ref([]);\nconst currentLevel = ref(0);\nconst searchKeyword = ref('');\nconst searchResults = ref([]);\n\nconst levelNames = ['省份', '城市', '区县'];\n\n// 默认地区数据\nconst defaultData = [\n {\n code: '110000',\n name: '北京市',\n children: [\n {\n code: '110100',\n name: '北京市',\n children: [\n { code: '110101', name: '东城区' },\n { code: '110102', name: '西城区' },\n { code: '110105', name: '朝阳区' },\n { code: '110106', name: '丰台区' },\n { code: '110108', name: '海淀区' },\n { code: '110112', name: '通州区' },\n { code: '110114', name: '昌平区' },\n { code: '110115', name: '大兴区' }\n ]\n }\n ]\n },\n {\n code: '120000',\n name: '天津市',\n children: [\n {\n code: '120100',\n name: '天津市',\n children: [\n { code: '120101', name: '和平区' },\n { code: '120102', name: '河东区' },\n { code: '120103', name: '河西区' },\n { code: '120104', name: '南开区' }\n ]\n }\n ]\n },\n {\n code: '310000',\n name: '上海市',\n children: [\n {\n code: '310100',\n name: '上海市',\n children: [\n { code: '310101', name: '黄浦区' },\n { code: '310104', name: '徐汇区' },\n { code: '310106', name: '静安区' },\n { code: '310110', name: '杨浦区' },\n { code: '310112', name: '闵行区' },\n { code: '310115', name: '浦东新区' }\n ]\n }\n ]\n },\n {\n code: '500000',\n name: '重庆市',\n children: [\n {\n code: '500100',\n name: '重庆市',\n children: [\n { code: '500101', name: '万州区' },\n { code: '500103', name: '渝中区' },\n { code: '500104', name: '大渡口区' },\n { code: '500105', name: '江北区' }\n ]\n }\n ]\n },\n {\n code: '440000',\n name: '广东省',\n children: [\n {\n code: '440100',\n name: '广州市',\n children: [\n { code: '440104', name: '越秀区' },\n { code: '440106', name: '天河区' },\n { code: '440111', name: '白云区' },\n { code: '440113', name: '番禺区' }\n ]\n },\n {\n code: '440300',\n name: '深圳市',\n children: [\n { code: '440304', name: '福田区' },\n { code: '440305', name: '南山区' },\n { code: '440306', name: '宝安区' },\n { code: '440307', name: '龙岗区' }\n ]\n }\n ]\n },\n {\n code: '330000',\n name: '浙江省',\n children: [\n {\n code: '330100',\n name: '杭州市',\n children: [\n { code: '330102', name: '上城区' },\n { code: '330106', name: '西湖区' },\n { code: '330108', name: '滨江区' },\n { code: '330109', name: '萧山区' }\n ]\n },\n {\n code: '330200',\n name: '宁波市',\n children: [\n { code: '330203', name: '海曙区' },\n { code: '330205', name: '江北区' }\n ]\n }\n ]\n },\n {\n code: '320000',\n name: '江苏省',\n children: [\n {\n code: '320100',\n name: '南京市',\n children: [\n { code: '320102', name: '玄武区' },\n { code: '320104', name: '秦淮区' },\n { code: '320106', name: '鼓楼区' }\n ]\n },\n {\n code: '320500',\n name: '苏州市',\n children: [\n { code: '320505', name: '虎丘区' },\n { code: '320508', name: '姑苏区' }\n ]\n }\n ]\n },\n {\n code: '510000',\n name: '四川省',\n children: [\n {\n code: '510100',\n name: '成都市',\n children: [\n { code: '510104', name: '锦江区' },\n { code: '510105', name: '青羊区' },\n { code: '510107', name: '武侯区' },\n { code: '510108', name: '成华区' }\n ]\n }\n ]\n },\n {\n code: '420000',\n name: '湖北省',\n children: [\n {\n code: '420100',\n name: '武汉市',\n children: [\n { code: '420102', name: '江岸区' },\n { code: '420103', name: '江汉区' },\n { code: '420104', name: '硚口区' },\n { code: '420105', name: '汉阳区' }\n ]\n }\n ]\n }\n];\n\n// 使用传入的数据或默认数据\nconst regionData = computed(() => {\n return props.data && props.data.length ? props.data : defaultData;\n});\n\n// 显示值\nconst displayValue = computed(() => {\n if (!props.modelValue || !props.modelValue.length) return '';\n return props.modelValue.map(item => item.name).join(props.separator);\n});\n\n// 当前层级列表\nconst currentLevelList = computed(() => {\n if (currentLevel.value === 0) {\n return regionData.value;\n }\n const parent = tempSelected.value[currentLevel.value - 1];\n return parent?.children || [];\n});\n\n// 打开选择页面\nfunction openSelect() {\n if (props.disabled) return;\n showSelect.value = true;\n tempSelected.value = [];\n currentLevel.value = 0;\n searchKeyword.value = '';\n // 隐藏 tabBar\n // #ifdef H5\n try { uni.hideTabBar(); } catch (e) {}\n // #endif\n}\n\n// 返回处理\nfunction handleBack() {\n if (currentLevel.value > 0) {\n currentLevel.value--;\n tempSelected.value = tempSelected.value.slice(0, currentLevel.value);\n } else {\n showSelect.value = false;\n emit('cancel');\n // 显示 tabBar\n // #ifdef H5\n try { uni.showTabBar(); } catch (e) {}\n // #endif\n }\n}\n\n// 选择项目\nfunction selectItem(item) {\n if (hasChildren(item) && currentLevel.value < props.level - 1) {\n tempSelected.value = tempSelected.value.slice(0, currentLevel.value);\n tempSelected.value.push({ code: item.code, name: item.name, children: item.children });\n currentLevel.value++;\n } else {\n tempSelected.value = tempSelected.value.slice(0, currentLevel.value);\n tempSelected.value.push({ code: item.code, name: item.name });\n confirmSelect();\n }\n}\n\n// 选择热门城市 - 查找完整路径\nfunction selectCity(city) {\n const path = findCityPath(city.code);\n if (path.length) {\n emit('update:modelValue', path);\n emit('change', path);\n emit('confirm', path);\n } else {\n // 找不到路径时直接使用城市信息\n const result = [{ code: city.code, name: city.name }];\n emit('update:modelValue', result);\n emit('change', result);\n emit('confirm', result);\n }\n showSelect.value = false;\n // 显示 tabBar\n // #ifdef H5\n try { uni.showTabBar(); } catch (e) {}\n // #endif\n}\n\n// 查找城市的完整路径(省-市-区)\nfunction findCityPath(code) {\n const path = [];\n\n function search(list, currentPath) {\n for (const item of list) {\n const newPath = [...currentPath, { code: item.code, name: item.name }];\n if (item.code === code) {\n return newPath;\n }\n if (item.children) {\n const result = search(item.children, newPath);\n if (result) return result;\n }\n }\n return null;\n }\n\n return search(regionData.value, []) || [];\n}\n\n// 确认选择\nfunction confirmSelect() {\n const result = tempSelected.value.map(item => ({\n code: item.code,\n name: item.name\n }));\n emit('update:modelValue', result);\n emit('change', result);\n emit('confirm', result);\n showSelect.value = false;\n // 显示 tabBar\n // #ifdef H5\n try { uni.showTabBar(); } catch (e) {}\n // #endif\n}\n\n// 判断是否有子级\nfunction hasChildren(item) {\n return item.children && item.children.length > 0;\n}\n\n// 判断是否选中\nfunction isItemSelected(item) {\n const current = tempSelected.value[currentLevel.value];\n return current && current.code === item.code;\n}\n\n// 返回到某一级\nfunction backToLevel(index) {\n currentLevel.value = index;\n tempSelected.value = tempSelected.value.slice(0, index);\n}\n\n// 清空选择\nfunction clearSelection() {\n tempSelected.value = [];\n currentLevel.value = 0;\n}\n\n// 搜索\nfunction onSearch() {\n if (!searchKeyword.value.trim()) {\n searchResults.value = [];\n return;\n }\n const keyword = searchKeyword.value.trim().toLowerCase();\n const results = [];\n\n // 递归搜索\n function search(list, parentNames = []) {\n for (const item of list) {\n const fullName = [...parentNames, item.name].join(props.separator);\n if (item.name.toLowerCase().includes(keyword)) {\n results.push({ ...item, fullName });\n }\n if (item.children) {\n search(item.children, [...parentNames, item.name]);\n }\n }\n }\n\n search(regionData.value);\n searchResults.value = results.slice(0, 20);\n}\n\n// 清空搜索\nfunction clearSearch() {\n searchKeyword.value = '';\n searchResults.value = [];\n}\n</script>\n\n<style lang=\"scss\">\n.prism-city-cascade-select {\n .prism-select-box {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 24rpx;\n background: var(--prism-input-bg, #F7F8FA);\n border-radius: 12rpx;\n\n .placeholder {\n color: var(--prism-text-placeholder, #C9CDD4);\n font-size: 28rpx;\n }\n\n .select-text {\n color: var(--prism-text-primary, #1D2129);\n font-size: 28rpx;\n }\n\n .select-arrow {\n color: var(--prism-text-secondary, #86909C);\n font-size: 28rpx;\n }\n }\n\n // 全屏页面\n .select-page {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: -100rpx; // 向下延伸覆盖 tabBar\n width: 100%;\n padding-bottom: 100rpx; // 补偿底部延伸\n background: var(--prism-bg-color-page, #F5F6F7);\n z-index: 99999;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n box-sizing: border-box;\n }\n\n // 头部\n .page-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 24rpx 32rpx;\n padding-top: calc(24rpx + env(safe-area-inset-top));\n background: var(--prism-bg-color-card, #FFFFFF);\n }\n\n .header-back {\n width: 60rpx;\n .fa { font-size: 36rpx; color: var(--prism-text-primary, #1D2129); }\n }\n\n .header-title {\n font-size: 34rpx;\n font-weight: 600;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .header-right {\n width: 60rpx;\n }\n\n // 搜索框\n .search-box {\n padding: 16rpx 32rpx;\n background: var(--prism-bg-color-card, #FFFFFF);\n }\n\n .search-input-wrap {\n display: flex;\n align-items: center;\n padding: 16rpx 24rpx;\n background: var(--prism-bg-color-container, #F7F8FA);\n border-radius: 8rpx;\n gap: 16rpx;\n\n .fa-search { color: var(--prism-text-placeholder, #C9CDD4); font-size: 28rpx; }\n .fa-times-circle { color: var(--prism-text-secondary, #86909C); font-size: 28rpx; }\n }\n\n .search-input {\n flex: 1;\n font-size: 28rpx;\n color: var(--prism-text-primary, #1D2129);\n }\n\n // 内容区域\n .page-content {\n flex: 1;\n height: 0;\n padding-bottom: env(safe-area-inset-bottom, 0px);\n }\n\n // 区块标题\n .section-title {\n display: flex;\n align-items: center;\n gap: 8rpx;\n padding: 24rpx 32rpx 16rpx;\n font-size: 26rpx;\n color: var(--prism-text-secondary, #86909C);\n .fa-fire { color: #FF6B00; }\n }\n\n // 热门城市\n .hot-cities {\n background: var(--prism-bg-color-card, #FFFFFF);\n margin-bottom: 16rpx;\n }\n\n .hot-cities-grid {\n display: flex;\n flex-wrap: wrap;\n padding: 0 32rpx 24rpx;\n gap: 16rpx;\n }\n\n .hot-city-item {\n padding: 20rpx 32rpx;\n background: var(--prism-bg-color-container, #F7F8FA);\n border-radius: 8rpx;\n font-size: 28rpx;\n color: var(--prism-text-primary, #1D2129);\n &:active {\n background: var(--prism-primary-light, rgba(52, 120, 246, 0.08));\n color: var(--prism-primary-color, #3478F6);\n }\n }\n\n // 面包屑\n .breadcrumb {\n background: var(--prism-bg-color-card, #FFFFFF);\n margin-bottom: 16rpx;\n }\n\n .breadcrumb-content {\n display: flex;\n align-items: center;\n padding: 0 32rpx 24rpx;\n flex-wrap: wrap;\n gap: 8rpx;\n }\n\n .breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 8rpx;\n font-size: 28rpx;\n color: var(--prism-primary-color, #3478F6);\n .fa { font-size: 20rpx; color: var(--prism-text-placeholder, #C9CDD4); }\n }\n\n .breadcrumb-clear {\n margin-left: auto;\n .fa { font-size: 28rpx; color: var(--prism-text-secondary, #86909C); }\n }\n\n // 城市列表\n .city-list {\n background: var(--prism-bg-color-card, #FFFFFF);\n }\n\n .city-item {\n display: flex;\n align-items: center;\n padding: 28rpx 32rpx;\n border-bottom: 1rpx solid var(--prism-border-color-light, #E5E6EB);\n\n .item-name {\n flex: 1;\n font-size: 30rpx;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .item-arrow {\n font-size: 24rpx;\n color: var(--prism-text-placeholder, #C9CDD4);\n }\n\n .item-check {\n font-size: 28rpx;\n color: var(--prism-primary-color, #3478F6);\n }\n\n &.selected .item-name {\n color: var(--prism-primary-color, #3478F6);\n font-weight: 500;\n }\n }\n\n // 搜索结果\n .search-results {\n background: var(--prism-bg-color-card, #FFFFFF);\n }\n\n .result-item {\n padding: 28rpx 32rpx;\n border-bottom: 1rpx solid var(--prism-border-color-light, #E5E6EB);\n font-size: 30rpx;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .search-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 120rpx 32rpx;\n gap: 24rpx;\n .fa { font-size: 80rpx; color: var(--prism-text-placeholder, #C9CDD4); }\n text { font-size: 28rpx; color: var(--prism-text-secondary, #86909C); }\n }\n}\n\n// 深色模式\n.dark-mode.prism-city-cascade-select {\n .select-page {\n background: var(--prism-bg-color-page, #121212);\n }\n\n .page-header,\n .search-box,\n .hot-cities,\n .breadcrumb,\n .city-list,\n .search-results {\n background: var(--prism-bg-color-card, #1A1A1A);\n }\n\n .search-input-wrap,\n .hot-city-item {\n background: var(--prism-bg-color-container, #2A2A2A);\n }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismCityCascadeSelect/PrismCityCascadeSelect.vue'\nwx.createComponent(Component)"],"names":["useAppStore","ref","computed","Component"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrismCityPicker.js","sources":["components/PrismCityPicker/PrismCityPicker.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21DaXR5UGlja2VyL1ByaXNtQ2l0eVBpY2tlci52dWU"],"sourcesContent":["<template>\n <view class=\"prism-city-picker\" :class=\"{ 'dark-mode': appStore.isDarkMode }\">\n <!-- 触发器 -->\n <view class=\"picker-trigger\" @click=\"openPicker\">\n <slot>\n <view class=\"prism-select-box\">\n <text :class=\"{ 'placeholder': !displayValue, 'select-text': displayValue }\">\n {{ displayValue || placeholder }}\n </text>\n <text class=\"select-arrow fa fa-map-marker-alt\"></text>\n </view>\n </slot>\n </view>\n\n <!-- 选择器弹窗 -->\n <view class=\"picker-popup\" v-if=\"showPicker\" @click=\"closePicker\">\n <view class=\"picker-content\" @click.stop>\n <!-- 头部 -->\n <view class=\"picker-header\">\n <view class=\"picker-cancel\" @click=\"closePicker\">取消</view>\n <view class=\"picker-title\">{{ title }}</view>\n <view class=\"picker-confirm\" @click=\"confirmSelect\">确定</view>\n </view>\n\n <!-- 模式1: 滚轮选择(类似日期选择器) -->\n <view class=\"picker-body\" v-if=\"mode === 'picker'\">\n <picker-view\n class=\"picker-view\"\n :value=\"pickerIndex\"\n @change=\"onPickerChange\"\n indicator-class=\"picker-indicator\"\n :indicator-style=\"indicatorStyle\"\n :style=\"{ height: pickerHeight }\"\n >\n <!-- 省份列 -->\n <picker-view-column>\n <view\n v-for=\"(item, idx) in provinceList\"\n :key=\"item.code\"\n class=\"picker-item\"\n :style=\"{\n height: itemHeight + 'px',\n lineHeight: itemHeight + 'px',\n color: idx === pickerIndex[0] ? 'var(--prism-primary-color, #3478F6)' : 'var(--prism-text-secondary, #86909C)',\n fontWeight: idx === pickerIndex[0] ? '600' : '400'\n }\"\n >\n {{ item.name }}\n </view>\n </picker-view-column>\n <!-- 城市列 -->\n <picker-view-column>\n <view\n v-for=\"(item, idx) in cityList\"\n :key=\"item.code\"\n class=\"picker-item\"\n :style=\"{\n height: itemHeight + 'px',\n lineHeight: itemHeight + 'px',\n color: idx === pickerIndex[1] ? 'var(--prism-primary-color, #3478F6)' : 'var(--prism-text-secondary, #86909C)',\n fontWeight: idx === pickerIndex[1] ? '600' : '400'\n }\"\n >\n {{ item.name }}\n </view>\n </picker-view-column>\n <!-- 区县列 -->\n <picker-view-column v-if=\"level >= 3\">\n <view\n v-for=\"(item, idx) in districtList\"\n :key=\"item.code\"\n class=\"picker-item\"\n :style=\"{\n height: itemHeight + 'px',\n lineHeight: itemHeight + 'px',\n color: idx === pickerIndex[2] ? 'var(--prism-primary-color, #3478F6)' : 'var(--prism-text-secondary, #86909C)',\n fontWeight: idx === pickerIndex[2] ? '600' : '400'\n }\"\n >\n {{ item.name }}\n </view>\n </picker-view-column>\n </picker-view>\n </view>\n\n <!-- 模式2: 多层级列表选择 -->\n <view class=\"cascade-body\" v-else-if=\"mode === 'cascade'\">\n <!-- 热门城市 -->\n <view class=\"hot-cities\" v-if=\"showHotCities && currentLevel === 0 && !tempSelected.length\">\n <view class=\"hot-cities-title\">\n <text class=\"fa fa-fire\"></text>\n <text>热门城市</text>\n </view>\n <view class=\"hot-cities-list\">\n <view\n v-for=\"city in hotCities\"\n :key=\"city.code\"\n class=\"hot-city-item\"\n @click=\"selectHotCity(city)\"\n >\n {{ city.name }}\n </view>\n </view>\n <view class=\"hot-cities-divider\">\n <text>全部城市</text>\n </view>\n </view>\n\n <!-- 已选择的面包屑 -->\n <view class=\"cascade-breadcrumb\" v-if=\"tempSelected.length\">\n <view\n v-for=\"(item, index) in tempSelected\"\n :key=\"index\"\n class=\"breadcrumb-item\"\n @click=\"backToLevel(index)\"\n >\n <text>{{ item.name }}</text>\n <text class=\"fa fa-chevron-right\" v-if=\"index < tempSelected.length - 1\"></text>\n </view>\n <view class=\"breadcrumb-clear\" @click=\"clearSelection\">\n <text class=\"fa fa-times\"></text>\n </view>\n </view>\n\n <!-- 当前层级列表 -->\n <scroll-view\n class=\"cascade-list\"\n scroll-y\n :scroll-with-animation=\"true\"\n @touchmove.stop\n >\n <view\n v-for=\"item in currentLevelList\"\n :key=\"item.code\"\n class=\"cascade-item\"\n :class=\"{ 'selected': isItemSelected(item) }\"\n hover-class=\"none\"\n @click=\"selectItem(item)\"\n >\n <view class=\"item-content\">\n <text class=\"item-name\">{{ item.name }}</text>\n <text class=\"item-code\" v-if=\"showCode\">{{ item.code }}</text>\n </view>\n <text class=\"fa fa-chevron-right item-arrow\" v-if=\"hasChildren(item)\"></text>\n <text class=\"fa fa-check item-check\" v-else-if=\"isItemSelected(item)\"></text>\n </view>\n <view class=\"cascade-empty\" v-if=\"!currentLevelList.length\">\n <text class=\"fa fa-inbox\"></text>\n <text>暂无数据</text>\n </view>\n </scroll-view>\n </view>\n </view>\n </view>\n </view>\n</template>\n\n<script setup>\nimport { ref, computed, watch, onMounted } from 'vue';\nimport { useAppStore } from '@/store/app';\nimport { rpx2px } from '@/utils/system';\n\nconst props = defineProps({\n modelValue: {\n type: Array,\n default: () => []\n },\n // 选择模式:picker(滚轮)或 cascade(多层级列表)\n mode: {\n type: String,\n default: 'picker',\n validator: (val) => ['picker', 'cascade'].includes(val)\n },\n // 选择层级:2(省市)或 3(省市区)\n level: {\n type: Number,\n default: 3,\n validator: (val) => [2, 3].includes(val)\n },\n // 城市数据\n data: {\n type: Array,\n default: () => []\n },\n placeholder: {\n type: String,\n default: '请选择城市'\n },\n title: {\n type: String,\n default: '选择城市'\n },\n // 是否显示编码\n showCode: {\n type: Boolean,\n default: false\n },\n // 分隔符\n separator: {\n type: String,\n default: '/'\n },\n disabled: {\n type: Boolean,\n default: false\n },\n // 是否显示热门城市\n showHotCities: {\n type: Boolean,\n default: false\n },\n // 热门城市列表\n hotCities: {\n type: Array,\n default: () => [\n { name: '北京', code: '110000' },\n { name: '上海', code: '310000' },\n { name: '广州', code: '440100' },\n { name: '深圳', code: '440300' },\n { name: '杭州', code: '330100' },\n { name: '成都', code: '510100' },\n { name: '武汉', code: '420100' },\n { name: '南京', code: '320100' }\n ]\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'change', 'confirm', 'cancel']);\n\nconst appStore = useAppStore();\nconst showPicker = ref(false);\nconst pickerIndex = ref([0, 0, 0]);\nconst tempSelected = ref([]);\nconst currentLevel = ref(0);\n\n// picker 配置 - 使用 rpx2px 换算,避免精度问题\nconst itemHeight = rpx2px(96);\nconst pickerHeight = `${itemHeight * 5}px`;\nconst indicatorStyle = `height: ${itemHeight}px`;\n\n// 使用内置数据或外部数据\nconst regionData = computed(() => {\n if (props.data && props.data.length) {\n return props.data;\n }\n return defaultRegionData.value;\n});\n\n// 默认地区数据(示例数据,实际使用时应传入完整数据)\nconst defaultRegionData = ref([\n {\n code: '110000',\n name: '北京市',\n children: [\n {\n code: '110100',\n name: '北京市',\n children: [\n { code: '110101', name: '东城区' },\n { code: '110102', name: '西城区' },\n { code: '110105', name: '朝阳区' },\n { code: '110106', name: '丰台区' },\n { code: '110107', name: '石景山区' },\n { code: '110108', name: '海淀区' },\n { code: '110109', name: '门头沟区' },\n { code: '110111', name: '房山区' },\n { code: '110112', name: '通州区' },\n { code: '110113', name: '顺义区' },\n { code: '110114', name: '昌平区' },\n { code: '110115', name: '大兴区' },\n { code: '110116', name: '怀柔区' },\n { code: '110117', name: '平谷区' },\n { code: '110118', name: '密云区' },\n { code: '110119', name: '延庆区' }\n ]\n }\n ]\n },\n {\n code: '120000',\n name: '天津市',\n children: [\n {\n code: '120100',\n name: '天津市',\n children: [\n { code: '120101', name: '和平区' },\n { code: '120102', name: '河东区' },\n { code: '120103', name: '河西区' },\n { code: '120104', name: '南开区' },\n { code: '120105', name: '河北区' },\n { code: '120106', name: '红桥区' },\n { code: '120110', name: '东丽区' },\n { code: '120111', name: '西青区' },\n { code: '120112', name: '津南区' },\n { code: '120113', name: '北辰区' },\n { code: '120114', name: '武清区' },\n { code: '120115', name: '宝坻区' },\n { code: '120116', name: '滨海新区' },\n { code: '120117', name: '宁河区' },\n { code: '120118', name: '静海区' },\n { code: '120119', name: '蓟州区' }\n ]\n }\n ]\n },\n {\n code: '310000',\n name: '上海市',\n children: [\n {\n code: '310100',\n name: '上海市',\n children: [\n { code: '310101', name: '黄浦区' },\n { code: '310104', name: '徐汇区' },\n { code: '310105', name: '长宁区' },\n { code: '310106', name: '静安区' },\n { code: '310107', name: '普陀区' },\n { code: '310109', name: '虹口区' },\n { code: '310110', name: '杨浦区' },\n { code: '310112', name: '闵行区' },\n { code: '310113', name: '宝山区' },\n { code: '310114', name: '嘉定区' },\n { code: '310115', name: '浦东新区' },\n { code: '310116', name: '金山区' },\n { code: '310117', name: '松江区' },\n { code: '310118', name: '青浦区' },\n { code: '310120', name: '奉贤区' },\n { code: '310151', name: '崇明区' }\n ]\n }\n ]\n },\n {\n code: '440000',\n name: '广东省',\n children: [\n {\n code: '440100',\n name: '广州市',\n children: [\n { code: '440103', name: '荔湾区' },\n { code: '440104', name: '越秀区' },\n { code: '440105', name: '海珠区' },\n { code: '440106', name: '天河区' },\n { code: '440111', name: '白云区' },\n { code: '440112', name: '黄埔区' },\n { code: '440113', name: '番禺区' },\n { code: '440114', name: '花都区' },\n { code: '440115', name: '南沙区' },\n { code: '440117', name: '从化区' },\n { code: '440118', name: '增城区' }\n ]\n },\n {\n code: '440300',\n name: '深圳市',\n children: [\n { code: '440303', name: '罗湖区' },\n { code: '440304', name: '福田区' },\n { code: '440305', name: '南山区' },\n { code: '440306', name: '宝安区' },\n { code: '440307', name: '龙岗区' },\n { code: '440308', name: '盐田区' },\n { code: '440309', name: '龙华区' },\n { code: '440310', name: '坪山区' },\n { code: '440311', name: '光明区' }\n ]\n },\n {\n code: '440400',\n name: '珠海市',\n children: [\n { code: '440402', name: '香洲区' },\n { code: '440403', name: '斗门区' },\n { code: '440404', name: '金湾区' }\n ]\n }\n ]\n },\n {\n code: '330000',\n name: '浙江省',\n children: [\n {\n code: '330100',\n name: '杭州市',\n children: [\n { code: '330102', name: '上城区' },\n { code: '330105', name: '拱墅区' },\n { code: '330106', name: '西湖区' },\n { code: '330108', name: '滨江区' },\n { code: '330109', name: '萧山区' },\n { code: '330110', name: '余杭区' },\n { code: '330111', name: '富阳区' },\n { code: '330112', name: '临安区' },\n { code: '330113', name: '临平区' },\n { code: '330114', name: '钱塘区' }\n ]\n },\n {\n code: '330200',\n name: '宁波市',\n children: [\n { code: '330203', name: '海曙区' },\n { code: '330205', name: '江北区' },\n { code: '330206', name: '北仑区' },\n { code: '330211', name: '镇海区' },\n { code: '330212', name: '鄞州区' },\n { code: '330213', name: '奉化区' }\n ]\n }\n ]\n },\n {\n code: '320000',\n name: '江苏省',\n children: [\n {\n code: '320100',\n name: '南京市',\n children: [\n { code: '320102', name: '玄武区' },\n { code: '320104', name: '秦淮区' },\n { code: '320105', name: '建邺区' },\n { code: '320106', name: '鼓楼区' },\n { code: '320111', name: '浦口区' },\n { code: '320113', name: '栖霞区' },\n { code: '320114', name: '雨花台区' },\n { code: '320115', name: '江宁区' },\n { code: '320116', name: '六合区' },\n { code: '320117', name: '溧水区' },\n { code: '320118', name: '高淳区' }\n ]\n },\n {\n code: '320500',\n name: '苏州市',\n children: [\n { code: '320505', name: '虎丘区' },\n { code: '320506', name: '吴中区' },\n { code: '320507', name: '相城区' },\n { code: '320508', name: '姑苏区' },\n { code: '320509', name: '吴江区' }\n ]\n }\n ]\n }\n]);\n\n// 省份列表\nconst provinceList = computed(() => regionData.value || []);\n\n// 城市列表\nconst cityList = computed(() => {\n const province = provinceList.value[pickerIndex.value[0]];\n return province?.children || [];\n});\n\n// 区县列表\nconst districtList = computed(() => {\n const city = cityList.value[pickerIndex.value[1]];\n return city?.children || [];\n});\n\n// 当前层级列表(cascade模式)\nconst currentLevelList = computed(() => {\n if (currentLevel.value === 0) {\n return provinceList.value;\n } else if (currentLevel.value === 1) {\n return tempSelected.value[0]?.children || [];\n } else if (currentLevel.value === 2) {\n return tempSelected.value[1]?.children || [];\n }\n return [];\n});\n\n// 显示值\nconst displayValue = computed(() => {\n if (!props.modelValue || !props.modelValue.length) return '';\n return props.modelValue.map(item => item.name || item).join(props.separator);\n});\n\n// 打开选择器\nfunction openPicker() {\n if (props.disabled) return;\n\n // 先初始化数据,再显示弹窗\n if (props.mode === 'cascade') {\n tempSelected.value = [...(props.modelValue || [])];\n const selectedLen = tempSelected.value.length;\n currentLevel.value = selectedLen >= props.level ? props.level - 1 : selectedLen;\n } else {\n initPickerIndex();\n }\n showPicker.value = true;\n}\n\n// 初始化picker索引\nfunction initPickerIndex() {\n if (!props.modelValue || !props.modelValue.length) {\n pickerIndex.value = [0, 0, 0];\n return;\n }\n\n const [province, city, district] = props.modelValue;\n\n // 查找省份索引\n const provinceIdx = provinceList.value.findIndex(\n p => p.code === province?.code || p.name === province?.name\n );\n pickerIndex.value[0] = provinceIdx >= 0 ? provinceIdx : 0;\n\n // 查找城市索引\n const cities = provinceList.value[pickerIndex.value[0]]?.children || [];\n const cityIdx = cities.findIndex(\n c => c.code === city?.code || c.name === city?.name\n );\n pickerIndex.value[1] = cityIdx >= 0 ? cityIdx : 0;\n\n // 查找区县索引\n if (props.level >= 3) {\n const districts = cities[pickerIndex.value[1]]?.children || [];\n const districtIdx = districts.findIndex(\n d => d.code === district?.code || d.name === district?.name\n );\n pickerIndex.value[2] = districtIdx >= 0 ? districtIdx : 0;\n }\n}\n\n// 关闭选择器\nfunction closePicker() {\n showPicker.value = false;\n emit('cancel');\n}\n\n// picker变化\nfunction onPickerChange(e) {\n const values = e.detail.value;\n\n // 如果省份变化,重置城市和区县索引\n if (values[0] !== pickerIndex.value[0]) {\n values[1] = 0;\n values[2] = 0;\n } else if (values[1] !== pickerIndex.value[1]) {\n // 如果城市变化,重置区县索引\n values[2] = 0;\n }\n\n pickerIndex.value = values;\n}\n\n// 选择热门城市\nfunction selectHotCity(city) {\n const result = [{ code: city.code, name: city.name }];\n emit('update:modelValue', result);\n emit('change', result);\n emit('confirm', result);\n showPicker.value = false;\n}\n\n// 确认选择\nfunction confirmSelect() {\n let result = [];\n\n if (props.mode === 'picker') {\n const province = provinceList.value[pickerIndex.value[0]];\n const city = cityList.value[pickerIndex.value[1]];\n\n if (province) {\n result.push({ code: province.code, name: province.name });\n }\n if (city) {\n result.push({ code: city.code, name: city.name });\n }\n if (props.level >= 3) {\n const district = districtList.value[pickerIndex.value[2]];\n if (district) {\n result.push({ code: district.code, name: district.name });\n }\n }\n } else {\n result = [...tempSelected.value];\n }\n\n emit('update:modelValue', result);\n emit('change', result);\n emit('confirm', result);\n showPicker.value = false;\n}\n\n// cascade模式 - 选择项目\nfunction selectItem(item) {\n if (hasChildren(item) && currentLevel.value < props.level - 1) {\n // 有子级且未到最后一级,进入下一级\n tempSelected.value = tempSelected.value.slice(0, currentLevel.value);\n tempSelected.value.push({ code: item.code, name: item.name, children: item.children });\n currentLevel.value++;\n } else {\n // 最后一级,选中并自动确认\n tempSelected.value = tempSelected.value.slice(0, currentLevel.value);\n tempSelected.value.push({ code: item.code, name: item.name });\n confirmSelect();\n }\n}\n\n// 判断是否有子级\nfunction hasChildren(item) {\n return item.children && item.children.length > 0;\n}\n\n// 判断是否选中\nfunction isItemSelected(item) {\n const current = tempSelected.value[currentLevel.value];\n return current && (current.code === item.code || current.name === item.name);\n}\n\n// 返回到某一级\nfunction backToLevel(index) {\n currentLevel.value = index;\n tempSelected.value = tempSelected.value.slice(0, index);\n}\n\n// 清除选择\nfunction clearSelection() {\n tempSelected.value = [];\n currentLevel.value = 0;\n}\n\n// 监听modelValue变化\nwatch(() => props.modelValue, (val) => {\n if (props.mode === 'cascade' && showPicker.value) {\n tempSelected.value = [...(val || [])];\n }\n}, { deep: true });\n</script>\n\n<style lang=\"scss\">\n.prism-city-picker {\n .picker-trigger {\n cursor: pointer;\n }\n\n .picker-popup {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--prism-mask-bg, rgba(0, 0, 0, 0.5));\n display: flex;\n align-items: flex-end;\n justify-content: center;\n z-index: 9999;\n }\n\n .picker-content {\n width: 100%;\n background: var(--prism-bg-color-card, #FFFFFF);\n border-radius: 24rpx 24rpx 0 0;\n max-height: 70vh;\n display: flex;\n flex-direction: column;\n }\n\n .picker-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 24rpx 32rpx;\n border-bottom: 1rpx solid var(--prism-border-color-light, #E5E6EB);\n }\n\n .picker-cancel {\n font-size: 30rpx;\n color: var(--prism-text-secondary, #86909C);\n padding: 8rpx 16rpx;\n }\n\n .picker-title {\n font-size: 32rpx;\n font-weight: 600;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .picker-confirm {\n font-size: 30rpx;\n color: var(--prism-primary-color, #3478F6);\n padding: 8rpx 16rpx;\n font-weight: 500;\n }\n\n .picker-body {\n // height 通过 JS 动态设置\n padding-bottom: env(safe-area-inset-bottom);\n box-sizing: content-box;\n position: relative;\n }\n\n .picker-view {\n // height 通过 JS 动态设置\n }\n\n .picker-item {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32rpx;\n // height 和 lineHeight 通过 JS 动态设置\n font-weight: 500;\n }\n\n // picker指示器样式 - 隐藏原有背景\n :deep(.picker-indicator) {\n // height 通过 indicatorStyle 动态设置\n background: transparent !important;\n background-color: transparent !important;\n border: none !important;\n border-width: 0 !important;\n border-style: none !important;\n border-color: transparent !important;\n box-shadow: none !important;\n z-index: 0 !important;\n }\n\n // 整体激活项背景 - 横跨所有列的圆角气泡(浅色模式)- 暂时禁用\n // .picker-body::before {\n // content: '';\n // position: absolute;\n // left: 16rpx;\n // right: 16rpx;\n // top: 50%;\n // transform: translateY(-50%);\n // height: 96rpx;\n // background: var(--prism-primary-light, rgba(52, 120, 246, 0.08));\n // border-radius: 12rpx;\n // z-index: 0;\n // pointer-events: none;\n // }\n\n // 确保文字在背景色上方\n .picker-item {\n position: relative;\n z-index: 2;\n }\n\n // 浅色模式遮罩层 - 放在最下层\n :deep(.uni-picker-view-mask) {\n z-index: 1 !important;\n background-image: linear-gradient(180deg, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0)),\n linear-gradient(0deg, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0)) !important;\n }\n\n // 覆盖 uni-app 默认边框和背景\n :deep(.uni-picker-view-indicator) {\n background: transparent !important;\n background-color: transparent !important;\n border: none !important;\n border-top: none !important;\n border-bottom: none !important;\n border-color: transparent !important;\n }\n\n // 多层级选择\n .cascade-body {\n display: flex;\n flex-direction: column;\n height: 500rpx;\n }\n\n // 热门城市\n .hot-cities {\n padding: 24rpx 32rpx;\n background: var(--prism-bg-color-card, #FFFFFF);\n }\n\n .hot-cities-title {\n display: flex;\n align-items: center;\n gap: 8rpx;\n font-size: 26rpx;\n color: var(--prism-text-secondary, #86909C);\n margin-bottom: 20rpx;\n\n .fa-fire {\n color: #FF6B00;\n }\n }\n\n .hot-cities-list {\n display: flex;\n flex-wrap: wrap;\n gap: 16rpx;\n }\n\n .hot-city-item {\n padding: 16rpx 28rpx;\n background: var(--prism-bg-color-container, #F7F8FA);\n border-radius: 8rpx;\n font-size: 28rpx;\n color: var(--prism-text-primary, #1D2129);\n\n &:active {\n background: var(--prism-primary-light, rgba(52, 120, 246, 0.08));\n color: var(--prism-primary-color, #3478F6);\n }\n }\n\n .hot-cities-divider {\n display: flex;\n align-items: center;\n margin-top: 24rpx;\n padding-top: 20rpx;\n border-top: 1rpx solid var(--prism-border-color-light, #E5E6EB);\n font-size: 26rpx;\n color: var(--prism-text-secondary, #86909C);\n }\n\n .cascade-breadcrumb {\n display: flex;\n align-items: center;\n padding: 20rpx 32rpx;\n background: var(--prism-bg-color-container, #F7F8FA);\n flex-wrap: wrap;\n gap: 8rpx;\n }\n\n .breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 8rpx;\n\n text:first-child {\n font-size: 28rpx;\n color: var(--prism-primary-color, #3478F6);\n }\n\n .fa {\n font-size: 20rpx;\n color: var(--prism-text-placeholder, #C9CDD4);\n }\n }\n\n .breadcrumb-clear {\n margin-left: auto;\n padding: 8rpx;\n\n .fa {\n font-size: 28rpx;\n color: var(--prism-text-secondary, #86909C);\n }\n }\n\n .cascade-list {\n flex: 1;\n height: 400rpx;\n }\n\n .cascade-item {\n display: flex;\n align-items: center;\n padding: 28rpx 32rpx;\n border-bottom: 1rpx solid var(--prism-border-color-light, #E5E6EB);\n\n &.selected {\n .item-name {\n color: var(--prism-primary-color, #3478F6);\n font-weight: 500;\n }\n }\n }\n\n .item-content {\n flex: 1;\n }\n\n .item-name {\n font-size: 30rpx;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .item-code {\n font-size: 24rpx;\n color: var(--prism-text-secondary, #86909C);\n margin-top: 8rpx;\n }\n\n .item-arrow {\n font-size: 24rpx;\n color: var(--prism-text-placeholder, #C9CDD4);\n }\n\n .item-check {\n font-size: 28rpx;\n color: var(--prism-primary-color, #3478F6);\n }\n\n .cascade-empty {\n padding: 80rpx 32rpx;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16rpx;\n\n .fa {\n font-size: 64rpx;\n color: var(--prism-text-placeholder, #C9CDD4);\n }\n\n text:last-child {\n font-size: 28rpx;\n color: var(--prism-text-secondary, #86909C);\n }\n }\n}\n\n// 深色模式\n.dark-mode.prism-city-picker {\n .picker-content {\n background: var(--prism-bg-color-card, #1A1A1A);\n }\n\n // picker 滚轮模式\n .picker-item {\n color: var(--prism-text-primary, #E5E6EB);\n }\n\n .picker-body :deep(.picker-indicator),\n :deep(.picker-indicator) {\n background: transparent !important;\n background-color: transparent !important;\n border: none !important;\n border-width: 0 !important;\n border-style: none !important;\n border-color: transparent !important;\n }\n\n // 整体激活项背景 - 横跨所有列的圆角气泡 - 暂时禁用\n // .picker-body::before {\n // content: '';\n // position: absolute;\n // left: 16rpx;\n // right: 16rpx;\n // top: 50%;\n // transform: translateY(-50%);\n // height: 96rpx;\n // background: rgba(255, 255, 255, 0.08);\n // border-radius: 12rpx;\n // z-index: 0;\n // pointer-events: none;\n // }\n\n :deep(.uni-picker-view-indicator) {\n background: transparent !important;\n border: none !important;\n border-width: 0 !important;\n border-color: transparent !important;\n }\n\n :deep(.uni-picker-view-indicator)::before,\n :deep(.uni-picker-view-indicator)::after {\n display: none !important;\n border: none !important;\n }\n\n :deep(picker-view-column)::before,\n :deep(picker-view-column)::after {\n display: none !important;\n }\n\n // 修复 picker-view 上下遮罩渐变色\n :deep(.uni-picker-view-mask) {\n background-image: linear-gradient(180deg, rgba(26, 26, 26, 0.95), rgba(26, 26, 26, 0.6)),\n linear-gradient(0deg, rgba(26, 26, 26, 0.95), rgba(26, 26, 26, 0.6)) !important;\n }\n\n // cascade 列表模式\n .hot-cities {\n background: var(--prism-bg-color-card, #1A1A1A);\n }\n\n .hot-city-item {\n background: var(--prism-bg-color-container, #2A2A2A);\n color: var(--prism-text-primary, #E5E6EB);\n }\n\n .hot-cities-divider {\n border-top-color: var(--prism-border-color-base, #3A3A3A);\n }\n\n .cascade-breadcrumb {\n background: var(--prism-bg-color-container, #2A2A2A);\n }\n\n .cascade-item {\n &:active {\n background: var(--prism-bg-color-container, #2A2A2A);\n }\n\n &.selected {\n .item-name {\n color: var(--prism-primary-color, #3478F6);\n }\n }\n }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismCityPicker/PrismCityPicker.vue'\nwx.createComponent(Component)"],"names":["useAppStore","ref","rpx2px","computed","watch","Component"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrismCitySelect.js","sources":["components/PrismCitySelect/PrismCitySelect.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21DaXR5U2VsZWN0L1ByaXNtQ2l0eVNlbGVjdC52dWU"],"sourcesContent":["<template>\n <view class=\"prism-city-select\" :class=\"{ 'dark-mode': appStore.isDarkMode }\">\n <!-- 触发器 -->\n <view class=\"picker-trigger\" @click=\"openPicker\">\n <slot>\n <view class=\"prism-select-box\">\n <text :class=\"{ 'placeholder': !displayValue, 'select-text': displayValue }\">\n {{ displayValue || placeholder }}\n </text>\n <text class=\"select-arrow fa fa-map-marker-alt\"></text>\n </view>\n </slot>\n </view>\n\n <!-- 全屏选择页面 -->\n <view class=\"picker-page\" v-if=\"showPicker\">\n <!-- 头部 -->\n <view class=\"page-header\">\n <view class=\"header-back\" @click=\"closePicker\">\n <text class=\"fa fa-arrow-left\"></text>\n </view>\n <view class=\"header-title\">{{ title }}</view>\n <view class=\"header-right\"></view>\n </view>\n\n <!-- 搜索框 -->\n <view class=\"search-box\">\n <view class=\"search-input-wrap\">\n <text class=\"fa fa-search\"></text>\n <input\n class=\"search-input\"\n type=\"text\"\n v-model=\"searchKeyword\"\n placeholder=\"搜索城市\"\n @input=\"onSearch\"\n />\n <text class=\"fa fa-times-circle\" v-if=\"searchKeyword\" @click=\"clearSearch\"></text>\n </view>\n </view>\n\n <!-- 内容区域 -->\n <view class=\"page-content\">\n <!-- 搜索结果 -->\n <scroll-view class=\"search-results\" scroll-y v-if=\"searchKeyword\">\n <view\n v-for=\"item in searchResults\"\n :key=\"item.code\"\n class=\"result-item\"\n @click=\"selectCity(item)\"\n >\n <text>{{ item.name }}</text>\n <text class=\"result-province\">{{ item.provinceName }}</text>\n </view>\n <view class=\"search-empty\" v-if=\"!searchResults.length\">\n <text class=\"fa fa-search\"></text>\n <text>未找到相关城市</text>\n </view>\n </scroll-view>\n\n <!-- 正常列表 -->\n <view class=\"city-content\" v-else>\n <PrismGroupSticky\n :indexList=\"indexList\"\n :showIndexBar=\"true\"\n height=\"100%\"\n >\n <!-- 热门城市 -->\n <view class=\"hot-section\" v-if=\"showHotCities\">\n <view class=\"section-title\">\n <text class=\"fa fa-fire\"></text>\n <text>热门城市</text>\n </view>\n <view class=\"hot-cities-grid\">\n <view\n v-for=\"city in hotCities\"\n :key=\"city.code\"\n class=\"hot-city-item\"\n @click=\"selectCity(city)\"\n >\n {{ city.name }}\n </view>\n </view>\n </view>\n\n <!-- 按字母分组的城市列表 -->\n <template v-for=\"group in groupedCities\" :key=\"group.letter\">\n <view class=\"group-index\" :id=\"'group-' + group.letter\">{{ group.letter }}</view>\n <view\n v-for=\"city in group.cities\"\n :key=\"city.code\"\n class=\"group-item\"\n @click=\"selectCity(city)\"\n >\n {{ city.name }}\n </view>\n </template>\n </PrismGroupSticky>\n </view>\n </view>\n </view>\n </view>\n</template>\n\n<script setup>\nimport { ref, computed } from 'vue';\nimport { useAppStore } from '@/store/app';\nimport PrismGroupSticky from '@/components/PrismGroupSticky/PrismGroupSticky.vue';\n\nconst props = defineProps({\n modelValue: {\n type: Object,\n default: () => null\n },\n placeholder: {\n type: String,\n default: '请选择城市'\n },\n title: {\n type: String,\n default: '选择城市'\n },\n showHotCities: {\n type: Boolean,\n default: true\n },\n hotCities: {\n type: Array,\n default: () => [\n { name: '北京', code: '110000', provinceName: '北京市' },\n { name: '上海', code: '310000', provinceName: '上海市' },\n { name: '广州', code: '440100', provinceName: '广东省' },\n { name: '深圳', code: '440300', provinceName: '广东省' },\n { name: '杭州', code: '330100', provinceName: '浙江省' },\n { name: '成都', code: '510100', provinceName: '四川省' },\n { name: '武汉', code: '420100', provinceName: '湖北省' },\n { name: '南京', code: '320100', provinceName: '江苏省' }\n ]\n },\n disabled: {\n type: Boolean,\n default: false\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'change', 'confirm']);\nconst appStore = useAppStore();\n\nconst showPicker = ref(false);\nconst searchKeyword = ref('');\nconst searchResults = ref([]);\n\n// 城市数据(按拼音首字母分组)\nconst cityData = [\n { name: '北京', code: '110000', letter: 'B', provinceName: '北京市' },\n { name: '天津', code: '120000', letter: 'T', provinceName: '天津市' },\n { name: '上海', code: '310000', letter: 'S', provinceName: '上海市' },\n { name: '重庆', code: '500000', letter: 'C', provinceName: '重庆市' },\n { name: '广州', code: '440100', letter: 'G', provinceName: '广东省' },\n { name: '深圳', code: '440300', letter: 'S', provinceName: '广东省' },\n { name: '杭州', code: '330100', letter: 'H', provinceName: '浙江省' },\n { name: '宁波', code: '330200', letter: 'N', provinceName: '浙江省' },\n { name: '南京', code: '320100', letter: 'N', provinceName: '江苏省' },\n { name: '苏州', code: '320500', letter: 'S', provinceName: '江苏省' },\n { name: '成都', code: '510100', letter: 'C', provinceName: '四川省' },\n { name: '武汉', code: '420100', letter: 'W', provinceName: '湖北省' },\n { name: '长沙', code: '430100', letter: 'C', provinceName: '湖南省' },\n { name: '西安', code: '610100', letter: 'X', provinceName: '陕西省' },\n { name: '郑州', code: '410100', letter: 'Z', provinceName: '河南省' },\n { name: '青岛', code: '370200', letter: 'Q', provinceName: '山东省' },\n { name: '济南', code: '370100', letter: 'J', provinceName: '山东省' },\n { name: '大连', code: '210200', letter: 'D', provinceName: '辽宁省' },\n { name: '沈阳', code: '210100', letter: 'S', provinceName: '辽宁省' },\n { name: '厦门', code: '350200', letter: 'X', provinceName: '福建省' },\n { name: '福州', code: '350100', letter: 'F', provinceName: '福建省' },\n { name: '合肥', code: '340100', letter: 'H', provinceName: '安徽省' },\n { name: '昆明', code: '530100', letter: 'K', provinceName: '云南省' },\n { name: '南昌', code: '360100', letter: 'N', provinceName: '江西省' },\n { name: '南宁', code: '450100', letter: 'N', provinceName: '广西壮族自治区' },\n { name: '贵阳', code: '520100', letter: 'G', provinceName: '贵州省' },\n { name: '兰州', code: '620100', letter: 'L', provinceName: '甘肃省' },\n { name: '太原', code: '140100', letter: 'T', provinceName: '山西省' },\n { name: '石家庄', code: '130100', letter: 'S', provinceName: '河北省' },\n { name: '哈尔滨', code: '230100', letter: 'H', provinceName: '黑龙江省' },\n { name: '长春', code: '220100', letter: 'C', provinceName: '吉林省' }\n];\n\n// 显示值\nconst displayValue = computed(() => {\n if (!props.modelValue) return '';\n return props.modelValue.name || '';\n});\n\n// 索引列表\nconst indexList = computed(() => {\n const letters = [...new Set(cityData.map(c => c.letter))];\n return letters.sort();\n});\n\n// 按字母分组的城市\nconst groupedCities = computed(() => {\n const groups = {};\n cityData.forEach(city => {\n if (!groups[city.letter]) {\n groups[city.letter] = [];\n }\n groups[city.letter].push(city);\n });\n return indexList.value.map(letter => ({\n letter,\n cities: groups[letter] || []\n }));\n});\n\n// 打开选择器\nfunction openPicker() {\n if (props.disabled) return;\n showPicker.value = true;\n searchKeyword.value = '';\n}\n\n// 关闭选择器\nfunction closePicker() {\n showPicker.value = false;\n}\n\n// 选择城市\nfunction selectCity(city) {\n const result = { code: city.code, name: city.name, provinceName: city.provinceName };\n emit('update:modelValue', result);\n emit('change', result);\n emit('confirm', result);\n showPicker.value = false;\n}\n\n// 搜索\nfunction onSearch() {\n if (!searchKeyword.value.trim()) {\n searchResults.value = [];\n return;\n }\n const keyword = searchKeyword.value.trim().toLowerCase();\n searchResults.value = cityData.filter(city =>\n city.name.toLowerCase().includes(keyword)\n );\n}\n\n// 清空搜索\nfunction clearSearch() {\n searchKeyword.value = '';\n searchResults.value = [];\n}\n</script>\n\n<style lang=\"scss\">\n.prism-city-select {\n .prism-select-box {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 24rpx;\n background: var(--prism-input-bg, #F7F8FA);\n border-radius: 12rpx;\n\n .placeholder { color: var(--prism-text-placeholder, #C9CDD4); font-size: 28rpx; }\n .select-text { color: var(--prism-text-primary, #1D2129); font-size: 28rpx; }\n .select-arrow { color: var(--prism-text-secondary, #86909C); font-size: 28rpx; }\n }\n\n .picker-page {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: -100rpx; // 向下延伸覆盖底部\n padding-bottom: 100rpx; // 补偿底部延伸\n background: var(--prism-bg-color-page, #F5F6F7);\n z-index: 9999;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n box-sizing: border-box;\n }\n\n .page-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 24rpx 32rpx;\n padding-top: calc(24rpx + env(safe-area-inset-top));\n background: var(--prism-bg-color-card, #FFFFFF);\n }\n\n .header-back {\n width: 60rpx;\n .fa { font-size: 36rpx; color: var(--prism-text-primary, #1D2129); }\n }\n\n .header-title {\n font-size: 34rpx;\n font-weight: 600;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .header-right { width: 60rpx; }\n\n .search-box {\n padding: 16rpx 32rpx;\n background: var(--prism-bg-color-card, #FFFFFF);\n }\n\n .search-input-wrap {\n display: flex;\n align-items: center;\n padding: 16rpx 24rpx;\n background: var(--prism-bg-color-container, #F7F8FA);\n border-radius: 8rpx;\n gap: 16rpx;\n\n .fa-search { color: var(--prism-text-placeholder, #C9CDD4); }\n .fa-times-circle { color: var(--prism-text-secondary, #86909C); }\n }\n\n .search-input {\n flex: 1;\n font-size: 28rpx;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .page-content {\n flex: 1;\n height: 0;\n }\n\n .city-content {\n height: 100%;\n }\n\n .hot-section {\n background: var(--prism-bg-color-card, #FFFFFF);\n }\n\n .section-title {\n display: flex;\n align-items: center;\n gap: 8rpx;\n padding: 8rpx 24rpx 0;\n margin-bottom: 8rpx;\n font-size: 26rpx;\n color: var(--prism-text-secondary, #86909C);\n\n .fa-fire {\n color: #FF6B00;\n }\n }\n\n .hot-cities-grid {\n display: flex;\n flex-wrap: wrap;\n padding: 0 24rpx 24rpx;\n gap: 16rpx;\n }\n\n .hot-city-item {\n padding: 16rpx 32rpx;\n background: var(--prism-bg-color-container, #F7F8FA);\n border-radius: 8rpx;\n font-size: 28rpx;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .search-results {\n height: 100%;\n background: var(--prism-bg-color-card, #FFFFFF);\n }\n\n .result-item {\n display: flex;\n justify-content: space-between;\n padding: 28rpx 32rpx;\n border-bottom: 1rpx solid var(--prism-border-color-light, #E5E6EB);\n font-size: 30rpx;\n color: var(--prism-text-primary, #1D2129);\n\n .result-province {\n font-size: 26rpx;\n color: var(--prism-text-secondary, #86909C);\n }\n }\n\n .search-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 120rpx 32rpx;\n gap: 24rpx;\n .fa { font-size: 80rpx; color: var(--prism-text-placeholder, #C9CDD4); }\n text { font-size: 28rpx; color: var(--prism-text-secondary, #86909C); }\n }\n\n // 城市列表箭头\n .city-arrow {\n font-size: 24rpx;\n color: var(--prism-text-placeholder, #C9CDD4);\n margin-left: 16rpx;\n }\n\n // 列表项左右边距\n .group-index,\n .group-item {\n margin: 0 30rpx;\n }\n\n // 索引条贴在屏幕边缘\n .prism-index-bar {\n right: 0;\n }\n}\n\n// 深色模式\n.dark-mode.prism-city-select {\n .picker-page { background: var(--prism-bg-color-page, #121212); }\n .page-header, .search-box, .hot-section, .search-results { background: var(--prism-bg-color-card, #1A1A1A); }\n .search-input-wrap, .hot-city-item { background: var(--prism-bg-color-container, #2A2A2A); }\n\n .group-index {\n background: var(--prism-bg-color-page, #121212);\n }\n\n .group-item {\n background: var(--prism-bg-color-card, #1A1A1A);\n color: var(--prism-text-primary, #E5E6EB);\n border-bottom-color: var(--prism-border-color-light, #2D2D2D);\n }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismCitySelect/PrismCitySelect.vue'\nwx.createComponent(Component)"],"names":["useAppStore","ref","computed","Component"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrismCode.js","sources":["components/PrismCode/PrismCode.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21Db2RlL1ByaXNtQ29kZS52dWU"],"sourcesContent":["<template>\n <view class=\"prism-code\" :class=\"[actualTheme, { 'show-line-numbers': showLineNumbers, 'collapsed': !isExpanded }]\">\n <!-- 头部 -->\n <view class=\"code-header\" v-if=\"language || copyable || expandable\">\n <view class=\"header-left\">\n <view class=\"code-expand\" @click=\"toggleExpand\" v-if=\"expandable\">\n <text class=\"fa\" :class=\"isExpanded ? 'fa-chevron-down' : 'fa-chevron-right'\"></text>\n </view>\n <text class=\"code-lang\" v-if=\"language\">{{ language }}</text>\n </view>\n <view class=\"header-right\">\n <!-- 复制按钮 -->\n <view class=\"code-copy\" @click=\"handleCopy\" v-if=\"copyable\">\n <text class=\"fa\" :class=\"copied ? 'fa-check' : 'fa-copy'\"></text>\n <text class=\"copy-text\">{{ copied ? '已复制' : '复制' }}</text>\n </view>\n </view>\n </view>\n\n <!-- 代码内容 -->\n <view class=\"code-body\" v-show=\"isExpanded\" @dblclick=\"handleCopy\">\n <view class=\"code-lines\">\n <template v-for=\"(line, index) in displayLines\" :key=\"index\">\n <view class=\"code-line\" v-if=\"line.visible\">\n <view class=\"fold-btn\" v-if=\"foldable && line.foldable\" @click=\"toggleFold(line.foldStart)\">\n <text class=\"fa\" :class=\"line.folded ? 'fa-plus' : 'fa-minus'\"></text>\n </view>\n <view class=\"fold-placeholder\" v-else-if=\"foldable\"></view>\n <text class=\"line-number\" v-if=\"showLineNumbers\">{{ line.lineNum }}</text>\n <text class=\"line-content\" v-if=\"!highlight\">{{ line.content }}{{ line.folded ? ' ...' : '' }}</text>\n <rich-text class=\"line-content hl-content\" v-else :nodes=\"line.htmlContent\"></rich-text>\n </view>\n </template>\n </view>\n </view>\n </view>\n</template>\n\n<script setup>\n/**\n * PrismCode 代码展示组件\n *\n * 功能特性:\n * - 支持多种编程语言语法高亮\n * - 支持深色/浅色主题自动切换\n * - 支持代码复制、展开/收起、括号折叠\n * - 支持显示行号\n *\n * 使用示例:\n * <PrismCode code=\"const a = 1;\" language=\"JavaScript\" :copyable=\"true\" />\n */\nimport { ref, computed } from 'vue';\nimport { useAppStore } from '@/store/app';\n\nconst props = defineProps({\n // 要展示的代码内容\n code: { type: String, default: '' },\n\n // 编程语言,用于语法高亮和头部显示\n // 支持: js/ts/python/java/go/rust/cpp/sql/html/css/json/shell/vue\n language: { type: String, default: '' },\n\n // 主题模式: 'auto' | 'light' | 'dark'\n // auto: 跟随系统深色模式自动切换\n theme: { type: String, default: 'auto' },\n\n // 是否显示行号\n showLineNumbers: { type: Boolean, default: false },\n\n // 是否显示复制按钮(双击代码区域也可复制)\n copyable: { type: Boolean, default: false },\n\n // 是否可展开/收起整个代码块\n expandable: { type: Boolean, default: false },\n\n // 默认是否展开(仅 expandable 为 true 时有效)\n defaultExpanded: { type: Boolean, default: true },\n\n // 是否启用括号折叠功能(折叠 {}、[]、() 内的代码)\n foldable: { type: Boolean, default: false },\n\n // 是否启用语法高亮\n highlight: { type: Boolean, default: true }\n});\n\nconst appStore = useAppStore();\nconst copied = ref(false);\nconst isExpanded = ref(props.defaultExpanded);\nconst foldedRanges = ref(new Set());\n\n// 计算实际主题\nconst actualTheme = computed(() => {\n if (props.theme === 'auto') {\n return appStore.isDarkMode ? 'dark' : 'light';\n }\n return props.theme;\n});\n\nconst codeLines = computed(() => {\n return props.code ? props.code.split('\\n') : [''];\n});\n\n// 语言关键字配置\nconst langKeywords = {\n js: ['const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'break', 'continue', 'class', 'extends', 'import', 'export', 'from', 'default', 'new', 'this', 'super', 'async', 'await', 'try', 'catch', 'finally', 'throw', 'typeof', 'instanceof', 'in', 'of', 'delete', 'void', 'yield', 'static', 'get', 'set'],\n ts: ['const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'break', 'continue', 'class', 'extends', 'implements', 'import', 'export', 'from', 'default', 'new', 'this', 'super', 'async', 'await', 'try', 'catch', 'finally', 'throw', 'typeof', 'instanceof', 'in', 'of', 'delete', 'void', 'yield', 'static', 'get', 'set', 'interface', 'type', 'enum', 'namespace', 'module', 'declare', 'abstract', 'readonly', 'private', 'protected', 'public', 'as', 'is', 'keyof', 'infer'],\n python: ['def', 'class', 'return', 'if', 'elif', 'else', 'for', 'while', 'break', 'continue', 'pass', 'import', 'from', 'as', 'try', 'except', 'finally', 'raise', 'with', 'lambda', 'yield', 'global', 'nonlocal', 'assert', 'del', 'in', 'not', 'and', 'or', 'is', 'async', 'await'],\n java: ['public', 'private', 'protected', 'static', 'final', 'abstract', 'class', 'interface', 'extends', 'implements', 'new', 'return', 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'break', 'continue', 'try', 'catch', 'finally', 'throw', 'throws', 'import', 'package', 'this', 'super', 'void', 'instanceof', 'synchronized', 'volatile', 'transient', 'native', 'enum'],\n go: ['func', 'return', 'if', 'else', 'for', 'range', 'switch', 'case', 'break', 'continue', 'default', 'package', 'import', 'type', 'struct', 'interface', 'map', 'chan', 'go', 'defer', 'select', 'var', 'const', 'make', 'new', 'nil', 'len', 'cap', 'append', 'copy', 'delete', 'panic', 'recover'],\n rust: ['fn', 'let', 'mut', 'const', 'static', 'return', 'if', 'else', 'match', 'for', 'while', 'loop', 'break', 'continue', 'struct', 'enum', 'impl', 'trait', 'type', 'where', 'use', 'mod', 'pub', 'crate', 'self', 'super', 'as', 'in', 'ref', 'move', 'async', 'await', 'dyn', 'unsafe', 'extern'],\n cpp: ['int', 'float', 'double', 'char', 'bool', 'void', 'long', 'short', 'unsigned', 'signed', 'const', 'static', 'extern', 'auto', 'register', 'volatile', 'return', 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'break', 'continue', 'default', 'class', 'struct', 'union', 'enum', 'public', 'private', 'protected', 'virtual', 'override', 'final', 'new', 'delete', 'this', 'template', 'typename', 'namespace', 'using', 'try', 'catch', 'throw', 'include', 'define', 'ifdef', 'ifndef', 'endif'],\n sql: ['SELECT', 'FROM', 'WHERE', 'AND', 'OR', 'NOT', 'IN', 'LIKE', 'BETWEEN', 'IS', 'NULL', 'ORDER', 'BY', 'ASC', 'DESC', 'LIMIT', 'OFFSET', 'JOIN', 'LEFT', 'RIGHT', 'INNER', 'OUTER', 'ON', 'GROUP', 'HAVING', 'INSERT', 'INTO', 'VALUES', 'UPDATE', 'SET', 'DELETE', 'CREATE', 'TABLE', 'DROP', 'ALTER', 'INDEX', 'PRIMARY', 'KEY', 'FOREIGN', 'REFERENCES', 'UNIQUE', 'DEFAULT', 'AS', 'DISTINCT', 'COUNT', 'SUM', 'AVG', 'MAX', 'MIN', 'CASE', 'WHEN', 'THEN', 'ELSE', 'END', 'UNION', 'ALL', 'EXISTS'],\n html: ['html', 'head', 'body', 'div', 'span', 'p', 'a', 'img', 'ul', 'ol', 'li', 'table', 'tr', 'td', 'th', 'form', 'input', 'button', 'select', 'option', 'textarea', 'label', 'script', 'style', 'link', 'meta', 'title', 'header', 'footer', 'nav', 'main', 'section', 'article', 'aside', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'br', 'hr', 'strong', 'em', 'code', 'pre', 'blockquote', 'iframe', 'video', 'audio', 'canvas', 'svg'],\n css: ['color', 'background', 'background-color', 'font-size', 'font-weight', 'font-family', 'margin', 'padding', 'border', 'width', 'height', 'display', 'position', 'top', 'right', 'bottom', 'left', 'flex', 'grid', 'align-items', 'justify-content', 'text-align', 'line-height', 'overflow', 'z-index', 'opacity', 'transform', 'transition', 'animation', 'box-shadow', 'border-radius', 'cursor', 'visibility', 'content', 'important'],\n json: [],\n shell: ['echo', 'cd', 'ls', 'mkdir', 'rm', 'cp', 'mv', 'cat', 'grep', 'find', 'chmod', 'chown', 'sudo', 'apt', 'yum', 'npm', 'yarn', 'git', 'docker', 'curl', 'wget', 'ssh', 'scp', 'tar', 'zip', 'unzip', 'export', 'source', 'alias', 'if', 'then', 'else', 'fi', 'for', 'do', 'done', 'while', 'case', 'esac', 'function', 'return', 'exit'],\n vue: ['template', 'script', 'style', 'setup', 'ref', 'reactive', 'computed', 'watch', 'watchEffect', 'onMounted', 'onUnmounted', 'defineProps', 'defineEmits', 'defineExpose', 'v-if', 'v-else', 'v-for', 'v-model', 'v-bind', 'v-on', 'v-show', 'v-slot']\n};\n\n// 类型关键字\nconst typeKeywords = {\n ts: ['string', 'number', 'boolean', 'object', 'any', 'void', 'never', 'unknown', 'Array', 'Promise', 'Record', 'Partial', 'Required', 'Readonly', 'Pick', 'Omit', 'Exclude', 'Extract', 'NonNullable', 'ReturnType', 'Parameters', 'InstanceType'],\n java: ['int', 'long', 'short', 'byte', 'float', 'double', 'char', 'boolean', 'String', 'Integer', 'Long', 'Double', 'Float', 'Boolean', 'Object', 'List', 'Map', 'Set', 'ArrayList', 'HashMap', 'HashSet'],\n go: ['int', 'int8', 'int16', 'int32', 'int64', 'uint', 'uint8', 'uint16', 'uint32', 'uint64', 'float32', 'float64', 'complex64', 'complex128', 'byte', 'rune', 'string', 'bool', 'error'],\n rust: ['i8', 'i16', 'i32', 'i64', 'i128', 'isize', 'u8', 'u16', 'u32', 'u64', 'u128', 'usize', 'f32', 'f64', 'bool', 'char', 'str', 'String', 'Vec', 'Option', 'Result', 'Box', 'Rc', 'Arc', 'Cell', 'RefCell']\n};\n\n// 获取语言类型\nfunction getLangType(lang) {\n const l = (lang || '').toLowerCase();\n if (['js', 'javascript', 'jsx'].includes(l)) return 'js';\n if (['ts', 'typescript', 'tsx'].includes(l)) return 'ts';\n if (['py', 'python'].includes(l)) return 'python';\n if (['java', 'kt', 'kotlin'].includes(l)) return 'java';\n if (['go', 'golang'].includes(l)) return 'go';\n if (['rs', 'rust'].includes(l)) return 'rust';\n if (['c', 'cpp', 'c++', 'h', 'hpp'].includes(l)) return 'cpp';\n if (['sql', 'mysql', 'postgresql', 'sqlite'].includes(l)) return 'sql';\n if (['html', 'htm', 'xml'].includes(l)) return 'html';\n if (['css', 'scss', 'sass', 'less'].includes(l)) return 'css';\n if (['json', 'jsonc'].includes(l)) return 'json';\n if (['sh', 'bash', 'shell', 'zsh'].includes(l)) return 'shell';\n if (['vue'].includes(l)) return 'vue';\n return 'js'; // 默认\n}\n\n// 转义 HTML(只转义内容,不转义标签)\nfunction escapeHtml(str) {\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\n// 高亮颜色配置\nconst darkColors = {\n keyword: '#c586c0',\n string: '#ce9178',\n number: '#b5cea8',\n comment: '#6a9955',\n boolean: '#569cd6',\n function: '#dcdcaa',\n type: '#4ec9b0',\n property: '#4fc1ff',\n tag: '#569cd6',\n attr: '#9cdcfe',\n selector: '#d7ba7d',\n decorator: '#dcdcaa',\n operator: '#d4d4d4',\n bracket: '#ffd700'\n};\n\nconst lightColors = {\n keyword: '#af00db',\n string: '#a31515',\n number: '#098658',\n comment: '#008000',\n boolean: '#0000ff',\n function: '#795e26',\n type: '#267f99',\n property: '#001080',\n tag: '#800000',\n attr: '#e50000',\n selector: '#800000',\n decorator: '#795e26',\n operator: '#000000',\n bracket: '#0431fa'\n};\n\n// 获取当前主题的颜色\nconst hlColors = computed(() => {\n return actualTheme.value === 'dark' ? darkColors : lightColors;\n});\n\n// 包裹高亮\nfunction wrap(color, text) {\n return `<span style=\"color:${color}\">${escapeHtml(text)}</span>`;\n}\n\n// 语法高亮处理\nfunction highlightLine(line) {\n if (!props.highlight) return escapeHtml(line);\n\n const langType = getLangType(props.language);\n\n // 使用 token 方式解析\n return tokenize(line, langType);\n}\n\n// 简单的词法分析\nfunction tokenize(line, langType) {\n const tokens = [];\n let i = 0;\n const colors = hlColors.value;\n\n while (i < line.length) {\n let matched = false;\n\n // 字符串 - 双引号\n if (line[i] === '\"') {\n const end = findStringEnd(line, i, '\"');\n tokens.push(wrap(colors.string, line.slice(i, end)));\n i = end;\n matched = true;\n }\n // 字符串 - 单引号\n else if (line[i] === \"'\") {\n const end = findStringEnd(line, i, \"'\");\n tokens.push(wrap(colors.string, line.slice(i, end)));\n i = end;\n matched = true;\n }\n // 字符串 - 模板字符串\n else if (line[i] === '`') {\n const end = findStringEnd(line, i, '`');\n tokens.push(wrap(colors.string, line.slice(i, end)));\n i = end;\n matched = true;\n }\n // 单行注释\n else if (line.slice(i, i + 2) === '//') {\n tokens.push(wrap(colors.comment, line.slice(i)));\n break;\n }\n // Python/Shell 注释\n else if (['python', 'shell'].includes(langType) && line[i] === '#') {\n tokens.push(wrap(colors.comment, line.slice(i)));\n break;\n }\n // 数字\n else if (/\\d/.test(line[i]) && (i === 0 || !/\\w/.test(line[i - 1]))) {\n const match = line.slice(i).match(/^(0x[0-9a-fA-F]+|0b[01]+|0o[0-7]+|\\d+\\.?\\d*(?:e[+-]?\\d+)?)/);\n if (match) {\n tokens.push(wrap(colors.number, match[0]));\n i += match[0].length;\n matched = true;\n }\n }\n // 标识符和关键字\n else if (/[a-zA-Z_]/.test(line[i])) {\n const match = line.slice(i).match(/^[a-zA-Z_]\\w*/);\n if (match) {\n const word = match[0];\n const nextChar = line[i + word.length] || '';\n const keywords = langKeywords[langType] || langKeywords.js;\n const types = typeKeywords[langType] || [];\n\n if (keywords.includes(word)) {\n tokens.push(wrap(colors.keyword, word));\n } else if (types.includes(word)) {\n tokens.push(wrap(colors.type, word));\n } else if (['true', 'false', 'null', 'undefined', 'NaN', 'Infinity', 'True', 'False', 'None', 'nil'].includes(word)) {\n tokens.push(wrap(colors.boolean, word));\n } else if (nextChar === '(') {\n tokens.push(wrap(colors.function, word));\n } else if (nextChar === ':') {\n tokens.push(wrap(colors.property, word));\n } else {\n tokens.push(escapeHtml(word));\n }\n i += word.length;\n matched = true;\n }\n }\n // 括号\n else if (/[(){}[\\]]/.test(line[i])) {\n tokens.push(wrap(colors.bracket, line[i]));\n i++;\n matched = true;\n }\n // 装饰器\n else if (line[i] === '@' && ['python', 'java', 'ts'].includes(langType)) {\n const match = line.slice(i).match(/^@\\w+/);\n if (match) {\n tokens.push(wrap(colors.decorator, match[0]));\n i += match[0].length;\n matched = true;\n }\n }\n\n // 其他字符\n if (!matched) {\n tokens.push(escapeHtml(line[i]));\n i++;\n }\n }\n\n return tokens.join('');\n}\n\n// 查找字符串结束位置\nfunction findStringEnd(line, start, quote) {\n let i = start + 1;\n while (i < line.length) {\n if (line[i] === '\\\\') {\n i += 2;\n } else if (line[i] === quote) {\n return i + 1;\n } else {\n i++;\n }\n }\n return line.length;\n}\n\n// JSON 高亮\nfunction highlightJson(line) {\n let result = line;\n // 键名\n result = result.replace(/(")([^&]+?)(")\\s*:/g, `<span style=\"color:${hlColors.property}\">$1$2$3</span>:`);\n // 字符串值\n result = result.replace(/:(\\s*)(")([^&]*?)(")/g, `:$1<span style=\"color:${hlColors.string}\">$2$3$4</span>`);\n // 数字\n result = result.replace(/:\\s*(-?\\d+\\.?\\d*)/g, `: <span style=\"color:${hlColors.number}\">$1</span>`);\n // 布尔和 null\n result = result.replace(/:\\s*(true|false|null)\\b/g, `: <span style=\"color:${hlColors.boolean}\">$1</span>`);\n return result;\n}\n\n// HTML 高亮\nfunction highlightHtml(line) {\n let result = line;\n // 标签\n result = result.replace(/(<\\/?)([\\w-]+)/g, `$1<span style=\"color:${hlColors.tag}\">$2</span>`);\n // 属性名\n result = result.replace(/\\s([\\w-]+)(=)/g, ` <span style=\"color:${hlColors.attr}\">$1</span>$2`);\n // 属性值\n result = result.replace(/(=)("[^&]*?"|'[^']*?')/g, `$1<span style=\"color:${hlColors.string}\">$2</span>`);\n // 注释\n result = result.replace(/(<!--.*?-->)/g, `<span style=\"color:${hlColors.comment}\">$1</span>`);\n return result;\n}\n\n// CSS 高亮\nfunction highlightCss(line) {\n let result = line;\n // 选择器(简单匹配)\n result = result.replace(/^(\\s*)([\\.\\#\\w\\-\\[\\]=\\\"\\'\\:\\s,>+~]+)(\\s*\\{)/g, `$1<span style=\"color:${hlColors.selector}\">$2</span>$3`);\n // 属性名\n result = result.replace(/([\\w-]+)(\\s*:)/g, `<span style=\"color:${hlColors.property}\">$1</span>$2`);\n // 属性值中的颜色\n result = result.replace(/(#[0-9a-fA-F]{3,8})\\b/g, `<span style=\"color:${hlColors.string}\">$1</span>`);\n // 数字和单位\n result = result.replace(/\\b(-?\\d+\\.?\\d*)(px|em|rem|%|vh|vw|deg|s|ms)?\\b/g, `<span style=\"color:${hlColors.number}\">$1$2</span>`);\n // 注释\n result = result.replace(/(\\/\\*.*?\\*\\/)/g, `<span style=\"color:${hlColors.comment}\">$1</span>`);\n // !important\n result = result.replace(/(!important)/gi, `<span style=\"color:${hlColors.keyword}\">$1</span>`);\n return result;\n}\n\n// SQL 高亮\nfunction highlightSql(line) {\n let result = line;\n const keywords = langKeywords.sql;\n keywords.forEach(kw => {\n const regex = new RegExp(`\\\\b(${kw})\\\\b`, 'gi');\n result = result.replace(regex, `<span style=\"color:${hlColors.keyword}\">$1</span>`);\n });\n // 字符串\n result = result.replace(/('[^']*')/g, `<span style=\"color:${hlColors.string}\">$1</span>`);\n // 数字\n result = result.replace(/\\b(\\d+\\.?\\d*)\\b/g, `<span style=\"color:${hlColors.number}\">$1</span>`);\n // 注释\n result = result.replace(/(--.*$)/g, `<span style=\"color:${hlColors.comment}\">$1</span>`);\n return result;\n}\n\n// 通用高亮\nfunction highlightGeneral(line, langType) {\n let result = line;\n\n // 字符串(需要先处理,避免被其他规则干扰)\n result = result.replace(/(")([^&]*?)(")/g, `<span style=\"color:${hlColors.string}\">$1$2$3</span>`);\n result = result.replace(/('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')/g, `<span style=\"color:${hlColors.string}\">$1</span>`);\n result = result.replace(/(`[^`\\\\]*(?:\\\\.[^`\\\\]*)*`)/g, `<span style=\"color:${hlColors.string}\">$1</span>`);\n\n // 注释\n if (['python', 'shell'].includes(langType)) {\n result = result.replace(/(#.*$)/g, `<span style=\"color:${hlColors.comment}\">$1</span>`);\n } else {\n result = result.replace(/(\\/\\/.*$)/g, `<span style=\"color:${hlColors.comment}\">$1</span>`);\n result = result.replace(/(\\/\\*.*?\\*\\/)/g, `<span style=\"color:${hlColors.comment}\">$1</span>`);\n }\n\n // 类型关键字\n const types = typeKeywords[langType] || [];\n if (types.length > 0) {\n const typeRegex = new RegExp(`\\\\b(${types.join('|')})\\\\b`, 'g');\n result = result.replace(typeRegex, `<span style=\"color:${hlColors.type}\">$1</span>`);\n }\n\n // 语言关键字\n const keywords = langKeywords[langType] || langKeywords.js;\n if (keywords.length > 0) {\n const kwRegex = new RegExp(`\\\\b(${keywords.join('|')})\\\\b`, 'g');\n result = result.replace(kwRegex, `<span style=\"color:${hlColors.keyword}\">$1</span>`);\n }\n\n // 函数调用\n result = result.replace(/\\b([a-zA-Z_]\\w*)\\s*\\(/g, `<span style=\"color:${hlColors.function}\">$1</span>(`);\n\n // 对象属性名 (key: value 格式)\n result = result.replace(/\\b([a-zA-Z_]\\w*)\\s*:/g, `<span style=\"color:${hlColors.property}\">$1</span>:`);\n\n // 括号高亮\n result = result.replace(/([(){}[\\]])/g, `<span style=\"color:${hlColors.bracket}\">$1</span>`);\n\n // 数字(十六进制、二进制、八进制、浮点数、整数)\n result = result.replace(/\\b(0x[0-9a-fA-F]+|0b[01]+|0o[0-7]+|\\d+\\.?\\d*(?:e[+-]?\\d+)?)\\b/g, `<span style=\"color:${hlColors.number}\">$1</span>`);\n\n // 布尔值和特殊值\n if (['python'].includes(langType)) {\n result = result.replace(/\\b(True|False|None)\\b/g, `<span style=\"color:${hlColors.boolean}\">$1</span>`);\n } else if (['rust'].includes(langType)) {\n result = result.replace(/\\b(true|false|Some|None|Ok|Err)\\b/g, `<span style=\"color:${hlColors.boolean}\">$1</span>`);\n } else if (['go'].includes(langType)) {\n result = result.replace(/\\b(true|false|nil|iota)\\b/g, `<span style=\"color:${hlColors.boolean}\">$1</span>`);\n } else {\n result = result.replace(/\\b(true|false|null|undefined|NaN|Infinity)\\b/g, `<span style=\"color:${hlColors.boolean}\">$1</span>`);\n }\n\n // 装饰器/注解\n if (['python', 'java', 'ts'].includes(langType)) {\n result = result.replace(/(@\\w+)/g, `<span style=\"color:${hlColors.decorator}\">$1</span>`);\n }\n\n // 操作符\n result = result.replace(/(\\+\\+|--|&&|\\|\\||===|!==|==|!=|<=|>=|=>|\\+=|-=|\\*=|\\/=)/g, `<span style=\"color:${hlColors.operator}\">$1</span>`);\n\n return result;\n}\n\n// 解析括号折叠区域\nconst foldRanges = computed(() => {\n if (!props.foldable) return [];\n const ranges = [];\n const stack = [];\n const lines = codeLines.value;\n\n lines.forEach((line, index) => {\n const openCount = (line.match(/[\\{\\[\\(]/g) || []).length;\n const closeCount = (line.match(/[\\}\\]\\)]/g) || []).length;\n\n for (let i = 0; i < openCount; i++) {\n stack.push(index);\n }\n for (let i = 0; i < closeCount; i++) {\n if (stack.length > 0) {\n const start = stack.pop();\n if (index > start) {\n ranges.push({ start, end: index });\n }\n }\n }\n });\n return ranges;\n});\n\n// 计算显示的行\nconst displayLines = computed(() => {\n const lines = codeLines.value;\n const result = [];\n\n lines.forEach((content, index) => {\n const foldRange = foldRanges.value.find(r => r.start === index);\n const isFolded = foldedRanges.value.has(index);\n const isHidden = Array.from(foldedRanges.value).some(start => {\n const range = foldRanges.value.find(r => r.start === start);\n return range && index > range.start && index <= range.end;\n });\n\n result.push({\n lineNum: index + 1,\n content,\n htmlContent: highlightLine(content),\n visible: !isHidden,\n foldable: !!foldRange,\n foldStart: index,\n folded: isFolded\n });\n });\n return result;\n});\n\n// 切换括号折叠\nfunction toggleFold(lineIndex) {\n if (foldedRanges.value.has(lineIndex)) {\n foldedRanges.value.delete(lineIndex);\n } else {\n foldedRanges.value.add(lineIndex);\n }\n foldedRanges.value = new Set(foldedRanges.value);\n}\n\nfunction handleCopy() {\n uni.setClipboardData({\n data: props.code,\n success: () => {\n copied.value = true;\n setTimeout(() => { copied.value = false; }, 2000);\n }\n });\n}\n\nfunction toggleExpand() {\n isExpanded.value = !isExpanded.value;\n}\n</script>\n\n<style lang=\"scss\">\n.prism-code {\n border-radius: 12rpx;\n overflow: hidden;\n margin: 10rpx auto;\n}\n\n/* 头部 */\n.code-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16rpx 20rpx;\n border-bottom: 1rpx solid rgba(255, 255, 255, 0.1);\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 12rpx;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 12rpx;\n}\n\n.code-expand {\n width: 40rpx;\n height: 40rpx;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n\n .fa { font-size: 22rpx; }\n &:active { opacity: 0.7; }\n}\n\n.code-lang {\n font-size: 22rpx;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.code-copy {\n display: flex;\n align-items: center;\n gap: 8rpx;\n padding: 8rpx 16rpx;\n border-radius: 8rpx;\n transition: all 0.2s;\n\n &:active { opacity: 0.7; }\n\n .fa { font-size: 24rpx; }\n .copy-text { font-size: 22rpx; }\n}\n\n/* 代码内容 */\n.code-body {\n padding: 20rpx;\n overflow-x: auto;\n\n /* 自定义滚动条 - 默认隐藏,悬停显示 */\n &::-webkit-scrollbar {\n height: 4px;\n background: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background: transparent;\n border-radius: 2px;\n }\n\n &:hover::-webkit-scrollbar-thumb {\n background: rgba(128, 128, 128, 0.4);\n }\n\n &::-webkit-scrollbar-thumb:hover {\n background: rgba(128, 128, 128, 0.6);\n }\n}\n\n.code-lines {\n display: flex;\n flex-direction: column;\n}\n\n.code-line {\n display: flex;\n line-height: 1.6;\n font-family: 'Courier New', Consolas, Monaco, monospace;\n font-size: 24rpx;\n}\n\n/* 括号折叠按钮 */\n.fold-btn {\n width: 28rpx;\n height: 28rpx;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n flex-shrink: 0;\n margin-right: 8rpx;\n border-radius: 4rpx;\n\n .fa { font-size: 16rpx; }\n &:active { opacity: 0.7; }\n}\n\n.fold-placeholder {\n width: 28rpx;\n margin-right: 8rpx;\n flex-shrink: 0;\n}\n\n.line-number {\n min-width: 48rpx;\n padding-right: 16rpx;\n text-align: right;\n user-select: none;\n opacity: 0.5;\n}\n\n.line-content {\n flex: 1;\n white-space: pre-wrap;\n word-break: break-all;\n}\n\n/* 语法高亮颜色 */\n.hl-keyword { color: #c586c0; }\n.hl-string { color: #ce9178; }\n.hl-number { color: #b5cea8; }\n.hl-comment { color: #6a9955; }\n.hl-boolean { color: #569cd6; }\n.hl-function { color: #dcdcaa; }\n.hl-type { color: #4ec9b0; }\n.hl-property { color: #4fc1ff; }\n.hl-tag { color: #569cd6; }\n.hl-attr { color: #9cdcfe; }\n.hl-selector { color: #d7ba7d; }\n.hl-color { color: #ce9178; }\n.hl-decorator { color: #dcdcaa; }\n.hl-operator { color: #d4d4d4; }\n.hl-bracket { color: #ffd700; }\n\n/* 深色主题(默认) */\n.prism-code.dark {\n background: #1e1e1e;\n\n .code-header {\n background: #2d2d2d;\n border-bottom: 1rpx solid #404040;\n }\n\n .code-lang { color: #9cdcfe; }\n\n .code-copy {\n color: #808080;\n background: rgba(255, 255, 255, 0.05);\n &:hover { background: rgba(255, 255, 255, 0.1); }\n }\n\n .line-number { color: #858585; }\n .line-content { color: #d4d4d4; }\n .code-expand .fa { color: #808080; }\n .fold-btn {\n color: #808080;\n background: rgba(255, 255, 255, 0.05);\n &:hover { background: rgba(255, 255, 255, 0.1); }\n }\n}\n\n/* 浅色主题 */\n.prism-code.light {\n background: #f5f5f5;\n border: 1rpx solid #e0e0e0;\n\n .code-header {\n background: #ebebeb;\n border-bottom-color: #e0e0e0;\n }\n\n .code-lang { color: #666666; }\n\n .code-copy {\n color: #666666;\n background: rgba(0, 0, 0, 0.05);\n &:hover { background: rgba(0, 0, 0, 0.1); }\n }\n\n .line-number { color: #999999; }\n .line-content { color: #333333; }\n .code-expand .fa { color: #666666; }\n .fold-btn {\n color: #666666;\n background: rgba(0, 0, 0, 0.05);\n &:hover { background: rgba(0, 0, 0, 0.1); }\n }\n\n /* 浅色主题高亮颜色 */\n .hl-keyword { color: #af00db; }\n .hl-string { color: #a31515; }\n .hl-number { color: #098658; }\n .hl-comment { color: #008000; }\n .hl-boolean { color: #0000ff; }\n .hl-function { color: #795e26; }\n .hl-type { color: #267f99; }\n .hl-property { color: #001080; }\n .hl-tag { color: #800000; }\n .hl-attr { color: #e50000; }\n .hl-selector { color: #800000; }\n .hl-color { color: #a31515; }\n .hl-decorator { color: #795e26; }\n .hl-operator { color: #000000; }\n .hl-bracket { color: #0431fa; }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismCode/PrismCode.vue'\nwx.createComponent(Component)"],"names":["useAppStore","ref","computed","uni","Component"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrismCodeInput.js","sources":["components/PrismCodeInput/PrismCodeInput.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21Db2RlSW5wdXQvUHJpc21Db2RlSW5wdXQudnVl"],"sourcesContent":["<template>\n <view class=\"prism-code-input\" :class=\"{ 'dark-mode': appStore.isDarkMode }\">\n <view class=\"code-boxes\">\n <view\n v-for=\"(item, index) in codeLength\"\n :key=\"index\"\n class=\"code-box\"\n :class=\"{ 'active': focusIndex === index, 'filled': codeArray[index] }\"\n @click=\"handleFocus\"\n >\n <text class=\"code-text\">{{ codeArray[index] || '' }}</text>\n <view class=\"cursor\" v-if=\"focusIndex === index && !codeArray[index]\"></view>\n </view>\n </view>\n <input\n ref=\"hiddenInput\"\n class=\"hidden-input\"\n type=\"number\"\n :maxlength=\"codeLength\"\n v-model=\"codeValue\"\n :focus=\"isFocused\"\n @input=\"handleInput\"\n @focus=\"isFocused = true\"\n @blur=\"isFocused = false\"\n />\n </view>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue';\nimport { useAppStore } from '@/store/app';\n\nconst props = defineProps({\n length: {\n type: Number,\n default: 6\n },\n modelValue: {\n type: String,\n default: ''\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'complete']);\n\nconst appStore = useAppStore();\nconst codeValue = ref(props.modelValue);\nconst isFocused = ref(false);\n\nconst codeLength = computed(() => props.length);\n\nconst codeArray = computed(() => {\n return codeValue.value.split('').slice(0, props.length);\n});\n\nconst focusIndex = computed(() => {\n if (!isFocused.value) return -1;\n return Math.min(codeArray.value.length, props.length - 1);\n});\n\nfunction handleFocus() {\n isFocused.value = true;\n}\n\nfunction handleInput(e) {\n const value = e.detail.value.replace(/\\D/g, '').slice(0, props.length);\n codeValue.value = value;\n emit('update:modelValue', value);\n\n if (value.length === props.length) {\n emit('complete', value);\n }\n}\n\nwatch(() => props.modelValue, (val) => {\n codeValue.value = val;\n});\n</script>\n\n<style lang=\"scss\">\n.prism-code-input {\n position: relative;\n\n .code-boxes {\n display: flex;\n gap: 16rpx;\n }\n\n .code-box {\n width: 76rpx;\n height: 88rpx;\n background: var(--prism-input-bg, #EBEEF2);\n border-radius: 12rpx;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n transition: all 0.2s ease;\n border: 2rpx solid transparent;\n\n &.active {\n border-color: var(--prism-primary-color, #3478F6);\n background: var(--prism-primary-light, rgba(52, 120, 246, 0.08));\n }\n\n &.filled {\n background: var(--prism-primary-light, rgba(52, 120, 246, 0.08));\n }\n\n .code-text {\n font-size: 48rpx;\n font-weight: 600;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .cursor {\n position: absolute;\n width: 4rpx;\n height: 40rpx;\n background: var(--prism-primary-color, #3478F6);\n animation: blink 1s infinite;\n }\n }\n\n .hidden-input {\n position: absolute;\n left: -9999rpx;\n opacity: 0;\n width: 1rpx;\n height: 1rpx;\n }\n\n @keyframes blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n }\n}\n\n.dark-mode .prism-code-input {\n .code-box {\n background: var(--prism-input-bg, #2A2A2A);\n\n &.active {\n background: rgba(52, 120, 246, 0.15);\n }\n\n &.filled {\n background: rgba(52, 120, 246, 0.15);\n }\n\n .code-text {\n color: var(--prism-text-primary, #E5E6EB);\n }\n }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismCodeInput/PrismCodeInput.vue'\nwx.createComponent(Component)"],"names":["useAppStore","ref","computed","watch","Component"],"mappings":";;;;;;;;;;;;;;;;;AAgCA,UAAM,QAAQ;AAWd,UAAM,OAAO;AAEb,UAAM,WAAWA,UAAAA,YAAW;AAC5B,UAAM,YAAYC,cAAAA,IAAI,MAAM,UAAU;AACtC,UAAM,YAAYA,cAAAA,IAAI,KAAK;AAE3B,UAAM,aAAaC,cAAAA,SAAS,MAAM,MAAM,MAAM;AAE9C,UAAM,YAAYA,cAAAA,SAAS,MAAM;AAC/B,aAAO,UAAU,MAAM,MAAM,EAAE,EAAE,MAAM,GAAG,MAAM,MAAM;AAAA,IACxD,CAAC;AAED,UAAM,aAAaA,cAAAA,SAAS,MAAM;AAChC,UAAI,CAAC,UAAU,MAAO,QAAO;AAC7B,aAAO,KAAK,IAAI,UAAU,MAAM,QAAQ,MAAM,SAAS,CAAC;AAAA,IAC1D,CAAC;AAED,aAAS,cAAc;AACrB,gBAAU,QAAQ;AAAA,IACpB;AAEA,aAAS,YAAY,GAAG;AACtB,YAAM,QAAQ,EAAE,OAAO,MAAM,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,MAAM,MAAM;AACrE,gBAAU,QAAQ;AAClB,WAAK,qBAAqB,KAAK;AAE/B,UAAI,MAAM,WAAW,MAAM,QAAQ;AACjC,aAAK,YAAY,KAAK;AAAA,MACxB;AAAA,IACF;AAEAC,kBAAAA,MAAM,MAAM,MAAM,YAAY,CAAC,QAAQ;AACrC,gBAAU,QAAQ;AAAA,IACpB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;AC3ED,GAAG,gBAAgBC,SAAS;"}
|
package/dist/dev/.sourcemap/mp-weixin/components/PrismDateTimePicker/PrismDateTimePicker.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrismDateTimePicker.js","sources":["components/PrismDateTimePicker/PrismDateTimePicker.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21EYXRlVGltZVBpY2tlci9QcmlzbURhdGVUaW1lUGlja2VyLnZ1ZQ"],"sourcesContent":["<template>\n <view class=\"prism-datetime-picker\" :class=\"{ 'dark-mode': appStore.isDarkMode }\">\n <!-- 触发器 -->\n <view class=\"picker-trigger\" @click=\"openPicker\">\n <slot>\n <view class=\"prism-select-box\">\n <text :class=\"{ 'placeholder': !displayValue, 'select-text': displayValue }\">\n {{ displayValue || placeholder }}\n </text>\n <text class=\"select-arrow fa fa-calendar-alt\"></text>\n </view>\n </slot>\n </view>\n\n <!-- 选择器弹窗 -->\n <view class=\"picker-popup\" v-if=\"showPicker\" @click=\"closePicker\">\n <view class=\"picker-content\" @click.stop>\n <!-- 头部 -->\n <view class=\"picker-header\">\n <view class=\"picker-cancel\" @click=\"closePicker\">取消</view>\n <view class=\"picker-title\">{{ title }}</view>\n <view class=\"picker-confirm\" @click=\"confirmSelect\">确定</view>\n </view>\n\n <!-- 滚轮选择器 -->\n <view class=\"picker-body\" v-if=\"mode === 'picker'\">\n <picker-view\n class=\"picker-view\"\n :value=\"pickerIndex\"\n @change=\"onPickerChange\"\n indicator-class=\"picker-indicator\"\n :indicator-style=\"indicatorStyle\"\n :style=\"{ height: pickerHeight }\"\n >\n <!-- 年份列 -->\n <picker-view-column>\n <view\n v-for=\"(item, idx) in yearList\"\n :key=\"item\"\n class=\"picker-item\"\n :style=\"{\n height: itemHeight + 'px',\n lineHeight: itemHeight + 'px',\n color: idx === pickerIndex[0] ? 'var(--prism-primary-color, #3478F6)' : 'var(--prism-text-secondary, #86909C)',\n fontWeight: idx === pickerIndex[0] ? '600' : '400'\n }\"\n >\n {{ item }}年\n </view>\n </picker-view-column>\n <!-- 月份列 -->\n <picker-view-column>\n <view\n v-for=\"(item, idx) in monthList\"\n :key=\"item\"\n class=\"picker-item\"\n :style=\"{\n height: itemHeight + 'px',\n lineHeight: itemHeight + 'px',\n color: idx === pickerIndex[1] ? 'var(--prism-primary-color, #3478F6)' : 'var(--prism-text-secondary, #86909C)',\n fontWeight: idx === pickerIndex[1] ? '600' : '400'\n }\"\n >\n {{ padZero(item) }}月\n </view>\n </picker-view-column>\n <!-- 日期列 -->\n <picker-view-column>\n <view\n v-for=\"(item, idx) in dayList\"\n :key=\"item\"\n class=\"picker-item\"\n :style=\"{\n height: itemHeight + 'px',\n lineHeight: itemHeight + 'px',\n color: idx === pickerIndex[2] ? 'var(--prism-primary-color, #3478F6)' : 'var(--prism-text-secondary, #86909C)',\n fontWeight: idx === pickerIndex[2] ? '600' : '400'\n }\"\n >\n {{ padZero(item) }}日\n </view>\n </picker-view-column>\n <!-- 小时列 -->\n <picker-view-column v-if=\"showTime\">\n <view\n v-for=\"(item, idx) in hourList\"\n :key=\"item\"\n class=\"picker-item\"\n :style=\"{\n height: itemHeight + 'px',\n lineHeight: itemHeight + 'px',\n color: idx === pickerIndex[3] ? 'var(--prism-primary-color, #3478F6)' : 'var(--prism-text-secondary, #86909C)',\n fontWeight: idx === pickerIndex[3] ? '600' : '400'\n }\"\n >\n {{ padZero(item) }}时\n </view>\n </picker-view-column>\n <!-- 分钟列 -->\n <picker-view-column v-if=\"showTime\">\n <view\n v-for=\"(item, idx) in minuteList\"\n :key=\"item\"\n class=\"picker-item\"\n :style=\"{\n height: itemHeight + 'px',\n lineHeight: itemHeight + 'px',\n color: idx === pickerIndex[4] ? 'var(--prism-primary-color, #3478F6)' : 'var(--prism-text-secondary, #86909C)',\n fontWeight: idx === pickerIndex[4] ? '600' : '400'\n }\"\n >\n {{ padZero(item) }}分\n </view>\n </picker-view-column>\n <!-- 秒列 -->\n <picker-view-column v-if=\"showTime && showSeconds\">\n <view\n v-for=\"(item, idx) in secondList\"\n :key=\"item\"\n class=\"picker-item\"\n :style=\"{\n height: itemHeight + 'px',\n lineHeight: itemHeight + 'px',\n color: idx === pickerIndex[5] ? 'var(--prism-primary-color, #3478F6)' : 'var(--prism-text-secondary, #86909C)',\n fontWeight: idx === pickerIndex[5] ? '600' : '400'\n }\"\n >\n {{ padZero(item) }}秒\n </view>\n </picker-view-column>\n </picker-view>\n </view>\n\n <!-- 日历选择器 -->\n <view class=\"calendar-body\" v-else-if=\"mode === 'calendar'\">\n <!-- 暗纹月份水印 -->\n <view class=\"calendar-watermark\">{{ calendarMonth }}</view>\n\n <!-- 年月切换 -->\n <view class=\"calendar-nav\">\n <view class=\"nav-btn\" @click=\"prevYear\">\n <text class=\"fa fa-angles-left\"></text>\n </view>\n <view class=\"nav-btn\" @click=\"prevMonth\">\n <text class=\"fa fa-chevron-left\"></text>\n </view>\n <view class=\"nav-title\">{{ calendarYear }}年{{ calendarMonth }}月</view>\n <view class=\"nav-btn\" @click=\"nextMonth\">\n <text class=\"fa fa-chevron-right\"></text>\n </view>\n <view class=\"nav-btn\" @click=\"nextYear\">\n <text class=\"fa fa-angles-right\"></text>\n </view>\n </view>\n\n <!-- 星期标题 -->\n <view class=\"calendar-weekdays\">\n <view class=\"weekday\" v-for=\"day in weekdays\" :key=\"day\">{{ day }}</view>\n </view>\n\n <!-- 日期网格 -->\n <view class=\"calendar-days\">\n <view\n class=\"calendar-day\"\n v-for=\"(day, index) in calendarDays\"\n :key=\"index\"\n :class=\"{\n 'other-month': day.otherMonth,\n 'today': day.isToday,\n 'selected': day.isSelected,\n 'range-start': day.isRangeStart,\n 'range-end': day.isRangeEnd,\n 'in-range': day.isInRange\n }\"\n @click=\"selectCalendarDay(day)\"\n >\n <text class=\"day-text\">{{ day.day }}</text>\n <text class=\"lunar-text\" v-if=\"props.showLunar && day.lunar\">{{ day.lunar }}</text>\n <text class=\"today-label\" v-if=\"day.isToday && !props.showLunar\">今</text>\n </view>\n </view>\n </view>\n </view>\n </view>\n </view>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue';\nimport { useAppStore } from '@/store/app';\nimport { rpx2px } from '@/utils/system';\nimport { getLunarDayStr } from '@/utils/lunar';\n\nconst props = defineProps({\n modelValue: {\n type: [String, Number, Date],\n default: ''\n },\n // 选择模式:picker(滚轮)或 calendar(日历)\n mode: {\n type: String,\n default: 'picker',\n validator: (val) => ['picker', 'calendar'].includes(val)\n },\n // 是否显示时间选择\n showTime: {\n type: Boolean,\n default: false\n },\n // 是否显示秒\n showSeconds: {\n type: Boolean,\n default: false\n },\n // 日期格式\n format: {\n type: String,\n default: ''\n },\n placeholder: {\n type: String,\n default: '请选择日期'\n },\n title: {\n type: String,\n default: '选择日期'\n },\n // 最小年份\n minYear: {\n type: Number,\n default: () => new Date().getFullYear() - 50\n },\n // 最大年份\n maxYear: {\n type: Number,\n default: () => new Date().getFullYear() + 50\n },\n disabled: {\n type: Boolean,\n default: false\n },\n // 是否为范围选择模式\n range: {\n type: Boolean,\n default: false\n },\n // 是否显示农历\n showLunar: {\n type: Boolean,\n default: false\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'change', 'confirm', 'cancel']);\n\nconst appStore = useAppStore();\nconst showPicker = ref(false);\nconst pickerIndex = ref([0, 0, 0, 0, 0, 0]);\n\n// picker 配置 - 使用 rpx2px 换算,避免精度问题\nconst itemHeight = rpx2px(96);\nconst visibleItemCount = 5;\nconst pickerHeight = `${itemHeight * visibleItemCount}px`;\nconst indicatorStyle = `height: ${itemHeight}px`;\n\n// 日历模式状态\nconst calendarYear = ref(new Date().getFullYear());\nconst calendarMonth = ref(new Date().getMonth() + 1);\nconst selectedDate = ref('');\nconst weekdays = ['日', '一', '二', '三', '四', '五', '六'];\n\n// 范围选择状态\nconst rangeStart = ref('');\nconst rangeEnd = ref('');\n\n// 判断日期是否在范围内\nfunction isInRange(dateStr) {\n if (!props.range || !rangeStart.value || !rangeEnd.value) return false;\n return dateStr > rangeStart.value && dateStr < rangeEnd.value;\n}\n\n// 日历天数\nconst calendarDays = computed(() => {\n const days = [];\n const firstDay = new Date(calendarYear.value, calendarMonth.value - 1, 1);\n const lastDay = new Date(calendarYear.value, calendarMonth.value, 0);\n const startWeekday = firstDay.getDay();\n const totalDays = lastDay.getDate();\n const today = new Date();\n const todayStr = `${today.getFullYear()}-${padZero(today.getMonth() + 1)}-${padZero(today.getDate())}`;\n\n // 上月填充\n const prevMonthDate = new Date(calendarYear.value, calendarMonth.value - 1, 0);\n const prevMonthYear = calendarMonth.value === 1 ? calendarYear.value - 1 : calendarYear.value;\n const prevMonthNum = calendarMonth.value === 1 ? 12 : calendarMonth.value - 1;\n for (let i = startWeekday - 1; i >= 0; i--) {\n const d = prevMonthDate.getDate() - i;\n const dateStr = `${prevMonthYear}-${padZero(prevMonthNum)}-${padZero(d)}`;\n days.push({\n day: d,\n dateStr,\n otherMonth: true,\n lunar: props.showLunar ? getLunarDayStr(prevMonthYear, prevMonthNum, d) : ''\n });\n }\n\n // 当月\n for (let i = 1; i <= totalDays; i++) {\n const dateStr = `${calendarYear.value}-${padZero(calendarMonth.value)}-${padZero(i)}`;\n const isRangeStart = props.range && dateStr === rangeStart.value;\n const isRangeEnd = props.range && dateStr === rangeEnd.value;\n days.push({\n day: i,\n dateStr,\n isToday: dateStr === todayStr,\n isSelected: props.range ? (isRangeStart || isRangeEnd) : dateStr === selectedDate.value,\n isRangeStart,\n isRangeEnd,\n isInRange: isInRange(dateStr),\n lunar: props.showLunar ? getLunarDayStr(calendarYear.value, calendarMonth.value, i) : ''\n });\n }\n\n // 下月填充\n const nextMonthYear = calendarMonth.value === 12 ? calendarYear.value + 1 : calendarYear.value;\n const nextMonthNum = calendarMonth.value === 12 ? 1 : calendarMonth.value + 1;\n const remaining = 42 - days.length;\n for (let i = 1; i <= remaining; i++) {\n const dateStr = `${nextMonthYear}-${padZero(nextMonthNum)}-${padZero(i)}`;\n days.push({\n day: i,\n dateStr,\n otherMonth: true,\n lunar: props.showLunar ? getLunarDayStr(nextMonthYear, nextMonthNum, i) : ''\n });\n }\n\n return days;\n});\n\n// 年份列表\nconst yearList = computed(() => {\n const list = [];\n for (let i = props.minYear; i <= props.maxYear; i++) {\n list.push(i);\n }\n return list;\n});\n\n// 月份列表\nconst monthList = computed(() => {\n const list = [];\n for (let i = 1; i <= 12; i++) {\n list.push(i);\n }\n return list;\n});\n\n// 日期列表(根据年月动态计算)\nconst dayList = computed(() => {\n const year = yearList.value[pickerIndex.value[0]];\n const month = monthList.value[pickerIndex.value[1]];\n const days = getDaysInMonth(year, month);\n const list = [];\n for (let i = 1; i <= days; i++) {\n list.push(i);\n }\n return list;\n});\n\n// 小时列表\nconst hourList = computed(() => {\n const list = [];\n for (let i = 0; i <= 23; i++) {\n list.push(i);\n }\n return list;\n});\n\n// 分钟列表\nconst minuteList = computed(() => {\n const list = [];\n for (let i = 0; i <= 59; i++) {\n list.push(i);\n }\n return list;\n});\n\n// 秒列表\nconst secondList = computed(() => {\n const list = [];\n for (let i = 0; i <= 59; i++) {\n list.push(i);\n }\n return list;\n});\n\n// 获取某月的天数\nfunction getDaysInMonth(year, month) {\n return new Date(year, month, 0).getDate();\n}\n\n// 补零\nfunction padZero(num) {\n return num < 10 ? '0' + num : String(num);\n}\n\n// 默认格式\nconst defaultFormat = computed(() => {\n if (props.format) return props.format;\n if (props.showTime) {\n return props.showSeconds ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD HH:mm';\n }\n return 'YYYY-MM-DD';\n});\n\n// 显示值\nconst displayValue = computed(() => {\n if (!props.modelValue) return '';\n return formatDate(parseDate(props.modelValue), defaultFormat.value);\n});\n\n// 解析日期\nfunction parseDate(value) {\n if (!value) return new Date();\n if (value instanceof Date) return value;\n if (typeof value === 'number') return new Date(value);\n if (typeof value === 'string') {\n const d = new Date(value.replace(/-/g, '/'));\n return isNaN(d.getTime()) ? new Date() : d;\n }\n return new Date();\n}\n\n// 格式化日期\nfunction formatDate(date, format) {\n const year = date.getFullYear();\n const month = date.getMonth() + 1;\n const day = date.getDate();\n const hour = date.getHours();\n const minute = date.getMinutes();\n const second = date.getSeconds();\n\n return format\n .replace('YYYY', year)\n .replace('MM', padZero(month))\n .replace('DD', padZero(day))\n .replace('HH', padZero(hour))\n .replace('mm', padZero(minute))\n .replace('ss', padZero(second));\n}\n\n// 打开选择器\nfunction openPicker() {\n if (props.disabled) return;\n\n // 先初始化数据,再显示弹窗\n if (props.mode === 'calendar') {\n initCalendar();\n } else {\n initPickerIndex();\n }\n showPicker.value = true;\n}\n\n// 初始化日历\nfunction initCalendar() {\n const date = props.modelValue ? parseDate(props.modelValue) : new Date();\n calendarYear.value = date.getFullYear();\n calendarMonth.value = date.getMonth() + 1;\n selectedDate.value = props.modelValue\n ? `${date.getFullYear()}-${padZero(date.getMonth() + 1)}-${padZero(date.getDate())}`\n : '';\n}\n\n// 初始化picker索引\nfunction initPickerIndex() {\n const date = props.modelValue ? parseDate(props.modelValue) : new Date();\n const year = date.getFullYear();\n const month = date.getMonth() + 1;\n const day = date.getDate();\n const hour = date.getHours();\n const minute = date.getMinutes();\n const second = date.getSeconds();\n\n const yearIdx = yearList.value.indexOf(year);\n pickerIndex.value = [\n yearIdx >= 0 ? yearIdx : 0,\n month - 1,\n day - 1,\n hour,\n minute,\n second\n ];\n}\n\n// 关闭选择器\nfunction closePicker() {\n showPicker.value = false;\n emit('cancel');\n}\n\n// 上一年\nfunction prevYear() {\n calendarYear.value--;\n}\n\n// 下一年\nfunction nextYear() {\n calendarYear.value++;\n}\n\n// 上一月\nfunction prevMonth() {\n if (calendarMonth.value === 1) {\n calendarMonth.value = 12;\n calendarYear.value--;\n } else {\n calendarMonth.value--;\n }\n}\n\n// 下一月\nfunction nextMonth() {\n if (calendarMonth.value === 12) {\n calendarMonth.value = 1;\n calendarYear.value++;\n } else {\n calendarMonth.value++;\n }\n}\n\n// 选择日历日期\nfunction selectCalendarDay(day) {\n if (day.otherMonth) return;\n\n if (props.range) {\n // 范围选择模式\n if (!rangeStart.value || (rangeStart.value && rangeEnd.value)) {\n // 开始新的选择\n rangeStart.value = day.dateStr;\n rangeEnd.value = '';\n } else {\n // 选择结束日期\n if (day.dateStr < rangeStart.value) {\n // 如果选择的日期比开始日期早,交换\n rangeEnd.value = rangeStart.value;\n rangeStart.value = day.dateStr;\n } else {\n rangeEnd.value = day.dateStr;\n }\n }\n } else {\n // 单选模式\n selectedDate.value = day.dateStr;\n }\n}\n\n// 回到今天\nfunction goToday() {\n const today = new Date();\n calendarYear.value = today.getFullYear();\n calendarMonth.value = today.getMonth() + 1;\n selectedDate.value = `${today.getFullYear()}-${padZero(today.getMonth() + 1)}-${padZero(today.getDate())}`;\n}\n\n// picker变化\nfunction onPickerChange(e) {\n const values = e.detail.value;\n // 年月变化时,检查日期是否超出范围\n const year = yearList.value[values[0]];\n const month = monthList.value[values[1]];\n const maxDay = getDaysInMonth(year, month);\n if (values[2] >= maxDay) {\n values[2] = maxDay - 1;\n }\n pickerIndex.value = values;\n}\n\n// 确认选择\nfunction confirmSelect() {\n let result;\n\n if (props.mode === 'calendar') {\n if (props.range) {\n // 范围选择模式\n if (!rangeStart.value || !rangeEnd.value) {\n uni.showToast({ title: '请选择完整的日期范围', icon: 'none' });\n return;\n }\n result = [rangeStart.value, rangeEnd.value];\n } else {\n // 单选模式\n if (!selectedDate.value) {\n uni.showToast({ title: '请选择日期', icon: 'none' });\n return;\n }\n result = selectedDate.value;\n }\n } else {\n const year = yearList.value[pickerIndex.value[0]];\n const month = monthList.value[pickerIndex.value[1]];\n const day = dayList.value[pickerIndex.value[2]];\n const hour = props.showTime ? hourList.value[pickerIndex.value[3]] : 0;\n const minute = props.showTime ? minuteList.value[pickerIndex.value[4]] : 0;\n const second = props.showTime && props.showSeconds ? secondList.value[pickerIndex.value[5]] : 0;\n\n const date = new Date(year, month - 1, day, hour, minute, second);\n result = formatDate(date, defaultFormat.value);\n }\n\n emit('update:modelValue', result);\n emit('change', result);\n emit('confirm', result);\n showPicker.value = false;\n}\n</script>\n\n<style lang=\"scss\">\n.prism-datetime-picker {\n .picker-trigger {\n cursor: pointer;\n }\n\n .picker-popup {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--prism-mask-bg, rgba(0, 0, 0, 0.5));\n display: flex;\n align-items: flex-end;\n justify-content: center;\n z-index: 9999;\n }\n\n .picker-content {\n width: 100%;\n background: var(--prism-bg-color-card, #FFFFFF);\n border-radius: 24rpx 24rpx 0 0;\n }\n\n .picker-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 24rpx 32rpx;\n border-bottom: 1rpx solid var(--prism-border-color-light, #E5E6EB);\n }\n\n .picker-cancel {\n font-size: 30rpx;\n color: var(--prism-text-secondary, #86909C);\n padding: 8rpx 16rpx;\n }\n\n .picker-title {\n font-size: 32rpx;\n font-weight: 600;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .picker-confirm {\n font-size: 30rpx;\n color: var(--prism-primary-color, #3478F6);\n padding: 8rpx 16rpx;\n font-weight: 500;\n }\n\n .picker-body {\n // height 通过 JS 动态设置\n padding-bottom: env(safe-area-inset-bottom);\n box-sizing: content-box;\n position: relative;\n }\n\n .picker-view {\n // height 通过 JS 动态设置\n }\n\n .picker-item {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32rpx;\n // height 和 lineHeight 通过 JS 动态设置\n font-weight: 500;\n }\n\n // picker指示器样式 - 隐藏原有背景,用文字颜色区分激活项\n :deep(.picker-indicator) {\n // height 通过 indicatorStyle 动态设置\n background: transparent !important;\n background-color: transparent !important;\n border: none !important;\n border-width: 0 !important;\n border-style: none !important;\n border-color: transparent !important;\n box-shadow: none !important;\n z-index: 0 !important;\n }\n\n // 确保文字在背景色上方\n .picker-item {\n position: relative;\n z-index: 2;\n }\n\n // 浅色模式遮罩层\n :deep(.uni-picker-view-mask) {\n z-index: 1 !important;\n background-image: linear-gradient(180deg, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0)),\n linear-gradient(0deg, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0)) !important;\n }\n\n // 覆盖 uni-app 默认边框\n :deep(.uni-picker-view-indicator) {\n border: none !important;\n border-top: none !important;\n border-bottom: none !important;\n border-color: transparent !important;\n }\n\n // 日历模式\n .calendar-body {\n padding: 0 24rpx 24rpx;\n padding-bottom: calc(24rpx + env(safe-area-inset-bottom));\n position: relative;\n }\n\n // 暗纹月份水印 - 相对于整个日历区域居中\n .calendar-watermark {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 300rpx;\n font-weight: bold;\n color: var(--prism-text-primary, #1D2129);\n opacity: 0.04;\n pointer-events: none;\n z-index: 0;\n user-select: none;\n }\n\n .calendar-nav {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16rpx 0;\n gap: 16rpx;\n }\n\n .nav-btn {\n width: 64rpx;\n height: 64rpx;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8rpx;\n color: var(--prism-text-secondary, #86909C);\n\n &:active {\n background: var(--prism-bg-color-container, #F7F8FA);\n }\n }\n\n .nav-title {\n font-size: 32rpx;\n font-weight: 600;\n color: var(--prism-text-primary, #1D2129);\n min-width: 200rpx;\n text-align: center;\n }\n\n .today-btn {\n position: absolute;\n right: 0;\n background: var(--prism-primary-light, rgba(52, 120, 246, 0.08));\n color: var(--prism-primary-color, #3478F6);\n font-size: 24rpx;\n font-weight: 500;\n }\n\n .calendar-weekdays {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n margin-bottom: 8rpx;\n }\n\n .weekday {\n text-align: center;\n font-size: 26rpx;\n color: var(--prism-text-secondary, #86909C);\n padding: 16rpx 0;\n }\n\n .calendar-days {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 8rpx;\n position: relative;\n z-index: 1;\n }\n\n .calendar-day {\n aspect-ratio: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n border-radius: 12rpx;\n position: relative;\n\n &.other-month {\n .day-text {\n color: var(--prism-text-placeholder, #C9CDD4);\n }\n }\n\n &.today {\n .day-text {\n color: #FF6B00;\n font-weight: 600;\n }\n }\n\n &.selected {\n background: var(--prism-primary-color, #3478F6);\n .day-text {\n color: #FFFFFF;\n }\n .today-label {\n color: rgba(255, 255, 255, 0.8);\n }\n }\n\n // 今天被选中时,使用选中样式\n &.today.selected {\n background: var(--prism-primary-color, #3478F6);\n .day-text {\n color: #FFFFFF;\n }\n .today-label {\n color: rgba(255, 255, 255, 0.8);\n }\n }\n\n // 范围选择 - 开始日期\n &.range-start {\n background: var(--prism-primary-color, #3478F6);\n border-radius: 12rpx 0 0 12rpx;\n .day-text, .lunar-text {\n color: #FFFFFF;\n }\n }\n\n // 范围选择 - 结束日期\n &.range-end {\n background: var(--prism-primary-color, #3478F6);\n border-radius: 0 12rpx 12rpx 0;\n .day-text, .lunar-text {\n color: #FFFFFF;\n }\n }\n\n // 范围选择 - 中间日期\n &.in-range {\n background: var(--prism-primary-light, rgba(52, 120, 246, 0.1));\n border-radius: 0;\n }\n\n // 开始和结束是同一天\n &.range-start.range-end {\n border-radius: 12rpx;\n }\n }\n\n .day-text {\n font-size: 30rpx;\n color: var(--prism-text-primary, #1D2129);\n }\n\n // 农历文字\n .lunar-text {\n font-size: 18rpx;\n color: var(--prism-text-secondary, #86909C);\n margin-top: 4rpx;\n }\n\n .today-label {\n font-size: 20rpx;\n color: #FF6B00;\n position: absolute;\n bottom: 6rpx;\n }\n}\n\n// 深色模式\n.dark-mode.prism-datetime-picker {\n .picker-content {\n background: var(--prism-bg-color-card, #1A1A1A);\n }\n\n // picker 滚轮模式\n .picker-item {\n color: var(--prism-text-primary, #E5E6EB);\n }\n\n :deep(.picker-indicator) {\n background: transparent !important;\n background-color: transparent !important;\n border: none !important;\n border-width: 0 !important;\n border-style: none !important;\n border-color: transparent !important;\n }\n\n :deep(.uni-picker-view-indicator) {\n background: transparent !important;\n border: none !important;\n border-width: 0 !important;\n border-color: transparent !important;\n }\n\n :deep(.uni-picker-view-indicator)::before,\n :deep(.uni-picker-view-indicator)::after {\n display: none !important;\n border: none !important;\n }\n\n :deep(picker-view-column)::before,\n :deep(picker-view-column)::after {\n display: none !important;\n }\n\n // 修复 picker-view 上下遮罩渐变色\n :deep(picker-view) {\n --picker-mask-bg: linear-gradient(180deg, rgba(26, 26, 26, 0.95), rgba(26, 26, 26, 0.6));\n }\n\n :deep(.uni-picker-view-mask) {\n background-image: linear-gradient(180deg, rgba(26, 26, 26, 0.95), rgba(26, 26, 26, 0.6)),\n linear-gradient(0deg, rgba(26, 26, 26, 0.95), rgba(26, 26, 26, 0.6)) !important;\n }\n\n // 日历模式\n .nav-btn:active {\n background: var(--prism-bg-color-container, #2A2A2A);\n }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismDateTimePicker/PrismDateTimePicker.vue'\nwx.createComponent(Component)"],"names":["useAppStore","ref","rpx2px","computed","getLunarDayStr","uni","Component"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrismDropdown.js","sources":["components/PrismDropdown/PrismDropdown.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21Ecm9wZG93bi9QcmlzbURyb3Bkb3duLnZ1ZQ"],"sourcesContent":["<template>\n <view class=\"prism-dropdown\">\n <view class=\"prism-dropdown__bar\">\n <view\n v-for=\"(item, index) in menuList\"\n :key=\"index\"\n class=\"prism-dropdown__item\"\n :class=\"{ 'prism-dropdown__item--active': activeIndex === index }\"\n @click=\"toggleDropdown(index)\"\n >\n <text>{{ item.value }}</text>\n <text class=\"prism-dropdown__arrow fa fa-chevron-down\"></text>\n </view>\n </view>\n\n <!-- 下拉面板 -->\n <view\n v-for=\"(item, index) in menuList\"\n :key=\"'popup-' + index\"\n class=\"prism-dropdown__popup\"\n :class=\"{ 'prism-dropdown__popup--show': activeIndex === index }\"\n >\n <view\n v-for=\"opt in item.options\"\n :key=\"opt\"\n class=\"prism-dropdown__option\"\n :class=\"{ 'prism-dropdown__option--selected': item.value === opt }\"\n @click=\"selectOption(index, opt)\"\n >\n <text>{{ opt }}</text>\n <text class=\"prism-dropdown__check fa fa-check\"></text>\n </view>\n </view>\n\n <!-- 遮罩层 -->\n <view\n class=\"prism-dropdown__mask\"\n :class=\"{ 'prism-dropdown__mask--show': activeIndex >= 0 }\"\n @click=\"closeDropdown\"\n ></view>\n </view>\n</template>\n\n<script setup>\nimport { ref, watch } from 'vue';\n\nconst props = defineProps({\n menus: {\n type: Array,\n required: true\n // 格式: [{ title: '排序', value: '综合排序', options: ['综合排序', '销量优先'] }]\n }\n});\n\nconst emit = defineEmits(['change']);\n\nconst activeIndex = ref(-1);\nconst menuList = ref([...props.menus]);\n\nwatch(() => props.menus, (val) => {\n menuList.value = [...val];\n}, { deep: true });\n\nfunction toggleDropdown(index) {\n activeIndex.value = activeIndex.value === index ? -1 : index;\n}\n\nfunction closeDropdown() {\n activeIndex.value = -1;\n}\n\nfunction selectOption(index, opt) {\n menuList.value[index].value = opt;\n activeIndex.value = -1;\n emit('change', { index, value: opt, menu: menuList.value[index] });\n}\n</script>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismDropdown/PrismDropdown.vue'\nwx.createComponent(Component)"],"names":["ref","watch","Component"],"mappings":";;;;;;;;;;;;;AA8CA,UAAM,QAAQ;AAQd,UAAM,OAAO;AAEb,UAAM,cAAcA,cAAAA,IAAI,EAAE;AAC1B,UAAM,WAAWA,cAAAA,IAAI,CAAC,GAAG,MAAM,KAAK,CAAC;AAErCC,kBAAAA,MAAM,MAAM,MAAM,OAAO,CAAC,QAAQ;AAChC,eAAS,QAAQ,CAAC,GAAG,GAAG;AAAA,IAC1B,GAAG,EAAE,MAAM,MAAM;AAEjB,aAAS,eAAe,OAAO;AAC7B,kBAAY,QAAQ,YAAY,UAAU,QAAQ,KAAK;AAAA,IACzD;AAEA,aAAS,gBAAgB;AACvB,kBAAY,QAAQ;AAAA,IACtB;AAEA,aAAS,aAAa,OAAO,KAAK;AAChC,eAAS,MAAM,KAAK,EAAE,QAAQ;AAC9B,kBAAY,QAAQ;AACpB,WAAK,UAAU,EAAE,OAAO,OAAO,KAAK,MAAM,SAAS,MAAM,KAAK,GAAG;AAAA,IACnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1EA,GAAG,gBAAgBC,SAAS;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrismGroupSticky.js","sources":["components/PrismGroupSticky/PrismGroupSticky.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21Hcm91cFN0aWNreS9QcmlzbUdyb3VwU3RpY2t5LnZ1ZQ"],"sourcesContent":["<template>\n <view class=\"prism-group-sticky-wrapper\" :style=\"{ height: height }\">\n <scroll-view\n class=\"prism-group-sticky\"\n scroll-y\n :scroll-top=\"scrollTop\"\n :enhanced=\"true\"\n :show-scrollbar=\"false\"\n style=\"height: 100%\"\n @scroll=\"onScroll\"\n >\n <slot></slot>\n </scroll-view>\n\n <!-- 右侧索引条 -->\n <view\n v-if=\"showIndexBar && indexList.length\"\n class=\"prism-index-bar\"\n @touchstart=\"onIndexTouchStart\"\n @touchmove.stop.prevent=\"onIndexTouchMove\"\n @touchend=\"onIndexTouchEnd\"\n >\n <view\n v-for=\"item in indexList\"\n :key=\"item\"\n class=\"index-item\"\n :class=\"{ active: currentIndex === item }\"\n >{{ item }}</view>\n </view>\n\n <!-- 气泡提示(移到索引条外部) -->\n <view\n v-if=\"showIndicator\"\n class=\"index-indicator\"\n :style=\"{ top: indicatorTop + 'px' }\"\n >{{ currentIndex }}</view>\n </view>\n</template>\n\n<script setup>\nimport { ref, nextTick, getCurrentInstance } from 'vue';\n\nconst props = defineProps({\n // 索引列表\n indexList: {\n type: Array,\n default: () => []\n },\n // 是否显示索引条\n showIndexBar: {\n type: Boolean,\n default: false\n },\n // 容器高度\n height: {\n type: String,\n default: '100%'\n }\n});\n\nconst emit = defineEmits(['index-change']);\nconst instance = getCurrentInstance();\n\n// 当前选中的索引\nconst currentIndex = ref('');\n// 是否显示气泡\nconst showIndicator = ref(false);\n// 气泡位置\nconst indicatorTop = ref(0);\n// 滚动位置\nconst scrollTop = ref(0);\n// 当前实际滚动位置\nlet currentScrollTop = 0;\n// 索引条位置信息\nlet indexBarRect = null;\n// 各分组位置缓存\nlet groupPositions = {};\n\n// 根据触摸位置计算当前字母\nconst getLetterByTouch = (touchY) => {\n if (!indexBarRect || !props.indexList.length) return '';\n const itemHeight = indexBarRect.height / props.indexList.length;\n const relativeY = touchY - indexBarRect.top;\n const index = Math.floor(relativeY / itemHeight);\n if (index < 0) return props.indexList[0];\n if (index >= props.indexList.length) return props.indexList[props.indexList.length - 1];\n return props.indexList[index];\n};\n\n// 计算各分组位置\nconst calculateGroupPositions = () => {\n groupPositions = {};\n props.indexList.forEach(letter => {\n const el = document.getElementById(`group-${letter}`);\n if (el) {\n groupPositions[letter] = el.offsetTop;\n }\n });\n};\n\n// 滚动到指定字母\nconst scrollToLetter = (letter) => {\n // 确保位置已计算\n if (!groupPositions[letter]) {\n calculateGroupPositions();\n }\n\n const targetTop = groupPositions[letter];\n if (targetTop !== undefined) {\n // 需要设置一个不同的值才能触发滚动\n scrollTop.value = targetTop + 0.1;\n nextTick(() => {\n scrollTop.value = targetTop;\n });\n }\n};\n\n// 滚动事件\nconst onScroll = (e) => {\n currentScrollTop = e.detail.scrollTop;\n};\n\n// 更新选中字母\nconst updateLetter = (touchY) => {\n // 更新气泡位置\n indicatorTop.value = touchY;\n\n const letter = getLetterByTouch(touchY);\n if (letter) {\n // 每次都更新 currentIndex,确保激活状态及时变化\n currentIndex.value = letter;\n scrollToLetter(letter);\n emit('index-change', letter);\n }\n};\n\n// 触摸开始\nconst onIndexTouchStart = (e) => {\n showIndicator.value = true;\n const touchY = e.touches[0].clientY;\n indicatorTop.value = touchY;\n\n // 获取索引条位置并更新字母\n uni.createSelectorQuery()\n .in(instance)\n .select('.prism-index-bar')\n .boundingClientRect((rect) => {\n if (rect) {\n indexBarRect = rect;\n const letter = getLetterByTouch(touchY);\n if (letter) {\n currentIndex.value = letter;\n scrollToLetter(letter);\n emit('index-change', letter);\n }\n }\n })\n .exec();\n};\n\n// 触摸移动\nconst onIndexTouchMove = (e) => {\n const touchY = e.touches[0].clientY;\n if (indexBarRect) {\n updateLetter(touchY);\n }\n};\n\n// 触摸结束\nconst onIndexTouchEnd = () => {\n showIndicator.value = false;\n};\n</script>\n\n<style lang=\"scss\">\n.prism-group-sticky-wrapper {\n position: relative;\n height: 100%;\n}\n\n.prism-group-sticky {\n height: 100%;\n\n // H5 环境下让 scroll-view 内部容器支持 sticky\n :deep(.uni-scroll-view-content) {\n height: auto !important;\n }\n\n // 分组索引头(吸顶)\n :deep(.group-index) {\n position: -webkit-sticky;\n position: sticky;\n top: -1px;\n z-index: 10;\n margin: 0;\n padding: 12rpx 24rpx;\n padding-top: calc(12rpx + 1px);\n font-size: 26rpx;\n font-weight: 600;\n color: var(--prism-primary-color, #3478F6);\n background: var(--prism-bg-color-page, #F7F8FA);\n }\n\n .dark-mode & :deep(.group-index) {\n background: var(--prism-bg-color-page, #121212);\n }\n\n // 分组内容项\n :deep(.group-item) {\n display: flex;\n align-items: center;\n min-height: 88rpx;\n padding: 24rpx 32rpx;\n background: var(--prism-bg-color-card, #FFFFFF);\n border-bottom: 1rpx solid var(--prism-border-color-light, #F2F3F5);\n font-size: 28rpx;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .dark-mode & :deep(.group-item) {\n background: var(--prism-bg-color-card, #242424);\n border-bottom-color: var(--prism-border-color-light, #2D2D2D);\n }\n\n // 每个分组的最后一个 item(后面紧跟 group-index 或者是最后一个)\n :deep(.group-item:has(+ .group-index)),\n :deep(.group-item:last-child) {\n border-radius: 0 0 16rpx 16rpx;\n border-bottom: none;\n }\n\n :deep(.group-item:active) {\n background: var(--prism-bg-color, #F2F2F2);\n }\n\n .dark-mode & :deep(.group-item:active) {\n background: var(--prism-bg-color, #1A1A1A);\n }\n\n // 第一个 group-item(紧跟在 group-index 后面)- 顶部圆角\n :deep(.group-index + .group-item) {\n border-radius: 16rpx 16rpx 0 0;\n }\n\n // 分组只有一个 item 时 - 全圆角\n :deep(.group-index + .group-item:has(+ .group-index)),\n :deep(.group-index + .group-item:last-child) {\n border-radius: 16rpx;\n }\n\n // 头像(可选)\n .group-avatar {\n width: 80rpx;\n height: 80rpx;\n border-radius: 50%;\n margin-right: 24rpx;\n background: var(--prism-primary-light, #EBF2FF);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 28rpx;\n font-weight: 600;\n color: var(--prism-primary-color, #3478F6);\n flex-shrink: 0;\n\n .dark-mode & {\n background: rgba(52, 120, 246, 0.15);\n }\n }\n\n // 信息区(可选)\n .group-info {\n flex: 1;\n min-width: 0;\n\n .group-title {\n font-size: 30rpx;\n font-weight: 500;\n color: var(--prism-text-primary, #1D2129);\n margin-bottom: 4rpx;\n\n .dark-mode & {\n color: var(--prism-text-primary, #E5E6EB);\n }\n }\n\n .group-desc {\n font-size: 24rpx;\n color: var(--prism-text-secondary, #86909C);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n}\n\n// 右侧索引条\n.prism-index-bar {\n position: absolute;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n z-index: 100;\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 12rpx 16rpx 12rpx 24rpx;\n background: rgba(255, 255, 255, 0.02);\n border-radius: 20rpx 0 0 20rpx;\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n .index-item {\n width: 36rpx;\n height: 36rpx;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 22rpx;\n color: var(--prism-text-primary, #1D2129);\n font-weight: 500;\n background: transparent;\n\n &:active,\n &.active {\n color: var(--prism-primary-color, #3478F6);\n font-weight: 600;\n }\n }\n}\n\n// 气泡提示\n.index-indicator {\n position: fixed;\n right: 120rpx;\n width: 100rpx;\n height: 100rpx;\n margin-top: -50rpx;\n border-radius: 50%;\n background: rgba(52, 120, 246, 0.8);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n color: #FFFFFF;\n font-size: 48rpx;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 8rpx 32rpx rgba(52, 120, 246, 0.3);\n z-index: 1000;\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismGroupSticky/PrismGroupSticky.vue'\nwx.createComponent(Component)"],"names":["getCurrentInstance","ref","nextTick","uni","Component"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA0CA,UAAM,QAAQ;AAkBd,UAAM,OAAO;AACb,UAAM,WAAWA,cAAAA,mBAAkB;AAGnC,UAAM,eAAeC,cAAAA,IAAI,EAAE;AAE3B,UAAM,gBAAgBA,cAAAA,IAAI,KAAK;AAE/B,UAAM,eAAeA,cAAAA,IAAI,CAAC;AAE1B,UAAM,YAAYA,cAAAA,IAAI,CAAC;AAIvB,QAAI,eAAe;AAEnB,QAAI,iBAAiB,CAAA;AAGrB,UAAM,mBAAmB,CAAC,WAAW;AACnC,UAAI,CAAC,gBAAgB,CAAC,MAAM,UAAU,OAAQ,QAAO;AACrD,YAAM,aAAa,aAAa,SAAS,MAAM,UAAU;AACzD,YAAM,YAAY,SAAS,aAAa;AACxC,YAAM,QAAQ,KAAK,MAAM,YAAY,UAAU;AAC/C,UAAI,QAAQ,EAAG,QAAO,MAAM,UAAU,CAAC;AACvC,UAAI,SAAS,MAAM,UAAU,OAAQ,QAAO,MAAM,UAAU,MAAM,UAAU,SAAS,CAAC;AACtF,aAAO,MAAM,UAAU,KAAK;AAAA,IAC9B;AAGA,UAAM,0BAA0B,MAAM;AACpC,uBAAiB,CAAA;AACjB,YAAM,UAAU,QAAQ,YAAU;AAChC,cAAM,KAAK,SAAS,eAAe,SAAS,MAAM,EAAE;AACpD,YAAI,IAAI;AACN,yBAAe,MAAM,IAAI,GAAG;AAAA,QAC9B;AAAA,MACF,CAAC;AAAA,IACH;AAGA,UAAM,iBAAiB,CAAC,WAAW;AAEjC,UAAI,CAAC,eAAe,MAAM,GAAG;AAC3B,gCAAuB;AAAA,MACzB;AAEA,YAAM,YAAY,eAAe,MAAM;AACvC,UAAI,cAAc,QAAW;AAE3B,kBAAU,QAAQ,YAAY;AAC9BC,sBAAAA,WAAS,MAAM;AACb,oBAAU,QAAQ;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,WAAW,CAAC,MAAM;AACH,QAAE,OAAO;AAAA,IAC9B;AAGA,UAAM,eAAe,CAAC,WAAW;AAE/B,mBAAa,QAAQ;AAErB,YAAM,SAAS,iBAAiB,MAAM;AACtC,UAAI,QAAQ;AAEV,qBAAa,QAAQ;AACrB,uBAAe,MAAM;AACrB,aAAK,gBAAgB,MAAM;AAAA,MAC7B;AAAA,IACF;AAGA,UAAM,oBAAoB,CAAC,MAAM;AAC/B,oBAAc,QAAQ;AACtB,YAAM,SAAS,EAAE,QAAQ,CAAC,EAAE;AAC5B,mBAAa,QAAQ;AAGrBC,oBAAAA,MAAI,oBAAmB,EACpB,GAAG,QAAQ,EACX,OAAO,kBAAkB,EACzB,mBAAmB,CAAC,SAAS;AAC5B,YAAI,MAAM;AACR,yBAAe;AACf,gBAAM,SAAS,iBAAiB,MAAM;AACtC,cAAI,QAAQ;AACV,yBAAa,QAAQ;AACrB,2BAAe,MAAM;AACrB,iBAAK,gBAAgB,MAAM;AAAA,UAC7B;AAAA,QACF;AAAA,MACF,CAAC,EACA,KAAI;AAAA,IACT;AAGA,UAAM,mBAAmB,CAAC,MAAM;AAC9B,YAAM,SAAS,EAAE,QAAQ,CAAC,EAAE;AAC5B,UAAI,cAAc;AAChB,qBAAa,MAAM;AAAA,MACrB;AAAA,IACF;AAGA,UAAM,kBAAkB,MAAM;AAC5B,oBAAc,QAAQ;AAAA,IACxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1KA,GAAG,gBAAgBC,SAAS;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrismIdCardInput.js","sources":["components/PrismIdCardInput/PrismIdCardInput.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21JZENhcmRJbnB1dC9QcmlzbUlkQ2FyZElucHV0LnZ1ZQ"],"sourcesContent":["<template>\n <view class=\"prism-id-card-input\" :class=\"{ 'dark-mode': appStore.isDarkMode }\">\n <!-- 身份证号输入框 -->\n <view class=\"id-card-input-wrapper\">\n <input\n class=\"id-card-input\"\n type=\"idcard\"\n :value=\"displayValue\"\n :placeholder=\"placeholder\"\n placeholder-class=\"id-placeholder\"\n :maxlength=\"21\"\n @input=\"handleInput\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n </view>\n\n <!-- 身份证信息解析 -->\n <view class=\"id-info\" v-if=\"showInfo && parsedInfo.valid\">\n <view class=\"info-item\">\n <text class=\"info-label\">地区:</text>\n <text class=\"info-value\">{{ parsedInfo.region }}</text>\n </view>\n <view class=\"info-item\">\n <text class=\"info-label\">出生日期:</text>\n <text class=\"info-value\">{{ parsedInfo.birthday }}</text>\n </view>\n <view class=\"info-item\">\n <text class=\"info-label\">性别:</text>\n <text class=\"info-value\">{{ parsedInfo.gender }}</text>\n </view>\n </view>\n </view>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue';\nimport { useAppStore } from '@/store/app';\n\nconst props = defineProps({\n modelValue: {\n type: String,\n default: ''\n },\n showInfo: {\n type: Boolean,\n default: true\n },\n placeholder: {\n type: String,\n default: '请输入身份证号'\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'complete', 'valid']);\n\nconst appStore = useAppStore();\nconst idValue = ref(props.modelValue);\nconst lastDisplayLength = ref(0);\n\n// 格式化显示值(6-8-4 格式,用空格分隔)\nconst displayValue = computed(() => {\n const val = idValue.value;\n if (!val) return '';\n\n let result = '';\n for (let i = 0; i < val.length; i++) {\n if (i === 6 || i === 14) {\n result += ' ';\n }\n result += val[i];\n }\n return result;\n});\n\n// 解析身份证信息\nconst parsedInfo = computed(() => {\n const id = idValue.value;\n if (id.length !== 18) {\n return { valid: false };\n }\n\n // 验证校验码\n const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n let sum = 0;\n for (let i = 0; i < 17; i++) {\n sum += parseInt(id[i]) * weights[i];\n }\n const checkCode = checkCodes[sum % 11];\n if (id[17].toUpperCase() !== checkCode) {\n return { valid: false };\n }\n\n // 解析出生日期\n const year = id.substring(6, 10);\n const month = id.substring(10, 12);\n const day = id.substring(12, 14);\n const birthday = `${year}年${month}月${day}日`;\n\n // 解析性别\n const genderCode = parseInt(id[16]);\n const gender = genderCode % 2 === 1 ? '男' : '女';\n\n return {\n valid: true,\n region: '—',\n birthday,\n gender\n };\n});\n\nfunction onFocus() {\n // 焦点事件\n}\n\nfunction onBlur() {\n // 失焦事件\n}\n\nfunction handleInput(e) {\n const inputValue = e.detail.value;\n const oldLength = lastDisplayLength.value;\n const newLength = inputValue.length;\n\n // 去掉空格,只允许数字和X\n let value = inputValue.replace(/\\s/g, '').toUpperCase().replace(/[^0-9X]/g, '');\n\n // 判断是否是删除操作,并且删除到了空格位置\n // 空格位置在显示值的第7位(索引6)和第16位(索引15)\n if (newLength < oldLength) {\n // 删除操作\n const deletedPos = oldLength - 1;\n // 如果删除的是空格后的第一个字符,需要额外删除一个字符\n if (deletedPos === 7 || deletedPos === 16) {\n // 删除到空格位置了,再删一个\n const actualPos = deletedPos === 7 ? 6 : 14;\n value = value.slice(0, actualPos - 1) + value.slice(actualPos);\n }\n }\n\n // X只能在最后一位\n if (value.length < 18) {\n value = value.replace(/X/g, '');\n } else if (value.length === 18 && value[17] === 'X') {\n value = value.slice(0, 17).replace(/X/g, '') + 'X';\n } else {\n value = value.replace(/X/g, '');\n }\n\n value = value.slice(0, 18);\n idValue.value = value;\n emit('update:modelValue', value);\n\n // 更新上次显示长度\n lastDisplayLength.value = displayValue.value.length;\n\n if (value.length === 18) {\n emit('complete', value);\n if (parsedInfo.value.valid) {\n emit('valid', parsedInfo.value);\n }\n }\n}\n\nwatch(() => props.modelValue, (val) => {\n idValue.value = val;\n});\n</script>\n\n<style lang=\"scss\">\n.prism-id-card-input {\n .id-card-input-wrapper {\n background: var(--prism-input-bg, #EBEEF2);\n border-radius: 12rpx;\n padding: 0 24rpx;\n height: 88rpx;\n display: flex;\n align-items: center;\n transition: all 0.3s ease;\n\n &:focus-within {\n background: var(--prism-primary-light, #E3EEFF);\n }\n }\n\n .id-card-input {\n flex: 1;\n font-size: 32rpx;\n font-weight: 500;\n color: var(--prism-text-primary, #1D2129);\n letter-spacing: 2rpx;\n }\n\n .id-placeholder {\n color: var(--prism-text-placeholder, #86909C);\n font-weight: 400;\n }\n\n .id-info {\n margin-top: 24rpx;\n padding: 20rpx;\n background: rgba(52, 120, 246, 0.08);\n border-radius: 12rpx;\n display: flex;\n flex-wrap: wrap;\n gap: 16rpx;\n\n .info-item {\n display: flex;\n align-items: center;\n\n .info-label {\n font-size: 24rpx;\n color: var(--prism-text-secondary, #86909C);\n }\n\n .info-value {\n font-size: 24rpx;\n color: var(--prism-text-primary, #1D2129);\n font-weight: 500;\n }\n }\n }\n}\n\n.dark-mode .prism-id-card-input {\n .id-card-input-wrapper {\n background: var(--prism-input-bg, #2A2A2A);\n\n &:focus-within {\n background: rgba(52, 120, 246, 0.12);\n box-shadow: 0 0 0 2rpx rgba(52, 120, 246, 0.4), 0 4rpx 16rpx rgba(52, 120, 246, 0.15);\n }\n }\n\n .id-card-input {\n color: var(--prism-text-primary, #E5E6EB);\n }\n\n .id-placeholder {\n color: var(--prism-text-placeholder, #6B7785);\n }\n\n .id-info {\n background: rgba(52, 120, 246, 0.15);\n\n .info-value {\n color: var(--prism-text-primary, #E5E6EB);\n }\n }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismIdCardInput/PrismIdCardInput.vue'\nwx.createComponent(Component)"],"names":["useAppStore","ref","computed","watch","Component"],"mappings":"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"}
|