2018-10-02 11:43:58 -07:00
|
|
|
import { rgb2hex } from '../../services/color_convert/color_convert.js'
|
|
|
|
import ColorInput from '../color_input/color_input.vue'
|
|
|
|
import OpacityInput from '../opacity_input/opacity_input.vue'
|
|
|
|
import StyleSetter from '../../services/style_setter/style_setter.js'
|
2017-11-20 12:45:09 -08:00
|
|
|
|
2017-01-16 09:57:03 -08:00
|
|
|
export default {
|
2017-02-17 09:21:02 -08:00
|
|
|
data () {
|
|
|
|
return {
|
|
|
|
availableStyles: [],
|
2017-11-17 07:24:42 -08:00
|
|
|
selected: this.$store.state.config.theme,
|
2018-07-04 05:25:40 -07:00
|
|
|
invalidThemeImported: false,
|
2017-11-17 07:24:42 -08:00
|
|
|
bgColorLocal: '',
|
2018-10-02 11:43:58 -07:00
|
|
|
bgOpacityLocal: 0,
|
2018-04-07 11:58:29 -07:00
|
|
|
btnColorLocal: '',
|
2018-10-02 11:43:58 -07:00
|
|
|
btnOpacityLocal: '',
|
|
|
|
|
2017-11-17 07:24:42 -08:00
|
|
|
textColorLocal: '',
|
2018-04-01 12:07:25 -07:00
|
|
|
linkColorLocal: '',
|
2018-10-02 11:43:58 -07:00
|
|
|
|
|
|
|
panelColorLocal: undefined,
|
|
|
|
panelOpacityLocal: undefined,
|
|
|
|
topBarColorLocal: undefined,
|
|
|
|
topBarOpacityLocal: undefined,
|
|
|
|
|
2018-04-07 16:39:39 -07:00
|
|
|
redColorLocal: '',
|
|
|
|
blueColorLocal: '',
|
|
|
|
greenColorLocal: '',
|
|
|
|
orangeColorLocal: '',
|
2018-10-02 11:43:58 -07:00
|
|
|
|
2018-04-07 16:39:39 -07:00
|
|
|
btnRadiusLocal: '',
|
2018-04-14 21:25:59 -07:00
|
|
|
inputRadiusLocal: '',
|
2018-04-07 16:39:39 -07:00
|
|
|
panelRadiusLocal: '',
|
|
|
|
avatarRadiusLocal: '',
|
|
|
|
avatarAltRadiusLocal: '',
|
|
|
|
attachmentRadiusLocal: '',
|
|
|
|
tooltipRadiusLocal: ''
|
2017-02-17 09:21:02 -08:00
|
|
|
}
|
|
|
|
},
|
2017-01-16 09:57:03 -08:00
|
|
|
created () {
|
|
|
|
const self = this
|
2017-11-17 07:24:42 -08:00
|
|
|
|
|
|
|
window.fetch('/static/styles.json')
|
2017-01-16 09:57:03 -08:00
|
|
|
.then((data) => data.json())
|
2017-11-17 07:24:42 -08:00
|
|
|
.then((themes) => {
|
|
|
|
self.availableStyles = themes
|
|
|
|
})
|
|
|
|
},
|
2017-11-18 03:13:51 -08:00
|
|
|
mounted () {
|
2018-10-02 11:43:58 -07:00
|
|
|
this.normalizeLocalState(this.$store.state.config.customTheme)
|
|
|
|
},
|
|
|
|
computed: {
|
|
|
|
currentTheme () {
|
|
|
|
return {
|
|
|
|
colors: {
|
|
|
|
bg: this.bgColorLocal,
|
|
|
|
fg: this.textColorLocal,
|
|
|
|
panel: this.panelColorLocal,
|
|
|
|
topBar: this.topBarColorLocal,
|
|
|
|
btn: this.btnColorLocal,
|
|
|
|
link: this.linkColorLocal,
|
|
|
|
cRed: this.redColorLocal,
|
|
|
|
cBlue: this.blueColorLocal,
|
|
|
|
cGreen: this.greenColorLocal,
|
|
|
|
cOrange: this.orangeColorLocal
|
|
|
|
},
|
|
|
|
radii: {
|
|
|
|
btnRadius: this.btnRadiusLocal,
|
|
|
|
inputRadius: this.inputRadiusLocal,
|
|
|
|
panelRadius: this.panelRadiusLocal,
|
|
|
|
avatarRadius: this.avatarRadiusLocal,
|
|
|
|
avatarAltRadius: this.avatarAltRadiusLocal,
|
|
|
|
tooltipRadius: this.tooltipRadiusLocal,
|
|
|
|
attachmentRadius: this.attachmentRadiusLocal
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
previewRules () {
|
|
|
|
try {
|
|
|
|
const generated = StyleSetter.generatePreset(this.currentTheme.colors)
|
|
|
|
return [generated.colorRules, generated.radiiRules].join(';')
|
|
|
|
} catch (e) {
|
|
|
|
console.error('CATCH')
|
|
|
|
console.error(e)
|
|
|
|
return ''
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
components: {
|
|
|
|
ColorInput,
|
|
|
|
OpacityInput
|
2017-11-17 07:24:42 -08:00
|
|
|
},
|
|
|
|
methods: {
|
2018-06-27 16:08:06 -07:00
|
|
|
exportCurrentTheme () {
|
|
|
|
const stringified = JSON.stringify({
|
2018-07-04 05:25:40 -07:00
|
|
|
// To separate from other random JSON files and possible future theme formats
|
|
|
|
_pleroma_theme_version: 1,
|
2018-06-27 16:08:06 -07:00
|
|
|
colors: this.$store.state.config.colors,
|
|
|
|
radii: this.$store.state.config.radii
|
|
|
|
}, null, 2) // Pretty-print and indent with 2 spaces
|
|
|
|
|
|
|
|
// Create an invisible link with a data url and simulate a click
|
|
|
|
const e = document.createElement('a')
|
|
|
|
e.setAttribute('download', 'pleroma_theme.json')
|
|
|
|
e.setAttribute('href', 'data:application/json;base64,' + window.btoa(stringified))
|
|
|
|
e.style.display = 'none'
|
|
|
|
|
|
|
|
document.body.appendChild(e)
|
|
|
|
e.click()
|
|
|
|
document.body.removeChild(e)
|
|
|
|
},
|
|
|
|
|
2018-06-27 17:59:57 -07:00
|
|
|
importTheme () {
|
2018-07-04 05:25:40 -07:00
|
|
|
this.invalidThemeImported = false
|
2018-06-27 17:59:57 -07:00
|
|
|
const filePicker = document.createElement('input')
|
|
|
|
filePicker.setAttribute('type', 'file')
|
|
|
|
filePicker.setAttribute('accept', '.json')
|
|
|
|
|
|
|
|
filePicker.addEventListener('change', event => {
|
|
|
|
if (event.target.files[0]) {
|
|
|
|
// eslint-disable-next-line no-undef
|
|
|
|
const reader = new FileReader()
|
|
|
|
reader.onload = ({target}) => {
|
2018-07-04 05:25:40 -07:00
|
|
|
try {
|
|
|
|
const parsed = JSON.parse(target.result)
|
|
|
|
if (parsed._pleroma_theme_version === 1) {
|
|
|
|
this.normalizeLocalState(parsed.colors, parsed.radii)
|
|
|
|
} else {
|
|
|
|
// A theme from the future, spooky
|
|
|
|
this.invalidThemeImported = true
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
// This will happen both if there is a JSON syntax error or the theme is missing components
|
|
|
|
this.invalidThemeImported = true
|
|
|
|
}
|
2018-06-27 17:59:57 -07:00
|
|
|
}
|
|
|
|
reader.readAsText(event.target.files[0])
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
document.body.appendChild(filePicker)
|
|
|
|
filePicker.click()
|
|
|
|
document.body.removeChild(filePicker)
|
|
|
|
},
|
|
|
|
|
2017-11-17 07:24:42 -08:00
|
|
|
setCustomTheme () {
|
2018-04-07 11:58:29 -07:00
|
|
|
if (!this.bgColorLocal && !this.btnColorLocal && !this.linkColorLocal) {
|
2017-11-17 07:24:42 -08:00
|
|
|
// reset to picked themes
|
|
|
|
}
|
2018-04-07 16:39:39 -07:00
|
|
|
|
2017-11-17 07:24:42 -08:00
|
|
|
const rgb = (hex) => {
|
2017-11-18 03:13:51 -08:00
|
|
|
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
|
2017-11-17 07:24:42 -08:00
|
|
|
return result ? {
|
2017-11-18 03:13:51 -08:00
|
|
|
r: parseInt(result[1], 16),
|
|
|
|
g: parseInt(result[2], 16),
|
|
|
|
b: parseInt(result[3], 16)
|
2017-11-17 07:24:42 -08:00
|
|
|
} : null
|
|
|
|
}
|
2018-10-02 11:43:58 -07:00
|
|
|
|
|
|
|
this.$store.dispatch('setOption', {
|
|
|
|
name: 'customTheme',
|
|
|
|
value: this.currentTheme
|
|
|
|
})
|
2018-06-27 17:07:50 -07:00
|
|
|
},
|
|
|
|
|
2018-10-02 11:43:58 -07:00
|
|
|
normalizeLocalState (input) {
|
|
|
|
const colors = input.colors || input
|
|
|
|
const radii = input.radii || input
|
|
|
|
let i = 0
|
|
|
|
console.log('BENIS')
|
|
|
|
console.log(colors)
|
|
|
|
|
|
|
|
console.log(i++)
|
|
|
|
this.bgColorLocal = rgb2hex(colors.bg)
|
|
|
|
console.log(i++)
|
|
|
|
this.btnColorLocal = rgb2hex(colors.btn)
|
|
|
|
console.log(i++)
|
|
|
|
this.textColorLocal = rgb2hex(colors.text || colors.fg)
|
|
|
|
console.log(i++)
|
|
|
|
this.linkColorLocal = rgb2hex(colors.link)
|
|
|
|
console.log(i++)
|
|
|
|
|
|
|
|
this.panelColorLocal = colors.panel ? rgb2hex(colors.panel) : undefined
|
|
|
|
console.log(i++)
|
|
|
|
this.topBarColorLocal = colors.topBad ? rgb2hex(colors.topBar) : undefined
|
|
|
|
console.log(i++)
|
2018-06-27 17:07:50 -07:00
|
|
|
|
2018-10-02 11:43:58 -07:00
|
|
|
this.redColorLocal = rgb2hex(colors.cRed)
|
|
|
|
console.log(i++)
|
|
|
|
console.log('red')
|
|
|
|
console.log(colors.cRed)
|
|
|
|
console.log(this.redColorLocal)
|
|
|
|
this.blueColorLocal = rgb2hex(colors.cBlue)
|
|
|
|
console.log(i++)
|
|
|
|
console.log('blue', this.blueColorLocal, colors.cBlue)
|
|
|
|
this.greenColorLocal = rgb2hex(colors.cGreen)
|
|
|
|
console.log(i++)
|
|
|
|
this.orangeColorLocal = rgb2hex(colors.cOrange)
|
|
|
|
console.log(i++)
|
2018-06-27 17:07:50 -07:00
|
|
|
|
|
|
|
this.btnRadiusLocal = radii.btnRadius || 4
|
2018-10-02 11:43:58 -07:00
|
|
|
console.log(i++)
|
2018-06-27 17:07:50 -07:00
|
|
|
this.inputRadiusLocal = radii.inputRadius || 4
|
2018-10-02 11:43:58 -07:00
|
|
|
console.log(i++)
|
2018-06-27 17:07:50 -07:00
|
|
|
this.panelRadiusLocal = radii.panelRadius || 10
|
2018-10-02 11:43:58 -07:00
|
|
|
console.log(i++)
|
2018-06-27 17:07:50 -07:00
|
|
|
this.avatarRadiusLocal = radii.avatarRadius || 5
|
2018-10-02 11:43:58 -07:00
|
|
|
console.log(i++)
|
2018-06-27 17:07:50 -07:00
|
|
|
this.avatarAltRadiusLocal = radii.avatarAltRadius || 50
|
2018-10-02 11:43:58 -07:00
|
|
|
console.log(i++)
|
2018-06-27 17:07:50 -07:00
|
|
|
this.tooltipRadiusLocal = radii.tooltipRadius || 2
|
2018-10-02 11:43:58 -07:00
|
|
|
console.log(i++)
|
2018-06-27 17:07:50 -07:00
|
|
|
this.attachmentRadiusLocal = radii.attachmentRadius || 5
|
2018-10-02 11:43:58 -07:00
|
|
|
console.log(i++)
|
2017-11-17 07:24:42 -08:00
|
|
|
}
|
2017-01-16 09:57:03 -08:00
|
|
|
},
|
|
|
|
watch: {
|
|
|
|
selected () {
|
2017-11-17 07:24:42 -08:00
|
|
|
this.bgColorLocal = this.selected[1]
|
2018-04-07 11:58:29 -07:00
|
|
|
this.btnColorLocal = this.selected[2]
|
2017-11-17 07:24:42 -08:00
|
|
|
this.textColorLocal = this.selected[3]
|
|
|
|
this.linkColorLocal = this.selected[4]
|
2018-04-01 12:07:25 -07:00
|
|
|
this.redColorLocal = this.selected[5]
|
2018-04-07 11:58:29 -07:00
|
|
|
this.greenColorLocal = this.selected[6]
|
|
|
|
this.blueColorLocal = this.selected[7]
|
2018-04-01 12:07:25 -07:00
|
|
|
this.orangeColorLocal = this.selected[8]
|
2017-01-16 09:57:03 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|