// ==UserScript==
// @name DOLLARS聊天室助手
// @namespace Violentmonkey Scripts
// @version 10.0.5
// @author QQ:121610059
// @icon https://drrr.com/favicon.svg
// @match https://drrr.com/room/*
// @require https://cdn.bootcdn.net/ajax/libs/vue/3.4.19/vue.global.prod.js
// @grant GM_addStyle
// @grant unsafeWindow
// @description Dollars聊天室辅助脚本
// ==/UserScript==
(n=>{if(typeof GM_addStyle=="function"){GM_addStyle(n);return}const a=document.createElement("style");a.textContent=n,document.head.append(a)})(' :root:root{--van-nav-bar-background: #1989fa;--van-nav-bar-title-text-color: #fff;--van-nav-bar-icon-color: #fff}#body{width:100%}#talks{background-color:#0a0a0a;position:relative}.talks:before{content:"";position:absolute;top:0;left:calc(-50vw + 50%);width:100vw;height:100%;background-color:#0a0a0a;z-index:-1}.van-popup--center{max-width:100%!important}.van-popup{overflow-y:inherit!important}.tab-content label{font-weight:inherit}:root,:host{--van-black: #000;--van-white: #fff;--van-gray-1: #f7f8fa;--van-gray-2: #f2f3f5;--van-gray-3: #ebedf0;--van-gray-4: #dcdee0;--van-gray-5: #c8c9cc;--van-gray-6: #969799;--van-gray-7: #646566;--van-gray-8: #323233;--van-red: #ee0a24;--van-blue: #1989fa;--van-orange: #ff976a;--van-orange-dark: #ed6a0c;--van-orange-light: #fffbe8;--van-green: #07c160;--van-gradient-red: linear-gradient(to right, #ff6034, #ee0a24);--van-gradient-orange: linear-gradient(to right, #ffd01e, #ff8917);--van-primary-color: var(--van-blue);--van-success-color: var(--van-green);--van-danger-color: var(--van-red);--van-warning-color: var(--van-orange);--van-text-color: var(--van-gray-8);--van-text-color-2: var(--van-gray-6);--van-text-color-3: var(--van-gray-5);--van-active-color: var(--van-gray-2);--van-active-opacity: .6;--van-disabled-opacity: .5;--van-background: var(--van-gray-1);--van-background-2: var(--van-white);--van-background-3: var(--van-white);--van-padding-base: 4px;--van-padding-xs: 8px;--van-padding-sm: 12px;--van-padding-md: 16px;--van-padding-lg: 24px;--van-padding-xl: 32px;--van-font-bold: 600;--van-font-size-xs: 10px;--van-font-size-sm: 12px;--van-font-size-md: 14px;--van-font-size-lg: 16px;--van-line-height-xs: 14px;--van-line-height-sm: 18px;--van-line-height-md: 20px;--van-line-height-lg: 22px;--van-base-font: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, Segoe UI, Arial, Roboto, "PingFang SC", "miui", "Hiragino Sans GB", "Microsoft Yahei", sans-serif;--van-price-font: avenir-heavy, "PingFang SC", helvetica neue, arial, sans-serif;--van-duration-base: .3s;--van-duration-fast: .2s;--van-ease-out: ease-out;--van-ease-in: ease-in;--van-border-color: var(--van-gray-3);--van-border-width: 1px;--van-radius-sm: 2px;--van-radius-md: 4px;--van-radius-lg: 8px;--van-radius-max: 999px}.van-theme-dark{--van-text-color: #f5f5f5;--van-text-color-2: #707070;--van-text-color-3: #4d4d4d;--van-border-color: #3a3a3c;--van-active-color: #3a3a3c;--van-background: #000;--van-background-2: #1c1c1e;--van-background-3: #37363b}html{-webkit-tap-highlight-color:transparent}body{margin:0;font-family:var(--van-base-font)}a{text-decoration:none}input,button,textarea{color:inherit;font:inherit}a:focus,input:focus,button:focus,textarea:focus,[class*=van-]:focus{outline:none}ol,ul{margin:0;padding:0;list-style:none}@keyframes van-slide-up-enter{0%{transform:translate3d(0,100%,0)}}@keyframes van-slide-up-leave{to{transform:translate3d(0,100%,0)}}@keyframes van-slide-down-enter{0%{transform:translate3d(0,-100%,0)}}@keyframes van-slide-down-leave{to{transform:translate3d(0,-100%,0)}}@keyframes van-slide-left-enter{0%{transform:translate3d(-100%,0,0)}}@keyframes van-slide-left-leave{to{transform:translate3d(-100%,0,0)}}@keyframes van-slide-right-enter{0%{transform:translate3d(100%,0,0)}}@keyframes van-slide-right-leave{to{transform:translate3d(100%,0,0)}}@keyframes van-fade-in{0%{opacity:0}to{opacity:1}}@keyframes van-fade-out{0%{opacity:1}to{opacity:0}}@keyframes van-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.van-fade-enter-active{animation:var(--van-duration-base) van-fade-in both var(--van-ease-out)}.van-fade-leave-active{animation:var(--van-duration-base) van-fade-out both var(--van-ease-in)}.van-slide-up-enter-active{animation:van-slide-up-enter var(--van-duration-base) both var(--van-ease-out)}.van-slide-up-leave-active{animation:van-slide-up-leave var(--van-duration-base) both var(--van-ease-in)}.van-slide-down-enter-active{animation:van-slide-down-enter var(--van-duration-base) both var(--van-ease-out)}.van-slide-down-leave-active{animation:van-slide-down-leave var(--van-duration-base) both var(--van-ease-in)}.van-slide-left-enter-active{animation:van-slide-left-enter var(--van-duration-base) both var(--van-ease-out)}.van-slide-left-leave-active{animation:van-slide-left-leave var(--van-duration-base) both var(--van-ease-in)}.van-slide-right-enter-active{animation:van-slide-right-enter var(--van-duration-base) both var(--van-ease-out)}.van-slide-right-leave-active{animation:van-slide-right-leave var(--van-duration-base) both var(--van-ease-in)}.van-clearfix:after{display:table;clear:both;content:""}.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;line-break:anywhere;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:3;line-break:anywhere;-webkit-box-orient:vertical}.van-safe-area-top{padding-top:constant(safe-area-inset-top);padding-top:env(safe-area-inset-top)}.van-safe-area-bottom{padding-bottom:constant(safe-area-inset-bottom);padding-bottom:env(safe-area-inset-bottom)}.van-haptics-feedback{cursor:pointer}.van-haptics-feedback:active{opacity:var(--van-active-opacity)}[class*=van-hairline]:after{position:absolute;box-sizing:border-box;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid var(--van-border-color);transform:scale(.5)}.van-hairline,.van-hairline--top,.van-hairline--left,.van-hairline--right,.van-hairline--bottom,.van-hairline--surround,.van-hairline--top-bottom{position:relative}.van-hairline--top:after{border-top-width:var(--van-border-width)}.van-hairline--left:after{border-left-width:var(--van-border-width)}.van-hairline--right:after{border-right-width:var(--van-border-width)}.van-hairline--bottom:after{border-bottom-width:var(--van-border-width)}.van-hairline--top-bottom:after,.van-hairline-unset--top-bottom:after{border-width:var(--van-border-width) 0}.van-hairline--surround:after{border-width:var(--van-border-width)}:root,:host{--van-badge-size: 16px;--van-badge-color: var(--van-white);--van-badge-padding: 0 3px;--van-badge-font-size: var(--van-font-size-sm);--van-badge-font-weight: var(--van-font-bold);--van-badge-border-width: var(--van-border-width);--van-badge-background: var(--van-danger-color);--van-badge-dot-color: var(--van-danger-color);--van-badge-dot-size: 8px;--van-badge-font: -apple-system-font, helvetica neue, arial, sans-serif}.van-badge{display:inline-block;box-sizing:border-box;min-width:var(--van-badge-size);padding:var(--van-badge-padding);color:var(--van-badge-color);font-weight:var(--van-badge-font-weight);font-size:var(--van-badge-font-size);font-family:var(--van-badge-font);line-height:1.2;text-align:center;background:var(--van-badge-background);border:var(--van-badge-border-width) solid var(--van-background-2);border-radius:var(--van-radius-max)}.van-badge--fixed{position:absolute;transform-origin:100%}.van-badge--top-left{top:0;left:0;transform:translate(-50%,-50%)}.van-badge--top-right{top:0;right:0;transform:translate(50%,-50%)}.van-badge--bottom-left{bottom:0;left:0;transform:translate(-50%,50%)}.van-badge--bottom-right{bottom:0;right:0;transform:translate(50%,50%)}.van-badge--dot{width:var(--van-badge-dot-size);min-width:0;height:var(--van-badge-dot-size);background:var(--van-badge-dot-color);border-radius:100%;border:none;padding:0}.van-badge__wrapper{position:relative;display:inline-block}.van-icon{position:relative;display:inline-block;font:14px/1 vant-icon;font:normal normal normal 14px/1 var(--van-icon-font-family, "vant-icon");font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased}.van-icon:before{display:inline-block}.van-icon-arrow-double-left:before{content:"\uE653"}.van-icon-arrow-double-right:before{content:"\uE654"}.van-icon-contact:before{content:"\uE753"}.van-icon-notes:before{content:"\uE63C"}.van-icon-records:before{content:"\uE63D"}.van-icon-cash-back-record:before{content:"\uE63E"}.van-icon-newspaper:before{content:"\uE63F"}.van-icon-discount:before{content:"\uE640"}.van-icon-completed:before{content:"\uE641"}.van-icon-user:before{content:"\uE642"}.van-icon-description:before{content:"\uE643"}.van-icon-list-switch:before{content:"\uE6AD"}.van-icon-list-switching:before{content:"\uE65A"}.van-icon-link-o:before{content:"\uE751"}.van-icon-miniprogram-o:before{content:"\uE752"}.van-icon-qq:before{content:"\uE74E"}.van-icon-wechat-moments:before{content:"\uE74F"}.van-icon-weibo:before{content:"\uE750"}.van-icon-cash-o:before{content:"\uE74D"}.van-icon-guide-o:before{content:"\uE74C"}.van-icon-invitation:before{content:"\uE6D6"}.van-icon-shield-o:before{content:"\uE74B"}.van-icon-exchange:before{content:"\uE6AF"}.van-icon-eye:before{content:"\uE6B0"}.van-icon-enlarge:before{content:"\uE6B1"}.van-icon-expand-o:before{content:"\uE6B2"}.van-icon-eye-o:before{content:"\uE6B3"}.van-icon-expand:before{content:"\uE6B4"}.van-icon-filter-o:before{content:"\uE6B5"}.van-icon-fire:before{content:"\uE6B6"}.van-icon-fail:before{content:"\uE6B7"}.van-icon-failure:before{content:"\uE6B8"}.van-icon-fire-o:before{content:"\uE6B9"}.van-icon-flag-o:before{content:"\uE6BA"}.van-icon-font:before{content:"\uE6BB"}.van-icon-font-o:before{content:"\uE6BC"}.van-icon-gem-o:before{content:"\uE6BD"}.van-icon-flower-o:before{content:"\uE6BE"}.van-icon-gem:before{content:"\uE6BF"}.van-icon-gift-card:before{content:"\uE6C0"}.van-icon-friends:before{content:"\uE6C1"}.van-icon-friends-o:before{content:"\uE6C2"}.van-icon-gold-coin:before{content:"\uE6C3"}.van-icon-gold-coin-o:before{content:"\uE6C4"}.van-icon-good-job-o:before{content:"\uE6C5"}.van-icon-gift:before{content:"\uE6C6"}.van-icon-gift-o:before{content:"\uE6C7"}.van-icon-gift-card-o:before{content:"\uE6C8"}.van-icon-good-job:before{content:"\uE6C9"}.van-icon-home-o:before{content:"\uE6CA"}.van-icon-goods-collect:before{content:"\uE6CB"}.van-icon-graphic:before{content:"\uE6CC"}.van-icon-goods-collect-o:before{content:"\uE6CD"}.van-icon-hot-o:before{content:"\uE6CE"}.van-icon-info:before{content:"\uE6CF"}.van-icon-hotel-o:before{content:"\uE6D0"}.van-icon-info-o:before{content:"\uE6D1"}.van-icon-hot-sale-o:before{content:"\uE6D2"}.van-icon-hot:before{content:"\uE6D3"}.van-icon-like:before{content:"\uE6D4"}.van-icon-idcard:before{content:"\uE6D5"}.van-icon-like-o:before{content:"\uE6D7"}.van-icon-hot-sale:before{content:"\uE6D8"}.van-icon-location-o:before{content:"\uE6D9"}.van-icon-location:before{content:"\uE6DA"}.van-icon-label:before{content:"\uE6DB"}.van-icon-lock:before{content:"\uE6DC"}.van-icon-label-o:before{content:"\uE6DD"}.van-icon-map-marked:before{content:"\uE6DE"}.van-icon-logistics:before{content:"\uE6DF"}.van-icon-manager:before{content:"\uE6E0"}.van-icon-more:before{content:"\uE6E1"}.van-icon-live:before{content:"\uE6E2"}.van-icon-manager-o:before{content:"\uE6E3"}.van-icon-medal:before{content:"\uE6E4"}.van-icon-more-o:before{content:"\uE6E5"}.van-icon-music-o:before{content:"\uE6E6"}.van-icon-music:before{content:"\uE6E7"}.van-icon-new-arrival-o:before{content:"\uE6E8"}.van-icon-medal-o:before{content:"\uE6E9"}.van-icon-new-o:before{content:"\uE6EA"}.van-icon-free-postage:before{content:"\uE6EB"}.van-icon-newspaper-o:before{content:"\uE6EC"}.van-icon-new-arrival:before{content:"\uE6ED"}.van-icon-minus:before{content:"\uE6EE"}.van-icon-orders-o:before{content:"\uE6EF"}.van-icon-new:before{content:"\uE6F0"}.van-icon-paid:before{content:"\uE6F1"}.van-icon-notes-o:before{content:"\uE6F2"}.van-icon-other-pay:before{content:"\uE6F3"}.van-icon-pause-circle:before{content:"\uE6F4"}.van-icon-pause:before{content:"\uE6F5"}.van-icon-pause-circle-o:before{content:"\uE6F6"}.van-icon-peer-pay:before{content:"\uE6F7"}.van-icon-pending-payment:before{content:"\uE6F8"}.van-icon-passed:before{content:"\uE6F9"}.van-icon-plus:before{content:"\uE6FA"}.van-icon-phone-circle-o:before{content:"\uE6FB"}.van-icon-phone-o:before{content:"\uE6FC"}.van-icon-printer:before{content:"\uE6FD"}.van-icon-photo-fail:before{content:"\uE6FE"}.van-icon-phone:before{content:"\uE6FF"}.van-icon-photo-o:before{content:"\uE700"}.van-icon-play-circle:before{content:"\uE701"}.van-icon-play:before{content:"\uE702"}.van-icon-phone-circle:before{content:"\uE703"}.van-icon-point-gift-o:before{content:"\uE704"}.van-icon-point-gift:before{content:"\uE705"}.van-icon-play-circle-o:before{content:"\uE706"}.van-icon-shrink:before{content:"\uE707"}.van-icon-photo:before{content:"\uE708"}.van-icon-qr:before{content:"\uE709"}.van-icon-qr-invalid:before{content:"\uE70A"}.van-icon-question-o:before{content:"\uE70B"}.van-icon-revoke:before{content:"\uE70C"}.van-icon-replay:before{content:"\uE70D"}.van-icon-service:before{content:"\uE70E"}.van-icon-question:before{content:"\uE70F"}.van-icon-search:before{content:"\uE710"}.van-icon-refund-o:before{content:"\uE711"}.van-icon-service-o:before{content:"\uE712"}.van-icon-scan:before{content:"\uE713"}.van-icon-share:before{content:"\uE714"}.van-icon-send-gift-o:before{content:"\uE715"}.van-icon-share-o:before{content:"\uE716"}.van-icon-setting:before{content:"\uE717"}.van-icon-points:before{content:"\uE718"}.van-icon-photograph:before{content:"\uE719"}.van-icon-shop:before{content:"\uE71A"}.van-icon-shop-o:before{content:"\uE71B"}.van-icon-shop-collect-o:before{content:"\uE71C"}.van-icon-shop-collect:before{content:"\uE71D"}.van-icon-smile:before{content:"\uE71E"}.van-icon-shopping-cart-o:before{content:"\uE71F"}.van-icon-sign:before{content:"\uE720"}.van-icon-sort:before{content:"\uE721"}.van-icon-star-o:before{content:"\uE722"}.van-icon-smile-comment-o:before{content:"\uE723"}.van-icon-stop:before{content:"\uE724"}.van-icon-stop-circle-o:before{content:"\uE725"}.van-icon-smile-o:before{content:"\uE726"}.van-icon-star:before{content:"\uE727"}.van-icon-success:before{content:"\uE728"}.van-icon-stop-circle:before{content:"\uE729"}.van-icon-records-o:before{content:"\uE72A"}.van-icon-shopping-cart:before{content:"\uE72B"}.van-icon-tosend:before{content:"\uE72C"}.van-icon-todo-list:before{content:"\uE72D"}.van-icon-thumb-circle-o:before{content:"\uE72E"}.van-icon-thumb-circle:before{content:"\uE72F"}.van-icon-umbrella-circle:before{content:"\uE730"}.van-icon-underway:before{content:"\uE731"}.van-icon-upgrade:before{content:"\uE732"}.van-icon-todo-list-o:before{content:"\uE733"}.van-icon-tv-o:before{content:"\uE734"}.van-icon-underway-o:before{content:"\uE735"}.van-icon-user-o:before{content:"\uE736"}.van-icon-vip-card-o:before{content:"\uE737"}.van-icon-vip-card:before{content:"\uE738"}.van-icon-send-gift:before{content:"\uE739"}.van-icon-wap-home:before{content:"\uE73A"}.van-icon-wap-nav:before{content:"\uE73B"}.van-icon-volume-o:before{content:"\uE73C"}.van-icon-video:before{content:"\uE73D"}.van-icon-wap-home-o:before{content:"\uE73E"}.van-icon-volume:before{content:"\uE73F"}.van-icon-warning:before{content:"\uE740"}.van-icon-weapp-nav:before{content:"\uE741"}.van-icon-wechat-pay:before{content:"\uE742"}.van-icon-warning-o:before{content:"\uE743"}.van-icon-wechat:before{content:"\uE744"}.van-icon-setting-o:before{content:"\uE745"}.van-icon-youzan-shield:before{content:"\uE746"}.van-icon-warn-o:before{content:"\uE747"}.van-icon-smile-comment:before{content:"\uE748"}.van-icon-user-circle-o:before{content:"\uE749"}.van-icon-video-o:before{content:"\uE74A"}.van-icon-add-square:before{content:"\uE65C"}.van-icon-add:before{content:"\uE65D"}.van-icon-arrow-down:before{content:"\uE65E"}.van-icon-arrow-up:before{content:"\uE65F"}.van-icon-arrow:before{content:"\uE660"}.van-icon-after-sale:before{content:"\uE661"}.van-icon-add-o:before{content:"\uE662"}.van-icon-alipay:before{content:"\uE663"}.van-icon-ascending:before{content:"\uE664"}.van-icon-apps-o:before{content:"\uE665"}.van-icon-aim:before{content:"\uE666"}.van-icon-award:before{content:"\uE667"}.van-icon-arrow-left:before{content:"\uE668"}.van-icon-award-o:before{content:"\uE669"}.van-icon-audio:before{content:"\uE66A"}.van-icon-bag-o:before{content:"\uE66B"}.van-icon-balance-list:before{content:"\uE66C"}.van-icon-back-top:before{content:"\uE66D"}.van-icon-bag:before{content:"\uE66E"}.van-icon-balance-pay:before{content:"\uE66F"}.van-icon-balance-o:before{content:"\uE670"}.van-icon-bar-chart-o:before{content:"\uE671"}.van-icon-bars:before{content:"\uE672"}.van-icon-balance-list-o:before{content:"\uE673"}.van-icon-birthday-cake-o:before{content:"\uE674"}.van-icon-bookmark:before{content:"\uE675"}.van-icon-bill:before{content:"\uE676"}.van-icon-bell:before{content:"\uE677"}.van-icon-browsing-history-o:before{content:"\uE678"}.van-icon-browsing-history:before{content:"\uE679"}.van-icon-bookmark-o:before{content:"\uE67A"}.van-icon-bulb-o:before{content:"\uE67B"}.van-icon-bullhorn-o:before{content:"\uE67C"}.van-icon-bill-o:before{content:"\uE67D"}.van-icon-calendar-o:before{content:"\uE67E"}.van-icon-brush-o:before{content:"\uE67F"}.van-icon-card:before{content:"\uE680"}.van-icon-cart-o:before{content:"\uE681"}.van-icon-cart-circle:before{content:"\uE682"}.van-icon-cart-circle-o:before{content:"\uE683"}.van-icon-cart:before{content:"\uE684"}.van-icon-cash-on-deliver:before{content:"\uE685"}.van-icon-cash-back-record-o:before{content:"\uE686"}.van-icon-cashier-o:before{content:"\uE687"}.van-icon-chart-trending-o:before{content:"\uE688"}.van-icon-certificate:before{content:"\uE689"}.van-icon-chat:before{content:"\uE68A"}.van-icon-clear:before{content:"\uE68B"}.van-icon-chat-o:before{content:"\uE68C"}.van-icon-checked:before{content:"\uE68D"}.van-icon-clock:before{content:"\uE68E"}.van-icon-clock-o:before{content:"\uE68F"}.van-icon-close:before{content:"\uE690"}.van-icon-closed-eye:before{content:"\uE691"}.van-icon-circle:before{content:"\uE692"}.van-icon-cluster-o:before{content:"\uE693"}.van-icon-column:before{content:"\uE694"}.van-icon-comment-circle-o:before{content:"\uE695"}.van-icon-cluster:before{content:"\uE696"}.van-icon-comment:before{content:"\uE697"}.van-icon-comment-o:before{content:"\uE698"}.van-icon-comment-circle:before{content:"\uE699"}.van-icon-completed-o:before{content:"\uE69A"}.van-icon-credit-pay:before{content:"\uE69B"}.van-icon-coupon:before{content:"\uE69C"}.van-icon-debit-pay:before{content:"\uE69D"}.van-icon-coupon-o:before{content:"\uE69E"}.van-icon-contact-o:before{content:"\uE69F"}.van-icon-descending:before{content:"\uE6A0"}.van-icon-desktop-o:before{content:"\uE6A1"}.van-icon-diamond-o:before{content:"\uE6A2"}.van-icon-description-o:before{content:"\uE6A3"}.van-icon-delete:before{content:"\uE6A4"}.van-icon-diamond:before{content:"\uE6A5"}.van-icon-delete-o:before{content:"\uE6A6"}.van-icon-cross:before{content:"\uE6A7"}.van-icon-edit:before{content:"\uE6A8"}.van-icon-ellipsis:before{content:"\uE6A9"}.van-icon-down:before{content:"\uE6AA"}.van-icon-discount-o:before{content:"\uE6AB"}.van-icon-ecard-pay:before{content:"\uE6AC"}.van-icon-envelop-o:before{content:"\uE6AE"}@font-face{font-weight:400;font-family:vant-icon;font-style:normal;font-display:auto;src:url(data:font/woff2;charset=utf-8;base64,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) format("woff2"),url(//at.alicdn.com/t/c/font_2553510_ciljc7axaw7.woff?t=1705587463221) format("woff")}.van-icon__image{display:block;width:1em;height:1em;object-fit:contain}:root,:host{--van-overlay-z-index: 1;--van-overlay-background: rgba(0, 0, 0, .7)}.van-overlay{position:fixed;top:0;left:0;z-index:var(--van-overlay-z-index);width:100%;height:100%;background:var(--van-overlay-background)}:root,:host{--van-popup-background: var(--van-background-2);--van-popup-transition: transform var(--van-duration-base);--van-popup-round-radius: 16px;--van-popup-close-icon-size: 22px;--van-popup-close-icon-color: var(--van-gray-5);--van-popup-close-icon-margin: 16px;--van-popup-close-icon-z-index: 1}.van-overflow-hidden{overflow:hidden!important}.van-popup{position:fixed;max-height:100%;overflow-y:auto;box-sizing:border-box;background:var(--van-popup-background);transition:var(--van-popup-transition);-webkit-overflow-scrolling:touch}.van-popup--center{top:50%;left:0;right:0;width:-webkit-fit-content;width:fit-content;max-width:calc(100vw - var(--van-padding-md) * 2);margin:0 auto;transform:translateY(-50%)}.van-popup--center.van-popup--round{border-radius:var(--van-popup-round-radius)}.van-popup--top{top:0;left:0;width:100%}.van-popup--top.van-popup--round{border-radius:0 0 var(--van-popup-round-radius) var(--van-popup-round-radius)}.van-popup--right{top:50%;right:0;transform:translate3d(0,-50%,0)}.van-popup--right.van-popup--round{border-radius:var(--van-popup-round-radius) 0 0 var(--van-popup-round-radius)}.van-popup--bottom{bottom:0;left:0;width:100%}.van-popup--bottom.van-popup--round{border-radius:var(--van-popup-round-radius) var(--van-popup-round-radius) 0 0}.van-popup--left{top:50%;left:0;transform:translate3d(0,-50%,0)}.van-popup--left.van-popup--round{border-radius:0 var(--van-popup-round-radius) var(--van-popup-round-radius) 0}.van-popup-slide-top-enter-active,.van-popup-slide-left-enter-active,.van-popup-slide-right-enter-active,.van-popup-slide-bottom-enter-active{transition-timing-function:var(--van-ease-out)}.van-popup-slide-top-leave-active,.van-popup-slide-left-leave-active,.van-popup-slide-right-leave-active,.van-popup-slide-bottom-leave-active{transition-timing-function:var(--van-ease-in)}.van-popup-slide-top-enter-from,.van-popup-slide-top-leave-active{transform:translate3d(0,-100%,0)}.van-popup-slide-right-enter-from,.van-popup-slide-right-leave-active{transform:translate3d(100%,-50%,0)}.van-popup-slide-bottom-enter-from,.van-popup-slide-bottom-leave-active{transform:translate3d(0,100%,0)}.van-popup-slide-left-enter-from,.van-popup-slide-left-leave-active{transform:translate3d(-100%,-50%,0)}.van-popup__close-icon{position:absolute;z-index:var(--van-popup-close-icon-z-index);color:var(--van-popup-close-icon-color);font-size:var(--van-popup-close-icon-size)}.van-popup__close-icon--top-left{top:var(--van-popup-close-icon-margin);left:var(--van-popup-close-icon-margin)}.van-popup__close-icon--top-right{top:var(--van-popup-close-icon-margin);right:var(--van-popup-close-icon-margin)}.van-popup__close-icon--bottom-left{bottom:var(--van-popup-close-icon-margin);left:var(--van-popup-close-icon-margin)}.van-popup__close-icon--bottom-right{right:var(--van-popup-close-icon-margin);bottom:var(--van-popup-close-icon-margin)}:root,:host{--van-sticky-z-index: 99}.van-sticky--fixed{position:fixed;z-index:var(--van-sticky-z-index)}:root,:host{--van-swipe-indicator-size: 6px;--van-swipe-indicator-margin: var(--van-padding-sm);--van-swipe-indicator-active-opacity: 1;--van-swipe-indicator-inactive-opacity: .3;--van-swipe-indicator-active-background: var(--van-primary-color);--van-swipe-indicator-inactive-background: var(--van-border-color)}.van-swipe{position:relative;overflow:hidden;transform:translateZ(0);cursor:-webkit-grab;cursor:grab;-webkit-user-select:none;user-select:none}.van-swipe__track{display:flex;height:100%;transition-property:transform}.van-swipe__track--vertical{flex-direction:column}.van-swipe__indicators{position:absolute;bottom:var(--van-swipe-indicator-margin);left:50%;display:flex;transform:translate(-50%)}.van-swipe__indicators--vertical{top:50%;bottom:auto;left:var(--van-swipe-indicator-margin);flex-direction:column;transform:translateY(-50%)}.van-swipe__indicators--vertical .van-swipe__indicator:not(:last-child){margin-bottom:var(--van-swipe-indicator-size)}.van-swipe__indicator{width:var(--van-swipe-indicator-size);height:var(--van-swipe-indicator-size);background-color:var(--van-swipe-indicator-inactive-background);border-radius:100%;opacity:var(--van-swipe-indicator-inactive-opacity);transition:opacity var(--van-duration-fast),background-color var(--van-duration-fast)}.van-swipe__indicator:not(:last-child){margin-right:var(--van-swipe-indicator-size)}.van-swipe__indicator--active{background-color:var(--van-swipe-indicator-active-background);opacity:var(--van-swipe-indicator-active-opacity)}:root,:host{--van-tab-text-color: var(--van-gray-7);--van-tab-active-text-color: var(--van-text-color);--van-tab-disabled-text-color: var(--van-text-color-3);--van-tab-font-size: var(--van-font-size-md);--van-tab-line-height: var(--van-line-height-md);--van-tabs-default-color: var(--van-primary-color);--van-tabs-line-height: 44px;--van-tabs-card-height: 30px;--van-tabs-nav-background: var(--van-background-2);--van-tabs-bottom-bar-width: 40px;--van-tabs-bottom-bar-height: 3px;--van-tabs-bottom-bar-color: var(--van-primary-color)}.van-tab{position:relative;display:flex;flex:1;align-items:center;justify-content:center;box-sizing:border-box;padding:0 var(--van-padding-base);color:var(--van-tab-text-color);font-size:var(--van-tab-font-size);line-height:var(--van-tab-line-height);cursor:pointer}.van-tab--active{color:var(--van-tab-active-text-color);font-weight:var(--van-font-bold)}.van-tab--disabled{color:var(--van-tab-disabled-text-color);cursor:not-allowed}.van-tab--grow{flex:1 0 auto;padding:0 var(--van-padding-sm)}.van-tab--shrink{flex:none;padding:0 var(--van-padding-xs)}.van-tab--card{color:var(--van-tabs-default-color);border-right:var(--van-border-width) solid var(--van-tabs-default-color)}.van-tab--card:last-child{border-right:none}.van-tab--card.van-tab--active{color:var(--van-white);background-color:var(--van-tabs-default-color)}.van-tab--card--disabled{color:var(--van-tab-disabled-text-color)}.van-tab__text--ellipsis{display:-webkit-box;overflow:hidden;-webkit-line-clamp:1;-webkit-box-orient:vertical}.van-tabs{position:relative}.van-tabs__wrap{overflow:hidden}.van-tabs__wrap--page-top{position:fixed}.van-tabs__wrap--content-bottom{top:auto;bottom:0}.van-tabs__nav{position:relative;display:flex;background:var(--van-tabs-nav-background);-webkit-user-select:none;user-select:none}.van-tabs__nav--complete{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch}.van-tabs__nav--complete::-webkit-scrollbar{display:none}.van-tabs__nav--line{box-sizing:content-box;height:100%;padding-bottom:15px}.van-tabs__nav--line.van-tabs__nav--shrink,.van-tabs__nav--line.van-tabs__nav--complete{padding-right:var(--van-padding-xs);padding-left:var(--van-padding-xs)}.van-tabs__nav--card{box-sizing:border-box;height:var(--van-tabs-card-height);margin:0 var(--van-padding-md);border:var(--van-border-width) solid var(--van-tabs-default-color);border-radius:var(--van-radius-sm)}.van-tabs__nav--card.van-tabs__nav--shrink{display:inline-flex}.van-tabs__line{position:absolute;bottom:15px;left:0;z-index:1;width:var(--van-tabs-bottom-bar-width);height:var(--van-tabs-bottom-bar-height);background:var(--van-tabs-bottom-bar-color);border-radius:var(--van-tabs-bottom-bar-height)}.van-tabs__track{position:relative;display:flex;width:100%;height:100%;will-change:left}.van-tabs__content--animated{overflow:hidden}.van-tabs--line .van-tabs__wrap{height:var(--van-tabs-line-height)}.van-tabs--card>.van-tabs__wrap{height:var(--van-tabs-card-height)}.van-radio-group--horizontal{display:flex;flex-wrap:wrap}:root,:host{--van-checkbox-size: 20px;--van-checkbox-border-color: var(--van-gray-5);--van-checkbox-duration: var(--van-duration-fast);--van-checkbox-label-margin: var(--van-padding-xs);--van-checkbox-label-color: var(--van-text-color);--van-checkbox-checked-icon-color: var(--van-primary-color);--van-checkbox-disabled-icon-color: var(--van-gray-5);--van-checkbox-disabled-label-color: var(--van-text-color-3);--van-checkbox-disabled-background: var(--van-border-color)}.van-checkbox{display:flex;align-items:center;overflow:hidden;cursor:pointer;-webkit-user-select:none;user-select:none}.van-checkbox--disabled{cursor:not-allowed}.van-checkbox--label-disabled{cursor:default}.van-checkbox--horizontal{margin-right:var(--van-padding-sm)}.van-checkbox__icon{flex:none;height:1em;font-size:var(--van-checkbox-size);line-height:1em;cursor:pointer}.van-checkbox__icon .van-icon{display:block;box-sizing:border-box;width:1.25em;height:1.25em;color:transparent;font-size:.8em;line-height:1.25;text-align:center;border:1px solid var(--van-checkbox-border-color);transition-duration:var(--van-checkbox-duration);transition-property:color,border-color,background-color}.van-checkbox__icon--round .van-icon{border-radius:100%}.van-checkbox__icon--indeterminate .van-icon{display:flex;align-items:center;justify-content:center;color:var(--van-white);border-color:var(--van-checkbox-checked-icon-color);background-color:var(--van-checkbox-checked-icon-color)}.van-checkbox__icon--checked .van-icon{color:var(--van-white);background-color:var(--van-checkbox-checked-icon-color);border-color:var(--van-checkbox-checked-icon-color)}.van-checkbox__icon--disabled{cursor:not-allowed}.van-checkbox__icon--disabled .van-icon{background-color:var(--van-checkbox-disabled-background);border-color:var(--van-checkbox-disabled-icon-color)}.van-checkbox__icon--disabled.van-checkbox__icon--checked .van-icon{color:var(--van-checkbox-disabled-icon-color)}.van-checkbox__label{margin-left:var(--van-checkbox-label-margin);color:var(--van-checkbox-label-color);line-height:var(--van-checkbox-size)}.van-checkbox__label--left{margin:0 var(--van-checkbox-label-margin) 0 0}.van-checkbox__label--disabled{color:var(--van-checkbox-disabled-label-color)}:root,:host{--van-radio-size: 20px;--van-radio-dot-size: 8px;--van-radio-border-color: var(--van-gray-5);--van-radio-duration: var(--van-duration-fast);--van-radio-label-margin: var(--van-padding-xs);--van-radio-label-color: var(--van-text-color);--van-radio-checked-icon-color: var(--van-primary-color);--van-radio-disabled-icon-color: var(--van-gray-5);--van-radio-disabled-label-color: var(--van-text-color-3);--van-radio-disabled-background: var(--van-border-color)}.van-radio{display:flex;align-items:center;overflow:hidden;cursor:pointer;-webkit-user-select:none;user-select:none}.van-radio--disabled{cursor:not-allowed}.van-radio--label-disabled{cursor:default}.van-radio--horizontal{margin-right:var(--van-padding-sm)}.van-radio__icon{flex:none;height:1em;font-size:var(--van-radio-size);line-height:1em;cursor:pointer}.van-radio__icon .van-icon{display:block;box-sizing:border-box;width:1.25em;height:1.25em;color:transparent;font-size:.8em;line-height:1.25;text-align:center;border:1px solid var(--van-radio-border-color);transition-duration:var(--van-radio-duration);transition-property:color,border-color,background-color}.van-radio__icon--round .van-icon{border-radius:100%}.van-radio__icon--dot{position:relative;border-radius:100%;box-sizing:border-box;width:var(--van-radio-size);height:var(--van-radio-size);border:1px solid var(--van-radio-border-color);transition-duration:var(--van-radio-duration);transition-property:border-color}.van-radio__icon--dot__icon{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);border-radius:100%;height:calc(100% - var(--van-radio-dot-size));width:calc(100% - var(--van-radio-dot-size));transition-duration:var(--van-radio-duration);transition-property:background-color}.van-radio__icon--checked .van-icon{color:var(--van-white);background-color:var(--van-radio-checked-icon-color);border-color:var(--van-radio-checked-icon-color)}.van-radio__icon--checked.van-radio__icon--dot{border-color:var(--van-radio-checked-icon-color)}.van-radio__icon--checked.van-radio__icon--dot .van-radio__icon--dot__icon{background:var(--van-radio-checked-icon-color)}.van-radio__icon--disabled{cursor:not-allowed}.van-radio__icon--disabled .van-icon{background-color:var(--van-radio-disabled-background);border-color:var(--van-radio-disabled-icon-color)}.van-radio__icon--disabled.van-radio__icon--checked .van-icon{color:var(--van-radio-disabled-icon-color)}.van-radio__label{margin-left:var(--van-radio-label-margin);color:var(--van-radio-label-color);line-height:var(--van-radio-size)}.van-radio__label--left{margin:0 var(--van-radio-label-margin) 0 0}.van-radio__label--disabled{color:var(--van-radio-disabled-label-color)}:root,:host{--van-stepper-background: var(--van-active-color);--van-stepper-button-icon-color: var(--van-text-color);--van-stepper-button-disabled-color: var(--van-background);--van-stepper-button-disabled-icon-color: var(--van-gray-5);--van-stepper-button-round-theme-color: var(--van-primary-color);--van-stepper-input-width: 32px;--van-stepper-input-height: 28px;--van-stepper-input-font-size: var(--van-font-size-md);--van-stepper-input-line-height: normal;--van-stepper-input-text-color: var(--van-text-color);--van-stepper-input-disabled-text-color: var(--van-text-color-3);--van-stepper-input-disabled-background: var(--van-active-color);--van-stepper-radius: var(--van-radius-md)}.van-stepper{display:inline-block;-webkit-user-select:none;user-select:none}.van-stepper__minus,.van-stepper__plus{position:relative;box-sizing:border-box;width:var(--van-stepper-input-height);height:var(--van-stepper-input-height);margin:0;padding:0;color:var(--van-stepper-button-icon-color);vertical-align:middle;background:var(--van-stepper-background);border:0}.van-stepper__minus:before,.van-stepper__plus:before{width:50%;height:1px}.van-stepper__minus:after,.van-stepper__plus:after{width:1px;height:50%}.van-stepper__minus:before,.van-stepper__plus:before,.van-stepper__minus:after,.van-stepper__plus:after{position:absolute;top:50%;left:50%;background-color:currentColor;transform:translate(-50%,-50%);content:""}.van-stepper__minus--disabled,.van-stepper__plus--disabled{color:var(--van-stepper-button-disabled-icon-color);background-color:var(--van-stepper-button-disabled-color);cursor:not-allowed}.van-stepper__minus{border-radius:var(--van-stepper-radius) 0 0 var(--van-stepper-radius)}.van-stepper__minus:after{display:none}.van-stepper__plus{border-radius:0 var(--van-stepper-radius) var(--van-stepper-radius) 0}.van-stepper__input{box-sizing:border-box;width:var(--van-stepper-input-width);height:var(--van-stepper-input-height);margin:0 2px;padding:0;color:var(--van-stepper-input-text-color);font-size:var(--van-stepper-input-font-size);line-height:var(--van-stepper-input-line-height);text-align:center;vertical-align:middle;background:var(--van-stepper-background);border:0;border-width:1px 0;border-radius:0;-webkit-appearance:none}.van-stepper__input:disabled{color:var(--van-stepper-input-disabled-text-color);background-color:var(--van-stepper-input-disabled-background);-webkit-text-fill-color:var(--van-stepper-input-disabled-text-color);opacity:1}.van-stepper__input:read-only{cursor:default}.van-stepper--round .van-stepper__input{background-color:transparent}.van-stepper--round .van-stepper__plus,.van-stepper--round .van-stepper__minus{border-radius:100%}.van-stepper--round .van-stepper__plus--disabled,.van-stepper--round .van-stepper__minus--disabled{opacity:.3;cursor:not-allowed}.van-stepper--round .van-stepper__plus{color:var(--van-white);background:var(--van-stepper-button-round-theme-color)}.van-stepper--round .van-stepper__minus{color:var(--van-stepper-button-round-theme-color);background-color:var(--van-background-2);border:1px solid var(--van-stepper-button-round-theme-color)}:root,:host{--van-cell-font-size: var(--van-font-size-md);--van-cell-line-height: 24px;--van-cell-vertical-padding: 10px;--van-cell-horizontal-padding: var(--van-padding-md);--van-cell-text-color: var(--van-text-color);--van-cell-background: var(--van-background-2);--van-cell-border-color: var(--van-border-color);--van-cell-active-color: var(--van-active-color);--van-cell-required-color: var(--van-danger-color);--van-cell-label-color: var(--van-text-color-2);--van-cell-label-font-size: var(--van-font-size-sm);--van-cell-label-line-height: var(--van-line-height-sm);--van-cell-label-margin-top: var(--van-padding-base);--van-cell-value-color: var(--van-text-color-2);--van-cell-value-font-size: inherit;--van-cell-icon-size: 16px;--van-cell-right-icon-color: var(--van-gray-6);--van-cell-large-vertical-padding: var(--van-padding-sm);--van-cell-large-title-font-size: var(--van-font-size-lg);--van-cell-large-label-font-size: var(--van-font-size-md);--van-cell-large-value-font-size: inherit}.van-cell{position:relative;display:flex;box-sizing:border-box;width:100%;padding:var(--van-cell-vertical-padding) var(--van-cell-horizontal-padding);overflow:hidden;color:var(--van-cell-text-color);font-size:var(--van-cell-font-size);line-height:var(--van-cell-line-height);background:var(--van-cell-background)}.van-cell:after{position:absolute;box-sizing:border-box;content:" ";pointer-events:none;right:var(--van-padding-md);bottom:0;left:var(--van-padding-md);border-bottom:1px solid var(--van-cell-border-color);transform:scaleY(.5)}.van-cell:last-child:after,.van-cell--borderless:after{display:none}.van-cell__label{margin-top:var(--van-cell-label-margin-top);color:var(--van-cell-label-color);font-size:var(--van-cell-label-font-size);line-height:var(--van-cell-label-line-height)}.van-cell__title,.van-cell__value{flex:1}.van-cell__value{position:relative;overflow:hidden;color:var(--van-cell-value-color);font-size:var(--van-cell-value-font-size);text-align:right;vertical-align:middle;word-wrap:break-word}.van-cell__left-icon,.van-cell__right-icon{height:var(--van-cell-line-height);font-size:var(--van-cell-icon-size);line-height:var(--van-cell-line-height)}.van-cell__left-icon{margin-right:var(--van-padding-base)}.van-cell__right-icon{margin-left:var(--van-padding-base);color:var(--van-cell-right-icon-color)}.van-cell--clickable{cursor:pointer}.van-cell--clickable:active{background-color:var(--van-cell-active-color)}.van-cell--required{overflow:visible}.van-cell--required:before{position:absolute;left:var(--van-padding-xs);color:var(--van-cell-required-color);font-size:var(--van-cell-font-size);content:"*"}.van-cell--center{align-items:center}.van-cell--large{padding-top:var(--van-cell-large-vertical-padding);padding-bottom:var(--van-cell-large-vertical-padding)}.van-cell--large .van-cell__title{font-size:var(--van-cell-large-title-font-size)}.van-cell--large .van-cell__label{font-size:var(--van-cell-large-label-font-size)}.van-cell--large .van-cell__value{font-size:var(--van-cell-large-value-font-size)}:root,:host{--van-field-label-width: 6.2em;--van-field-label-color: var(--van-text-color);--van-field-label-margin-right: var(--van-padding-sm);--van-field-input-text-color: var(--van-text-color);--van-field-input-error-text-color: var(--van-danger-color);--van-field-input-disabled-text-color: var(--van-text-color-3);--van-field-placeholder-text-color: var(--van-text-color-3);--van-field-icon-size: 18px;--van-field-clear-icon-size: 18px;--van-field-clear-icon-color: var(--van-gray-5);--van-field-right-icon-color: var(--van-gray-6);--van-field-error-message-color: var(--van-danger-color);--van-field-error-message-font-size: 12px;--van-field-text-area-min-height: 60px;--van-field-word-limit-color: var(--van-gray-7);--van-field-word-limit-font-size: var(--van-font-size-sm);--van-field-word-limit-line-height: 16px;--van-field-disabled-text-color: var(--van-text-color-3);--van-field-required-mark-color: var(--van-red)}.van-field{flex-wrap:wrap}.van-field__label{flex:none;box-sizing:border-box;width:var(--van-field-label-width);margin-right:var(--van-field-label-margin-right);color:var(--van-field-label-color);text-align:left;word-wrap:break-word}.van-field__label--center{text-align:center}.van-field__label--right{text-align:right}.van-field__label--top{display:flex;width:100%;text-align:left;margin-bottom:var(--van-padding-base);overflow-wrap:break-word}.van-field__label--required:before{margin-right:2px;color:var(--van-field-required-mark-color);content:"*"}.van-field--disabled .van-field__label{color:var(--van-field-disabled-text-color)}.van-field__value{overflow:visible}.van-field__body{display:flex;align-items:center}.van-field__control{display:block;box-sizing:border-box;width:100%;min-width:0;margin:0;padding:0;color:var(--van-field-input-text-color);line-height:inherit;text-align:left;background-color:transparent;border:0;resize:none;-webkit-user-select:auto;user-select:auto}.van-field__control::-webkit-input-placeholder{color:var(--van-field-placeholder-text-color)}.van-field__control::placeholder{color:var(--van-field-placeholder-text-color)}.van-field__control:read-only{cursor:default}.van-field__control:disabled{color:var(--van-field-input-disabled-text-color);cursor:not-allowed;opacity:1;-webkit-text-fill-color:var(--van-field-input-disabled-text-color)}.van-field__control--center{justify-content:center;text-align:center}.van-field__control--right{justify-content:flex-end;text-align:right}.van-field__control--custom{display:flex;align-items:center;min-height:var(--van-cell-line-height)}.van-field__control--error::-webkit-input-placeholder{color:var(--van-field-input-error-text-color);-webkit-text-fill-color:currentColor}.van-field__control--error,.van-field__control--error::placeholder{color:var(--van-field-input-error-text-color);-webkit-text-fill-color:currentColor}.van-field__control--min-height{min-height:var(--van-field-text-area-min-height)}.van-field__control[type=date],.van-field__control[type=time],.van-field__control[type=datetime-local]{min-height:var(--van-cell-line-height)}.van-field__control[type=search]{-webkit-appearance:none}.van-field__clear,.van-field__icon,.van-field__button,.van-field__right-icon{flex-shrink:0}.van-field__clear,.van-field__right-icon{margin-right:calc(var(--van-padding-xs) * -1);padding:0 var(--van-padding-xs);line-height:inherit}.van-field__clear{color:var(--van-field-clear-icon-color);font-size:var(--van-field-clear-icon-size);cursor:pointer}.van-field__left-icon .van-icon,.van-field__right-icon .van-icon{display:block;font-size:var(--van-field-icon-size);line-height:inherit}.van-field__left-icon{margin-right:var(--van-padding-base)}.van-field__right-icon{color:var(--van-field-right-icon-color)}.van-field__button{padding-left:var(--van-padding-xs)}.van-field__error-message{color:var(--van-field-error-message-color);font-size:var(--van-field-error-message-font-size);text-align:left}.van-field__error-message--center{text-align:center}.van-field__error-message--right{text-align:right}.van-field__word-limit{margin-top:var(--van-padding-base);color:var(--van-field-word-limit-color);font-size:var(--van-field-word-limit-font-size);line-height:var(--van-field-word-limit-line-height);text-align:right}.van-swipe-item{position:relative;flex-shrink:0;width:100%;height:100%}.van-tab__panel,.van-tab__panel-wrapper{flex-shrink:0;box-sizing:border-box;width:100%}.van-tab__panel-wrapper--inactive{height:0;overflow:visible}:root,:host{--van-cell-group-background: var(--van-background-2);--van-cell-group-title-color: var(--van-text-color-2);--van-cell-group-title-padding: var(--van-padding-md) var(--van-padding-md);--van-cell-group-title-font-size: var(--van-font-size-md);--van-cell-group-title-line-height: 16px;--van-cell-group-inset-padding: 0 var(--van-padding-md);--van-cell-group-inset-radius: var(--van-radius-lg);--van-cell-group-inset-title-padding: var(--van-padding-md) var(--van-padding-md)}.van-cell-group{background:var(--van-cell-group-background)}.van-cell-group--inset{margin:var(--van-cell-group-inset-padding);border-radius:var(--van-cell-group-inset-radius);overflow:hidden}.van-cell-group__title{padding:var(--van-cell-group-title-padding);color:var(--van-cell-group-title-color);font-size:var(--van-cell-group-title-font-size);line-height:var(--van-cell-group-title-line-height)}.van-cell-group__title--inset{padding:var(--van-cell-group-inset-title-padding)}:root,:host{--van-loading-text-color: var(--van-text-color-2);--van-loading-text-font-size: var(--van-font-size-md);--van-loading-spinner-color: var(--van-gray-5);--van-loading-spinner-size: 30px;--van-loading-spinner-duration: .8s}.van-loading{position:relative;color:var(--van-loading-spinner-color);font-size:0;vertical-align:middle}.van-loading__spinner{position:relative;display:inline-block;width:var(--van-loading-spinner-size);max-width:100%;height:var(--van-loading-spinner-size);max-height:100%;vertical-align:middle;animation:van-rotate var(--van-loading-spinner-duration) linear infinite}.van-loading__spinner--spinner{animation-timing-function:steps(12)}.van-loading__spinner--circular{animation-duration:2s}.van-loading__line{position:absolute;top:0;left:0;width:100%;height:100%}.van-loading__line:before{display:block;width:2px;height:25%;margin:0 auto;background-color:currentColor;border-radius:40%;content:" "}.van-loading__circular{display:block;width:100%;height:100%}.van-loading__circular circle{animation:van-circular 1.5s ease-in-out infinite;stroke:currentColor;stroke-width:3;stroke-linecap:round}.van-loading__text{display:inline-block;margin-left:var(--van-padding-xs);color:var(--van-loading-text-color);font-size:var(--van-loading-text-font-size);vertical-align:middle}.van-loading--vertical{display:flex;flex-direction:column;align-items:center}.van-loading--vertical .van-loading__text{margin:var(--van-padding-xs) 0 0}@keyframes van-circular{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40}to{stroke-dasharray:90,150;stroke-dashoffset:-120}}.van-loading__line--1{transform:rotate(30deg);opacity:1}.van-loading__line--2{transform:rotate(60deg);opacity:.9375}.van-loading__line--3{transform:rotate(90deg);opacity:.875}.van-loading__line--4{transform:rotate(120deg);opacity:.8125}.van-loading__line--5{transform:rotate(150deg);opacity:.75}.van-loading__line--6{transform:rotate(180deg);opacity:.6875}.van-loading__line--7{transform:rotate(210deg);opacity:.625}.van-loading__line--8{transform:rotate(240deg);opacity:.5625}.van-loading__line--9{transform:rotate(270deg);opacity:.5}.van-loading__line--10{transform:rotate(300deg);opacity:.4375}.van-loading__line--11{transform:rotate(330deg);opacity:.375}.van-loading__line--12{transform:rotate(360deg);opacity:.3125}:root,:host{--van-switch-size: 26px;--van-switch-width: calc(1.8em + 4px) ;--van-switch-height: calc(1em + 4px) ;--van-switch-node-size: 1em;--van-switch-node-background: var(--van-white);--van-switch-node-shadow: 0 3px 1px 0 rgba(0, 0, 0, .05);--van-switch-background: rgba(120, 120, 128, .16);--van-switch-on-background: var(--van-primary-color);--van-switch-duration: var(--van-duration-base);--van-switch-disabled-opacity: var(--van-disabled-opacity)}.van-theme-dark{--van-switch-background: rgba(120, 120, 128, .32)}.van-switch{position:relative;display:inline-block;box-sizing:content-box;width:var(--van-switch-width);height:var(--van-switch-height);font-size:var(--van-switch-size);background:var(--van-switch-background);border-radius:var(--van-switch-node-size);cursor:pointer;transition:background-color var(--van-switch-duration)}.van-switch__node{position:absolute;top:2px;left:2px;width:var(--van-switch-node-size);height:var(--van-switch-node-size);font-size:inherit;background:var(--van-switch-node-background);border-radius:100%;box-shadow:var(--van-switch-node-shadow);transition:transform var(--van-switch-duration) cubic-bezier(.3,1.05,.4,1.05)}.van-switch__loading{top:25%;left:25%;width:50%;height:50%;line-height:1}.van-switch--on{background:var(--van-switch-on-background)}.van-switch--on .van-switch__node{transform:translate(calc(var(--van-switch-width) - var(--van-switch-node-size) - 4px))}.van-switch--on .van-switch__loading{color:var(--van-switch-on-background)}.van-switch--disabled{cursor:not-allowed;opacity:var(--van-switch-disabled-opacity)}.van-switch--loading{cursor:default}:root,:host{--van-nav-bar-height: 46px;--van-nav-bar-background: var(--van-background-2);--van-nav-bar-arrow-size: 16px;--van-nav-bar-icon-color: var(--van-primary-color);--van-nav-bar-text-color: var(--van-primary-color);--van-nav-bar-title-font-size: var(--van-font-size-lg);--van-nav-bar-title-text-color: var(--van-text-color);--van-nav-bar-z-index: 1;--van-nav-bar-disabled-opacity: var(--van-disabled-opacity)}.van-nav-bar{position:relative;z-index:var(--van-nav-bar-z-index);line-height:var(--van-line-height-lg);text-align:center;background:var(--van-nav-bar-background);-webkit-user-select:none;user-select:none}.van-nav-bar--fixed{position:fixed;top:0;left:0;width:100%}.van-nav-bar--safe-area-inset-top{padding-top:constant(safe-area-inset-top);padding-top:env(safe-area-inset-top)}.van-nav-bar .van-icon{color:var(--van-nav-bar-icon-color)}.van-nav-bar__content{position:relative;display:flex;align-items:center;height:var(--van-nav-bar-height)}.van-nav-bar__arrow{margin-right:var(--van-padding-base);font-size:var(--van-nav-bar-arrow-size)}.van-nav-bar__title{max-width:60%;margin:0 auto;color:var(--van-nav-bar-title-text-color);font-weight:var(--van-font-bold);font-size:var(--van-nav-bar-title-font-size)}.van-nav-bar__left,.van-nav-bar__right{position:absolute;top:0;bottom:0;display:flex;align-items:center;padding:0 var(--van-padding-md);font-size:var(--van-font-size-md)}.van-nav-bar__left--disabled,.van-nav-bar__right--disabled{cursor:not-allowed;opacity:var(--van-nav-bar-disabled-opacity)}.van-nav-bar__left{left:0}.van-nav-bar__right{right:0}.van-nav-bar__text{color:var(--van-nav-bar-text-color)}:root,:host{--van-image-placeholder-text-color: var(--van-text-color-2);--van-image-placeholder-font-size: var(--van-font-size-md);--van-image-placeholder-background: var(--van-background);--van-image-loading-icon-size: 32px;--van-image-loading-icon-color: var(--van-gray-4);--van-image-error-icon-size: 32px;--van-image-error-icon-color: var(--van-gray-4)}.van-image{position:relative;display:inline-block}.van-image--round{overflow:hidden;border-radius:var(--van-radius-max)}.van-image--round .van-image__img{border-radius:inherit}.van-image--block{display:block}.van-image__img,.van-image__error,.van-image__loading{display:block;width:100%;height:100%}.van-image__error,.van-image__loading{position:absolute;top:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--van-image-placeholder-text-color);font-size:var(--van-image-placeholder-font-size);background:var(--van-image-placeholder-background)}.van-image__loading-icon{color:var(--van-image-loading-icon-color);font-size:var(--van-image-loading-icon-size)}.van-image__error-icon{color:var(--van-image-error-icon-color);font-size:var(--van-image-error-icon-size)}#app[data-v-b5ca6ba1]{position:fixed;left:0;right:0;bottom:0;top:0;margin:auto;z-index:1040;color:#000;width:375px;height:400px;background-color:#eee}.tab-content[data-v-b5ca6ba1]{margin-top:8px}.tab-content .cell-group[data-v-b5ca6ba1]{margin-bottom:8px}.console-switch[data-v-b5ca6ba1]{left:0;bottom:calc(50vh - 15px);position:fixed;display:flex;color:#0a0a0a;background-color:#eee;padding:.5em;box-shadow:0 0 4em 4px #eeeeee8c;align-items:center;border-radius:0 1em 1em 0;border:1px solid #9E9E9E;border-left-width:0}.console-switch span[data-v-b5ca6ba1]{margin-left:5px}:root,:host{--van-toast-max-width: 70%;--van-toast-font-size: var(--van-font-size-md);--van-toast-text-color: var(--van-white);--van-toast-loading-icon-color: var(--van-white);--van-toast-line-height: var(--van-line-height-md);--van-toast-radius: var(--van-radius-lg);--van-toast-background: rgba(0, 0, 0, .7);--van-toast-icon-size: 36px;--van-toast-text-min-width: 96px;--van-toast-text-padding: var(--van-padding-xs) var(--van-padding-sm);--van-toast-default-padding: var(--van-padding-md);--van-toast-default-width: 88px;--van-toast-default-min-height: 88px;--van-toast-position-top-distance: 20%;--van-toast-position-bottom-distance: 20%}.van-toast{display:flex;flex-direction:column;align-items:center;justify-content:center;box-sizing:content-box;transition:all var(--van-duration-fast);width:var(--van-toast-default-width);max-width:var(--van-toast-max-width);min-height:var(--van-toast-default-min-height);padding:var(--van-toast-default-padding);color:var(--van-toast-text-color);font-size:var(--van-toast-font-size);line-height:var(--van-toast-line-height);white-space:pre-wrap;word-break:break-all;text-align:center;background:var(--van-toast-background);border-radius:var(--van-toast-radius)}.van-toast--break-normal{word-break:normal;word-wrap:normal}.van-toast--break-word{word-break:normal;word-wrap:break-word}.van-toast--unclickable{overflow:hidden;cursor:not-allowed}.van-toast--unclickable *{pointer-events:none}.van-toast--text,.van-toast--html{width:-webkit-fit-content;width:fit-content;min-width:var(--van-toast-text-min-width);min-height:0;padding:var(--van-toast-text-padding)}.van-toast--text .van-toast__text,.van-toast--html .van-toast__text{margin-top:0}.van-toast--top{top:var(--van-toast-position-top-distance)}.van-toast--bottom{top:auto;bottom:var(--van-toast-position-bottom-distance)}.van-toast__icon{font-size:var(--van-toast-icon-size)}.van-toast__loading{padding:var(--van-padding-base);color:var(--van-toast-loading-icon-color)}.van-toast__text{margin-top:var(--van-padding-xs)} ');
(function (vue) {
'use strict';
function noop$1() {
}
const extend = Object.assign;
const inBrowser$1 = typeof window !== "undefined";
const isObject$2 = (val) => val !== null && typeof val === "object";
const isDef = (val) => val !== void 0 && val !== null;
const isFunction = (val) => typeof val === "function";
const isPromise = (val) => isObject$2(val) && isFunction(val.then) && isFunction(val.catch);
const isNumeric = (val) => typeof val === "number" || /^\d+(\.\d+)?$/.test(val);
const isIOS$1 = () => inBrowser$1 ? /ios|iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase()) : false;
function get(object, path) {
const keys = path.split(".");
let result = object;
keys.forEach((key) => {
var _a;
result = isObject$2(result) ? (_a = result[key]) != null ? _a : "" : "";
});
return result;
}
function pick(obj, keys, ignoreUndefined) {
return keys.reduce(
(ret, key) => {
if (!ignoreUndefined || obj[key] !== void 0) {
ret[key] = obj[key];
}
return ret;
},
{}
);
}
const toArray = (item) => Array.isArray(item) ? item : [item];
const unknownProp = null;
const numericProp = [Number, String];
const truthProp = {
type: Boolean,
default: true
};
const makeRequiredProp = (type) => ({
type,
required: true
});
const makeNumericProp = (defaultVal) => ({
type: numericProp,
default: defaultVal
});
const makeStringProp = (defaultVal) => ({
type: String,
default: defaultVal
});
var inBrowser = typeof window !== "undefined";
function raf(fn) {
return inBrowser ? requestAnimationFrame(fn) : -1;
}
function cancelRaf(id) {
if (inBrowser) {
cancelAnimationFrame(id);
}
}
function doubleRaf(fn) {
raf(() => raf(fn));
}
var isWindow = (val) => val === window;
var makeDOMRect = (width2, height2) => ({
top: 0,
left: 0,
right: width2,
bottom: height2,
width: width2,
height: height2
});
var useRect = (elementOrRef) => {
const element = vue.unref(elementOrRef);
if (isWindow(element)) {
const width2 = element.innerWidth;
const height2 = element.innerHeight;
return makeDOMRect(width2, height2);
}
if (element == null ? void 0 : element.getBoundingClientRect) {
return element.getBoundingClientRect();
}
return makeDOMRect(0, 0);
};
function useParent(key) {
const parent = vue.inject(key, null);
if (parent) {
const instance = vue.getCurrentInstance();
const { link, unlink, internalChildren } = parent;
link(instance);
vue.onUnmounted(() => unlink(instance));
const index = vue.computed(() => internalChildren.indexOf(instance));
return {
parent,
index
};
}
return {
parent: null,
index: vue.ref(-1)
};
}
function flattenVNodes(children) {
const result = [];
const traverse = (children2) => {
if (Array.isArray(children2)) {
children2.forEach((child) => {
var _a;
if (vue.isVNode(child)) {
result.push(child);
if ((_a = child.component) == null ? void 0 : _a.subTree) {
result.push(child.component.subTree);
traverse(child.component.subTree.children);
}
if (child.children) {
traverse(child.children);
}
}
});
}
};
traverse(children);
return result;
}
var findVNodeIndex = (vnodes, vnode) => {
const index = vnodes.indexOf(vnode);
if (index === -1) {
return vnodes.findIndex(
(item) => vnode.key !== void 0 && vnode.key !== null && item.type === vnode.type && item.key === vnode.key
);
}
return index;
};
function sortChildren(parent, publicChildren, internalChildren) {
const vnodes = flattenVNodes(parent.subTree.children);
internalChildren.sort(
(a, b) => findVNodeIndex(vnodes, a.vnode) - findVNodeIndex(vnodes, b.vnode)
);
const orderedPublicChildren = internalChildren.map((item) => item.proxy);
publicChildren.sort((a, b) => {
const indexA = orderedPublicChildren.indexOf(a);
const indexB = orderedPublicChildren.indexOf(b);
return indexA - indexB;
});
}
function useChildren(key) {
const publicChildren = vue.reactive([]);
const internalChildren = vue.reactive([]);
const parent = vue.getCurrentInstance();
const linkChildren = (value) => {
const link = (child) => {
if (child.proxy) {
internalChildren.push(child);
publicChildren.push(child.proxy);
sortChildren(parent, publicChildren, internalChildren);
}
};
const unlink = (child) => {
const index = internalChildren.indexOf(child);
publicChildren.splice(index, 1);
internalChildren.splice(index, 1);
};
vue.provide(
key,
Object.assign(
{
link,
unlink,
children: publicChildren,
internalChildren
},
value
)
);
};
return {
children: publicChildren,
linkChildren
};
}
function onMountedOrActivated(hook) {
let mounted;
vue.onMounted(() => {
hook();
vue.nextTick(() => {
mounted = true;
});
});
vue.onActivated(() => {
if (mounted) {
hook();
}
});
}
function useEventListener$1(type, listener, options = {}) {
if (!inBrowser) {
return;
}
const { target = window, passive = false, capture = false } = options;
let cleaned = false;
let attached;
const add = (target2) => {
if (cleaned) {
return;
}
const element = vue.unref(target2);
if (element && !attached) {
element.addEventListener(type, listener, {
capture,
passive
});
attached = true;
}
};
const remove = (target2) => {
if (cleaned) {
return;
}
const element = vue.unref(target2);
if (element && attached) {
element.removeEventListener(type, listener, capture);
attached = false;
}
};
vue.onUnmounted(() => remove(target));
vue.onDeactivated(() => remove(target));
onMountedOrActivated(() => add(target));
let stopWatch;
if (vue.isRef(target)) {
stopWatch = vue.watch(target, (val, oldVal) => {
remove(oldVal);
add(val);
});
}
return () => {
stopWatch == null ? void 0 : stopWatch();
remove(target);
cleaned = true;
};
}
var width;
var height;
function useWindowSize() {
if (!width) {
width = vue.ref(0);
height = vue.ref(0);
if (inBrowser) {
const update = () => {
width.value = window.innerWidth;
height.value = window.innerHeight;
};
update();
window.addEventListener("resize", update, { passive: true });
window.addEventListener("orientationchange", update, { passive: true });
}
}
return { width, height };
}
var overflowScrollReg = /scroll|auto|overlay/i;
var defaultRoot = inBrowser ? window : void 0;
function isElement(node) {
const ELEMENT_NODE_TYPE = 1;
return node.tagName !== "HTML" && node.tagName !== "BODY" && node.nodeType === ELEMENT_NODE_TYPE;
}
function getScrollParent(el, root = defaultRoot) {
let node = el;
while (node && node !== root && isElement(node)) {
const { overflowY } = window.getComputedStyle(node);
if (overflowScrollReg.test(overflowY)) {
return node;
}
node = node.parentNode;
}
return root;
}
function useScrollParent(el, root = defaultRoot) {
const scrollParent = vue.ref();
vue.onMounted(() => {
if (el.value) {
scrollParent.value = getScrollParent(el.value, root);
}
});
return scrollParent;
}
var visibility;
function usePageVisibility() {
if (!visibility) {
visibility = vue.ref("visible");
if (inBrowser) {
const update = () => {
visibility.value = document.hidden ? "hidden" : "visible";
};
update();
window.addEventListener("visibilitychange", update);
}
}
return visibility;
}
var CUSTOM_FIELD_INJECTION_KEY = Symbol("van-field");
function useCustomFieldValue(customValue) {
const field = vue.inject(CUSTOM_FIELD_INJECTION_KEY, null);
if (field && !field.customValue.value) {
field.customValue.value = customValue;
vue.watch(customValue, () => {
field.resetValidation();
field.validateWithTrigger("onChange");
});
}
}
function getScrollTop(el) {
const top = "scrollTop" in el ? el.scrollTop : el.pageYOffset;
return Math.max(top, 0);
}
function setScrollTop(el, value) {
if ("scrollTop" in el) {
el.scrollTop = value;
} else {
el.scrollTo(el.scrollX, value);
}
}
function getRootScrollTop() {
return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
}
function setRootScrollTop(value) {
setScrollTop(window, value);
setScrollTop(document.body, value);
}
function getElementTop(el, scroller) {
if (el === window) {
return 0;
}
const scrollTop = scroller ? getScrollTop(scroller) : getRootScrollTop();
return useRect(el).top + scrollTop;
}
const isIOS = isIOS$1();
function resetScroll() {
if (isIOS) {
setRootScrollTop(getRootScrollTop());
}
}
const stopPropagation = (event) => event.stopPropagation();
function preventDefault(event, isStopPropagation) {
if (typeof event.cancelable !== "boolean" || event.cancelable) {
event.preventDefault();
}
if (isStopPropagation) {
stopPropagation(event);
}
}
function isHidden(elementRef) {
const el = vue.unref(elementRef);
if (!el) {
return false;
}
const style = window.getComputedStyle(el);
const hidden = style.display === "none";
const parentHidden = el.offsetParent === null && style.position !== "fixed";
return hidden || parentHidden;
}
const { width: windowWidth, height: windowHeight } = useWindowSize();
function addUnit(value) {
if (isDef(value)) {
return isNumeric(value) ? `${value}px` : String(value);
}
return void 0;
}
function getSizeStyle(originSize) {
if (isDef(originSize)) {
if (Array.isArray(originSize)) {
return {
width: addUnit(originSize[0]),
height: addUnit(originSize[1])
};
}
const size = addUnit(originSize);
return {
width: size,
height: size
};
}
}
function getZIndexStyle(zIndex) {
const style = {};
if (zIndex !== void 0) {
style.zIndex = +zIndex;
}
return style;
}
let rootFontSize;
function getRootFontSize() {
if (!rootFontSize) {
const doc = document.documentElement;
const fontSize = doc.style.fontSize || window.getComputedStyle(doc).fontSize;
rootFontSize = parseFloat(fontSize);
}
return rootFontSize;
}
function convertRem(value) {
value = value.replace(/rem/g, "");
return +value * getRootFontSize();
}
function convertVw(value) {
value = value.replace(/vw/g, "");
return +value * windowWidth.value / 100;
}
function convertVh(value) {
value = value.replace(/vh/g, "");
return +value * windowHeight.value / 100;
}
function unitToPx(value) {
if (typeof value === "number") {
return value;
}
if (inBrowser$1) {
if (value.includes("rem")) {
return convertRem(value);
}
if (value.includes("vw")) {
return convertVw(value);
}
if (value.includes("vh")) {
return convertVh(value);
}
}
return parseFloat(value);
}
const camelizeRE = /-(\w)/g;
const camelize = (str) => str.replace(camelizeRE, (_, c) => c.toUpperCase());
const kebabCase = (str) => str.replace(/([A-Z])/g, "-$1").toLowerCase().replace(/^-/, "");
const clamp = (num, min, max) => Math.min(Math.max(num, min), max);
function trimExtraChar(value, char, regExp) {
const index = value.indexOf(char);
if (index === -1) {
return value;
}
if (char === "-" && index !== 0) {
return value.slice(0, index);
}
return value.slice(0, index + 1) + value.slice(index).replace(regExp, "");
}
function formatNumber(value, allowDot = true, allowMinus = true) {
if (allowDot) {
value = trimExtraChar(value, ".", /\./g);
} else {
value = value.split(".")[0];
}
if (allowMinus) {
value = trimExtraChar(value, "-", /-/g);
} else {
value = value.replace(/-/, "");
}
const regExp = allowDot ? /[^-0-9.]/g : /[^-0-9]/g;
return value.replace(regExp, "");
}
function addNumber(num1, num2) {
const cardinal = 10 ** 10;
return Math.round((num1 + num2) * cardinal) / cardinal;
}
const { hasOwnProperty } = Object.prototype;
function assignKey(to, from, key) {
const val = from[key];
if (!isDef(val)) {
return;
}
if (!hasOwnProperty.call(to, key) || !isObject$2(val)) {
to[key] = val;
} else {
to[key] = deepAssign(Object(to[key]), val);
}
}
function deepAssign(to, from) {
Object.keys(from).forEach((key) => {
assignKey(to, from, key);
});
return to;
}
var stdin_default$m = {
name: "姓名",
tel: "电话",
save: "保存",
clear: "清空",
cancel: "取消",
confirm: "确认",
delete: "删除",
loading: "加载中...",
noCoupon: "暂无优惠券",
nameEmpty: "请填写姓名",
addContact: "添加联系人",
telInvalid: "请填写正确的电话",
vanCalendar: {
end: "结束",
start: "开始",
title: "日期选择",
weekdays: ["日", "一", "二", "三", "四", "五", "六"],
monthTitle: (year, month) => `${year}年${month}月`,
rangePrompt: (maxRange) => `最多选择 ${maxRange} 天`
},
vanCascader: {
select: "请选择"
},
vanPagination: {
prev: "上一页",
next: "下一页"
},
vanPullRefresh: {
pulling: "下拉即可刷新...",
loosing: "释放即可刷新..."
},
vanSubmitBar: {
label: "合计:"
},
vanCoupon: {
unlimited: "无门槛",
discount: (discount) => `${discount}折`,
condition: (condition) => `满${condition}元可用`
},
vanCouponCell: {
title: "优惠券",
count: (count) => `${count}张可用`
},
vanCouponList: {
exchange: "兑换",
close: "不使用",
enable: "可用",
disabled: "不可用",
placeholder: "输入优惠码"
},
vanAddressEdit: {
area: "地区",
areaEmpty: "请选择地区",
addressEmpty: "请填写详细地址",
addressDetail: "详细地址",
defaultAddress: "设为默认收货地址"
},
vanAddressList: {
add: "新增地址"
}
};
const lang = vue.ref("zh-CN");
const messages = vue.reactive({
"zh-CN": stdin_default$m
});
const Locale = {
messages() {
return messages[lang.value];
},
use(newLang, newMessages) {
lang.value = newLang;
this.add({ [newLang]: newMessages });
},
add(newMessages = {}) {
deepAssign(messages, newMessages);
}
};
var stdin_default$l = Locale;
function createTranslate(name2) {
const prefix = camelize(name2) + ".";
return (path, ...args) => {
const messages2 = stdin_default$l.messages();
const message = get(messages2, prefix + path) || get(messages2, path);
return isFunction(message) ? message(...args) : message;
};
}
function genBem(name2, mods) {
if (!mods) {
return "";
}
if (typeof mods === "string") {
return ` ${name2}--${mods}`;
}
if (Array.isArray(mods)) {
return mods.reduce(
(ret, item) => ret + genBem(name2, item),
""
);
}
return Object.keys(mods).reduce(
(ret, key) => ret + (mods[key] ? genBem(name2, key) : ""),
""
);
}
function createBEM(name2) {
return (el, mods) => {
if (el && typeof el !== "string") {
mods = el;
el = "";
}
el = el ? `${name2}__${el}` : name2;
return `${el}${genBem(el, mods)}`;
};
}
function createNamespace(name2) {
const prefixedName = `van-${name2}`;
return [
prefixedName,
createBEM(prefixedName),
createTranslate(prefixedName)
];
}
const BORDER = "van-hairline";
const BORDER_BOTTOM = `${BORDER}--bottom`;
const BORDER_TOP_BOTTOM = `${BORDER}--top-bottom`;
const HAPTICS_FEEDBACK = "van-haptics-feedback";
const FORM_KEY = Symbol("van-form");
const LONG_PRESS_START_TIME = 500;
const TAP_OFFSET = 5;
function callInterceptor(interceptor, {
args = [],
done,
canceled,
error
}) {
if (interceptor) {
const returnVal = interceptor.apply(null, args);
if (isPromise(returnVal)) {
returnVal.then((value) => {
if (value) {
done();
} else if (canceled) {
canceled();
}
}).catch(error || noop$1);
} else if (returnVal) {
done();
} else if (canceled) {
canceled();
}
} else {
done();
}
}
function withInstall(options) {
options.install = (app) => {
const { name: name2 } = options;
if (name2) {
app.component(name2, options);
app.component(camelize(`-${name2}`), options);
}
};
return options;
}
const POPUP_TOGGLE_KEY = Symbol();
function onPopupReopen(callback) {
const popupToggleStatus = vue.inject(POPUP_TOGGLE_KEY, null);
if (popupToggleStatus) {
vue.watch(popupToggleStatus, (show) => {
if (show) {
callback();
}
});
}
}
const useHeight = (element, withSafeArea) => {
const height2 = vue.ref();
const setHeight = () => {
height2.value = useRect(element).height;
};
vue.onMounted(() => {
vue.nextTick(setHeight);
if (withSafeArea) {
for (let i = 1; i <= 3; i++) {
setTimeout(setHeight, 100 * i);
}
}
});
onPopupReopen(() => vue.nextTick(setHeight));
vue.watch([windowWidth, windowHeight], setHeight);
return height2;
};
function usePlaceholder(contentRef, bem2) {
const height2 = useHeight(contentRef, true);
return (renderContent) => vue.createVNode("div", {
"class": bem2("placeholder"),
"style": {
height: height2.value ? `${height2.value}px` : void 0
}
}, [renderContent()]);
}
function useExpose(apis) {
const instance = vue.getCurrentInstance();
if (instance) {
extend(instance.proxy, apis);
}
}
const routeProps = {
to: [String, Object],
url: String,
replace: Boolean
};
function route({
to,
url,
replace,
$router: router
}) {
if (to && router) {
router[replace ? "replace" : "push"](to);
} else if (url) {
replace ? location.replace(url) : location.href = url;
}
}
function useRoute() {
const vm = vue.getCurrentInstance().proxy;
return () => route(vm);
}
const [name$l, bem$l] = createNamespace("badge");
const badgeProps = {
dot: Boolean,
max: numericProp,
tag: makeStringProp("div"),
color: String,
offset: Array,
content: numericProp,
showZero: truthProp,
position: makeStringProp("top-right")
};
var stdin_default$k = vue.defineComponent({
name: name$l,
props: badgeProps,
setup(props, {
slots
}) {
const hasContent = () => {
if (slots.content) {
return true;
}
const {
content,
showZero
} = props;
return isDef(content) && content !== "" && (showZero || content !== 0 && content !== "0");
};
const renderContent = () => {
const {
dot,
max,
content
} = props;
if (!dot && hasContent()) {
if (slots.content) {
return slots.content();
}
if (isDef(max) && isNumeric(content) && +content > +max) {
return `${max}+`;
}
return content;
}
};
const getOffsetWithMinusString = (val) => val.startsWith("-") ? val.replace("-", "") : `-${val}`;
const style = vue.computed(() => {
const style2 = {
background: props.color
};
if (props.offset) {
const [x, y] = props.offset;
const {
position
} = props;
const [offsetY, offsetX] = position.split("-");
if (slots.default) {
if (typeof y === "number") {
style2[offsetY] = addUnit(offsetY === "top" ? y : -y);
} else {
style2[offsetY] = offsetY === "top" ? addUnit(y) : getOffsetWithMinusString(y);
}
if (typeof x === "number") {
style2[offsetX] = addUnit(offsetX === "left" ? x : -x);
} else {
style2[offsetX] = offsetX === "left" ? addUnit(x) : getOffsetWithMinusString(x);
}
} else {
style2.marginTop = addUnit(y);
style2.marginLeft = addUnit(x);
}
}
return style2;
});
const renderBadge = () => {
if (hasContent() || props.dot) {
return vue.createVNode("div", {
"class": bem$l([props.position, {
dot: props.dot,
fixed: !!slots.default
}]),
"style": style.value
}, [renderContent()]);
}
};
return () => {
if (slots.default) {
const {
tag
} = props;
return vue.createVNode(tag, {
"class": bem$l("wrapper")
}, {
default: () => [slots.default(), renderBadge()]
});
}
return renderBadge();
};
}
});
const Badge = withInstall(stdin_default$k);
let globalZIndex = 2e3;
const useGlobalZIndex = () => ++globalZIndex;
const setGlobalZIndex = (val) => {
globalZIndex = val;
};
const [name$k, bem$k] = createNamespace("config-provider");
const CONFIG_PROVIDER_KEY = Symbol(name$k);
const configProviderProps = {
tag: makeStringProp("div"),
theme: makeStringProp("light"),
zIndex: Number,
themeVars: Object,
themeVarsDark: Object,
themeVarsLight: Object,
themeVarsScope: makeStringProp("local"),
iconPrefix: String
};
function insertDash(str) {
return str.replace(/([a-zA-Z])(\d)/g, "$1-$2");
}
function mapThemeVarsToCSSVars(themeVars) {
const cssVars = {};
Object.keys(themeVars).forEach((key) => {
const formattedKey = insertDash(kebabCase(key));
cssVars[`--van-${formattedKey}`] = themeVars[key];
});
return cssVars;
}
function syncThemeVarsOnRoot(newStyle = {}, oldStyle = {}) {
Object.keys(newStyle).forEach((key) => {
if (newStyle[key] !== oldStyle[key]) {
document.documentElement.style.setProperty(key, newStyle[key]);
}
});
Object.keys(oldStyle).forEach((key) => {
if (!newStyle[key]) {
document.documentElement.style.removeProperty(key);
}
});
}
vue.defineComponent({
name: name$k,
props: configProviderProps,
setup(props, {
slots
}) {
const style = vue.computed(() => mapThemeVarsToCSSVars(extend({}, props.themeVars, props.theme === "dark" ? props.themeVarsDark : props.themeVarsLight)));
if (inBrowser$1) {
const addTheme = () => {
document.documentElement.classList.add(`van-theme-${props.theme}`);
};
const removeTheme = (theme = props.theme) => {
document.documentElement.classList.remove(`van-theme-${theme}`);
};
vue.watch(() => props.theme, (newVal, oldVal) => {
if (oldVal) {
removeTheme(oldVal);
}
addTheme();
}, {
immediate: true
});
vue.onActivated(addTheme);
vue.onDeactivated(removeTheme);
vue.onBeforeUnmount(removeTheme);
vue.watch(style, (newStyle, oldStyle) => {
if (props.themeVarsScope === "global") {
syncThemeVarsOnRoot(newStyle, oldStyle);
}
});
vue.watch(() => props.themeVarsScope, (newScope, oldScope) => {
if (oldScope === "global") {
syncThemeVarsOnRoot({}, style.value);
}
if (newScope === "global") {
syncThemeVarsOnRoot(style.value, {});
}
});
if (props.themeVarsScope === "global") {
syncThemeVarsOnRoot(style.value, {});
}
}
vue.provide(CONFIG_PROVIDER_KEY, props);
vue.watchEffect(() => {
if (props.zIndex !== void 0) {
setGlobalZIndex(props.zIndex);
}
});
return () => vue.createVNode(props.tag, {
"class": bem$k(),
"style": props.themeVarsScope === "local" ? style.value : void 0
}, {
default: () => {
var _a;
return [(_a = slots.default) == null ? void 0 : _a.call(slots)];
}
});
}
});
const [name$j, bem$j] = createNamespace("icon");
const isImage = (name2) => name2 == null ? void 0 : name2.includes("/");
const iconProps = {
dot: Boolean,
tag: makeStringProp("i"),
name: String,
size: numericProp,
badge: numericProp,
color: String,
badgeProps: Object,
classPrefix: String
};
var stdin_default$j = vue.defineComponent({
name: name$j,
props: iconProps,
setup(props, {
slots
}) {
const config = vue.inject(CONFIG_PROVIDER_KEY, null);
const classPrefix = vue.computed(() => props.classPrefix || (config == null ? void 0 : config.iconPrefix) || bem$j());
return () => {
const {
tag,
dot,
name: name2,
size,
badge,
color
} = props;
const isImageIcon = isImage(name2);
return vue.createVNode(Badge, vue.mergeProps({
"dot": dot,
"tag": tag,
"class": [classPrefix.value, isImageIcon ? "" : `${classPrefix.value}-${name2}`],
"style": {
color,
fontSize: addUnit(size)
},
"content": badge
}, props.badgeProps), {
default: () => {
var _a;
return [(_a = slots.default) == null ? void 0 : _a.call(slots), isImageIcon && vue.createVNode("img", {
"class": bem$j("image"),
"src": name2
}, null)];
}
});
};
}
});
const Icon = withInstall(stdin_default$j);
const [name$i, bem$i] = createNamespace("loading");
const SpinIcon = Array(12).fill(null).map((_, index) => vue.createVNode("i", {
"class": bem$i("line", String(index + 1))
}, null));
const CircularIcon = vue.createVNode("svg", {
"class": bem$i("circular"),
"viewBox": "25 25 50 50"
}, [vue.createVNode("circle", {
"cx": "50",
"cy": "50",
"r": "20",
"fill": "none"
}, null)]);
const loadingProps = {
size: numericProp,
type: makeStringProp("circular"),
color: String,
vertical: Boolean,
textSize: numericProp,
textColor: String
};
var stdin_default$i = vue.defineComponent({
name: name$i,
props: loadingProps,
setup(props, {
slots
}) {
const spinnerStyle = vue.computed(() => extend({
color: props.color
}, getSizeStyle(props.size)));
const renderIcon = () => {
const DefaultIcon = props.type === "spinner" ? SpinIcon : CircularIcon;
return vue.createVNode("span", {
"class": bem$i("spinner", props.type),
"style": spinnerStyle.value
}, [slots.icon ? slots.icon() : DefaultIcon]);
};
const renderText = () => {
var _a;
if (slots.default) {
return vue.createVNode("span", {
"class": bem$i("text"),
"style": {
fontSize: addUnit(props.textSize),
color: (_a = props.textColor) != null ? _a : props.color
}
}, [slots.default()]);
}
};
return () => {
const {
type,
vertical
} = props;
return vue.createVNode("div", {
"class": bem$i([type, {
vertical
}]),
"aria-live": "polite",
"aria-busy": true
}, [renderIcon(), renderText()]);
};
}
});
const Loading = withInstall(stdin_default$i);
const popupSharedProps = {
// whether to show popup
show: Boolean,
// z-index
zIndex: numericProp,
// whether to show overlay
overlay: truthProp,
// transition duration
duration: numericProp,
// teleport
teleport: [String, Object],
// prevent body scroll
lockScroll: truthProp,
// whether to lazy render
lazyRender: truthProp,
// callback function before close
beforeClose: Function,
// overlay custom style
overlayStyle: Object,
// overlay custom class name
overlayClass: unknownProp,
// Initial rendering animation
transitionAppear: Boolean,
// whether to close popup when overlay is clicked
closeOnClickOverlay: truthProp
};
function getDirection(x, y) {
if (x > y) {
return "horizontal";
}
if (y > x) {
return "vertical";
}
return "";
}
function useTouch() {
const startX = vue.ref(0);
const startY = vue.ref(0);
const deltaX = vue.ref(0);
const deltaY = vue.ref(0);
const offsetX = vue.ref(0);
const offsetY = vue.ref(0);
const direction = vue.ref("");
const isTap = vue.ref(true);
const isVertical = () => direction.value === "vertical";
const isHorizontal = () => direction.value === "horizontal";
const reset = () => {
deltaX.value = 0;
deltaY.value = 0;
offsetX.value = 0;
offsetY.value = 0;
direction.value = "";
isTap.value = true;
};
const start = (event) => {
reset();
startX.value = event.touches[0].clientX;
startY.value = event.touches[0].clientY;
};
const move = (event) => {
const touch = event.touches[0];
deltaX.value = (touch.clientX < 0 ? 0 : touch.clientX) - startX.value;
deltaY.value = touch.clientY - startY.value;
offsetX.value = Math.abs(deltaX.value);
offsetY.value = Math.abs(deltaY.value);
const LOCK_DIRECTION_DISTANCE = 10;
if (!direction.value || offsetX.value < LOCK_DIRECTION_DISTANCE && offsetY.value < LOCK_DIRECTION_DISTANCE) {
direction.value = getDirection(offsetX.value, offsetY.value);
}
if (isTap.value && (offsetX.value > TAP_OFFSET || offsetY.value > TAP_OFFSET)) {
isTap.value = false;
}
};
return {
move,
start,
reset,
startX,
startY,
deltaX,
deltaY,
offsetX,
offsetY,
direction,
isVertical,
isHorizontal,
isTap
};
}
let totalLockCount = 0;
const BODY_LOCK_CLASS = "van-overflow-hidden";
function useLockScroll(rootRef, shouldLock) {
const touch = useTouch();
const DIRECTION_UP = "01";
const DIRECTION_DOWN = "10";
const onTouchMove = (event) => {
touch.move(event);
const direction = touch.deltaY.value > 0 ? DIRECTION_DOWN : DIRECTION_UP;
const el = getScrollParent(
event.target,
rootRef.value
);
const { scrollHeight, offsetHeight, scrollTop } = el;
let status = "11";
if (scrollTop === 0) {
status = offsetHeight >= scrollHeight ? "00" : "01";
} else if (scrollTop + offsetHeight >= scrollHeight) {
status = "10";
}
if (status !== "11" && touch.isVertical() && !(parseInt(status, 2) & parseInt(direction, 2))) {
preventDefault(event, true);
}
};
const lock = () => {
document.addEventListener("touchstart", touch.start);
document.addEventListener("touchmove", onTouchMove, { passive: false });
if (!totalLockCount) {
document.body.classList.add(BODY_LOCK_CLASS);
}
totalLockCount++;
};
const unlock = () => {
if (totalLockCount) {
document.removeEventListener("touchstart", touch.start);
document.removeEventListener("touchmove", onTouchMove);
totalLockCount--;
if (!totalLockCount) {
document.body.classList.remove(BODY_LOCK_CLASS);
}
}
};
const init = () => shouldLock() && lock();
const destroy = () => shouldLock() && unlock();
onMountedOrActivated(init);
vue.onDeactivated(destroy);
vue.onBeforeUnmount(destroy);
vue.watch(shouldLock, (value) => {
value ? lock() : unlock();
});
}
function useLazyRender(show) {
const inited = vue.ref(false);
vue.watch(
show,
(value) => {
if (value) {
inited.value = value;
}
},
{ immediate: true }
);
return (render) => () => inited.value ? render() : null;
}
const useScopeId = () => {
var _a;
const { scopeId } = ((_a = vue.getCurrentInstance()) == null ? void 0 : _a.vnode) || {};
return scopeId ? { [scopeId]: "" } : null;
};
const [name$h, bem$h] = createNamespace("overlay");
const overlayProps = {
show: Boolean,
zIndex: numericProp,
duration: numericProp,
className: unknownProp,
lockScroll: truthProp,
lazyRender: truthProp,
customStyle: Object
};
var stdin_default$h = vue.defineComponent({
name: name$h,
props: overlayProps,
setup(props, {
slots
}) {
const root = vue.ref();
const lazyRender = useLazyRender(() => props.show || !props.lazyRender);
const onTouchMove = (event) => {
if (props.lockScroll) {
preventDefault(event, true);
}
};
const renderOverlay = lazyRender(() => {
var _a;
const style = extend(getZIndexStyle(props.zIndex), props.customStyle);
if (isDef(props.duration)) {
style.animationDuration = `${props.duration}s`;
}
return vue.withDirectives(vue.createVNode("div", {
"ref": root,
"style": style,
"class": [bem$h(), props.className]
}, [(_a = slots.default) == null ? void 0 : _a.call(slots)]), [[vue.vShow, props.show]]);
});
useEventListener$1("touchmove", onTouchMove, {
target: root
});
return () => vue.createVNode(vue.Transition, {
"name": "van-fade",
"appear": true
}, {
default: renderOverlay
});
}
});
const Overlay = withInstall(stdin_default$h);
const popupProps = extend({}, popupSharedProps, {
round: Boolean,
position: makeStringProp("center"),
closeIcon: makeStringProp("cross"),
closeable: Boolean,
transition: String,
iconPrefix: String,
closeOnPopstate: Boolean,
closeIconPosition: makeStringProp("top-right"),
safeAreaInsetTop: Boolean,
safeAreaInsetBottom: Boolean
});
const [name$g, bem$g] = createNamespace("popup");
var stdin_default$g = vue.defineComponent({
name: name$g,
inheritAttrs: false,
props: popupProps,
emits: ["open", "close", "opened", "closed", "keydown", "update:show", "clickOverlay", "clickCloseIcon"],
setup(props, {
emit,
attrs,
slots
}) {
let opened;
let shouldReopen;
const zIndex = vue.ref();
const popupRef = vue.ref();
const lazyRender = useLazyRender(() => props.show || !props.lazyRender);
const style = vue.computed(() => {
const style2 = {
zIndex: zIndex.value
};
if (isDef(props.duration)) {
const key = props.position === "center" ? "animationDuration" : "transitionDuration";
style2[key] = `${props.duration}s`;
}
return style2;
});
const open = () => {
if (!opened) {
opened = true;
zIndex.value = props.zIndex !== void 0 ? +props.zIndex : useGlobalZIndex();
emit("open");
}
};
const close = () => {
if (opened) {
callInterceptor(props.beforeClose, {
done() {
opened = false;
emit("close");
emit("update:show", false);
}
});
}
};
const onClickOverlay = (event) => {
emit("clickOverlay", event);
if (props.closeOnClickOverlay) {
close();
}
};
const renderOverlay = () => {
if (props.overlay) {
return vue.createVNode(Overlay, vue.mergeProps({
"show": props.show,
"class": props.overlayClass,
"zIndex": zIndex.value,
"duration": props.duration,
"customStyle": props.overlayStyle,
"role": props.closeOnClickOverlay ? "button" : void 0,
"tabindex": props.closeOnClickOverlay ? 0 : void 0
}, useScopeId(), {
"onClick": onClickOverlay
}), {
default: slots["overlay-content"]
});
}
};
const onClickCloseIcon = (event) => {
emit("clickCloseIcon", event);
close();
};
const renderCloseIcon = () => {
if (props.closeable) {
return vue.createVNode(Icon, {
"role": "button",
"tabindex": 0,
"name": props.closeIcon,
"class": [bem$g("close-icon", props.closeIconPosition), HAPTICS_FEEDBACK],
"classPrefix": props.iconPrefix,
"onClick": onClickCloseIcon
}, null);
}
};
let timer;
const onOpened = () => {
if (timer)
clearTimeout(timer);
timer = setTimeout(() => {
emit("opened");
});
};
const onClosed = () => emit("closed");
const onKeydown = (event) => emit("keydown", event);
const renderPopup = lazyRender(() => {
var _a;
const {
round,
position,
safeAreaInsetTop,
safeAreaInsetBottom
} = props;
return vue.withDirectives(vue.createVNode("div", vue.mergeProps({
"ref": popupRef,
"style": style.value,
"role": "dialog",
"tabindex": 0,
"class": [bem$g({
round,
[position]: position
}), {
"van-safe-area-top": safeAreaInsetTop,
"van-safe-area-bottom": safeAreaInsetBottom
}],
"onKeydown": onKeydown
}, attrs, useScopeId()), [(_a = slots.default) == null ? void 0 : _a.call(slots), renderCloseIcon()]), [[vue.vShow, props.show]]);
});
const renderTransition = () => {
const {
position,
transition,
transitionAppear
} = props;
const name2 = position === "center" ? "van-fade" : `van-popup-slide-${position}`;
return vue.createVNode(vue.Transition, {
"name": transition || name2,
"appear": transitionAppear,
"onAfterEnter": onOpened,
"onAfterLeave": onClosed
}, {
default: renderPopup
});
};
vue.watch(() => props.show, (show) => {
if (show && !opened) {
open();
if (attrs.tabindex === 0) {
vue.nextTick(() => {
var _a;
(_a = popupRef.value) == null ? void 0 : _a.focus();
});
}
}
if (!show && opened) {
opened = false;
emit("close");
}
});
useExpose({
popupRef
});
useLockScroll(popupRef, () => props.show && props.lockScroll);
useEventListener$1("popstate", () => {
if (props.closeOnPopstate) {
close();
shouldReopen = false;
}
});
vue.onMounted(() => {
if (props.show) {
open();
}
});
vue.onActivated(() => {
if (shouldReopen) {
emit("update:show", true);
shouldReopen = false;
}
});
vue.onDeactivated(() => {
if (props.show && props.teleport) {
close();
shouldReopen = true;
}
});
vue.provide(POPUP_TOGGLE_KEY, () => props.show);
return () => {
if (props.teleport) {
return vue.createVNode(vue.Teleport, {
"to": props.teleport
}, {
default: () => [renderOverlay(), renderTransition()]
});
}
return vue.createVNode(vue.Fragment, null, [renderOverlay(), renderTransition()]);
};
}
});
const Popup = withInstall(stdin_default$g);
/**
* @vue/shared v3.4.19
* (c) 2018-present Yuxi (Evan) You and Vue contributors
* @license MIT
**/
const isArray = Array.isArray;
const isString = (val) => typeof val === "string";
const isObject$1 = (val) => val !== null && typeof val === "object";
const cacheStringFunction = (fn) => {
const cache = /* @__PURE__ */ Object.create(null);
return (str) => {
const hit = cache[str];
return hit || (cache[str] = fn(str));
};
};
const hyphenateRE = /\B([A-Z])/g;
const hyphenate = cacheStringFunction(
(str) => str.replace(hyphenateRE, "-$1").toLowerCase()
);
function normalizeStyle(value) {
if (isArray(value)) {
const res = {};
for (let i = 0; i < value.length; i++) {
const item = value[i];
const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);
if (normalized) {
for (const key in normalized) {
res[key] = normalized[key];
}
}
}
return res;
} else if (isString(value) || isObject$1(value)) {
return value;
}
}
const listDelimiterRE = /;(?![^(]*\))/g;
const propertyDelimiterRE = /:([^]+)/;
const styleCommentRE = /\/\*[^]*?\*\//g;
function parseStringStyle(cssText) {
const ret = {};
cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => {
if (item) {
const tmp = item.split(propertyDelimiterRE);
tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
}
});
return ret;
}
function stringifyStyle(styles) {
let ret = "";
if (!styles || isString(styles)) {
return ret;
}
for (const key in styles) {
const value = styles[key];
const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);
if (isString(value) || typeof value === "number") {
ret += `${normalizedKey}:${value};`;
}
}
return ret;
}
function normalizeClass(value) {
let res = "";
if (isString(value)) {
res = value;
} else if (isArray(value)) {
for (let i = 0; i < value.length; i++) {
const normalized = normalizeClass(value[i]);
if (normalized) {
res += normalized + " ";
}
}
} else if (isObject$1(value)) {
for (const name2 in value) {
if (value[name2]) {
res += name2 + " ";
}
}
}
return res.trim();
}
function scrollLeftTo(scroller, to, duration) {
let rafId;
let count = 0;
const from = scroller.scrollLeft;
const frames = duration === 0 ? 1 : Math.round(duration * 1e3 / 16);
function cancel() {
cancelRaf(rafId);
}
function animate() {
scroller.scrollLeft += (to - from) / frames;
if (++count < frames) {
rafId = raf(animate);
}
}
animate();
return cancel;
}
function scrollTopTo(scroller, to, duration, callback) {
let rafId;
let current2 = getScrollTop(scroller);
const isDown = current2 < to;
const frames = duration === 0 ? 1 : Math.round(duration * 1e3 / 16);
const step = (to - current2) / frames;
function cancel() {
cancelRaf(rafId);
}
function animate() {
current2 += step;
if (isDown && current2 > to || !isDown && current2 < to) {
current2 = to;
}
setScrollTop(scroller, current2);
if (isDown && current2 < to || !isDown && current2 > to) {
rafId = raf(animate);
} else if (callback) {
rafId = raf(callback);
}
}
animate();
return cancel;
}
let current = 0;
function useId() {
const vm = vue.getCurrentInstance();
const { name: name2 = "unknown" } = (vm == null ? void 0 : vm.type) || {};
return `${name2}-${++current}`;
}
function useRefs() {
const refs = vue.ref([]);
const cache = [];
vue.onBeforeUpdate(() => {
refs.value = [];
});
const setRefs = (index) => {
if (!cache[index]) {
cache[index] = (el) => {
refs.value[index] = el;
};
}
return cache[index];
};
return [refs, setRefs];
}
function useVisibilityChange(target, onChange) {
if (!inBrowser$1 || !window.IntersectionObserver) {
return;
}
const observer = new IntersectionObserver(
(entries) => {
onChange(entries[0].intersectionRatio > 0);
},
{ root: document.body }
);
const observe = () => {
if (target.value) {
observer.observe(target.value);
}
};
const unobserve = () => {
if (target.value) {
observer.unobserve(target.value);
}
};
vue.onDeactivated(unobserve);
vue.onBeforeUnmount(unobserve);
onMountedOrActivated(observe);
}
const [name$f, bem$f] = createNamespace("sticky");
const stickyProps = {
zIndex: numericProp,
position: makeStringProp("top"),
container: Object,
offsetTop: makeNumericProp(0),
offsetBottom: makeNumericProp(0)
};
var stdin_default$f = vue.defineComponent({
name: name$f,
props: stickyProps,
emits: ["scroll", "change"],
setup(props, {
emit,
slots
}) {
const root = vue.ref();
const scrollParent = useScrollParent(root);
const state = vue.reactive({
fixed: false,
width: 0,
// root width
height: 0,
// root height
transform: 0
});
const isReset = vue.ref(false);
const offset = vue.computed(() => unitToPx(props.position === "top" ? props.offsetTop : props.offsetBottom));
const rootStyle = vue.computed(() => {
if (isReset.value) {
return;
}
const {
fixed,
height: height2,
width: width2
} = state;
if (fixed) {
return {
width: `${width2}px`,
height: `${height2}px`
};
}
});
const stickyStyle = vue.computed(() => {
if (!state.fixed || isReset.value) {
return;
}
const style = extend(getZIndexStyle(props.zIndex), {
width: `${state.width}px`,
height: `${state.height}px`,
[props.position]: `${offset.value}px`
});
if (state.transform) {
style.transform = `translate3d(0, ${state.transform}px, 0)`;
}
return style;
});
const emitScroll = (scrollTop) => emit("scroll", {
scrollTop,
isFixed: state.fixed
});
const onScroll = () => {
if (!root.value || isHidden(root)) {
return;
}
const {
container,
position
} = props;
const rootRect = useRect(root);
const scrollTop = getScrollTop(window);
state.width = rootRect.width;
state.height = rootRect.height;
if (position === "top") {
if (container) {
const containerRect = useRect(container);
const difference = containerRect.bottom - offset.value - state.height;
state.fixed = offset.value > rootRect.top && containerRect.bottom > 0;
state.transform = difference < 0 ? difference : 0;
} else {
state.fixed = offset.value > rootRect.top;
}
} else {
const {
clientHeight
} = document.documentElement;
if (container) {
const containerRect = useRect(container);
const difference = clientHeight - containerRect.top - offset.value - state.height;
state.fixed = clientHeight - offset.value < rootRect.bottom && clientHeight > containerRect.top;
state.transform = difference < 0 ? -difference : 0;
} else {
state.fixed = clientHeight - offset.value < rootRect.bottom;
}
}
emitScroll(scrollTop);
};
vue.watch(() => state.fixed, (value) => emit("change", value));
useEventListener$1("scroll", onScroll, {
target: scrollParent,
passive: true
});
useVisibilityChange(root, onScroll);
vue.watch([windowWidth, windowHeight], () => {
if (!root.value || isHidden(root) || !state.fixed) {
return;
}
isReset.value = true;
vue.nextTick(() => {
const rootRect = useRect(root);
state.width = rootRect.width;
state.height = rootRect.height;
isReset.value = false;
});
});
return () => {
var _a;
return vue.createVNode("div", {
"ref": root,
"style": rootStyle.value
}, [vue.createVNode("div", {
"class": bem$f({
fixed: state.fixed && !isReset.value
}),
"style": stickyStyle.value
}, [(_a = slots.default) == null ? void 0 : _a.call(slots)])]);
};
}
});
const Sticky = withInstall(stdin_default$f);
const [name$e, bem$e] = createNamespace("swipe");
const swipeProps = {
loop: truthProp,
width: numericProp,
height: numericProp,
vertical: Boolean,
autoplay: makeNumericProp(0),
duration: makeNumericProp(500),
touchable: truthProp,
lazyRender: Boolean,
initialSwipe: makeNumericProp(0),
indicatorColor: String,
showIndicators: truthProp,
stopPropagation: truthProp
};
const SWIPE_KEY = Symbol(name$e);
var stdin_default$e = vue.defineComponent({
name: name$e,
props: swipeProps,
emits: ["change", "dragStart", "dragEnd"],
setup(props, {
emit,
slots
}) {
const root = vue.ref();
const track = vue.ref();
const state = vue.reactive({
rect: null,
width: 0,
height: 0,
offset: 0,
active: 0,
swiping: false
});
let dragging = false;
const touch = useTouch();
const {
children,
linkChildren
} = useChildren(SWIPE_KEY);
const count = vue.computed(() => children.length);
const size = vue.computed(() => state[props.vertical ? "height" : "width"]);
const delta = vue.computed(() => props.vertical ? touch.deltaY.value : touch.deltaX.value);
const minOffset = vue.computed(() => {
if (state.rect) {
const base = props.vertical ? state.rect.height : state.rect.width;
return base - size.value * count.value;
}
return 0;
});
const maxCount = vue.computed(() => size.value ? Math.ceil(Math.abs(minOffset.value) / size.value) : count.value);
const trackSize = vue.computed(() => count.value * size.value);
const activeIndicator = vue.computed(() => (state.active + count.value) % count.value);
const isCorrectDirection = vue.computed(() => {
const expect = props.vertical ? "vertical" : "horizontal";
return touch.direction.value === expect;
});
const trackStyle = vue.computed(() => {
const style = {
transitionDuration: `${state.swiping ? 0 : props.duration}ms`,
transform: `translate${props.vertical ? "Y" : "X"}(${+state.offset.toFixed(2)}px)`
};
if (size.value) {
const mainAxis = props.vertical ? "height" : "width";
const crossAxis = props.vertical ? "width" : "height";
style[mainAxis] = `${trackSize.value}px`;
style[crossAxis] = props[crossAxis] ? `${props[crossAxis]}px` : "";
}
return style;
});
const getTargetActive = (pace) => {
const {
active
} = state;
if (pace) {
if (props.loop) {
return clamp(active + pace, -1, count.value);
}
return clamp(active + pace, 0, maxCount.value);
}
return active;
};
const getTargetOffset = (targetActive, offset = 0) => {
let currentPosition = targetActive * size.value;
if (!props.loop) {
currentPosition = Math.min(currentPosition, -minOffset.value);
}
let targetOffset = offset - currentPosition;
if (!props.loop) {
targetOffset = clamp(targetOffset, minOffset.value, 0);
}
return targetOffset;
};
const move = ({
pace = 0,
offset = 0,
emitChange
}) => {
if (count.value <= 1) {
return;
}
const {
active
} = state;
const targetActive = getTargetActive(pace);
const targetOffset = getTargetOffset(targetActive, offset);
if (props.loop) {
if (children[0] && targetOffset !== minOffset.value) {
const outRightBound = targetOffset < minOffset.value;
children[0].setOffset(outRightBound ? trackSize.value : 0);
}
if (children[count.value - 1] && targetOffset !== 0) {
const outLeftBound = targetOffset > 0;
children[count.value - 1].setOffset(outLeftBound ? -trackSize.value : 0);
}
}
state.active = targetActive;
state.offset = targetOffset;
if (emitChange && targetActive !== active) {
emit("change", activeIndicator.value);
}
};
const correctPosition = () => {
state.swiping = true;
if (state.active <= -1) {
move({
pace: count.value
});
} else if (state.active >= count.value) {
move({
pace: -count.value
});
}
};
const prev = () => {
correctPosition();
touch.reset();
doubleRaf(() => {
state.swiping = false;
move({
pace: -1,
emitChange: true
});
});
};
const next = () => {
correctPosition();
touch.reset();
doubleRaf(() => {
state.swiping = false;
move({
pace: 1,
emitChange: true
});
});
};
let autoplayTimer;
const stopAutoplay = () => clearTimeout(autoplayTimer);
const autoplay = () => {
stopAutoplay();
if (+props.autoplay > 0 && count.value > 1) {
autoplayTimer = setTimeout(() => {
next();
autoplay();
}, +props.autoplay);
}
};
const initialize = (active = +props.initialSwipe) => {
if (!root.value) {
return;
}
const cb = () => {
var _a, _b;
if (!isHidden(root)) {
const rect = {
width: root.value.offsetWidth,
height: root.value.offsetHeight
};
state.rect = rect;
state.width = +((_a = props.width) != null ? _a : rect.width);
state.height = +((_b = props.height) != null ? _b : rect.height);
}
if (count.value) {
active = Math.min(count.value - 1, active);
if (active === -1) {
active = count.value - 1;
}
}
state.active = active;
state.swiping = true;
state.offset = getTargetOffset(active);
children.forEach((swipe) => {
swipe.setOffset(0);
});
autoplay();
};
if (isHidden(root)) {
vue.nextTick().then(cb);
} else {
cb();
}
};
const resize = () => initialize(state.active);
let touchStartTime;
const onTouchStart = (event) => {
if (!props.touchable || // avoid resetting position on multi-finger touch
event.touches.length > 1)
return;
touch.start(event);
dragging = false;
touchStartTime = Date.now();
stopAutoplay();
correctPosition();
};
const onTouchMove = (event) => {
if (props.touchable && state.swiping) {
touch.move(event);
if (isCorrectDirection.value) {
const isEdgeTouch = !props.loop && (state.active === 0 && delta.value > 0 || state.active === count.value - 1 && delta.value < 0);
if (!isEdgeTouch) {
preventDefault(event, props.stopPropagation);
move({
offset: delta.value
});
if (!dragging) {
emit("dragStart", {
index: activeIndicator.value
});
dragging = true;
}
}
}
}
};
const onTouchEnd = () => {
if (!props.touchable || !state.swiping) {
return;
}
const duration = Date.now() - touchStartTime;
const speed = delta.value / duration;
const shouldSwipe = Math.abs(speed) > 0.25 || Math.abs(delta.value) > size.value / 2;
if (shouldSwipe && isCorrectDirection.value) {
const offset = props.vertical ? touch.offsetY.value : touch.offsetX.value;
let pace = 0;
if (props.loop) {
pace = offset > 0 ? delta.value > 0 ? -1 : 1 : 0;
} else {
pace = -Math[delta.value > 0 ? "ceil" : "floor"](delta.value / size.value);
}
move({
pace,
emitChange: true
});
} else if (delta.value) {
move({
pace: 0
});
}
dragging = false;
state.swiping = false;
emit("dragEnd", {
index: activeIndicator.value
});
autoplay();
};
const swipeTo = (index, options = {}) => {
correctPosition();
touch.reset();
doubleRaf(() => {
let targetIndex;
if (props.loop && index === count.value) {
targetIndex = state.active === 0 ? 0 : index;
} else {
targetIndex = index % count.value;
}
if (options.immediate) {
doubleRaf(() => {
state.swiping = false;
});
} else {
state.swiping = false;
}
move({
pace: targetIndex - state.active,
emitChange: true
});
});
};
const renderDot = (_, index) => {
const active = index === activeIndicator.value;
const style = active ? {
backgroundColor: props.indicatorColor
} : void 0;
return vue.createVNode("i", {
"style": style,
"class": bem$e("indicator", {
active
})
}, null);
};
const renderIndicator = () => {
if (slots.indicator) {
return slots.indicator({
active: activeIndicator.value,
total: count.value
});
}
if (props.showIndicators && count.value > 1) {
return vue.createVNode("div", {
"class": bem$e("indicators", {
vertical: props.vertical
})
}, [Array(count.value).fill("").map(renderDot)]);
}
};
useExpose({
prev,
next,
state,
resize,
swipeTo
});
linkChildren({
size,
props,
count,
activeIndicator
});
vue.watch(() => props.initialSwipe, (value) => initialize(+value));
vue.watch(count, () => initialize(state.active));
vue.watch(() => props.autoplay, autoplay);
vue.watch([windowWidth, windowHeight, () => props.width, () => props.height], resize);
vue.watch(usePageVisibility(), (visible) => {
if (visible === "visible") {
autoplay();
} else {
stopAutoplay();
}
});
vue.onMounted(initialize);
vue.onActivated(() => initialize(state.active));
onPopupReopen(() => initialize(state.active));
vue.onDeactivated(stopAutoplay);
vue.onBeforeUnmount(stopAutoplay);
useEventListener$1("touchmove", onTouchMove, {
target: track
});
return () => {
var _a;
return vue.createVNode("div", {
"ref": root,
"class": bem$e()
}, [vue.createVNode("div", {
"ref": track,
"style": trackStyle.value,
"class": bem$e("track", {
vertical: props.vertical
}),
"onTouchstartPassive": onTouchStart,
"onTouchend": onTouchEnd,
"onTouchcancel": onTouchEnd
}, [(_a = slots.default) == null ? void 0 : _a.call(slots)]), renderIndicator()]);
};
}
});
const Swipe = withInstall(stdin_default$e);
const [name$d, bem$d] = createNamespace("tabs");
var stdin_default$d = vue.defineComponent({
name: name$d,
props: {
count: makeRequiredProp(Number),
inited: Boolean,
animated: Boolean,
duration: makeRequiredProp(numericProp),
swipeable: Boolean,
lazyRender: Boolean,
currentIndex: makeRequiredProp(Number)
},
emits: ["change"],
setup(props, {
emit,
slots
}) {
const swipeRef = vue.ref();
const onChange = (index) => emit("change", index);
const renderChildren = () => {
var _a;
const Content = (_a = slots.default) == null ? void 0 : _a.call(slots);
if (props.animated || props.swipeable) {
return vue.createVNode(Swipe, {
"ref": swipeRef,
"loop": false,
"class": bem$d("track"),
"duration": +props.duration * 1e3,
"touchable": props.swipeable,
"lazyRender": props.lazyRender,
"showIndicators": false,
"onChange": onChange
}, {
default: () => [Content]
});
}
return Content;
};
const swipeToCurrentTab = (index) => {
const swipe = swipeRef.value;
if (swipe && swipe.state.active !== index) {
swipe.swipeTo(index, {
immediate: !props.inited
});
}
};
vue.watch(() => props.currentIndex, swipeToCurrentTab);
vue.onMounted(() => {
swipeToCurrentTab(props.currentIndex);
});
useExpose({
swipeRef
});
return () => vue.createVNode("div", {
"class": bem$d("content", {
animated: props.animated || props.swipeable
})
}, [renderChildren()]);
}
});
const [name$c, bem$c] = createNamespace("tabs");
const tabsProps = {
type: makeStringProp("line"),
color: String,
border: Boolean,
sticky: Boolean,
shrink: Boolean,
active: makeNumericProp(0),
duration: makeNumericProp(0.3),
animated: Boolean,
ellipsis: truthProp,
swipeable: Boolean,
scrollspy: Boolean,
offsetTop: makeNumericProp(0),
background: String,
lazyRender: truthProp,
showHeader: truthProp,
lineWidth: numericProp,
lineHeight: numericProp,
beforeChange: Function,
swipeThreshold: makeNumericProp(5),
titleActiveColor: String,
titleInactiveColor: String
};
const TABS_KEY = Symbol(name$c);
var stdin_default$c = vue.defineComponent({
name: name$c,
props: tabsProps,
emits: ["change", "scroll", "rendered", "clickTab", "update:active"],
setup(props, {
emit,
slots
}) {
let tabHeight;
let lockScroll;
let stickyFixed;
let cancelScrollLeftToRaf;
let cancelScrollTopToRaf;
const root = vue.ref();
const navRef = vue.ref();
const wrapRef = vue.ref();
const contentRef = vue.ref();
const id = useId();
const scroller = useScrollParent(root);
const [titleRefs, setTitleRefs] = useRefs();
const {
children,
linkChildren
} = useChildren(TABS_KEY);
const state = vue.reactive({
inited: false,
position: "",
lineStyle: {},
currentIndex: -1
});
const scrollable = vue.computed(() => children.length > +props.swipeThreshold || !props.ellipsis || props.shrink);
const navStyle = vue.computed(() => ({
borderColor: props.color,
background: props.background
}));
const getTabName = (tab, index) => {
var _a;
return (_a = tab.name) != null ? _a : index;
};
const currentName = vue.computed(() => {
const activeTab = children[state.currentIndex];
if (activeTab) {
return getTabName(activeTab, state.currentIndex);
}
});
const offsetTopPx = vue.computed(() => unitToPx(props.offsetTop));
const scrollOffset = vue.computed(() => {
if (props.sticky) {
return offsetTopPx.value + tabHeight;
}
return 0;
});
const scrollIntoView = (immediate) => {
const nav = navRef.value;
const titles = titleRefs.value;
if (!scrollable.value || !nav || !titles || !titles[state.currentIndex]) {
return;
}
const title = titles[state.currentIndex].$el;
const to = title.offsetLeft - (nav.offsetWidth - title.offsetWidth) / 2;
if (cancelScrollLeftToRaf)
cancelScrollLeftToRaf();
cancelScrollLeftToRaf = scrollLeftTo(nav, to, immediate ? 0 : +props.duration);
};
const setLine = () => {
const shouldAnimate = state.inited;
vue.nextTick(() => {
const titles = titleRefs.value;
if (!titles || !titles[state.currentIndex] || props.type !== "line" || isHidden(root.value)) {
return;
}
const title = titles[state.currentIndex].$el;
const {
lineWidth,
lineHeight
} = props;
const left = title.offsetLeft + title.offsetWidth / 2;
const lineStyle = {
width: addUnit(lineWidth),
backgroundColor: props.color,
transform: `translateX(${left}px) translateX(-50%)`
};
if (shouldAnimate) {
lineStyle.transitionDuration = `${props.duration}s`;
}
if (isDef(lineHeight)) {
const height2 = addUnit(lineHeight);
lineStyle.height = height2;
lineStyle.borderRadius = height2;
}
state.lineStyle = lineStyle;
});
};
const findAvailableTab = (index) => {
const diff = index < state.currentIndex ? -1 : 1;
while (index >= 0 && index < children.length) {
if (!children[index].disabled) {
return index;
}
index += diff;
}
};
const setCurrentIndex = (currentIndex, skipScrollIntoView) => {
const newIndex = findAvailableTab(currentIndex);
if (!isDef(newIndex)) {
return;
}
const newTab = children[newIndex];
const newName = getTabName(newTab, newIndex);
const shouldEmitChange = state.currentIndex !== null;
if (state.currentIndex !== newIndex) {
state.currentIndex = newIndex;
if (!skipScrollIntoView) {
scrollIntoView();
}
setLine();
}
if (newName !== props.active) {
emit("update:active", newName);
if (shouldEmitChange) {
emit("change", newName, newTab.title);
}
}
if (stickyFixed && !props.scrollspy) {
setRootScrollTop(Math.ceil(getElementTop(root.value) - offsetTopPx.value));
}
};
const setCurrentIndexByName = (name2, skipScrollIntoView) => {
const matched = children.find((tab, index2) => getTabName(tab, index2) === name2);
const index = matched ? children.indexOf(matched) : 0;
setCurrentIndex(index, skipScrollIntoView);
};
const scrollToCurrentContent = (immediate = false) => {
if (props.scrollspy) {
const target = children[state.currentIndex].$el;
if (target && scroller.value) {
const to = getElementTop(target, scroller.value) - scrollOffset.value;
lockScroll = true;
if (cancelScrollTopToRaf)
cancelScrollTopToRaf();
cancelScrollTopToRaf = scrollTopTo(scroller.value, to, immediate ? 0 : +props.duration, () => {
lockScroll = false;
});
}
}
};
const onClickTab = (item, index, event) => {
const {
title,
disabled
} = children[index];
const name2 = getTabName(children[index], index);
if (!disabled) {
callInterceptor(props.beforeChange, {
args: [name2],
done: () => {
setCurrentIndex(index);
scrollToCurrentContent();
}
});
route(item);
}
emit("clickTab", {
name: name2,
title,
event,
disabled
});
};
const onStickyScroll = (params) => {
stickyFixed = params.isFixed;
emit("scroll", params);
};
const scrollTo = (name2) => {
vue.nextTick(() => {
setCurrentIndexByName(name2);
scrollToCurrentContent(true);
});
};
const getCurrentIndexOnScroll = () => {
for (let index = 0; index < children.length; index++) {
const {
top
} = useRect(children[index].$el);
if (top > scrollOffset.value) {
return index === 0 ? 0 : index - 1;
}
}
return children.length - 1;
};
const onScroll = () => {
if (props.scrollspy && !lockScroll) {
const index = getCurrentIndexOnScroll();
setCurrentIndex(index);
}
};
const renderLine = () => {
if (props.type === "line" && children.length) {
return vue.createVNode("div", {
"class": bem$c("line"),
"style": state.lineStyle
}, null);
}
};
const renderHeader = () => {
var _a, _b, _c;
const {
type,
border,
sticky
} = props;
const Header = [vue.createVNode("div", {
"ref": sticky ? void 0 : wrapRef,
"class": [bem$c("wrap"), {
[BORDER_TOP_BOTTOM]: type === "line" && border
}]
}, [vue.createVNode("div", {
"ref": navRef,
"role": "tablist",
"class": bem$c("nav", [type, {
shrink: props.shrink,
complete: scrollable.value
}]),
"style": navStyle.value,
"aria-orientation": "horizontal"
}, [(_a = slots["nav-left"]) == null ? void 0 : _a.call(slots), children.map((item) => item.renderTitle(onClickTab)), renderLine(), (_b = slots["nav-right"]) == null ? void 0 : _b.call(slots)])]), (_c = slots["nav-bottom"]) == null ? void 0 : _c.call(slots)];
if (sticky) {
return vue.createVNode("div", {
"ref": wrapRef
}, [Header]);
}
return Header;
};
const resize = () => {
setLine();
vue.nextTick(() => {
var _a, _b;
scrollIntoView(true);
(_b = (_a = contentRef.value) == null ? void 0 : _a.swipeRef.value) == null ? void 0 : _b.resize();
});
};
vue.watch(() => [props.color, props.duration, props.lineWidth, props.lineHeight], setLine);
vue.watch(windowWidth, resize);
vue.watch(() => props.active, (value) => {
if (value !== currentName.value) {
setCurrentIndexByName(value);
}
});
vue.watch(() => children.length, () => {
if (state.inited) {
setCurrentIndexByName(props.active);
setLine();
vue.nextTick(() => {
scrollIntoView(true);
});
}
});
const init = () => {
setCurrentIndexByName(props.active, true);
vue.nextTick(() => {
state.inited = true;
if (wrapRef.value) {
tabHeight = useRect(wrapRef.value).height;
}
scrollIntoView(true);
});
};
const onRendered = (name2, title) => emit("rendered", name2, title);
useExpose({
resize,
scrollTo
});
vue.onActivated(setLine);
onPopupReopen(setLine);
onMountedOrActivated(init);
useVisibilityChange(root, setLine);
useEventListener$1("scroll", onScroll, {
target: scroller,
passive: true
});
linkChildren({
id,
props,
setLine,
scrollable,
onRendered,
currentName,
setTitleRefs,
scrollIntoView
});
return () => vue.createVNode("div", {
"ref": root,
"class": bem$c([props.type])
}, [props.showHeader ? props.sticky ? vue.createVNode(Sticky, {
"container": root.value,
"offsetTop": offsetTopPx.value,
"onScroll": onStickyScroll
}, {
default: () => [renderHeader()]
}) : renderHeader() : null, vue.createVNode(stdin_default$d, {
"ref": contentRef,
"count": children.length,
"inited": state.inited,
"animated": props.animated,
"duration": props.duration,
"swipeable": props.swipeable,
"lazyRender": props.lazyRender,
"currentIndex": state.currentIndex,
"onChange": setCurrentIndex
}, {
default: () => {
var _a;
return [(_a = slots.default) == null ? void 0 : _a.call(slots)];
}
})]);
}
});
const TAB_STATUS_KEY = Symbol();
const [name$b, bem$b] = createNamespace("tab");
const TabTitle = vue.defineComponent({
name: name$b,
props: {
id: String,
dot: Boolean,
type: String,
color: String,
title: String,
badge: numericProp,
shrink: Boolean,
isActive: Boolean,
disabled: Boolean,
controls: String,
scrollable: Boolean,
activeColor: String,
inactiveColor: String,
showZeroBadge: truthProp
},
setup(props, {
slots
}) {
const style = vue.computed(() => {
const style2 = {};
const {
type,
color,
disabled,
isActive,
activeColor,
inactiveColor
} = props;
const isCard = type === "card";
if (color && isCard) {
style2.borderColor = color;
if (!disabled) {
if (isActive) {
style2.backgroundColor = color;
} else {
style2.color = color;
}
}
}
const titleColor = isActive ? activeColor : inactiveColor;
if (titleColor) {
style2.color = titleColor;
}
return style2;
});
const renderText = () => {
const Text = vue.createVNode("span", {
"class": bem$b("text", {
ellipsis: !props.scrollable
})
}, [slots.title ? slots.title() : props.title]);
if (props.dot || isDef(props.badge) && props.badge !== "") {
return vue.createVNode(Badge, {
"dot": props.dot,
"content": props.badge,
"showZero": props.showZeroBadge
}, {
default: () => [Text]
});
}
return Text;
};
return () => vue.createVNode("div", {
"id": props.id,
"role": "tab",
"class": [bem$b([props.type, {
grow: props.scrollable && !props.shrink,
shrink: props.shrink,
active: props.isActive,
disabled: props.disabled
}])],
"style": style.value,
"tabindex": props.disabled ? void 0 : props.isActive ? 0 : -1,
"aria-selected": props.isActive,
"aria-disabled": props.disabled || void 0,
"aria-controls": props.controls
}, [renderText()]);
}
});
const [name$a, bem$a] = createNamespace("swipe-item");
var stdin_default$b = vue.defineComponent({
name: name$a,
setup(props, {
slots
}) {
let rendered;
const state = vue.reactive({
offset: 0,
inited: false,
mounted: false
});
const {
parent,
index
} = useParent(SWIPE_KEY);
if (!parent) {
return;
}
const style = vue.computed(() => {
const style2 = {};
const {
vertical
} = parent.props;
if (parent.size.value) {
style2[vertical ? "height" : "width"] = `${parent.size.value}px`;
}
if (state.offset) {
style2.transform = `translate${vertical ? "Y" : "X"}(${state.offset}px)`;
}
return style2;
});
const shouldRender = vue.computed(() => {
const {
loop,
lazyRender
} = parent.props;
if (!lazyRender || rendered) {
return true;
}
if (!state.mounted) {
return false;
}
const active = parent.activeIndicator.value;
const maxActive = parent.count.value - 1;
const prevActive = active === 0 && loop ? maxActive : active - 1;
const nextActive = active === maxActive && loop ? 0 : active + 1;
rendered = index.value === active || index.value === prevActive || index.value === nextActive;
return rendered;
});
const setOffset = (offset) => {
state.offset = offset;
};
vue.onMounted(() => {
vue.nextTick(() => {
state.mounted = true;
});
});
useExpose({
setOffset
});
return () => {
var _a;
return vue.createVNode("div", {
"class": bem$a(),
"style": style.value
}, [shouldRender.value ? (_a = slots.default) == null ? void 0 : _a.call(slots) : null]);
};
}
});
const SwipeItem = withInstall(stdin_default$b);
const [name$9, bem$9] = createNamespace("tab");
const tabProps = extend({}, routeProps, {
dot: Boolean,
name: numericProp,
badge: numericProp,
title: String,
disabled: Boolean,
titleClass: unknownProp,
titleStyle: [String, Object],
showZeroBadge: truthProp
});
var stdin_default$a = vue.defineComponent({
name: name$9,
props: tabProps,
setup(props, {
slots
}) {
const id = useId();
const inited = vue.ref(false);
const instance = vue.getCurrentInstance();
const {
parent,
index
} = useParent(TABS_KEY);
if (!parent) {
return;
}
const getName = () => {
var _a;
return (_a = props.name) != null ? _a : index.value;
};
const init = () => {
inited.value = true;
if (parent.props.lazyRender) {
vue.nextTick(() => {
parent.onRendered(getName(), props.title);
});
}
};
const active = vue.computed(() => {
const isActive = getName() === parent.currentName.value;
if (isActive && !inited.value) {
init();
}
return isActive;
});
const parsedClass = vue.ref("");
const parsedStyle = vue.ref("");
vue.watchEffect(() => {
const {
titleClass,
titleStyle
} = props;
parsedClass.value = titleClass ? normalizeClass(titleClass) : "";
parsedStyle.value = titleStyle && typeof titleStyle !== "string" ? stringifyStyle(normalizeStyle(titleStyle)) : titleStyle;
});
const renderTitle = (onClickTab) => vue.createVNode(TabTitle, vue.mergeProps({
"key": id,
"id": `${parent.id}-${index.value}`,
"ref": parent.setTitleRefs(index.value),
"style": parsedStyle.value,
"class": parsedClass.value,
"isActive": active.value,
"controls": id,
"scrollable": parent.scrollable.value,
"activeColor": parent.props.titleActiveColor,
"inactiveColor": parent.props.titleInactiveColor,
"onClick": (event) => onClickTab(instance.proxy, index.value, event)
}, pick(parent.props, ["type", "color", "shrink"]), pick(props, ["dot", "badge", "title", "disabled", "showZeroBadge"])), {
title: slots.title
});
const hasInactiveClass = vue.ref(!active.value);
vue.watch(active, (val) => {
if (val) {
hasInactiveClass.value = false;
} else {
doubleRaf(() => {
hasInactiveClass.value = true;
});
}
});
vue.watch(() => props.title, () => {
parent.setLine();
parent.scrollIntoView();
});
vue.provide(TAB_STATUS_KEY, active);
useExpose({
id,
renderTitle
});
return () => {
var _a;
const label = `${parent.id}-${index.value}`;
const {
animated,
swipeable,
scrollspy,
lazyRender
} = parent.props;
if (!slots.default && !animated) {
return;
}
const show = scrollspy || active.value;
if (animated || swipeable) {
return vue.createVNode(SwipeItem, {
"id": id,
"role": "tabpanel",
"class": bem$9("panel-wrapper", {
inactive: hasInactiveClass.value
}),
"tabindex": active.value ? 0 : -1,
"aria-hidden": !active.value,
"aria-labelledby": label
}, {
default: () => {
var _a2;
return [vue.createVNode("div", {
"class": bem$9("panel")
}, [(_a2 = slots.default) == null ? void 0 : _a2.call(slots)])];
}
});
}
const shouldRender = inited.value || scrollspy || !lazyRender;
const Content = shouldRender ? (_a = slots.default) == null ? void 0 : _a.call(slots) : null;
return vue.withDirectives(vue.createVNode("div", {
"id": id,
"role": "tabpanel",
"class": bem$9("panel"),
"tabindex": show ? 0 : -1,
"aria-labelledby": label
}, [Content]), [[vue.vShow, show]]);
};
}
});
const Tab = withInstall(stdin_default$a);
const Tabs = withInstall(stdin_default$c);
const [name$8, bem$8] = createNamespace("cell");
const cellSharedProps = {
tag: makeStringProp("div"),
icon: String,
size: String,
title: numericProp,
value: numericProp,
label: numericProp,
center: Boolean,
isLink: Boolean,
border: truthProp,
iconPrefix: String,
valueClass: unknownProp,
labelClass: unknownProp,
titleClass: unknownProp,
titleStyle: null,
arrowDirection: String,
required: {
type: [Boolean, String],
default: null
},
clickable: {
type: Boolean,
default: null
}
};
const cellProps = extend({}, cellSharedProps, routeProps);
var stdin_default$9 = vue.defineComponent({
name: name$8,
props: cellProps,
setup(props, {
slots
}) {
const route2 = useRoute();
const renderLabel = () => {
const showLabel = slots.label || isDef(props.label);
if (showLabel) {
return vue.createVNode("div", {
"class": [bem$8("label"), props.labelClass]
}, [slots.label ? slots.label() : props.label]);
}
};
const renderTitle = () => {
var _a;
if (slots.title || isDef(props.title)) {
const titleSlot = (_a = slots.title) == null ? void 0 : _a.call(slots);
if (Array.isArray(titleSlot) && titleSlot.length === 0) {
return;
}
return vue.createVNode("div", {
"class": [bem$8("title"), props.titleClass],
"style": props.titleStyle
}, [titleSlot || vue.createVNode("span", null, [props.title]), renderLabel()]);
}
};
const renderValue = () => {
const slot = slots.value || slots.default;
const hasValue = slot || isDef(props.value);
if (hasValue) {
return vue.createVNode("div", {
"class": [bem$8("value"), props.valueClass]
}, [slot ? slot() : vue.createVNode("span", null, [props.value])]);
}
};
const renderLeftIcon = () => {
if (slots.icon) {
return slots.icon();
}
if (props.icon) {
return vue.createVNode(Icon, {
"name": props.icon,
"class": bem$8("left-icon"),
"classPrefix": props.iconPrefix
}, null);
}
};
const renderRightIcon = () => {
if (slots["right-icon"]) {
return slots["right-icon"]();
}
if (props.isLink) {
const name2 = props.arrowDirection && props.arrowDirection !== "right" ? `arrow-${props.arrowDirection}` : "arrow";
return vue.createVNode(Icon, {
"name": name2,
"class": bem$8("right-icon")
}, null);
}
};
return () => {
var _a;
const {
tag,
size,
center,
border,
isLink,
required
} = props;
const clickable = (_a = props.clickable) != null ? _a : isLink;
const classes = {
center,
required: !!required,
clickable,
borderless: !border
};
if (size) {
classes[size] = !!size;
}
return vue.createVNode(tag, {
"class": bem$8(classes),
"role": clickable ? "button" : void 0,
"tabindex": clickable ? 0 : void 0,
"onClick": route2
}, {
default: () => {
var _a2;
return [renderLeftIcon(), renderTitle(), renderValue(), renderRightIcon(), (_a2 = slots.extra) == null ? void 0 : _a2.call(slots)];
}
});
};
}
});
const Cell = withInstall(stdin_default$9);
function isEmptyValue(value) {
if (Array.isArray(value)) {
return !value.length;
}
if (value === 0) {
return false;
}
return !value;
}
function runSyncRule(value, rule) {
if (isEmptyValue(value)) {
if (rule.required) {
return false;
}
if (rule.validateEmpty === false) {
return true;
}
}
if (rule.pattern && !rule.pattern.test(String(value))) {
return false;
}
return true;
}
function runRuleValidator(value, rule) {
return new Promise((resolve) => {
const returnVal = rule.validator(value, rule);
if (isPromise(returnVal)) {
returnVal.then(resolve);
return;
}
resolve(returnVal);
});
}
function getRuleMessage(value, rule) {
const { message } = rule;
if (isFunction(message)) {
return message(value, rule);
}
return message || "";
}
function startComposing({ target }) {
target.composing = true;
}
function endComposing({ target }) {
if (target.composing) {
target.composing = false;
target.dispatchEvent(new Event("input"));
}
}
function resizeTextarea(input, autosize) {
const scrollTop = getRootScrollTop();
input.style.height = "auto";
let height2 = input.scrollHeight;
if (isObject$2(autosize)) {
const { maxHeight, minHeight } = autosize;
if (maxHeight !== void 0) {
height2 = Math.min(height2, maxHeight);
}
if (minHeight !== void 0) {
height2 = Math.max(height2, minHeight);
}
}
if (height2) {
input.style.height = `${height2}px`;
setRootScrollTop(scrollTop);
}
}
function mapInputType(type) {
if (type === "number") {
return {
type: "text",
inputmode: "decimal"
};
}
if (type === "digit") {
return {
type: "tel",
inputmode: "numeric"
};
}
return { type };
}
function getStringLength(str) {
return [...str].length;
}
function cutString(str, maxlength) {
return [...str].slice(0, maxlength).join("");
}
const [name$7, bem$7] = createNamespace("field");
const fieldSharedProps = {
id: String,
name: String,
leftIcon: String,
rightIcon: String,
autofocus: Boolean,
clearable: Boolean,
maxlength: numericProp,
formatter: Function,
clearIcon: makeStringProp("clear"),
modelValue: makeNumericProp(""),
inputAlign: String,
placeholder: String,
autocomplete: String,
autocapitalize: String,
autocorrect: String,
errorMessage: String,
enterkeyhint: String,
clearTrigger: makeStringProp("focus"),
formatTrigger: makeStringProp("onChange"),
spellcheck: {
type: Boolean,
default: null
},
error: {
type: Boolean,
default: null
},
disabled: {
type: Boolean,
default: null
},
readonly: {
type: Boolean,
default: null
}
};
const fieldProps = extend({}, cellSharedProps, fieldSharedProps, {
rows: numericProp,
type: makeStringProp("text"),
rules: Array,
autosize: [Boolean, Object],
labelWidth: numericProp,
labelClass: unknownProp,
labelAlign: String,
showWordLimit: Boolean,
errorMessageAlign: String,
colon: {
type: Boolean,
default: null
}
});
var stdin_default$8 = vue.defineComponent({
name: name$7,
props: fieldProps,
emits: ["blur", "focus", "clear", "keypress", "clickInput", "endValidate", "startValidate", "clickLeftIcon", "clickRightIcon", "update:modelValue"],
setup(props, {
emit,
slots
}) {
const id = useId();
const state = vue.reactive({
status: "unvalidated",
focused: false,
validateMessage: ""
});
const inputRef = vue.ref();
const clearIconRef = vue.ref();
const customValue = vue.ref();
const {
parent: form
} = useParent(FORM_KEY);
const getModelValue = () => {
var _a;
return String((_a = props.modelValue) != null ? _a : "");
};
const getProp = (key) => {
if (isDef(props[key])) {
return props[key];
}
if (form && isDef(form.props[key])) {
return form.props[key];
}
};
const showClear = vue.computed(() => {
const readonly2 = getProp("readonly");
if (props.clearable && !readonly2) {
const hasValue = getModelValue() !== "";
const trigger = props.clearTrigger === "always" || props.clearTrigger === "focus" && state.focused;
return hasValue && trigger;
}
return false;
});
const formValue = vue.computed(() => {
if (customValue.value && slots.input) {
return customValue.value();
}
return props.modelValue;
});
const showRequiredMark = vue.computed(() => {
var _a;
const required = getProp("required");
if (required === "auto") {
return (_a = props.rules) == null ? void 0 : _a.some((rule) => rule.required);
}
return required;
});
const runRules = (rules) => rules.reduce((promise, rule) => promise.then(() => {
if (state.status === "failed") {
return;
}
let {
value
} = formValue;
if (rule.formatter) {
value = rule.formatter(value, rule);
}
if (!runSyncRule(value, rule)) {
state.status = "failed";
state.validateMessage = getRuleMessage(value, rule);
return;
}
if (rule.validator) {
if (isEmptyValue(value) && rule.validateEmpty === false) {
return;
}
return runRuleValidator(value, rule).then((result) => {
if (result && typeof result === "string") {
state.status = "failed";
state.validateMessage = result;
} else if (result === false) {
state.status = "failed";
state.validateMessage = getRuleMessage(value, rule);
}
});
}
}), Promise.resolve());
const resetValidation = () => {
state.status = "unvalidated";
state.validateMessage = "";
};
const endValidate = () => emit("endValidate", {
status: state.status,
message: state.validateMessage
});
const validate = (rules = props.rules) => new Promise((resolve) => {
resetValidation();
if (rules) {
emit("startValidate");
runRules(rules).then(() => {
if (state.status === "failed") {
resolve({
name: props.name,
message: state.validateMessage
});
endValidate();
} else {
state.status = "passed";
resolve();
endValidate();
}
});
} else {
resolve();
}
});
const validateWithTrigger = (trigger) => {
if (form && props.rules) {
const {
validateTrigger
} = form.props;
const defaultTrigger = toArray(validateTrigger).includes(trigger);
const rules = props.rules.filter((rule) => {
if (rule.trigger) {
return toArray(rule.trigger).includes(trigger);
}
return defaultTrigger;
});
if (rules.length) {
validate(rules);
}
}
};
const limitValueLength = (value) => {
var _a;
const {
maxlength
} = props;
if (isDef(maxlength) && getStringLength(value) > +maxlength) {
const modelValue = getModelValue();
if (modelValue && getStringLength(modelValue) === +maxlength) {
return modelValue;
}
const selectionEnd = (_a = inputRef.value) == null ? void 0 : _a.selectionEnd;
if (state.focused && selectionEnd) {
const valueArr = [...value];
const exceededLength = valueArr.length - +maxlength;
valueArr.splice(selectionEnd - exceededLength, exceededLength);
return valueArr.join("");
}
return cutString(value, +maxlength);
}
return value;
};
const updateValue = (value, trigger = "onChange") => {
const originalValue = value;
value = limitValueLength(value);
const limitDiffLen = getStringLength(originalValue) - getStringLength(value);
if (props.type === "number" || props.type === "digit") {
const isNumber = props.type === "number";
value = formatNumber(value, isNumber, isNumber);
}
let formatterDiffLen = 0;
if (props.formatter && trigger === props.formatTrigger) {
const {
formatter,
maxlength
} = props;
value = formatter(value);
if (isDef(maxlength) && getStringLength(value) > +maxlength) {
value = cutString(value, +maxlength);
}
if (inputRef.value && state.focused) {
const {
selectionEnd
} = inputRef.value;
const bcoVal = cutString(originalValue, selectionEnd);
formatterDiffLen = getStringLength(formatter(bcoVal)) - getStringLength(bcoVal);
}
}
if (inputRef.value && inputRef.value.value !== value) {
if (state.focused) {
let {
selectionStart,
selectionEnd
} = inputRef.value;
inputRef.value.value = value;
if (isDef(selectionStart) && isDef(selectionEnd)) {
const valueLen = getStringLength(value);
if (limitDiffLen) {
selectionStart -= limitDiffLen;
selectionEnd -= limitDiffLen;
} else if (formatterDiffLen) {
selectionStart += formatterDiffLen;
selectionEnd += formatterDiffLen;
}
inputRef.value.setSelectionRange(Math.min(selectionStart, valueLen), Math.min(selectionEnd, valueLen));
}
} else {
inputRef.value.value = value;
}
}
if (value !== props.modelValue) {
emit("update:modelValue", value);
}
};
const onInput = (event) => {
if (!event.target.composing) {
updateValue(event.target.value);
}
};
const blur = () => {
var _a;
return (_a = inputRef.value) == null ? void 0 : _a.blur();
};
const focus = () => {
var _a;
return (_a = inputRef.value) == null ? void 0 : _a.focus();
};
const adjustTextareaSize = () => {
const input = inputRef.value;
if (props.type === "textarea" && props.autosize && input) {
resizeTextarea(input, props.autosize);
}
};
const onFocus = (event) => {
state.focused = true;
emit("focus", event);
vue.nextTick(adjustTextareaSize);
if (getProp("readonly")) {
blur();
}
};
const onBlur = (event) => {
state.focused = false;
updateValue(getModelValue(), "onBlur");
emit("blur", event);
if (getProp("readonly")) {
return;
}
validateWithTrigger("onBlur");
vue.nextTick(adjustTextareaSize);
resetScroll();
};
const onClickInput = (event) => emit("clickInput", event);
const onClickLeftIcon = (event) => emit("clickLeftIcon", event);
const onClickRightIcon = (event) => emit("clickRightIcon", event);
const onClear = (event) => {
preventDefault(event);
emit("update:modelValue", "");
emit("clear", event);
};
const showError = vue.computed(() => {
if (typeof props.error === "boolean") {
return props.error;
}
if (form && form.props.showError && state.status === "failed") {
return true;
}
});
const labelStyle = vue.computed(() => {
const labelWidth = getProp("labelWidth");
const labelAlign = getProp("labelAlign");
if (labelWidth && labelAlign !== "top") {
return {
width: addUnit(labelWidth)
};
}
});
const onKeypress = (event) => {
const ENTER_CODE = 13;
if (event.keyCode === ENTER_CODE) {
const submitOnEnter = form && form.props.submitOnEnter;
if (!submitOnEnter && props.type !== "textarea") {
preventDefault(event);
}
if (props.type === "search") {
blur();
}
}
emit("keypress", event);
};
const getInputId = () => props.id || `${id}-input`;
const getValidationStatus = () => state.status;
const renderInput = () => {
const controlClass = bem$7("control", [getProp("inputAlign"), {
error: showError.value,
custom: !!slots.input,
"min-height": props.type === "textarea" && !props.autosize
}]);
if (slots.input) {
return vue.createVNode("div", {
"class": controlClass,
"onClick": onClickInput
}, [slots.input()]);
}
const inputAttrs = {
id: getInputId(),
ref: inputRef,
name: props.name,
rows: props.rows !== void 0 ? +props.rows : void 0,
class: controlClass,
disabled: getProp("disabled"),
readonly: getProp("readonly"),
autofocus: props.autofocus,
placeholder: props.placeholder,
autocomplete: props.autocomplete,
autocapitalize: props.autocapitalize,
autocorrect: props.autocorrect,
enterkeyhint: props.enterkeyhint,
spellcheck: props.spellcheck,
"aria-labelledby": props.label ? `${id}-label` : void 0,
onBlur,
onFocus,
onInput,
onClick: onClickInput,
onChange: endComposing,
onKeypress,
onCompositionend: endComposing,
onCompositionstart: startComposing
};
if (props.type === "textarea") {
return vue.createVNode("textarea", inputAttrs, null);
}
return vue.createVNode("input", vue.mergeProps(mapInputType(props.type), inputAttrs), null);
};
const renderLeftIcon = () => {
const leftIconSlot = slots["left-icon"];
if (props.leftIcon || leftIconSlot) {
return vue.createVNode("div", {
"class": bem$7("left-icon"),
"onClick": onClickLeftIcon
}, [leftIconSlot ? leftIconSlot() : vue.createVNode(Icon, {
"name": props.leftIcon,
"classPrefix": props.iconPrefix
}, null)]);
}
};
const renderRightIcon = () => {
const rightIconSlot = slots["right-icon"];
if (props.rightIcon || rightIconSlot) {
return vue.createVNode("div", {
"class": bem$7("right-icon"),
"onClick": onClickRightIcon
}, [rightIconSlot ? rightIconSlot() : vue.createVNode(Icon, {
"name": props.rightIcon,
"classPrefix": props.iconPrefix
}, null)]);
}
};
const renderWordLimit = () => {
if (props.showWordLimit && props.maxlength) {
const count = getStringLength(getModelValue());
return vue.createVNode("div", {
"class": bem$7("word-limit")
}, [vue.createVNode("span", {
"class": bem$7("word-num")
}, [count]), vue.createTextVNode("/"), props.maxlength]);
}
};
const renderMessage = () => {
if (form && form.props.showErrorMessage === false) {
return;
}
const message = props.errorMessage || state.validateMessage;
if (message) {
const slot = slots["error-message"];
const errorMessageAlign = getProp("errorMessageAlign");
return vue.createVNode("div", {
"class": bem$7("error-message", errorMessageAlign)
}, [slot ? slot({
message
}) : message]);
}
};
const renderLabel = () => {
const labelWidth = getProp("labelWidth");
const labelAlign = getProp("labelAlign");
const colon = getProp("colon") ? ":" : "";
if (slots.label) {
return [slots.label(), colon];
}
if (props.label) {
return vue.createVNode("label", {
"id": `${id}-label`,
"for": slots.input ? void 0 : getInputId(),
"onClick": (event) => {
preventDefault(event);
focus();
},
"style": labelAlign === "top" && labelWidth ? {
width: addUnit(labelWidth)
} : void 0
}, [props.label + colon]);
}
};
const renderFieldBody = () => [vue.createVNode("div", {
"class": bem$7("body")
}, [renderInput(), showClear.value && vue.createVNode(Icon, {
"ref": clearIconRef,
"name": props.clearIcon,
"class": bem$7("clear")
}, null), renderRightIcon(), slots.button && vue.createVNode("div", {
"class": bem$7("button")
}, [slots.button()])]), renderWordLimit(), renderMessage()];
useExpose({
blur,
focus,
validate,
formValue,
resetValidation,
getValidationStatus
});
vue.provide(CUSTOM_FIELD_INJECTION_KEY, {
customValue,
resetValidation,
validateWithTrigger
});
vue.watch(() => props.modelValue, () => {
updateValue(getModelValue());
resetValidation();
validateWithTrigger("onChange");
vue.nextTick(adjustTextareaSize);
});
vue.onMounted(() => {
updateValue(getModelValue(), props.formatTrigger);
vue.nextTick(adjustTextareaSize);
});
useEventListener$1("touchstart", onClear, {
target: vue.computed(() => {
var _a;
return (_a = clearIconRef.value) == null ? void 0 : _a.$el;
})
});
return () => {
const disabled = getProp("disabled");
const labelAlign = getProp("labelAlign");
const LeftIcon = renderLeftIcon();
const renderTitle = () => {
const Label = renderLabel();
if (labelAlign === "top") {
return [LeftIcon, Label].filter(Boolean);
}
return Label || [];
};
return vue.createVNode(Cell, {
"size": props.size,
"class": bem$7({
error: showError.value,
disabled,
[`label-${labelAlign}`]: labelAlign
}),
"center": props.center,
"border": props.border,
"isLink": props.isLink,
"clickable": props.clickable,
"titleStyle": labelStyle.value,
"valueClass": bem$7("value"),
"titleClass": [bem$7("label", [labelAlign, {
required: showRequiredMark.value
}]), props.labelClass],
"arrowDirection": props.arrowDirection
}, {
icon: LeftIcon && labelAlign !== "top" ? () => LeftIcon : null,
title: renderTitle,
value: renderFieldBody,
extra: slots.extra
});
};
}
});
const Field = withInstall(stdin_default$8);
const [name$6, bem$6] = createNamespace("switch");
const switchProps = {
size: numericProp,
loading: Boolean,
disabled: Boolean,
modelValue: unknownProp,
activeColor: String,
inactiveColor: String,
activeValue: {
type: unknownProp,
default: true
},
inactiveValue: {
type: unknownProp,
default: false
}
};
var stdin_default$7 = vue.defineComponent({
name: name$6,
props: switchProps,
emits: ["change", "update:modelValue"],
setup(props, {
emit,
slots
}) {
const isChecked = () => props.modelValue === props.activeValue;
const onClick = () => {
if (!props.disabled && !props.loading) {
const newValue = isChecked() ? props.inactiveValue : props.activeValue;
emit("update:modelValue", newValue);
emit("change", newValue);
}
};
const renderLoading = () => {
if (props.loading) {
const color = isChecked() ? props.activeColor : props.inactiveColor;
return vue.createVNode(Loading, {
"class": bem$6("loading"),
"color": color
}, null);
}
if (slots.node) {
return slots.node();
}
};
useCustomFieldValue(() => props.modelValue);
return () => {
var _a;
const {
size,
loading,
disabled,
activeColor,
inactiveColor
} = props;
const checked = isChecked();
const style = {
fontSize: addUnit(size),
backgroundColor: checked ? activeColor : inactiveColor
};
return vue.createVNode("div", {
"role": "switch",
"class": bem$6({
on: checked,
loading,
disabled
}),
"style": style,
"tabindex": disabled ? void 0 : 0,
"aria-checked": checked,
"onClick": onClick
}, [vue.createVNode("div", {
"class": bem$6("node")
}, [renderLoading()]), (_a = slots.background) == null ? void 0 : _a.call(slots)]);
};
}
});
const Switch = withInstall(stdin_default$7);
const [name$5, bem$5] = createNamespace("radio-group");
const radioGroupProps = {
shape: String,
disabled: Boolean,
iconSize: numericProp,
direction: String,
modelValue: unknownProp,
checkedColor: String
};
const RADIO_KEY = Symbol(name$5);
var stdin_default$6 = vue.defineComponent({
name: name$5,
props: radioGroupProps,
emits: ["change", "update:modelValue"],
setup(props, {
emit,
slots
}) {
const {
linkChildren
} = useChildren(RADIO_KEY);
const updateValue = (value) => emit("update:modelValue", value);
vue.watch(() => props.modelValue, (value) => emit("change", value));
linkChildren({
props,
updateValue
});
useCustomFieldValue(() => props.modelValue);
return () => {
var _a;
return vue.createVNode("div", {
"class": bem$5([props.direction]),
"role": "radiogroup"
}, [(_a = slots.default) == null ? void 0 : _a.call(slots)]);
};
}
});
const RadioGroup = withInstall(stdin_default$6);
const checkerProps = {
name: unknownProp,
disabled: Boolean,
iconSize: numericProp,
modelValue: unknownProp,
checkedColor: String,
labelPosition: String,
labelDisabled: Boolean
};
var stdin_default$5 = vue.defineComponent({
props: extend({}, checkerProps, {
bem: makeRequiredProp(Function),
role: String,
shape: String,
parent: Object,
checked: Boolean,
bindGroup: truthProp,
indeterminate: {
type: Boolean,
default: null
}
}),
emits: ["click", "toggle"],
setup(props, {
emit,
slots
}) {
const iconRef = vue.ref();
const getParentProp = (name2) => {
if (props.parent && props.bindGroup) {
return props.parent.props[name2];
}
};
const disabled = vue.computed(() => {
if (props.parent && props.bindGroup) {
const disabled2 = getParentProp("disabled") || props.disabled;
if (props.role === "checkbox") {
const checkedCount = getParentProp("modelValue").length;
const max = getParentProp("max");
const overlimit = max && checkedCount >= +max;
return disabled2 || overlimit && !props.checked;
}
return disabled2;
}
return props.disabled;
});
const direction = vue.computed(() => getParentProp("direction"));
const iconStyle = vue.computed(() => {
const checkedColor = props.checkedColor || getParentProp("checkedColor");
if (checkedColor && props.checked && !disabled.value) {
return {
borderColor: checkedColor,
backgroundColor: checkedColor
};
}
});
const shape = vue.computed(() => {
return props.shape || getParentProp("shape") || "round";
});
const onClick = (event) => {
const {
target
} = event;
const icon = iconRef.value;
const iconClicked = icon === target || (icon == null ? void 0 : icon.contains(target));
if (!disabled.value && (iconClicked || !props.labelDisabled)) {
emit("toggle");
}
emit("click", event);
};
const renderIcon = () => {
var _a, _b;
const {
bem: bem2,
checked,
indeterminate
} = props;
const iconSize = props.iconSize || getParentProp("iconSize");
return vue.createVNode("div", {
"ref": iconRef,
"class": bem2("icon", [shape.value, {
disabled: disabled.value,
checked,
indeterminate
}]),
"style": shape.value !== "dot" ? {
fontSize: addUnit(iconSize)
} : {
width: addUnit(iconSize),
height: addUnit(iconSize),
borderColor: (_a = iconStyle.value) == null ? void 0 : _a.borderColor
}
}, [slots.icon ? slots.icon({
checked,
disabled: disabled.value
}) : shape.value !== "dot" ? vue.createVNode(Icon, {
"name": indeterminate ? "minus" : "success",
"style": iconStyle.value
}, null) : vue.createVNode("div", {
"class": bem2("icon--dot__icon"),
"style": {
backgroundColor: (_b = iconStyle.value) == null ? void 0 : _b.backgroundColor
}
}, null)]);
};
const renderLabel = () => {
const {
checked
} = props;
if (slots.default) {
return vue.createVNode("span", {
"class": props.bem("label", [props.labelPosition, {
disabled: disabled.value
}])
}, [slots.default({
checked,
disabled: disabled.value
})]);
}
};
return () => {
const nodes = props.labelPosition === "left" ? [renderLabel(), renderIcon()] : [renderIcon(), renderLabel()];
return vue.createVNode("div", {
"role": props.role,
"class": props.bem([{
disabled: disabled.value,
"label-disabled": props.labelDisabled
}, direction.value]),
"tabindex": disabled.value ? void 0 : 0,
"aria-checked": props.checked,
"onClick": onClick
}, [nodes]);
};
}
});
const radioProps = extend({}, checkerProps, {
shape: String
});
const [name$4, bem$4] = createNamespace("radio");
var stdin_default$4 = vue.defineComponent({
name: name$4,
props: radioProps,
emits: ["update:modelValue"],
setup(props, {
emit,
slots
}) {
const {
parent
} = useParent(RADIO_KEY);
const checked = () => {
const value = parent ? parent.props.modelValue : props.modelValue;
return value === props.name;
};
const toggle = () => {
if (parent) {
parent.updateValue(props.name);
} else {
emit("update:modelValue", props.name);
}
};
return () => vue.createVNode(stdin_default$5, vue.mergeProps({
"bem": bem$4,
"role": "radio",
"parent": parent,
"checked": checked(),
"onToggle": toggle
}, props), pick(slots, ["default", "icon"]));
}
});
const Radio = withInstall(stdin_default$4);
const [name$3, bem$3] = createNamespace("image");
const imageProps = {
src: String,
alt: String,
fit: String,
position: String,
round: Boolean,
block: Boolean,
width: numericProp,
height: numericProp,
radius: numericProp,
lazyLoad: Boolean,
iconSize: numericProp,
showError: truthProp,
errorIcon: makeStringProp("photo-fail"),
iconPrefix: String,
showLoading: truthProp,
loadingIcon: makeStringProp("photo")
};
var stdin_default$3 = vue.defineComponent({
name: name$3,
props: imageProps,
emits: ["load", "error"],
setup(props, {
emit,
slots
}) {
const error = vue.ref(false);
const loading = vue.ref(true);
const imageRef = vue.ref();
const {
$Lazyload
} = vue.getCurrentInstance().proxy;
const style = vue.computed(() => {
const style2 = {
width: addUnit(props.width),
height: addUnit(props.height)
};
if (isDef(props.radius)) {
style2.overflow = "hidden";
style2.borderRadius = addUnit(props.radius);
}
return style2;
});
vue.watch(() => props.src, () => {
error.value = false;
loading.value = true;
});
const onLoad = (event) => {
if (loading.value) {
loading.value = false;
emit("load", event);
}
};
const triggerLoad = () => {
const loadEvent = new Event("load");
Object.defineProperty(loadEvent, "target", {
value: imageRef.value,
enumerable: true
});
onLoad(loadEvent);
};
const onError = (event) => {
error.value = true;
loading.value = false;
emit("error", event);
};
const renderIcon = (name2, className, slot) => {
if (slot) {
return slot();
}
return vue.createVNode(Icon, {
"name": name2,
"size": props.iconSize,
"class": className,
"classPrefix": props.iconPrefix
}, null);
};
const renderPlaceholder = () => {
if (loading.value && props.showLoading) {
return vue.createVNode("div", {
"class": bem$3("loading")
}, [renderIcon(props.loadingIcon, bem$3("loading-icon"), slots.loading)]);
}
if (error.value && props.showError) {
return vue.createVNode("div", {
"class": bem$3("error")
}, [renderIcon(props.errorIcon, bem$3("error-icon"), slots.error)]);
}
};
const renderImage = () => {
if (error.value || !props.src) {
return;
}
const attrs = {
alt: props.alt,
class: bem$3("img"),
style: {
objectFit: props.fit,
objectPosition: props.position
}
};
if (props.lazyLoad) {
return vue.withDirectives(vue.createVNode("img", vue.mergeProps({
"ref": imageRef
}, attrs), null), [[vue.resolveDirective("lazy"), props.src]]);
}
return vue.createVNode("img", vue.mergeProps({
"ref": imageRef,
"src": props.src,
"onLoad": onLoad,
"onError": onError
}, attrs), null);
};
const onLazyLoaded = ({
el
}) => {
const check = () => {
if (el === imageRef.value && loading.value) {
triggerLoad();
}
};
if (imageRef.value) {
check();
} else {
vue.nextTick(check);
}
};
const onLazyLoadError = ({
el
}) => {
if (el === imageRef.value && !error.value) {
onError();
}
};
if ($Lazyload && inBrowser$1) {
$Lazyload.$on("loaded", onLazyLoaded);
$Lazyload.$on("error", onLazyLoadError);
vue.onBeforeUnmount(() => {
$Lazyload.$off("loaded", onLazyLoaded);
$Lazyload.$off("error", onLazyLoadError);
});
}
vue.onMounted(() => {
vue.nextTick(() => {
var _a;
if (((_a = imageRef.value) == null ? void 0 : _a.complete) && !props.lazyLoad) {
triggerLoad();
}
});
});
return () => {
var _a;
return vue.createVNode("div", {
"class": bem$3({
round: props.round,
block: props.block
}),
"style": style.value
}, [renderImage(), renderPlaceholder(), (_a = slots.default) == null ? void 0 : _a.call(slots)]);
};
}
});
const Image = withInstall(stdin_default$3);
const [name$2, bem$2] = createNamespace("cell-group");
const cellGroupProps = {
title: String,
inset: Boolean,
border: truthProp
};
var stdin_default$2 = vue.defineComponent({
name: name$2,
inheritAttrs: false,
props: cellGroupProps,
setup(props, {
slots,
attrs
}) {
const renderGroup = () => {
var _a;
return vue.createVNode("div", vue.mergeProps({
"class": [bem$2({
inset: props.inset
}), {
[BORDER_TOP_BOTTOM]: props.border && !props.inset
}]
}, attrs, useScopeId()), [(_a = slots.default) == null ? void 0 : _a.call(slots)]);
};
const renderTitle = () => vue.createVNode("div", {
"class": bem$2("title", {
inset: props.inset
})
}, [slots.title ? slots.title() : props.title]);
return () => {
if (props.title || slots.title) {
return vue.createVNode(vue.Fragment, null, [renderTitle(), renderGroup()]);
}
return renderGroup();
};
}
});
const CellGroup = withInstall(stdin_default$2);
const [name$1, bem$1] = createNamespace("nav-bar");
const navBarProps = {
title: String,
fixed: Boolean,
zIndex: numericProp,
border: truthProp,
leftText: String,
rightText: String,
leftDisabled: Boolean,
rightDisabled: Boolean,
leftArrow: Boolean,
placeholder: Boolean,
safeAreaInsetTop: Boolean,
clickable: truthProp
};
var stdin_default$1 = vue.defineComponent({
name: name$1,
props: navBarProps,
emits: ["clickLeft", "clickRight"],
setup(props, {
emit,
slots
}) {
const navBarRef = vue.ref();
const renderPlaceholder = usePlaceholder(navBarRef, bem$1);
const onClickLeft = (event) => {
if (!props.leftDisabled) {
emit("clickLeft", event);
}
};
const onClickRight = (event) => {
if (!props.rightDisabled) {
emit("clickRight", event);
}
};
const renderLeft = () => {
if (slots.left) {
return slots.left();
}
return [props.leftArrow && vue.createVNode(Icon, {
"class": bem$1("arrow"),
"name": "arrow-left"
}, null), props.leftText && vue.createVNode("span", {
"class": bem$1("text")
}, [props.leftText])];
};
const renderRight = () => {
if (slots.right) {
return slots.right();
}
return vue.createVNode("span", {
"class": bem$1("text")
}, [props.rightText]);
};
const renderNavBar = () => {
const {
title,
fixed,
border,
zIndex
} = props;
const style = getZIndexStyle(zIndex);
const hasLeft = props.leftArrow || props.leftText || slots.left;
const hasRight = props.rightText || slots.right;
return vue.createVNode("div", {
"ref": navBarRef,
"style": style,
"class": [bem$1({
fixed
}), {
[BORDER_BOTTOM]: border,
"van-safe-area-top": props.safeAreaInsetTop
}]
}, [vue.createVNode("div", {
"class": bem$1("content")
}, [hasLeft && vue.createVNode("div", {
"class": [bem$1("left", {
disabled: props.leftDisabled
}), props.clickable && !props.leftDisabled ? HAPTICS_FEEDBACK : ""],
"onClick": onClickLeft
}, [renderLeft()]), vue.createVNode("div", {
"class": [bem$1("title"), "van-ellipsis"]
}, [slots.title ? slots.title() : title]), hasRight && vue.createVNode("div", {
"class": [bem$1("right", {
disabled: props.rightDisabled
}), props.clickable && !props.rightDisabled ? HAPTICS_FEEDBACK : ""],
"onClick": onClickRight
}, [renderRight()])])]);
};
return () => {
if (props.fixed && props.placeholder) {
return renderPlaceholder(renderNavBar);
}
return renderNavBar();
};
}
});
const NavBar = withInstall(stdin_default$1);
const [name, bem] = createNamespace("stepper");
const LONG_PRESS_INTERVAL = 200;
const isEqual = (value1, value2) => String(value1) === String(value2);
const stepperProps = {
min: makeNumericProp(1),
max: makeNumericProp(Infinity),
name: makeNumericProp(""),
step: makeNumericProp(1),
theme: String,
integer: Boolean,
disabled: Boolean,
showPlus: truthProp,
showMinus: truthProp,
showInput: truthProp,
longPress: truthProp,
autoFixed: truthProp,
allowEmpty: Boolean,
modelValue: numericProp,
inputWidth: numericProp,
buttonSize: numericProp,
placeholder: String,
disablePlus: Boolean,
disableMinus: Boolean,
disableInput: Boolean,
beforeChange: Function,
defaultValue: makeNumericProp(1),
decimalLength: numericProp
};
var stdin_default = vue.defineComponent({
name,
props: stepperProps,
emits: ["plus", "blur", "minus", "focus", "change", "overlimit", "update:modelValue"],
setup(props, {
emit
}) {
const format = (value, autoFixed = true) => {
const {
min,
max,
allowEmpty,
decimalLength
} = props;
if (allowEmpty && value === "") {
return value;
}
value = formatNumber(String(value), !props.integer);
value = value === "" ? 0 : +value;
value = Number.isNaN(value) ? +min : value;
value = autoFixed ? Math.max(Math.min(+max, value), +min) : value;
if (isDef(decimalLength)) {
value = value.toFixed(+decimalLength);
}
return value;
};
const getInitialValue = () => {
var _a;
const defaultValue = (_a = props.modelValue) != null ? _a : props.defaultValue;
const value = format(defaultValue);
if (!isEqual(value, props.modelValue)) {
emit("update:modelValue", value);
}
return value;
};
let actionType;
const inputRef = vue.ref();
const current2 = vue.ref(getInitialValue());
const minusDisabled = vue.computed(() => props.disabled || props.disableMinus || +current2.value <= +props.min);
const plusDisabled = vue.computed(() => props.disabled || props.disablePlus || +current2.value >= +props.max);
const inputStyle = vue.computed(() => ({
width: addUnit(props.inputWidth),
height: addUnit(props.buttonSize)
}));
const buttonStyle = vue.computed(() => getSizeStyle(props.buttonSize));
const check = () => {
const value = format(current2.value);
if (!isEqual(value, current2.value)) {
current2.value = value;
}
};
const setValue = (value) => {
if (props.beforeChange) {
callInterceptor(props.beforeChange, {
args: [value],
done() {
current2.value = value;
}
});
} else {
current2.value = value;
}
};
const onChange = () => {
if (actionType === "plus" && plusDisabled.value || actionType === "minus" && minusDisabled.value) {
emit("overlimit", actionType);
return;
}
const diff = actionType === "minus" ? -props.step : +props.step;
const value = format(addNumber(+current2.value, diff));
setValue(value);
emit(actionType);
};
const onInput = (event) => {
const input = event.target;
const {
value
} = input;
const {
decimalLength
} = props;
let formatted = formatNumber(String(value), !props.integer);
if (isDef(decimalLength) && formatted.includes(".")) {
const pair = formatted.split(".");
formatted = `${pair[0]}.${pair[1].slice(0, +decimalLength)}`;
}
if (props.beforeChange) {
input.value = String(current2.value);
} else if (!isEqual(value, formatted)) {
input.value = formatted;
}
const isNumeric2 = formatted === String(+formatted);
setValue(isNumeric2 ? +formatted : formatted);
};
const onFocus = (event) => {
var _a;
if (props.disableInput) {
(_a = inputRef.value) == null ? void 0 : _a.blur();
} else {
emit("focus", event);
}
};
const onBlur = (event) => {
const input = event.target;
const value = format(input.value, props.autoFixed);
input.value = String(value);
current2.value = value;
vue.nextTick(() => {
emit("blur", event);
resetScroll();
});
};
let isLongPress;
let longPressTimer;
const longPressStep = () => {
longPressTimer = setTimeout(() => {
onChange();
longPressStep();
}, LONG_PRESS_INTERVAL);
};
const onTouchStart = () => {
if (props.longPress) {
isLongPress = false;
clearTimeout(longPressTimer);
longPressTimer = setTimeout(() => {
isLongPress = true;
onChange();
longPressStep();
}, LONG_PRESS_START_TIME);
}
};
const onTouchEnd = (event) => {
if (props.longPress) {
clearTimeout(longPressTimer);
if (isLongPress) {
preventDefault(event);
}
}
};
const onMousedown = (event) => {
if (props.disableInput) {
preventDefault(event);
}
};
const createListeners = (type) => ({
onClick: (event) => {
preventDefault(event);
actionType = type;
onChange();
},
onTouchstartPassive: () => {
actionType = type;
onTouchStart();
},
onTouchend: onTouchEnd,
onTouchcancel: onTouchEnd
});
vue.watch(() => [props.max, props.min, props.integer, props.decimalLength], check);
vue.watch(() => props.modelValue, (value) => {
if (!isEqual(value, current2.value)) {
current2.value = format(value);
}
});
vue.watch(current2, (value) => {
emit("update:modelValue", value);
emit("change", value, {
name: props.name
});
});
useCustomFieldValue(() => props.modelValue);
return () => vue.createVNode("div", {
"role": "group",
"class": bem([props.theme])
}, [vue.withDirectives(vue.createVNode("button", vue.mergeProps({
"type": "button",
"style": buttonStyle.value,
"class": [bem("minus", {
disabled: minusDisabled.value
}), {
[HAPTICS_FEEDBACK]: !minusDisabled.value
}],
"aria-disabled": minusDisabled.value || void 0
}, createListeners("minus")), null), [[vue.vShow, props.showMinus]]), vue.withDirectives(vue.createVNode("input", {
"ref": inputRef,
"type": props.integer ? "tel" : "text",
"role": "spinbutton",
"class": bem("input"),
"value": current2.value,
"style": inputStyle.value,
"disabled": props.disabled,
"readonly": props.disableInput,
"inputmode": props.integer ? "numeric" : "decimal",
"placeholder": props.placeholder,
"aria-valuemax": props.max,
"aria-valuemin": props.min,
"aria-valuenow": current2.value,
"onBlur": onBlur,
"onInput": onInput,
"onFocus": onFocus,
"onMousedown": onMousedown
}, null), [[vue.vShow, props.showInput]]), vue.withDirectives(vue.createVNode("button", vue.mergeProps({
"type": "button",
"style": buttonStyle.value,
"class": [bem("plus", {
disabled: plusDisabled.value
}), {
[HAPTICS_FEEDBACK]: !plusDisabled.value
}],
"aria-disabled": plusDisabled.value || void 0
}, createListeners("plus")), null), [[vue.vShow, props.showPlus]])]);
}
});
const Stepper = withInstall(stdin_default);
function tryOnScopeDispose(fn) {
if (vue.getCurrentScope()) {
vue.onScopeDispose(fn);
return true;
}
return false;
}
function toValue(r) {
return typeof r === "function" ? r() : vue.unref(r);
}
const isClient = typeof window !== "undefined" && typeof document !== "undefined";
typeof WorkerGlobalScope !== "undefined" && globalThis instanceof WorkerGlobalScope;
const toString = Object.prototype.toString;
const isObject = (val) => toString.call(val) === "[object Object]";
const noop = () => {
};
function createFilterWrapper(filter, fn) {
function wrapper(...args) {
return new Promise((resolve, reject) => {
Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })).then(resolve).catch(reject);
});
}
return wrapper;
}
const bypassFilter = (invoke2) => {
return invoke2();
};
function pausableFilter(extendFilter = bypassFilter) {
const isActive = vue.ref(true);
function pause() {
isActive.value = false;
}
function resume() {
isActive.value = true;
}
const eventFilter = (...args) => {
if (isActive.value)
extendFilter(...args);
};
return { isActive: vue.readonly(isActive), pause, resume, eventFilter };
}
function getLifeCycleTarget(target) {
return target || vue.getCurrentInstance();
}
function watchWithFilter(source, cb, options = {}) {
const {
eventFilter = bypassFilter,
...watchOptions
} = options;
return vue.watch(
source,
createFilterWrapper(
eventFilter,
cb
),
watchOptions
);
}
function watchPausable(source, cb, options = {}) {
const {
eventFilter: filter,
...watchOptions
} = options;
const { eventFilter, pause, resume, isActive } = pausableFilter(filter);
const stop = watchWithFilter(
source,
cb,
{
...watchOptions,
eventFilter
}
);
return { stop, pause, resume, isActive };
}
function tryOnMounted(fn, sync = true, target) {
const instance = getLifeCycleTarget();
if (instance)
vue.onMounted(fn, target);
else if (sync)
fn();
else
vue.nextTick(fn);
}
function unrefElement(elRef) {
var _a;
const plain = toValue(elRef);
return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;
}
const defaultWindow = isClient ? window : void 0;
function useEventListener(...args) {
let target;
let events2;
let listeners;
let options;
if (typeof args[0] === "string" || Array.isArray(args[0])) {
[events2, listeners, options] = args;
target = defaultWindow;
} else {
[target, events2, listeners, options] = args;
}
if (!target)
return noop;
if (!Array.isArray(events2))
events2 = [events2];
if (!Array.isArray(listeners))
listeners = [listeners];
const cleanups = [];
const cleanup = () => {
cleanups.forEach((fn) => fn());
cleanups.length = 0;
};
const register = (el, event, listener, options2) => {
el.addEventListener(event, listener, options2);
return () => el.removeEventListener(event, listener, options2);
};
const stopWatch = vue.watch(
() => [unrefElement(target), toValue(options)],
([el, options2]) => {
cleanup();
if (!el)
return;
const optionsClone = isObject(options2) ? { ...options2 } : options2;
cleanups.push(
...events2.flatMap((event) => {
return listeners.map((listener) => register(el, event, listener, optionsClone));
})
);
},
{ immediate: true, flush: "post" }
);
const stop = () => {
stopWatch();
cleanup();
};
tryOnScopeDispose(stop);
return stop;
}
const _global = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
const globalKey = "__vueuse_ssr_handlers__";
const handlers = /* @__PURE__ */ getHandlers();
function getHandlers() {
if (!(globalKey in _global))
_global[globalKey] = _global[globalKey] || {};
return _global[globalKey];
}
function getSSRHandler(key, fallback) {
return handlers[key] || fallback;
}
function guessSerializerType(rawInit) {
return rawInit == null ? "any" : rawInit instanceof Set ? "set" : rawInit instanceof Map ? "map" : rawInit instanceof Date ? "date" : typeof rawInit === "boolean" ? "boolean" : typeof rawInit === "string" ? "string" : typeof rawInit === "object" ? "object" : !Number.isNaN(rawInit) ? "number" : "any";
}
const StorageSerializers = {
boolean: {
read: (v) => v === "true",
write: (v) => String(v)
},
object: {
read: (v) => JSON.parse(v),
write: (v) => JSON.stringify(v)
},
number: {
read: (v) => Number.parseFloat(v),
write: (v) => String(v)
},
any: {
read: (v) => v,
write: (v) => String(v)
},
string: {
read: (v) => v,
write: (v) => String(v)
},
map: {
read: (v) => new Map(JSON.parse(v)),
write: (v) => JSON.stringify(Array.from(v.entries()))
},
set: {
read: (v) => new Set(JSON.parse(v)),
write: (v) => JSON.stringify(Array.from(v))
},
date: {
read: (v) => new Date(v),
write: (v) => v.toISOString()
}
};
const customStorageEventName = "vueuse-storage";
function useStorage(key, defaults2, storage, options = {}) {
var _a;
const {
flush = "pre",
deep = true,
listenToStorageChanges = true,
writeDefaults = true,
mergeDefaults = false,
shallow,
window: window2 = defaultWindow,
eventFilter,
onError = (e) => {
console.error(e);
},
initOnMounted
} = options;
const data = (shallow ? vue.shallowRef : vue.ref)(typeof defaults2 === "function" ? defaults2() : defaults2);
if (!storage) {
try {
storage = getSSRHandler("getDefaultStorage", () => {
var _a2;
return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;
})();
} catch (e) {
onError(e);
}
}
if (!storage)
return data;
const rawInit = toValue(defaults2);
const type = guessSerializerType(rawInit);
const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];
const { pause: pauseWatch, resume: resumeWatch } = watchPausable(
data,
() => write(data.value),
{ flush, deep, eventFilter }
);
if (window2 && listenToStorageChanges) {
tryOnMounted(() => {
useEventListener(window2, "storage", update);
useEventListener(window2, customStorageEventName, updateFromCustomEvent);
if (initOnMounted)
update();
});
}
if (!initOnMounted)
update();
return data;
function write(v) {
try {
if (v == null) {
storage.removeItem(key);
} else {
const serialized = serializer.write(v);
const oldValue = storage.getItem(key);
if (oldValue !== serialized) {
storage.setItem(key, serialized);
if (window2) {
window2.dispatchEvent(new CustomEvent(customStorageEventName, {
detail: {
key,
oldValue,
newValue: serialized,
storageArea: storage
}
}));
}
}
}
} catch (e) {
onError(e);
}
}
function read(event) {
const rawValue = event ? event.newValue : storage.getItem(key);
if (rawValue == null) {
if (writeDefaults && rawInit != null)
storage.setItem(key, serializer.write(rawInit));
return rawInit;
} else if (!event && mergeDefaults) {
const value = serializer.read(rawValue);
if (typeof mergeDefaults === "function")
return mergeDefaults(value, rawInit);
else if (type === "object" && !Array.isArray(value))
return { ...rawInit, ...value };
return value;
} else if (typeof rawValue !== "string") {
return rawValue;
} else {
return serializer.read(rawValue);
}
}
function updateFromCustomEvent(event) {
update(event.detail);
}
function update(event) {
if (event && event.storageArea !== storage)
return;
if (event && event.key == null) {
data.value = rawInit;
return;
}
if (event && event.key !== key)
return;
pauseWatch();
try {
if ((event == null ? void 0 : event.newValue) !== serializer.write(data.value))
data.value = read(event);
} catch (e) {
onError(e);
} finally {
if (event)
vue.nextTick(resumeWatch);
else
resumeWatch();
}
}
}
const _export_sfc = (sfc, props) => {
const target = sfc.__vccOpts || sfc;
for (const [key, val] of props) {
target[key] = val;
}
return target;
};
const _withScopeId = (n) => (vue.pushScopeId("data-v-b5ca6ba1"), n = n(), vue.popScopeId(), n);
const _hoisted_1 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("span", null, "助手", -1));
const _hoisted_2 = { id: "app" };
const _hoisted_3 = { class: "tab-content" };
const _hoisted_4 = { class: "tab-content" };
const _hoisted_5 = { class: "tab-content" };
const _hoisted_6 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("span", { style: { "color": "var(--van-cell-text-color)", "font-size": "var(--van-cell-font-size)" } }, " 分钟", -1));
const _hoisted_7 = { class: "tab-content" };
const _hoisted_8 = { class: "tab-content" };
const _sfc_main = {
__name: "App",
setup(__props) {
const config = useStorage("config", {
tabActive: 0,
consoleShow: false,
keepActive: true,
reloadPageHourly: true,
welcomeMessage: {
enable: true,
message: "点歌状态 ➡️ {musicswitchstatus}\n点歌命令 ➡️ {command}\n正在播放 ➡️ {nowplaying}\n进入用户 ➡️ {username}\n当前日期 ➡️ {date}\n当前时间 ➡️ {time}\n房间名称 ➡️ {roomname}\n在线人数 ➡️ {onlinenum}\nBot 名字 ➡️ {me}"
},
sendRegularly: {
enable: false,
interval: 5,
message: "点歌状态 ➡️ {musicswitchstatus}\n点歌命令 ➡️ {command}\n正在播放 ➡️ {nowplaying}\n进入用户 ➡️ {username}\n当前日期 ➡️ {date}\n当前时间 ➡️ {time}\n房间名称 ➡️ {roomname}\n在线人数 ➡️ {onlinenum}\nBot 名字 ➡️ {me}"
},
selfServiceSongRequest: {
enable: false,
promptsNotEnabled: true,
promptMessage: "暂未开启自助点歌功能",
showPopup: false,
history: [],
command: "点歌|播放"
},
aiChat: {
enable: false,
atDialogue: true,
modelName: "gpt-3.5-turbo-16k",
chatHistory: [],
enableLoading: false,
token: ""
}
});
const toggleConsolePopup = () => config.value.consoleShow = !config.value.consoleShow;
const openNewWindow = (url) => {
window.open(url, "_blank");
};
const generateDate = () => {
const date = /* @__PURE__ */ new Date();
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
return `${year}-${month}-${day}`;
};
const generateTime = () => {
const date = /* @__PURE__ */ new Date();
const hours = String(date.getHours()).padStart(2, "0");
const minutes = String(date.getMinutes()).padStart(2, "0");
const seconds = String(date.getSeconds()).padStart(2, "0");
return `${hours}:${minutes}:${seconds}`;
};
const replaceVariables = (message, user) => {
var _a, _b, _c;
return message.replace("{date}", generateDate()).replace("{time}", generateTime()).replace("{me}", profile.name).replace("{roomname}", ((_a = window.room) == null ? void 0 : _a.name) || profile.name + "的房间").replace("{username}", user ? user.name : "N/A").replace("{onlinenum}", user_list.children.length !== 0 ? user_list.children.length : "N/A").replace("{nowplaying}", ((_c = (_b = window.Player) == null ? void 0 : _b.nowPlaying) == null ? void 0 : _c.name) ?? "N/A").replace("{musicswitchstatus}", config.value.selfServiceSongRequest.enable ? "启用" : "禁用").replace("{command}", config.value.selfServiceSongRequest.command.split("|").filter(Boolean).map((item, index) => `${item}歌曲名`).join("、"));
};
const keepAliveHandler = () => {
const uid = profile.id;
const keepAliveInterval = 5;
let { lastSendMessageTime, dev } = DRRR.globals;
setInterval(function() {
if (config.value.keepActive) {
const currentTime = (/* @__PURE__ */ new Date()).getTime();
if (currentTime - lastSendMessageTime > keepAliveInterval * 60 * 1e3) {
console.log("上次发送消息时间:", lastSendMessageTime);
console.log("当前时间:", currentTime);
DRRR.utils.sendMessage({ message: generateTime(), to: uid });
lastSendMessageTime = currentTime;
} else {
dev && console.log(`距离上一次发送空消息时间不足${keepAliveInterval}分钟,忽略本次发送`);
}
} else {
dev && console.log("房间保活功能未开启");
}
}, 60 * 1100);
};
const reloadPageHourly = () => {
setInterval(function() {
if (config.value.reloadPageHourly) {
location.reload();
}
}, 60 * 60 * 1e3);
};
const welcomeMessageHandler = () => {
DRRR.events.addEventListener("join", (from) => {
console.log(from.user.name);
if (config.value.welcomeMessage.enable && config.value.welcomeMessage.message) {
console.log("发送欢迎消息");
DRRR.utils.sendMessage({ message: replaceVariables(config.value.welcomeMessage.message, from.user) });
}
});
};
const sendRegularlyHandler = () => {
let timerId;
function sendRegularly() {
if (config.value.sendRegularly.enable) {
console.log("执行定时发送的任务");
DRRR.utils.sendMessage({ message: replaceVariables(config.value.sendRegularly.message) });
}
}
function updateTimer() {
clearInterval(timerId);
timerId = setInterval(sendRegularly, (config.value.sendRegularly.interval ?? 5) * 60 * 1e3);
}
updateTimer();
};
const selfServiceSongRequestHandler = () => {
const commands = config.value.selfServiceSongRequest.command.split("|").filter(Boolean);
console.log("点歌命令:", commands);
const getSongInfo = async (keyword) => {
const songRequestApi = "//43.142.80.6/music/api.php";
const searchResponse = await fetch(`${songRequestApi}?type=search&keyword=${keyword}`);
const searchData = await searchResponse.json();
if (searchData.code !== 200 || searchData.data.length === 0) {
DRRR.utils.sendMessage({ message: `没有找到与“${keyword}”相关的歌曲` });
throw new Error("没有找到歌曲");
}
const songName = `${searchData.data[0].songname} - ${searchData.data[0].singer}`;
const urlResponse = await fetch(`${songRequestApi}?type=url&songid=${btoa(searchData.data[0].songid)}`);
const urlData = await urlResponse.json();
console.log(urlData);
if (urlData.code !== 200) {
DRRR.utils.sendMessage({ message: `获取歌曲地址失败` });
throw new Error("获取歌曲地址失败");
}
return { music: "music", url: urlData.data, name: songName };
};
commands.forEach((command) => {
console.log("监听点歌命令:", command);
DRRR.commands.push({ command });
DRRR.events.addEventListener(`message(${command})`, async (data) => {
if (config.value.selfServiceSongRequest.enable) {
try {
const songInfo = await getSongInfo(data.message);
console.log(songInfo);
await DRRR.utils.sendMessage(songInfo);
if (config.value.selfServiceSongRequest.history.length >= 50) {
config.value.selfServiceSongRequest.history.pop();
}
config.value.selfServiceSongRequest.history.unshift({
username: data.from.name,
musicName: songInfo.name,
time: generateTime()
});
} catch (error) {
console.error(error);
}
} else {
console.log(data);
if (config.value.selfServiceSongRequest.promptsNotEnabled && config.value.selfServiceSongRequest.promptMessage) {
await DRRR.utils.sendMessage({ message: replaceVariables(config.value.selfServiceSongRequest.promptMessage, data.from) });
}
}
});
});
};
const commandsChange = () => {
config.value.selfServiceSongRequest.command;
if (confirm("检测到的点歌已修改,需要刷新才能生效,是否刷新?")) {
location.reload();
}
};
const aiChatHandler = async (message) => {
let replying = false;
let isSendingMessage = false;
let lastSendMessageTime = 0;
const splitAndSendMessages = async (messageText, maxSendCount = 3) => {
const sendMessageInterval = 1e4;
isSendingMessage = true;
const sendMessage = async (message2, callback) => {
try {
const currentTime = Date.now();
if (currentTime - lastSendMessageTime < sendMessageInterval) {
await new Promise((resolve) => setTimeout(resolve, sendMessageInterval));
}
lastSendMessageTime = Date.now();
const response = await fetch("?ajax=1", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
// 使用表单格式发送数据
"X-Requested-With": "XMLHttpRequest"
// 设置 X-Requested-With 请求头
},
body: `message=${message2}`
// 将消息作为字符串发送
});
if (response.ok) {
const responseData = await response.text();
if (responseData === "") {
console.log("AI发送消息成功");
DRRR.utils.insertLocalMessage(message2);
callback == null ? void 0 : callback();
} else {
console.error("AI发送请求成功,但响应不正确");
}
} else {
throw new Error("AI发送消息失败: " + response.statusText);
}
} catch (error) {
console.error("AI发送消息出错:", error);
}
};
const chunkSize = 134;
const totalPages = Math.ceil(messageText.length / chunkSize);
if (messageText.length > chunkSize) {
for (let page = 1; page <= totalPages; page++) {
const start = (page - 1) * chunkSize;
const end = page * chunkSize;
const messageChunk = messageText.slice(start, end);
const pageNumberInfo = `
【${page}/${totalPages > maxSendCount ? maxSendCount : totalPages}】`;
const messageWithPageInfo = `${messageChunk}${pageNumberInfo}`;
if (page <= maxSendCount) {
await sendMessage(messageWithPageInfo, () => {
if (page === totalPages) {
console.log("所有消息发送完成");
isSendingMessage = false;
}
});
} else {
console.log("达到最大发送次数,忽略后面消息");
setTimeout(() => {
DRRR_HELPER_API.sendMessage({ message: "本次回复过长,后面信息已被省略。" });
isSendingMessage = false;
}, sendMessageInterval);
break;
}
}
} else {
await sendMessage(messageText, () => {
console.log("消息发送完成");
isSendingMessage = false;
});
}
};
const getAiChatReply = async (message2) => {
if (replying || isSendingMessage)
return;
replying = true;
const newMessage = {
"role": "user",
"content": message2
};
try {
const response = await Promise.race([
fetch("https://api.b3n.fun/v1/chat/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": config.value.aiChat.token
},
body: JSON.stringify({
"model": config.value.aiChat.modelName || "gpt-3.5-turbo-16k",
"stream": false,
"temperature": 0.6,
"top_p": 1,
"max_tokens": 2500,
"messages": [...config.value.aiChat.chatHistory, newMessage]
})
}),
new Promise((resolve, reject) => {
setTimeout(async () => {
reject(new Error("请求超时"));
}, 1e4);
})
]);
const data = await response.json();
if (data.error) {
throw new Error(data.error.message);
}
config.value.aiChat.chatHistory.push(newMessage);
config.value.aiChat.chatHistory.push(data.choices[0].message);
if (config.value.aiChat.chatHistory.length > 6) {
config.value.aiChat.chatHistory.splice(0, config.value.aiChat.chatHistory.length - 6);
}
await splitAndSendMessages(data.choices[0].message.content, 5);
} catch (error) {
console.error(error.message);
} finally {
replying = false;
}
};
DRRR.events.addEventListener("message(@)", async (data) => {
if (config.value.aiChat.enable && config.value.aiChat.atDialogue) {
console.log("回复艾特ai消息");
await getAiChatReply(data.message);
}
});
DRRR.events.addEventListener("message(*)", async (data) => {
if (config.value.aiChat.enable && !config.value.aiChat.atDialogue) {
console.log("回复艾特普通消息");
await getAiChatReply(data.message);
}
});
};
const toggleAiChat = async (newValue) => {
config.value.aiChat.enableLoading = true;
try {
if (!newValue) {
config.value.aiChat.enable = newValue;
return;
}
if (!config.value.aiChat.token) {
alert("请先填写接口令牌,没有就先获取");
throw new Error("接口令牌不能为空");
}
const response = await fetch("https://api.b3n.fun/v1/models", {
headers: {
"Authorization": config.value.aiChat.token,
"Content-Type": "application/json"
}
});
const data = await response.json();
if (data.error) {
throw new Error(data.error.message);
}
config.value.aiChat.enable = newValue;
} catch (error) {
console.error(error.message);
} finally {
config.value.aiChat.enableLoading = false;
}
};
vue.onMounted(() => {
keepAliveHandler();
reloadPageHourly();
welcomeMessageHandler();
sendRegularlyHandler();
selfServiceSongRequestHandler();
aiChatHandler();
config.value.aiChat.chatHistory.length = 0;
});
return (_ctx, _cache) => {
const _component_van_image = Image;
const _component_van_icon = Icon;
const _component_van_nav_bar = NavBar;
const _component_van_switch = Switch;
const _component_van_cell = Cell;
const _component_van_cell_group = CellGroup;
const _component_van_tab = Tab;
const _component_van_field = Field;
const _component_van_stepper = Stepper;
const _component_van_radio = Radio;
const _component_van_radio_group = RadioGroup;
const _component_van_tabs = Tabs;
const _component_van_popup = Popup;
return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [
vue.withDirectives(vue.createElementVNode("div", {
class: "console-switch",
onClick: toggleConsolePopup
}, [
vue.createVNode(_component_van_image, {
src: "https://drrr.com/favicon.svg",
width: "20"
}),
_hoisted_1
], 512), [
[vue.vShow, !vue.unref(config).consoleShow]
]),
vue.createVNode(_component_van_popup, {
show: vue.unref(config).consoleShow,
"onUpdate:show": _cache[17] || (_cache[17] = ($event) => vue.unref(config).consoleShow = $event),
style: { "width": "100vw" }
}, {
default: vue.withCtx(() => [
vue.createElementVNode("div", _hoisted_2, [
vue.createVNode(_component_van_nav_bar, {
title: "DOLLARS助手 控制台",
onClickRight: toggleConsolePopup
}, {
right: vue.withCtx(() => [
vue.createVNode(_component_van_icon, {
name: "cross",
size: "18"
})
]),
_: 1
}),
vue.createVNode(_component_van_tabs, {
active: vue.unref(config).tabActive,
"onUpdate:active": _cache[16] || (_cache[16] = ($event) => vue.unref(config).tabActive = $event)
}, {
default: vue.withCtx(() => [
vue.createVNode(_component_van_tab, { title: "通用设置" }, {
default: vue.withCtx(() => [
vue.createElementVNode("div", _hoisted_3, [
vue.createVNode(_component_van_cell_group, {
class: "cell-group",
inset: ""
}, {
default: vue.withCtx(() => [
vue.createVNode(_component_van_cell, {
center: "",
title: "房间保活"
}, {
"right-icon": vue.withCtx(() => [
vue.createVNode(_component_van_switch, {
modelValue: vue.unref(config).keepActive,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => vue.unref(config).keepActive = $event)
}, null, 8, ["modelValue"])
]),
_: 1
}),
vue.createVNode(_component_van_cell, {
title: "功能说明",
value: "定时发送私信给自己,保证房间不被释放"
})
]),
_: 1
}),
vue.createVNode(_component_van_cell_group, {
class: "cell-group",
inset: ""
}, {
default: vue.withCtx(() => [
vue.createVNode(_component_van_cell, {
center: "",
title: "定时重载"
}, {
"right-icon": vue.withCtx(() => [
vue.createVNode(_component_van_switch, {
modelValue: vue.unref(config).reloadPageHourly,
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => vue.unref(config).reloadPageHourly = $event)
}, null, 8, ["modelValue"])
]),
_: 1
}),
vue.createVNode(_component_van_cell, {
title: "功能说明",
value: "每小时重新加载页面,释放内存,脚本运行更稳定"
})
]),
_: 1
})
])
]),
_: 1
}),
vue.createVNode(_component_van_tab, { title: "欢迎消息" }, {
default: vue.withCtx(() => [
vue.createElementVNode("div", _hoisted_4, [
vue.createVNode(_component_van_cell_group, {
class: "cell-group",
inset: ""
}, {
default: vue.withCtx(() => [
vue.createVNode(_component_van_cell, {
center: "",
title: "功能开关"
}, {
"right-icon": vue.withCtx(() => [
vue.createVNode(_component_van_switch, {
modelValue: vue.unref(config).welcomeMessage.enable,
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => vue.unref(config).welcomeMessage.enable = $event)
}, null, 8, ["modelValue"])
]),
_: 1
}),
vue.createVNode(_component_van_field, {
modelValue: vue.unref(config).welcomeMessage.message,
"onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => vue.unref(config).welcomeMessage.message = $event),
rows: "9",
label: "欢迎内容",
type: "textarea",
placeholder: "设置欢迎消息内容"
}, null, 8, ["modelValue"])
]),
_: 1
})
])
]),
_: 1
}),
vue.createVNode(_component_van_tab, { title: "定时发送" }, {
default: vue.withCtx(() => [
vue.createElementVNode("div", _hoisted_5, [
vue.createVNode(_component_van_cell_group, {
class: "cell-group",
inset: ""
}, {
default: vue.withCtx(() => [
vue.createVNode(_component_van_cell, {
center: "",
title: "功能开关"
}, {
"right-icon": vue.withCtx(() => [
vue.createVNode(_component_van_switch, {
modelValue: vue.unref(config).sendRegularly.enable,
"onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => vue.unref(config).sendRegularly.enable = $event)
}, null, 8, ["modelValue"])
]),
_: 1
}),
vue.createVNode(_component_van_cell, { title: "间隔时间" }, {
default: vue.withCtx(() => [
vue.createVNode(_component_van_stepper, {
modelValue: vue.unref(config).sendRegularly.interval,
"onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => vue.unref(config).sendRegularly.interval = $event),
"button-size": "22",
min: "1",
max: "20",
"disable-input": ""
}, null, 8, ["modelValue"]),
_hoisted_6
]),
_: 1
}),
vue.createVNode(_component_van_field, {
modelValue: vue.unref(config).sendRegularly.message,
"onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => vue.unref(config).sendRegularly.message = $event),
rows: "7",
label: "发送内容",
type: "textarea",
placeholder: "设置定时发送内容"
}, null, 8, ["modelValue"])
]),
_: 1
})
])
]),
_: 1
}),
vue.createVNode(_component_van_tab, { title: "自助点歌" }, {
default: vue.withCtx(() => [
vue.createElementVNode("div", _hoisted_7, [
vue.createVNode(_component_van_cell_group, {
class: "cell-group",
inset: ""
}, {
default: vue.withCtx(() => [
vue.createVNode(_component_van_cell, {
center: "",
title: "功能开关"
}, {
"right-icon": vue.withCtx(() => [
vue.createVNode(_component_van_switch, {
modelValue: vue.unref(config).selfServiceSongRequest.enable,
"onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => vue.unref(config).selfServiceSongRequest.enable = $event)
}, null, 8, ["modelValue"])
]),
_: 1
}),
vue.createVNode(_component_van_field, {
modelValue: vue.unref(config).selfServiceSongRequest.command,
"onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => vue.unref(config).selfServiceSongRequest.command = $event),
label: "点歌命令",
placeholder: "点歌",
onChange: commandsChange
}, null, 8, ["modelValue"]),
vue.createVNode(_component_van_cell, {
title: "点歌记录",
"is-link": ""
}),
vue.createVNode(_component_van_cell, {
center: "",
title: "未开提示"
}, {
"right-icon": vue.withCtx(() => [
vue.createVNode(_component_van_switch, {
modelValue: vue.unref(config).selfServiceSongRequest.promptsNotEnabled,
"onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => vue.unref(config).selfServiceSongRequest.promptsNotEnabled = $event)
}, null, 8, ["modelValue"])
]),
_: 1
}),
vue.createVNode(_component_van_field, {
modelValue: vue.unref(config).selfServiceSongRequest.promptMessage,
"onUpdate:modelValue": _cache[10] || (_cache[10] = ($event) => vue.unref(config).selfServiceSongRequest.promptMessage = $event),
rows: "3",
label: "提示内容",
type: "textarea",
placeholder: "设置未打开点歌功能提示内容"
}, null, 8, ["modelValue"])
]),
_: 1
})
])
]),
_: 1
}),
vue.createVNode(_component_van_tab, { title: "AI 聊天" }, {
default: vue.withCtx(() => [
vue.createElementVNode("div", _hoisted_8, [
vue.createVNode(_component_van_cell_group, {
class: "cell-group",
inset: ""
}, {
default: vue.withCtx(() => [
vue.createVNode(_component_van_cell, {
center: "",
title: "功能开关"
}, {
"right-icon": vue.withCtx(() => [
vue.createVNode(_component_van_switch, {
"model-value": vue.unref(config).aiChat.enable,
"onUpdate:modelValue": toggleAiChat,
loading: vue.unref(config).aiChat.enableLoading
}, null, 8, ["model-value", "loading"])
]),
_: 1
}),
vue.createVNode(_component_van_cell, {
center: "",
title: "艾特对话"
}, {
"right-icon": vue.withCtx(() => [
vue.createVNode(_component_van_switch, {
modelValue: vue.unref(config).aiChat.atDialogue,
"onUpdate:modelValue": _cache[11] || (_cache[11] = ($event) => vue.unref(config).aiChat.atDialogue = $event)
}, null, 8, ["modelValue"])
]),
_: 1
}),
vue.createVNode(_component_van_field, {
modelValue: vue.unref(config).aiChat.token,
"onUpdate:modelValue": _cache[12] || (_cache[12] = ($event) => vue.unref(config).aiChat.token = $event),
label: "接口令牌",
placeholder: "sk-xxx",
clearable: ""
}, null, 8, ["modelValue"]),
vue.createVNode(_component_van_cell, {
center: "",
title: "获取令牌",
onClick: _cache[13] || (_cache[13] = ($event) => openNewWindow("https://api.b3n.fun/register")),
"is-link": ""
}),
vue.createVNode(_component_van_field, {
name: "radio",
label: "选择模型"
}, {
input: vue.withCtx(() => [
vue.createVNode(_component_van_radio_group, {
modelValue: vue.unref(config).aiChat.modelName,
"onUpdate:modelValue": _cache[14] || (_cache[14] = ($event) => vue.unref(config).aiChat.modelName = $event),
direction: "horizontal"
}, {
default: vue.withCtx(() => [
vue.createVNode(_component_van_radio, { name: "gpt-3.5-turbo-16k" }, {
default: vue.withCtx(() => [
vue.createTextVNode("gpt-3.5-turbo-16k")
]),
_: 1
})
]),
_: 1
}, 8, ["modelValue"]),
vue.createVNode(_component_van_radio_group, {
modelValue: vue.unref(config).aiChat.modelName,
"onUpdate:modelValue": _cache[15] || (_cache[15] = ($event) => vue.unref(config).aiChat.modelName = $event),
direction: "horizontal"
}, {
default: vue.withCtx(() => [
vue.createVNode(_component_van_radio, { name: "gemini-pro" }, {
default: vue.withCtx(() => [
vue.createTextVNode("gemini-pro")
]),
_: 1
})
]),
_: 1
}, 8, ["modelValue"])
]),
_: 1
})
]),
_: 1
})
])
]),
_: 1
})
]),
_: 1
}, 8, ["active"])
])
]),
_: 1
}, 8, ["show"])
], 64);
};
}
};
const App = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-b5ca6ba1"]]);
(function() {
if (typeof window === "undefined") {
return;
}
var eventTarget;
var supportTouch = "ontouchstart" in window;
if (!document.createTouch) {
document.createTouch = function(view, target, identifier, pageX, pageY, screenX, screenY) {
return new Touch(
target,
identifier,
{
pageX,
pageY,
screenX,
screenY,
clientX: pageX - window.pageXOffset,
clientY: pageY - window.pageYOffset
},
0,
0
);
};
}
if (!document.createTouchList) {
document.createTouchList = function() {
var touchList = TouchList();
for (var i = 0; i < arguments.length; i++) {
touchList[i] = arguments[i];
}
touchList.length = arguments.length;
return touchList;
};
}
if (!Element.prototype.matches) {
Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
}
if (!Element.prototype.closest) {
Element.prototype.closest = function(s) {
var el = this;
do {
if (el.matches(s))
return el;
el = el.parentElement || el.parentNode;
} while (el !== null && el.nodeType === 1);
return null;
};
}
var Touch = function Touch2(target, identifier, pos, deltaX, deltaY) {
deltaX = deltaX || 0;
deltaY = deltaY || 0;
this.identifier = identifier;
this.target = target;
this.clientX = pos.clientX + deltaX;
this.clientY = pos.clientY + deltaY;
this.screenX = pos.screenX + deltaX;
this.screenY = pos.screenY + deltaY;
this.pageX = pos.pageX + deltaX;
this.pageY = pos.pageY + deltaY;
};
function TouchList() {
var touchList = [];
touchList["item"] = function(index) {
return this[index] || null;
};
touchList["identifiedTouch"] = function(id) {
return this[id + 1] || null;
};
return touchList;
}
var initiated = false;
function onMouse(touchType) {
return function(ev) {
if (ev.type === "mousedown") {
initiated = true;
}
if (ev.type === "mouseup") {
initiated = false;
}
if (ev.type === "mousemove" && !initiated) {
return;
}
if (ev.type === "mousedown" || !eventTarget || eventTarget && !eventTarget.dispatchEvent) {
eventTarget = ev.target;
}
if (eventTarget.closest("[data-no-touch-simulate]") == null) {
triggerTouch(touchType, ev);
}
if (ev.type === "mouseup") {
eventTarget = null;
}
};
}
function triggerTouch(eventName, mouseEv) {
var touchEvent = document.createEvent("Event");
touchEvent.initEvent(eventName, true, true);
touchEvent.altKey = mouseEv.altKey;
touchEvent.ctrlKey = mouseEv.ctrlKey;
touchEvent.metaKey = mouseEv.metaKey;
touchEvent.shiftKey = mouseEv.shiftKey;
touchEvent.touches = getActiveTouches(mouseEv);
touchEvent.targetTouches = getActiveTouches(mouseEv);
touchEvent.changedTouches = createTouchList(mouseEv);
eventTarget.dispatchEvent(touchEvent);
}
function createTouchList(mouseEv) {
var touchList = TouchList();
touchList.push(new Touch(eventTarget, 1, mouseEv, 0, 0));
return touchList;
}
function getActiveTouches(mouseEv) {
if (mouseEv.type === "mouseup") {
return TouchList();
}
return createTouchList(mouseEv);
}
function TouchEmulator() {
window.addEventListener("mousedown", onMouse("touchstart"), true);
window.addEventListener("mousemove", onMouse("touchmove"), true);
window.addEventListener("mouseup", onMouse("touchend"), true);
}
TouchEmulator["multiTouchOffset"] = 75;
if (!supportTouch) {
new TouchEmulator();
}
})();
const unsafeWindow = window || unsafeWindow;
(function(jquery, unsafeWindow2) {
const $ = jquery;
const dev = localStorage.getItem("dev") || false;
let globals = {
isSending: false,
// 是否正在发送消息
lastSendMessageTime: null,
// 最后发送消息的时间
throttleTime: 2e3,
// 发送消息的节流时间
lastSendMessageContent: null,
// 最后发送的消息内容
dev
// 开发模式
};
const events = /* @__PURE__ */ (() => {
const listeners = {};
const addEventListener = (eventName, callback) => {
if (!listeners[eventName]) {
listeners[eventName] = [];
}
listeners[eventName].push(callback);
};
const triggerEvent = (eventName, data) => {
const eventListeners = listeners[eventName];
if (eventListeners) {
eventListeners.forEach((callback) => callback(data));
}
};
return {
addEventListener,
triggerEvent
};
})();
const utils = {
// 发送信息
sendMessage: async (message, callback) => {
const currentTime = Date.now();
if (globals.lastSendMessageTime && currentTime - globals.lastSendMessageTime < 2e3) {
dev && console.error(`触发节流机制(${globals.throttleTime / 1e3}秒),本次消息不发送`);
return;
}
globals.lastSendMessageTime = currentTime;
if (globals.isSending) {
dev && console.log("消息正在发送中,本次消息不发送");
return;
}
if (typeof message !== "object" || message === null) {
if (typeof callback === "function") {
callback(new Error("发送的信息必须为对象"), null);
} else {
dev && console.error("发送的信息必须为对象");
}
return;
}
globals.isSending = true;
try {
const formData = new FormData();
for (const key in message) {
formData.append(key, message[key]);
}
const response = await fetch("?ajax=1", {
method: "POST",
headers: {
"X-Requested-With": "XMLHttpRequest"
},
body: formData
// 发送消息
});
if (!response.ok) {
throw new Error(`发送消息失败: ${response.status}`);
}
const data = await response.text();
if (typeof callback === "function") {
callback(null, data);
} else {
if (data === "") {
dev && console.log("发送消息成功: ", message);
if (message.message && !message.to) {
utils.insertLocalMessage(message.message);
}
} else {
dev && console.error("发送请求成功,但响应不正确");
}
}
} catch (error) {
if (typeof callback === "function") {
callback(error, null);
} else {
dev && console.error("发送消息失败: ", error);
}
} finally {
globals.isSending = false;
}
},
// 插入消息到页面
insertLocalMessage: (message) => {
message = message.toString();
if (message.startsWith("/me"))
return;
const dl = document.createElement("dl");
dl.className = `talk ${profile.icon}`;
const dt = document.createElement("dt");
dt.className = "dropdown user";
const avatarDiv = document.createElement("div");
avatarDiv.className = `avatar avatar-${profile.icon}`;
const nameDiv = document.createElement("div");
nameDiv.className = "name";
nameDiv.setAttribute("data-toggle", "dropdown");
const selectTextSpan = document.createElement("span");
selectTextSpan.className = "select-text";
selectTextSpan.textContent = profile.name;
const ul = document.createElement("ul");
ul.className = "dropdown-menu";
ul.setAttribute("role", "menu");
const dd = document.createElement("dd");
dd.className = "bounce";
const bubbleDiv = document.createElement("div");
bubbleDiv.className = "bubble";
const tailWrapDiv = document.createElement("div");
tailWrapDiv.className = "tail-wrap center";
tailWrapDiv.style.backgroundSize = "65px";
const tailMaskDiv = document.createElement("div");
tailMaskDiv.className = "tail-mask";
const p = document.createElement("p");
p.className = "body select-text";
p.innerHTML = message.replace(/\n/g, "<br>");
tailWrapDiv.appendChild(tailMaskDiv);
bubbleDiv.appendChild(tailWrapDiv);
bubbleDiv.appendChild(p);
dt.appendChild(avatarDiv);
nameDiv.appendChild(selectTextSpan);
dt.appendChild(nameDiv);
dt.appendChild(ul);
dl.appendChild(dt);
dd.appendChild(bubbleDiv);
dl.appendChild(dd);
const talks = document.querySelector("#talks");
setTimeout(function() {
talks.insertAdjacentElement("afterbegin", dl);
}, 1500);
},
// 引入脚本
loadScript: (src, onloadCallback, onErrorCallback) => {
const scriptElement = document.createElement("script");
scriptElement.src = `${src}?v=${Date.now()}`;
scriptElement.onload = () => {
if (typeof onloadCallback === "function") {
onloadCallback();
} else {
dev && console.log("引入脚本成功: " + src);
}
};
scriptElement.onerror = () => {
if (typeof onErrorCallback === "function") {
onErrorCallback();
} else {
dev && console.log("引入脚本失败" + src);
}
};
document.head.appendChild(scriptElement);
},
// 引入样式
loadStyle: (href, onloadCallback, onErrorCallback) => {
const linkElement = document.createElement("link");
linkElement.href = href;
linkElement.rel = "stylesheet";
linkElement.onload = () => {
if (typeof onloadCallback === "function") {
onloadCallback();
} else {
dev && console.error("引入脚样式功: " + href);
}
};
linkElement.onerror = () => {
if (typeof onErrorCallback === "function") {
onErrorCallback();
} else {
dev && console.error("引入脚样式失败: " + href);
}
};
document.head.appendChild(linkElement);
}
};
const commands = [];
unsafeWindow2.DRRR = { globals, events, utils, commands, ...unsafeWindow2.DRRR };
$(document).ajaxSuccess(function(event, xhr, settings) {
if (!settings.url.includes("update"))
return;
const talks = xhr.responseJSON.talks || [];
if (talks.length === 0)
return;
talks.forEach(function(data) {
if (data.is_me)
return;
const { message = "", from = "", user = "", music = "", to = "" } = data;
const eventData = { message, from, user, music, to };
if (data.type === "message") {
const message2 = eventData.message;
const profileName = profile.name ?? "";
const atRegex = new RegExp(`^@${profileName}\\s*`);
const isAt = atRegex.test(message2);
if (isAt) {
const atMessage = message2.replace(atRegex, "").trim();
if (atMessage) {
dev && console.log("艾特消息:" + atMessage);
eventData.message = atMessage;
events.triggerEvent("message(@)", eventData);
} else {
dev && console.error("艾特消息内容为空,不处理空消息");
}
return;
}
const matchedCommand = commands.find(({ command }) => message2.startsWith(command));
if (matchedCommand) {
const commandLength = matchedCommand.command.length;
const commandIndex = message2.indexOf(matchedCommand.command);
const param = message2.substring(commandIndex + commandLength).trim();
if (param) {
dev && console.log("命令消息: " + message2);
dev && console.log("命令: " + matchedCommand.command);
dev && console.log("消息: " + param);
eventData.command = matchedCommand.command;
eventData.message = param;
events.triggerEvent(`message(${matchedCommand.command})`, eventData);
} else {
dev && console.error(`[${matchedCommand.command}]命令消息没有消息内容,不处理空消息`);
}
} else {
dev && console.log("普通消息: " + message2);
events.triggerEvent(`message(*)`, eventData);
}
return;
}
events.triggerEvent(data.type, eventData);
});
});
unsafeWindow2.MusicItem = function() {
function e(n) {
var r = this;
_classCallCheck(this, e), this.music = n, this.name = DRRRClientBehavior.literalMusicTitle(n), this.url = n.playURL, this.schedule = null;
var o = function() {
events.triggerEvent("music(end)", r.music);
r._unschedule_progress_update(100), visualizerEnabled && visualizer.stop(), Player.isPausing = true, $(document).trigger("music-end", r);
}, i = function() {
events.triggerEvent("music(pause)", r.music);
r._unschedule_progress_update(100 * r.percent());
}, a = function() {
events.triggerEvent("music(start)", r.music);
r._schedule_progress_update();
}, s = function() {
events.triggerEvent("music(stop)", r.music);
r._unschedule_progress_update();
};
"apple_music" == n.source ? this.howl = new AppleMusicBackend(n, {
autoplay: false,
onend: o,
onpause: i,
onplay: a,
onstop: s
}) : this.howl = new Howl({
autoplay: false,
src: [this.url],
html5: true,
volume: visualizerEnabled ? 1 : Player.volume,
onload: function() {
visualizerEnabled && visualizer.play(r._sounds[0]._node);
},
onend: o,
onpause: i,
onplay: a,
onstop: s,
onloaderror: function(e2, n2) {
events.triggerEvent("music(error)", n2);
if (r._unschedule_progress_update(), "不支持该音频格式" != n2 && ("不支持所选音频源的编解码器。" != n2 || -1 === r.url.indexOf(visualizerUrlPrefix))) {
switch (n2 = n2 || "Unknown") {
case 1:
n2 = "获取过程被用户中止";
break;
case 2:
n2 = "下载时发生错误";
break;
case 3:
n2 = "解码时发生错误";
break;
case 4:
n2 = "URL不正确或不支持音频";
}
visualizerEnabled && visualizer.stop(), swal(t("Music: "), t("音频无法加载: {1}", r.name) + "\n\n" + t("错误信息: {1}", n2), "warning");
setTimeout(() => swal.close(), 2e3);
}
},
onplayerror: function() {
r.howl.once("unlock", function() {
r.howl.play();
});
}
});
}
return _createClass(e, [{
key: "volume",
value: function(e2) {
this.howl.volume(e2);
}
}, {
key: "_schedule_progress_update",
value: function() {
var e2 = this;
$(document).trigger("music-start", this), $(document).trigger("music-update-percent", 100 * this.percent()), this.schedule = setInterval(function() {
$(document).trigger("music-update-percent", 100 * e2.percent());
}, 950);
}
}, {
key: "_unschedule_progress_update",
value: function() {
var e2 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0;
$(document).trigger("music-stop"), clearInterval(this.schedule), false !== e2 && $(document).trigger("music-update-percent", e2);
}
}, {
key: "now",
value: function() {
return this.howl.seek();
}
}, {
key: "setTime",
value: function(e2) {
var t2 = this, n = /* @__PURE__ */ new Date();
0 == this.duration() ? this.howl.once("play", function() {
var r = (/* @__PURE__ */ new Date() - n) / 1e3;
t2.howl.seek(e2 + r);
}) : e2 <= this.duration() ? this.howl.seek(e2) : this.howl.stop();
}
}, {
key: "duration",
value: function() {
return this.howl.duration();
}
}, {
key: "percent",
value: function() {
return this.now() / this.duration();
}
}, {
key: "play",
value: function() {
$(document).trigger("music-play", this), Player.nowPlaying = this, this instanceof Howl && this.stopOthers(), this.howl.play(), Player.isPausing = false, visualizerEnabled && visualizer.resume();
}
}, {
key: "stopOthers",
value: function() {
var e2 = this;
Player.playList.forEach(function(t2) {
t2 !== e2 && null != t2 && null != t2.howl && t2.stop();
});
}
}, {
key: "pause",
value: function() {
this.howl.pause(), visualizerEnabled && visualizer.pause(), Player.isPausing = true;
}
}, {
key: "stop",
value: function() {
Player.isPausing = true, this.howl.stop();
}
}, {
key: "unload",
value: function() {
clearInterval(this.schedule), this.howl.unload();
}
}, {
key: "previewOnly",
get: function() {
return "apple_music" == this.music.source && this.howl.previewOnly;
}
}, {
key: "time",
get: function() {
return this.now();
}
}, {
key: "music_object",
get: function() {
return this.music;
}
}]), e;
}();
})(jQuery, unsafeWindow);
vue.createApp(App).mount(
(() => {
const app = document.createElement("div");
document.body.append(app);
return app;
})()
);
})(Vue);