vuetify
Version:
Vue.js 2 Semantic Component Framework
85 lines (71 loc) • 2.09 kB
JavaScript
import { intToHex } from '../../../util/colorUtils'
import * as Theme from '../../../util/theme'
export default {
data: () => ({
style: null
}),
computed: {
parsedTheme () {
return Theme.parse(this.$vuetify.theme)
}
},
watch: {
parsedTheme () {
this.applyTheme()
}
},
created () {
if (typeof document === 'undefined' && this.$ssrContext) {
if (!this.$ssrContext._styles) this.$ssrContext._styles = {}
this.$ssrContext._styles['vuetify-theme-stylesheet'] = {
ids: ['vuetify-theme-stylesheet'],
css: this.genColors(this.parsedTheme),
media: ''
}
return
}
this.genStyle()
this.applyTheme()
},
methods: {
applyTheme () {
this.style.innerHTML = this.genColors(this.parsedTheme)
},
genColors (theme) {
let css
if (this.$vuetify.options.themeCache != null) {
css = this.$vuetify.options.themeCache.get(theme)
if (css != null) return css
}
const colors = Object.keys(theme)
css = `a { color: ${intToHex(theme.primary)}; }`
for (let i = 0; i < colors.length; ++i) {
const name = colors[i]
const value = theme[name]
if (this.$vuetify.options.themeVariations.includes(name)) {
css += Theme.genVariations(name, value).join('')
} else {
css += Theme.genBaseColor(name, value)
}
}
if (this.$vuetify.options.minifyTheme != null) {
css = this.$vuetify.options.minifyTheme(css)
}
if (this.$vuetify.options.themeCache != null) {
this.$vuetify.options.themeCache.set(theme, css)
}
return css
},
genStyle () {
let style = document.querySelector('[data-vue-ssr-id=vuetify-theme-stylesheet]') ||
document.getElementById('vuetify-theme-stylesheet')
if (!style) {
style = document.createElement('style')
style.type = 'text/css'
style.id = 'vuetify-theme-stylesheet'
document.head.appendChild(style)
}
this.style = style
}
}
}