-
-
-
+
@@ -121,20 +119,12 @@ export default {
.handle-button {
position: absolute;
left: -48px;
- border-radius: 4px 0 0 4px !important;
+ border-radius: 6px 0 0 6px !important;
width: 48px;
height: 48px;
- background: #1890ff;
- cursor: pointer;
pointer-events: auto;
z-index: 0;
+ font-size: 24px;
text-align: center;
- color: #fff;
- line-height: 48px;
-
- i {
- font-size: 24px;
- line-height: 48px;
- }
}
diff --git a/src/components/ThemePicker/index.vue b/src/components/ThemePicker/index.vue
index be3a573a..4f55a717 100644
--- a/src/components/ThemePicker/index.vue
+++ b/src/components/ThemePicker/index.vue
@@ -19,12 +19,21 @@ export default {
}
},
watch: {
- theme(val) {
+ async theme(val) {
const oldVal = this.theme
if (typeof val !== 'string') return
const themeCluster = this.getThemeCluster(val.replace('#', ''))
const originalCluster = this.getThemeCluster(oldVal.replace('#', ''))
console.log(themeCluster, originalCluster)
+
+ const $message = this.$message({
+ message: ' Compiling the theme',
+ customClass: 'theme-message',
+ type: 'success',
+ duration: 0,
+ iconClass: 'el-icon-loading'
+ })
+
const getHandler = (variable, id) => {
return () => {
const originalCluster = this.getThemeCluster(ORIGINAL_THEME.replace('#', ''))
@@ -40,15 +49,15 @@ export default {
}
}
- const chalkHandler = getHandler('chalk', 'chalk-style')
-
if (!this.chalk) {
const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`
- this.getCSSString(url, chalkHandler, 'chalk')
- } else {
- chalkHandler()
+ await this.getCSSString(url, 'chalk')
}
+ const chalkHandler = getHandler('chalk', 'chalk-style')
+
+ chalkHandler()
+
const styles = [].slice.call(document.querySelectorAll('style'))
.filter(style => {
const text = style.innerText
@@ -59,39 +68,32 @@ export default {
if (typeof innerText !== 'string') return
style.innerText = this.updateStyle(innerText, originalCluster, themeCluster)
})
- this.$message({
- message: '换肤成功',
- type: 'success'
- })
+
+ $message.close()
}
},
methods: {
updateStyle(style, oldCluster, newCluster) {
- const colorOverrides = [] // only capture color overides
+ let newStyle = style
oldCluster.forEach((color, index) => {
- const value = newCluster[index]
- const color_plain = color.replace(/([()])/g, '\\$1')
- const repl = new RegExp(`(^|})([^{]+{[^{}]+)${color_plain}\\b([^}]*)(?=})`, 'gi')
- const nestRepl = new RegExp(color_plain, 'ig') // for greed matching before the 'color'
- let v
- while ((v = repl.exec(style))) {
- colorOverrides.push(v[2].replace(nestRepl, value) + value + v[3] + '}') // '}' not captured in the regexp repl to reserve it as locator-boundary
- }
+ newStyle = newStyle.replace(new RegExp(color, 'ig'), newCluster[index])
})
- return colorOverrides.join('')
+ return newStyle
},
- getCSSString(url, callback, variable) {
- const xhr = new XMLHttpRequest()
- xhr.onreadystatechange = () => {
- if (xhr.readyState === 4 && xhr.status === 200) {
- this[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, '')
- callback()
+ getCSSString(url, variable) {
+ return new Promise(resolve => {
+ const xhr = new XMLHttpRequest()
+ xhr.onreadystatechange = () => {
+ if (xhr.readyState === 4 && xhr.status === 200) {
+ this[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, '')
+ resolve()
+ }
}
- }
- xhr.open('GET', url)
- xhr.send()
+ xhr.open('GET', url)
+ xhr.send()
+ })
},
getThemeCluster(theme) {
@@ -143,10 +145,14 @@ export default {