diff --git a/vue/src/components/Message/index.js b/vue/element-ui-personal/components/Message/index.js similarity index 97% rename from vue/src/components/Message/index.js rename to vue/element-ui-personal/components/Message/index.js index e7a00e2..ecb2913 100644 --- a/vue/src/components/Message/index.js +++ b/vue/element-ui-personal/components/Message/index.js @@ -2,7 +2,6 @@ import Vue from 'vue' import Main from './main.vue' import {PopupManager} from 'element-ui/lib/utils/popup' import {isVNode} from 'element-ui/lib/utils/vdom' -import {isEmpty} from "@/utils" let MessageConstructor = Vue.extend(Main) @@ -18,7 +17,7 @@ const Message = function (options) { if (typeof options === 'string') { options = {message: options} } - if (isEmpty(options.type)) { + if (!options.type) { options.type = 'info' } const group = options.type + '|' + options.message diff --git a/vue/src/components/Message/main.vue b/vue/element-ui-personal/components/Message/main.vue similarity index 100% rename from vue/src/components/Message/main.vue rename to vue/element-ui-personal/components/Message/main.vue diff --git a/vue/element-ui-personal/components/Select/Select.vue b/vue/element-ui-personal/components/Select/Select.vue new file mode 100644 index 0000000..e1b90c0 --- /dev/null +++ b/vue/element-ui-personal/components/Select/Select.vue @@ -0,0 +1,884 @@ + + + diff --git a/vue/element-ui-personal/components/Select/SelectDropdown.vue b/vue/element-ui-personal/components/Select/SelectDropdown.vue new file mode 100644 index 0000000..989e59c --- /dev/null +++ b/vue/element-ui-personal/components/Select/SelectDropdown.vue @@ -0,0 +1,47 @@ + + + diff --git a/vue/element-ui-personal/mixins/vue-popper.js b/vue/element-ui-personal/mixins/vue-popper.js new file mode 100644 index 0000000..4bdea74 --- /dev/null +++ b/vue/element-ui-personal/mixins/vue-popper.js @@ -0,0 +1,163 @@ +import {PopupManager} from 'element-ui/lib/utils/popup' + +const PopperJS = require('@popperjs/core') + +const stop = e => e.stopPropagation() + +/** + * @param {HTMLElement} [reference=$refs.reference] - The reference element used to position the popper. + * @param {HTMLElement} [popper=$refs.popper] - The HTML element used as popper, or a configuration used to generate the popper. + * @param {String} [placement=button] - Placement of the popper accepted values: top(-start, -end), right(-start, -end), bottom(-start, -end), left(-start, -end) + * @param {Number} [offset=0] - Amount of pixels the popper will be shifted (can be negative). + * @param {Boolean} [visible=false] Visibility of the popup element. + * @param {Boolean} [visible-arrow=false] Visibility of the arrow, no style. + */ +export default { + props: { + transformOrigin: { + type: [Boolean, String], + default: true + }, + placement: { + type: String, + default: 'bottom' + }, + boundariesPadding: { + type: Number, + default: 5 + }, + reference: {}, + popper: {}, + offset: { + type: Number, + default: 12 + }, + value: Boolean, + visibleArrow: { + type: Boolean, + default: true + }, + arrowOffset: { + type: Number, + default: 35 + }, + appendToBody: Boolean, + popperOptions: { + type: Object, + default: () => ({modifiers: []}) + } + }, + + data() { + return { + showPopper: this.value + } + }, + + watch: { + value: { + immediate: true, + handler(val) { + if (this.disabled) return + val && this.updatePopper() + this.showPopper = val + this.$emit('input', val) + } + } + }, + + methods: { + createPopper() { + if (!/^(top|bottom|left|right)(-start|-end)?$/g.test(this.placement)) { + return + } + + const options = this.popperOptions + const popper = this.popperElm = this.popperElm || this.popper || this.$refs.popper + let reference = this.referenceElm = this.referenceElm || this.reference || this.$refs.reference + + if (!reference && this.$slots.reference && this.$slots.reference[0]) { + reference = this.referenceElm = this.$slots.reference[0].elm + } + + if (!popper || !reference) return + + if (this.popperJS && this.popperJS.hasOwnProperty('destroy')) { + this.popperJS.destroy() + } + + if (this.appendToBody) document.body.appendChild(this.popperElm) + if (this.visibleArrow) this.setArrow() + this.setOffset() + + options.placement = this.placement + options.onFirstUpdate = () => { + this.$emit('created', this) + this.$nextTick(this.updatePopper) + } + + + this.popperJS = PopperJS.createPopper(reference, popper, options) + + popper.style.zIndex = PopupManager.nextZIndex() + this.popperElm.addEventListener('click', stop) + }, + + updatePopper() { + const popper = this.popperJS + + if (!popper) return this.createPopper() + + popper.update() + this.popperElm.style.zIndex = PopupManager.nextZIndex() + }, + + doDestroy(forceDestroy) { + if (!this.popperJS || (this.showPopper && !forceDestroy)) return + this.popperJS.destroy() + this.popperJS = null + }, + + setArrow() { + if (this.appended) return + this.appended = true + + const arrow = document.createElement('div') + arrow.className = 'popper__arrow' + arrow.setAttribute('data-popper-arrow', '') + + this.popperElm.appendChild(arrow) + + const modifier = this.popperOptions.modifiers.find(modifier => modifier.name === 'arrow'), + options = {element: '[data-popper-arrow]', padding: this.arrowOffset} + + if (!modifier) { + this.popperOptions.modifiers.push({name: 'arrow', options}) + } + else modifier.options = options + }, + + setOffset() { + const modifier = this.popperOptions.modifiers.find(modifier => modifier.name === 'offset'), + options = {offset: [0, this.offset]} + + if (!modifier) { + this.popperOptions.modifiers.push({name: 'offset', options}) + } + else modifier.options = options + } + }, + + beforeDestroy() { + this.doDestroy(true) + if (this.popperElm && this.popperElm.parentNode === document.body) { + this.popperElm.removeEventListener('click', stop) + document.body.removeChild(this.popperElm) + } + }, + + // call destroy in keep-alive mode + deactivated() { + this.$options.beforeDestroy[0].call(this) + } +} diff --git a/vue/element-ui-personal/style/index.scss b/vue/element-ui-personal/style/index.scss new file mode 100644 index 0000000..356699a --- /dev/null +++ b/vue/element-ui-personal/style/index.scss @@ -0,0 +1,2 @@ +@import "./message.scss"; +@import "./popper.scss"; diff --git a/vue/element-ui-personal/style/message.scss b/vue/element-ui-personal/style/message.scss new file mode 100644 index 0000000..6336254 --- /dev/null +++ b/vue/element-ui-personal/style/message.scss @@ -0,0 +1,58 @@ +.el-message { + overflow: visible; + + &__badge { + animation: el-message-badge .42s; + padding: 4px 8px; + position: absolute; + box-shadow: 0 1px 3px rgba(#000, .2), 0 1px 1px rgba(#000, .14), 0 2px 1px -1px rgba(#000, .12); + background-color: $--color-danger; + color: #fff; + border-radius: 4px; + top: -10px; + left: -10px; + font-size: 12px; + line-height: 12px; + } + + &__progress { + z-index: -1; + position: absolute; + height: 3px; + bottom: 0; + left: 10px; + right: 10px; + animation: el-message-progress linear; + background: currentColor; + opacity: .3; + transform-origin: 0 50%; + transform: scaleX(0); + } +} + +@keyframes el-message-badge { + 15% { + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg) + } + 30% { + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg) + } + 45% { + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg) + } + 60% { + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg) + } + 75% { + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg) + } +} + +@keyframes el-message-progress { + 0% { + transform: scaleX(1) + } + 100% { + transform: scaleX(0) + } +} diff --git a/vue/element-ui-personal/style/popper.scss b/vue/element-ui-personal/style/popper.scss new file mode 100644 index 0000000..4640795 --- /dev/null +++ b/vue/element-ui-personal/style/popper.scss @@ -0,0 +1,98 @@ +@include b(popper) { + .popper__arrow, + .popper__arrow::after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + } + + .popper__arrow { + border-width: $--popover-arrow-size; + filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03)) + } + + .popper__arrow::after { + content: " "; + border-width: $--popover-arrow-size; + } + + &[data-popper-placement^="top"] { + margin-bottom: #{$--popover-arrow-size + 6}; + } + + &[data-popper-placement^="top"] .popper__arrow { + bottom: -$--popover-arrow-size; + left: 50%; + margin-right: #{$--tooltip-arrow-size / 2}; + border-top-color: $--popover-border-color; + border-bottom-width: 0; + + &::after { + bottom: 1px; + margin-left: -$--popover-arrow-size; + border-top-color: $--popover-background-color; + border-bottom-width: 0; + } + } + + &[data-popper-placement^="bottom"] { + margin-top: #{$--popover-arrow-size + 6}; + } + + &[data-popper-placement^="bottom"] .popper__arrow { + top: -$--popover-arrow-size; + left: 50%; + margin-right: #{$--tooltip-arrow-size / 2}; + border-top-width: 0; + border-bottom-color: $--popover-border-color; + + &::after { + top: 1px; + margin-left: -$--popover-arrow-size; + border-top-width: 0; + border-bottom-color: $--popover-background-color; + } + } + + &[data-popper-placement^="right"] { + margin-left: #{$--popover-arrow-size + 6}; + } + + &[data-popper-placement^="right"] .popper__arrow { + top: 50%; + left: -$--popover-arrow-size; + margin-bottom: #{$--tooltip-arrow-size / 2}; + border-right-color: $--popover-border-color; + border-left-width: 0; + + &::after { + bottom: -$--popover-arrow-size; + left: 1px; + border-right-color: $--popover-background-color; + border-left-width: 0; + } + } + + &[data-popper-placement^="left"] { + margin-right: #{$--popover-arrow-size + 6}; + } + + &[data-popper-placement^="left"] .popper__arrow { + top: 50%; + right: -$--popover-arrow-size; + margin-bottom: #{$--tooltip-arrow-size / 2}; + border-right-width: 0; + border-left-color: $--popover-border-color; + + &::after { + right: 1px; + bottom: -$--popover-arrow-size; + margin-left: -$--popover-arrow-size; + border-right-width: 0; + border-left-color: $--popover-background-color; + } + } +} diff --git a/vue/package-lock.json b/vue/package-lock.json index c21f9a8..9b2193d 100644 --- a/vue/package-lock.json +++ b/vue/package-lock.json @@ -1134,6 +1134,11 @@ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "dev": true }, + "@popperjs/core": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.4.0.tgz", + "integrity": "sha512-NMrDy6EWh9TPdSRiHmHH2ye1v5U0gBD7pRYwSwJvomx7Bm4GG04vu63dYiVzebLOx2obPpJugew06xVP0Nk7hA==" + }, "@soda/friendly-errors-webpack-plugin": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.1.tgz", diff --git a/vue/package.json b/vue/package.json index c27f26a..48c0d59 100644 --- a/vue/package.json +++ b/vue/package.json @@ -8,6 +8,7 @@ "svgo": "svgo -f src/assets/icons/svg --config=src/assets/icons/svgo.yml" }, "dependencies": { + "@popperjs/core": "^2.4.0", "axios": "^0.19.2", "core-js": "^3.6.5", "decimal.js": "^10.2.0", diff --git a/vue/src/assets/styles/element-ui.scss b/vue/src/assets/styles/element-ui.scss index 011e86c..bc48d07 100644 --- a/vue/src/assets/styles/element-ui.scss +++ b/vue/src/assets/styles/element-ui.scss @@ -73,35 +73,6 @@ @include deep-shadow; @include max-mobile-width; border-width: 0; - overflow: visible; - - &__badge { - animation: el-message-badge .42s; - padding: 4px 8px; - position: absolute; - box-shadow: 0 1px 3px rgba(#000, .2), 0 1px 1px rgba(#000, .14), 0 2px 1px -1px rgba(#000, .12); - background-color: $--color-danger; - color: #fff; - border-radius: 4px; - top: -10px; - left: -10px; - font-size: 12px; - line-height: 12px; - } - - &__progress { - z-index: -1; - position: absolute; - height: 3px; - bottom: 0; - left: 10px; - right: 10px; - animation: el-message-progress linear; - background: currentColor; - opacity: .3; - transform-origin: 0 50%; - transform: scaleX(0); - } .el-message__icon, .el-message__content { color: #fff !important; @@ -225,33 +196,6 @@ width: 100% !important; } -@keyframes el-message-badge { - 15% { - transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg) - } - 30% { - transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg) - } - 45% { - transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg) - } - 60% { - transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg) - } - 75% { - transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg) - } -} - -@keyframes el-message-progress { - 0% { - transform: scaleX(1) - } - 100% { - transform: scaleX(0) - } -} - diff --git a/vue/src/assets/styles/index.scss b/vue/src/assets/styles/index.scss index d2bd9dd..2a35800 100644 --- a/vue/src/assets/styles/index.scss +++ b/vue/src/assets/styles/index.scss @@ -3,6 +3,7 @@ @import 'display'; @import "transition"; @import "element-ui"; +@import "~@ele/style/index.scss"; @import "nprogress"; body { diff --git a/vue/src/config/request.js b/vue/src/config/request.js index b535e88..f051104 100644 --- a/vue/src/config/request.js +++ b/vue/src/config/request.js @@ -1,7 +1,7 @@ import axios from 'axios' import {apiPrefix} from '@/config' import {MessageBox, Notification} from 'element-ui' -import Message from '@/components/Message' +import Message from '@ele/components/Message' import store from '@/store' const service = axios.create({ diff --git a/vue/src/main.js b/vue/src/main.js index 8a9cf6d..8a5ebdc 100644 --- a/vue/src/main.js +++ b/vue/src/main.js @@ -12,11 +12,16 @@ import * as filters from './filter' import BottomTip from '@/components/BottomTip' import Guide from '@/components/Guide' import ImageViewer from '@/components/ImageViewer' -import Message from '@/components/Message' +import Message from '@ele/components/Message' +import Select from '@ele/components/Select/Select' import PuzzleVerify from '@/components/PuzzleVerify' import Signature from '@/components/SignautreBoard' +//popper老是弹,我还不知道咋整,只能这样,吔屎啦 +console.warn = () => ({}) + Vue.use(Element) +Vue.component('el-select', Select) //注册过滤器 Object.keys(filters).forEach(key => { diff --git a/vue/src/utils/message.js b/vue/src/utils/message.js index 25f8208..cfbfee4 100644 --- a/vue/src/utils/message.js +++ b/vue/src/utils/message.js @@ -1,4 +1,4 @@ -import Message from '@/components/Message' +import Message from '@ele/components/Message' import {MessageBox} from 'element-ui' import {isEmpty} from "@/utils" diff --git a/vue/vue.config.js b/vue/vue.config.js index 51205b7..b161fe2 100644 --- a/vue/vue.config.js +++ b/vue/vue.config.js @@ -45,7 +45,8 @@ module.exports = { name: settings.title, resolve: { alias: { - '@': resolve('src') + '@': resolve('src'), + '@ele': resolve('element-ui-personal'), } }, plugins: [