@ruixinkeji/prism-ui 1.0.16 → 1.0.17
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/package.json +3 -2
- package/dist/build/h5/assets/PrismCode-D1lrgx1M.css +0 -1
- package/dist/build/h5/assets/PrismCode.CNOtat_X.js +0 -1
- package/dist/build/h5/assets/PrismGroupSticky-CBFeo0AB.css +0 -1
- package/dist/build/h5/assets/PrismGroupSticky.CmJXt6ws.js +0 -1
- package/dist/build/h5/assets/PrismMusicPlayer-CHVtYDn7.css +0 -1
- package/dist/build/h5/assets/PrismMusicPlayer.DAW3y5Km.js +0 -1
- package/dist/build/h5/assets/PrismNavBar-CYetauMR.css +0 -1
- package/dist/build/h5/assets/PrismNavBar.CFM58fal.js +0 -1
- package/dist/build/h5/assets/PrismSwiper-CDtZrfyq.css +0 -1
- package/dist/build/h5/assets/PrismSwiper.DTGFNn5Q.js +0 -1
- package/dist/build/h5/assets/PrismTabBar-BW0exu0j.css +0 -1
- package/dist/build/h5/assets/PrismTabBar.DPe-iC_F.js +0 -1
- package/dist/build/h5/assets/basic-tn0RQdqM.css +0 -0
- package/dist/build/h5/assets/card-layout-BZuodKCJ.css +0 -1
- package/dist/build/h5/assets/colors-RgTfwcKp.css +0 -1
- package/dist/build/h5/assets/data-DSHiB3Xs.css +0 -1
- package/dist/build/h5/assets/effects-CNFDtZjf.css +0 -1
- package/dist/build/h5/assets/examples-CSzKlb8B.css +0 -1
- 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 +0 -1
- package/dist/build/h5/assets/form-va-eFD7k.css +0 -1
- package/dist/build/h5/assets/group-CDa_hQkB.css +0 -1
- package/dist/build/h5/assets/iconfont-CW81RyG4.ttf +0 -0
- package/dist/build/h5/assets/icons-83wAdmdh.css +0 -1
- package/dist/build/h5/assets/index-BQ-qpvZH.css +0 -1
- package/dist/build/h5/assets/index-BQnv3xQ8.css +0 -1
- package/dist/build/h5/assets/index-C83xA4hX.css +0 -1
- package/dist/build/h5/assets/index-Cvc14mto.css +0 -1
- package/dist/build/h5/assets/index-D2djL_pA.js +0 -32
- package/dist/build/h5/assets/navigation-D0rlyjtK.css +0 -1
- package/dist/build/h5/assets/pages-demo-basic.BsC9sqol.js +0 -1
- package/dist/build/h5/assets/pages-demo-code-index.BXECig1w.js +0 -1
- package/dist/build/h5/assets/pages-demo-colors.Dl__3Mv9.js +0 -1
- package/dist/build/h5/assets/pages-demo-container.Cy-M9f41.js +0 -1
- package/dist/build/h5/assets/pages-demo-data.CK2JdeBK.js +0 -1
- package/dist/build/h5/assets/pages-demo-effects.CV0rqKht.js +0 -1
- package/dist/build/h5/assets/pages-demo-feedback.BO-G3E1J.js +0 -1
- package/dist/build/h5/assets/pages-demo-form.CsUNLqqe.js +0 -1
- package/dist/build/h5/assets/pages-demo-layout-card-layout.CQ6fF8IK.js +0 -1
- package/dist/build/h5/assets/pages-demo-layout.261GXW2o.js +0 -1
- package/dist/build/h5/assets/pages-demo-navigation.C5hFijVt.js +0 -1
- package/dist/build/h5/assets/pages-demo-other.CVdLVU3_.js +0 -1
- package/dist/build/h5/assets/pages-demo-sticky-group.MDzv6I5L.js +0 -1
- package/dist/build/h5/assets/pages-demo-sticky-index.D2UJUdon.js +0 -1
- package/dist/build/h5/assets/pages-examples-examples.hyUWuu8C.js +0 -1
- package/dist/build/h5/assets/pages-icons-icons.R2erKYQX.js +0 -1
- package/dist/build/h5/assets/pages-index-index.BlfkIjJo.js +0 -1
- package/dist/build/h5/assets/pages-tools-tools.tm3Y1cFN.js +0 -1
- package/dist/build/h5/assets/tools-C1YBcrWJ.css +0 -1
- package/dist/build/h5/assets/uni-app.es.DfNmMcUd.js +0 -1
- package/dist/build/h5/assets/uni.e2868147.css +0 -1
- package/dist/build/h5/assets/useNavbar.BdajVjjC.js +0 -1
- package/dist/build/h5/index.html +0 -23
- package/dist/build/h5/static/fonts/all-icons.txt +0 -453
- 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 +0 -943
- package/dist/build/h5/static/fonts/iconfont.css +0 -62
- package/dist/build/h5/static/fonts/iconfont.js +0 -1
- package/dist/build/h5/static/fonts/iconfont.json +0 -79
- 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 +0 -453
- 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 +0 -11
- package/dist/dev/.nvue/app.js +0 -2
- package/dist/dev/.sourcemap/mp-weixin/app.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismAddressInput/PrismAddressInput.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismCityCascadeSelect/PrismCityCascadeSelect.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismCityPicker/PrismCityPicker.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismCitySelect/PrismCitySelect.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismCode/PrismCode.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismCodeInput/PrismCodeInput.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismDateTimePicker/PrismDateTimePicker.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismDropdown/PrismDropdown.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismGroupSticky/PrismGroupSticky.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismIdCardInput/PrismIdCardInput.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismIndexBar/PrismIndexBar.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismLicensePlateInput/PrismLicensePlateInput.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismMusicPlayer/PrismMusicPlayer.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismNavBar/PrismNavBar.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismSecureInput/PrismSecureInput.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismSticky/PrismSticky.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismSwiper/PrismSwiper.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismSwitch/PrismSwitch.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismTabBar/PrismTabBar.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismTabs/PrismTabs.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/components/PrismVoiceInput/PrismVoiceInput.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/composables/useNavbar.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/config/theme-colors.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/basic.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/card.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/code/index.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/colors.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/container.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/data.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/effects.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/feedback.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/form.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/layout/card-layout.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/layout.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/navigation.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/other.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/sticky/group.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/demo/sticky/index.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/examples/examples.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/icons/icons.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/pages/tools/tools.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/store/app.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/utils/lunar.js.map +0 -1
- package/dist/dev/.sourcemap/mp-weixin/utils/system.js.map +0 -1
- package/dist/dev/app-plus/__uniappautomator.js +0 -16
- package/dist/dev/app-plus/__uniappchooselocation.js +0 -32
- package/dist/dev/app-plus/__uniapperror.png +0 -0
- package/dist/dev/app-plus/__uniappopenlocation.js +0 -32
- package/dist/dev/app-plus/__uniapppicker.js +0 -33
- package/dist/dev/app-plus/__uniappquill.js +0 -8
- package/dist/dev/app-plus/__uniappquillimageresize.js +0 -1
- package/dist/dev/app-plus/__uniappscan.js +0 -32
- package/dist/dev/app-plus/__uniappsuccess.png +0 -0
- package/dist/dev/app-plus/__uniappview.html +0 -24
- package/dist/dev/app-plus/app-config-service.js +0 -11
- package/dist/dev/app-plus/app-config.js +0 -1
- package/dist/dev/app-plus/app-service.js +0 -23663
- package/dist/dev/app-plus/app.css +0 -8955
- package/dist/dev/app-plus/manifest.json +0 -91
- package/dist/dev/app-plus/pages/demo/basic.css +0 -524
- package/dist/dev/app-plus/pages/demo/code/index.css +0 -541
- package/dist/dev/app-plus/pages/demo/colors.css +0 -4008
- package/dist/dev/app-plus/pages/demo/container.css +0 -524
- package/dist/dev/app-plus/pages/demo/data.css +0 -705
- package/dist/dev/app-plus/pages/demo/effects.css +0 -530
- package/dist/dev/app-plus/pages/demo/feedback.css +0 -590
- package/dist/dev/app-plus/pages/demo/form.css +0 -3422
- package/dist/dev/app-plus/pages/demo/layout/card-layout.css +0 -785
- package/dist/dev/app-plus/pages/demo/layout.css +0 -524
- package/dist/dev/app-plus/pages/demo/navigation.css +0 -769
- package/dist/dev/app-plus/pages/demo/other.css +0 -524
- package/dist/dev/app-plus/pages/demo/sticky/group.css +0 -788
- package/dist/dev/app-plus/pages/demo/sticky/index.css +0 -894
- package/dist/dev/app-plus/pages/examples/examples.css +0 -1031
- package/dist/dev/app-plus/pages/icons/icons.css +0 -3310
- package/dist/dev/app-plus/pages/index/index.css +0 -696
- package/dist/dev/app-plus/pages/tools/tools.css +0 -378
- package/dist/dev/app-plus/static/fonts/all-icons.txt +0 -453
- 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 +0 -943
- package/dist/dev/app-plus/static/fonts/iconfont.css +0 -62
- package/dist/dev/app-plus/static/fonts/iconfont.js +0 -1
- package/dist/dev/app-plus/static/fonts/iconfont.json +0 -79
- 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 +0 -453
- 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 +0 -7
- package/dist/dev/mp-weixin/app.js +0 -49
- package/dist/dev/mp-weixin/app.json +0 -29
- package/dist/dev/mp-weixin/app.wxss +0 -9072
- package/dist/dev/mp-weixin/common/vendor.js +0 -15968
- package/dist/dev/mp-weixin/components/PrismAddressInput/PrismAddressInput.js +0 -200
- package/dist/dev/mp-weixin/components/PrismAddressInput/PrismAddressInput.json +0 -4
- package/dist/dev/mp-weixin/components/PrismAddressInput/PrismAddressInput.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismAddressInput/PrismAddressInput.wxss +0 -327
- package/dist/dev/mp-weixin/components/PrismCityCascadeSelect/PrismCityCascadeSelect.js +0 -449
- package/dist/dev/mp-weixin/components/PrismCityCascadeSelect/PrismCityCascadeSelect.json +0 -4
- package/dist/dev/mp-weixin/components/PrismCityCascadeSelect/PrismCityCascadeSelect.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismCityCascadeSelect/PrismCityCascadeSelect.wxss +0 -264
- package/dist/dev/mp-weixin/components/PrismCityPicker/PrismCityPicker.js +0 -531
- package/dist/dev/mp-weixin/components/PrismCityPicker/PrismCityPicker.json +0 -4
- package/dist/dev/mp-weixin/components/PrismCityPicker/PrismCityPicker.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismCityPicker/PrismCityPicker.wxss +0 -309
- package/dist/dev/mp-weixin/components/PrismCitySelect/PrismCitySelect.js +0 -200
- package/dist/dev/mp-weixin/components/PrismCitySelect/PrismCitySelect.json +0 -6
- package/dist/dev/mp-weixin/components/PrismCitySelect/PrismCitySelect.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismCitySelect/PrismCitySelect.wxss +0 -225
- package/dist/dev/mp-weixin/components/PrismCode/PrismCode.js +0 -337
- package/dist/dev/mp-weixin/components/PrismCode/PrismCode.json +0 -4
- package/dist/dev/mp-weixin/components/PrismCode/PrismCode.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismCode/PrismCode.wxss +0 -345
- package/dist/dev/mp-weixin/components/PrismCodeInput/PrismCodeInput.js +0 -70
- package/dist/dev/mp-weixin/components/PrismCodeInput/PrismCodeInput.json +0 -4
- package/dist/dev/mp-weixin/components/PrismCodeInput/PrismCodeInput.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismCodeInput/PrismCodeInput.wxss +0 -115
- package/dist/dev/mp-weixin/components/PrismDateTimePicker/PrismDateTimePicker.js +0 -468
- package/dist/dev/mp-weixin/components/PrismDateTimePicker/PrismDateTimePicker.json +0 -4
- package/dist/dev/mp-weixin/components/PrismDateTimePicker/PrismDateTimePicker.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismDateTimePicker/PrismDateTimePicker.wxss +0 -309
- package/dist/dev/mp-weixin/components/PrismDropdown/PrismDropdown.js +0 -63
- package/dist/dev/mp-weixin/components/PrismDropdown/PrismDropdown.json +0 -4
- package/dist/dev/mp-weixin/components/PrismDropdown/PrismDropdown.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismDropdown/PrismDropdown.wxss +0 -0
- package/dist/dev/mp-weixin/components/PrismGroupSticky/PrismGroupSticky.js +0 -128
- package/dist/dev/mp-weixin/components/PrismGroupSticky/PrismGroupSticky.json +0 -4
- package/dist/dev/mp-weixin/components/PrismGroupSticky/PrismGroupSticky.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismGroupSticky/PrismGroupSticky.wxss +0 -191
- package/dist/dev/mp-weixin/components/PrismIdCardInput/PrismIdCardInput.js +0 -123
- package/dist/dev/mp-weixin/components/PrismIdCardInput/PrismIdCardInput.json +0 -4
- package/dist/dev/mp-weixin/components/PrismIdCardInput/PrismIdCardInput.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismIdCardInput/PrismIdCardInput.wxss +0 -114
- package/dist/dev/mp-weixin/components/PrismIndexBar/PrismIndexBar.js +0 -108
- package/dist/dev/mp-weixin/components/PrismIndexBar/PrismIndexBar.json +0 -4
- package/dist/dev/mp-weixin/components/PrismIndexBar/PrismIndexBar.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismIndexBar/PrismIndexBar.wxss +0 -135
- package/dist/dev/mp-weixin/components/PrismLicensePlateInput/PrismLicensePlateInput.js +0 -449
- package/dist/dev/mp-weixin/components/PrismLicensePlateInput/PrismLicensePlateInput.json +0 -4
- package/dist/dev/mp-weixin/components/PrismLicensePlateInput/PrismLicensePlateInput.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismLicensePlateInput/PrismLicensePlateInput.wxss +0 -445
- package/dist/dev/mp-weixin/components/PrismMusicPlayer/PrismMusicPlayer.js +0 -200
- package/dist/dev/mp-weixin/components/PrismMusicPlayer/PrismMusicPlayer.json +0 -4
- package/dist/dev/mp-weixin/components/PrismMusicPlayer/PrismMusicPlayer.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismMusicPlayer/PrismMusicPlayer.wxss +0 -334
- package/dist/dev/mp-weixin/components/PrismNavBar/PrismNavBar.js +0 -71
- package/dist/dev/mp-weixin/components/PrismNavBar/PrismNavBar.json +0 -4
- package/dist/dev/mp-weixin/components/PrismNavBar/PrismNavBar.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismNavBar/PrismNavBar.wxss +0 -150
- package/dist/dev/mp-weixin/components/PrismSecureInput/PrismSecureInput.js +0 -140
- package/dist/dev/mp-weixin/components/PrismSecureInput/PrismSecureInput.json +0 -4
- package/dist/dev/mp-weixin/components/PrismSecureInput/PrismSecureInput.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismSecureInput/PrismSecureInput.wxss +0 -215
- package/dist/dev/mp-weixin/components/PrismSticky/PrismSticky.js +0 -120
- package/dist/dev/mp-weixin/components/PrismSticky/PrismSticky.json +0 -4
- package/dist/dev/mp-weixin/components/PrismSticky/PrismSticky.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismSticky/PrismSticky.wxss +0 -62
- package/dist/dev/mp-weixin/components/PrismSwiper/PrismSwiper.js +0 -163
- package/dist/dev/mp-weixin/components/PrismSwiper/PrismSwiper.json +0 -4
- package/dist/dev/mp-weixin/components/PrismSwiper/PrismSwiper.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismSwiper/PrismSwiper.wxss +0 -203
- package/dist/dev/mp-weixin/components/PrismSwitch/PrismSwitch.js +0 -69
- package/dist/dev/mp-weixin/components/PrismSwitch/PrismSwitch.json +0 -4
- package/dist/dev/mp-weixin/components/PrismSwitch/PrismSwitch.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismSwitch/PrismSwitch.wxss +0 -151
- package/dist/dev/mp-weixin/components/PrismTabBar/PrismTabBar.js +0 -58
- package/dist/dev/mp-weixin/components/PrismTabBar/PrismTabBar.json +0 -4
- package/dist/dev/mp-weixin/components/PrismTabBar/PrismTabBar.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismTabBar/PrismTabBar.wxss +0 -119
- package/dist/dev/mp-weixin/components/PrismTabs/PrismTabs.js +0 -51
- package/dist/dev/mp-weixin/components/PrismTabs/PrismTabs.json +0 -4
- package/dist/dev/mp-weixin/components/PrismTabs/PrismTabs.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismTabs/PrismTabs.wxss +0 -51
- package/dist/dev/mp-weixin/components/PrismVoiceInput/PrismVoiceInput.js +0 -182
- package/dist/dev/mp-weixin/components/PrismVoiceInput/PrismVoiceInput.json +0 -4
- package/dist/dev/mp-weixin/components/PrismVoiceInput/PrismVoiceInput.wxml +0 -1
- package/dist/dev/mp-weixin/components/PrismVoiceInput/PrismVoiceInput.wxss +0 -329
- package/dist/dev/mp-weixin/composables/useNavbar.js +0 -19
- package/dist/dev/mp-weixin/config/theme-colors.js +0 -73
- package/dist/dev/mp-weixin/pages/demo/basic.js +0 -77
- package/dist/dev/mp-weixin/pages/demo/basic.json +0 -7
- package/dist/dev/mp-weixin/pages/demo/basic.wxml +0 -1
- package/dist/dev/mp-weixin/pages/demo/basic.wxss +0 -54
- package/dist/dev/mp-weixin/pages/demo/code/index.js +0 -190
- package/dist/dev/mp-weixin/pages/demo/code/index.json +0 -7
- package/dist/dev/mp-weixin/pages/demo/code/index.wxml +0 -1
- package/dist/dev/mp-weixin/pages/demo/code/index.wxss +0 -71
- package/dist/dev/mp-weixin/pages/demo/colors.js +0 -130
- package/dist/dev/mp-weixin/pages/demo/colors.json +0 -7
- package/dist/dev/mp-weixin/pages/demo/colors.wxml +0 -1
- package/dist/dev/mp-weixin/pages/demo/colors.wxss +0 -3793
- package/dist/dev/mp-weixin/pages/demo/container.js +0 -65
- package/dist/dev/mp-weixin/pages/demo/container.json +0 -7
- package/dist/dev/mp-weixin/pages/demo/container.wxml +0 -1
- package/dist/dev/mp-weixin/pages/demo/container.wxss +0 -54
- package/dist/dev/mp-weixin/pages/demo/data.js +0 -398
- package/dist/dev/mp-weixin/pages/demo/data.json +0 -7
- package/dist/dev/mp-weixin/pages/demo/data.wxml +0 -1
- package/dist/dev/mp-weixin/pages/demo/data.wxss +0 -235
- package/dist/dev/mp-weixin/pages/demo/effects.js +0 -62
- package/dist/dev/mp-weixin/pages/demo/effects.json +0 -7
- package/dist/dev/mp-weixin/pages/demo/effects.wxml +0 -1
- package/dist/dev/mp-weixin/pages/demo/effects.wxss +0 -60
- package/dist/dev/mp-weixin/pages/demo/feedback.js +0 -256
- package/dist/dev/mp-weixin/pages/demo/feedback.json +0 -7
- package/dist/dev/mp-weixin/pages/demo/feedback.wxml +0 -1
- package/dist/dev/mp-weixin/pages/demo/feedback.wxss +0 -120
- package/dist/dev/mp-weixin/pages/demo/form.js +0 -689
- package/dist/dev/mp-weixin/pages/demo/form.json +0 -18
- package/dist/dev/mp-weixin/pages/demo/form.wxml +0 -1
- package/dist/dev/mp-weixin/pages/demo/form.wxss +0 -54
- package/dist/dev/mp-weixin/pages/demo/layout/card-layout.js +0 -61
- package/dist/dev/mp-weixin/pages/demo/layout/card-layout.json +0 -7
- package/dist/dev/mp-weixin/pages/demo/layout/card-layout.wxml +0 -1
- package/dist/dev/mp-weixin/pages/demo/layout/card-layout.wxss +0 -326
- package/dist/dev/mp-weixin/pages/demo/layout.js +0 -96
- package/dist/dev/mp-weixin/pages/demo/layout.json +0 -7
- package/dist/dev/mp-weixin/pages/demo/layout.wxml +0 -1
- package/dist/dev/mp-weixin/pages/demo/layout.wxss +0 -54
- package/dist/dev/mp-weixin/pages/demo/navigation.js +0 -142
- package/dist/dev/mp-weixin/pages/demo/navigation.json +0 -10
- package/dist/dev/mp-weixin/pages/demo/navigation.wxml +0 -1
- package/dist/dev/mp-weixin/pages/demo/navigation.wxss +0 -61
- package/dist/dev/mp-weixin/pages/demo/other.js +0 -50
- package/dist/dev/mp-weixin/pages/demo/other.json +0 -7
- package/dist/dev/mp-weixin/pages/demo/other.wxml +0 -1
- package/dist/dev/mp-weixin/pages/demo/other.wxss +0 -54
- package/dist/dev/mp-weixin/pages/demo/sticky/group.js +0 -212
- package/dist/dev/mp-weixin/pages/demo/sticky/group.json +0 -8
- package/dist/dev/mp-weixin/pages/demo/sticky/group.wxml +0 -1
- package/dist/dev/mp-weixin/pages/demo/sticky/group.wxss +0 -135
- package/dist/dev/mp-weixin/pages/demo/sticky/index.js +0 -90
- package/dist/dev/mp-weixin/pages/demo/sticky/index.json +0 -9
- package/dist/dev/mp-weixin/pages/demo/sticky/index.wxml +0 -1
- package/dist/dev/mp-weixin/pages/demo/sticky/index.wxss +0 -175
- package/dist/dev/mp-weixin/pages/examples/examples.js +0 -65
- package/dist/dev/mp-weixin/pages/examples/examples.json +0 -8
- package/dist/dev/mp-weixin/pages/examples/examples.wxml +0 -1
- package/dist/dev/mp-weixin/pages/examples/examples.wxss +0 -461
- package/dist/dev/mp-weixin/pages/icons/icons.js +0 -350
- package/dist/dev/mp-weixin/pages/icons/icons.json +0 -8
- package/dist/dev/mp-weixin/pages/icons/icons.wxml +0 -1
- package/dist/dev/mp-weixin/pages/icons/icons.wxss +0 -3079
- package/dist/dev/mp-weixin/pages/index/index.js +0 -118
- package/dist/dev/mp-weixin/pages/index/index.json +0 -8
- package/dist/dev/mp-weixin/pages/index/index.wxml +0 -1
- package/dist/dev/mp-weixin/pages/index/index.wxss +0 -123
- package/dist/dev/mp-weixin/pages/tools/tools.js +0 -37
- package/dist/dev/mp-weixin/pages/tools/tools.json +0 -7
- package/dist/dev/mp-weixin/pages/tools/tools.wxml +0 -1
- package/dist/dev/mp-weixin/pages/tools/tools.wxss +0 -134
- package/dist/dev/mp-weixin/project.config.json +0 -36
- package/dist/dev/mp-weixin/project.private.config.json +0 -23
- package/dist/dev/mp-weixin/static/fonts/all-icons.txt +0 -453
- 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 +0 -943
- package/dist/dev/mp-weixin/static/fonts/iconfont.css +0 -62
- package/dist/dev/mp-weixin/static/fonts/iconfont.js +0 -1
- package/dist/dev/mp-weixin/static/fonts/iconfont.json +0 -79
- 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 +0 -453
- 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 +0 -64
- package/dist/dev/mp-weixin/utils/lunar.js +0 -330
- package/dist/dev/mp-weixin/utils/system.js +0 -18
- package/dist/styles/base.scss +0 -213
- package/dist/styles/button.scss +0 -120
- package/dist/styles/card.scss +0 -306
- package/dist/styles/data.scss +0 -1229
- package/dist/styles/effects.scss +0 -407
- package/dist/styles/feedback.scss +0 -698
- package/dist/styles/form.scss +0 -1574
- package/dist/styles/index.scss +0 -43
- package/dist/styles/list.scss +0 -184
- package/dist/styles/navigation.scss +0 -501
- package/dist/styles/overlay.scss +0 -182
- package/dist/styles/utilities.scss +0 -134
- package/dist/styles/variables.scss +0 -154
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PrismIndexBar.js","sources":["components/PrismIndexBar/PrismIndexBar.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21JbmRleEJhci9QcmlzbUluZGV4QmFyLnZ1ZQ"],"sourcesContent":["<template>\n <view>\n <!-- 右侧索引条 -->\n <view\n class=\"prism-index-bar\"\n :class=\"{ 'dark-mode': isDarkMode }\"\n @touchstart=\"onIndexTouchStart\"\n @touchmove.stop.prevent=\"onIndexTouchMove\"\n @touchend=\"onIndexTouchEnd\"\n >\n <view\n v-for=\"item in items\"\n :key=\"item.value\"\n class=\"prism-index-item\"\n :class=\"{ 'active': currentIndex === item.value }\"\n :style=\"{ background: item.background }\"\n >\n </view>\n </view>\n\n <!-- 气泡提示 -->\n <view\n v-if=\"showIndicator && currentIndex\"\n class=\"prism-index-indicator\"\n :class=\"{ 'dark-mode': isDarkMode }\"\n :style=\"{\n top: indicatorTop + 'px',\n background: currentItemBackground\n }\"\n >\n {{ currentItemLabel }}\n <!-- 箭头 -->\n <view\n class=\"prism-index-indicator-arrow\"\n :style=\"{ borderLeftColor: currentItemBackground }\"\n ></view>\n </view>\n </view>\n</template>\n\n<script setup>\nimport { ref, computed, getCurrentInstance } from 'vue';\n\nconst props = defineProps({\n // 索引项列表 [{ value: 'key', label: '显示文字', background: '#fff' 或 'linear-gradient(...)' }]\n items: {\n type: Array,\n default: () => []\n },\n // 是否深色模式\n isDarkMode: {\n type: Boolean,\n default: false\n },\n // 当前选中的索引值(支持 v-model)\n modelValue: {\n type: String,\n default: ''\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'change']);\n\nconst instance = getCurrentInstance();\n\n// 当前选中的索引\nconst currentIndex = ref(props.modelValue);\n// 是否显示气泡\nconst showIndicator = ref(false);\n// 气泡位置\nconst indicatorTop = ref(0);\n// 索引条位置信息\nlet indexBarRect = null;\n\n// 当前选中项的标签\nconst currentItemLabel = computed(() => {\n const item = props.items.find(i => i.value === currentIndex.value);\n return item ? item.label : '';\n});\n\n// 当前选中项的背景\nconst currentItemBackground = computed(() => {\n const item = props.items.find(i => i.value === currentIndex.value);\n return item ? item.background : 'rgba(0, 0, 0, 0.85)';\n});\n\n// 根据触摸位置计算当前索引\nconst getItemByTouch = (touchY) => {\n if (!indexBarRect || !props.items.length) return null;\n const itemHeight = indexBarRect.height / props.items.length;\n const relativeY = touchY - indexBarRect.top;\n const index = Math.floor(relativeY / itemHeight);\n if (index < 0) return props.items[0];\n if (index >= props.items.length) return props.items[props.items.length - 1];\n return props.items[index];\n};\n\n// 更新选中索引\nconst updateIndex = (touchY) => {\n // 更新气泡位置\n indicatorTop.value = touchY;\n\n const item = getItemByTouch(touchY);\n if (item && item.value !== currentIndex.value) {\n currentIndex.value = item.value;\n emit('update:modelValue', item.value);\n emit('change', item.value);\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 item = getItemByTouch(touchY);\n if (item) {\n currentIndex.value = item.value;\n emit('update:modelValue', item.value);\n emit('change', item.value);\n }\n }\n })\n .exec();\n};\n\n// 触摸移动\nconst onIndexTouchMove = (e) => {\n const touchY = e.touches[0].clientY;\n if (indexBarRect) {\n updateIndex(touchY);\n }\n};\n\n// 触摸结束\nconst onIndexTouchEnd = () => {\n showIndicator.value = false;\n};\n</script>\n\n<style lang=\"scss\" scoped>\n/* 右侧索引条 */\n.prism-index-bar {\n position: fixed;\n right: 8rpx;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12rpx;\n z-index: 999;\n padding: 16rpx 12rpx;\n background: rgba(255, 255, 255, 0.1);\n border-radius: 24rpx;\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n}\n\n.prism-index-item {\n width: 40rpx;\n height: 40rpx;\n border-radius: 50%;\n border: 3rpx solid rgba(255, 255, 255, 0.8);\n box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.15);\n transition: all 0.3s ease;\n position: relative;\n flex-shrink: 0;\n\n &:active {\n transform: scale(1.15);\n }\n\n &.active {\n width: 48rpx;\n height: 48rpx;\n border-width: 4rpx;\n border-color: #FFFFFF;\n box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.3);\n }\n}\n\n/* 气泡提示 */\n.prism-index-indicator {\n position: fixed;\n right: 80rpx;\n padding: 12rpx 20rpx;\n color: #FFFFFF;\n border-radius: 8rpx;\n font-size: 24rpx;\n white-space: nowrap;\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.3);\n animation: fadeIn 0.2s ease;\n z-index: 1000;\n transform: translateY(-50%);\n pointer-events: none;\n}\n\n/* 气泡箭头 */\n.prism-index-indicator-arrow {\n position: absolute;\n right: -8rpx;\n top: 50%;\n transform: translateY(-50%);\n width: 0;\n height: 0;\n border-left: 8rpx solid;\n border-top: 8rpx solid transparent;\n border-bottom: 8rpx solid transparent;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* 深色模式适配 */\n.dark-mode.prism-index-bar {\n .prism-index-item {\n border-color: rgba(0, 0, 0, 0.5);\n box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.4);\n\n &.active {\n border-color: rgba(255, 255, 255, 0.9);\n box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.6);\n }\n }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismIndexBar/PrismIndexBar.vue'\nwx.createComponent(Component)"],"names":["getCurrentInstance","ref","computed","uni"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA2CA,UAAM,QAAQ;AAkBd,UAAM,OAAO;AAEb,UAAM,WAAWA,cAAAA,mBAAkB;AAGnC,UAAM,eAAeC,cAAAA,IAAI,MAAM,UAAU;AAEzC,UAAM,gBAAgBA,cAAAA,IAAI,KAAK;AAE/B,UAAM,eAAeA,cAAAA,IAAI,CAAC;AAE1B,QAAI,eAAe;AAGnB,UAAM,mBAAmBC,cAAAA,SAAS,MAAM;AACtC,YAAM,OAAO,MAAM,MAAM,KAAK,OAAK,EAAE,UAAU,aAAa,KAAK;AACjE,aAAO,OAAO,KAAK,QAAQ;AAAA,IAC7B,CAAC;AAGD,UAAM,wBAAwBA,cAAAA,SAAS,MAAM;AAC3C,YAAM,OAAO,MAAM,MAAM,KAAK,OAAK,EAAE,UAAU,aAAa,KAAK;AACjE,aAAO,OAAO,KAAK,aAAa;AAAA,IAClC,CAAC;AAGD,UAAM,iBAAiB,CAAC,WAAW;AACjC,UAAI,CAAC,gBAAgB,CAAC,MAAM,MAAM,OAAQ,QAAO;AACjD,YAAM,aAAa,aAAa,SAAS,MAAM,MAAM;AACrD,YAAM,YAAY,SAAS,aAAa;AACxC,YAAM,QAAQ,KAAK,MAAM,YAAY,UAAU;AAC/C,UAAI,QAAQ,EAAG,QAAO,MAAM,MAAM,CAAC;AACnC,UAAI,SAAS,MAAM,MAAM,OAAQ,QAAO,MAAM,MAAM,MAAM,MAAM,SAAS,CAAC;AAC1E,aAAO,MAAM,MAAM,KAAK;AAAA,IAC1B;AAGA,UAAM,cAAc,CAAC,WAAW;AAE9B,mBAAa,QAAQ;AAErB,YAAM,OAAO,eAAe,MAAM;AAClC,UAAI,QAAQ,KAAK,UAAU,aAAa,OAAO;AAC7C,qBAAa,QAAQ,KAAK;AAC1B,aAAK,qBAAqB,KAAK,KAAK;AACpC,aAAK,UAAU,KAAK,KAAK;AAAA,MAC3B;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,OAAO,eAAe,MAAM;AAClC,cAAI,MAAM;AACR,yBAAa,QAAQ,KAAK;AAC1B,iBAAK,qBAAqB,KAAK,KAAK;AACpC,iBAAK,UAAU,KAAK,KAAK;AAAA,UAC3B;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,oBAAY,MAAM;AAAA,MACpB;AAAA,IACF;AAGA,UAAM,kBAAkB,MAAM;AAC5B,oBAAc,QAAQ;AAAA,IACxB;;;;;;;;;;;;;;;;;;;;;;;;;;AChJA,GAAG,gBAAgB,SAAS;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PrismLicensePlateInput.js","sources":["components/PrismLicensePlateInput/PrismLicensePlateInput.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21MaWNlbnNlUGxhdGVJbnB1dC9QcmlzbUxpY2Vuc2VQbGF0ZUlucHV0LnZ1ZQ"],"sourcesContent":["<template>\n <view class=\"prism-license-plate-input\" :class=\"{ 'dark-mode': appStore.isDarkMode }\">\n <!-- 车牌号输入框 -->\n <view class=\"plate-boxes\">\n <!-- 第1位 -->\n <view\n class=\"plate-box province\"\n :class=\"{\n 'active': activeIndex === 0,\n 'filled': plateArray[0],\n 'special-white': getSpecialCharType(plateArray[0]) === 'white',\n 'special-black': getSpecialCharType(plateArray[0]) === 'black',\n 'special-yellow': getSpecialCharType(plateArray[0]) === 'yellow'\n }\"\n @click=\"showKeyboardAt(0)\"\n >\n <text class=\"plate-text\">{{ plateArray[0] || '' }}</text>\n </view>\n\n <!-- 第2位 -->\n <view\n class=\"plate-box letter\"\n :class=\"{\n 'active': activeIndex === 1,\n 'filled': plateArray[1],\n 'special-white': getSpecialCharType(plateArray[1]) === 'white',\n 'special-black': getSpecialCharType(plateArray[1]) === 'black',\n 'special-yellow': getSpecialCharType(plateArray[1]) === 'yellow'\n }\"\n @click=\"showKeyboardAt(1)\"\n >\n <text class=\"plate-text\">{{ plateArray[1] || '' }}</text>\n </view>\n\n <!-- 分隔点 -->\n <view class=\"plate-dot\"></view>\n\n <!-- 后5位 -->\n <view\n v-for=\"i in 5\"\n :key=\"i\"\n class=\"plate-box\"\n :class=\"{\n 'active': activeIndex === i + 1,\n 'filled': plateArray[i + 1],\n 'special-white': getSpecialCharType(plateArray[i + 1]) === 'white',\n 'special-black': getSpecialCharType(plateArray[i + 1]) === 'black',\n 'special-yellow': getSpecialCharType(plateArray[i + 1]) === 'yellow'\n }\"\n @click=\"showKeyboardAt(i + 1)\"\n >\n <text class=\"plate-text\">{{ plateArray[i + 1] || '' }}</text>\n </view>\n\n <!-- 新能源第8位(始终显示,可选) -->\n <view class=\"plate-box-wrapper new-energy-wrapper\">\n <text class=\"new-energy-label\" :class=\"{ 'hidden': getSpecialCharType(plateArray[7]) }\">新能源</text>\n <view\n class=\"plate-box\"\n :class=\"{\n 'new-energy': isNewEnergy && !getSpecialCharType(plateArray[7]),\n 'new-energy-optional': !isNewEnergy,\n 'active': activeIndex === 7,\n 'filled': plateArray[7],\n 'special-white': getSpecialCharType(plateArray[7]) === 'white',\n 'special-black': getSpecialCharType(plateArray[7]) === 'black',\n 'special-yellow': getSpecialCharType(plateArray[7]) === 'yellow'\n }\"\n @click=\"handleNewEnergyClick\"\n >\n <text class=\"plate-text\" v-if=\"isNewEnergy\">{{ plateArray[7] || '' }}</text>\n <text class=\"optional-icon fa fa-plus\" v-else></text>\n </view>\n </view>\n </view>\n\n <!-- 新能源切换(隐藏,通过点击第8位框自动启用) -->\n <!-- <view class=\"energy-switch\" @click=\"isNewEnergy = !isNewEnergy\">\n <view class=\"prism-checkbox\" :class=\"{ checked: isNewEnergy }\">\n <text v-if=\"isNewEnergy\" class=\"check-icon fa fa-check\"></text>\n </view>\n <text class=\"energy-text\">新能源车牌</text>\n </view> -->\n\n <!-- 统一键盘(底部弹出,无遮罩) -->\n <view class=\"keyboard-modal\" v-if=\"showKeyboard\">\n <view class=\"keyboard-content\">\n <view class=\"keyboard-header\">\n <!-- 左侧:标题 + 切换按钮 -->\n <view class=\"header-left\">\n <text class=\"keyboard-title\">{{ keyboardTitle }}</text>\n <view\n v-if=\"activeIndex === 0\"\n class=\"switch-btn\"\n @click=\"toggleFirstKeyboard\"\n >\n <text>{{ firstKeyboardMode === 'province' ? '切换字母' : '切换省份' }}</text>\n </view>\n </view>\n <!-- 右侧:关闭按钮 -->\n <text class=\"keyboard-close fa fa-times\" @click=\"closeKeyboard\"></text>\n </view>\n\n <scroll-view class=\"keyboard-body\" scroll-y>\n <!-- 省份区域 -->\n <view class=\"keyboard-section\" v-if=\"showProvinceSection && !showLetterInFirst\">\n <!-- 字母索引栏(支持滑动选择) -->\n <view\n class=\"keyboard-row letter-index-row\"\n @touchstart=\"onLetterIndexTouchStart\"\n @touchmove=\"onLetterIndexTouchMove\"\n @touchend=\"onLetterIndexTouchEnd\"\n >\n <view\n v-for=\"(group, idx) in letterGroups\"\n :key=\"idx\"\n class=\"key-item letter-index\"\n :class=\"{ 'active': isGroupSelected(group) }\"\n :data-index=\"idx\"\n @click=\"selectLetterGroup(group)\"\n >\n {{ group.join('/') }}\n </view>\n </view>\n <!-- 省份键盘(4行) -->\n <view class=\"keyboard-qwerty province-qwerty\">\n <view class=\"keyboard-row\">\n <view\n v-for=\"p in provinces.slice(0, 8)\"\n :key=\"p\"\n class=\"key-item\"\n :class=\"{ 'highlight': isProvinceHighlight(p) }\"\n @click=\"inputChar(p)\"\n >\n {{ p }}\n </view>\n </view>\n <view class=\"keyboard-row\">\n <view\n v-for=\"p in provinces.slice(8, 16)\"\n :key=\"p\"\n class=\"key-item\"\n :class=\"{ 'highlight': isProvinceHighlight(p) }\"\n @click=\"inputChar(p)\"\n >\n {{ p }}\n </view>\n </view>\n <view class=\"keyboard-row\">\n <view\n v-for=\"p in provinces.slice(16, 24)\"\n :key=\"p\"\n class=\"key-item\"\n :class=\"{ 'highlight': isProvinceHighlight(p) }\"\n @click=\"inputChar(p)\"\n >\n {{ p }}\n </view>\n </view>\n <view class=\"keyboard-row\">\n <view\n v-for=\"p in provinces.slice(24, 31)\"\n :key=\"p\"\n class=\"key-item\"\n :class=\"{ 'highlight': isProvinceHighlight(p) }\"\n @click=\"inputChar(p)\"\n >\n {{ p }}\n </view>\n <!-- 删除按钮 -->\n <view class=\"key-item delete\" @click=\"deleteChar\">\n <text class=\"delete-text\">删除</text>\n </view>\n </view>\n </view>\n </view>\n\n <!-- 数字区域(放在字母上面) -->\n <view class=\"keyboard-section\" v-if=\"showNumberSection\">\n <view class=\"keyboard-row number-row\">\n <view\n v-for=\"n in numberRow\"\n :key=\"n\"\n class=\"key-item\"\n @click=\"inputChar(n)\"\n >\n {{ n }}\n </view>\n </view>\n </view>\n\n <!-- 字母区域 -->\n <view class=\"keyboard-section\" v-if=\"showLetterSection || showLetterInFirst\">\n <view class=\"keyboard-qwerty\">\n <view class=\"keyboard-row\" v-for=\"(row, idx) in letterRows\" :key=\"idx\">\n <view\n v-for=\"l in row\"\n :key=\"l\"\n class=\"key-item\"\n :class=\"{ disabled: shouldDisableIO && (l === 'I' || l === 'O') }\"\n @click=\"inputChar(l)\"\n >\n {{ l }}\n </view>\n <!-- 删除按钮放在最后一行 -->\n <view v-if=\"idx === 2\" class=\"key-item delete\" @click=\"deleteChar\">\n <text class=\"delete-text\">删除</text>\n </view>\n </view>\n </view>\n </view>\n\n <!-- 特殊字符区域 -->\n <view class=\"keyboard-section\" v-if=\"showSpecialSection\">\n <view class=\"keyboard-row special-row\">\n <view\n v-for=\"item in specialChars\"\n :key=\"item.char\"\n class=\"key-item special\"\n :class=\"item.type\"\n @click=\"inputChar(item.char)\"\n >\n {{ item.char }}\n </view>\n <!-- 最后一位显示完成按钮 -->\n <view v-if=\"showDoneButton\" class=\"key-item done\" @click=\"closeKeyboard\">\n <text class=\"done-text\">完成</text>\n </view>\n </view>\n </view>\n </scroll-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});\n\nconst emit = defineEmits(['update:modelValue', 'complete']);\n\nconst appStore = useAppStore();\n\nconst isNewEnergy = ref(false);\nconst showKeyboard = ref(false);\nconst activeIndex = ref(-1);\nconst firstKeyboardMode = ref('province'); // 'province' or 'letter'\n\n// 省份简称(31个)\nconst provinces = [\n '京', '津', '沪', '渝', '冀', '豫', '云', '辽', '黑', '湘',\n '皖', '鲁', '新', '苏', '浙', '赣', '鄂', '桂', '甘', '晋',\n '蒙', '陕', '吉', '闽', '贵', '粤', '川', '青', '藏', '琼', '宁'\n];\n\n// 省份拼音首字母映射(用于字母检索高亮)\nconst provincePinyinMap = {\n '京': 'J', '津': 'J', '沪': 'H', '渝': 'Y', '冀': 'J',\n '豫': 'Y', '云': 'Y', '辽': 'L', '黑': 'H', '湘': 'X',\n '皖': 'W', '鲁': 'L', '新': 'X', '苏': 'S', '浙': 'Z',\n '赣': 'G', '鄂': 'E', '桂': 'G', '甘': 'G', '晋': 'J',\n '蒙': 'M', '陕': 'S', '吉': 'J', '闽': 'M', '贵': 'G',\n '粤': 'Y', '川': 'C', '青': 'Q', '藏': 'Z', '琼': 'Q', '宁': 'N'\n};\n\n// 省份字母索引(两个字母一组,方便筛选)\nconst letterGroups = [\n ['C', 'E'], // 川、鄂\n ['G', 'H'], // 赣桂甘贵、沪黑\n ['J', 'L'], // 京津冀晋吉、辽鲁\n ['M', 'N'], // 蒙闽、宁\n ['Q', 'S'], // 青琼、苏陕\n ['W', 'X'], // 皖、新湘\n ['Y', 'Z'], // 渝豫云粤、浙藏\n];\n\n// 当前选中的字母组\nconst selectedLetters = ref([]);\n\n// 选择字母组(单选)\nfunction selectLetterGroup(group) {\n // 如果是触摸事件刚选中的同一个组,跳过click处理\n if (touchSelectedGroup && touchSelectedGroup.every(l => group.includes(l))) {\n return;\n }\n\n // 检查是否已选中这个组\n const isSelected = group.every(l => selectedLetters.value.includes(l));\n if (isSelected) {\n // 取消选中\n selectedLetters.value = [];\n } else {\n // 选中(替换)\n selectedLetters.value = [...group];\n }\n}\n\n// 判断字母组是否选中\nfunction isGroupSelected(group) {\n return group.every(l => selectedLetters.value.includes(l));\n}\n\n// 清除字母筛选\nfunction clearLetterFilter() {\n selectedLetters.value = [];\n}\n\n// 判断省份是否应该高亮\nfunction isProvinceHighlight(province) {\n if (selectedLetters.value.length === 0) return false;\n return selectedLetters.value.includes(provincePinyinMap[province]);\n}\n\n// 字母索引滑动选择相关\nlet isTouchingLetterIndex = false;\nlet touchSelectedGroup = null; // 记录触摸选中的组,防止click重复处理\n\nfunction onLetterIndexTouchStart(e) {\n isTouchingLetterIndex = true;\n touchSelectedGroup = null;\n const touch = e.touches[0];\n updateLetterIndexByTouch(touch);\n}\n\nfunction onLetterIndexTouchMove(e) {\n if (!isTouchingLetterIndex) return;\n const touch = e.touches[0];\n updateLetterIndexByTouch(touch);\n}\n\nfunction onLetterIndexTouchEnd() {\n isTouchingLetterIndex = false;\n // 延迟清除,让click事件能检测到\n setTimeout(() => {\n touchSelectedGroup = null;\n }, 100);\n}\n\nfunction updateLetterIndexByTouch(touch) {\n const x = touch.clientX;\n const y = touch.clientY;\n\n // #ifdef H5\n // H5端使用 document.elementFromPoint\n const element = document.elementFromPoint(x, y);\n if (element && element.classList.contains('letter-index')) {\n const index = element.dataset.index;\n if (index !== undefined) {\n const group = letterGroups[parseInt(index)];\n if (group && !isGroupSelected(group)) {\n selectedLetters.value = [...group];\n touchSelectedGroup = group;\n }\n }\n }\n // #endif\n\n // #ifdef APP-PLUS || MP-WEIXIN\n // 小程序/APP端通过计算位置来判断\n uni.createSelectorQuery()\n .selectAll('.letter-index')\n .boundingClientRect((rects) => {\n if (!rects) return;\n for (let i = 0; i < rects.length; i++) {\n const rect = rects[i];\n if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) {\n const group = letterGroups[i];\n if (group && !isGroupSelected(group)) {\n selectedLetters.value = [...group];\n touchSelectedGroup = group;\n }\n break;\n }\n }\n })\n .exec();\n // #endif\n}\n\n// 特殊字符(7个)\nconst specialChars = [\n { char: '警', type: 'white' },\n { char: '领', type: 'black' },\n { char: '港', type: 'black' },\n { char: '澳', type: 'black' },\n { char: '学', type: 'yellow' },\n { char: '挂', type: 'yellow' },\n { char: '使', type: 'black' },\n];\n\n// QWERTY键盘布局\nconst letterRows = [\n ['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'],\n ['A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L'],\n ['Z', 'X', 'C', 'V', 'B', 'N', 'M']\n];\n\n// 数字行\nconst numberRow = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'];\n\nconst plateLength = computed(() => isNewEnergy.value ? 8 : 7);\n\n// 获取特殊字符类型\nfunction getSpecialCharType(char) {\n if (!char) return null;\n const found = specialChars.find(item => item.char === char);\n return found ? found.type : null;\n}\n\n// 解析车牌号为数组\nconst plateArray = computed(() => {\n const value = props.modelValue;\n if (!value) return [];\n return value.split('').slice(0, plateLength.value);\n});\n\n// 判断前两位是否都是字母\nconst isFirstTwoLetters = computed(() => {\n const arr = plateArray.value;\n if (arr.length < 2) return false;\n const letterRegex = /^[A-Z]$/;\n return letterRegex.test(arr[0]) && letterRegex.test(arr[1]);\n});\n\n// 键盘标题\nconst keyboardTitle = computed(() => {\n if (activeIndex.value === 0) {\n return firstKeyboardMode.value === 'province' ? '选择省份' : '选择字母';\n }\n if (activeIndex.value === 1) return '选择字母';\n if (activeIndex.value === 2 && isFirstTwoLetters.value) return '选择省份';\n return '输入字符';\n});\n\n// 第一位是否显示字母(通过切换按钮控制)\nconst showLetterInFirst = computed(() => {\n return activeIndex.value === 0 && firstKeyboardMode.value === 'letter';\n});\n\n// 显示省份区域:第1位(省份模式),或前两位是字母时的第3位\nconst showProvinceSection = computed(() => {\n if (activeIndex.value === 0) return firstKeyboardMode.value === 'province';\n if (activeIndex.value === 2 && isFirstTwoLetters.value) return true;\n return false;\n});\n\n// 显示字母区域:第1位(字母模式)、第2位,或第3位及以后\nconst showLetterSection = computed(() => {\n if (activeIndex.value === 0 && firstKeyboardMode.value === 'letter') return true; // 第1位切换到字母\n if (activeIndex.value === 1) return true; // 第2位\n if (activeIndex.value === 2 && isFirstTwoLetters.value) return false; // 军牌第3位是省份\n if (activeIndex.value >= 2) return true; // 后面位置\n return false;\n});\n\n// 显示数字区域:第1位(字母模式)、第2位、第3位及以后\nconst showNumberSection = computed(() => {\n if (activeIndex.value === 0 && firstKeyboardMode.value === 'letter') return true; // 第1位切换到字母\n if (activeIndex.value === 1) return true; // 第2位\n if (activeIndex.value === 2 && isFirstTwoLetters.value) return false; // 军牌第3位是省份\n return activeIndex.value >= 2;\n});\n\n// 显示特殊字符:第1位(字母模式)、第2位、第3位及以后\nconst showSpecialSection = computed(() => {\n if (activeIndex.value === 0 && firstKeyboardMode.value === 'letter') return true; // 第1位切换到字母\n if (activeIndex.value === 1) return true; // 第2位\n if (activeIndex.value === 2 && isFirstTwoLetters.value) return false; // 军牌第3位是省份\n return activeIndex.value >= 2;\n});\n\n// 是否禁用 I 和 O(只有第3位及以后才禁用,前两位不禁用)\nconst shouldDisableIO = computed(() => {\n return activeIndex.value >= 2;\n});\n\n// 是否显示完成按钮(普通车牌第7位,或新能源第8位)\nconst showDoneButton = computed(() => {\n // 普通车牌:在第7位(索引6)时显示\n if (!isNewEnergy.value && activeIndex.value === 6) return true;\n // 新能源:在第8位(索引7)时显示\n if (isNewEnergy.value && activeIndex.value === 7) return true;\n return false;\n});\n\nfunction showKeyboardAt(index) {\n activeIndex.value = index;\n // 重置第一位键盘模式\n if (index === 0) {\n firstKeyboardMode.value = 'province';\n }\n showKeyboard.value = true;\n}\n\nfunction toggleFirstKeyboard() {\n firstKeyboardMode.value = firstKeyboardMode.value === 'province' ? 'letter' : 'province';\n}\n\nfunction handleNewEnergyClick() {\n if (!isNewEnergy.value) {\n // 未启用新能源,点击时启用并打开键盘\n isNewEnergy.value = true;\n }\n showKeyboardAt(7);\n}\n\nfunction closeKeyboard() {\n showKeyboard.value = false;\n activeIndex.value = -1;\n}\n\nfunction inputChar(c) {\n // 第3位及以后禁用 I 和 O\n if (shouldDisableIO.value && (c === 'I' || c === 'O')) return;\n\n const currentValue = props.modelValue;\n let arr = currentValue.split('');\n\n // 填充空位\n while (arr.length < activeIndex.value) {\n arr.push('');\n }\n\n // 更新指定位置\n arr[activeIndex.value] = c;\n\n emit('update:modelValue', arr.join(''));\n\n // 自动跳到下一位\n if (activeIndex.value < 6) {\n // 前6位,跳到下一位\n activeIndex.value = activeIndex.value + 1;\n } else if (activeIndex.value === 6) {\n // 第7位输入完,自动启用新能源并跳到第8位\n isNewEnergy.value = true;\n activeIndex.value = 7;\n } else if (activeIndex.value === 7) {\n // 新能源第8位输入完成后自动关闭键盘\n closeKeyboard();\n if (arr.join('').length === 8) {\n emit('complete', arr.join(''));\n }\n }\n}\n\nfunction deleteChar() {\n const currentValue = props.modelValue;\n let arr = currentValue.split('');\n\n if (activeIndex.value >= 0 && arr[activeIndex.value]) {\n // 当前位有内容,删除当前位\n arr[activeIndex.value] = '';\n // 移除末尾空字符\n while (arr.length > 0 && arr[arr.length - 1] === '') {\n arr.pop();\n }\n emit('update:modelValue', arr.join(''));\n } else if (activeIndex.value > 0) {\n // 当前位无内容,删除前一位并跳转\n const prevIndex = activeIndex.value - 1;\n arr[prevIndex] = '';\n while (arr.length > 0 && arr[arr.length - 1] === '') {\n arr.pop();\n }\n emit('update:modelValue', arr.join(''));\n activeIndex.value = prevIndex;\n } else if (activeIndex.value === 0 && arr[0]) {\n emit('update:modelValue', '');\n }\n}\n\n// 监听新能源切换,截断\nwatch(isNewEnergy, (val) => {\n if (!val && props.modelValue.length > 7) {\n emit('update:modelValue', props.modelValue.slice(0, 7));\n }\n});\n</script>\n\n<style lang=\"scss\">\n// 业务固定色定义\n$plate-new-energy: #00B42A; // 新能源车牌绿色\n$plate-new-energy-light: #00D68F;\n$plate-yellow: #FADC19; // 黄牌\n$plate-yellow-dark: #E6C900;\n$plate-black: #1D2129; // 黑牌\n$plate-white: #FFFFFF; // 白牌\n\n.prism-license-plate-input {\n .plate-boxes {\n display: flex;\n align-items: flex-end;\n gap: 8rpx;\n }\n\n .plate-box {\n width: 72rpx;\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 border: 2rpx solid transparent;\n transition: all 0.2s ease;\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 &.province, &.letter {\n width: 80rpx;\n }\n\n // 新能源车牌样式(业务固定色)\n &.new-energy {\n background: rgba($plate-new-energy, 0.15);\n border: 2rpx solid $plate-new-energy;\n\n &.active {\n border-color: $plate-new-energy;\n box-shadow: 0 0 0 4rpx rgba($plate-new-energy, 0.3);\n background: rgba($plate-new-energy, 0.2);\n }\n\n &.filled {\n background: linear-gradient(135deg, $plate-new-energy 0%, $plate-new-energy-light 100%);\n\n .plate-text {\n color: $plate-white;\n }\n }\n\n .plate-text {\n color: $plate-new-energy;\n }\n }\n\n &.new-energy-optional {\n background: transparent;\n border: 2rpx dashed $plate-new-energy;\n\n .optional-icon {\n font-size: 28rpx;\n color: $plate-new-energy;\n }\n\n &:active {\n background: rgba($plate-new-energy, 0.1);\n }\n }\n\n .plate-text {\n font-size: 36rpx;\n font-weight: 600;\n color: var(--prism-text-primary, #1D2129);\n }\n\n // 特殊车牌字符输入框样式(业务固定色)\n &.special-white {\n background: $plate-white;\n border: 2rpx solid var(--prism-border-color-light, #E5E6EB);\n\n &.active {\n border-color: var(--prism-primary-color, #3478F6);\n box-shadow: 0 0 0 4rpx rgba(52, 120, 246, 0.3);\n }\n\n .plate-text {\n color: $plate-black;\n }\n }\n\n &.special-black {\n background: $plate-black;\n border: 2rpx solid $plate-black;\n\n &.active {\n border-color: var(--prism-primary-color, #3478F6);\n box-shadow: 0 0 0 4rpx rgba(52, 120, 246, 0.3);\n }\n\n .plate-text {\n color: $plate-white;\n }\n }\n\n &.special-yellow {\n background: $plate-yellow;\n border: 2rpx solid $plate-yellow-dark;\n\n &.active {\n border-color: var(--prism-primary-color, #3478F6);\n box-shadow: 0 0 0 4rpx rgba(52, 120, 246, 0.3);\n }\n\n .plate-text {\n color: $plate-black;\n }\n }\n }\n\n .plate-dot {\n width: 12rpx;\n height: 12rpx;\n background: var(--prism-text-secondary, #86909C);\n border-radius: 50%;\n margin: 0 8rpx;\n margin-bottom: 38rpx;\n }\n\n .plate-box-wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n\n &.new-energy-wrapper {\n .new-energy-label {\n font-size: 18rpx;\n color: $plate-new-energy;\n font-weight: 500;\n margin-bottom: 6rpx;\n white-space: nowrap;\n\n &.hidden {\n visibility: hidden;\n }\n }\n }\n }\n\n .energy-switch {\n display: flex;\n align-items: center;\n gap: 12rpx;\n margin-top: 24rpx;\n\n .energy-text {\n font-size: 28rpx;\n color: var(--prism-text-secondary, #86909C);\n }\n }\n\n .keyboard-modal {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 9999;\n }\n\n .keyboard-content {\n width: 100%;\n max-height: 70vh;\n background: var(--prism-bg-color-card, #FFFFFF);\n border-radius: 24rpx 24rpx 0 0;\n padding: 24rpx;\n padding-bottom: calc(24rpx + env(safe-area-inset-bottom));\n box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.1);\n display: flex;\n flex-direction: column;\n }\n\n .keyboard-body {\n flex: 1;\n overflow-y: auto;\n height: 480rpx; // 统一键盘高度:5行 * (80rpx高度 + 12rpx间距) + 余量\n min-height: 480rpx;\n }\n\n .keyboard-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 24rpx;\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 16rpx;\n }\n\n .keyboard-title {\n font-size: 32rpx;\n font-weight: 600;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .switch-btn {\n padding: 6rpx 12rpx;\n background: var(--prism-primary-color, #3478F6);\n border-radius: 6rpx;\n\n text {\n font-size: 22rpx;\n color: $plate-white;\n }\n\n &:active {\n opacity: 0.8;\n }\n }\n\n .keyboard-close {\n font-size: 36rpx;\n color: var(--prism-text-secondary, #86909C);\n padding: 8rpx;\n }\n }\n\n .keyboard-section {\n margin-bottom: 20rpx;\n\n .section-title {\n font-size: 24rpx;\n color: var(--prism-text-secondary, #86909C);\n margin-bottom: 12rpx;\n }\n }\n\n .keyboard-qwerty {\n display: flex;\n flex-direction: column;\n gap: 12rpx;\n\n // 省份键盘样式\n &.province-qwerty .keyboard-row {\n justify-content: flex-start;\n\n .key-item {\n flex: 1;\n max-width: none;\n }\n }\n }\n\n .keyboard-row {\n display: flex;\n justify-content: center;\n gap: 8rpx;\n\n &.number-row {\n justify-content: flex-start;\n }\n\n &.special-row {\n justify-content: flex-start;\n flex-wrap: wrap;\n }\n\n // 字母索引行\n &.letter-index-row {\n justify-content: flex-start;\n width: 100%;\n margin-bottom: 12rpx;\n\n .key-item {\n flex: 1;\n }\n }\n }\n\n .key-item {\n min-width: 56rpx;\n height: 80rpx;\n padding: 0 12rpx;\n background: var(--prism-input-bg, #EBEEF2);\n border-radius: 12rpx;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32rpx;\n font-weight: 500;\n color: var(--prism-text-primary, #1D2129);\n transition: all 0.15s ease;\n flex: 1;\n max-width: 72rpx;\n\n &:active {\n background: var(--prism-primary-color, #3478F6);\n color: $plate-white;\n }\n\n &.disabled {\n opacity: 0.3;\n pointer-events: none;\n }\n\n // 字母索引按钮样式\n &.letter-index {\n font-size: 24rpx;\n background: var(--prism-bg-color, #F7F8FA);\n color: var(--prism-text-secondary, #86909C);\n max-width: none;\n min-width: auto;\n padding: 0 8rpx;\n\n &.active {\n background: var(--prism-primary-color, #3478F6);\n color: $plate-white;\n }\n }\n\n // 省份高亮样式(拼音首字母匹配)\n &.highlight {\n background: var(--prism-primary-color, #3478F6);\n color: $plate-white;\n box-shadow: 0 0 0 4rpx rgba(52, 120, 246, 0.3);\n transform: scale(1.05);\n }\n\n // 删除按钮样式\n &.delete {\n background: var(--prism-danger-color, #F53F3F);\n color: $plate-white;\n min-width: 120rpx;\n max-width: 120rpx;\n flex: none;\n\n .delete-text {\n font-size: 28rpx;\n font-weight: 500;\n color: $plate-white;\n }\n\n &:active {\n background: var(--prism-danger-color-active, #D93636);\n }\n }\n\n // 完成按钮样式\n &.done {\n background: var(--prism-primary-color, #3478F6);\n color: $plate-white;\n flex: 1;\n min-width: 80rpx;\n max-width: none;\n\n .done-text {\n font-size: 28rpx;\n font-weight: 500;\n color: $plate-white;\n }\n\n &:active {\n background: var(--prism-primary-color-active, #2563EB);\n }\n }\n\n // 特殊车牌字符样式(业务固定色)\n &.special {\n font-weight: 600;\n flex: none;\n min-width: 72rpx;\n max-width: 72rpx;\n\n &.black {\n background: $plate-black;\n color: $plate-white;\n\n &:active {\n background: #000000;\n }\n }\n\n &.white {\n background: $plate-white;\n color: $plate-black;\n border: 2rpx solid var(--prism-border-color-light, #E5E6EB);\n\n &:active {\n background: var(--prism-bg-color, #F2F3F5);\n }\n }\n\n &.yellow {\n background: $plate-yellow;\n color: $plate-black;\n\n &:active {\n background: $plate-yellow-dark;\n }\n }\n }\n }\n}\n\n.dark-mode .prism-license-plate-input {\n .plate-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 .plate-text {\n color: var(--prism-text-primary, #E5E6EB);\n }\n\n // 深色模式特殊字符样式\n &.special-white {\n background: rgba(255, 255, 255, 0.9);\n border: 2rpx solid rgba(255, 255, 255, 0.3);\n\n .plate-text {\n color: #1D2129;\n }\n }\n\n &.special-black {\n background: #000000;\n border: 2rpx solid #333333;\n\n .plate-text {\n color: #FFFFFF;\n }\n }\n\n &.special-yellow {\n background: #FADC19;\n border: 2rpx solid #E6C900;\n\n .plate-text {\n color: #1D2129;\n }\n }\n }\n\n .keyboard-content {\n background: var(--prism-bg-color-card, #242424);\n }\n\n .keyboard-header .keyboard-title {\n color: var(--prism-text-primary, #E5E6EB);\n }\n\n .section-title {\n color: var(--prism-text-secondary, #6B7785);\n }\n\n .key-item {\n background: var(--prism-input-bg, #2A2A2A);\n color: var(--prism-text-primary, #E5E6EB);\n\n // 字母索引按钮深色模式\n &.letter-index {\n background: rgba(255, 255, 255, 0.08);\n color: var(--prism-text-secondary, #6B7785);\n\n &.active {\n background: var(--prism-primary-color, #3478F6);\n color: #FFFFFF;\n }\n }\n\n // 省份高亮保持蓝色\n &.highlight {\n background: var(--prism-primary-color, #3478F6);\n color: #FFFFFF;\n }\n\n // 删除按钮保持红色\n &.delete {\n background: var(--prism-danger-color, #F53F3F);\n color: #FFFFFF;\n\n .delete-text {\n color: #FFFFFF;\n }\n }\n\n // 完成按钮保持蓝色\n &.done {\n background: var(--prism-primary-color, #3478F6);\n color: #FFFFFF;\n\n .done-text {\n color: #FFFFFF;\n }\n }\n }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismLicensePlateInput/PrismLicensePlateInput.vue'\nwx.createComponent(Component)"],"names":["useAppStore","ref","uni","computed","watch","Component"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PrismMusicPlayer.js","sources":["components/PrismMusicPlayer/PrismMusicPlayer.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21NdXNpY1BsYXllci9QcmlzbU11c2ljUGxheWVyLnZ1ZQ"],"sourcesContent":["<template>\n <view class=\"prism-music-player\" :class=\"{ 'dark-mode': isDarkMode }\">\n <!-- 主播放区 -->\n <view class=\"player-main\">\n <!-- 封面 CD -->\n <view class=\"cover-wrapper\" :class=\"{ playing: isPlaying }\">\n <image v-if=\"currentCover\" class=\"cover-image\" :src=\"currentCover\" mode=\"aspectFill\" />\n <view v-else class=\"cover-placeholder\">\n <text class=\"fa fa-music\"></text>\n </view>\n </view>\n <!-- 右侧信息 -->\n <view class=\"player-info\">\n <text class=\"song-title\">{{ currentSong }}</text>\n <text class=\"song-album\" v-if=\"currentAlbum\">{{ currentAlbum }}</text>\n <!-- 播放控制 -->\n <view class=\"player-controls\">\n <text class=\"fa fa-backward-step control-icon\" @click=\"previousSong\"></text>\n <view class=\"play-button\" @click=\"togglePlay\">\n <text class=\"fa\" :class=\"isPlaying ? 'fa-pause' : 'fa-play'\"></text>\n </view>\n <text class=\"fa fa-forward-step control-icon\" @click=\"nextSong\"></text>\n </view>\n </view>\n </view>\n\n <!-- 进度条 -->\n <view class=\"progress-section\">\n <text class=\"time-text\">{{ formatTime(currentTime) }}</text>\n <view class=\"progress-bar\">\n <view class=\"progress-fill\" :style=\"{ width: progress + '%' }\"></view>\n </view>\n <text class=\"time-text\">{{ formatTime(duration) }}</text>\n </view>\n\n <!-- 底部按钮栏 -->\n <view class=\"bottom-bar\">\n <view class=\"bar-btn\" :class=\"{ active: showType }\" @click=\"toggleType\">\n <text class=\"fa fa-sliders\"></text>\n <text>{{ typeNames[currentTypeIndex] }}</text>\n </view>\n <view class=\"bar-btn\" :class=\"{ active: showPlaylist }\" @click=\"togglePlaylist\">\n <text class=\"fa fa-list\"></text>\n <text>播放清单 ({{ currentSongList.length }})</text>\n </view>\n </view>\n\n <!-- 弹出层遮罩 -->\n <view class=\"popup-mask\" v-show=\"showType || showPlaylist\" @click=\"closePopup\"></view>\n\n <!-- 分类选择弹出层 -->\n <view class=\"popup\" :class=\"{ show: showType }\">\n <view class=\"popup-title\">\n <text class=\"fa fa-sliders\"></text>\n <text>选择分类</text>\n </view>\n <view\n class=\"popup-item\"\n v-for=\"(type, index) in typeNames\"\n :key=\"type\"\n :class=\"{ active: currentTypeIndex === index }\"\n @click=\"selectType(index)\"\n >\n <text class=\"fa\" :class=\"getTypeIcon(type)\"></text>\n <text class=\"item-name\">{{ type }}</text>\n <text class=\"item-count\">({{ songs[type]?.length || 0 }})</text>\n </view>\n </view>\n\n <!-- 播放清单弹出层 -->\n <view class=\"popup playlist-popup\" :class=\"{ show: showPlaylist }\">\n <view class=\"popup-title\">\n <text class=\"fa fa-list\"></text>\n <text>播放清单</text>\n </view>\n <scroll-view class=\"popup-scroll\" scroll-y>\n <view\n class=\"popup-item playlist-item\"\n v-for=\"(song, index) in currentSongList\"\n :key=\"index\"\n :class=\"{ active: currentSongIndex === index }\"\n @click=\"playSongAt(index)\"\n >\n <image v-if=\"song.cover\" class=\"playlist-cover\" :src=\"song.cover\" mode=\"aspectFill\" />\n <view v-else class=\"playlist-cover placeholder\">\n <text class=\"fa fa-music\"></text>\n </view>\n <view class=\"song-info\">\n <text class=\"song-name\">{{ song.name }}</text>\n <text class=\"song-album-small\" v-if=\"song.album\">{{ song.album }}</text>\n </view>\n <text class=\"fa fa-volume-high playing-icon\" v-if=\"currentSongIndex === index && isPlaying\"></text>\n </view>\n </scroll-view>\n </view>\n </view>\n</template>\n\n<script setup>\nimport { ref, computed, onUnmounted, watch } from 'vue';\n\nconst props = defineProps({\n title: { type: String, default: '音乐播放器' },\n songs: { type: Object, default: () => ({}) },\n isDarkMode: { type: Boolean, default: false }\n});\n\nconst emit = defineEmits(['play', 'pause', 'change']);\n\n// 状态\nconst currentTypeIndex = ref(0);\nconst currentSongIndex = ref(0);\nconst isPlaying = ref(false);\nconst progress = ref(0);\nconst currentTime = ref(0);\nconst duration = ref(0);\nconst showPlaylist = ref(false);\nconst showType = ref(false);\nlet audioContext = null;\n\n// 计算属性\nconst typeNames = computed(() => Object.keys(props.songs));\nconst currentSongList = computed(() => props.songs[typeNames.value[currentTypeIndex.value]] || []);\nconst currentSong = computed(() => currentSongList.value[currentSongIndex.value]?.name || '请选择音乐');\nconst currentCover = computed(() => currentSongList.value[currentSongIndex.value]?.cover || '');\nconst currentAlbum = computed(() => currentSongList.value[currentSongIndex.value]?.album || '');\n\n// 分类图标映射\nconst typeIconMap = {\n '放松舒缓': 'fa-leaf',\n '专注冥想': 'fa-brain',\n '情绪提振': 'fa-bolt',\n '助眠安神': 'fa-moon'\n};\n\nfunction getTypeIcon(type) {\n return typeIconMap[type] || 'fa-music';\n}\n\n// 格式化时间\nfunction formatTime(seconds) {\n if (!seconds || isNaN(seconds)) return '00:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n}\n\n// 类型切换\nfunction onTypeChange(e) {\n currentTypeIndex.value = e.detail.value;\n currentSongIndex.value = 0;\n progress.value = 0;\n currentTime.value = 0;\n duration.value = 0;\n stopAudio();\n}\n\n// 切换分类面板\nfunction toggleType() {\n showType.value = !showType.value;\n if (showType.value) showPlaylist.value = false;\n}\n\n// 切换播放清单面板\nfunction togglePlaylist() {\n showPlaylist.value = !showPlaylist.value;\n if (showPlaylist.value) showType.value = false;\n}\n\n// 关闭弹出层\nfunction closePopup() {\n showType.value = false;\n showPlaylist.value = false;\n}\n\n// 选择分类\nfunction selectType(index) {\n currentTypeIndex.value = index;\n currentSongIndex.value = 0;\n progress.value = 0;\n currentTime.value = 0;\n duration.value = 0;\n stopAudio();\n showType.value = false;\n}\n\n// 播放/暂停\nfunction togglePlay() {\n if (!currentSongList.value.length) return;\n isPlaying.value ? pauseMusic() : playMusic();\n}\n\n// 播放\nfunction playMusic() {\n const song = currentSongList.value[currentSongIndex.value];\n if (!song) return;\n\n if (audioContext) audioContext.destroy();\n audioContext = uni.createInnerAudioContext();\n audioContext.src = song.file;\n\n audioContext.onPlay(() => {\n isPlaying.value = true;\n emit('play', { song, index: currentSongIndex.value });\n });\n\n audioContext.onTimeUpdate(() => {\n if (audioContext.duration > 0) {\n progress.value = (audioContext.currentTime / audioContext.duration) * 100;\n currentTime.value = audioContext.currentTime;\n duration.value = audioContext.duration;\n }\n });\n\n audioContext.onEnded(() => nextSong());\n audioContext.onError(() => {\n uni.showToast({ title: '播放失败', icon: 'none' });\n isPlaying.value = false;\n });\n\n audioContext.play();\n}\n\n// 暂停\nfunction pauseMusic() {\n audioContext?.pause();\n isPlaying.value = false;\n emit('pause');\n}\n\n// 停止\nfunction stopAudio() {\n audioContext?.stop();\n isPlaying.value = false;\n}\n\n// 上一首\nfunction previousSong() {\n if (!currentSongList.value.length) return;\n currentSongIndex.value = (currentSongIndex.value - 1 + currentSongList.value.length) % currentSongList.value.length;\n progress.value = 0;\n currentTime.value = 0;\n if (isPlaying.value) playMusic();\n emit('change', { song: currentSongList.value[currentSongIndex.value], index: currentSongIndex.value });\n}\n\n// 下一首\nfunction nextSong() {\n if (!currentSongList.value.length) return;\n currentSongIndex.value = (currentSongIndex.value + 1) % currentSongList.value.length;\n progress.value = 0;\n currentTime.value = 0;\n if (isPlaying.value) playMusic();\n emit('change', { song: currentSongList.value[currentSongIndex.value], index: currentSongIndex.value });\n}\n\n// 播放指定歌曲\nfunction playSongAt(index) {\n currentSongIndex.value = index;\n progress.value = 0;\n currentTime.value = 0;\n playMusic();\n}\n\nonUnmounted(() => {\n audioContext?.destroy();\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.prism-music-player {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n border-radius: 24rpx;\n padding: 24rpx;\n color: #fff;\n}\n\n/* 主播放区 - 横向布局 */\n.player-main {\n display: flex;\n align-items: center;\n gap: 20rpx;\n margin-bottom: 20rpx;\n}\n\n.cover-wrapper {\n width: 140rpx;\n height: 140rpx;\n border-radius: 50%;\n overflow: hidden;\n flex-shrink: 0;\n box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.3);\n border: 4rpx solid rgba(255, 255, 255, 0.3);\n position: relative;\n &.playing { animation: rotate 10s linear infinite; }\n &::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32rpx;\n height: 32rpx;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n border-radius: 50%;\n border: 4rpx solid rgba(255, 255, 255, 0.5);\n z-index: 2;\n }\n}\n\n@keyframes rotate {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n.cover-image { width: 100%; height: 100%; }\n\n.cover-placeholder {\n width: 100%; height: 100%;\n background: rgba(255, 255, 255, 0.15);\n display: flex; align-items: center; justify-content: center;\n .fa { font-size: 40rpx; opacity: 0.6; }\n}\n\n.player-info {\n flex: 1;\n min-width: 0;\n}\n\n.song-title {\n display: block;\n font-size: 28rpx;\n font-weight: 600;\n margin-bottom: 4rpx;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.song-album {\n display: block;\n font-size: 22rpx;\n opacity: 0.7;\n margin-bottom: 12rpx;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.player-controls {\n display: flex;\n align-items: center;\n gap: 24rpx;\n}\n\n.control-icon { font-size: 36rpx; opacity: 0.8; }\n\n.play-button {\n width: 72rpx; height: 72rpx;\n border-radius: 50%;\n background: #fff;\n display: flex; align-items: center; justify-content: center;\n box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.2);\n .fa { font-size: 28rpx; color: #667eea; }\n}\n\n/* 进度条 */\n.progress-section {\n display: flex;\n align-items: center;\n gap: 12rpx;\n margin-bottom: 16rpx;\n}\n\n.time-text { font-size: 20rpx; opacity: 0.8; }\n\n.progress-bar {\n flex: 1;\n height: 6rpx;\n background: rgba(255, 255, 255, 0.3);\n border-radius: 3rpx;\n overflow: hidden;\n}\n\n.progress-fill {\n height: 100%;\n background: #fff;\n border-radius: 3rpx;\n transition: width 0.3s ease;\n}\n\n/* 底部按钮栏 */\n.bottom-bar {\n display: flex;\n gap: 12rpx;\n}\n\n.bar-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8rpx;\n padding: 12rpx 16rpx;\n background: rgba(0, 0, 0, 0.15);\n border-radius: 8rpx;\n font-size: 22rpx;\n opacity: 0.9;\n &.active { background: rgba(255, 255, 255, 0.2); }\n}\n\n/* 弹出层遮罩 */\n.popup-mask {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: 100;\n}\n\n/* 弹出层 - 居中 */\n.popup {\n position: fixed;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%) scale(0.9);\n width: 560rpx;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n border-radius: 16rpx;\n z-index: 101;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n box-shadow: 0 16rpx 48rpx rgba(0, 0, 0, 0.3);\n &.show {\n opacity: 1;\n visibility: visible;\n transform: translate(-50%, -50%) scale(1);\n }\n}\n\n.popup-title {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12rpx;\n padding: 20rpx 24rpx;\n font-size: 26rpx;\n font-weight: 600;\n border-bottom: 1rpx solid rgba(255, 255, 255, 0.1);\n}\n\n.popup-item {\n display: flex;\n align-items: center;\n gap: 12rpx;\n padding: 16rpx 24rpx;\n font-size: 24rpx;\n &:active, &.active { background: rgba(255, 255, 255, 0.15); }\n}\n\n.item-name { flex: 1; }\n.item-count { font-size: 20rpx; opacity: 0.6; }\n\n/* 播放清单弹出层 */\n.playlist-popup { width: 620rpx; }\n.popup-scroll { max-height: 500rpx; }\n\n.playlist-item {\n display: flex;\n align-items: center;\n padding: 12rpx 16rpx;\n gap: 12rpx;\n border-bottom: 1rpx solid rgba(255, 255, 255, 0.08);\n &:last-child { border-bottom: none; }\n &:active, &.active {\n background: rgba(255, 255, 255, 0.1);\n }\n}\n\n.playlist-cover {\n width: 56rpx;\n height: 56rpx;\n border-radius: 6rpx;\n flex-shrink: 0;\n &.placeholder {\n background: rgba(255, 255, 255, 0.1);\n display: flex;\n align-items: center;\n justify-content: center;\n .fa { font-size: 24rpx; opacity: 0.5; }\n }\n}\n\n.song-info {\n flex: 1;\n min-width: 0;\n}\n\n.song-name {\n font-size: 24rpx;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.song-album-small {\n font-size: 18rpx;\n opacity: 0.6;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-top: 2rpx;\n}\n\n.playing-icon {\n font-size: 20rpx;\n color: #fff;\n animation: pulse 1s infinite;\n}\n\n@keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.4; }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismMusicPlayer/PrismMusicPlayer.vue'\nwx.createComponent(Component)"],"names":["ref","computed","uni","onUnmounted"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PrismNavBar.js","sources":["components/PrismNavBar/PrismNavBar.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21OYXZCYXIvUHJpc21OYXZCYXIudnVl"],"sourcesContent":["<template>\n <view class=\"prism-nav-bar\" :class=\"{ 'dark-mode': appStore.isDarkMode, 'glass-effect': glass }\" :style=\"{ paddingTop: appStore.statusBarHeight + 'px' }\">\n <view class=\"nav-bar-content\">\n <view class=\"nav-bar-left\">\n <!-- 返回按钮 -->\n <view v-if=\"showBack\" class=\"nav-bar-back\" @click=\"handleBack\">\n <text class=\"fa fa-arrow-left\"></text>\n </view>\n <!-- 图标 -->\n <view v-if=\"icon\" class=\"nav-bar-icon prism-icon\" :class=\"iconColor\">\n <text class=\"fa\" :class=\"icon\"></text>\n </view>\n <text class=\"nav-bar-title\">{{ title }}</text>\n </view>\n <view class=\"nav-bar-actions\">\n <view class=\"prism-icon-btn prism-icon-btn--md theme-btn\" @click=\"handleThemeClick\">\n <text class=\"fa\" :class=\"themeIcon\"></text>\n </view>\n </view>\n </view>\n </view>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport { useAppStore } from '@/store/app';\n\nconst props = defineProps({\n title: {\n type: String,\n required: true\n },\n icon: {\n type: String,\n default: ''\n },\n iconColor: {\n type: String,\n default: 'blue'\n },\n glass: {\n type: Boolean,\n default: true\n },\n showBack: {\n type: Boolean,\n default: false\n }\n});\n\nconst appStore = useAppStore();\n\n// 主题图标\nconst themeIcon = computed(() => {\n const icons = {\n 'light': 'fa-sun',\n 'dark': 'fa-moon',\n 'system': 'fa-circle-half-stroke'\n };\n return icons[appStore.themeMode] || 'fa-moon';\n});\n\nfunction handleThemeClick() {\n appStore.toggleTheme();\n}\n\nfunction handleBack() {\n const pages = getCurrentPages();\n if (pages.length > 1) {\n // 有历史记录,正常返回\n uni.navigateBack();\n } else {\n // 没有历史记录,返回首页\n uni.reLaunch({ url: '/pages/index/index' });\n }\n}\n</script>\n\n<style lang=\"scss\">\n.prism-nav-bar {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n z-index: 100;\n background: var(--prism-bg-color-card);\n border-bottom: 1rpx solid var(--prism-border-color-light);\n\n /* #ifndef H5 */\n &.glass-effect {\n background: rgba(255, 255, 255, 0.4);\n backdrop-filter: saturate(180%) blur(40px);\n -webkit-backdrop-filter: saturate(180%) blur(40px);\n border-bottom: 1rpx solid rgba(0, 0, 0, 0.1);\n }\n /* #endif */\n}\n\n.nav-bar-content {\n height: 88rpx;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 32rpx;\n}\n\n.nav-bar-left {\n display: flex;\n align-items: center;\n gap: 16rpx;\n margin-top: -6rpx;\n}\n\n.nav-bar-back {\n width: 56rpx;\n height: 56rpx;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n flex-shrink: 0;\n transition: all 0.2s;\n\n &:active {\n opacity: 0.7;\n transform: scale(0.95);\n }\n\n .fa {\n font-size: 28rpx;\n color: var(--prism-text-primary);\n }\n}\n\n.nav-bar-icon {\n width: 56rpx;\n height: 56rpx;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 16rpx;\n flex-shrink: 0;\n\n .fa {\n font-size: 32rpx;\n line-height: 1;\n }\n}\n\n.nav-bar-title {\n font-size: 32rpx;\n font-weight: 600;\n color: var(--prism-text-primary);\n line-height: 1;\n}\n\n.nav-bar-actions {\n display: flex;\n align-items: center;\n gap: 12rpx;\n margin-top: -6rpx;\n\n /* 小程序环境下预留胶囊位置 */\n /* #ifdef MP */\n margin-right: 160rpx;\n /* #endif */\n}\n\n/* 主题切换按钮 */\n.theme-btn {\n width: 56rpx;\n height: 56rpx;\n border-radius: 288rpx;\n background: var(--prism-bg-color-icon-btn);\n border: 1rpx solid var(--prism-border-color-light);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n\n &:active {\n opacity: 0.7;\n transform: scale(0.96);\n }\n\n .fa {\n color: var(--prism-warning-color);\n font-size: 24rpx;\n }\n}\n\n/* 深色模式 - 毛玻璃效果 */\n/* #ifndef H5 */\n.prism-nav-bar.dark-mode.glass-effect {\n background: rgba(26, 26, 26, 0.4);\n border-bottom-color: rgba(255, 255, 255, 0.12);\n}\n/* #endif */\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismNavBar/PrismNavBar.vue'\nwx.createComponent(Component)"],"names":["useAppStore","computed","uni","Component"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,UAAM,WAAWA,UAAAA,YAAW;AAG5B,UAAM,YAAYC,cAAAA,SAAS,MAAM;AAC/B,YAAM,QAAQ;AAAA,QACZ,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AACE,aAAO,MAAM,SAAS,SAAS,KAAK;AAAA,IACtC,CAAC;AAED,aAAS,mBAAmB;AAC1B,eAAS,YAAW;AAAA,IACtB;AAEA,aAAS,aAAa;AACpB,YAAM,QAAQ,gBAAe;AAC7B,UAAI,MAAM,SAAS,GAAG;AAEpBC,sBAAAA,MAAI,aAAY;AAAA,MAClB,OAAO;AAELA,sBAAAA,MAAI,SAAS,EAAE,KAAK,qBAAoB,CAAE;AAAA,MAC5C;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;AC1EA,GAAG,gBAAgBC,SAAS;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PrismSecureInput.js","sources":["components/PrismSecureInput/PrismSecureInput.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21TZWN1cmVJbnB1dC9QcmlzbVNlY3VyZUlucHV0LnZ1ZQ"],"sourcesContent":["<template>\n <view class=\"prism-secure-input\" :class=\"{ 'dark-mode': appStore.isDarkMode }\">\n <!-- 密码输入框 -->\n <view class=\"password-boxes\" @click=\"showKeyboardModal\">\n <view\n v-for=\"i in length\"\n :key=\"i\"\n class=\"password-box\"\n :class=\"{ 'active': isFocused && passwordArray.length === i - 1, 'filled': passwordArray[i - 1] }\"\n >\n <view class=\"password-dot\" v-if=\"passwordArray[i - 1]\"></view>\n <view class=\"cursor\" v-if=\"isFocused && passwordArray.length === i - 1\"></view>\n </view>\n </view>\n\n <!-- 自定义数字键盘 -->\n <view class=\"keyboard-modal\" v-if=\"showKeyboard\" @click=\"hideKeyboard\">\n <view class=\"keyboard-content\" @click.stop>\n <view class=\"keyboard-header\">\n <text class=\"keyboard-title\">{{ title }}</text>\n <text class=\"keyboard-done\" @click=\"hideKeyboard\">完成</text>\n </view>\n\n <!-- 数字键盘 -->\n <view class=\"number-keyboard\" :class=\"{ 'random': randomOrder }\">\n <view class=\"keyboard-row\">\n <view class=\"key-btn\" v-for=\"n in displayNumbers.slice(0, 3)\" :key=\"n\" @click=\"inputNumber(n)\">\n <text class=\"key-text\">{{ n }}</text>\n </view>\n </view>\n <view class=\"keyboard-row\">\n <view class=\"key-btn\" v-for=\"n in displayNumbers.slice(3, 6)\" :key=\"n\" @click=\"inputNumber(n)\">\n <text class=\"key-text\">{{ n }}</text>\n </view>\n </view>\n <view class=\"keyboard-row\">\n <view class=\"key-btn\" v-for=\"n in displayNumbers.slice(6, 9)\" :key=\"n\" @click=\"inputNumber(n)\">\n <text class=\"key-text\">{{ n }}</text>\n </view>\n </view>\n <view class=\"keyboard-row\">\n <view class=\"key-btn func\" @click=\"clearAll\">\n <text class=\"key-text\">清空</text>\n </view>\n <view class=\"key-btn\" @click=\"inputNumber(displayNumbers[9])\">\n <text class=\"key-text\">{{ displayNumbers[9] }}</text>\n </view>\n <view class=\"key-btn delete\" @click=\"deleteNumber\">\n <text class=\"delete-text\">删除</text>\n </view>\n </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';\n\nconst props = defineProps({\n modelValue: {\n type: String,\n default: ''\n },\n length: {\n type: Number,\n default: 6\n },\n title: {\n type: String,\n default: '请输入密码'\n },\n randomOrder: {\n type: Boolean,\n default: false\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'complete']);\n\nconst appStore = useAppStore();\nconst passwordValue = ref(props.modelValue);\nconst isFocused = ref(false);\nconst showKeyboard = ref(false);\n\n// 数字顺序(可随机)\nconst displayNumbers = ref(['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']);\n\nconst passwordArray = computed(() => {\n return passwordValue.value.split('').slice(0, props.length);\n});\n\n// 打乱数字顺序\nfunction shuffleNumbers() {\n if (props.randomOrder) {\n const arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n for (let i = arr.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [arr[i], arr[j]] = [arr[j], arr[i]];\n }\n displayNumbers.value = arr;\n }\n}\n\nfunction showKeyboardModal() {\n isFocused.value = true;\n showKeyboard.value = true;\n if (props.randomOrder) {\n shuffleNumbers();\n }\n}\n\nfunction hideKeyboard() {\n isFocused.value = false;\n showKeyboard.value = false;\n}\n\nfunction inputNumber(n) {\n if (passwordValue.value.length >= props.length) return;\n\n passwordValue.value += n;\n emit('update:modelValue', passwordValue.value);\n\n if (passwordValue.value.length === props.length) {\n emit('complete', passwordValue.value);\n setTimeout(() => {\n hideKeyboard();\n }, 200);\n }\n}\n\nfunction deleteNumber() {\n if (passwordValue.value.length > 0) {\n passwordValue.value = passwordValue.value.slice(0, -1);\n emit('update:modelValue', passwordValue.value);\n }\n}\n\nfunction clearAll() {\n passwordValue.value = '';\n emit('update:modelValue', '');\n}\n\nwatch(() => props.modelValue, (val) => {\n passwordValue.value = val;\n});\n\nonMounted(() => {\n if (props.randomOrder) {\n shuffleNumbers();\n }\n});\n</script>\n\n<style lang=\"scss\">\n// 白色常量(用于按钮文字等固定白色场景)\n$color-white: #FFFFFF;\n\n.prism-secure-input {\n .password-boxes {\n display: flex;\n justify-content: center;\n gap: 16rpx;\n }\n\n .password-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 border: 2rpx solid transparent;\n transition: all 0.2s ease;\n position: relative;\n\n &.active {\n border-color: var(--prism-primary-color, #3478F6);\n background: rgba(52, 120, 246, 0.08);\n }\n\n &.filled {\n background: rgba(52, 120, 246, 0.08);\n }\n\n .password-dot {\n width: 24rpx;\n height: 24rpx;\n background: var(--prism-text-primary, #1D2129);\n border-radius: 50%;\n }\n\n .cursor {\n width: 4rpx;\n height: 40rpx;\n background: var(--prism-primary-color, #3478F6);\n animation: blink 1s infinite;\n }\n }\n\n .keyboard-modal {\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 z-index: 9999;\n display: flex;\n align-items: flex-end;\n }\n\n .keyboard-content {\n width: 100%;\n background: var(--prism-bg-color, #F7F8FA);\n border-radius: 24rpx 24rpx 0 0;\n padding-bottom: env(safe-area-inset-bottom);\n }\n\n .keyboard-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 24rpx 32rpx;\n background: var(--prism-bg-color-card, #FFFFFF);\n border-radius: 24rpx 24rpx 0 0;\n\n .keyboard-title {\n font-size: 32rpx;\n font-weight: 600;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .keyboard-done {\n font-size: 30rpx;\n color: var(--prism-primary-color, #3478F6);\n font-weight: 500;\n }\n }\n\n .number-keyboard {\n padding: 16rpx;\n }\n\n .keyboard-row {\n display: flex;\n gap: 12rpx;\n margin-bottom: 12rpx;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .key-btn {\n flex: 1;\n height: 100rpx;\n background: var(--prism-bg-color-card, #FFFFFF);\n border-radius: 12rpx;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n box-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.05);\n\n &:active {\n background: var(--prism-primary-color, #3478F6);\n transform: scale(0.98);\n\n .key-text, .fa {\n color: $color-white;\n }\n }\n\n .key-text {\n font-size: 44rpx;\n font-weight: 500;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .fa {\n font-size: 40rpx;\n color: var(--prism-text-primary, #1D2129);\n }\n\n &.func {\n background: var(--prism-bg-color, #E8E8E8);\n\n .key-text {\n font-size: 28rpx;\n color: var(--prism-text-secondary, #86909C);\n }\n }\n\n &.delete {\n background: var(--prism-bg-color, #E8E8E8);\n\n .delete-text {\n font-size: 28rpx;\n font-weight: 500;\n color: var(--prism-danger-color, #F53F3F);\n }\n }\n }\n\n @keyframes blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n }\n}\n\n.dark-mode .prism-secure-input {\n .password-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 .password-dot {\n background: var(--prism-text-primary, #E5E6EB);\n }\n }\n\n .keyboard-content {\n background: var(--prism-bg-color, #1A1A1A);\n }\n\n .keyboard-header {\n background: var(--prism-bg-color-card, #242424);\n\n .keyboard-title {\n color: var(--prism-text-primary, #E5E6EB);\n }\n }\n\n .key-btn {\n background: var(--prism-bg-color-card, #242424);\n\n .key-text {\n color: var(--prism-text-primary, #E5E6EB);\n }\n\n .fa {\n color: var(--prism-text-primary, #E5E6EB);\n }\n\n &.func, &.delete {\n background: rgba(255, 255, 255, 0.1);\n }\n }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismSecureInput/PrismSecureInput.vue'\nwx.createComponent(Component)"],"names":["useAppStore","ref","computed","watch","onMounted","Component"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA6DA,UAAM,QAAQ;AAmBd,UAAM,OAAO;AAEb,UAAM,WAAWA,UAAAA,YAAW;AAC5B,UAAM,gBAAgBC,cAAAA,IAAI,MAAM,UAAU;AAC1C,UAAM,YAAYA,cAAAA,IAAI,KAAK;AAC3B,UAAM,eAAeA,cAAAA,IAAI,KAAK;AAG9B,UAAM,iBAAiBA,cAAAA,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAE7E,UAAM,gBAAgBC,cAAAA,SAAS,MAAM;AACnC,aAAO,cAAc,MAAM,MAAM,EAAE,EAAE,MAAM,GAAG,MAAM,MAAM;AAAA,IAC5D,CAAC;AAGD,aAAS,iBAAiB;AACxB,UAAI,MAAM,aAAa;AACrB,cAAM,MAAM,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAC7D,iBAAS,IAAI,IAAI,SAAS,GAAG,IAAI,GAAG,KAAK;AACvC,gBAAM,IAAI,KAAK,MAAM,KAAK,YAAY,IAAI,EAAE;AAC5C,WAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAAA,QACpC;AACA,uBAAe,QAAQ;AAAA,MACzB;AAAA,IACF;AAEA,aAAS,oBAAoB;AAC3B,gBAAU,QAAQ;AAClB,mBAAa,QAAQ;AACrB,UAAI,MAAM,aAAa;AACrB,uBAAc;AAAA,MAChB;AAAA,IACF;AAEA,aAAS,eAAe;AACtB,gBAAU,QAAQ;AAClB,mBAAa,QAAQ;AAAA,IACvB;AAEA,aAAS,YAAY,GAAG;AACtB,UAAI,cAAc,MAAM,UAAU,MAAM,OAAQ;AAEhD,oBAAc,SAAS;AACvB,WAAK,qBAAqB,cAAc,KAAK;AAE7C,UAAI,cAAc,MAAM,WAAW,MAAM,QAAQ;AAC/C,aAAK,YAAY,cAAc,KAAK;AACpC,mBAAW,MAAM;AACf,uBAAY;AAAA,QACd,GAAG,GAAG;AAAA,MACR;AAAA,IACF;AAEA,aAAS,eAAe;AACtB,UAAI,cAAc,MAAM,SAAS,GAAG;AAClC,sBAAc,QAAQ,cAAc,MAAM,MAAM,GAAG,EAAE;AACrD,aAAK,qBAAqB,cAAc,KAAK;AAAA,MAC/C;AAAA,IACF;AAEA,aAAS,WAAW;AAClB,oBAAc,QAAQ;AACtB,WAAK,qBAAqB,EAAE;AAAA,IAC9B;AAEAC,kBAAAA,MAAM,MAAM,MAAM,YAAY,CAAC,QAAQ;AACrC,oBAAc,QAAQ;AAAA,IACxB,CAAC;AAEDC,kBAAAA,UAAU,MAAM;AACd,UAAI,MAAM,aAAa;AACrB,uBAAc;AAAA,MAChB;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxJD,GAAG,gBAAgBC,SAAS;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PrismSticky.js","sources":["components/PrismSticky/PrismSticky.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21TdGlja3kvUHJpc21TdGlja3kudnVl"],"sourcesContent":["<template>\n <view class=\"prism-sticky\">\n <view class=\"prism-sticky__wrap\" :class=\"[elClass]\" :style=\"wrapStyle\">\n <view\n class=\"prism-sticky__content\"\n :style=\"{\n position: fixed ? 'fixed' : 'static',\n top: stickyTop + 'px',\n left: left + 'px',\n width: width === 'auto' ? 'auto' : width + 'px',\n zIndex: zIndex,\n background: bgColor\n }\"\n >\n <slot></slot>\n </view>\n </view>\n </view>\n</template>\n\n<script setup>\nimport { ref, computed, watch, onMounted, getCurrentInstance } from 'vue';\n\nconst props = defineProps({\n // 吸顶时距离顶部的距离(rpx)\n offsetTop: {\n type: Number,\n default: 0\n },\n // 自定义导航栏高度(px)\n navHeight: {\n type: Number,\n default: 0\n },\n // 是否开启吸顶\n enabled: {\n type: Boolean,\n default: true\n },\n // 背景颜色\n bgColor: {\n type: String,\n default: ''\n },\n // z-index\n zIndex: {\n type: Number,\n default: 100\n }\n});\n\nconst emit = defineEmits(['fixed', 'unfixed']);\n\nconst instance = getCurrentInstance();\n\n// 生成唯一类名\nconst elClass = ref('prism-sticky-' + Math.random().toString(36).slice(2, 10));\n\n// 状态\nconst fixed = ref(false);\nconst height = ref('auto');\nconst width = ref('auto');\nconst left = ref(0);\nconst stickyTop = ref(0);\n\n// 观察器\nlet observer = null;\n\n// 包裹层样式\nconst wrapStyle = computed(() => ({\n height: fixed.value ? height.value + 'px' : 'auto',\n zIndex: props.zIndex\n}));\n\n// 初始化观察器\nfunction initObserver() {\n if (!props.enabled) return;\n\n // 计算吸顶位置\n // #ifdef H5\n stickyTop.value = props.navHeight + (props.offsetTop ? uni.upx2px(props.offsetTop) : 0);\n // #endif\n // #ifndef H5\n stickyTop.value = props.navHeight + (props.offsetTop ? uni.upx2px(props.offsetTop) : 0);\n // #endif\n\n disconnectObserver();\n\n // 获取元素信息\n const query = uni.createSelectorQuery().in(instance.proxy);\n query.select('.' + elClass.value).boundingClientRect((res) => {\n if (res) {\n height.value = res.height;\n left.value = res.left;\n width.value = res.width;\n connectObserver();\n }\n }).exec();\n}\n\n// 连接观察器\nfunction connectObserver() {\n disconnectObserver();\n\n observer = uni.createIntersectionObserver(instance.proxy, {\n thresholds: [0.95, 0.98, 1]\n });\n\n observer.relativeToViewport({\n top: -stickyTop.value\n });\n\n observer.observe('.' + elClass.value, (res) => {\n if (!props.enabled) return;\n setFixed(res.boundingClientRect.top);\n });\n}\n\n// 设置固定状态\nfunction setFixed(top) {\n const isFixed = top < stickyTop.value;\n if (isFixed && !fixed.value) {\n emit('fixed');\n } else if (!isFixed && fixed.value) {\n emit('unfixed');\n }\n fixed.value = isFixed;\n}\n\n// 断开观察器\nfunction disconnectObserver() {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n}\n\n// 监听属性变化\nwatch(() => props.offsetTop, () => initObserver());\nwatch(() => props.navHeight, () => initObserver());\nwatch(() => props.enabled, (val) => {\n if (!val) {\n fixed.value = false;\n disconnectObserver();\n } else {\n initObserver();\n }\n});\n\nonMounted(() => {\n setTimeout(() => {\n initObserver();\n }, 50);\n});\n</script>\n\n<style lang=\"scss\">\n.prism-sticky {\n position: relative;\n}\n\n.prism-sticky__wrap {\n position: relative;\n}\n\n.prism-sticky__content {\n background: var(--prism-bg-color-card, #FFFFFF);\n\n .dark-mode & {\n background: var(--prism-bg-color-card, #242424);\n }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismSticky/PrismSticky.vue'\nwx.createComponent(Component)"],"names":["getCurrentInstance","ref","computed","uni","watch","onMounted","Component"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,UAAM,QAAQ;AA4Bd,UAAM,OAAO;AAEb,UAAM,WAAWA,cAAAA,mBAAkB;AAGnC,UAAM,UAAUC,cAAAA,IAAI,kBAAkB,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAG7E,UAAM,QAAQA,cAAAA,IAAI,KAAK;AACvB,UAAM,SAASA,cAAAA,IAAI,MAAM;AACzB,UAAM,QAAQA,cAAAA,IAAI,MAAM;AACxB,UAAM,OAAOA,cAAAA,IAAI,CAAC;AAClB,UAAM,YAAYA,cAAAA,IAAI,CAAC;AAGvB,QAAI,WAAW;AAGf,UAAM,YAAYC,cAAAA,SAAS,OAAO;AAAA,MAChC,QAAQ,MAAM,QAAQ,OAAO,QAAQ,OAAO;AAAA,MAC5C,QAAQ,MAAM;AAAA,IAChB,EAAE;AAGF,aAAS,eAAe;AACtB,UAAI,CAAC,MAAM,QAAS;AAOpB,gBAAU,QAAQ,MAAM,aAAa,MAAM,YAAYC,cAAAA,MAAI,OAAO,MAAM,SAAS,IAAI;AAGrF,yBAAkB;AAGlB,YAAM,QAAQA,cAAAA,MAAI,oBAAmB,EAAG,GAAG,SAAS,KAAK;AACzD,YAAM,OAAO,MAAM,QAAQ,KAAK,EAAE,mBAAmB,CAAC,QAAQ;AAC5D,YAAI,KAAK;AACP,iBAAO,QAAQ,IAAI;AACnB,eAAK,QAAQ,IAAI;AACjB,gBAAM,QAAQ,IAAI;AAClB,0BAAe;AAAA,QACjB;AAAA,MACF,CAAC,EAAE,KAAI;AAAA,IACT;AAGA,aAAS,kBAAkB;AACzB,yBAAkB;AAElB,iBAAWA,cAAAA,MAAI,2BAA2B,SAAS,OAAO;AAAA,QACxD,YAAY,CAAC,MAAM,MAAM,CAAC;AAAA,MAC9B,CAAG;AAED,eAAS,mBAAmB;AAAA,QAC1B,KAAK,CAAC,UAAU;AAAA,MACpB,CAAG;AAED,eAAS,QAAQ,MAAM,QAAQ,OAAO,CAAC,QAAQ;AAC7C,YAAI,CAAC,MAAM,QAAS;AACpB,iBAAS,IAAI,mBAAmB,GAAG;AAAA,MACrC,CAAC;AAAA,IACH;AAGA,aAAS,SAAS,KAAK;AACrB,YAAM,UAAU,MAAM,UAAU;AAChC,UAAI,WAAW,CAAC,MAAM,OAAO;AAC3B,aAAK,OAAO;AAAA,MACd,WAAW,CAAC,WAAW,MAAM,OAAO;AAClC,aAAK,SAAS;AAAA,MAChB;AACA,YAAM,QAAQ;AAAA,IAChB;AAGA,aAAS,qBAAqB;AAC5B,UAAI,UAAU;AACZ,iBAAS,WAAU;AACnB,mBAAW;AAAA,MACb;AAAA,IACF;AAGAC,kBAAAA,MAAM,MAAM,MAAM,WAAW,MAAM,aAAY,CAAE;AACjDA,kBAAAA,MAAM,MAAM,MAAM,WAAW,MAAM,aAAY,CAAE;AACjDA,kBAAAA,MAAM,MAAM,MAAM,SAAS,CAAC,QAAQ;AAClC,UAAI,CAAC,KAAK;AACR,cAAM,QAAQ;AACd,2BAAkB;AAAA,MACpB,OAAO;AACL,qBAAY;AAAA,MACd;AAAA,IACF,CAAC;AAEDC,kBAAAA,UAAU,MAAM;AACd,iBAAW,MAAM;AACf,qBAAY;AAAA,MACd,GAAG,EAAE;AAAA,IACP,CAAC;;;;;;;;;;;;;;;ACxJD,GAAG,gBAAgBC,SAAS;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PrismSwiper.js","sources":["components/PrismSwiper/PrismSwiper.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21Td2lwZXIvUHJpc21Td2lwZXIudnVl"],"sourcesContent":["<template>\n <view class=\"prism-swiper\" :class=\"{ 'dark-mode': isDarkMode, 'prism-swiper--preview': displayMode === 'preview' }\">\n <swiper\n class=\"prism-swiper__container\"\n :class=\"{ 'prism-swiper__container--preview': displayMode === 'preview' }\"\n :style=\"{ height: height }\"\n :indicator-dots=\"false\"\n :autoplay=\"autoplay\"\n :circular=\"circular\"\n :interval=\"interval\"\n :duration=\"duration\"\n :current=\"currentIndex\"\n :previous-margin=\"displayMode === 'preview' ? previousMargin : '0'\"\n :next-margin=\"displayMode === 'preview' ? nextMargin : '0'\"\n @change=\"onChange\"\n >\n <swiper-item v-for=\"(item, index) in list\" :key=\"index\">\n <view\n class=\"prism-swiper__item\"\n :class=\"{\n 'prism-swiper__item--preview': displayMode === 'preview',\n 'prism-swiper__item--active': displayMode === 'preview' && currentIndex === index\n }\"\n :style=\"itemStyle(item)\"\n @click=\"onItemClick(item, index)\"\n >\n <image v-if=\"item.image\" class=\"prism-swiper__image\" :src=\"item.image\" mode=\"aspectFill\" />\n <view v-else-if=\"item.color\" class=\"prism-swiper__color\" :style=\"{ background: item.color }\">\n <text v-if=\"item.text\" class=\"prism-swiper__text\">{{ item.text }}</text>\n </view>\n <slot v-else :item=\"item\" :index=\"index\"></slot>\n </view>\n </swiper-item>\n </swiper>\n\n <!-- 自定义指示器 -->\n <!-- 圆点指示器 -->\n <view v-if=\"indicatorType === 'dots'\" class=\"prism-swiper__dots\">\n <view\n v-for=\"(item, index) in list\"\n :key=\"index\"\n class=\"prism-swiper__dot\"\n :class=\"{ 'prism-swiper__dot--active': currentIndex === index }\"\n @click=\"goToSlide(index)\"\n ></view>\n </view>\n\n <!-- 数字指示器 -->\n <view v-else-if=\"indicatorType === 'number'\" class=\"prism-swiper__number\">\n <text>{{ currentIndex + 1 }}</text>\n <text class=\"prism-swiper__number-divider\">/</text>\n <text>{{ list.length }}</text>\n </view>\n\n <!-- 预览图指示器 -->\n <view v-else-if=\"indicatorType === 'thumbnails'\" class=\"prism-swiper__thumbnails\">\n <view\n v-for=\"(item, index) in list\"\n :key=\"index\"\n class=\"prism-swiper__thumbnail\"\n :class=\"{ 'prism-swiper__thumbnail--active': currentIndex === index }\"\n @click=\"goToSlide(index)\"\n >\n <image v-if=\"item.image\" class=\"prism-swiper__thumbnail-image\" :src=\"item.image\" mode=\"aspectFill\" />\n <view v-else class=\"prism-swiper__thumbnail-color\" :style=\"{ background: item.color || '#ccc' }\"></view>\n </view>\n </view>\n\n <!-- 手风琴指示器 -->\n <view v-else-if=\"indicatorType === 'accordion'\" class=\"prism-swiper__accordion\">\n <view\n v-for=\"(item, index) in list\"\n :key=\"index\"\n class=\"prism-swiper__accordion-item\"\n :class=\"{ 'prism-swiper__accordion-item--active': currentIndex === index }\"\n @click=\"goToSlide(index)\"\n >\n <view class=\"prism-swiper__accordion-bar\"></view>\n </view>\n </view>\n </view>\n</template>\n\n<script setup>\nimport { ref } from 'vue';\n\nconst props = defineProps({\n list: {\n type: Array,\n default: () => []\n },\n height: {\n type: String,\n default: '300rpx'\n },\n displayMode: {\n type: String,\n default: 'normal', // 'normal' | 'preview'\n validator: (value) => ['normal', 'preview'].includes(value)\n },\n previousMargin: {\n type: String,\n default: '60rpx'\n },\n nextMargin: {\n type: String,\n default: '60rpx'\n },\n indicatorType: {\n type: String,\n default: 'dots', // 'dots' | 'number' | 'thumbnails' | 'accordion'\n validator: (value) => ['dots', 'number', 'thumbnails', 'accordion'].includes(value)\n },\n autoplay: {\n type: Boolean,\n default: true\n },\n circular: {\n type: Boolean,\n default: true\n },\n interval: {\n type: Number,\n default: 3000\n },\n duration: {\n type: Number,\n default: 500\n },\n radius: {\n type: String,\n default: '16rpx'\n },\n isDarkMode: {\n type: Boolean,\n default: false\n }\n});\n\nconst emit = defineEmits(['change', 'click']);\n\nconst currentIndex = ref(0);\n\nfunction itemStyle(item) {\n return {\n borderRadius: props.radius\n };\n}\n\nfunction onChange(e) {\n currentIndex.value = e.detail.current;\n emit('change', e.detail.current);\n}\n\nfunction onItemClick(item, index) {\n emit('click', { item, index });\n}\n\nfunction goToSlide(index) {\n currentIndex.value = index;\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.prism-swiper {\n position: relative;\n width: 100%;\n}\n\n.prism-swiper__container {\n width: 100%;\n}\n\n.prism-swiper__item {\n width: 100%;\n height: 100%;\n overflow: hidden;\n transition: all 0.3s ease;\n}\n\n/* 预览模式样式 */\n.prism-swiper--preview {\n .prism-swiper__item--preview {\n opacity: 0.6;\n transform: scale(0.9);\n\n &.prism-swiper__item--active {\n opacity: 1;\n transform: scale(1);\n }\n }\n}\n\n.prism-swiper__image {\n width: 100%;\n height: 100%;\n display: block;\n}\n\n.prism-swiper__color {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.prism-swiper__text {\n font-size: 32rpx;\n color: #ffffff;\n font-weight: 500;\n}\n\n/* 圆点指示器 */\n.prism-swiper__dots {\n position: absolute;\n bottom: 16rpx;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n gap: 12rpx;\n z-index: 10;\n}\n\n.prism-swiper__dot {\n width: 12rpx;\n height: 12rpx;\n border-radius: 50%;\n background: rgba(255, 255, 255, 0.5);\n transition: all 0.3s ease;\n cursor: pointer;\n\n &--active {\n width: 32rpx;\n border-radius: 6rpx;\n background: #FFFFFF;\n }\n}\n\n/* 数字指示器 */\n.prism-swiper__number {\n position: absolute;\n bottom: 16rpx;\n right: 16rpx;\n padding: 8rpx 16rpx;\n background: rgba(0, 0, 0, 0.5);\n border-radius: 20rpx;\n display: flex;\n align-items: center;\n gap: 4rpx;\n font-size: 24rpx;\n color: #FFFFFF;\n z-index: 10;\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n}\n\n.prism-swiper__number-divider {\n margin: 0 4rpx;\n opacity: 0.7;\n}\n\n/* 预览图指示器 */\n.prism-swiper__thumbnails {\n position: absolute;\n bottom: 16rpx;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n gap: 12rpx;\n z-index: 10;\n}\n\n.prism-swiper__thumbnail {\n width: 80rpx;\n height: 60rpx;\n border-radius: 8rpx;\n overflow: hidden;\n border: 3rpx solid rgba(255, 255, 255, 0.5);\n transition: all 0.3s ease;\n cursor: pointer;\n\n &--active {\n border-color: #FFFFFF;\n box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.3);\n }\n}\n\n.prism-swiper__thumbnail-image,\n.prism-swiper__thumbnail-color {\n width: 100%;\n height: 100%;\n display: block;\n}\n\n/* 手风琴指示器 */\n.prism-swiper__accordion {\n position: absolute;\n bottom: 16rpx;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n gap: 8rpx;\n z-index: 10;\n}\n\n.prism-swiper__accordion-item {\n height: 6rpx;\n border-radius: 3rpx;\n overflow: hidden;\n cursor: pointer;\n}\n\n.prism-swiper__accordion-bar {\n width: 100%;\n height: 100%;\n background: rgba(255, 255, 255, 0.5);\n transition: all 0.3s ease;\n}\n\n.prism-swiper__accordion-item {\n width: 40rpx;\n\n &--active {\n width: 80rpx;\n\n .prism-swiper__accordion-bar {\n background: #FFFFFF;\n }\n }\n}\n\n/* 深色模式适配 */\n.dark-mode {\n .prism-swiper__number {\n background: rgba(255, 255, 255, 0.15);\n }\n}\n</style>","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismSwiper/PrismSwiper.vue'\nwx.createComponent(Component)"],"names":["ref"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsFA,UAAM,QAAQ;AAqDd,UAAM,OAAO;AAEb,UAAM,eAAeA,cAAAA,IAAI,CAAC;AAE1B,aAAS,UAAU,MAAM;AACvB,aAAO;AAAA,QACL,cAAc,MAAM;AAAA,MACxB;AAAA,IACA;AAEA,aAAS,SAAS,GAAG;AACnB,mBAAa,QAAQ,EAAE,OAAO;AAC9B,WAAK,UAAU,EAAE,OAAO,OAAO;AAAA,IACjC;AAEA,aAAS,YAAY,MAAM,OAAO;AAChC,WAAK,SAAS,EAAE,MAAM,MAAK,CAAE;AAAA,IAC/B;AAEA,aAAS,UAAU,OAAO;AACxB,mBAAa,QAAQ;AAAA,IACvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/JA,GAAG,gBAAgB,SAAS;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PrismSwitch.js","sources":["components/PrismSwitch/PrismSwitch.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21Td2l0Y2gvUHJpc21Td2l0Y2gudnVl"],"sourcesContent":["<template>\n <view\n class=\"prism-switch-component\"\n :class=\"{\n 'dark-mode': appStore.isDarkMode,\n 'active': modelValue,\n 'square': square,\n 'disabled': disabled,\n 'with-text': showText\n }\"\n @click=\"handleToggle\"\n >\n <!-- 文字显示 -->\n <view class=\"switch-text off-text\" v-if=\"showText\">{{ offText }}</view>\n <view class=\"switch-text on-text\" v-if=\"showText\">{{ onText }}</view>\n <!-- 滑块 -->\n <view class=\"switch-thumb\"></view>\n </view>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport { useAppStore } from '@/store/app';\n\nconst props = defineProps({\n modelValue: {\n type: Boolean,\n default: false\n },\n // 开启时文字\n onText: {\n type: String,\n default: 'ON'\n },\n // 关闭时文字\n offText: {\n type: String,\n default: 'OFF'\n },\n // 是否显示文字\n showText: {\n type: Boolean,\n default: false\n },\n // 方形开关\n square: {\n type: Boolean,\n default: false\n },\n // 禁用状态\n disabled: {\n type: Boolean,\n default: false\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'change']);\n\nconst appStore = useAppStore();\n\nfunction handleToggle() {\n if (props.disabled) return;\n const newValue = !props.modelValue;\n emit('update:modelValue', newValue);\n emit('change', newValue);\n}\n</script>\n\n<style lang=\"scss\">\n.prism-switch-component {\n position: relative;\n width: 100rpx;\n height: 56rpx;\n background: var(--prism-border-color-base, #E5E6EB);\n border-radius: 28rpx;\n transition: all 0.3s ease;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n\n // 滑块\n .switch-thumb {\n position: absolute;\n top: 4rpx;\n left: 4rpx;\n width: 48rpx;\n height: 48rpx;\n background: #FFFFFF;\n border-radius: 50%;\n box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.15);\n transition: all 0.3s ease;\n z-index: 2;\n }\n\n // 文字样式\n .switch-text {\n position: absolute;\n font-size: 20rpx;\n font-weight: 500;\n transition: all 0.3s ease;\n z-index: 1;\n white-space: nowrap;\n }\n\n .on-text {\n left: 10rpx;\n color: transparent;\n }\n\n .off-text {\n right: 10rpx;\n color: var(--prism-text-secondary, #86909C);\n }\n\n // 激活状态\n &.active {\n background: var(--prism-primary-color, #3478F6);\n\n .switch-thumb {\n left: calc(100% - 52rpx);\n }\n\n .on-text {\n color: #FFFFFF;\n }\n\n .off-text {\n color: transparent;\n }\n }\n\n // 带文字时宽度稍大\n &.with-text {\n width: 88rpx;\n height: 48rpx;\n\n .switch-thumb {\n width: 40rpx;\n height: 40rpx;\n top: 4rpx;\n left: 4rpx;\n }\n\n .on-text {\n left: 8rpx;\n }\n\n .off-text {\n right: 8rpx;\n }\n\n &.active .switch-thumb {\n left: calc(100% - 44rpx);\n }\n }\n\n // 方形开关\n &.square {\n border-radius: 12rpx;\n\n .switch-thumb {\n border-radius: 8rpx;\n }\n }\n\n // 禁用状态\n &.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n }\n}\n\n// 深色模式\n.dark-mode.prism-switch-component {\n // 关闭状态 - 与checkbox保持一致\n background: var(--prism-bg-color-card, #1A1A1A);\n border: 2rpx solid var(--prism-border-color-base, #3A3A3A);\n\n .switch-thumb {\n background: var(--prism-text-secondary, #86909C);\n }\n\n .off-text {\n color: var(--prism-text-secondary, #86909C);\n }\n\n // 开启状态 - 蓝色(与checkbox一致)\n &.active {\n background: var(--prism-primary-color, #3478F6);\n border-color: var(--prism-primary-color, #3478F6);\n\n .switch-thumb {\n background: #FFFFFF;\n }\n\n .on-text {\n color: #FFFFFF;\n }\n }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismSwitch/PrismSwitch.vue'\nwx.createComponent(Component)"],"names":["useAppStore","Component"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,UAAM,QAAQ;AAgCd,UAAM,OAAO;AAEb,UAAM,WAAWA,UAAAA,YAAW;AAE5B,aAAS,eAAe;AACtB,UAAI,MAAM,SAAU;AACpB,YAAM,WAAW,CAAC,MAAM;AACxB,WAAK,qBAAqB,QAAQ;AAClC,WAAK,UAAU,QAAQ;AAAA,IACzB;;;;;;;;;;;;;;;;;;;;;AChEA,GAAG,gBAAgBC,SAAS;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PrismTabBar.js","sources":["components/PrismTabBar/PrismTabBar.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21UYWJCYXIvUHJpc21UYWJCYXIudnVl"],"sourcesContent":["<template>\n <view class=\"prism-tabbar\" :class=\"{ 'dark-mode': appStore.isDarkMode, 'glass-effect': glass, 'wechat-browser': isWechatBrowser }\">\n <view\n class=\"prism-tabbar-item\"\n v-for=\"(item, index) in tabList\"\n :key=\"index\"\n :class=\"{ active: currentPath === item.path }\"\n @click=\"switchTab(item.path)\"\n >\n <view class=\"prism-tabbar-icon-wrapper\" :class=\"{ active: currentPath === item.path }\">\n <text class=\"fa prism-tabbar-icon\" :class=\"item.icon\"></text>\n </view>\n <text class=\"prism-tabbar-text\">{{ item.text }}</text>\n </view>\n </view>\n</template>\n\n<script setup>\nimport { computed, ref, onMounted } from 'vue';\nimport { useAppStore } from '@/store/app';\n\nconst props = defineProps({\n current: {\n type: String,\n default: ''\n },\n glass: {\n type: Boolean,\n default: true\n },\n tabs: {\n type: Array,\n default: () => [\n { path: '/pages/index/index', text: '首页', icon: 'fa-home' },\n { path: '/pages/icons/icons', text: '图标', icon: 'fa-icons' },\n { path: '/pages/examples/examples', text: '案例', icon: 'fa-layer-group' },\n { path: '/pages/tools/tools', text: '工具', icon: 'fa-screwdriver-wrench' }\n ]\n }\n});\n\nconst appStore = useAppStore();\nconst currentPath = computed(() => props.current);\nconst tabList = computed(() => props.tabs);\n\n// 检测是否是微信浏览器\nconst isWechatBrowser = ref(false);\nonMounted(() => {\n // #ifdef H5\n const ua = navigator.userAgent.toLowerCase();\n isWechatBrowser.value = ua.includes('micromessenger');\n // #endif\n});\n\nfunction switchTab(path) {\n if (currentPath.value === path) return;\n uni.reLaunch({ url: path });\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.prism-tabbar {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n align-items: center;\n justify-content: space-around;\n padding: 15rpx 0;\n padding-bottom: env(safe-area-inset-bottom, 0px);\n z-index: 999;\n background: var(--prism-bg-color-card);\n border-top: 1rpx solid var(--prism-border-color-light);\n\n // 微信浏览器下添加额外底部间距\n &.wechat-browser {\n padding-bottom: calc(60rpx + env(safe-area-inset-bottom, 0px));\n }\n\n /* #ifndef H5 */\n &.glass-effect {\n background: rgba(255, 255, 255, 0.4);\n backdrop-filter: saturate(180%) blur(40px);\n -webkit-backdrop-filter: saturate(180%) blur(40px);\n border-top: 1rpx solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.06);\n }\n /* #endif */\n}\n\n.prism-tabbar-item {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 4rpx;\n\n &.active {\n .prism-tabbar-icon,\n .prism-tabbar-text {\n color: var(--prism-primary-color, #3478F6);\n }\n }\n}\n\n.prism-tabbar-icon-wrapper {\n width: 48rpx;\n height: 48rpx;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);\n\n &.active {\n transform: translateY(-4rpx) scale(1.1);\n }\n}\n\n.prism-tabbar-icon {\n font-size: 36rpx;\n color: var(--prism-text-secondary, #86909C);\n line-height: 1;\n display: block;\n transition: all 0.3s ease;\n}\n\n.prism-tabbar-icon-wrapper.active .prism-tabbar-icon {\n color: var(--prism-primary-color, #3478F6);\n -webkit-text-stroke: 0.5px var(--prism-primary-color, #3478F6);\n}\n\n.prism-tabbar-text {\n font-size: 20rpx;\n color: var(--prism-text-secondary, #86909C);\n}\n\n/* 深色模式 - 毛玻璃效果 */\n/* #ifndef H5 */\n.prism-tabbar.dark-mode.glass-effect {\n background: rgba(26, 26, 26, 0.4);\n border-top-color: rgba(255, 255, 255, 0.12);\n box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.4);\n}\n/* #endif */\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismTabBar/PrismTabBar.vue'\nwx.createComponent(Component)"],"names":["useAppStore","computed","ref","onMounted","uni"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,UAAM,QAAQ;AAoBd,UAAM,WAAWA,UAAAA,YAAW;AAC5B,UAAM,cAAcC,cAAAA,SAAS,MAAM,MAAM,OAAO;AAChD,UAAM,UAAUA,cAAAA,SAAS,MAAM,MAAM,IAAI;AAGzC,UAAM,kBAAkBC,cAAAA,IAAI,KAAK;AACjCC,kBAAAA,UAAU,MAAM;AAAA,IAKhB,CAAC;AAED,aAAS,UAAU,MAAM;AACvB,UAAI,YAAY,UAAU,KAAM;AAChCC,oBAAAA,MAAI,SAAS,EAAE,KAAK,KAAI,CAAE;AAAA,IAC5B;;;;;;;;;;;;;;;;;;;;;ACxDA,GAAG,gBAAgB,SAAS;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PrismTabs.js","sources":["components/PrismTabs/PrismTabs.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21UYWJzL1ByaXNtVGFicy52dWU"],"sourcesContent":["<template>\n <view class=\"prism-tabs-container\" :class=\"{ 'prism-tabs-container--chrome': type === 'chrome' }\">\n <view class=\"prism-tabs-wrapper\" :class=\"[`prism-tabs--${type}`]\">\n <view\n v-for=\"(item, index) in tabs\"\n :key=\"index\"\n class=\"prism-tabs__item\"\n :class=\"{ 'active': modelValue === index }\"\n @click=\"handleClick(index)\"\n >\n <text>{{ item.label || item }}</text>\n <text v-if=\"item.badge !== undefined\" class=\"prism-tabs__badge\">{{ item.badge }}</text>\n </view>\n </view>\n <!-- Chrome 类型的内容区域插槽 -->\n <view v-if=\"type === 'chrome'\" class=\"prism-tabs__content\">\n <slot></slot>\n </view>\n </view>\n</template>\n\n<script setup>\ndefineProps({\n tabs: {\n type: Array,\n required: true\n // 格式: ['标签1', '标签2'] 或 [{ label: '标签1', badge: 10 }]\n },\n modelValue: {\n type: Number,\n default: 0\n },\n type: {\n type: String,\n default: 'line' // 'line' | 'card' | 'chrome'\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'change']);\n\nfunction handleClick(index) {\n emit('update:modelValue', index);\n emit('change', index);\n}\n</script>\n\n<style lang=\"scss\">\n/* 样式已移至 src/styles/navigation.scss */\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismTabs/PrismTabs.vue'\nwx.createComponent(Component)"],"names":["Component"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAsCA,UAAM,OAAO;AAEb,aAAS,YAAY,OAAO;AAC1B,WAAK,qBAAqB,KAAK;AAC/B,WAAK,UAAU,KAAK;AAAA,IACtB;;;;;;;;;;;;;;;;;;;;;;;AC1CA,GAAG,gBAAgBA,SAAS;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PrismVoiceInput.js","sources":["components/PrismVoiceInput/PrismVoiceInput.vue","../uniComponent:/RTovZ2l0L3J1aXhpbi1naXRsYWIvcnVpeGluLWtlaWppL3J1aXhpbi1wcmlzbS11aS11bmlBcHAvc3JjL2NvbXBvbmVudHMvUHJpc21Wb2ljZUlucHV0L1ByaXNtVm9pY2VJbnB1dC52dWU"],"sourcesContent":["<template>\n <view class=\"prism-voice-input\" :class=\"{ 'dark-mode': appStore.isDarkMode }\">\n <!-- 模式1: 按钮模式(默认) -->\n <view\n v-if=\"mode === 'button'\"\n class=\"voice-btn\"\n :class=\"{ 'recording': isRecording }\"\n @touchstart.prevent=\"startRecording\"\n @touchend.prevent=\"stopRecording\"\n @touchcancel.prevent=\"cancelRecording\"\n >\n <view class=\"voice-icon-wrapper\">\n <text class=\"fa fa-microphone\"></text>\n <!-- 录音波纹动画 -->\n <view class=\"voice-waves\" v-if=\"isRecording\">\n <view class=\"wave wave-1\"></view>\n <view class=\"wave wave-2\"></view>\n <view class=\"wave wave-3\"></view>\n </view>\n </view>\n </view>\n\n <!-- 模式2: 弹窗模式 -->\n <view class=\"voice-panel\" v-if=\"mode === 'modal' && visible\" @click=\"handleCancel\">\n <view class=\"voice-content\" @click.stop>\n <view class=\"voice-title\">{{ title }}</view>\n <view class=\"voice-wave\" :class=\"{ 'recording': isRecording }\">\n <view class=\"wave-bar\" v-for=\"i in 5\" :key=\"i\"></view>\n </view>\n <view class=\"voice-time\">{{ formatTime(recordingTime) }}</view>\n <view class=\"voice-tip\">{{ isRecording ? '松开结束录音' : '按住开始录音' }}</view>\n <view class=\"voice-actions\">\n <view class=\"voice-cancel-btn\" @click=\"handleCancel\">\n <text class=\"fa fa-times\"></text>\n <text>取消</text>\n </view>\n <view\n class=\"voice-record-btn\"\n :class=\"{ 'recording': isRecording }\"\n @touchstart.prevent=\"startRecording\"\n @touchend.prevent=\"stopRecording\"\n @mousedown.prevent=\"startRecording\"\n @mouseup.prevent=\"stopRecording\"\n >\n <text class=\"fa fa-microphone\"></text>\n </view>\n <view class=\"voice-confirm-btn\" :class=\"{ 'disabled': !hasRecorded }\" @click=\"handleConfirm\">\n <text class=\"fa fa-check\"></text>\n <text>完成</text>\n </view>\n </view>\n </view>\n </view>\n\n <!-- 按钮模式的录音弹窗提示 -->\n <view class=\"voice-modal\" v-if=\"mode === 'button' && isRecording\" @click.stop>\n <view class=\"modal-content\">\n <view class=\"voice-animation\">\n <view class=\"voice-bar\" v-for=\"i in 5\" :key=\"i\" :style=\"{ animationDelay: `${i * 0.1}s` }\"></view>\n </view>\n <text class=\"voice-text\">{{ cancelHint ? '松开取消' : '正在录音...' }}</text>\n <text class=\"voice-tip-time\">{{ recordingTime }}s</text>\n </view>\n </view>\n </view>\n</template>\n\n<script setup>\nimport { ref, watch, onUnmounted } from 'vue';\nimport { useAppStore } from '@/store/app';\n\nconst props = defineProps({\n // 模式:button(按钮)或 modal(弹窗)\n mode: {\n type: String,\n default: 'button',\n validator: (val) => ['button', 'modal'].includes(val)\n },\n // 弹窗模式的可见性\n visible: {\n type: Boolean,\n default: false\n },\n // 弹窗标题\n title: {\n type: String,\n default: '语音输入'\n },\n // 最长录音时间(秒)\n maxDuration: {\n type: Number,\n default: 60\n }\n});\n\nconst emit = defineEmits(['update:visible', 'start', 'end', 'cancel', 'result', 'confirm']);\n\nconst appStore = useAppStore();\nconst isRecording = ref(false);\nconst cancelHint = ref(false);\nconst recordingTime = ref(0);\nconst hasRecorded = ref(false);\n\nlet recordingTimer = null;\nlet recorderManager = null;\n\n// 格式化时间\nfunction formatTime(seconds) {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${String(mins).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;\n}\n\nfunction startRecording() {\n isRecording.value = true;\n cancelHint.value = false;\n recordingTime.value = 0;\n hasRecorded.value = false;\n\n emit('start');\n\n // 开始计时\n recordingTimer = setInterval(() => {\n recordingTime.value++;\n if (recordingTime.value >= props.maxDuration) {\n stopRecording();\n }\n }, 1000);\n\n // 使用 uni-app 录音管理器\n // #ifdef APP-PLUS || MP-WEIXIN\n recorderManager = uni.getRecorderManager();\n recorderManager.onStop((res) => {\n if (!cancelHint.value) {\n emit('result', {\n tempFilePath: res.tempFilePath,\n duration: recordingTime.value\n });\n }\n });\n recorderManager.start({\n duration: props.maxDuration * 1000,\n format: 'mp3'\n });\n // #endif\n}\n\nfunction stopRecording() {\n if (!isRecording.value) return;\n\n isRecording.value = false;\n hasRecorded.value = recordingTime.value > 0;\n clearInterval(recordingTimer);\n\n emit('end', { duration: recordingTime.value });\n\n // #ifdef APP-PLUS || MP-WEIXIN\n if (recorderManager) {\n recorderManager.stop();\n }\n // #endif\n}\n\nfunction cancelRecording() {\n if (!isRecording.value && props.mode === 'button') return;\n\n cancelHint.value = true;\n isRecording.value = false;\n clearInterval(recordingTimer);\n\n emit('cancel');\n\n // #ifdef APP-PLUS || MP-WEIXIN\n if (recorderManager) {\n recorderManager.stop();\n }\n // #endif\n}\n\n// 弹窗模式 - 取消\nfunction handleCancel() {\n if (recordingTimer) {\n clearInterval(recordingTimer);\n recordingTimer = null;\n }\n isRecording.value = false;\n emit('cancel');\n closePanel();\n}\n\n// 弹窗模式 - 确认\nfunction handleConfirm() {\n if (!hasRecorded.value) return;\n\n uni.showLoading({ title: '识别中...' });\n\n setTimeout(() => {\n uni.hideLoading();\n emit('confirm', {\n duration: recordingTime.value\n });\n closePanel();\n uni.showToast({ title: '识别成功', icon: 'success' });\n }, 1500);\n}\n\n// 关闭弹窗\nfunction closePanel() {\n emit('update:visible', false);\n recordingTime.value = 0;\n hasRecorded.value = false;\n}\n\n// 监听 visible 变化,重置状态\nwatch(() => props.visible, (val) => {\n if (val) {\n isRecording.value = false;\n recordingTime.value = 0;\n hasRecorded.value = false;\n }\n});\n\nonUnmounted(() => {\n if (recordingTimer) {\n clearInterval(recordingTimer);\n }\n});\n</script>\n\n<style lang=\"scss\">\n.prism-voice-input {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n // ============ 按钮模式 ============\n .voice-btn {\n width: 80rpx;\n height: 80rpx;\n border-radius: 50%;\n background: var(--prism-primary-color, #3478F6);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.3s ease;\n position: relative;\n\n &:active, &.recording {\n transform: scale(1.1);\n box-shadow: 0 8rpx 24rpx rgba(52, 120, 246, 0.4);\n }\n\n .voice-icon-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .fa {\n font-size: 36rpx;\n color: #FFFFFF;\n z-index: 2;\n }\n }\n\n .voice-waves {\n position: absolute;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .wave {\n position: absolute;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 2rpx solid rgba(255, 255, 255, 0.5);\n animation: waveAnim 1.5s infinite ease-out;\n }\n\n .wave-1 { animation-delay: 0s; }\n .wave-2 { animation-delay: 0.5s; }\n .wave-3 { animation-delay: 1s; }\n }\n }\n\n .voice-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.6);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 9999;\n\n .modal-content {\n width: 300rpx;\n height: 300rpx;\n background: var(--prism-bg-color-card, #FFFFFF);\n border-radius: 24rpx;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 24rpx;\n }\n\n .voice-animation {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8rpx;\n height: 80rpx;\n\n .voice-bar {\n width: 8rpx;\n height: 40rpx;\n background: var(--prism-primary-color, #3478F6);\n border-radius: 4rpx;\n animation: voiceBarAnim 0.8s infinite ease-in-out alternate;\n }\n }\n\n .voice-text {\n font-size: 28rpx;\n color: var(--prism-text-primary, #1D2129);\n }\n\n .voice-tip-time {\n font-size: 48rpx;\n font-weight: 600;\n color: var(--prism-primary-color, #3478F6);\n }\n }\n\n @keyframes waveAnim {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 100% {\n transform: scale(2);\n opacity: 0;\n }\n }\n\n @keyframes voiceBarAnim {\n 0% { height: 20rpx; }\n 100% { height: 60rpx; }\n }\n\n // ============ 弹窗模式 ============\n .voice-panel {\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: center;\n justify-content: center;\n z-index: 9999;\n }\n\n .voice-content {\n width: 560rpx;\n background: var(--prism-bg-color-card, #FFFFFF);\n border-radius: 24rpx;\n padding: 40rpx;\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .voice-title {\n font-size: 32rpx;\n font-weight: 600;\n color: var(--prism-text-primary, #1D2129);\n margin-bottom: 40rpx;\n }\n\n .voice-wave {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12rpx;\n height: 100rpx;\n margin-bottom: 24rpx;\n\n .wave-bar {\n width: 8rpx;\n height: 20rpx;\n background: var(--prism-text-placeholder, #C9CDD4);\n border-radius: 4rpx;\n transition: all 0.3s;\n }\n\n &.recording .wave-bar {\n background: var(--prism-primary-color, #3478F6);\n animation: prism-voice-wave 0.5s ease-in-out infinite alternate;\n }\n\n &.recording .wave-bar:nth-child(1) { animation-delay: 0s; }\n &.recording .wave-bar:nth-child(2) { animation-delay: 0.1s; }\n &.recording .wave-bar:nth-child(3) { animation-delay: 0.2s; }\n &.recording .wave-bar:nth-child(4) { animation-delay: 0.3s; }\n &.recording .wave-bar:nth-child(5) { animation-delay: 0.4s; }\n }\n\n @keyframes prism-voice-wave {\n 0% { height: 20rpx; }\n 100% { height: 80rpx; }\n }\n\n .voice-time {\n font-size: 48rpx;\n font-weight: 600;\n color: var(--prism-text-primary, #1D2129);\n margin-bottom: 16rpx;\n }\n\n .voice-tip {\n font-size: 26rpx;\n color: var(--prism-text-secondary, #86909C);\n margin-bottom: 40rpx;\n }\n\n .voice-actions {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n }\n\n .voice-cancel-btn,\n .voice-confirm-btn {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8rpx;\n color: var(--prism-text-secondary, #86909C);\n\n .fa {\n width: 64rpx;\n height: 64rpx;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 28rpx;\n }\n\n text:last-child {\n font-size: 24rpx;\n }\n\n &:active {\n opacity: 0.7;\n }\n }\n\n .voice-cancel-btn .fa {\n color: var(--prism-danger-color, #F53F3F);\n background: rgba(245, 63, 63, 0.15);\n }\n\n .voice-confirm-btn {\n color: var(--prism-success-color, #00B42A);\n\n .fa {\n background: rgba(0, 180, 42, 0.15);\n color: #00B42A;\n }\n\n &.disabled {\n opacity: 0.4;\n pointer-events: none;\n }\n }\n\n .voice-record-btn {\n width: 120rpx;\n height: 120rpx;\n background: var(--prism-primary-color, #3478F6);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n\n .fa {\n font-size: 48rpx;\n color: #FFFFFF;\n }\n\n &:active,\n &.recording {\n transform: scale(1.1);\n background: var(--prism-primary-color-active, #2563EB);\n box-shadow: 0 0 0 16rpx rgba(52, 120, 246, 0.2);\n }\n }\n}\n\n// 深色模式\n.dark-mode.prism-voice-input {\n .voice-modal .modal-content,\n .voice-content {\n background: var(--prism-bg-color-card, #1A1A1A);\n }\n\n .voice-modal .voice-text,\n .voice-title,\n .voice-time {\n color: var(--prism-text-primary, #E5E6EB);\n }\n\n .voice-cancel-btn .fa,\n .voice-confirm-btn .fa {\n background: rgba(255, 255, 255, 0.1);\n }\n}\n</style>\n","import Component from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/components/PrismVoiceInput/PrismVoiceInput.vue'\nwx.createComponent(Component)"],"names":["useAppStore","ref","uni","watch","onUnmounted","Component"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useNavbar.js","sources":["composables/useNavbar.js"],"sourcesContent":["import { computed } from 'vue';\r\nimport { useAppStore } from '@/store/app';\r\n\r\n/**\r\n * 导航栏相关组合式函数\r\n * @returns {Object} 导航栏高度等信息\r\n */\r\nexport function useNavbar() {\r\n const appStore = useAppStore();\r\n\r\n // 导航栏内容高度(rpx 转 px)\r\n const navbarContentHeight = computed(() => {\r\n const systemInfo = uni.getSystemInfoSync();\r\n return 88 / 750 * systemInfo.windowWidth;\r\n });\r\n\r\n // 完整导航栏高度(状态栏 + 内容)\r\n const navbarHeight = computed(() => {\r\n return appStore.statusBarHeight + navbarContentHeight.value;\r\n });\r\n\r\n return {\r\n navbarHeight,\r\n navbarContentHeight\r\n };\r\n}\r\n"],"names":["useAppStore","computed","uni"],"mappings":";;;AAOO,SAAS,YAAY;AAC1B,QAAM,WAAWA,UAAAA;AAGjB,QAAM,sBAAsBC,cAAAA,SAAS,MAAM;AACzC,UAAM,aAAaC,oBAAI;AACvB,WAAO,KAAK,MAAM,WAAW;AAAA,EAC/B,CAAC;AAGD,QAAM,eAAeD,cAAAA,SAAS,MAAM;AAClC,WAAO,SAAS,kBAAkB,oBAAoB;AAAA,EACxD,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACJ;AACA;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"theme-colors.js","sources":["config/theme-colors.js"],"sourcesContent":["/**\r\n * 主题色配置\r\n * 用于运行时动态切换主题色\r\n */\r\n\r\nexport const themeColors = {\r\n blue: {\r\n name: '蓝色',\r\n primary: '#3478F6',\r\n primaryLight: '#EBF2FF',\r\n gradient: 'linear-gradient(135deg, #3478F6 0%, #86B8FA 100%)',\r\n gradientAlpha: 'linear-gradient(135deg, rgba(52, 120, 246, 0.08) 0%, rgba(134, 184, 250, 0.08) 100%)',\r\n gradientShadow: '0 8rpx 24rpx rgba(52, 120, 246, 0.3)',\r\n alpha15: 'rgba(52, 120, 246, 0.15)',\r\n alpha25: 'rgba(52, 120, 246, 0.25)',\r\n alpha35: 'rgba(52, 120, 246, 0.35)'\r\n },\r\n green: {\r\n name: '绿色',\r\n primary: '#00B42A',\r\n primaryLight: '#E8F7E8',\r\n gradient: 'linear-gradient(135deg, #00B42A 0%, #6EE7B7 100%)',\r\n gradientAlpha: 'linear-gradient(135deg, rgba(0, 180, 42, 0.08) 0%, rgba(110, 231, 183, 0.08) 100%)',\r\n gradientShadow: '0 8rpx 24rpx rgba(0, 180, 42, 0.3)',\r\n alpha15: 'rgba(0, 180, 42, 0.15)',\r\n alpha25: 'rgba(0, 180, 42, 0.25)',\r\n alpha35: 'rgba(0, 180, 42, 0.35)'\r\n },\r\n purple: {\r\n name: '紫色',\r\n primary: '#722ED1',\r\n primaryLight: '#F3E8FF',\r\n gradient: 'linear-gradient(135deg, #722ED1 0%, #B37FEB 100%)',\r\n gradientAlpha: 'linear-gradient(135deg, rgba(114, 46, 209, 0.08) 0%, rgba(179, 127, 235, 0.08) 100%)',\r\n gradientShadow: '0 8rpx 24rpx rgba(114, 46, 209, 0.3)',\r\n alpha15: 'rgba(114, 46, 209, 0.15)',\r\n alpha25: 'rgba(114, 46, 209, 0.25)',\r\n alpha35: 'rgba(114, 46, 209, 0.35)'\r\n },\r\n orange: {\r\n name: '橙色',\r\n primary: '#FF7D00',\r\n primaryLight: '#FFF3E8',\r\n gradient: 'linear-gradient(135deg, #FF7D00 0%, #FDBA74 100%)',\r\n gradientAlpha: 'linear-gradient(135deg, rgba(255, 125, 0, 0.08) 0%, rgba(253, 186, 116, 0.08) 100%)',\r\n gradientShadow: '0 8rpx 24rpx rgba(255, 125, 0, 0.3)',\r\n alpha15: 'rgba(255, 125, 0, 0.15)',\r\n alpha25: 'rgba(255, 125, 0, 0.25)',\r\n alpha35: 'rgba(255, 125, 0, 0.35)'\r\n },\r\n red: {\r\n name: '红色',\r\n primary: '#F53F3F',\r\n primaryLight: '#FFECE8',\r\n gradient: 'linear-gradient(135deg, #F53F3F 0%, #FCA5A5 100%)',\r\n gradientAlpha: 'linear-gradient(135deg, rgba(245, 63, 63, 0.08) 0%, rgba(252, 165, 165, 0.08) 100%)',\r\n gradientShadow: '0 8rpx 24rpx rgba(245, 63, 63, 0.3)',\r\n alpha15: 'rgba(245, 63, 63, 0.15)',\r\n alpha25: 'rgba(245, 63, 63, 0.25)',\r\n alpha35: 'rgba(245, 63, 63, 0.35)'\r\n },\r\n cyan: {\r\n name: '青色',\r\n primary: '#14C9C9',\r\n primaryLight: '#E8FAFA',\r\n gradient: 'linear-gradient(135deg, #14C9C9 0%, #67E8F9 100%)',\r\n gradientAlpha: 'linear-gradient(135deg, rgba(20, 201, 201, 0.08) 0%, rgba(103, 232, 249, 0.08) 100%)',\r\n gradientShadow: '0 8rpx 24rpx rgba(20, 201, 201, 0.3)',\r\n alpha15: 'rgba(20, 201, 201, 0.15)',\r\n alpha25: 'rgba(20, 201, 201, 0.25)',\r\n alpha35: 'rgba(20, 201, 201, 0.35)'\r\n }\r\n};\r\n\r\n// 默认主题色\r\nexport const defaultThemeColor = 'blue';\r\n\r\n// 获取主题色列表(用于选择器)\r\nexport const getThemeColorList = () => {\r\n return Object.entries(themeColors).map(([key, value]) => ({\r\n key,\r\n name: value.name,\r\n color: value.primary\r\n }));\r\n};\r\n"],"names":[],"mappings":";AAKY,MAAC,cAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU;AAAA,IACV,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACb;AAAA,EACE,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU;AAAA,IACV,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACb;AAAA,EACE,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU;AAAA,IACV,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACb;AAAA,EACE,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU;AAAA,IACV,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACb;AAAA,EACE,KAAK;AAAA,IACH,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU;AAAA,IACV,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACb;AAAA,EACE,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU;AAAA,IACV,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACb;AACA;AAGY,MAAC,oBAAoB;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"basic.js","sources":["pages/demo/basic.vue","../uniPage:/cGFnZXMvZGVtby9iYXNpYy52dWU"],"sourcesContent":["<template>\n <view class=\"prism-page\" :class=\"{ 'dark-mode': appStore.isDarkMode }\">\n <!-- 导航栏 -->\n <PrismNavBar\n title=\"基础组件\"\n icon=\"fa-cube\"\n icon-color=\"blue\"\n :show-back=\"true\"\n />\n\n <!-- 主内容区 -->\n <scroll-view class=\"prism-main\" scroll-y :style=\"{ paddingTop: navbarHeight + 'px' }\">\n\n\n <!-- 按钮样式 -->\n <view class=\"prism-section\">\n <view class=\"section-title\">按钮样式</view>\n <view class=\"section-desc\">每种颜色支持五种形态:自适应(默认)、实心(-solid)、渐变(-gradient)、玻璃(-glass)、轮廓(-outline)</view>\n\n <!-- 主要按钮 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">主要按钮 (primary)</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap\">\n <button class=\"prism-btn primary \">自适应</button>\n <button class=\"prism-btn primary solid\">实心</button>\n <button class=\"prism-btn primary gradient\">渐变</button>\n <button class=\"prism-btn primary glass\">玻璃</button>\n <button class=\"prism-btn primary outline\">轮廓</button>\n </view>\n <PrismCode code=\"prism-btn primary [solid/gradient/glass/outline]\" />\n </view>\n\n <!-- 危险按钮 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">危险按钮 (danger)</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap\">\n <button class=\"prism-btn danger\">自适应</button>\n <button class=\"prism-btn danger solid\">实心</button>\n <button class=\"prism-btn danger gradient\">渐变</button>\n <button class=\"prism-btn danger glass\">玻璃</button>\n <button class=\"prism-btn danger outline\">轮廓</button>\n </view>\n <PrismCode code=\"prism-btn danger [solid/gradient/glass/outline]\" />\n </view>\n\n <!-- 成功按钮 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">成功按钮 (success)</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap\">\n <button class=\"prism-btn success\">自适应</button>\n <button class=\"prism-btn success solid\">实心</button>\n <button class=\"prism-btn success gradient\">渐变</button>\n <button class=\"prism-btn success glass\">玻璃</button>\n <button class=\"prism-btn success outline\">轮廓</button>\n </view>\n </view>\n\n <!-- 警告按钮 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">警告按钮 (warning)</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap\">\n <button class=\"prism-btn warning\">自适应</button>\n <button class=\"prism-btn warning solid\">实心</button>\n <button class=\"prism-btn warning gradient\">渐变</button>\n <button class=\"prism-btn warning glass\">玻璃</button>\n <button class=\"prism-btn warning outline\">轮廓</button>\n </view>\n </view>\n\n <!-- 按钮尺寸 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">按钮尺寸</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap items-center\">\n <button class=\"prism-btn primary xs solid\">xs</button>\n <button class=\"prism-btn primary sm solid\">sm</button>\n <button class=\"prism-btn primary md solid\">md</button>\n <button class=\"prism-btn primary lg solid\">lg</button>\n <button class=\"prism-btn primary xl solid\">xl</button>\n </view>\n <PrismCode code=\"prism-btn xs / sm / md / lg / xl\" />\n </view>\n\n <!-- 块级按钮 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">块级按钮 (Block)</view>\n <button class=\"prism-btn primary md solid block\">块级按钮</button>\n <PrismCode code=\"prism-btn block\" />\n </view>\n\n <!-- 圆角按钮 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">圆角按钮 (Round)</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap\">\n <button class=\"prism-btn primary solid round\">圆角按钮</button>\n <button class=\"prism-btn primary outline round\">圆角轮廓</button>\n </view>\n <PrismCode code=\"prism-btn round\" />\n </view>\n </view>\n\n <!-- 图标按钮 -->\n <view class=\"prism-section\">\n <view class=\"section-title\">图标按钮</view>\n <view class=\"section-desc\">原子化类:prism-icon-btn + {颜色} + {尺寸} + {形态}</view>\n\n <!-- 基础用法 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">基础用法</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap items-center\">\n <view class=\"prism-icon-btn primary md\">\n <text class=\"fa fa-plus\"></text>\n </view>\n <view class=\"prism-icon-btn success md solid\">\n <text class=\"fa fa-check\"></text>\n </view>\n <view class=\"prism-icon-btn danger md gradient\">\n <text class=\"fa fa-heart\"></text>\n </view>\n <view class=\"prism-icon-btn ai md glass\">\n <text class=\"fa fa-magic\"></text>\n </view>\n </view>\n <PrismCode code=\"prism-icon-btn primary md [solid]\" />\n </view>\n\n <!-- 尺寸 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">尺寸</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap items-center\">\n <view class=\"prism-icon-btn blue xs\"><text class=\"fa fa-star\"></text></view>\n <view class=\"prism-icon-btn blue sm\"><text class=\"fa fa-star\"></text></view>\n <view class=\"prism-icon-btn blue md\"><text class=\"fa fa-star\"></text></view>\n <view class=\"prism-icon-btn blue lg\"><text class=\"fa fa-star\"></text></view>\n <view class=\"prism-icon-btn blue xl\"><text class=\"fa fa-star\"></text></view>\n </view>\n <PrismCode code=\"xs / sm / md / lg / xl\" />\n </view>\n\n <!-- 形态 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">形态</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap\">\n <view class=\"prism-icon-btn purple md\"><text class=\"fa fa-heart\"></text></view>\n <view class=\"prism-icon-btn purple md solid\"><text class=\"fa fa-heart\"></text></view>\n <view class=\"prism-icon-btn purple md gradient\"><text class=\"fa fa-heart\"></text></view>\n <view class=\"prism-icon-btn purple md glass\"><text class=\"fa fa-heart\"></text></view>\n <view class=\"prism-icon-btn purple md outline\"><text class=\"fa fa-heart\"></text></view>\n </view>\n <PrismCode code=\"默认 / solid / gradient / glass / outline\" />\n </view>\n\n <!-- 圆形 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">圆形</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap items-center\">\n <view class=\"prism-icon-btn blue sm round\"><text class=\"fa fa-plus\"></text></view>\n <view class=\"prism-icon-btn green md round solid\"><text class=\"fa fa-check\"></text></view>\n <view class=\"prism-icon-btn purple lg round gradient \"><text class=\"fa fa-heart\"></text></view>\n <view class=\"prism-icon-btn ai md round glass\"><text class=\"fa fa-magic\"></text></view>\n </view>\n <PrismCode code=\"prism-icon-btn {颜色} {尺寸} round [形态]\" />\n </view>\n\n <!-- 颜色 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">颜色</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap\">\n <view class=\"prism-icon-btn blue sm solid\"><text class=\"fa fa-circle\"></text></view>\n <view class=\"prism-icon-btn green sm solid\"><text class=\"fa fa-circle\"></text></view>\n <view class=\"prism-icon-btn red sm solid\"><text class=\"fa fa-circle\"></text></view>\n <view class=\"prism-icon-btn orange sm solid\"><text class=\"fa fa-circle\"></text></view>\n <view class=\"prism-icon-btn purple sm solid\"><text class=\"fa fa-circle\"></text></view>\n <view class=\"prism-icon-btn cyan sm solid\"><text class=\"fa fa-circle\"></text></view>\n <view class=\"prism-icon-btn ai sm gradient\"><text class=\"fa fa-magic\"></text></view>\n </view>\n <PrismCode code=\"blue / green / red / orange / purple / cyan / ai / ...\" />\n </view>\n </view>\n\n <!-- 图标文字按钮 -->\n <view class=\"prism-section\">\n <view class=\"section-title\">图标文字按钮</view>\n <view class=\"section-desc\">原子化类:prism-text-btn + {颜色} + {尺寸} + {形态}</view>\n\n <!-- 基础用法 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">基础用法</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap\">\n <view class=\"prism-text-btn primary sm\">\n <text class=\"fa fa-plus\"></text><text>新增</text>\n </view>\n <view class=\"prism-text-btn success sm solid\">\n <text class=\"fa fa-check\"></text><text>确认</text>\n </view>\n <view class=\"prism-text-btn danger sm gradient\">\n <text class=\"fa fa-trash\"></text><text>删除</text>\n </view>\n </view>\n <PrismCode code=\"prism-text-btn primary sm [solid]\" />\n </view>\n\n <!-- 形态 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">形态</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap\">\n <view class=\"prism-text-btn blue sm\">\n <text class=\"fa fa-edit\"></text><text>默认</text>\n </view>\n <view class=\"prism-text-btn blue sm solid\">\n <text class=\"fa fa-edit\"></text><text>实心</text>\n </view>\n <view class=\"prism-text-btn blue sm gradient\">\n <text class=\"fa fa-edit\"></text><text>渐变</text>\n </view>\n <view class=\"prism-text-btn blue sm glass\">\n <text class=\"fa fa-edit\"></text><text>玻璃</text>\n </view>\n <view class=\"prism-text-btn blue sm outline\">\n <text class=\"fa fa-edit\"></text><text>轮廓</text>\n </view>\n </view>\n </view>\n\n <!-- 尺寸 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">尺寸</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap items-center\">\n <view class=\"prism-text-btn primary xs solid\">\n <text class=\"fa fa-star\"></text><text>迷你</text>\n </view>\n <view class=\"prism-text-btn primary sm solid\">\n\n <text class=\"fa fa-star\"></text><text>小</text>\n </view>\n <view class=\"prism-text-btn primary md solid\">\n <text class=\"fa fa-star\"></text><text>中</text>\n </view>\n <view class=\"prism-text-btn primary lg solid\">\n <text class=\"fa fa-star\"></text><text>大</text>\n </view>\n <view class=\"prism-text-btn primary xl solid\">\n <text class=\"fa fa-star\"></text><text>更大</text>\n </view>\n </view>\n <PrismCode code=\"xs / sm / md / lg / xl\" />\n </view>\n </view>\n\n <!-- 徽章 -->\n <view class=\"prism-section\">\n <view class=\"section-title\">徽章</view>\n\n <!-- 红点徽章 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">红点徽章</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap\">\n <view class=\"prism-icon-btn primary md\">\n <text class=\"fa fa-bell\"></text>\n <view class=\"prism-badge\"></view>\n </view>\n </view>\n <PrismCode code=\"prism-badge\" />\n </view>\n\n <!-- 数字徽章 -->\n <view class=\"prism-card\">\n <view class=\"card-title\">数字徽章</view>\n <view class=\"flex flex-row gap-[15rpx] flex-wrap\">\n <view class=\"prism-icon-btn primary md\">\n <text class=\"fa fa-bell\"></text>\n <view class=\"prism-number-badge\">5</view>\n </view>\n <view class=\"prism-icon-btn primary md\">\n <text class=\"fa fa-envelope\"></text>\n <view class=\"prism-number-badge\">99+</view>\n </view>\n </view>\n <PrismCode code=\"prism-number-badge\" />\n </view>\n </view>\n <!-- 底部安全区 -->\n <view class=\"prism-safe-area-bottom\"></view>\n </scroll-view>\n </view>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport { useAppStore } from '@/store/app';\nimport PrismCode from '@/components/PrismCode/PrismCode.vue';\n\nconst appStore = useAppStore();\n\nconst navbarHeight = computed(() => {\n return appStore.statusBarHeight + 44;\n});\n</script>\n\n<style lang=\"scss\">\n@import './demo-common.scss';\n</style>\n","import MiniProgramPage from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/pages/demo/basic.vue'\nwx.createPage(MiniProgramPage)"],"names":["useAppStore","computed","MiniProgramPage"],"mappings":";;;;;;;;;;;AAAA,MAAA,YAAA,MAAA;;;;AAAA,UAAA,WAAAA,UAAAA,YAAA;AAAA,UAAA,eAAAC,cAAAA,SAAA,MAAA;AAAA,aAAA,SAAA,kBAAA;AAAA,IAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACCA,GAAG,WAAWC,SAAe;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"card.js","sources":["pages/demo/card.vue","../uniPage:/cGFnZXMvZGVtby9jYXJkLnZ1ZQ"],"sourcesContent":["<template>\r\n <view class=\"page-container\" :class=\"{ 'dark-mode': appStore.isDarkMode }\">\r\n <!-- 导航栏 -->\r\n <PrismNavBar\r\n title=\"卡片组件\"\r\n icon=\"fa-square\"\r\n icon-color=\"purple\"\r\n :show-back=\"true\"\r\n />\r\n\r\n <!-- 主内容区 -->\r\n <scroll-view class=\"main-content\" scroll-y :style=\"{ paddingTop: navbarHeight + 'px' }\">\r\n\r\n <!-- 毛玻璃卡片 -->\r\n <view class=\"prism-section\">\r\n <view class=\"section-title\">毛玻璃卡片</view>\r\n\r\n <view class=\"prism-card glass mb-20\">\r\n <view class=\"p-30\">\r\n <text class=\"prism-text-primary text-lg text-bold\">毛玻璃卡片</text>\r\n <text class=\"card-desc\">这是一个毛玻璃效果的卡片组件</text>\r\n </view>\r\n </view>\r\n <view class=\"prism-code-snippet mt-20\">\r\n <text class=\"prism-code-text\">prism-card glass</text>\r\n </view>\r\n\r\n <view class=\"prism-card blue glass mt-20\">\r\n <view class=\"p-30\">\r\n <text class=\"prism-text-primary text-lg text-bold\">蓝色毛玻璃卡片</text>\r\n <text class=\"card-desc\">带有蓝色渐变效果的卡片</text>\r\n </view>\r\n </view>\r\n <view class=\"prism-code-snippet mt-20\">\r\n <text class=\"prism-code-text\">prism-card blue glass</text>\r\n </view>\r\n </view>\r\n\r\n <!-- 菜单列表 -->\r\n <view class=\"prism-section\">\r\n <view class=\"section-title\">菜单列表</view>\r\n\r\n <view class=\"prism-menu-list prism-card glass\">\r\n <view class=\"menu-item\">\r\n <view class=\"menu-left\">\r\n <view class=\"menu-icon prism-icon blue\">\r\n <text class=\"fa fa-user\"></text>\r\n </view>\r\n <text class=\"menu-text\">个人信息</text>\r\n </view>\r\n <view class=\"menu-right\">\r\n <text class=\"fa fa-angle-right arrow\"></text>\r\n </view>\r\n </view>\r\n\r\n <view class=\"menu-item\">\r\n <view class=\"menu-left\">\r\n <view class=\"menu-icon prism-icon orange\">\r\n <text class=\"fa fa-bell\"></text>\r\n </view>\r\n <text class=\"menu-text\">消息通知</text>\r\n </view>\r\n <view class=\"menu-right\">\r\n <text class=\"menu-value\">已开启</text>\r\n <text class=\"fa fa-angle-right arrow\"></text>\r\n </view>\r\n </view>\r\n\r\n <view class=\"menu-item\">\r\n <view class=\"menu-left\">\r\n <view class=\"menu-icon prism-icon green\">\r\n <text class=\"fa fa-gear\"></text>\r\n </view>\r\n <text class=\"menu-text\">系统设置</text>\r\n </view>\r\n <view class=\"menu-right\">\r\n <text class=\"fa fa-angle-right arrow\"></text>\r\n </view>\r\n </view>\r\n </view>\r\n\r\n <view class=\"prism-code-snippet mt-20\">\r\n <text class=\"prism-code-text\">prism-menu-list > menu-item > menu-icon.prism-icon.{color}</text>\r\n </view>\r\n </view>\r\n\r\n <!-- 区块头部 -->\r\n <view class=\"prism-section\">\r\n <view class=\"section-title\">区块头部</view>\r\n\r\n <view class=\"prism-section-header\">\r\n <text class=\"prism-section-title\">最近项目</text>\r\n <view class=\"prism-more-link\">\r\n <text class=\"more-text\">查看更多</text>\r\n <text class=\"more-icon fa fa-angle-right\"></text>\r\n </view>\r\n </view>\r\n\r\n <view class=\"prism-card glass\">\r\n <view class=\"p-30\">\r\n <text class=\"prism-text-secondary\">这里是内容区域</text>\r\n </view>\r\n </view>\r\n <view class=\"prism-code-snippet mt-20\">\r\n <text class=\"prism-code-text\">prism-section-header + prism-section-title + prism-more-link</text>\r\n </view>\r\n </view>\r\n\r\n <!-- ListItem 列表项 -->\r\n <view class=\"prism-section\">\r\n <view class=\"section-title\">ListItem 列表项</view>\r\n\r\n <view class=\"prism-list-item mb-20\">\r\n <view class=\"list-item-icon prism-icon blue\">\r\n <text class=\"fa fa-folder\"></text>\r\n </view>\r\n <view class=\"list-item-content\">\r\n <text class=\"list-item-title\">项目文档</text>\r\n <text class=\"list-item-desc\">包含所有项目相关的文档资料</text>\r\n </view>\r\n <text class=\"list-item-arrow fa fa-angle-right\"></text>\r\n </view>\r\n\r\n <view class=\"prism-list-item mb-20\">\r\n <view class=\"list-item-icon prism-icon green\">\r\n <text class=\"fa fa-check-circle\"></text>\r\n </view>\r\n <view class=\"list-item-content\">\r\n <text class=\"list-item-title\">已完成任务</text>\r\n <text class=\"list-item-desc\">查看所有已完成的任务列表</text>\r\n </view>\r\n <text class=\"list-item-arrow fa fa-angle-right\"></text>\r\n </view>\r\n\r\n <view class=\"prism-list-item\">\r\n <view class=\"list-item-icon prism-icon orange\">\r\n <text class=\"fa fa-clock\"></text>\r\n </view>\r\n <view class=\"list-item-content\">\r\n <text class=\"list-item-title\">待处理事项</text>\r\n <text class=\"list-item-desc\">需要尽快处理的紧急事项</text>\r\n </view>\r\n <text class=\"list-item-arrow fa fa-angle-right\"></text>\r\n </view>\r\n\r\n <view class=\"prism-code-snippet mt-20\">\r\n <text class=\"prism-code-text\">prism-list-item > list-item-icon + list-item-content + list-item-arrow</text>\r\n </view>\r\n </view>\r\n\r\n <!-- 底部安全区 -->\r\n <view class=\"prism-safe-area-bottom\"></view>\r\n </scroll-view>\r\n </view>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue';\r\nimport { useAppStore } from '@/store/app';\r\n\r\nconst appStore = useAppStore();\r\n\r\nconst navbarHeight = computed(() => {\r\n return appStore.statusBarHeight + 44;\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n@import './demo-common.scss';\r\n</style>\r\n","import MiniProgramPage from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/pages/demo/card.vue'\nwx.createPage(MiniProgramPage)"],"names":["useAppStore","computed","MiniProgramPage"],"mappings":";;;;;;;;;;;;;;AAgKA,UAAM,WAAWA,UAAAA,YAAW;AAE5B,UAAM,eAAeC,cAAAA,SAAS,MAAM;AAClC,aAAO,SAAS,kBAAkB;AAAA,IACpC,CAAC;;;;;;;;;;;;;;;ACnKD,GAAG,WAAWC,SAAe;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["pages/demo/code/index.vue","../uniPage:/cGFnZXMvZGVtby9jb2RlL2luZGV4LnZ1ZQ"],"sourcesContent":["<template>\n <view class=\"prism-page\" :class=\"{ 'dark-mode': appStore.isDarkMode }\">\n <PrismNavBar\n title=\"Code 代码展示\"\n icon=\"fa-code\"\n icon-color=\"purple\"\n :show-back=\"true\"\n />\n\n <scroll-view class=\"prism-main\" scroll-y :style=\"{ paddingTop: navbarHeight + 'px' }\">\n <!-- 基础用法 -->\n <view class=\"prism-section\">\n <view class=\"section-title\">基础用法</view>\n <view class=\"section-desc\">展示代码片段或类名</view>\n\n <PrismCode code=\"npm install prism-ui\" />\n <PrismCode code=\"<PrismButton type='primary'>按钮</PrismButton>\" />\n </view>\n\n <!-- 多行代码 -->\n <view class=\"prism-section\">\n <view class=\"section-title\">多行代码</view>\n\n <PrismCode :code=\"multiLineCode\" />\n </view>\n\n <!-- 带语言标识 -->\n <view class=\"prism-section\">\n <view class=\"section-title\">带语言标识</view>\n <view class=\"section-desc\">显示语言类型和复制按钮</view>\n\n <PrismCode :code=\"jsCode\" language=\"JavaScript\" :copyable=\"true\" />\n </view>\n\n <!-- 显示行号 -->\n <view class=\"prism-section\">\n <view class=\"section-title\">显示行号</view>\n\n <PrismCode :code=\"tsCode\" language=\"TypeScript\" :show-line-numbers=\"true\" :copyable=\"true\" />\n </view>\n\n <!-- 可折叠 -->\n <view class=\"prism-section\">\n <view class=\"section-title\">可折叠代码</view>\n <view class=\"section-desc\">点击展开/收起代码块</view>\n\n <PrismCode :code=\"vueCode\" language=\"Vue\" :expandable=\"true\" :copyable=\"true\" />\n </view>\n\n <!-- Python 示例 -->\n <view class=\"prism-section\">\n <view class=\"section-title\">Python 代码</view>\n <view class=\"section-desc\">支持多种编程语言高亮</view>\n\n <PrismCode :code=\"pythonCode\" language=\"Python\" :show-line-numbers=\"true\" :copyable=\"true\" />\n </view>\n\n <!-- CSS 示例 -->\n <view class=\"prism-section\">\n <view class=\"section-title\">CSS 样式</view>\n\n <PrismCode :code=\"cssCode\" language=\"CSS\" :copyable=\"true\" />\n </view>\n\n <!-- SQL 示例 -->\n <view class=\"prism-section\">\n <view class=\"section-title\">SQL 查询</view>\n\n <PrismCode :code=\"sqlCode\" language=\"SQL\" :show-line-numbers=\"true\" :copyable=\"true\" />\n </view>\n\n <!-- Shell 示例 -->\n <view class=\"prism-section\">\n <view class=\"section-title\">Shell 命令</view>\n <view class=\"section-desc\">常用终端命令展示</view>\n\n <PrismCode :code=\"shellCode\" language=\"Shell\" :copyable=\"true\" />\n </view>\n\n <!-- JSON 示例 -->\n <view class=\"prism-section\">\n <view class=\"section-title\">JSON 数据</view>\n\n <PrismCode :code=\"jsonCode\" language=\"JSON\" :show-line-numbers=\"true\" :copyable=\"true\" />\n </view>\n\n <view class=\"prism-safe-area-bottom\"></view>\n </scroll-view>\n </view>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport { useAppStore } from '@/store/app';\nimport PrismCode from '@/components/PrismCode/PrismCode.vue';\n\nconst appStore = useAppStore();\n\nconst navbarHeight = computed(() => {\n return appStore.statusBarHeight + 44;\n});\n\nconst multiLineCode = `<template>\n <PrismButton type=\"primary\">\n 主要按钮\n </PrismButton>\n</template>`;\n\nconst jsCode = `function greet(name) {\n console.log('Hello, ' + name);\n return true;\n}`;\n\nconst tsCode = `interface User {\n id: number;\n name: string;\n email?: string;\n}\n\nconst getUser = (id: number): User => {\n return { id, name: 'John' };\n};`;\n\nconst vueCode = '<template>\\n <view class=\"container\">\\n <text>{{ message }}</text>\\n <button @click=\"handleClick\">点击</button>\\n </view>\\n</template>\\n\\n<script setup>\\nimport { ref } from \\'vue\\';\\n\\nconst message = ref(\\'Hello World\\');\\n\\nconst handleClick = () => {\\n message.value = \\'Clicked!\\';\\n};\\n<\\/script>';\n\nconst pythonCode = `class Calculator:\n def __init__(self):\n self.result = 0\n\n def add(self, x, y):\n \"\"\"两数相加\"\"\"\n return x + y\n\n def multiply(self, x, y):\n return x * y\n\n# 使用示例\ncalc = Calculator()\nprint(calc.add(10, 20))`;\n\nconst cssCode = `.prism-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 12rpx 32rpx;\n border-radius: 8rpx;\n font-size: 28rpx;\n transition: all 0.3s ease;\n}\n\n.prism-button--primary {\n background: linear-gradient(135deg, #667eea, #764ba2);\n color: #ffffff;\n}`;\n\nconst sqlCode = `SELECT\n u.id,\n u.username,\n COUNT(o.id) AS order_count,\n SUM(o.amount) AS total_amount\nFROM users u\nLEFT JOIN orders o ON u.id = o.user_id\nWHERE u.status = 'active'\n AND o.created_at >= '2024-01-01'\nGROUP BY u.id, u.username\nHAVING COUNT(o.id) > 5\nORDER BY total_amount DESC\nLIMIT 10;`;\n\nconst shellCode = `# 安装依赖\nnpm install\n\n# 开发模式运行\nnpm run dev\n\n# 构建生产版本\nnpm run build\n\n# Git 操作\ngit add .\ngit commit -m \"feat: add new feature\"\ngit push origin main`;\n\nconst jsonCode = `{\n \"name\": \"prism-ui\",\n \"version\": \"1.0.0\",\n \"description\": \"A modern UI library\",\n \"dependencies\": {\n \"vue\": \"^3.4.0\",\n \"pinia\": \"^2.1.0\"\n },\n \"devDependencies\": {\n \"vite\": \"^5.0.0\",\n \"typescript\": \"^5.3.0\"\n }\n}`;\n</script>\n\n<style lang=\"scss\">\n@import '../demo-common.scss';\n\n// 分组列表圆角样式\n.prism-section {\n margin: 24rpx 32rpx;\n padding: 32rpx;\n background: var(--prism-bg-color-card, #fff);\n border-radius: 24rpx;\n\n .dark-mode & {\n background: var(--prism-bg-color-card, #242424);\n }\n}\n\n.fixed-code-label {\n font-size: 24rpx;\n color: var(--prism-text-secondary, #86909C);\n margin-bottom: 16rpx;\n}\n\n.prism-fixed-bottom .prism-code {\n margin-top: 0;\n}\n</style>\n","import MiniProgramPage from 'E:/git/ruixin-gitlab/ruixin-keiji/ruixin-prism-ui-uniApp/src/pages/demo/code/index.vue'\nwx.createPage(MiniProgramPage)"],"names":["useAppStore","computed","MiniProgramPage"],"mappings":";;;;;;;;;;;AA8FA,MAAM,YAAY,MAAW;AAQ7B,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAMtB,MAAM,SAAS;AAAA;AAAA;AAAA;AAKf,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUf,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEhB,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAenB,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAehB,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAchB,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAclB,MAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAvFjB,UAAM,WAAWA,UAAAA,YAAW;AAE5B,UAAM,eAAeC,cAAAA,SAAS,MAAM;AAClC,aAAO,SAAS,kBAAkB;AAAA,IACpC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnGD,GAAG,WAAWC,SAAe;"}
|