|
|
@@ -0,0 +1,139 @@
|
|
|
+
|
|
|
+var Custom = () => {
|
|
|
+ var defaults = {
|
|
|
+ theme: '',
|
|
|
+ color: 'auto',
|
|
|
+ _colors: ['auto', 'light', 'dark'],
|
|
|
+ error: '',
|
|
|
+ }
|
|
|
+
|
|
|
+ var state = Object.assign({}, defaults)
|
|
|
+
|
|
|
+ chrome.runtime.sendMessage({message: 'custom.get'}, (res) => {
|
|
|
+ Object.assign(state, res)
|
|
|
+ m.redraw()
|
|
|
+ })
|
|
|
+
|
|
|
+ var events = {
|
|
|
+ file: (e) => {
|
|
|
+ document.querySelector('input[type=file]').click()
|
|
|
+ },
|
|
|
+ theme: (e) => {
|
|
|
+ var file = e.target.files[0]
|
|
|
+ if (file) {
|
|
|
+ var minified
|
|
|
+ var reader = new FileReader()
|
|
|
+ reader.readAsText(file, 'UTF-8')
|
|
|
+ reader.onload = (e) => {
|
|
|
+ minified = csso.minify(e.target.result).css
|
|
|
+ chrome.runtime.sendMessage({
|
|
|
+ message: 'custom.set',
|
|
|
+ custom: {
|
|
|
+ theme: minified,
|
|
|
+ color: state.color,
|
|
|
+ },
|
|
|
+ }, (res) => {
|
|
|
+ if (res?.error) {
|
|
|
+ state.error = res.error
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ state.theme = minified
|
|
|
+ state.error = ''
|
|
|
+ }
|
|
|
+ m.redraw()
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ remove: (e) => {
|
|
|
+ state.theme = ''
|
|
|
+ state.error = ''
|
|
|
+ chrome.runtime.sendMessage({
|
|
|
+ message: 'custom.set',
|
|
|
+ custom: {
|
|
|
+ theme: state.theme,
|
|
|
+ color: state.color,
|
|
|
+ },
|
|
|
+ })
|
|
|
+ m.redraw()
|
|
|
+ },
|
|
|
+ color: (e) => {
|
|
|
+ state.color = state._colors[e.target.selectedIndex]
|
|
|
+ chrome.runtime.sendMessage({
|
|
|
+ message: 'custom.set',
|
|
|
+ custom: {
|
|
|
+ theme: state.theme,
|
|
|
+ color: state.color,
|
|
|
+ },
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ var oncreate = {
|
|
|
+ ripple: (vnode) => {
|
|
|
+ mdc.ripple.MDCRipple.attachTo(vnode.dom)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ var onupdate = {}
|
|
|
+
|
|
|
+ var render = () => [
|
|
|
+ m('.bs-callout m-custom',
|
|
|
+ state.error &&
|
|
|
+ m('.row',
|
|
|
+ m('.col-12',
|
|
|
+ m('span.m-label.m-error', state.error)
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ m('.row',
|
|
|
+ m('.col-xxl-6.col-xl-6.col-lg-6.col-md-6.col-sm-12',
|
|
|
+ m('span.m-label',
|
|
|
+ 'Custom Theme'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ m('.col-xxl-6.col-xl-6.col-lg-6.col-md-6.col-sm-12',
|
|
|
+ m('input', {
|
|
|
+ type: 'file',
|
|
|
+ accept: '.css',
|
|
|
+ onchange: events.theme,
|
|
|
+ oncancel: events.theme,
|
|
|
+ }),
|
|
|
+ m('button.mdc-button mdc-button--raised m-button', {
|
|
|
+ oncreate: oncreate.ripple,
|
|
|
+ onclick: events.file
|
|
|
+ },
|
|
|
+ !state.theme ? 'Add' : 'Update'
|
|
|
+ ),
|
|
|
+ state.theme &&
|
|
|
+ m('button.mdc-button mdc-button--raised m-button', {
|
|
|
+ oncreate: oncreate.ripple,
|
|
|
+ onclick: events.remove
|
|
|
+ },
|
|
|
+ 'Remove'
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ state.theme &&
|
|
|
+ m('.row',
|
|
|
+ m('.col-xxl-6.col-xl-6.col-lg-6.col-md-6.col-sm-12',
|
|
|
+ m('span.m-label',
|
|
|
+ 'Color Scheme'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ m('.col-xxl-6.col-xl-6.col-lg-6.col-md-6.col-sm-12',
|
|
|
+ m('select.mdc-elevation--z2 m-select', {
|
|
|
+ onchange: events.color
|
|
|
+ },
|
|
|
+ state._colors.map((color) =>
|
|
|
+ m('option', {
|
|
|
+ selected: state.color === color,
|
|
|
+ }, color)
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ ]
|
|
|
+
|
|
|
+ return {state, render}
|
|
|
+}
|