zhaojs
2023-07-03 efdf1c916636f4f18a3aa52ebc608c51d07ee25a
no message
已添加34个文件
已修改2个文件
2716 ■■■■■ 文件已修改
uniapp/pages/goods/goodsDetail.vue 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-popup/changelog.md 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-popup/components/uni-popup/i18n/en.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-popup/components/uni-popup/i18n/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-popup/components/uni-popup/keypress.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-popup/components/uni-popup/popup.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-popup/components/uni-popup/uni-popup.vue 473 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-popup/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-popup/readme.md 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/changelog.md 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/index.scss 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/package.json 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/readme.md 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/styles/index.scss 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/styles/setting/_border.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/styles/setting/_color.scss 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/styles/setting/_radius.scss 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/styles/setting/_space.scss 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/styles/setting/_styles.scss 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/styles/setting/_text.scss 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/styles/setting/_variables.scss 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/styles/tools/functions.scss 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/theme.scss 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-scss/variables.scss 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-transition/changelog.md 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-transition/components/uni-transition/createAnimation.js 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-transition/components/uni-transition/uni-transition.vue 286 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-transition/package.json 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/uni_modules/uni-transition/readme.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/utils/getClipboard.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uniapp/pages/goods/goodsDetail.vue
@@ -212,6 +212,8 @@
            </view>
          </view>
        </view>
       <!-- <view class="right-container rowCen borderBox" v-if="!showtar || platform!='iOS'">
          <view class="leftsharebox btnbox colCenCen" @tap="goPath()">
@@ -276,6 +278,12 @@
    <u-popup v-model="inviterShow" mode="center" border-radius="32" v-if="inviterShow" :mask-close-able='true'>
      <inviter-model ref='invitermodel' @rewrite='rewriteCode' @setInvite='setCodebtn'></inviter-model>
    </u-popup>
    <uni-popup ref="popup_pddtip" type="center">
        <view class="pdd_pop_contant">
            <view class="pdd_pop_title">比价订单</view>
            <view class="pdd_pop_text">本次自购涉及比价行为,自购收益为0,建议先收藏该商品,2小时候通过大返官app购买,可正常获取对应收益。</view>
        </view>
    </uni-popup>
  </view>
</template>
@@ -321,6 +329,7 @@
        inviteCodeShow: false,
        inviterShow: false,
        frompage:'',
        isshowpdd:false
      };
    },
    onPageScroll(e) {
@@ -340,6 +349,12 @@
          getApp().bcInit();
      }
    },
     onReady(){
         if(this.isshowpdd)
         {
            this.$refs.popup_pddtip.open();
         }
    },
    onLoad(options) {
      this.appinfo = utils.getCacheSync('appInfo')
      // #ifdef APP-PLUS
@@ -367,12 +382,19 @@
            this.optionsInfo = JSON.parse(options.info);
            this.pageInfo = JSON.parse(options.info);
        }
        this.pageType = this.optionsInfo.sourceType;
        if (!this.optionsInfo.faction) {
          if (this.pageType == 'tb' || this.pageType == 'tm' || this.pageType == 'tmshop') this.faction = 't';
          if (this.pageType == 'jd') this.faction = 'j';
          if (this.pageType == 'pdd') this.faction = 'p';
          if (this.pageType == 'pdd')
          {
              this.faction = 'p';
              if(options.proform&&options.proform=="clipboard")
              {//来自剪贴板
                  this.isshowpdd=true;
              }
          }
          if (this.pageType == 'wph') this.faction = 'w';
           if (this.pageType == 'dy') this.faction = 'd';
        } else {
@@ -848,6 +870,24 @@
  }
</style>
<style lang="scss" scoped>
    .pdd_pop_contant{
        background-color: rgb(255, 255, 255);
            padding: 40rpx;
            width: 80%;
            margin:0 auto;
            border-radius: 20rpx;
        .pdd_pop_title
        {
            text-align: center;
            margin-bottom: 30rpx;
            font-size: 18px;
        }
        .pdd_pop_text
        {
            margin-bottom: 30rpx;
            color: #868080;
        }
    }
  .container {
    .flexbox {
      position: fixed;
uniapp/uni_modules/uni-popup/changelog.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
## 1.8.3(2023-04-17)
- ä¿®å¤ uni-popup é‡å¤æ‰“开时的 bug
## 1.8.2(2023-02-02)
- uni-popup-dialog ç»„件新增 inputType å±žæ€§
## 1.8.1(2022-12-01)
- ä¿®å¤ nvue ä¸‹ v-show æŠ¥é”™
## 1.8.0(2022-11-29)
- ä¼˜åŒ– ä¸»é¢˜æ ·å¼
## 1.7.9(2022-04-02)
- ä¿®å¤ å¼¹å‡ºå±‚内部无法滚动的bug
## 1.7.8(2022-03-28)
- ä¿®å¤ å°ç¨‹åºä¸­é«˜åº¦é”™è¯¯çš„bug
## 1.7.7(2022-03-17)
- ä¿®å¤ å¿«é€Ÿè°ƒç”¨open出现问题的Bug
## 1.7.6(2022-02-14)
- ä¿®å¤ safeArea å±žæ€§ä¸èƒ½è®¾ç½®ä¸ºfalse的bug
## 1.7.5(2022-01-19)
- ä¿®å¤ isMaskClick å¤±æ•ˆçš„bug
## 1.7.4(2022-01-19)
- æ–°å¢ž cancelText \ confirmText å±žæ€§ ï¼Œå¯è‡ªå®šä¹‰æ–‡æœ¬
- æ–°å¢ž maskBackgroundColor å±žæ€§ ï¼Œå¯ä»¥ä¿®æ”¹è’™ç‰ˆé¢œè‰²
- ä¼˜åŒ– maskClick属性 æ›´æ–°ä¸º isMaskClick ï¼Œè§£å†³å¾®ä¿¡å°ç¨‹åºè­¦å‘Šçš„问题
## 1.7.3(2022-01-13)
- ä¿®å¤ è®¾ç½® safeArea å±žæ€§ä¸ç”Ÿæ•ˆçš„bug
## 1.7.2(2021-11-26)
- ä¼˜åŒ– ç»„件示例
## 1.7.1(2021-11-26)
- ä¿®å¤ vuedoc æ–‡å­—错误
## 1.7.0(2021-11-19)
- ä¼˜åŒ– ç»„ä»¶UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
- æ–‡æ¡£è¿ç§»ï¼Œè¯¦è§:[https://uniapp.dcloud.io/component/uniui/uni-popup](https://uniapp.dcloud.io/component/uniui/uni-popup)
## 1.6.2(2021-08-24)
- æ–°å¢ž æ”¯æŒå›½é™…化
## 1.6.1(2021-07-30)
- ä¼˜åŒ– vue3下事件警告的问题
## 1.6.0(2021-07-13)
- ç»„件兼容 vue3,如何创建vue3项目,详见 [uni-app é¡¹ç›®æ”¯æŒ vue3 ä»‹ç»](https://ask.dcloud.net.cn/article/37834)
## 1.5.0(2021-06-23)
- æ–°å¢ž mask-click é®ç½©å±‚点击事件
## 1.4.5(2021-06-22)
- ä¿®å¤ nvue å¹³å°ä¸­é—´å¼¹å‡ºåŽï¼Œç‚¹å‡»å†…容,再点击遮罩无法关闭的Bug
## 1.4.4(2021-06-18)
- ä¿®å¤ H5平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug
## 1.4.3(2021-06-08)
- ä¿®å¤ é”™è¯¯çš„ watch å­—段
- ä¿®å¤ safeArea å±žæ€§ä¸ç”Ÿæ•ˆçš„问题
- ä¿®å¤ ç‚¹å‡»å†…容,再点击遮罩无法关闭的Bug
## 1.4.2(2021-05-12)
- æ–°å¢ž ç»„件示例地址
## 1.4.1(2021-04-29)
- ä¿®å¤ ç»„件内放置 input ã€textarea ç»„件,无法聚焦的问题
## 1.4.0 ï¼ˆ2021-04-29)
- æ–°å¢ž type å±žæ€§çš„ left\right å€¼ï¼Œæ”¯æŒå·¦å³å¼¹å‡º
- æ–°å¢ž open(String:type) æ–¹æ³•参数 ï¼Œå¯ä»¥çœç•¥ type å±žæ€§ ï¼Œç›´æŽ¥ä¼ å…¥ç±»åž‹æ‰“开指定弹窗
- æ–°å¢ž backgroundColor å±žæ€§ï¼Œå¯å®šä¹‰ä¸»çª—口背景色,默认不显示背景色
- æ–°å¢ž safeArea å±žæ€§ï¼Œæ˜¯å¦é€‚配底部安全区
- ä¿®å¤ App\h5\微信小程序底部安全区占位不对的Bug
- ä¿®å¤ App ç«¯å¼¹å‡ºç­‰å¾…çš„Bug
- ä¼˜åŒ– æå‡ä½Žé…è®¾å¤‡æ€§èƒ½ï¼Œä¼˜åŒ–动画卡顿问题
- ä¼˜åŒ– æ›´ç®€å•的组件自定义方式
## 1.2.9(2021-02-05)
- ä¼˜åŒ– ç»„件引用关系,通过uni_modules引用组件
## 1.2.8(2021-02-05)
- è°ƒæ•´ä¸ºuni_modules目录规范
## 1.2.7(2021-02-05)
- è°ƒæ•´ä¸ºuni_modules目录规范
- æ–°å¢ž æ”¯æŒ PC ç«¯
- æ–°å¢ž uni-popup-message ã€uni-popup-dialog扩展组件支持 PC ç«¯
uniapp/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
// #ifdef H5
export default {
  name: 'Keypress',
  props: {
    disable: {
      type: Boolean,
      default: false
    }
  },
  mounted () {
    const keyNames = {
      esc: ['Esc', 'Escape'],
      tab: 'Tab',
      enter: 'Enter',
      space: [' ', 'Spacebar'],
      up: ['Up', 'ArrowUp'],
      left: ['Left', 'ArrowLeft'],
      right: ['Right', 'ArrowRight'],
      down: ['Down', 'ArrowDown'],
      delete: ['Backspace', 'Delete', 'Del']
    }
    const listener = ($event) => {
      if (this.disable) {
        return
      }
      const keyName = Object.keys(keyNames).find(key => {
        const keyName = $event.key
        const value = keyNames[key]
        return value === keyName || (Array.isArray(value) && value.includes(keyName))
      })
      if (keyName) {
        // é¿å…å’Œå…¶ä»–按键事件冲突
        setTimeout(() => {
          this.$emit(keyName, {})
        }, 0)
      }
    }
    document.addEventListener('keyup', listener)
    this.$once('hook:beforeDestroy', () => {
      document.removeEventListener('keyup', listener)
    })
  },
    render: () => {}
}
// #endif
uniapp/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,275 @@
<template>
    <view class="uni-popup-dialog">
        <view class="uni-dialog-title">
            <text class="uni-dialog-title-text" :class="['uni-popup__'+dialogType]">{{titleText}}</text>
        </view>
        <view v-if="mode === 'base'" class="uni-dialog-content">
            <slot>
                <text class="uni-dialog-content-text">{{content}}</text>
            </slot>
        </view>
        <view v-else class="uni-dialog-content">
            <slot>
                <input class="uni-dialog-input" v-model="val" :type="inputType" :placeholder="placeholderText" :focus="focus" >
            </slot>
        </view>
        <view class="uni-dialog-button-group">
            <view class="uni-dialog-button" @click="closeDialog">
                <text class="uni-dialog-button-text">{{closeText}}</text>
            </view>
            <view class="uni-dialog-button uni-border-left" @click="onOk">
                <text class="uni-dialog-button-text uni-button-color">{{okText}}</text>
            </view>
        </view>
    </view>
</template>
<script>
    import popup from '../uni-popup/popup.js'
    import {
    initVueI18n
    } from '@dcloudio/uni-i18n'
    import messages from '../uni-popup/i18n/index.js'
    const {    t } = initVueI18n(messages)
    /**
     * PopUp å¼¹å‡ºå±‚-对话框样式
     * @description å¼¹å‡ºå±‚-对话框样式
     * @tutorial https://ext.dcloud.net.cn/plugin?id=329
     * @property {String} value input æ¨¡å¼ä¸‹çš„默认值
     * @property {String} placeholder input æ¨¡å¼ä¸‹è¾“入提示
     * @property {String} type = [success|warning|info|error] ä¸»é¢˜æ ·å¼
     *  @value success æˆåŠŸ
     *     @value warning æç¤º
     *     @value info æ¶ˆæ¯
     *     @value error é”™è¯¯
     * @property {String} mode = [base|input] æ¨¡å¼ã€
     *     @value base åŸºç¡€å¯¹è¯æ¡†
     *     @value input å¯è¾“入对话框
     * @property {String} content å¯¹è¯æ¡†å†…容
     * @property {Boolean} beforeClose æ˜¯å¦æ‹¦æˆªå–消事件
     * @event {Function} confirm ç‚¹å‡»ç¡®è®¤æŒ‰é’®è§¦å‘
     * @event {Function} close ç‚¹å‡»å–消按钮触发
     */
    export default {
        name: "uniPopupDialog",
        mixins: [popup],
        emits:['confirm','close'],
        props: {
            inputType:{
                type: String,
                default: 'text'
            },
            value: {
                type: [String, Number],
                default: ''
            },
            placeholder: {
                type: [String, Number],
                default: ''
            },
            type: {
                type: String,
                default: 'error'
            },
            mode: {
                type: String,
                default: 'base'
            },
            title: {
                type: String,
                default: ''
            },
            content: {
                type: String,
                default: ''
            },
            beforeClose: {
                type: Boolean,
                default: false
            },
            cancelText:{
                type: String,
                default: ''
            },
            confirmText:{
                type: String,
                default: ''
            }
        },
        data() {
            return {
                dialogType: 'error',
                focus: false,
                val: ""
            }
        },
        computed: {
            okText() {
                return this.confirmText || t("uni-popup.ok")
            },
            closeText() {
                return this.cancelText || t("uni-popup.cancel")
            },
            placeholderText() {
                return this.placeholder || t("uni-popup.placeholder")
            },
            titleText() {
                return this.title || t("uni-popup.title")
            }
        },
        watch: {
            type(val) {
                this.dialogType = val
            },
            mode(val) {
                if (val === 'input') {
                    this.dialogType = 'info'
                }
            },
            value(val) {
                this.val = val
            }
        },
        created() {
            // å¯¹è¯æ¡†é®ç½©ä¸å¯ç‚¹å‡»
            this.popup.disableMask()
            // this.popup.closeMask()
            if (this.mode === 'input') {
                this.dialogType = 'info'
                this.val = this.value
            } else {
                this.dialogType = this.type
            }
        },
        mounted() {
            this.focus = true
        },
        methods: {
            /**
             * ç‚¹å‡»ç¡®è®¤æŒ‰é’®
             */
            onOk() {
                if (this.mode === 'input'){
                    this.$emit('confirm', this.val)
                }else{
                    this.$emit('confirm')
                }
                if(this.beforeClose) return
                this.popup.close()
            },
            /**
             * ç‚¹å‡»å–消按钮
             */
            closeDialog() {
                this.$emit('close')
                if(this.beforeClose) return
                this.popup.close()
            },
            close(){
                this.popup.close()
            }
        }
    }
</script>
<style lang="scss" >
    .uni-popup-dialog {
        width: 300px;
        border-radius: 11px;
        background-color: #fff;
    }
    .uni-dialog-title {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: row;
        justify-content: center;
        padding-top: 25px;
    }
    .uni-dialog-title-text {
        font-size: 16px;
        font-weight: 500;
    }
    .uni-dialog-content {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: row;
        justify-content: center;
        align-items: center;
        padding: 20px;
    }
    .uni-dialog-content-text {
        font-size: 14px;
        color: #6C6C6C;
    }
    .uni-dialog-button-group {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: row;
        border-top-color: #f5f5f5;
        border-top-style: solid;
        border-top-width: 1px;
    }
    .uni-dialog-button {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex: 1;
        flex-direction: row;
        justify-content: center;
        align-items: center;
        height: 45px;
    }
    .uni-border-left {
        border-left-color: #f0f0f0;
        border-left-style: solid;
        border-left-width: 1px;
    }
    .uni-dialog-button-text {
        font-size: 16px;
        color: #333;
    }
    .uni-button-color {
        color: #007aff;
    }
    .uni-dialog-input {
        flex: 1;
        font-size: 14px;
        border: 1px #eee solid;
        height: 40px;
        padding: 0 10px;
        border-radius: 5px;
        color: #555;
    }
    .uni-popup__success {
        color: #4cd964;
    }
    .uni-popup__warn {
        color: #f0ad4e;
    }
    .uni-popup__error {
        color: #dd524d;
    }
    .uni-popup__info {
        color: #909399;
    }
</style>
uniapp/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,143 @@
<template>
    <view class="uni-popup-message">
        <view class="uni-popup-message__box fixforpc-width" :class="'uni-popup__'+type">
            <slot>
                <text class="uni-popup-message-text" :class="'uni-popup__'+type+'-text'">{{message}}</text>
            </slot>
        </view>
    </view>
</template>
<script>
    import popup from '../uni-popup/popup.js'
    /**
     * PopUp å¼¹å‡ºå±‚-消息提示
     * @description å¼¹å‡ºå±‚-消息提示
     * @tutorial https://ext.dcloud.net.cn/plugin?id=329
     * @property {String} type = [success|warning|info|error] ä¸»é¢˜æ ·å¼
     *  @value success æˆåŠŸ
     *     @value warning æç¤º
     *     @value info æ¶ˆæ¯
     *     @value error é”™è¯¯
     * @property {String} message æ¶ˆæ¯æç¤ºæ–‡å­—
     * @property {String} duration æ˜¾ç¤ºæ—¶é—´ï¼Œè®¾ç½®ä¸º 0 åˆ™ä¸ä¼šè‡ªåЍ关闭
     */
    export default {
        name: 'uniPopupMessage',
        mixins:[popup],
        props: {
            /**
             * ä¸»é¢˜ success/warning/info/error      é»˜è®¤ success
             */
            type: {
                type: String,
                default: 'success'
            },
            /**
             * æ¶ˆæ¯æ–‡å­—
             */
            message: {
                type: String,
                default: ''
            },
            /**
             * æ˜¾ç¤ºæ—¶é—´ï¼Œè®¾ç½®ä¸º 0 åˆ™ä¸ä¼šè‡ªåЍ关闭
             */
            duration: {
                type: Number,
                default: 3000
            },
            maskShow:{
                type:Boolean,
                default:false
            }
        },
        data() {
            return {}
        },
        created() {
            this.popup.maskShow = this.maskShow
            this.popup.messageChild = this
        },
        methods: {
            timerClose(){
                if(this.duration === 0) return
                clearTimeout(this.timer)
                this.timer = setTimeout(()=>{
                    this.popup.close()
                },this.duration)
            }
        }
    }
</script>
<style lang="scss" >
    .uni-popup-message {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: row;
        justify-content: center;
    }
    .uni-popup-message__box {
        background-color: #e1f3d8;
        padding: 10px 15px;
        border-color: #eee;
        border-style: solid;
        border-width: 1px;
        flex: 1;
    }
    @media screen and (min-width: 500px) {
        .fixforpc-width {
            margin-top: 20px;
            border-radius: 4px;
            flex: none;
            min-width: 380px;
            /* #ifndef APP-NVUE */
            max-width: 50%;
            /* #endif */
            /* #ifdef APP-NVUE */
            max-width: 500px;
            /* #endif */
        }
    }
    .uni-popup-message-text {
        font-size: 14px;
        padding: 0;
    }
    .uni-popup__success {
        background-color: #e1f3d8;
    }
    .uni-popup__success-text {
        color: #67C23A;
    }
    .uni-popup__warn {
        background-color: #faecd8;
    }
    .uni-popup__warn-text {
        color: #E6A23C;
    }
    .uni-popup__error {
        background-color: #fde2e2;
    }
    .uni-popup__error-text {
        color: #F56C6C;
    }
    .uni-popup__info {
        background-color: #F2F6FC;
    }
    .uni-popup__info-text {
        color: #909399;
    }
</style>
uniapp/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,187 @@
<template>
    <view class="uni-popup-share">
        <view class="uni-share-title"><text class="uni-share-title-text">{{shareTitleText}}</text></view>
        <view class="uni-share-content">
            <view class="uni-share-content-box">
                <view class="uni-share-content-item" v-for="(item,index) in bottomData" :key="index" @click.stop="select(item,index)">
                    <image class="uni-share-image" :src="item.icon" mode="aspectFill"></image>
                    <text class="uni-share-text">{{item.text}}</text>
                </view>
            </view>
        </view>
        <view class="uni-share-button-box">
            <button class="uni-share-button" @click="close">{{cancelText}}</button>
        </view>
    </view>
</template>
<script>
    import popup from '../uni-popup/popup.js'
    import {
    initVueI18n
    } from '@dcloudio/uni-i18n'
    import messages from '../uni-popup/i18n/index.js'
    const {    t    } = initVueI18n(messages)
    export default {
        name: 'UniPopupShare',
        mixins:[popup],
        emits:['select'],
        props: {
            title: {
                type: String,
                default: ''
            },
            beforeClose: {
                type: Boolean,
                default: false
            }
        },
        data() {
            return {
                bottomData: [{
                        text: '微信',
                        icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/c2b17470-50be-11eb-b680-7980c8a877b8.png',
                        name: 'wx'
                    },
                    {
                        text: '支付宝',
                        icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/d684ae40-50be-11eb-8ff1-d5dcf8779628.png',
                        name: 'wx'
                    },
                    {
                        text: 'QQ',
                        icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/e7a79520-50be-11eb-b997-9918a5dda011.png',
                        name: 'qq'
                    },
                    {
                        text: '新浪',
                        icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/0dacdbe0-50bf-11eb-8ff1-d5dcf8779628.png',
                        name: 'sina'
                    },
                    // {
                    //     text: '百度',
                    //     icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/1ec6e920-50bf-11eb-8a36-ebb87efcf8c0.png',
                    //     name: 'copy'
                    // },
                    // {
                    //     text: '其他',
                    //     icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/2e0fdfe0-50bf-11eb-b997-9918a5dda011.png',
                    //     name: 'more'
                    // }
                ]
            }
        },
        created() {},
        computed: {
            cancelText() {
                return t("uni-popup.cancel")
            },
        shareTitleText() {
                return this.title || t("uni-popup.shareTitle")
            }
        },
        methods: {
            /**
             * é€‰æ‹©å†…容
             */
            select(item, index) {
                this.$emit('select', {
                    item,
                    index
                })
                this.close()
            },
            /**
             * å…³é—­çª—口
             */
            close() {
                if(this.beforeClose) return
                this.popup.close()
            }
        }
    }
</script>
<style lang="scss" >
    .uni-popup-share {
        background-color: #fff;
        border-top-left-radius: 11px;
        border-top-right-radius: 11px;
    }
    .uni-share-title {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: row;
        align-items: center;
        justify-content: center;
        height: 40px;
    }
    .uni-share-title-text {
        font-size: 14px;
        color: #666;
    }
    .uni-share-content {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: row;
        justify-content: center;
        padding-top: 10px;
    }
    .uni-share-content-box {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: row;
        flex-wrap: wrap;
        width: 360px;
    }
    .uni-share-content-item {
        width: 90px;
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: column;
        justify-content: center;
        padding: 10px 0;
        align-items: center;
    }
    .uni-share-content-item:active {
        background-color: #f5f5f5;
    }
    .uni-share-image {
        width: 30px;
        height: 30px;
    }
    .uni-share-text {
        margin-top: 10px;
        font-size: 14px;
        color: #3B4144;
    }
    .uni-share-button-box {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: row;
        padding: 10px 15px;
    }
    .uni-share-button {
        flex: 1;
        border-radius: 50px;
        color: #666;
        font-size: 16px;
    }
    .uni-share-button::after {
        border-radius: 50px;
    }
</style>
uniapp/uni_modules/uni-popup/components/uni-popup/i18n/en.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
{
    "uni-popup.cancel": "cancel",
    "uni-popup.ok": "ok",
    "uni-popup.placeholder": "pleace enter",
    "uni-popup.title": "Hint",
    "uni-popup.shareTitle": "Share to"
}
uniapp/uni_modules/uni-popup/components/uni-popup/i18n/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
import en from './en.json'
import zhHans from './zh-Hans.json'
import zhHant from './zh-Hant.json'
export default {
    en,
    'zh-Hans': zhHans,
    'zh-Hant': zhHant
}
uniapp/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
{
    "uni-popup.cancel": "取消",
    "uni-popup.ok": "确定",
    "uni-popup.placeholder": "请输入",
        "uni-popup.title": "提示",
        "uni-popup.shareTitle": "分享到"
}
uniapp/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
{
    "uni-popup.cancel": "取消",
    "uni-popup.ok": "確定",
    "uni-popup.placeholder": "請輸入",
    "uni-popup.title": "提示",
    "uni-popup.shareTitle": "分享到"
}
uniapp/uni_modules/uni-popup/components/uni-popup/keypress.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
// #ifdef H5
export default {
  name: 'Keypress',
  props: {
    disable: {
      type: Boolean,
      default: false
    }
  },
  mounted () {
    const keyNames = {
      esc: ['Esc', 'Escape'],
      tab: 'Tab',
      enter: 'Enter',
      space: [' ', 'Spacebar'],
      up: ['Up', 'ArrowUp'],
      left: ['Left', 'ArrowLeft'],
      right: ['Right', 'ArrowRight'],
      down: ['Down', 'ArrowDown'],
      delete: ['Backspace', 'Delete', 'Del']
    }
    const listener = ($event) => {
      if (this.disable) {
        return
      }
      const keyName = Object.keys(keyNames).find(key => {
        const keyName = $event.key
        const value = keyNames[key]
        return value === keyName || (Array.isArray(value) && value.includes(keyName))
      })
      if (keyName) {
        // é¿å…å’Œå…¶ä»–按键事件冲突
        setTimeout(() => {
          this.$emit(keyName, {})
        }, 0)
      }
    }
    document.addEventListener('keyup', listener)
    // this.$once('hook:beforeDestroy', () => {
    //   document.removeEventListener('keyup', listener)
    // })
  },
    render: () => {}
}
// #endif
uniapp/uni_modules/uni-popup/components/uni-popup/popup.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
export default {
    data() {
        return {
        }
    },
    created(){
        this.popup = this.getParent()
    },
    methods:{
        /**
         * èŽ·å–çˆ¶å…ƒç´ å®žä¾‹
         */
        getParent(name = 'uniPopup') {
            let parent = this.$parent;
            let parentName = parent.$options.name;
            while (parentName !== name) {
                parent = parent.$parent;
                if (!parent) return false
                parentName = parent.$options.name;
            }
            return parent;
        },
    }
}
uniapp/uni_modules/uni-popup/components/uni-popup/uni-popup.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,473 @@
<template>
    <view v-if="showPopup" class="uni-popup" :class="[popupstyle, isDesktop ? 'fixforpc-z-index' : '']">
        <view @touchstart="touchstart">
            <uni-transition key="1" v-if="maskShow" name="mask" mode-class="fade" :styles="maskClass"
                :duration="duration" :show="showTrans" @click="onTap" />
            <uni-transition key="2" :mode-class="ani" name="content" :styles="transClass" :duration="duration"
                :show="showTrans" @click="onTap">
                <view class="uni-popup__wrapper" :style="{ backgroundColor: bg }" :class="[popupstyle]" @click="clear">
                    <slot />
                </view>
            </uni-transition>
        </view>
        <!-- #ifdef H5 -->
        <keypress v-if="maskShow" @esc="onTap" />
        <!-- #endif -->
    </view>
</template>
<script>
    // #ifdef H5
    import keypress from './keypress.js'
    // #endif
    /**
     * PopUp å¼¹å‡ºå±‚
     * @description å¼¹å‡ºå±‚组件,为了解决遮罩弹层的问题
     * @tutorial https://ext.dcloud.net.cn/plugin?id=329
     * @property {String} type = [top|center|bottom|left|right|message|dialog|share] å¼¹å‡ºæ–¹å¼
     *     @value top é¡¶éƒ¨å¼¹å‡º
     *     @value center ä¸­é—´å¼¹å‡º
     *     @value bottom åº•部弹出
     *     @value left        å·¦ä¾§å¼¹å‡º
     *     @value right  å³ä¾§å¼¹å‡º
     *     @value message æ¶ˆæ¯æç¤º
     *     @value dialog å¯¹è¯æ¡†
     *     @value share åº•部分享示例
     * @property {Boolean} animation = [true|false] æ˜¯å¦å¼€å¯åŠ¨ç”»
     * @property {Boolean} maskClick = [true|false] è’™ç‰ˆç‚¹å‡»æ˜¯å¦å…³é—­å¼¹çª—(废弃)
     * @property {Boolean} isMaskClick = [true|false] è’™ç‰ˆç‚¹å‡»æ˜¯å¦å…³é—­å¼¹çª—
     * @property {String}  backgroundColor ä¸»çª—口背景色
     * @property {String}  maskBackgroundColor è’™ç‰ˆé¢œè‰²
     * @property {Boolean} safeArea           æ˜¯å¦é€‚配底部安全区
     * @event {Function} change æ‰“开关闭弹窗触发,e={show: false}
     * @event {Function} maskClick ç‚¹å‡»é®ç½©è§¦å‘
     */
    export default {
        name: 'uniPopup',
        components: {
            // #ifdef H5
            keypress
            // #endif
        },
        emits: ['change', 'maskClick'],
        props: {
            // å¼€å¯åŠ¨ç”»
            animation: {
                type: Boolean,
                default: true
            },
            // å¼¹å‡ºå±‚类型,可选值,top: é¡¶éƒ¨å¼¹å‡ºå±‚ï¼›bottom:底部弹出层;center:全屏弹出层
            // message: æ¶ˆæ¯æç¤º ; dialog : å¯¹è¯æ¡†
            type: {
                type: String,
                default: 'center'
            },
            // maskClick
            isMaskClick: {
                type: Boolean,
                default: null
            },
            // TODO 2 ä¸ªç‰ˆæœ¬åŽåºŸå¼ƒå±žæ€§ ï¼Œä½¿ç”¨ isMaskClick
            maskClick: {
                type: Boolean,
                default: null
            },
            backgroundColor: {
                type: String,
                default: 'none'
            },
            safeArea: {
                type: Boolean,
                default: true
            },
            maskBackgroundColor: {
                type: String,
                default: 'rgba(0, 0, 0, 0.4)'
            },
        },
        watch: {
            /**
             * ç›‘听type类型
             */
            type: {
                handler: function(type) {
                    if (!this.config[type]) return
                    this[this.config[type]](true)
                },
                immediate: true
            },
            isDesktop: {
                handler: function(newVal) {
                    if (!this.config[newVal]) return
                    this[this.config[this.type]](true)
                },
                immediate: true
            },
            /**
             * ç›‘听遮罩是否可点击
             * @param {Object} val
             */
            maskClick: {
                handler: function(val) {
                    this.mkclick = val
                },
                immediate: true
            },
            isMaskClick: {
                handler: function(val) {
                    this.mkclick = val
                },
                immediate: true
            },
            // H5 ä¸‹ç¦æ­¢åº•部滚动
            showPopup(show) {
                // #ifdef H5
                // fix by mehaotian å¤„理 h5 æ»šåŠ¨ç©¿é€çš„é—®é¢˜
                document.getElementsByTagName('body')[0].style.overflow = show ? 'hidden' : 'visible'
                // #endif
            }
        },
        data() {
            return {
                duration: 300,
                ani: [],
                showPopup: false,
                showTrans: false,
                popupWidth: 0,
                popupHeight: 0,
                config: {
                    top: 'top',
                    bottom: 'bottom',
                    center: 'center',
                    left: 'left',
                    right: 'right',
                    message: 'top',
                    dialog: 'center',
                    share: 'bottom'
                },
                maskClass: {
                    position: 'fixed',
                    bottom: 0,
                    top: 0,
                    left: 0,
                    right: 0,
                    backgroundColor: 'rgba(0, 0, 0, 0.4)'
                },
                transClass: {
                    position: 'fixed',
                    left: 0,
                    right: 0
                },
                maskShow: true,
                mkclick: true,
                popupstyle: this.isDesktop ? 'fixforpc-top' : 'top'
            }
        },
        computed: {
            isDesktop() {
                return this.popupWidth >= 500 && this.popupHeight >= 500
            },
            bg() {
                if (this.backgroundColor === '' || this.backgroundColor === 'none') {
                    return 'transparent'
                }
                return this.backgroundColor
            }
        },
        mounted() {
            const fixSize = () => {
                const {
                    windowWidth,
                    windowHeight,
                    windowTop,
                    safeArea,
                    screenHeight,
                    safeAreaInsets
                } = uni.getSystemInfoSync()
                this.popupWidth = windowWidth
                this.popupHeight = windowHeight + (windowTop || 0)
                // TODO fix by mehaotian æ˜¯å¦é€‚配底部安全区 ,目前微信ios ã€å’Œ app ios è®¡ç®—有差异,需要框架修复
                if (safeArea && this.safeArea) {
                    // #ifdef MP-WEIXIN
                    this.safeAreaInsets = screenHeight - safeArea.bottom
                    // #endif
                    // #ifndef MP-WEIXIN
                    this.safeAreaInsets = safeAreaInsets.bottom
                    // #endif
                } else {
                    this.safeAreaInsets = 0
                }
            }
            fixSize()
            // #ifdef H5
            // window.addEventListener('resize', fixSize)
            // this.$once('hook:beforeDestroy', () => {
            //     window.removeEventListener('resize', fixSize)
            // })
            // #endif
        },
        // #ifndef VUE3
        // TODO vue2
        destroyed() {
            this.setH5Visible()
        },
        // #endif
        // #ifdef VUE3
        // TODO vue3
        unmounted() {
            this.setH5Visible()
        },
        // #endif
        created() {
            // this.mkclick =  this.isMaskClick || this.maskClick
            if (this.isMaskClick === null && this.maskClick === null) {
                this.mkclick = true
            } else {
                this.mkclick = this.isMaskClick !== null ? this.isMaskClick : this.maskClick
            }
            if (this.animation) {
                this.duration = 300
            } else {
                this.duration = 0
            }
            // TODO å¤„理 message ç»„件生命周期异常的问题
            this.messageChild = null
            // TODO è§£å†³å¤´æ¡å†’泡的问题
            this.clearPropagation = false
            this.maskClass.backgroundColor = this.maskBackgroundColor
        },
        methods: {
            setH5Visible() {
                // #ifdef H5
                // fix by mehaotian å¤„理 h5 æ»šåŠ¨ç©¿é€çš„é—®é¢˜
                document.getElementsByTagName('body')[0].style.overflow = 'visible'
                // #endif
            },
            /**
             * å…¬ç”¨æ–¹æ³•,不显示遮罩层
             */
            closeMask() {
                this.maskShow = false
            },
            /**
             * å…¬ç”¨æ–¹æ³•,遮罩层禁止点击
             */
            disableMask() {
                this.mkclick = false
            },
            // TODO nvue å–消冒泡
            clear(e) {
                // #ifndef APP-NVUE
                e.stopPropagation()
                // #endif
                this.clearPropagation = true
            },
            open(direction) {
                // fix by mehaotian å¤„理快速打开关闭的情况
                if (this.showPopup) {
                    return
                }
                let innerType = ['top', 'center', 'bottom', 'left', 'right', 'message', 'dialog', 'share']
                if (!(direction && innerType.indexOf(direction) !== -1)) {
                    direction = this.type
                }
                if (!this.config[direction]) {
                    console.error('缺少类型:', direction)
                    return
                }
                this[this.config[direction]]()
                this.$emit('change', {
                    show: true,
                    type: direction
                })
            },
            close(type) {
                this.showTrans = false
                this.$emit('change', {
                    show: false,
                    type: this.type
                })
                clearTimeout(this.timer)
                // // è‡ªå®šä¹‰å…³é—­äº‹ä»¶
                // this.customOpen && this.customClose()
                this.timer = setTimeout(() => {
                    this.showPopup = false
                }, 300)
            },
            // TODO å¤„理冒泡事件,头条的冒泡事件有问题 ï¼Œå…ˆè¿™æ ·å…¼å®¹
            touchstart() {
                this.clearPropagation = false
            },
            onTap() {
                if (this.clearPropagation) {
                    // fix by mehaotian å…¼å®¹ nvue
                    this.clearPropagation = false
                    return
                }
                this.$emit('maskClick')
                if (!this.mkclick) return
                this.close()
            },
            /**
             * é¡¶éƒ¨å¼¹å‡ºæ ·å¼å¤„理
             */
            top(type) {
                this.popupstyle = this.isDesktop ? 'fixforpc-top' : 'top'
                this.ani = ['slide-top']
                this.transClass = {
                    position: 'fixed',
                    left: 0,
                    right: 0,
                    backgroundColor: this.bg
                }
                // TODO å…¼å®¹ type å±žæ€§ ï¼ŒåŽç»­ä¼šåºŸå¼ƒ
                if (type) return
                this.showPopup = true
                this.showTrans = true
                this.$nextTick(() => {
                    if (this.messageChild && this.type === 'message') {
                        this.messageChild.timerClose()
                    }
                })
            },
            /**
             * åº•部弹出样式处理
             */
            bottom(type) {
                this.popupstyle = 'bottom'
                this.ani = ['slide-bottom']
                this.transClass = {
                    position: 'fixed',
                    left: 0,
                    right: 0,
                    bottom: 0,
                    paddingBottom: this.safeAreaInsets + 'px',
                    backgroundColor: this.bg
                }
                // TODO å…¼å®¹ type å±žæ€§ ï¼ŒåŽç»­ä¼šåºŸå¼ƒ
                if (type) return
                this.showPopup = true
                this.showTrans = true
            },
            /**
             * ä¸­é—´å¼¹å‡ºæ ·å¼å¤„理
             */
            center(type) {
                this.popupstyle = 'center'
                this.ani = ['zoom-out', 'fade']
                this.transClass = {
                    position: 'fixed',
                    /* #ifndef APP-NVUE */
                    display: 'flex',
                    flexDirection: 'column',
                    /* #endif */
                    bottom: 0,
                    left: 0,
                    right: 0,
                    top: 0,
                    justifyContent: 'center',
                    alignItems: 'center'
                }
                // TODO å…¼å®¹ type å±žæ€§ ï¼ŒåŽç»­ä¼šåºŸå¼ƒ
                if (type) return
                this.showPopup = true
                this.showTrans = true
            },
            left(type) {
                this.popupstyle = 'left'
                this.ani = ['slide-left']
                this.transClass = {
                    position: 'fixed',
                    left: 0,
                    bottom: 0,
                    top: 0,
                    backgroundColor: this.bg,
                    /* #ifndef APP-NVUE */
                    display: 'flex',
                    flexDirection: 'column'
                    /* #endif */
                }
                // TODO å…¼å®¹ type å±žæ€§ ï¼ŒåŽç»­ä¼šåºŸå¼ƒ
                if (type) return
                this.showPopup = true
                this.showTrans = true
            },
            right(type) {
                this.popupstyle = 'right'
                this.ani = ['slide-right']
                this.transClass = {
                    position: 'fixed',
                    bottom: 0,
                    right: 0,
                    top: 0,
                    backgroundColor: this.bg,
                    /* #ifndef APP-NVUE */
                    display: 'flex',
                    flexDirection: 'column'
                    /* #endif */
                }
                // TODO å…¼å®¹ type å±žæ€§ ï¼ŒåŽç»­ä¼šåºŸå¼ƒ
                if (type) return
                this.showPopup = true
                this.showTrans = true
            }
        }
    }
</script>
<style lang="scss">
    .uni-popup {
        position: fixed;
        /* #ifndef APP-NVUE */
        z-index: 99;
        /* #endif */
        &.top,
        &.left,
        &.right {
            /* #ifdef H5 */
            top: var(--window-top);
            /* #endif */
            /* #ifndef H5 */
            top: 0;
            /* #endif */
        }
        .uni-popup__wrapper {
            /* #ifndef APP-NVUE */
            display: block;
            /* #endif */
            position: relative;
            /* iphonex ç­‰å®‰å…¨åŒºè®¾ç½®ï¼Œåº•部安全区适配 */
            /* #ifndef APP-NVUE */
            // padding-bottom: constant(safe-area-inset-bottom);
            // padding-bottom: env(safe-area-inset-bottom);
            /* #endif */
            &.left,
            &.right {
                /* #ifdef H5 */
                padding-top: var(--window-top);
                /* #endif */
                /* #ifndef H5 */
                padding-top: 0;
                /* #endif */
                flex: 1;
            }
        }
    }
    .fixforpc-z-index {
        /* #ifndef APP-NVUE */
        z-index: 999;
        /* #endif */
    }
    .fixforpc-top {
        top: 0;
    }
</style>
uniapp/uni_modules/uni-popup/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
{
    "id": "uni-popup",
    "displayName": "uni-popup å¼¹å‡ºå±‚",
    "version": "1.8.3",
    "description": " Popup ç»„件,提供常用的弹层",
    "keywords": [
        "uni-ui",
        "弹出层",
        "弹窗",
        "popup",
        "弹框"
    ],
    "repository": "https://github.com/dcloudio/uni-ui",
    "engines": {
        "HBuilderX": ""
    },
    "directories": {
        "example": "../../temps/example_temps"
    },
    "dcloudext": {
        "sale": {
            "regular": {
                "price": "0.00"
            },
            "sourcecode": {
                "price": "0.00"
            }
        },
        "contact": {
            "qq": ""
        },
        "declaration": {
            "ads": "无",
            "data": "无",
            "permissions": "无"
        },
        "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
        "type": "component-vue"
    },
    "uni_modules": {
        "dependencies": [
            "uni-scss",
            "uni-transition"
        ],
        "encrypt": [],
        "platforms": {
            "cloud": {
                "tcb": "y",
                "aliyun": "y"
            },
            "client": {
                "App": {
                    "app-vue": "y",
                    "app-nvue": "y"
                },
                "H5-mobile": {
                    "Safari": "y",
                    "Android Browser": "y",
                    "微信浏览器(Android)": "y",
                    "QQ浏览器(Android)": "y"
                },
                "H5-pc": {
                    "Chrome": "y",
                    "IE": "y",
                    "Edge": "y",
                    "Firefox": "y",
                    "Safari": "y"
                },
                "小程序": {
                    "微信": "y",
                    "阿里": "y",
                    "百度": "y",
                    "字节跳动": "y",
                    "QQ": "y"
                },
                "快应用": {
                    "华为": "u",
                    "联盟": "u"
                },
                "Vue": {
                    "vue2": "y",
                    "vue3": "y"
                }
            }
        }
    }
}
uniapp/uni_modules/uni-popup/readme.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
## Popup å¼¹å‡ºå±‚
> **组件名:uni-popup**
> ä»£ç å—: `uPopup`
> å…³è”组件:`uni-transition`
弹出层组件,在应用中弹出一个消息提示窗口、提示框等
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-popup)
#### å¦‚使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui äº¤æµç¾¤ï¼š871950839
uniapp/uni_modules/uni-scss/changelog.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
## 1.0.3(2022-01-21)
- ä¼˜åŒ– ç»„件示例
## 1.0.2(2021-11-22)
- ä¿®å¤ / ç¬¦å·åœ¨ vue ä¸åŒç‰ˆæœ¬å…¼å®¹é—®é¢˜å¼•起的报错问题
## 1.0.1(2021-11-22)
- ä¿®å¤ vue3中scss语法兼容问题
## 1.0.0(2021-11-18)
- init
uniapp/uni_modules/uni-scss/index.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
@import './styles/index.scss';
uniapp/uni_modules/uni-scss/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
{
  "id": "uni-scss",
  "displayName": "uni-scss è¾…助样式",
  "version": "1.0.3",
  "description": "uni-sass是uni-ui提供的一套全局样式 ï¼Œé€šè¿‡ä¸€äº›ç®€å•的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。",
  "keywords": [
    "uni-scss",
    "uni-ui",
    "辅助样式"
],
  "repository": "https://github.com/dcloudio/uni-ui",
  "engines": {
    "HBuilderX": "^3.1.0"
  },
  "dcloudext": {
    "category": [
        "JS SDK",
        "通用 SDK"
    ],
    "sale": {
      "regular": {
        "price": "0.00"
      },
      "sourcecode": {
        "price": "0.00"
      }
    },
    "contact": {
      "qq": ""
    },
    "declaration": {
      "ads": "无",
      "data": "无",
      "permissions": "无"
    },
    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
  },
  "uni_modules": {
    "dependencies": [],
    "encrypt": [],
    "platforms": {
      "cloud": {
        "tcb": "y",
        "aliyun": "y"
      },
      "client": {
        "App": {
          "app-vue": "y",
          "app-nvue": "u"
        },
        "H5-mobile": {
          "Safari": "y",
          "Android Browser": "y",
          "微信浏览器(Android)": "y",
          "QQ浏览器(Android)": "y"
        },
        "H5-pc": {
          "Chrome": "y",
          "IE": "y",
          "Edge": "y",
          "Firefox": "y",
          "Safari": "y"
        },
        "小程序": {
          "微信": "y",
          "阿里": "y",
          "百度": "y",
          "字节跳动": "y",
          "QQ": "y"
        },
        "快应用": {
          "华为": "n",
          "联盟": "n"
        },
        "Vue": {
            "vue2": "y",
            "vue3": "y"
        }
      }
    }
  }
}
uniapp/uni_modules/uni-scss/readme.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
`uni-sass` æ˜¯ `uni-ui`提供的一套全局样式 ï¼Œé€šè¿‡ä¸€äº›ç®€å•的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass)
#### å¦‚使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui äº¤æµç¾¤ï¼š871950839
uniapp/uni_modules/uni-scss/styles/index.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
@import './setting/_variables.scss';
@import './setting/_border.scss';
@import './setting/_color.scss';
@import './setting/_space.scss';
@import './setting/_radius.scss';
@import './setting/_text.scss';
@import './setting/_styles.scss';
uniapp/uni_modules/uni-scss/styles/setting/_border.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
.uni-border {
    border: 1px $uni-border-1 solid;
}
uniapp/uni_modules/uni-scss/styles/setting/_color.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
// TODO æš‚时不需要 class ï¼Œéœ€è¦ç”¨æˆ·ä½¿ç”¨å˜é‡å®žçް ï¼Œå¦‚果使用类名其实并不推荐
// @mixin get-styles($k,$c) {
//     @if $k == size or $k == weight{
//         font-#{$k}:#{$c}
//     }@else{
//         #{$k}:#{$c}
//     }
// }
$uni-ui-color:(
    // ä¸»è‰²
    primary: $uni-primary,
    primary-disable: $uni-primary-disable,
    primary-light: $uni-primary-light,
    // è¾…助色
    success: $uni-success,
    success-disable: $uni-success-disable,
    success-light: $uni-success-light,
    warning: $uni-warning,
    warning-disable: $uni-warning-disable,
    warning-light: $uni-warning-light,
    error: $uni-error,
    error-disable: $uni-error-disable,
    error-light: $uni-error-light,
    info: $uni-info,
    info-disable: $uni-info-disable,
    info-light: $uni-info-light,
    // ä¸­æ€§è‰²
    main-color: $uni-main-color,
    base-color: $uni-base-color,
    secondary-color: $uni-secondary-color,
    extra-color: $uni-extra-color,
    // èƒŒæ™¯è‰²
    bg-color: $uni-bg-color,
    // è¾¹æ¡†é¢œè‰²
    border-1: $uni-border-1,
    border-2: $uni-border-2,
    border-3: $uni-border-3,
    border-4: $uni-border-4,
    // é»‘色
    black:$uni-black,
    // ç™½è‰²
    white:$uni-white,
    // é€æ˜Ž
    transparent:$uni-transparent
) !default;
@each $key, $child in $uni-ui-color {
    .uni-#{"" + $key} {
        color: $child;
    }
    .uni-#{"" + $key}-bg {
        background-color: $child;
    }
}
.uni-shadow-sm {
    box-shadow: $uni-shadow-sm;
}
.uni-shadow-base {
    box-shadow: $uni-shadow-base;
}
.uni-shadow-lg {
    box-shadow: $uni-shadow-lg;
}
.uni-mask {
    background-color:$uni-mask;
}
uniapp/uni_modules/uni-scss/styles/setting/_radius.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
@mixin radius($r,$d:null ,$important: false){
  $radius-value:map-get($uni-radius, $r) if($important, !important, null);
  // Key exists within the $uni-radius variable
  @if (map-has-key($uni-radius, $r) and  $d){
        @if $d == t {
                border-top-left-radius:$radius-value;
                border-top-right-radius:$radius-value;
        }@else if $d == r {
                border-top-right-radius:$radius-value;
                border-bottom-right-radius:$radius-value;
        }@else if $d == b {
                border-bottom-left-radius:$radius-value;
                border-bottom-right-radius:$radius-value;
        }@else if $d == l {
                border-top-left-radius:$radius-value;
                border-bottom-left-radius:$radius-value;
        }@else if $d == tl {
                border-top-left-radius:$radius-value;
        }@else if $d == tr {
                border-top-right-radius:$radius-value;
        }@else if $d == br {
                border-bottom-right-radius:$radius-value;
        }@else if $d == bl {
                border-bottom-left-radius:$radius-value;
        }
  }@else{
        border-radius:$radius-value;
  }
}
@each $key, $child in $uni-radius {
    @if($key){
        .uni-radius-#{"" + $key} {
                @include radius($key)
        }
    }@else{
        .uni-radius {
                @include radius($key)
        }
    }
}
@each $direction in t, r, b, l,tl, tr, br, bl {
    @each $key, $child in $uni-radius {
        @if($key){
            .uni-radius-#{"" + $direction}-#{"" + $key} {
                @include radius($key,$direction,false)
            }
        }@else{
            .uni-radius-#{$direction} {
                @include radius($key,$direction,false)
            }
        }
    }
}
uniapp/uni_modules/uni-scss/styles/setting/_space.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
@mixin fn($space,$direction,$size,$n) {
    @if $n {
        #{$space}-#{$direction}: #{$size*$uni-space-root}px
    } @else {
         #{$space}-#{$direction}: #{-$size*$uni-space-root}px
    }
}
@mixin get-styles($direction,$i,$space,$n){
    @if $direction == t {
        @include fn($space, top,$i,$n);
    }
    @if $direction == r {
        @include fn($space, right,$i,$n);
    }
    @if $direction == b {
        @include fn($space, bottom,$i,$n);
    }
    @if $direction == l {
     @include fn($space, left,$i,$n);
    }
    @if $direction == x {
        @include fn($space, left,$i,$n);
        @include fn($space, right,$i,$n);
    }
    @if $direction == y {
        @include fn($space, top,$i,$n);
        @include fn($space, bottom,$i,$n);
    }
    @if $direction == a {
        @if $n {
            #{$space}:#{$i*$uni-space-root}px;
        } @else {
            #{$space}:#{-$i*$uni-space-root}px;
        }
    }
}
@each $orientation in m,p {
    $space: margin;
    @if $orientation == m {
        $space: margin;
    } @else {
        $space: padding;
    }
    @for $i from 0 through 16 {
        @each $direction in t, r, b, l, x, y, a {
            .uni-#{$orientation}#{$direction}-#{$i} {
                @include  get-styles($direction,$i,$space,true);
            }
            .uni-#{$orientation}#{$direction}-n#{$i} {
                @include  get-styles($direction,$i,$space,false);
            }
        }
    }
}
uniapp/uni_modules/uni-scss/styles/setting/_styles.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,167 @@
/* #ifndef APP-NVUE */
$-color-white:#fff;
$-color-black:#000;
@mixin base-style($color) {
    color: #fff;
    background-color: $color;
    border-color: mix($-color-black, $color, 8%);
    &:not([hover-class]):active {
        background: mix($-color-black, $color, 10%);
        border-color: mix($-color-black, $color, 20%);
        color: $-color-white;
        outline: none;
    }
}
@mixin is-color($color) {
    @include base-style($color);
    &[loading] {
        @include base-style($color);
        &::before {
            margin-right:5px;
        }
    }
    &[disabled] {
      &,
        &[loading],
      &:not([hover-class]):active {
        color: $-color-white;
            border-color: mix(darken($color,10%), $-color-white);
        background-color: mix($color, $-color-white);
      }
    }
}
@mixin base-plain-style($color) {
    color:$color;
    background-color: mix($-color-white, $color, 90%);
    border-color: mix($-color-white, $color, 70%);
    &:not([hover-class]):active {
      background: mix($-color-white, $color, 80%);
      color: $color;
      outline: none;
        border-color: mix($-color-white, $color, 50%);
    }
}
@mixin is-plain($color){
    &[plain] {
        @include base-plain-style($color);
        &[loading] {
            @include base-plain-style($color);
            &::before {
                margin-right:5px;
            }
        }
        &[disabled] {
          &,
          &:active {
            color: mix($-color-white, $color, 40%);
            background-color: mix($-color-white, $color, 90%);
                border-color: mix($-color-white, $color, 80%);
          }
        }
    }
}
.uni-btn {
    margin: 5px;
    color: #393939;
    border:1px solid #ccc;
    font-size: 16px;
    font-weight: 200;
    background-color: #F9F9F9;
    // TODO æš‚时处理边框隐藏一边的问题
    overflow: visible;
    &::after{
        border: none;
    }
    &:not([type]),&[type=default] {
        color: #999;
        &[loading] {
            background: none;
            &::before {
                margin-right:5px;
            }
        }
        &[disabled]{
            color: mix($-color-white, #999, 60%);
          &,
            &[loading],
          &:active {
                color: mix($-color-white, #999, 60%);
            background-color: mix($-color-white,$-color-black , 98%);
                border-color: mix($-color-white,  #999, 85%);
          }
        }
        &[plain] {
            color: #999;
            background: none;
            border-color: $uni-border-1;
            &:not([hover-class]):active {
                background: none;
              color: mix($-color-white, $-color-black, 80%);
                border-color: mix($-color-white, $-color-black, 90%);
              outline: none;
            }
            &[disabled]{
              &,
                &[loading],
              &:active {
                background: none;
                    color: mix($-color-white, #999, 60%);
                    border-color: mix($-color-white,  #999, 85%);
              }
            }
        }
    }
    &:not([hover-class]):active {
      color: mix($-color-white, $-color-black, 50%);
    }
    &[size=mini] {
        font-size: 16px;
        font-weight: 200;
        border-radius: 8px;
    }
    &.uni-btn-small {
        font-size: 14px;
    }
    &.uni-btn-mini {
        font-size: 12px;
    }
    &.uni-btn-radius {
        border-radius: 999px;
    }
    &[type=primary] {
        @include is-color($uni-primary);
        @include is-plain($uni-primary)
    }
    &[type=success] {
        @include is-color($uni-success);
        @include is-plain($uni-success)
    }
    &[type=error] {
        @include is-color($uni-error);
        @include is-plain($uni-error)
    }
    &[type=warning] {
        @include is-color($uni-warning);
        @include is-plain($uni-warning)
    }
    &[type=info] {
        @include is-color($uni-info);
        @include is-plain($uni-info)
    }
}
/* #endif */
uniapp/uni_modules/uni-scss/styles/setting/_text.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
@mixin get-styles($k,$c) {
    @if $k == size or $k == weight{
        font-#{$k}:#{$c}
    }@else{
        #{$k}:#{$c}
    }
}
@each $key, $child in $uni-headings {
    /* #ifndef APP-NVUE */
    .uni-#{$key} {
        @each $k, $c in $child {
            @include get-styles($k,$c)
        }
    }
    /* #endif */
    /* #ifdef APP-NVUE */
    .container .uni-#{$key} {
        @each $k, $c in $child {
            @include get-styles($k,$c)
        }
    }
    /* #endif */
}
uniapp/uni_modules/uni-scss/styles/setting/_variables.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,146 @@
// @use "sass:math";
@import  '../tools/functions.scss';
// é—´è·åŸºç¡€å€æ•°
$uni-space-root: 2 !default;
// è¾¹æ¡†åŠå¾„默认值
$uni-radius-root:5px !default;
$uni-radius: () !default;
// è¾¹æ¡†åŠå¾„断点
$uni-radius: map-deep-merge(
  (
    0: 0,
        // TODO å½“前版本暂时不支持 sm å±žæ€§
    // 'sm': math.div($uni-radius-root, 2),
    null: $uni-radius-root,
    'lg': $uni-radius-root * 2,
    'xl': $uni-radius-root * 6,
    'pill': 9999px,
    'circle': 50%
  ),
  $uni-radius
);
// å­—体家族
$body-font-family: 'Roboto', sans-serif !default;
// æ–‡æœ¬
$heading-font-family: $body-font-family !default;
$uni-headings: () !default;
$letterSpacing: -0.01562em;
$uni-headings: map-deep-merge(
  (
    'h1': (
      size: 32px,
            weight: 300,
            line-height: 50px,
            // letter-spacing:-0.01562em
    ),
    'h2': (
      size: 28px,
      weight: 300,
      line-height: 40px,
      // letter-spacing: -0.00833em
    ),
    'h3': (
      size: 24px,
      weight: 400,
      line-height: 32px,
      // letter-spacing: normal
    ),
    'h4': (
      size: 20px,
      weight: 400,
      line-height: 30px,
      // letter-spacing: 0.00735em
    ),
    'h5': (
      size: 16px,
      weight: 400,
      line-height: 24px,
      // letter-spacing: normal
    ),
    'h6': (
      size: 14px,
      weight: 500,
      line-height: 18px,
      // letter-spacing: 0.0125em
    ),
    'subtitle': (
      size: 12px,
      weight: 400,
      line-height: 20px,
      // letter-spacing: 0.00937em
    ),
    'body': (
      font-size: 14px,
            font-weight: 400,
            line-height: 22px,
            // letter-spacing: 0.03125em
    ),
    'caption': (
      'size': 12px,
      'weight': 400,
      'line-height': 20px,
      // 'letter-spacing': 0.03333em,
      // 'text-transform': false
    )
  ),
  $uni-headings
);
// ä¸»è‰²
$uni-primary: #2979ff !default;
$uni-primary-disable:lighten($uni-primary,20%) !default;
$uni-primary-light: lighten($uni-primary,25%) !default;
// è¾…助色
// é™¤äº†ä¸»è‰²å¤–的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。
$uni-success: #18bc37 !default;
$uni-success-disable:lighten($uni-success,20%) !default;
$uni-success-light: lighten($uni-success,25%) !default;
$uni-warning: #f3a73f !default;
$uni-warning-disable:lighten($uni-warning,20%) !default;
$uni-warning-light: lighten($uni-warning,25%) !default;
$uni-error: #e43d33 !default;
$uni-error-disable:lighten($uni-error,20%) !default;
$uni-error-light: lighten($uni-error,25%) !default;
$uni-info: #8f939c !default;
$uni-info-disable:lighten($uni-info,20%) !default;
$uni-info-light: lighten($uni-info,25%) !default;
// ä¸­æ€§è‰²
// ä¸­æ€§è‰²ç”¨äºŽæ–‡æœ¬ã€èƒŒæ™¯å’Œè¾¹æ¡†é¢œè‰²ã€‚通过运用不同的中性色,来表现层次结构。
$uni-main-color: #3a3a3a !default;             // ä¸»è¦æ–‡å­—
$uni-base-color: #6a6a6a !default;            // å¸¸è§„文字
$uni-secondary-color: #909399 !default;    // æ¬¡è¦æ–‡å­—
$uni-extra-color: #c7c7c7 !default;            // è¾…助说明
// è¾¹æ¡†é¢œè‰²
$uni-border-1: #F0F0F0 !default;
$uni-border-2: #EDEDED !default;
$uni-border-3: #DCDCDC !default;
$uni-border-4: #B9B9B9 !default;
// å¸¸è§„色
$uni-black: #000000 !default;
$uni-white: #ffffff !default;
$uni-transparent: rgba($color: #000000, $alpha: 0) !default;
// èƒŒæ™¯è‰²
$uni-bg-color: #f7f7f7 !default;
/* æ°´å¹³é—´è· */
$uni-spacing-sm: 8px !default;
$uni-spacing-base: 15px !default;
$uni-spacing-lg: 30px !default;
// é˜´å½±
$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default;
$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default;
$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default;
// è’™ç‰ˆ
$uni-mask: rgba($color: #000000, $alpha: 0.4) !default;
uniapp/uni_modules/uni-scss/styles/tools/functions.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
// åˆå¹¶ map
@function map-deep-merge($parent-map, $child-map){
    $result: $parent-map;
    @each $key, $child in $child-map {
        $parent-has-key: map-has-key($result, $key);
        $parent-value: map-get($result, $key);
        $parent-type: type-of($parent-value);
        $child-type: type-of($child);
        $parent-is-map: $parent-type == map;
        $child-is-map: $child-type == map;
        @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){
            $result: map-merge($result, ( $key: $child ));
        }@else {
            $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) ));
        }
    }
    @return $result;
};
uniapp/uni_modules/uni-scss/theme.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
// é—´è·åŸºç¡€å€æ•°
$uni-space-root: 2;
// è¾¹æ¡†åŠå¾„默认值
$uni-radius-root:5px;
// ä¸»è‰²
$uni-primary: #2979ff;
// è¾…助色
$uni-success: #4cd964;
// è­¦å‘Šè‰²
$uni-warning: #f0ad4e;
// é”™è¯¯è‰²
$uni-error: #dd524d;
// æè¿°è‰²
$uni-info: #909399;
// ä¸­æ€§è‰²
$uni-main-color: #303133;
$uni-base-color: #606266;
$uni-secondary-color: #909399;
$uni-extra-color: #C0C4CC;
// èƒŒæ™¯è‰²
$uni-bg-color: #f5f5f5;
// è¾¹æ¡†é¢œè‰²
$uni-border-1: #DCDFE6;
$uni-border-2: #E4E7ED;
$uni-border-3: #EBEEF5;
$uni-border-4: #F2F6FC;
// å¸¸è§„色
$uni-black: #000000;
$uni-white: #ffffff;
$uni-transparent: rgba($color: #000000, $alpha: 0);
uniapp/uni_modules/uni-scss/variables.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
@import './styles/setting/_variables.scss';
// é—´è·åŸºç¡€å€æ•°
$uni-space-root: 2;
// è¾¹æ¡†åŠå¾„默认值
$uni-radius-root:5px;
// ä¸»è‰²
$uni-primary: #2979ff;
$uni-primary-disable:mix(#fff,$uni-primary,50%);
$uni-primary-light: mix(#fff,$uni-primary,80%);
// è¾…助色
// é™¤äº†ä¸»è‰²å¤–的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。
$uni-success: #18bc37;
$uni-success-disable:mix(#fff,$uni-success,50%);
$uni-success-light: mix(#fff,$uni-success,80%);
$uni-warning: #f3a73f;
$uni-warning-disable:mix(#fff,$uni-warning,50%);
$uni-warning-light: mix(#fff,$uni-warning,80%);
$uni-error: #e43d33;
$uni-error-disable:mix(#fff,$uni-error,50%);
$uni-error-light: mix(#fff,$uni-error,80%);
$uni-info: #8f939c;
$uni-info-disable:mix(#fff,$uni-info,50%);
$uni-info-light: mix(#fff,$uni-info,80%);
// ä¸­æ€§è‰²
// ä¸­æ€§è‰²ç”¨äºŽæ–‡æœ¬ã€èƒŒæ™¯å’Œè¾¹æ¡†é¢œè‰²ã€‚通过运用不同的中性色,来表现层次结构。
$uni-main-color: #3a3a3a;             // ä¸»è¦æ–‡å­—
$uni-base-color: #6a6a6a;            // å¸¸è§„文字
$uni-secondary-color: #909399;    // æ¬¡è¦æ–‡å­—
$uni-extra-color: #c7c7c7;            // è¾…助说明
// è¾¹æ¡†é¢œè‰²
$uni-border-1: #F0F0F0;
$uni-border-2: #EDEDED;
$uni-border-3: #DCDCDC;
$uni-border-4: #B9B9B9;
// å¸¸è§„色
$uni-black: #000000;
$uni-white: #ffffff;
$uni-transparent: rgba($color: #000000, $alpha: 0);
// èƒŒæ™¯è‰²
$uni-bg-color: #f7f7f7;
/* æ°´å¹³é—´è· */
$uni-spacing-sm: 8px;
$uni-spacing-base: 15px;
$uni-spacing-lg: 30px;
// é˜´å½±
$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5);
$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2);
$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5);
// è’™ç‰ˆ
$uni-mask: rgba($color: #000000, $alpha: 0.4);
uniapp/uni_modules/uni-transition/changelog.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
## 1.3.2(2023-05-04)
- ä¿®å¤ NVUE å¹³å°æŠ¥é”™çš„问题
## 1.3.1(2021-11-23)
- ä¿®å¤ init æ–¹æ³•初始化问题
## 1.3.0(2021-11-19)
- ä¼˜åŒ– ç»„ä»¶UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
- æ–‡æ¡£è¿ç§»ï¼Œè¯¦è§:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition)
## 1.2.1(2021-09-27)
- ä¿®å¤ init æ–¹æ³•不生效的 Bug
## 1.2.0(2021-07-30)
- ç»„件兼容 vue3,如何创建 vue3 é¡¹ç›®ï¼Œè¯¦è§ [uni-app é¡¹ç›®æ”¯æŒ vue3 ä»‹ç»](https://ask.dcloud.net.cn/article/37834)
## 1.1.1(2021-05-12)
- æ–°å¢ž ç¤ºä¾‹åœ°å€
- ä¿®å¤ ç¤ºä¾‹é¡¹ç›®ç¼ºå°‘组件的 Bug
## 1.1.0(2021-04-22)
- æ–°å¢ž é€šè¿‡æ–¹æ³•自定义动画
- æ–°å¢ž custom-class éž NVUE å¹³å°æ”¯æŒè‡ªå®šä¹‰ class å®šåˆ¶æ ·å¼
- ä¼˜åŒ– åŠ¨ç”»è§¦å‘é€»è¾‘ï¼Œä½¿åŠ¨ç”»æ›´æµç•…
- ä¼˜åŒ– æ”¯æŒå•独的动画类型
- ä¼˜åŒ– æ–‡æ¡£ç¤ºä¾‹
## 1.0.2(2021-02-05)
- è°ƒæ•´ä¸º uni_modules ç›®å½•规范
uniapp/uni_modules/uni-transition/components/uni-transition/createAnimation.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
// const defaultOption = {
//     duration: 300,
//     timingFunction: 'linear',
//     delay: 0,
//     transformOrigin: '50% 50% 0'
// }
// #ifdef APP-NVUE
const nvueAnimation = uni.requireNativePlugin('animation')
// #endif
class MPAnimation {
    constructor(options, _this) {
        this.options = options
        // åœ¨iOS10+QQ小程序平台下,传给原生的对象一定是个普通对象而不是Proxy对象,否则会报parameter should be Object instead of ProxyObject的错误
        this.animation = uni.createAnimation({
            ...options
        })
        this.currentStepAnimates = {}
        this.next = 0
        this.$ = _this
    }
    _nvuePushAnimates(type, args) {
        let aniObj = this.currentStepAnimates[this.next]
        let styles = {}
        if (!aniObj) {
            styles = {
                styles: {},
                config: {}
            }
        } else {
            styles = aniObj
        }
        if (animateTypes1.includes(type)) {
            if (!styles.styles.transform) {
                styles.styles.transform = ''
            }
            let unit = ''
            if(type === 'rotate'){
                unit = 'deg'
            }
            styles.styles.transform += `${type}(${args+unit}) `
        } else {
            styles.styles[type] = `${args}`
        }
        this.currentStepAnimates[this.next] = styles
    }
    _animateRun(styles = {}, config = {}) {
        let ref = this.$.$refs['ani'].ref
        if (!ref) return
        return new Promise((resolve, reject) => {
            nvueAnimation.transition(ref, {
                styles,
                ...config
            }, res => {
                resolve()
            })
        })
    }
    _nvueNextAnimate(animates, step = 0, fn) {
        let obj = animates[step]
        if (obj) {
            let {
                styles,
                config
            } = obj
            this._animateRun(styles, config).then(() => {
                step += 1
                this._nvueNextAnimate(animates, step, fn)
            })
        } else {
            this.currentStepAnimates = {}
            typeof fn === 'function' && fn()
            this.isEnd = true
        }
    }
    step(config = {}) {
        // #ifndef APP-NVUE
        this.animation.step(config)
        // #endif
        // #ifdef APP-NVUE
        this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config)
        this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin
        this.next++
        // #endif
        return this
    }
    run(fn) {
        // #ifndef APP-NVUE
        this.$.animationData = this.animation.export()
        this.$.timer = setTimeout(() => {
            typeof fn === 'function' && fn()
        }, this.$.durationTime)
        // #endif
        // #ifdef APP-NVUE
        this.isEnd = false
        let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref
        if(!ref) return
        this._nvueNextAnimate(this.currentStepAnimates, 0, fn)
        this.next = 0
        // #endif
    }
}
const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d',
    'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY',
    'translateZ'
]
const animateTypes2 = ['opacity', 'backgroundColor']
const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom']
animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => {
    MPAnimation.prototype[type] = function(...args) {
        // #ifndef APP-NVUE
        this.animation[type](...args)
        // #endif
        // #ifdef APP-NVUE
        this._nvuePushAnimates(type, args)
        // #endif
        return this
    }
})
export function createAnimation(option, _this) {
    if(!_this) return
    clearTimeout(_this.timer)
    return new MPAnimation(option, _this)
}
uniapp/uni_modules/uni-transition/components/uni-transition/uni-transition.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,286 @@
<template>
  <!-- #ifndef APP-NVUE -->
  <view v-show="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view>
  <!-- #endif -->
  <!-- #ifdef APP-NVUE -->
  <view v-if="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view>
  <!-- #endif -->
</template>
<script>
import { createAnimation } from './createAnimation'
/**
 * Transition è¿‡æ¸¡åŠ¨ç”»
 * @description ç®€å•过渡动画组件
 * @tutorial https://ext.dcloud.net.cn/plugin?id=985
 * @property {Boolean} show = [false|true] æŽ§åˆ¶ç»„件显示或隐藏
 * @property {Array|String} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] è¿‡æ¸¡åŠ¨ç”»ç±»åž‹
 *  @value fade æ¸é𐿏å‡ºè¿‡æ¸¡
 *  @value slide-top ç”±ä¸Šè‡³ä¸‹è¿‡æ¸¡
 *  @value slide-right ç”±å³è‡³å·¦è¿‡æ¸¡
 *  @value slide-bottom ç”±ä¸‹è‡³ä¸Šè¿‡æ¸¡
 *  @value slide-left ç”±å·¦è‡³å³è¿‡æ¸¡
 *  @value zoom-in ç”±å°åˆ°å¤§è¿‡æ¸¡
 *  @value zoom-out ç”±å¤§åˆ°å°è¿‡æ¸¡
 * @property {Number} duration è¿‡æ¸¡åŠ¨ç”»æŒç»­æ—¶é—´
 * @property {Object} styles ç»„件样式,同 css æ ·å¼ï¼Œæ³¨æ„å¸¦â€™-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`
 */
export default {
    name: 'uniTransition',
    emits:['click','change'],
    props: {
        show: {
            type: Boolean,
            default: false
        },
        modeClass: {
            type: [Array, String],
            default() {
                return 'fade'
            }
        },
        duration: {
            type: Number,
            default: 300
        },
        styles: {
            type: Object,
            default() {
                return {}
            }
        },
        customClass:{
            type: String,
            default: ''
        },
        onceRender:{
            type:Boolean,
            default:false
        },
    },
    data() {
        return {
            isShow: false,
            transform: '',
            opacity: 1,
            animationData: {},
            durationTime: 300,
            config: {}
        }
    },
    watch: {
        show: {
            handler(newVal) {
                if (newVal) {
                    this.open()
                } else {
                    // é¿å…ä¸Šæ¥å°±æ‰§è¡Œ close,导致动画错乱
                    if (this.isShow) {
                        this.close()
                    }
                }
            },
            immediate: true
        }
    },
    computed: {
        // ç”Ÿæˆæ ·å¼æ•°æ®
        stylesObject() {
            let styles = {
                ...this.styles,
                'transition-duration': this.duration / 1000 + 's'
            }
            let transform = ''
            for (let i in styles) {
                let line = this.toLine(i)
                transform += line + ':' + styles[i] + ';'
            }
            return transform
        },
        // åˆå§‹åŒ–动画条件
        transformStyles() {
            return 'transform:' + this.transform + ';' + 'opacity:' + this.opacity + ';' + this.stylesObject
        }
    },
    created() {
        // åŠ¨ç”»é»˜è®¤é…ç½®
        this.config = {
            duration: this.duration,
            timingFunction: 'ease',
            transformOrigin: '50% 50%',
            delay: 0
        }
        this.durationTime = this.duration
    },
    methods: {
        /**
         *  ref è§¦å‘ åˆå§‹åŒ–动画
         */
        init(obj = {}) {
            if (obj.duration) {
                this.durationTime = obj.duration
            }
            this.animation = createAnimation(Object.assign(this.config, obj),this)
        },
        /**
         * ç‚¹å‡»ç»„件触发回调
         */
        onClick() {
            this.$emit('click', {
                detail: this.isShow
            })
        },
        /**
         * ref è§¦å‘ åŠ¨ç”»åˆ†ç»„
         * @param {Object} obj
         */
        step(obj, config = {}) {
            if (!this.animation) return
            for (let i in obj) {
                try {
                    if(typeof obj[i] === 'object'){
                        this.animation[i](...obj[i])
                    }else{
                        this.animation[i](obj[i])
                    }
                } catch (e) {
                    console.error(`方法 ${i} ä¸å­˜åœ¨`)
                }
            }
            this.animation.step(config)
            return this
        },
        /**
         *  ref è§¦å‘ æ‰§è¡ŒåŠ¨ç”»
         */
        run(fn) {
            if (!this.animation) return
            this.animation.run(fn)
        },
        // å¼€å§‹è¿‡åº¦åŠ¨ç”»
        open() {
            clearTimeout(this.timer)
            this.transform = ''
            this.isShow = true
            let { opacity, transform } = this.styleInit(false)
            if (typeof opacity !== 'undefined') {
                this.opacity = opacity
            }
            this.transform = transform
            // ç¡®ä¿åŠ¨æ€æ ·å¼å·²ç»ç”Ÿæ•ˆåŽï¼Œæ‰§è¡ŒåŠ¨ç”»ï¼Œå¦‚æžœä¸åŠ  nextTick ï¼Œä¼šå¯¼è‡´ wx åŠ¨ç”»æ‰§è¡Œå¼‚å¸¸
            this.$nextTick(() => {
                // TODO å®šæ—¶å™¨ä¿è¯åŠ¨ç”»å®Œå…¨æ‰§è¡Œï¼Œç›®å‰æœ‰äº›é—®é¢˜ï¼ŒåŽé¢ä¼šå–æ¶ˆå®šæ—¶å™¨
                this.timer = setTimeout(() => {
                    this.animation = createAnimation(this.config, this)
                    this.tranfromInit(false).step()
                    this.animation.run()
                    this.$emit('change', {
                        detail: this.isShow
                    })
                }, 20)
            })
        },
        // å…³é—­è¿‡åº¦åŠ¨ç”»
        close(type) {
            if (!this.animation) return
            this.tranfromInit(true)
                .step()
                .run(() => {
                    this.isShow = false
                    this.animationData = null
                    this.animation = null
                    let { opacity, transform } = this.styleInit(false)
                    this.opacity = opacity || 1
                    this.transform = transform
                    this.$emit('change', {
                        detail: this.isShow
                    })
                })
        },
        // å¤„理动画开始前的默认样式
        styleInit(type) {
            let styles = {
                transform: ''
            }
            let buildStyle = (type, mode) => {
                if (mode === 'fade') {
                    styles.opacity = this.animationType(type)[mode]
                } else {
                    styles.transform += this.animationType(type)[mode] + ' '
                }
            }
            if (typeof this.modeClass === 'string') {
                buildStyle(type, this.modeClass)
            } else {
                this.modeClass.forEach(mode => {
                    buildStyle(type, mode)
                })
            }
            return styles
        },
        // å¤„理内置组合动画
        tranfromInit(type) {
            let buildTranfrom = (type, mode) => {
                let aniNum = null
                if (mode === 'fade') {
                    aniNum = type ? 0 : 1
                } else {
                    aniNum = type ? '-100%' : '0'
                    if (mode === 'zoom-in') {
                        aniNum = type ? 0.8 : 1
                    }
                    if (mode === 'zoom-out') {
                        aniNum = type ? 1.2 : 1
                    }
                    if (mode === 'slide-right') {
                        aniNum = type ? '100%' : '0'
                    }
                    if (mode === 'slide-bottom') {
                        aniNum = type ? '100%' : '0'
                    }
                }
                this.animation[this.animationMode()[mode]](aniNum)
            }
            if (typeof this.modeClass === 'string') {
                buildTranfrom(type, this.modeClass)
            } else {
                this.modeClass.forEach(mode => {
                    buildTranfrom(type, mode)
                })
            }
            return this.animation
        },
        animationType(type) {
            return {
                fade: type ? 1 : 0,
                'slide-top': `translateY(${type ? '0' : '-100%'})`,
                'slide-right': `translateX(${type ? '0' : '100%'})`,
                'slide-bottom': `translateY(${type ? '0' : '100%'})`,
                'slide-left': `translateX(${type ? '0' : '-100%'})`,
                'zoom-in': `scaleX(${type ? 1 : 0.8}) scaleY(${type ? 1 : 0.8})`,
                'zoom-out': `scaleX(${type ? 1 : 1.2}) scaleY(${type ? 1 : 1.2})`
            }
        },
        // å†…置动画类型与实际动画对应字典
        animationMode() {
            return {
                fade: 'opacity',
                'slide-top': 'translateY',
                'slide-right': 'translateX',
                'slide-bottom': 'translateY',
                'slide-left': 'translateX',
                'zoom-in': 'scale',
                'zoom-out': 'scale'
            }
        },
        // é©¼å³°è½¬ä¸­æ¨ªçº¿
        toLine(name) {
            return name.replace(/([A-Z])/g, '-$1').toLowerCase()
        }
    }
}
</script>
<style></style>
uniapp/uni_modules/uni-transition/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
{
  "id": "uni-transition",
  "displayName": "uni-transition è¿‡æ¸¡åŠ¨ç”»",
  "version": "1.3.2",
  "description": "元素的简单过渡动画",
  "keywords": [
    "uni-ui",
    "uniui",
    "动画",
    "过渡",
    "过渡动画"
],
  "repository": "https://github.com/dcloudio/uni-ui",
  "engines": {
    "HBuilderX": ""
  },
  "directories": {
    "example": "../../temps/example_temps"
  },
"dcloudext": {
    "sale": {
      "regular": {
        "price": "0.00"
      },
      "sourcecode": {
        "price": "0.00"
      }
    },
    "contact": {
      "qq": ""
    },
    "declaration": {
      "ads": "无",
      "data": "无",
      "permissions": "无"
    },
    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
    "type": "component-vue"
  },
  "uni_modules": {
    "dependencies": ["uni-scss"],
    "encrypt": [],
    "platforms": {
      "cloud": {
        "tcb": "y",
        "aliyun": "y"
      },
      "client": {
        "App": {
          "app-vue": "y",
          "app-nvue": "y"
        },
        "H5-mobile": {
          "Safari": "y",
          "Android Browser": "y",
          "微信浏览器(Android)": "y",
          "QQ浏览器(Android)": "y"
        },
        "H5-pc": {
          "Chrome": "y",
          "IE": "y",
          "Edge": "y",
          "Firefox": "y",
          "Safari": "y"
        },
        "小程序": {
          "微信": "y",
          "阿里": "y",
          "百度": "y",
          "字节跳动": "y",
          "QQ": "y"
        },
        "快应用": {
          "华为": "u",
          "联盟": "u"
        },
        "Vue": {
            "vue2": "y",
            "vue3": "y"
        }
      }
    }
  }
}
uniapp/uni_modules/uni-transition/readme.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
## Transition è¿‡æ¸¡åŠ¨ç”»
> **组件名:uni-transition**
> ä»£ç å—: `uTransition`
元素过渡动画
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition)
#### å¦‚使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui äº¤æµç¾¤ï¼š871950839
uniapp/utils/getClipboard.js
@@ -2,10 +2,9 @@
  import request from './http.js'
  import utils from './utils.js'
  import clipboard from "../js_sdk/dc-clipboard/clipboard.js"
  function getclick(callback) {
  //获取剪贴板内容
  uni.getClipboardData({
      success: res => {
        console.log(res, '======================================================');
@@ -21,7 +20,6 @@
          })
        }else{
          getApp().globalData.hasMode = false
          console.log('内部复制');
        }
      }
    })
@@ -31,7 +29,7 @@
  function updatePopup(dataInfo) {
    var data = dataInfo.goods;
    // å¼¹çª—遮罩层
    let maskLayers = new plus.nativeObj.View("maskLayers", { //先创建遮罩层
    var maskLayers = new plus.nativeObj.View("maskLayers", { //先创建遮罩层
      top: '0px',
      left: '0px',
      height: '100%',
@@ -56,7 +54,7 @@
      let popupViewHeight = popupViewWidth + uni.upx2px(390);
      sLeft = (data.originalPrice.toString().length + 1) * uni.upx2px(30);
      // å¼¹çª—内容
      var clipViews = new plus.nativeObj.View("clipViews", { //创建底部图标菜单
    let clipViews = new plus.nativeObj.View("clipViews", { //创建底部图标菜单
        tag: "rect",
        top: (screenHeight - popupViewHeight) / 2 + "px",
        left: (screenWidth - popupViewWidth) / 2 + "px",
@@ -297,7 +295,7 @@
              })
            }else{
              uni.navigateTo({
                url: '/pages/goods/goodsDetail?info=' + encodeURIComponent(JSON.stringify(data))
                url: '/pages/goods/goodsDetail?proform=clipboard&info=' + encodeURIComponent(JSON.stringify(data))
              })
            }
            getApp().globalData.hasMode = false