+
+ {{ $t('settings.presets') }}
+
-
- {
+ commit('setInstanceOption', { name: 'themeData', value: themeData })
+ // No need to apply theme if there's user theme already
+ const { customTheme } = rootState.config
+ if (customTheme) return
+ applyTheme(themeData.theme)
+ })
},
fetchEmoji ({ dispatch, state }) {
if (!state.customEmojiFetched) {
diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js
index ee264c49..9610d799 100644
--- a/src/services/style_setter/style_setter.js
+++ b/src/services/style_setter/style_setter.js
@@ -7,7 +7,7 @@ import { getColors, computeDynamicColor } from '../theme_data/theme_data.service
// styles that aren't just colors, so user can pick from a few different distinct
// styles as well as set their own colors in the future.
-export const setStyle = (href, commit) => {
+export const setStyle = (href) => {
/***
What's going on here?
I want to make it easy for admins to style this application. To have
@@ -53,8 +53,8 @@ export const setStyle = (href, commit) => {
cssEl.addEventListener('load', setDynamic)
}
-export const applyTheme = (input, commit) => {
- const { rules, theme } = generatePreset(input)
+export const applyTheme = (input) => {
+ const { rules } = generatePreset(input)
const head = document.head
const body = document.body
body.classList.add('hidden')
@@ -69,11 +69,6 @@ export const applyTheme = (input, commit) => {
styleSheet.insertRule(`body { ${rules.shadows} }`, 'index-max')
styleSheet.insertRule(`body { ${rules.fonts} }`, 'index-max')
body.classList.remove('hidden')
-
- // commit('setOption', { name: 'colors', value: htmlColors })
- // commit('setOption', { name: 'radii', value: radii })
- commit('setOption', { name: 'customTheme', value: input })
- commit('setOption', { name: 'colors', value: theme.colors })
}
export const getCssShadow = (input, usesDropShadow) => {
@@ -387,7 +382,7 @@ export const getThemes = () => {
*/
export const shadows2to3 = (shadows) => {
return Object.entries(shadows).reduce((shadowsAcc, [slotName, shadowDefs]) => {
- const isDynamic = ({ color }) => console.log(color) || color.startsWith('--')
+ const isDynamic = ({ color }) => color.startsWith('--')
const newShadow = shadowDefs.reduce((shadowAcc, def) => [
...shadowAcc,
{
@@ -399,7 +394,7 @@ export const shadows2to3 = (shadows) => {
}, {})
}
-export const setPreset = (val, commit) => {
+export const getPreset = (val) => {
return getThemes()
.then((themes) => themes[val] ? themes[val] : themes['pleroma-dark'])
.then((theme) => {
@@ -420,14 +415,8 @@ export const setPreset = (val, commit) => {
data.colors = { bg, fg, text, link, cRed, cBlue, cGreen, cOrange }
}
- // This is a hack, this function is only called during initial load.
- // We want to cancel loading the theme from config.json if we're already
- // loading a theme from the persisted state.
- // Needed some way of dealing with the async way of things.
- // load config -> set preset -> wait for styles.json to load ->
- // load persisted state -> set colors -> styles.json loaded -> set colors
- if (!window.themeLoaded) {
- applyTheme(data, commit)
- }
+ return { theme: data, source: theme.source }
})
}
+
+export const setPreset = (val) => getPreset(val).then(data => applyTheme(data.theme))
--
cgit v1.2.3-70-g09d2
From 644ce497a0f118b2e5050a2e45b67450915c53f0 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Wed, 22 Jan 2020 01:28:46 +0200
Subject: lightBg -> highlight because it causes issues with v2
---
src/components/style_switcher/style_switcher.vue | 24 +++++-----
src/i18n/en.json | 2 +-
src/services/theme_data/theme_data.service.js | 60 ++++++++++++------------
static/themes/breezy-dark.json | 2 +-
static/themes/breezy-light.json | 2 +-
static/themes/redmond-xx-se.json | 2 +-
static/themes/redmond-xx.json | 2 +-
static/themes/redmond-xxi.json | 2 +-
8 files changed, 48 insertions(+), 48 deletions(-)
(limited to 'src/services')
diff --git a/src/components/style_switcher/style_switcher.vue b/src/components/style_switcher/style_switcher.vue
index 61f8800a..79c2fcd3 100644
--- a/src/components/style_switcher/style_switcher.vue
+++ b/src/components/style_switcher/style_switcher.vue
@@ -518,27 +518,27 @@
/>
-
{{ $t('settings.style.advanced_colors.lightBg') }}
+ {{ $t('settings.style.advanced_colors.highlight') }}
-
+
-
+
{{ $t('settings.style.advanced_colors.selectedPost') }}
diff --git a/src/i18n/en.json b/src/i18n/en.json
index 815c11b1..2622157a 100644
--- a/src/i18n/en.json
+++ b/src/i18n/en.json
@@ -449,7 +449,7 @@
"underlay": "Underlay",
"poll": "Poll graph",
"icons": "Icons",
- "lightBg": "Highlighted elements",
+ "highlight": "Highlighted elements",
"pressed": "Pressed",
"selectedPost": "Selected post",
"selectedMenu": "Selected menu item",
diff --git a/src/services/theme_data/theme_data.service.js b/src/services/theme_data/theme_data.service.js
index 63bfb5af..8c114004 100644
--- a/src/services/theme_data/theme_data.service.js
+++ b/src/services/theme_data/theme_data.service.js
@@ -47,7 +47,7 @@ export const LAYERS = {
badge: null, // no transparency support
fg: null,
bg: 'underlay',
- lightBg: 'bg',
+ highlight: 'bg',
panel: 'bg',
btn: 'bg',
btnPanel: 'panel',
@@ -148,57 +148,57 @@ export const SLOT_INHERITANCE = {
cGreen: '#00FF00',
cOrange: '#E3FF00',
- lightBg: {
+ highlight: {
depends: ['bg'],
color: (mod, bg) => brightness(5 * mod, bg).rgb
},
- lightBgFaintText: {
+ highlightFaintText: {
depends: ['faint'],
- layer: 'lightBg',
+ layer: 'highlight',
textColor: true
},
- lightBgFaintLink: {
+ highlightFaintLink: {
depends: ['faintLink'],
- layer: 'lightBg',
+ layer: 'highlight',
textColor: 'preserve'
},
- lightBgText: {
+ highlightText: {
depends: ['text'],
- layer: 'lightBg',
+ layer: 'highlight',
textColor: true
},
- lightBgLink: {
+ highlightLink: {
depends: ['link'],
- layer: 'lightBg',
+ layer: 'highlight',
textColor: 'preserve'
},
- lightBgIcon: {
- depends: ['lightBg', 'lightBgText'],
+ highlightIcon: {
+ depends: ['highlight', 'highlightText'],
color: (mod, bg, text) => mixrgb(bg, text)
},
- selectedPost: '--lightBg',
+ selectedPost: '--highlight',
selectedPostFaintText: {
- depends: ['lightBgFaintText'],
- layer: 'lightBg',
+ depends: ['highlightFaintText'],
+ layer: 'highlight',
variant: 'selectedPost',
textColor: true
},
selectedPostFaintLink: {
- depends: ['lightBgFaintLink'],
- layer: 'lightBg',
+ depends: ['highlightFaintLink'],
+ layer: 'highlight',
variant: 'selectedPost',
textColor: 'preserve'
},
selectedPostText: {
- depends: ['lightBgText'],
- layer: 'lightBg',
+ depends: ['highlightText'],
+ layer: 'highlight',
variant: 'selectedPost',
textColor: true
},
selectedPostLink: {
- depends: ['lightBgLink'],
- layer: 'lightBg',
+ depends: ['highlightLink'],
+ layer: 'highlight',
variant: 'selectedPost',
textColor: 'preserve'
},
@@ -207,28 +207,28 @@ export const SLOT_INHERITANCE = {
color: (mod, bg, text) => mixrgb(bg, text)
},
- selectedMenu: '--lightBg',
+ selectedMenu: '--highlight',
selectedMenuFaintText: {
- depends: ['lightBgFaintText'],
- layer: 'lightBg',
+ depends: ['highlightFaintText'],
+ layer: 'highlight',
variant: 'selectedMenu',
textColor: true
},
selectedMenuFaintLink: {
- depends: ['lightBgFaintLink'],
- layer: 'lightBg',
+ depends: ['highlightFaintLink'],
+ layer: 'highlight',
variant: 'selectedMenu',
textColor: 'preserve'
},
selectedMenuText: {
- depends: ['lightBgText'],
- layer: 'lightBg',
+ depends: ['highlightText'],
+ layer: 'highlight',
variant: 'selectedMenu',
textColor: true
},
selectedMenuLink: {
- depends: ['lightBgLink'],
- layer: 'lightBg',
+ depends: ['highlightLink'],
+ layer: 'highlight',
variant: 'selectedMenu',
textColor: 'preserve'
},
diff --git a/static/themes/breezy-dark.json b/static/themes/breezy-dark.json
index 3aafda52..c3bdcf65 100644
--- a/static/themes/breezy-dark.json
+++ b/static/themes/breezy-dark.json
@@ -114,7 +114,7 @@
"cGreen": "#27ae60",
"cOrange": "#f67400",
"btnPressed": "--accent",
- "lightBg": "--accent",
+ "highlight": "--accent",
"selectedPost": "--bg,10"
},
"radii": {
diff --git a/static/themes/breezy-light.json b/static/themes/breezy-light.json
index df6e1a66..478407c9 100644
--- a/static/themes/breezy-light.json
+++ b/static/themes/breezy-light.json
@@ -117,7 +117,7 @@
"cGreen": "#27ae60",
"cOrange": "#f67400",
"btnPressed": "--accent",
- "lightBg": "--accent",
+ "highlight": "--accent",
"selectedPost": "--bg,10"
},
"radii": {
diff --git a/static/themes/redmond-xx-se.json b/static/themes/redmond-xx-se.json
index 13ed3b0e..1a867fcc 100644
--- a/static/themes/redmond-xx-se.json
+++ b/static/themes/redmond-xx-se.json
@@ -283,7 +283,7 @@
"cBlue": "#008080",
"cGreen": "#008000",
"cOrange": "#808000",
- "lightBg": "--accent",
+ "highlight": "--accent",
"selectedPost": "--bg,-10"
},
"radii": {
diff --git a/static/themes/redmond-xx.json b/static/themes/redmond-xx.json
index 7c687ae0..78c92f10 100644
--- a/static/themes/redmond-xx.json
+++ b/static/themes/redmond-xx.json
@@ -274,7 +274,7 @@
"cBlue": "#008080",
"cGreen": "#008000",
"cOrange": "#808000",
- "lightBg": "--accent",
+ "highlight": "--accent",
"selectedPost": "--bg,-10"
},
"radii": {
diff --git a/static/themes/redmond-xxi.json b/static/themes/redmond-xxi.json
index 5371ee64..28f68351 100644
--- a/static/themes/redmond-xxi.json
+++ b/static/themes/redmond-xxi.json
@@ -256,7 +256,7 @@
"cBlue": "#6699cc",
"cGreen": "#669966",
"cOrange": "#cc6633",
- "lightBg": "--accent",
+ "highlight": "--accent",
"selectedPost": "--bg,-10"
},
"radii": {
--
cgit v1.2.3-70-g09d2
From 8de7eabd8fdfc9f97fb262552f0cca9fd6da95eb Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Wed, 22 Jan 2020 23:26:24 +0200
Subject: v2 compatibility fixes
---
src/boot/after_store.js | 2 +-
src/components/style_switcher/style_switcher.js | 7 +++-
src/services/color_convert/color_convert.js | 5 +--
src/services/style_setter/style_setter.js | 49 ++++++++++++++++++++++++-
src/services/theme_data/theme_data.service.js | 12 +++---
5 files changed, 62 insertions(+), 13 deletions(-)
(limited to 'src/services')
diff --git a/src/boot/after_store.js b/src/boot/after_store.js
index 6c4f0e1b..f61e9252 100644
--- a/src/boot/after_store.js
+++ b/src/boot/after_store.js
@@ -280,7 +280,7 @@ const afterStoreSetup = async ({ store, i18n }) => {
const customThemePresent = customThemeSource || customTheme
if (customThemePresent) {
- if (customThemeSource && customThemeSource.version === CURRENT_VERSION) {
+ if (customThemeSource && customThemeSource.themeEngineVersion === CURRENT_VERSION) {
applyTheme(customThemeSource)
} else {
applyTheme(customTheme)
diff --git a/src/components/style_switcher/style_switcher.js b/src/components/style_switcher/style_switcher.js
index 27df0d10..76e6cdb7 100644
--- a/src/components/style_switcher/style_switcher.js
+++ b/src/components/style_switcher/style_switcher.js
@@ -12,7 +12,8 @@ import {
generateFonts,
composePreset,
getThemes,
- shadows2to3
+ shadows2to3,
+ colors2to3
} from '../../services/style_setter/style_setter.js'
import {
CURRENT_VERSION,
@@ -588,7 +589,9 @@ export default {
const opacity = input.opacity
const shadows = input.shadows || {}
const fonts = input.fonts || {}
- const colors = input.colors || input
+ const colors = !input.themeEngineVersion
+ ? colors2to3(input.colors)
+ : input.colors || input
if (version === 0) {
if (input.version) version = input.version
diff --git a/src/services/color_convert/color_convert.js b/src/services/color_convert/color_convert.js
index 6b228a58..93cb1ba6 100644
--- a/src/services/color_convert/color_convert.js
+++ b/src/services/color_convert/color_convert.js
@@ -185,10 +185,9 @@ export const rgba2css = function (rgba) {
* @param {Boolean} preserve - try to preserve intended text color's hue/saturation (i.e. no BW)
*/
export const getTextColor = function (bg, text, preserve) {
- const bgIsLight = relativeLuminance(bg) > 0.5
- const textIsLight = relativeLuminance(text) > 0.5
+ const contrast = getContrastRatio(bg, text)
- if ((bgIsLight && textIsLight) || (!bgIsLight && !textIsLight)) {
+ if (contrast < 4.5) {
const base = typeof text.a !== 'undefined' ? { a: text.a } : {}
const result = Object.assign(base, invertLightness(text).rgb)
if (!preserve && getContrastRatio(bg, result) < 4.5) {
diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js
index 9610d799..b43eb0dd 100644
--- a/src/services/style_setter/style_setter.js
+++ b/src/services/style_setter/style_setter.js
@@ -110,7 +110,9 @@ const getCssShadowFilter = (input) => {
}
export const generateColors = (themeData) => {
- const sourceColors = themeData.colors || themeData
+ const sourceColors = !themeData.themeEngineVersion
+ ? colors2to3(themeData.colors)
+ : themeData.colors || themeData
const isLightOnDark = convert(sourceColors.bg).hsl.l < convert(sourceColors.text).hsl.l
const mod = isLightOnDark ? 1 : -1
@@ -283,9 +285,12 @@ export const DEFAULT_SHADOWS = {
}]
}
export const generateShadows = (input, colors, mod) => {
+ const inputShadows = !input.themeEngineVersion
+ ? shadows2to3(input.shadows)
+ : input.shadows || {}
const shadows = Object.entries({
...DEFAULT_SHADOWS,
- ...(input.shadows || {})
+ ...inputShadows
}).reduce((shadowsAcc, [slotName, shadowDefs]) => {
const newShadow = shadowDefs.reduce((shadowAcc, def) => [
...shadowAcc,
@@ -374,6 +379,46 @@ export const getThemes = () => {
}, {})
})
}
+export const colors2to3 = (colors) => {
+ return Object.entries(colors).reduce((acc, [slotName, color]) => {
+ const btnStates = ['', 'Pressed', 'Disabled', 'Toggled']
+ const btnPositions = ['', 'Panel', 'TopBar']
+ switch (slotName) {
+ case 'lightBg':
+ return { ...acc, highlight: color }
+ case 'btn':
+ return {
+ ...acc,
+ ...btnStates.reduce((stateAcc, state) => ({ ...stateAcc, ['btn' + state]: color }), {})
+ }
+ case 'btnText':
+ console.log(
+ btnPositions
+ .map(position => btnStates.map(state => state + position))
+ .flat()
+ .reduce(
+ (statePositionAcc, statePosition) =>
+ ({ ...statePositionAcc, ['btn' + statePosition + 'Text']: color })
+ , {}
+ )
+ )
+ return {
+ ...acc,
+ ...btnPositions
+ .map(position => btnStates.map(state => state + position))
+ .flat()
+ .reduce(
+ (statePositionAcc, statePosition) =>
+ ({ ...statePositionAcc, ['btn' + statePosition + 'Text']: color })
+ , {}
+ )
+ }
+ default:
+ console.log('aaa', slotName, color, acc)
+ return { ...acc, [slotName]: color }
+ }
+ }, {})
+}
/**
* This handles compatibility issues when importing v2 theme's shadows to current format
diff --git a/src/services/theme_data/theme_data.service.js b/src/services/theme_data/theme_data.service.js
index 8c114004..2cae85de 100644
--- a/src/services/theme_data/theme_data.service.js
+++ b/src/services/theme_data/theme_data.service.js
@@ -283,12 +283,12 @@ export const SLOT_INHERITANCE = {
opacity: 'panel'
},
panelText: {
- depends: ['fgText'],
+ depends: ['text'],
layer: 'panel',
textColor: true
},
panelFaint: {
- depends: ['fgText'],
+ depends: ['text'],
layer: 'panel',
opacity: 'faint',
textColor: true
@@ -302,7 +302,7 @@ export const SLOT_INHERITANCE = {
// Top bar
topBar: '--fg',
topBarText: {
- depends: ['fgText'],
+ depends: ['text'],
layer: 'topBar',
textColor: true
},
@@ -313,7 +313,9 @@ export const SLOT_INHERITANCE = {
},
// Tabs
- tab: '--btn',
+ tab: {
+ depends: ['btn']
+ },
tabText: {
depends: ['btnText'],
layer: 'btn',
@@ -331,7 +333,7 @@ export const SLOT_INHERITANCE = {
opacity: 'btn'
},
btnText: {
- depends: ['fgText'],
+ depends: ['text'],
layer: 'btn',
textColor: true
},
--
cgit v1.2.3-70-g09d2
From 7354b6f7062def8bd1ac0a0e457cd05256eba0d5 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Thu, 23 Jan 2020 00:35:56 +0200
Subject: fixed get(Layer|Opacity)Slot not working properly which broke Mojave
theme
---
src/components/style_switcher/style_switcher.js | 2 +-
src/services/style_setter/style_setter.js | 11 -----
src/services/theme_data/theme_data.service.js | 60 ++++++++++++-------------
3 files changed, 30 insertions(+), 43 deletions(-)
(limited to 'src/services')
diff --git a/src/components/style_switcher/style_switcher.js b/src/components/style_switcher/style_switcher.js
index 76e6cdb7..06ef71a7 100644
--- a/src/components/style_switcher/style_switcher.js
+++ b/src/components/style_switcher/style_switcher.js
@@ -246,7 +246,7 @@ export default {
if (!slotIsText) return acc
const { layer, variant } = slotIsBaseText ? { layer: 'bg' } : value
const background = variant || layer
- const opacitySlot = getOpacitySlot(SLOT_INHERITANCE[background])
+ const opacitySlot = getOpacitySlot(background)
const textColors = [
key,
...(background === 'bg' ? ['cRed', 'cGreen', 'cBlue', 'cOrange'] : [])
diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js
index b43eb0dd..7f9f17be 100644
--- a/src/services/style_setter/style_setter.js
+++ b/src/services/style_setter/style_setter.js
@@ -392,16 +392,6 @@ export const colors2to3 = (colors) => {
...btnStates.reduce((stateAcc, state) => ({ ...stateAcc, ['btn' + state]: color }), {})
}
case 'btnText':
- console.log(
- btnPositions
- .map(position => btnStates.map(state => state + position))
- .flat()
- .reduce(
- (statePositionAcc, statePosition) =>
- ({ ...statePositionAcc, ['btn' + statePosition + 'Text']: color })
- , {}
- )
- )
return {
...acc,
...btnPositions
@@ -414,7 +404,6 @@ export const colors2to3 = (colors) => {
)
}
default:
- console.log('aaa', slotName, color, acc)
return { ...acc, [slotName]: color }
}
}, {})
diff --git a/src/services/theme_data/theme_data.service.js b/src/services/theme_data/theme_data.service.js
index 2cae85de..5e49fa17 100644
--- a/src/services/theme_data/theme_data.service.js
+++ b/src/services/theme_data/theme_data.service.js
@@ -591,38 +591,41 @@ export const topoSort = (
})
}
+const expandSlotValue = (value) => {
+ if (typeof value === 'object') return value
+ return {
+ depends: value.startsWith('--') ? [value.substring(2)] : [],
+ default: value.startsWith('#') ? value : undefined
+ }
+}
/**
* retrieves opacity slot for given slot. This goes up the depenency graph
* to find which parent has opacity slot defined for it.
* TODO refactor this
*/
export const getOpacitySlot = (
- v,
+ k,
inheritance = SLOT_INHERITANCE,
getDeps = getDependencies
) => {
- const value = typeof v === 'string'
- ? {
- depends: v.startsWith('--') ? [v.substring(2)] : []
- }
- : v
+ const value = expandSlotValue(inheritance[k])
if (value.opacity === null) return
- if (value.opacity) return v.opacity
- const findInheritedOpacity = (val) => {
- const depSlot = val.depends[0]
+ if (value.opacity) return value.opacity
+ const findInheritedOpacity = (key, visited = [k]) => {
+ const depSlot = getDeps(key, inheritance)[0]
if (depSlot === undefined) return
- const dependency = getDeps(depSlot, inheritance)[0]
+ const dependency = inheritance[depSlot]
if (dependency === undefined) return
if (dependency.opacity || dependency === null) {
return dependency.opacity
- } else if (dependency.depends) {
- return findInheritedOpacity(dependency)
+ } else if (dependency.depends && visited.includes(depSlot)) {
+ return findInheritedOpacity(depSlot, [...visited, depSlot])
} else {
return null
}
}
if (value.depends) {
- return findInheritedOpacity(value)
+ return findInheritedOpacity(k)
}
}
@@ -635,33 +638,28 @@ export const getOpacitySlot = (
*/
export const getLayerSlot = (
k,
- v,
inheritance = SLOT_INHERITANCE,
getDeps = getDependencies
) => {
- const value = typeof v === 'string'
- ? {
- depends: v.startsWith('--') ? [v.substring(2)] : []
- }
- : v
+ const value = expandSlotValue(inheritance[k])
if (LAYERS[k]) return k
if (value.layer === null) return
- if (value.layer) return v.layer
- const findInheritedLayer = (val) => {
- const depSlot = val.depends[0]
+ if (value.layer) return value.layer
+ const findInheritedLayer = (key, visited = [k]) => {
+ const depSlot = getDeps(key, inheritance)[0]
if (depSlot === undefined) return
- const dependency = getDeps(depSlot, inheritance)[0]
+ const dependency = inheritance[depSlot]
if (dependency === undefined) return
if (dependency.layer || dependency === null) {
return dependency.layer
} else if (dependency.depends) {
- return findInheritedLayer(dependency)
+ return findInheritedLayer(dependency, [...visited, depSlot])
} else {
return null
}
}
if (value.depends) {
- return findInheritedLayer(value)
+ return findInheritedLayer(k)
}
}
@@ -679,7 +677,7 @@ export const SLOT_ORDERED = topoSort(
* with them
*/
export const SLOTS_OPACITIES_DICT = Object.entries(SLOT_INHERITANCE).reduce((acc, [k, v]) => {
- const opacity = getOpacitySlot(v, SLOT_INHERITANCE, getDependencies)
+ const opacity = getOpacitySlot(k, SLOT_INHERITANCE, getDependencies)
if (opacity) {
return { ...acc, [k]: opacity }
} else {
@@ -692,7 +690,7 @@ export const SLOTS_OPACITIES_DICT = Object.entries(SLOT_INHERITANCE).reduce((acc
* color slots.
*/
export const OPACITIES = Object.entries(SLOT_INHERITANCE).reduce((acc, [k, v]) => {
- const opacity = getOpacitySlot(v, SLOT_INHERITANCE, getDependencies)
+ const opacity = getOpacitySlot(k, SLOT_INHERITANCE, getDependencies)
if (opacity) {
return {
...acc,
@@ -738,9 +736,9 @@ export const getColors = (sourceColors, sourceOpacity, mod) => SLOT_ORDERED.redu
if (targetColor === 'transparent') {
// We take only layers below current one
const layers = getLayers(
- getLayerSlot(key, value),
+ getLayerSlot(key),
key,
- value.opacity || key,
+ getOpacitySlot(key) || key,
colors,
opacity
).slice(0, -1)
@@ -781,7 +779,7 @@ export const getColors = (sourceColors, sourceOpacity, mod) => SLOT_ORDERED.redu
getLayers(
value.layer,
value.variant || value.layer,
- getOpacitySlot(SLOT_INHERITANCE[value.variant || value.layer]),
+ getOpacitySlot(value.variant || value.layer),
colors,
opacity
)
@@ -813,7 +811,7 @@ export const getColors = (sourceColors, sourceOpacity, mod) => SLOT_ORDERED.redu
if (!outputColor) {
throw new Error('Couldn\'t generate color for ' + key)
}
- const opacitySlot = SLOTS_OPACITIES_DICT[key]
+ const opacitySlot = getOpacitySlot(key)
if (opacitySlot && outputColor.a === undefined) {
outputColor.a = sourceOpacity[opacitySlot] || OPACITIES[opacitySlot].defaultValue || 1
}
--
cgit v1.2.3-70-g09d2
From 64fc07f080635c83f27b9a5541be32013f1d9a26 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Thu, 23 Jan 2020 00:36:38 +0200
Subject: removed unused constant, using getOpacitySlot now
---
src/services/theme_data/theme_data.service.js | 13 -------------
1 file changed, 13 deletions(-)
(limited to 'src/services')
diff --git a/src/services/theme_data/theme_data.service.js b/src/services/theme_data/theme_data.service.js
index 5e49fa17..bbabd175 100644
--- a/src/services/theme_data/theme_data.service.js
+++ b/src/services/theme_data/theme_data.service.js
@@ -672,19 +672,6 @@ export const SLOT_ORDERED = topoSort(
.reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {})
)
-/**
- * Dictionary where keys are color slots and values are opacity associated
- * with them
- */
-export const SLOTS_OPACITIES_DICT = Object.entries(SLOT_INHERITANCE).reduce((acc, [k, v]) => {
- const opacity = getOpacitySlot(k, SLOT_INHERITANCE, getDependencies)
- if (opacity) {
- return { ...acc, [k]: opacity }
- } else {
- return acc
- }
-}, {})
-
/**
* All opacity slots used in color slots, their default values and affected
* color slots.
--
cgit v1.2.3-70-g09d2
From c752f56d0b7711e9a815468a19e440363a6dcf02 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Thu, 23 Jan 2020 22:26:49 +0200
Subject: v l1 compatibility
---
src/components/style_switcher/style_switcher.js | 2 +-
src/services/style_setter/style_setter.js | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
(limited to 'src/services')
diff --git a/src/components/style_switcher/style_switcher.js b/src/components/style_switcher/style_switcher.js
index 59ec1bf5..14da4f80 100644
--- a/src/components/style_switcher/style_switcher.js
+++ b/src/components/style_switcher/style_switcher.js
@@ -590,7 +590,7 @@ export default {
const shadows = input.shadows || {}
const fonts = input.fonts || {}
const colors = !input.themeEngineVersion
- ? colors2to3(input.colors)
+ ? colors2to3(input.colors || input)
: input.colors || input
if (version === 0) {
diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js
index 7f9f17be..533145d4 100644
--- a/src/services/style_setter/style_setter.js
+++ b/src/services/style_setter/style_setter.js
@@ -111,7 +111,7 @@ const getCssShadowFilter = (input) => {
export const generateColors = (themeData) => {
const sourceColors = !themeData.themeEngineVersion
- ? colors2to3(themeData.colors)
+ ? colors2to3(themeData.colors || themeData)
: themeData.colors || themeData
const isLightOnDark = convert(sourceColors.bg).hsl.l < convert(sourceColors.text).hsl.l
@@ -285,7 +285,7 @@ export const DEFAULT_SHADOWS = {
}]
}
export const generateShadows = (input, colors, mod) => {
- const inputShadows = !input.themeEngineVersion
+ const inputShadows = input.shadows && !input.themeEngineVersion
? shadows2to3(input.shadows)
: input.shadows || {}
const shadows = Object.entries({
--
cgit v1.2.3-70-g09d2
From c1f2457112c38e680f8fb9050cbc44b2dea3a113 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Thu, 23 Jan 2020 22:48:32 +0200
Subject: revert fgText -> text after some consideration. case was fixed
already in other way
---
src/services/theme_data/theme_data.service.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
(limited to 'src/services')
diff --git a/src/services/theme_data/theme_data.service.js b/src/services/theme_data/theme_data.service.js
index bbabd175..d88bb9ea 100644
--- a/src/services/theme_data/theme_data.service.js
+++ b/src/services/theme_data/theme_data.service.js
@@ -288,7 +288,7 @@ export const SLOT_INHERITANCE = {
textColor: true
},
panelFaint: {
- depends: ['text'],
+ depends: ['fgText'],
layer: 'panel',
opacity: 'faint',
textColor: true
@@ -302,7 +302,7 @@ export const SLOT_INHERITANCE = {
// Top bar
topBar: '--fg',
topBarText: {
- depends: ['text'],
+ depends: ['fgText'],
layer: 'topBar',
textColor: true
},
@@ -333,7 +333,7 @@ export const SLOT_INHERITANCE = {
opacity: 'btn'
},
btnText: {
- depends: ['text'],
+ depends: ['fgText'],
layer: 'btn',
textColor: true
},
--
cgit v1.2.3-70-g09d2
From f7ea12c905d0cf0a9f5e0d1284a7803ef4d7abad Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Thu, 23 Jan 2020 23:19:48 +0200
Subject: separate actual theme data from theme framework
---
src/components/style_switcher/style_switcher.js | 4 +-
src/services/theme_data/pleromafe.js | 455 +++++++++++++++++++++++
src/services/theme_data/theme_data.service.js | 457 +-----------------------
3 files changed, 460 insertions(+), 456 deletions(-)
create mode 100644 src/services/theme_data/pleromafe.js
(limited to 'src/services')
diff --git a/src/components/style_switcher/style_switcher.js b/src/components/style_switcher/style_switcher.js
index 14da4f80..17ae9f30 100644
--- a/src/components/style_switcher/style_switcher.js
+++ b/src/components/style_switcher/style_switcher.js
@@ -15,9 +15,11 @@ import {
shadows2to3,
colors2to3
} from '../../services/style_setter/style_setter.js'
+import {
+ SLOT_INHERITANCE
+} from '../../services/theme_data/pleromafe.js'
import {
CURRENT_VERSION,
- SLOT_INHERITANCE,
OPACITIES,
getLayers,
getOpacitySlot
diff --git a/src/services/theme_data/pleromafe.js b/src/services/theme_data/pleromafe.js
new file mode 100644
index 00000000..0deb829f
--- /dev/null
+++ b/src/services/theme_data/pleromafe.js
@@ -0,0 +1,455 @@
+import { brightness } from 'chromatism'
+import { alphaBlend, mixrgb } from '../color_convert/color_convert.js'
+/* This is a definition of all layer combinations
+ * each key is a topmost layer, each value represents layer underneath
+ * this is essentially a simplified tree
+ */
+export const LAYERS = {
+ undelay: null, // root
+ topBar: null, // no transparency support
+ badge: null, // no transparency support
+ fg: null,
+ bg: 'underlay',
+ highlight: 'bg',
+ panel: 'bg',
+ btn: 'bg',
+ btnPanel: 'panel',
+ btnTopBar: 'topBar',
+ input: 'bg',
+ inputPanel: 'panel',
+ inputTopBar: 'topBar',
+ alert: 'bg',
+ alertPanel: 'panel',
+ poll: 'bg'
+}
+
+/* By default opacity slots have 1 as default opacity
+ * this allows redefining it to something else
+ */
+export const DEFAULT_OPACITY = {
+ alert: 0.5,
+ input: 0.5,
+ faint: 0.5,
+ underlay: 0.15
+}
+
+/** SUBJECT TO CHANGE IN THE FUTURE, this is all beta
+ * Color and opacity slots definitions. Each key represents a slot.
+ *
+ * Short-hands:
+ * String beginning with `--` - value after dashes treated as sole
+ * dependency - i.e. `--value` equivalent to { depends: ['value']}
+ * String beginning with `#` - value would be treated as solid color
+ * defined in hexadecimal representation (i.e. #FFFFFF) and will be
+ * used as default. `#FFFFFF` is equivalent to { default: '#FFFFFF'}
+ *
+ * Full definition:
+ * @property {String[]} depends - color slot names this color depends ones.
+ * cyclic dependencies are supported to some extent but not recommended.
+ * @property {String} [opacity] - opacity slot used by this color slot.
+ * opacity is inherited from parents. To break inheritance graph use null
+ * @property {Number} [priority] - EXPERIMENTAL. used to pre-sort slots so
+ * that slots with higher priority come earlier
+ * @property {Function(mod, ...colors)} [color] - function that will be
+ * used to determine the color. By default it just copies first color in
+ * dependency list.
+ * @argument {Number} mod - `1` (light-on-dark) or `-1` (dark-on-light)
+ * depending on background color (for textColor)/given color.
+ * @argument {...Object} deps - each argument after mod represents each
+ * color from `depends` array. All colors take user customizations into
+ * account and represented by { r, g, b } objects.
+ * @returns {Object} resulting color, should be in { r, g, b } form
+ *
+ * @property {Boolean|String} [textColor] - true to mark color slot as text
+ * color. This enables automatic text color generation for the slot. Use
+ * 'preserve' string if you don't want text color to fall back to
+ * black/white. Use 'bw' to only ever use black or white. This also makes
+ * following properties required:
+ * @property {String} [layer] - which layer the text sit on top on - used
+ * to account for transparency in text color calculation
+ * layer is inherited from parents. To break inheritance graph use null
+ * @property {String} [variant] - which color slot is background (same as
+ * above, used to account for transparency)
+ */
+export const SLOT_INHERITANCE = {
+ bg: {
+ depends: [],
+ opacity: 'bg',
+ priority: 1
+ },
+ fg: {
+ depends: [],
+ priority: 1
+ },
+ text: {
+ depends: [],
+ priority: 1
+ },
+ underlay: {
+ default: '#000000',
+ opacity: 'underlay'
+ },
+ link: {
+ depends: ['accent'],
+ priority: 1
+ },
+ accent: {
+ depends: ['link'],
+ priority: 1
+ },
+ faint: {
+ depends: ['text'],
+ opacity: 'faint'
+ },
+ faintLink: {
+ depends: ['link'],
+ opacity: 'faint'
+ },
+
+ cBlue: '#0000ff',
+ cRed: '#FF0000',
+ cGreen: '#00FF00',
+ cOrange: '#E3FF00',
+
+ highlight: {
+ depends: ['bg'],
+ color: (mod, bg) => brightness(5 * mod, bg).rgb
+ },
+ highlightFaintText: {
+ depends: ['faint'],
+ layer: 'highlight',
+ textColor: true
+ },
+ highlightFaintLink: {
+ depends: ['faintLink'],
+ layer: 'highlight',
+ textColor: 'preserve'
+ },
+ highlightText: {
+ depends: ['text'],
+ layer: 'highlight',
+ textColor: true
+ },
+ highlightLink: {
+ depends: ['link'],
+ layer: 'highlight',
+ textColor: 'preserve'
+ },
+ highlightIcon: {
+ depends: ['highlight', 'highlightText'],
+ color: (mod, bg, text) => mixrgb(bg, text)
+ },
+
+ selectedPost: '--highlight',
+ selectedPostFaintText: {
+ depends: ['highlightFaintText'],
+ layer: 'highlight',
+ variant: 'selectedPost',
+ textColor: true
+ },
+ selectedPostFaintLink: {
+ depends: ['highlightFaintLink'],
+ layer: 'highlight',
+ variant: 'selectedPost',
+ textColor: 'preserve'
+ },
+ selectedPostText: {
+ depends: ['highlightText'],
+ layer: 'highlight',
+ variant: 'selectedPost',
+ textColor: true
+ },
+ selectedPostLink: {
+ depends: ['highlightLink'],
+ layer: 'highlight',
+ variant: 'selectedPost',
+ textColor: 'preserve'
+ },
+ selectedPostIcon: {
+ depends: ['selectedPost', 'selectedPostText'],
+ color: (mod, bg, text) => mixrgb(bg, text)
+ },
+
+ selectedMenu: '--highlight',
+ selectedMenuFaintText: {
+ depends: ['highlightFaintText'],
+ layer: 'highlight',
+ variant: 'selectedMenu',
+ textColor: true
+ },
+ selectedMenuFaintLink: {
+ depends: ['highlightFaintLink'],
+ layer: 'highlight',
+ variant: 'selectedMenu',
+ textColor: 'preserve'
+ },
+ selectedMenuText: {
+ depends: ['highlightText'],
+ layer: 'highlight',
+ variant: 'selectedMenu',
+ textColor: true
+ },
+ selectedMenuLink: {
+ depends: ['highlightLink'],
+ layer: 'highlight',
+ variant: 'selectedMenu',
+ textColor: 'preserve'
+ },
+ selectedMenuIcon: {
+ depends: ['selectedMenu', 'selectedMenuText'],
+ color: (mod, bg, text) => mixrgb(bg, text)
+ },
+
+ lightText: {
+ depends: ['text'],
+ color: (mod, text) => brightness(20 * mod, text).rgb
+ },
+
+ border: {
+ depends: ['fg'],
+ opacity: 'border',
+ color: (mod, fg) => brightness(2 * mod, fg).rgb
+ },
+
+ poll: {
+ depends: ['accent', 'bg'],
+ copacity: 'poll',
+ color: (mod, accent, bg) => alphaBlend(accent, 0.4, bg)
+ },
+ pollText: {
+ depends: ['text'],
+ layer: 'poll',
+ textColor: true
+ },
+
+ icon: {
+ depends: ['bg', 'text'],
+ inheritsOpacity: false,
+ color: (mod, bg, text) => mixrgb(bg, text)
+ },
+
+ // Foreground
+ fgText: {
+ depends: ['text'],
+ layer: 'fg',
+ textColor: true
+ },
+ fgLink: {
+ depends: ['link'],
+ layer: 'fg',
+ textColor: 'preserve'
+ },
+
+ // Panel header
+ panel: {
+ depends: ['fg'],
+ opacity: 'panel'
+ },
+ panelText: {
+ depends: ['text'],
+ layer: 'panel',
+ textColor: true
+ },
+ panelFaint: {
+ depends: ['fgText'],
+ layer: 'panel',
+ opacity: 'faint',
+ textColor: true
+ },
+ panelLink: {
+ depends: ['fgLink'],
+ layer: 'panel',
+ textColor: 'preserve'
+ },
+
+ // Top bar
+ topBar: '--fg',
+ topBarText: {
+ depends: ['fgText'],
+ layer: 'topBar',
+ textColor: true
+ },
+ topBarLink: {
+ depends: ['fgLink'],
+ layer: 'topBar',
+ textColor: 'preserve'
+ },
+
+ // Tabs
+ tab: {
+ depends: ['btn']
+ },
+ tabText: {
+ depends: ['btnText'],
+ layer: 'btn',
+ textColor: true
+ },
+ tabActiveText: {
+ depends: ['text'],
+ layer: 'bg',
+ textColor: true
+ },
+
+ // Buttons
+ btn: {
+ depends: ['fg'],
+ opacity: 'btn'
+ },
+ btnText: {
+ depends: ['fgText'],
+ layer: 'btn',
+ textColor: true
+ },
+ btnPanelText: {
+ depends: ['panelText'],
+ layer: 'btnPanel',
+ variant: 'btn',
+ textColor: true
+ },
+ btnTopBarText: {
+ depends: ['topBarText'],
+ layer: 'btnTopBar',
+ variant: 'btn',
+ textColor: true
+ },
+
+ // Buttons: pressed
+ btnPressed: '--btn',
+ btnPressedText: {
+ depends: ['btnText'],
+ layer: 'btn',
+ variant: 'btnPressed',
+ textColor: true
+ },
+ btnPressedPanel: {
+ depends: ['btnPressed']
+ },
+ btnPressedPanelText: {
+ depends: ['btnPanelText'],
+ layer: 'btnPanel',
+ variant: 'btnPressed',
+ textColor: true
+ },
+ btnPressedTopBarText: {
+ depends: ['btnTopBarText'],
+ layer: 'btnTopBar',
+ variant: 'btnPressed',
+ textColor: true
+ },
+
+ // Buttons: toggled
+ btnToggled: {
+ depends: ['btn'],
+ color: (mod, btn) => brightness(mod * 20, btn).rgb
+ },
+ btnToggledText: {
+ depends: ['btnText'],
+ layer: 'btn',
+ variant: 'btnToggled',
+ textColor: true
+ },
+ btnToggledPanelText: {
+ depends: ['btnPanelText'],
+ layer: 'btnPanel',
+ variant: 'btnToggled',
+ textColor: true
+ },
+ btnToggledTopBarText: {
+ depends: ['btnTopBarText'],
+ layer: 'btnTopBar',
+ variant: 'btnToggled',
+ textColor: true
+ },
+
+ // Buttons: disabled
+ btnDisabled: {
+ depends: ['btn', 'bg'],
+ color: (mod, btn, bg) => alphaBlend(btn, 0.5, bg)
+ },
+ btnDisabledText: {
+ depends: ['btnText'],
+ layer: 'btn',
+ variant: 'btnDisabled',
+ textColor: true,
+ color: (mod, text) => brightness(mod * -60, text).rgb
+ },
+ btnDisabledPanelText: {
+ depends: ['btnPanelText'],
+ layer: 'btnPanel',
+ variant: 'btnDisabled',
+ textColor: true,
+ color: (mod, text) => brightness(mod * -60, text).rgb
+ },
+ btnDisabledTopBarText: {
+ depends: ['btnTopBarText'],
+ layer: 'btnTopBar',
+ variant: 'btnDisabled',
+ textColor: true,
+ color: (mod, text) => brightness(mod * -60, text).rgb
+ },
+
+ // Input fields
+ input: {
+ depends: ['fg'],
+ opacity: 'input'
+ },
+ inputText: {
+ depends: ['text'],
+ layer: 'input',
+ textColor: true
+ },
+ inputPanelText: {
+ depends: ['panelText'],
+ layer: 'inputPanel',
+ variant: 'input',
+ textColor: true
+ },
+ inputTopbarText: {
+ depends: ['topBarText'],
+ layer: 'inputTopBar',
+ variant: 'input',
+ textColor: true
+ },
+
+ alertError: {
+ depends: ['cRed'],
+ opacity: 'alert'
+ },
+ alertErrorText: {
+ depends: ['text'],
+ layer: 'alert',
+ variant: 'alertError',
+ textColor: true
+ },
+ alertErrorPanelText: {
+ depends: ['panelText'],
+ layer: 'alertPanel',
+ variant: 'alertError',
+ textColor: true
+ },
+
+ alertWarning: {
+ depends: ['cOrange'],
+ opacity: 'alert'
+ },
+ alertWarningText: {
+ depends: ['text'],
+ layer: 'alert',
+ variant: 'alertWarning',
+ textColor: true
+ },
+ alertWarningPanelText: {
+ depends: ['panelText'],
+ layer: 'alertPanel',
+ variant: 'alertWarning',
+ textColor: true
+ },
+
+ badgeNotification: '--cRed',
+ badgeNotificationText: {
+ depends: ['text', 'badgeNotification'],
+ layer: 'badge',
+ variant: 'badgeNotification',
+ textColor: 'bw'
+ }
+}
diff --git a/src/services/theme_data/theme_data.service.js b/src/services/theme_data/theme_data.service.js
index d88bb9ea..ea28481b 100644
--- a/src/services/theme_data/theme_data.service.js
+++ b/src/services/theme_data/theme_data.service.js
@@ -1,5 +1,6 @@
import { convert, brightness, contrastRatio } from 'chromatism'
-import { alphaBlend, alphaBlendLayers, getTextColor, mixrgb } from '../color_convert/color_convert.js'
+import { alphaBlendLayers, getTextColor } from '../color_convert/color_convert.js'
+import { LAYERS, DEFAULT_OPACITY, SLOT_INHERITANCE } from './pleromafe.js'
/*
* # What's all this?
@@ -37,460 +38,6 @@ import { alphaBlend, alphaBlendLayers, getTextColor, mixrgb } from '../color_con
*/
export const CURRENT_VERSION = 3
-/* This is a definition of all layer combinations
- * each key is a topmost layer, each value represents layer underneath
- * this is essentially a simplified tree
- */
-export const LAYERS = {
- undelay: null, // root
- topBar: null, // no transparency support
- badge: null, // no transparency support
- fg: null,
- bg: 'underlay',
- highlight: 'bg',
- panel: 'bg',
- btn: 'bg',
- btnPanel: 'panel',
- btnTopBar: 'topBar',
- input: 'bg',
- inputPanel: 'panel',
- inputTopBar: 'topBar',
- alert: 'bg',
- alertPanel: 'panel',
- poll: 'bg'
-}
-
-/* By default opacity slots have 1 as default opacity
- * this allows redefining it to something else
- */
-export const DEFAULT_OPACITY = {
- alert: 0.5,
- input: 0.5,
- faint: 0.5,
- underlay: 0.15
-}
-
-/** SUBJECT TO CHANGE IN THE FUTURE, this is all beta
- * Color and opacity slots definitions. Each key represents a slot.
- *
- * Short-hands:
- * String beginning with `--` - value after dashes treated as sole
- * dependency - i.e. `--value` equivalent to { depends: ['value']}
- * String beginning with `#` - value would be treated as solid color
- * defined in hexadecimal representation (i.e. #FFFFFF) and will be
- * used as default. `#FFFFFF` is equivalent to { default: '#FFFFFF'}
- *
- * Full definition:
- * @property {String[]} depends - color slot names this color depends ones.
- * cyclic dependencies are supported to some extent but not recommended.
- * @property {String} [opacity] - opacity slot used by this color slot.
- * opacity is inherited from parents. To break inheritance graph use null
- * @property {Number} [priority] - EXPERIMENTAL. used to pre-sort slots so
- * that slots with higher priority come earlier
- * @property {Function(mod, ...colors)} [color] - function that will be
- * used to determine the color. By default it just copies first color in
- * dependency list.
- * @argument {Number} mod - `1` (light-on-dark) or `-1` (dark-on-light)
- * depending on background color (for textColor)/given color.
- * @argument {...Object} deps - each argument after mod represents each
- * color from `depends` array. All colors take user customizations into
- * account and represented by { r, g, b } objects.
- * @returns {Object} resulting color, should be in { r, g, b } form
- *
- * @property {Boolean|String} [textColor] - true to mark color slot as text
- * color. This enables automatic text color generation for the slot. Use
- * 'preserve' string if you don't want text color to fall back to
- * black/white. Use 'bw' to only ever use black or white. This also makes
- * following properties required:
- * @property {String} [layer] - which layer the text sit on top on - used
- * to account for transparency in text color calculation
- * layer is inherited from parents. To break inheritance graph use null
- * @property {String} [variant] - which color slot is background (same as
- * above, used to account for transparency)
- */
-export const SLOT_INHERITANCE = {
- bg: {
- depends: [],
- opacity: 'bg',
- priority: 1
- },
- fg: {
- depends: [],
- priority: 1
- },
- text: {
- depends: [],
- priority: 1
- },
- underlay: {
- default: '#000000',
- opacity: 'underlay'
- },
- link: {
- depends: ['accent'],
- priority: 1
- },
- accent: {
- depends: ['link'],
- priority: 1
- },
- faint: {
- depends: ['text'],
- opacity: 'faint'
- },
- faintLink: {
- depends: ['link'],
- opacity: 'faint'
- },
-
- cBlue: '#0000ff',
- cRed: '#FF0000',
- cGreen: '#00FF00',
- cOrange: '#E3FF00',
-
- highlight: {
- depends: ['bg'],
- color: (mod, bg) => brightness(5 * mod, bg).rgb
- },
- highlightFaintText: {
- depends: ['faint'],
- layer: 'highlight',
- textColor: true
- },
- highlightFaintLink: {
- depends: ['faintLink'],
- layer: 'highlight',
- textColor: 'preserve'
- },
- highlightText: {
- depends: ['text'],
- layer: 'highlight',
- textColor: true
- },
- highlightLink: {
- depends: ['link'],
- layer: 'highlight',
- textColor: 'preserve'
- },
- highlightIcon: {
- depends: ['highlight', 'highlightText'],
- color: (mod, bg, text) => mixrgb(bg, text)
- },
-
- selectedPost: '--highlight',
- selectedPostFaintText: {
- depends: ['highlightFaintText'],
- layer: 'highlight',
- variant: 'selectedPost',
- textColor: true
- },
- selectedPostFaintLink: {
- depends: ['highlightFaintLink'],
- layer: 'highlight',
- variant: 'selectedPost',
- textColor: 'preserve'
- },
- selectedPostText: {
- depends: ['highlightText'],
- layer: 'highlight',
- variant: 'selectedPost',
- textColor: true
- },
- selectedPostLink: {
- depends: ['highlightLink'],
- layer: 'highlight',
- variant: 'selectedPost',
- textColor: 'preserve'
- },
- selectedPostIcon: {
- depends: ['selectedPost', 'selectedPostText'],
- color: (mod, bg, text) => mixrgb(bg, text)
- },
-
- selectedMenu: '--highlight',
- selectedMenuFaintText: {
- depends: ['highlightFaintText'],
- layer: 'highlight',
- variant: 'selectedMenu',
- textColor: true
- },
- selectedMenuFaintLink: {
- depends: ['highlightFaintLink'],
- layer: 'highlight',
- variant: 'selectedMenu',
- textColor: 'preserve'
- },
- selectedMenuText: {
- depends: ['highlightText'],
- layer: 'highlight',
- variant: 'selectedMenu',
- textColor: true
- },
- selectedMenuLink: {
- depends: ['highlightLink'],
- layer: 'highlight',
- variant: 'selectedMenu',
- textColor: 'preserve'
- },
- selectedMenuIcon: {
- depends: ['selectedMenu', 'selectedMenuText'],
- color: (mod, bg, text) => mixrgb(bg, text)
- },
-
- lightText: {
- depends: ['text'],
- color: (mod, text) => brightness(20 * mod, text).rgb
- },
-
- border: {
- depends: ['fg'],
- opacity: 'border',
- color: (mod, fg) => brightness(2 * mod, fg).rgb
- },
-
- poll: {
- depends: ['accent', 'bg'],
- copacity: 'poll',
- color: (mod, accent, bg) => alphaBlend(accent, 0.4, bg)
- },
- pollText: {
- depends: ['text'],
- layer: 'poll',
- textColor: true
- },
-
- icon: {
- depends: ['bg', 'text'],
- inheritsOpacity: false,
- color: (mod, bg, text) => mixrgb(bg, text)
- },
-
- // Foreground
- fgText: {
- depends: ['text'],
- layer: 'fg',
- textColor: true
- },
- fgLink: {
- depends: ['link'],
- layer: 'fg',
- textColor: 'preserve'
- },
-
- // Panel header
- panel: {
- depends: ['fg'],
- opacity: 'panel'
- },
- panelText: {
- depends: ['text'],
- layer: 'panel',
- textColor: true
- },
- panelFaint: {
- depends: ['fgText'],
- layer: 'panel',
- opacity: 'faint',
- textColor: true
- },
- panelLink: {
- depends: ['fgLink'],
- layer: 'panel',
- textColor: 'preserve'
- },
-
- // Top bar
- topBar: '--fg',
- topBarText: {
- depends: ['fgText'],
- layer: 'topBar',
- textColor: true
- },
- topBarLink: {
- depends: ['fgLink'],
- layer: 'topBar',
- textColor: 'preserve'
- },
-
- // Tabs
- tab: {
- depends: ['btn']
- },
- tabText: {
- depends: ['btnText'],
- layer: 'btn',
- textColor: true
- },
- tabActiveText: {
- depends: ['text'],
- layer: 'bg',
- textColor: true
- },
-
- // Buttons
- btn: {
- depends: ['fg'],
- opacity: 'btn'
- },
- btnText: {
- depends: ['fgText'],
- layer: 'btn',
- textColor: true
- },
- btnPanelText: {
- depends: ['panelText'],
- layer: 'btnPanel',
- variant: 'btn',
- textColor: true
- },
- btnTopBarText: {
- depends: ['topBarText'],
- layer: 'btnTopBar',
- variant: 'btn',
- textColor: true
- },
-
- // Buttons: pressed
- btnPressed: '--btn',
- btnPressedText: {
- depends: ['btnText'],
- layer: 'btn',
- variant: 'btnPressed',
- textColor: true
- },
- btnPressedPanel: {
- depends: ['btnPressed']
- },
- btnPressedPanelText: {
- depends: ['btnPanelText'],
- layer: 'btnPanel',
- variant: 'btnPressed',
- textColor: true
- },
- btnPressedTopBarText: {
- depends: ['btnTopBarText'],
- layer: 'btnTopBar',
- variant: 'btnPressed',
- textColor: true
- },
-
- // Buttons: toggled
- btnToggled: {
- depends: ['btn'],
- color: (mod, btn) => brightness(mod * 20, btn).rgb
- },
- btnToggledText: {
- depends: ['btnText'],
- layer: 'btn',
- variant: 'btnToggled',
- textColor: true
- },
- btnToggledPanelText: {
- depends: ['btnPanelText'],
- layer: 'btnPanel',
- variant: 'btnToggled',
- textColor: true
- },
- btnToggledTopBarText: {
- depends: ['btnTopBarText'],
- layer: 'btnTopBar',
- variant: 'btnToggled',
- textColor: true
- },
-
- // Buttons: disabled
- btnDisabled: {
- depends: ['btn', 'bg'],
- color: (mod, btn, bg) => alphaBlend(btn, 0.5, bg)
- },
- btnDisabledText: {
- depends: ['btnText'],
- layer: 'btn',
- variant: 'btnDisabled',
- textColor: true,
- color: (mod, text) => brightness(mod * -60, text).rgb
- },
- btnDisabledPanelText: {
- depends: ['btnPanelText'],
- layer: 'btnPanel',
- variant: 'btnDisabled',
- textColor: true,
- color: (mod, text) => brightness(mod * -60, text).rgb
- },
- btnDisabledTopBarText: {
- depends: ['btnTopBarText'],
- layer: 'btnTopBar',
- variant: 'btnDisabled',
- textColor: true,
- color: (mod, text) => brightness(mod * -60, text).rgb
- },
-
- // Input fields
- input: {
- depends: ['fg'],
- opacity: 'input'
- },
- inputText: {
- depends: ['text'],
- layer: 'input',
- textColor: true
- },
- inputPanelText: {
- depends: ['panelText'],
- layer: 'inputPanel',
- variant: 'input',
- textColor: true
- },
- inputTopbarText: {
- depends: ['topBarText'],
- layer: 'inputTopBar',
- variant: 'input',
- textColor: true
- },
-
- alertError: {
- depends: ['cRed'],
- opacity: 'alert'
- },
- alertErrorText: {
- depends: ['text'],
- layer: 'alert',
- variant: 'alertError',
- textColor: true
- },
- alertErrorPanelText: {
- depends: ['panelText'],
- layer: 'alertPanel',
- variant: 'alertError',
- textColor: true
- },
-
- alertWarning: {
- depends: ['cOrange'],
- opacity: 'alert'
- },
- alertWarningText: {
- depends: ['text'],
- layer: 'alert',
- variant: 'alertWarning',
- textColor: true
- },
- alertWarningPanelText: {
- depends: ['panelText'],
- layer: 'alertPanel',
- variant: 'alertWarning',
- textColor: true
- },
-
- badgeNotification: '--cRed',
- badgeNotificationText: {
- depends: ['text', 'badgeNotification'],
- layer: 'badge',
- variant: 'badgeNotification',
- textColor: 'bw'
- }
-}
-
export const getLayersArray = (layer, data = LAYERS) => {
let array = [layer]
let parent = data[layer]
--
cgit v1.2.3-70-g09d2
From 53576df72aff5405ab30764e5cfcf2162bde37bc Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Fri, 24 Jan 2020 00:02:16 +0200
Subject: popover/selected menu improvements
---
src/components/emoji_input/emoji_input.vue | 11 +++---
src/components/popper/popper.scss | 7 +++-
src/components/side_drawer/side_drawer.vue | 7 +++-
src/components/style_switcher/style_switcher.vue | 29 ++++++++++++++++
src/services/theme_data/pleromafe.js | 44 +++++++++++++++++++++---
5 files changed, 87 insertions(+), 11 deletions(-)
(limited to 'src/services')
diff --git a/src/components/emoji_input/emoji_input.vue b/src/components/emoji_input/emoji_input.vue
index 46ed6f25..9c2501a9 100644
--- a/src/components/emoji_input/emoji_input.vue
+++ b/src/components/emoji_input/emoji_input.vue
@@ -109,10 +109,13 @@
box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.5);
box-shadow: var(--popupShadow);
min-width: 75%;
- background: $fallback--bg;
- background: var(--bg, $fallback--bg);
- color: $fallback--lightText;
- color: var(--lightText, $fallback--lightText);
+ background-color: $fallback--bg;
+ background-color: var(--popover, $fallback--bg);
+ color: $fallback--link;
+ color: var(--popoverText, $fallback--link);
+ --faint: var(--popoverFaintText, $fallback--faint);
+ --faintLink: var(--popoverFaintLink, $fallback--faint);
+ --icon: var(--popoverIcon, $fallback--icon);
}
}
diff --git a/src/components/popper/popper.scss b/src/components/popper/popper.scss
index 9c2ce25f..e70b277d 100644
--- a/src/components/popper/popper.scss
+++ b/src/components/popper/popper.scss
@@ -9,7 +9,12 @@
border-radius: $fallback--btnRadius;
border-radius: var(--btnRadius, $fallback--btnRadius);
background-color: $fallback--bg;
- background-color: var(--bg, $fallback--bg);
+ background-color: var(--popover, $fallback--bg);
+ color: $fallback--text;
+ color: var(--popoverText, $fallback--text);
+ --faint: var(--popoverFaintText, $fallback--faint);
+ --faintLink: var(--popoverFaintLink, $fallback--faint);
+ --icon: var(--popoverIcon, $fallback--icon);
}
.popover-arrow {
diff --git a/src/components/side_drawer/side_drawer.vue b/src/components/side_drawer/side_drawer.vue
index 3188fd59..a5b754d7 100644
--- a/src/components/side_drawer/side_drawer.vue
+++ b/src/components/side_drawer/side_drawer.vue
@@ -223,7 +223,12 @@
box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.6);
box-shadow: var(--panelShadow);
background-color: $fallback--bg;
- background-color: var(--bg, $fallback--bg);
+ background-color: var(--popover, $fallback--bg);
+ color: $fallback--link;
+ color: var(--popoverText, $fallback--link);
+ --faint: var(--popoverFaintText, $fallback--faint);
+ --faintLink: var(--popoverFaintLink, $fallback--faint);
+ --icon: var(--popoverIcon, $fallback--icon);
.button-icon:before {
width: 1.1em;
diff --git a/src/components/style_switcher/style_switcher.vue b/src/components/style_switcher/style_switcher.vue
index ff7f4710..1c39a806 100644
--- a/src/components/style_switcher/style_switcher.vue
+++ b/src/components/style_switcher/style_switcher.vue
@@ -554,6 +554,35 @@
/>
+
+
{{ $t('settings.style.advanced_colors.popover') }}
+
+
+
+
+
+
+
{{ $t('settings.style.advanced_colors.selectedPost') }}
mixrgb(bg, text)
},
+ popover: {
+ depends: ['bg'],
+ opacity: 'popover'
+ },
+ popoverFaintText: {
+ depends: ['faint'],
+ layer: 'popover',
+ textColor: true
+ },
+ popoverFaintLink: {
+ depends: ['faintLink'],
+ layer: 'popover',
+ textColor: 'preserve'
+ },
+ popoverText: {
+ depends: ['text'],
+ layer: 'popover',
+ textColor: true
+ },
+ popoverLink: {
+ depends: ['link'],
+ layer: 'popover',
+ textColor: 'preserve'
+ },
+ popoverIcon: {
+ depends: ['popover', 'popoverText'],
+ color: (mod, bg, text) => mixrgb(bg, text)
+ },
+
selectedPost: '--highlight',
selectedPostFaintText: {
depends: ['highlightFaintText'],
@@ -170,28 +201,31 @@ export const SLOT_INHERITANCE = {
color: (mod, bg, text) => mixrgb(bg, text)
},
- selectedMenu: '--highlight',
+ selectedMenu: {
+ depends: ['popover'],
+ color: (mod, bg) => brightness(5 * mod, bg).rgb
+ },
selectedMenuFaintText: {
depends: ['highlightFaintText'],
- layer: 'highlight',
+ layer: 'selectedMenu',
variant: 'selectedMenu',
textColor: true
},
selectedMenuFaintLink: {
depends: ['highlightFaintLink'],
- layer: 'highlight',
+ layer: 'selectedMenu',
variant: 'selectedMenu',
textColor: 'preserve'
},
selectedMenuText: {
depends: ['highlightText'],
- layer: 'highlight',
+ layer: 'selectedMenu',
variant: 'selectedMenu',
textColor: true
},
selectedMenuLink: {
depends: ['highlightLink'],
- layer: 'highlight',
+ layer: 'selectedMenu',
variant: 'selectedMenu',
textColor: 'preserve'
},
--
cgit v1.2.3-70-g09d2
From b96993e4dd6b2d9197b430af404e8fa652888b51 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Fri, 24 Jan 2020 00:36:32 +0200
Subject: improved selectedMenu again
---
src/components/emoji_input/emoji_input.vue | 12 +++--
src/components/emoji_picker/emoji_picker.scss | 9 ++++
src/components/nav_panel/nav_panel.vue | 2 +
src/components/popper/popper.scss | 12 +++--
src/components/selectable_list/selectable_list.vue | 1 +
src/components/side_drawer/side_drawer.vue | 12 +++--
src/components/status/status.vue | 1 +
src/services/color_convert/color_convert.js | 2 +-
src/services/theme_data/pleromafe.js | 63 +++++++++++++++++++++-
src/services/theme_data/theme_data.service.js | 7 +--
static/themes/breezy-dark.json | 4 +-
static/themes/breezy-light.json | 4 +-
12 files changed, 105 insertions(+), 24 deletions(-)
(limited to 'src/services')
diff --git a/src/components/emoji_input/emoji_input.vue b/src/components/emoji_input/emoji_input.vue
index 9c2501a9..94eae560 100644
--- a/src/components/emoji_input/emoji_input.vue
+++ b/src/components/emoji_input/emoji_input.vue
@@ -115,6 +115,7 @@
color: var(--popoverText, $fallback--link);
--faint: var(--popoverFaintText, $fallback--faint);
--faintLink: var(--popoverFaintLink, $fallback--faint);
+ --lightText: var(--popoverLightText, $fallback--lightText);
--icon: var(--popoverIcon, $fallback--icon);
}
}
@@ -160,11 +161,12 @@
&.highlighted {
background-color: $fallback--fg;
- background-color: var(--selectedMenu, $fallback--fg);
- color: var(--selectedMenuText, $fallback--text);
- --faint: var(--selectedMenuFaintText, $fallback--faint);
- --faintLink: var(--selectedMenuFaintLink, $fallback--faint);
- --icon: var(--selectedMenuIcon, $fallback--icon);
+ background-color: var(--selectedMenuPopover, $fallback--fg);
+ color: var(--selectedMenuPopoverText, $fallback--text);
+ --faint: var(--selectedMenuPopoverFaintText, $fallback--faint);
+ --faintLink: var(--selectedMenuPopoverFaintLink, $fallback--faint);
+ --lightText: var(--selectedMenuPopoverLightText, $fallback--lightText);
+ --icon: var(--selectedMenuPopoverIcon, $fallback--icon);
}
}
}
diff --git a/src/components/emoji_picker/emoji_picker.scss b/src/components/emoji_picker/emoji_picker.scss
index 6608f393..8bd07e45 100644
--- a/src/components/emoji_picker/emoji_picker.scss
+++ b/src/components/emoji_picker/emoji_picker.scss
@@ -8,6 +8,15 @@
left: 0;
margin: 0 !important;
z-index: 1;
+ background-color: $fallback--bg;
+ background-color: var(--popover, $fallback--bg);
+ color: $fallback--link;
+ color: var(--popoverText, $fallback--link);
+ --lightText: var(--popoverLightText, $fallback--faint);
+ --faint: var(--popoverFaintText, $fallback--faint);
+ --faintLink: var(--popoverFaintLink, $fallback--faint);
+ --lightText: var(--popoverLightText, $fallback--lightText);
+ --icon: var(--popoverIcon, $fallback--icon);
.keep-open,
.too-many-emoji {
diff --git a/src/components/nav_panel/nav_panel.vue b/src/components/nav_panel/nav_panel.vue
index afc611ea..a934a411 100644
--- a/src/components/nav_panel/nav_panel.vue
+++ b/src/components/nav_panel/nav_panel.vue
@@ -105,6 +105,7 @@
color: var(--selectedMenuText, $fallback--link);
--faint: var(--selectedMenuFaintText, $fallback--faint);
--faintLink: var(--selectedMenuFaintLink, $fallback--faint);
+ --lightText: var(--selectedMenuLightText, $fallback--lightText);
--icon: var(--selectedMenuIcon, $fallback--icon);
}
@@ -116,6 +117,7 @@
color: var(--selectedMenuText, $fallback--text);
--faint: var(--selectedMenuFaintText, $fallback--faint);
--faintLink: var(--selectedMenuFaintLink, $fallback--faint);
+ --lightText: var(--selectedMenuLightText, $fallback--lightText);
--icon: var(--selectedMenuIcon, $fallback--icon);
&:hover {
diff --git a/src/components/popper/popper.scss b/src/components/popper/popper.scss
index e70b277d..591be37e 100644
--- a/src/components/popper/popper.scss
+++ b/src/components/popper/popper.scss
@@ -14,6 +14,7 @@
color: var(--popoverText, $fallback--text);
--faint: var(--popoverFaintText, $fallback--faint);
--faintLink: var(--popoverFaintLink, $fallback--faint);
+ --lightText: var(--popoverLightText, $fallback--lightText);
--icon: var(--popoverIcon, $fallback--icon);
}
@@ -144,12 +145,13 @@
&:active, &:hover {
background-color: $fallback--lightBg;
- background-color: var(--selectedMenu, $fallback--lightBg);
+ background-color: var(--selectedMenuPopover, $fallback--lightBg);
color: $fallback--link;
- color: var(--selectedMenuText, $fallback--link);
- --faint: var(--selectedMenuFaintText, $fallback--faint);
- --faintLink: var(--selectedMenuFaintLink, $fallback--faint);
- --icon: var(--selectedMenuIcon, $fallback--icon);
+ color: var(--selectedMenuPopoverText, $fallback--link);
+ --faint: var(--selectedMenuPopoverFaintText, $fallback--faint);
+ --faintLink: var(--selectedMenuPopoverFaintLink, $fallback--faint);
+ --lightText: var(--selectedMenuPopoverLightText, $fallback--lightText);
+ --icon: var(--selectedMenuPopoverIcon, $fallback--icon);
}
}
}
diff --git a/src/components/selectable_list/selectable_list.vue b/src/components/selectable_list/selectable_list.vue
index 2d1e44a3..a9bb12a1 100644
--- a/src/components/selectable_list/selectable_list.vue
+++ b/src/components/selectable_list/selectable_list.vue
@@ -72,6 +72,7 @@
color: var(--selectedMenuText, $fallback--text);
--faint: var(--selectedMenuFaintText, $fallback--faint);
--faintLink: var(--selectedMenuFaintLink, $fallback--faint);
+ --lightText: var(--selectedMenuLightText, $fallback--lightText);
--icon: var(--selectedMenuIcon, $fallback--icon);
}
diff --git a/src/components/side_drawer/side_drawer.vue b/src/components/side_drawer/side_drawer.vue
index a5b754d7..25e4de01 100644
--- a/src/components/side_drawer/side_drawer.vue
+++ b/src/components/side_drawer/side_drawer.vue
@@ -228,6 +228,7 @@
color: var(--popoverText, $fallback--link);
--faint: var(--popoverFaintText, $fallback--faint);
--faintLink: var(--popoverFaintLink, $fallback--faint);
+ --lightText: var(--popoverLightText, $fallback--lightText);
--icon: var(--popoverIcon, $fallback--icon);
.button-icon:before {
@@ -294,12 +295,13 @@
&:hover {
background-color: $fallback--lightBg;
- background-color: var(--selectedMenu, $fallback--lightBg);
+ background-color: var(--selectedMenuPopover, $fallback--lightBg);
color: $fallback--text;
- color: var(--selectedMenuText, $fallback--text);
- --faint: var(--selectedMenuFaintText, $fallback--faint);
- --faintLink: var(--selectedMenuFaintLink, $fallback--faint);
- --icon: var(--selectedMenuIcon, $fallback--icon);
+ color: var(--selectedMenuPopoverText, $fallback--text);
+ --faint: var(--selectedMenuPopoverFaintText, $fallback--faint);
+ --faintLink: var(--selectedMenuPopoverFaintLink, $fallback--faint);
+ --lightText: var(--selectedMenuPopoverLightText, $fallback--lightText);
+ --icon: var(--selectedMenuPopoverIcon, $fallback--icon);
}
}
}
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index 38d091ed..1997e187 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -448,6 +448,7 @@ $status-margin: 0.75em;
background-color: var(--selectedPost, $fallback--lightBg);
color: $fallback--text;
color: var(--selectedPostText, $fallback--text);
+ --lightText: var(--selectedPostLightText, $fallback--light);
--faint: var(--selectedPostFaintText, $fallback--faint);
--faintLink: var(--selectedPostFaintLink, $fallback--faint);
--icon: var(--selectedPostIcon, $fallback--icon);
diff --git a/src/services/color_convert/color_convert.js b/src/services/color_convert/color_convert.js
index 93cb1ba6..0bf8f646 100644
--- a/src/services/color_convert/color_convert.js
+++ b/src/services/color_convert/color_convert.js
@@ -69,7 +69,7 @@ const srgbToLinear = (srgb) => {
* @param {Object} srgb - sRGB color
* @returns {Number} relative luminance
*/
-const relativeLuminance = (srgb) => {
+export const relativeLuminance = (srgb) => {
const { r, g, b } = srgbToLinear(srgb)
return 0.2126 * r + 0.7152 * g + 0.0722 * b
}
diff --git a/src/services/theme_data/pleromafe.js b/src/services/theme_data/pleromafe.js
index 484874d7..a40d08a6 100644
--- a/src/services/theme_data/pleromafe.js
+++ b/src/services/theme_data/pleromafe.js
@@ -117,6 +117,11 @@ export const SLOT_INHERITANCE = {
depends: ['bg'],
color: (mod, bg) => brightness(5 * mod, bg).rgb
},
+ highlightLightText: {
+ depends: ['lightText'],
+ layer: 'highlight',
+ textColor: true
+ },
highlightFaintText: {
depends: ['faint'],
layer: 'highlight',
@@ -146,6 +151,11 @@ export const SLOT_INHERITANCE = {
depends: ['bg'],
opacity: 'popover'
},
+ popoverLightText: {
+ depends: ['lightText'],
+ layer: 'popover',
+ textColor: true
+ },
popoverFaintText: {
depends: ['faint'],
layer: 'popover',
@@ -178,6 +188,12 @@ export const SLOT_INHERITANCE = {
variant: 'selectedPost',
textColor: true
},
+ selectedPostLightText: {
+ depends: ['highlightLightText'],
+ layer: 'highlight',
+ variant: 'selectedPost',
+ textColor: true
+ },
selectedPostFaintLink: {
depends: ['highlightFaintLink'],
layer: 'highlight',
@@ -202,9 +218,15 @@ export const SLOT_INHERITANCE = {
},
selectedMenu: {
- depends: ['popover'],
+ depends: ['bg'],
color: (mod, bg) => brightness(5 * mod, bg).rgb
},
+ selectedMenuLightText: {
+ depends: ['highlightLightText'],
+ layer: 'selectedMenu',
+ variant: 'selectedMenu',
+ textColor: true
+ },
selectedMenuFaintText: {
depends: ['highlightFaintText'],
layer: 'selectedMenu',
@@ -234,6 +256,45 @@ export const SLOT_INHERITANCE = {
color: (mod, bg, text) => mixrgb(bg, text)
},
+ selectedMenuPopover: {
+ depends: ['popover'],
+ color: (mod, bg) => brightness(5 * mod, bg).rgb
+ },
+ selectedMenuPopoverLightText: {
+ depends: ['selectedMenuLightText'],
+ layer: 'selectedMenuPopover',
+ variant: 'selectedMenuPopover',
+ textColor: true
+ },
+ selectedMenuPopoverFaintText: {
+ depends: ['selectedMenuFaintText'],
+ layer: 'selectedMenuPopover',
+ variant: 'selectedMenuPopover',
+ textColor: true
+ },
+ selectedMenuPopoverFaintLink: {
+ depends: ['selectedMenuFaintLink'],
+ layer: 'selectedMenuPopover',
+ variant: 'selectedMenuPopover',
+ textColor: 'preserve'
+ },
+ selectedMenuPopoverText: {
+ depends: ['selectedMenuText'],
+ layer: 'selectedMenuPopover',
+ variant: 'selectedMenuPopover',
+ textColor: true
+ },
+ selectedMenuPopoverLink: {
+ depends: ['selectedMenuLink'],
+ layer: 'selectedMenuPopover',
+ variant: 'selectedMenuPopover',
+ textColor: 'preserve'
+ },
+ selectedMenuPopoverIcon: {
+ depends: ['selectedMenuPopover', 'selectedMenuText'],
+ color: (mod, bg, text) => mixrgb(bg, text)
+ },
+
lightText: {
depends: ['text'],
color: (mod, text) => brightness(20 * mod, text).rgb
diff --git a/src/services/theme_data/theme_data.service.js b/src/services/theme_data/theme_data.service.js
index ea28481b..c0861a4a 100644
--- a/src/services/theme_data/theme_data.service.js
+++ b/src/services/theme_data/theme_data.service.js
@@ -1,5 +1,5 @@
import { convert, brightness, contrastRatio } from 'chromatism'
-import { alphaBlendLayers, getTextColor } from '../color_convert/color_convert.js'
+import { alphaBlendLayers, getTextColor, relativeLuminance } from '../color_convert/color_convert.js'
import { LAYERS, DEFAULT_OPACITY, SLOT_INHERITANCE } from './pleromafe.js'
/*
@@ -318,13 +318,14 @@ export const getColors = (sourceColors, sourceOpacity, mod) => SLOT_ORDERED.redu
opacity
)
)
+ const isLightOnDark = relativeLuminance(bg) > 127
+ const mod = isLightOnDark ? 1 : -1
+
if (value.textColor === 'bw') {
outputColor = contrastRatio(bg).rgb
} else {
let color = { ...colors[deps[0]] }
if (value.color) {
- const isLightOnDark = convert(bg).hsl.l < convert(color).hsl.l
- const mod = isLightOnDark ? 1 : -1
color = value.color(mod, ...deps.map((dep) => ({ ...colors[dep] })))
}
diff --git a/static/themes/breezy-dark.json b/static/themes/breezy-dark.json
index c3bdcf65..236b94ad 100644
--- a/static/themes/breezy-dark.json
+++ b/static/themes/breezy-dark.json
@@ -114,8 +114,8 @@
"cGreen": "#27ae60",
"cOrange": "#f67400",
"btnPressed": "--accent",
- "highlight": "--accent",
- "selectedPost": "--bg,10"
+ "selectedMenu": "--accent",
+ "selectedMenuPopover": "--accent"
},
"radii": {
"btn": "2",
diff --git a/static/themes/breezy-light.json b/static/themes/breezy-light.json
index 478407c9..d3f74cec 100644
--- a/static/themes/breezy-light.json
+++ b/static/themes/breezy-light.json
@@ -117,8 +117,8 @@
"cGreen": "#27ae60",
"cOrange": "#f67400",
"btnPressed": "--accent",
- "highlight": "--accent",
- "selectedPost": "--bg,10"
+ "selectedMenu": "--accent",
+ "selectedMenuPopover": "--accent"
},
"radii": {
"btn": "2",
--
cgit v1.2.3-70-g09d2
From d7e7f47b66de160b351e4e836de08ac188fc3079 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Fri, 24 Jan 2020 00:56:47 +0200
Subject: fix transparent color not affecting downstream slots
---
src/services/theme_data/theme_data.service.js | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
(limited to 'src/services')
diff --git a/src/services/theme_data/theme_data.service.js b/src/services/theme_data/theme_data.service.js
index c0861a4a..0a6733a9 100644
--- a/src/services/theme_data/theme_data.service.js
+++ b/src/services/theme_data/theme_data.service.js
@@ -326,7 +326,7 @@ export const getColors = (sourceColors, sourceOpacity, mod) => SLOT_ORDERED.redu
} else {
let color = { ...colors[deps[0]] }
if (value.color) {
- color = value.color(mod, ...deps.map((dep) => ({ ...colors[dep] })))
+ color = colorFunc(mod, ...deps.map((dep) => ({ ...colors[dep] })))
}
outputColor = getTextColor(
@@ -348,7 +348,13 @@ export const getColors = (sourceColors, sourceOpacity, mod) => SLOT_ORDERED.redu
}
const opacitySlot = getOpacitySlot(key)
if (opacitySlot && outputColor.a === undefined) {
- outputColor.a = sourceOpacity[opacitySlot] || OPACITIES[opacitySlot].defaultValue || 1
+ const deps = getDependencies(key, SLOT_INHERITANCE)
+ const dependencySlot = deps && deps[0]
+ if (dependencySlot && sourceColors[dependencySlot] === 'transparent') {
+ outputColor.a = 0
+ } else {
+ outputColor.a = sourceOpacity[opacitySlot] || OPACITIES[opacitySlot].defaultValue || 1
+ }
}
if (opacitySlot) {
return {
--
cgit v1.2.3-70-g09d2
From a018ea622c4ae34fd204e840b20aba53f84cd051 Mon Sep 17 00:00:00 2001
From: Shpuld Shpuldson
Date: Sun, 26 Jan 2020 15:45:12 +0200
Subject: change emoji reactions to use new format
---
src/components/conversation/conversation.js | 2 +-
src/components/emoji_reactions/emoji_reactions.js | 9 ++-
src/components/emoji_reactions/emoji_reactions.vue | 12 ++--
src/components/status/status.vue | 1 -
src/modules/statuses.js | 66 +++++++++++++---------
.../entity_normalizer/entity_normalizer.service.js | 1 +
test/unit/specs/modules/statuses.spec.js | 45 +++++++++++++++
7 files changed, 99 insertions(+), 37 deletions(-)
(limited to 'src/services')
diff --git a/src/components/conversation/conversation.js b/src/components/conversation/conversation.js
index 7ff0ac08..45fb2bf6 100644
--- a/src/components/conversation/conversation.js
+++ b/src/components/conversation/conversation.js
@@ -150,7 +150,7 @@ const conversation = {
if (!id) return
this.highlight = id
this.$store.dispatch('fetchFavsAndRepeats', id)
- this.$store.dispatch('fetchEmojiReactions', id)
+ this.$store.dispatch('fetchEmojiReactionsBy', id)
},
getHighlight () {
return this.isExpanded ? this.highlight : null
diff --git a/src/components/emoji_reactions/emoji_reactions.js b/src/components/emoji_reactions/emoji_reactions.js
index e81e6e25..b37cce3d 100644
--- a/src/components/emoji_reactions/emoji_reactions.js
+++ b/src/components/emoji_reactions/emoji_reactions.js
@@ -4,12 +4,17 @@ const EmojiReactions = {
props: ['status'],
computed: {
emojiReactions () {
- return this.status.emojiReactions
+ console.log(this.status.emoji_reactions)
+ return this.status.emoji_reactions
}
},
methods: {
reactedWith (emoji) {
- return this.status.reactedWithEmoji.includes(emoji)
+ // return []
+ const user = this.$store.state.users.currentUser
+ const reaction = this.status.emoji_reactions.find(r => r.emoji === emoji)
+ console.log(reaction)
+ return reaction.accounts && reaction.accounts.find(u => u.id === user.id)
},
reactWith (emoji) {
this.$store.dispatch('reactWithEmoji', { id: this.status.id, emoji })
diff --git a/src/components/emoji_reactions/emoji_reactions.vue b/src/components/emoji_reactions/emoji_reactions.vue
index d83f60b6..8a229240 100644
--- a/src/components/emoji_reactions/emoji_reactions.vue
+++ b/src/components/emoji_reactions/emoji_reactions.vue
@@ -1,14 +1,14 @@
- {{ users.length }}
- {{ emoji }}
+ {{ reaction.count }}
+ {{ reaction.emoji }}
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index 87e8b5da..d5739304 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -355,7 +355,6 @@
diff --git a/src/modules/statuses.js b/src/modules/statuses.js
index dbae9d38..ea0c1749 100644
--- a/src/modules/statuses.js
+++ b/src/modules/statuses.js
@@ -10,10 +10,7 @@ import {
first,
last,
isArray,
- omitBy,
- flow,
- filter,
- keys
+ omitBy
} from 'lodash'
import { set } from 'vue'
import apiService from '../services/api/api.service.js'
@@ -534,33 +531,48 @@ export const mutations = {
newStatus.fave_num = newStatus.favoritedBy.length
newStatus.favorited = !!newStatus.favoritedBy.find(({ id }) => currentUser.id === id)
},
- addEmojiReactions (state, { id, emojiReactions, currentUser }) {
+ addEmojiReactionsBy (state, { id, emojiReactions, currentUser }) {
const status = state.allStatusesObject[id]
- set(status, 'emojiReactions', emojiReactions)
- const reactedWithEmoji = flow(
- keys,
- filter(reaction => find(reaction, { id: currentUser.id }))
- )(emojiReactions)
- set(status, 'reactedWithEmoji', reactedWithEmoji)
+ set(status, 'emoji_reactions', emojiReactions)
},
addOwnReaction (state, { id, emoji, currentUser }) {
const status = state.allStatusesObject[id]
- status.emojiReactions = status.emojiReactions || {}
- const listOfUsers = (status.emojiReactions && status.emojiReactions[emoji]) || []
- const hasSelfAlready = !!find(listOfUsers, { id: currentUser.id })
- if (!hasSelfAlready) {
- set(status.emojiReactions, emoji, listOfUsers.concat([{ id: currentUser.id }]))
- set(status, 'reactedWithEmoji', [...status.reactedWithEmoji, emoji])
+ const reactionIndex = findIndex(status.emoji_reactions, { emoji })
+ const reaction = status.emoji_reactions[reactionIndex] || { emoji, count: 0, accounts: [] }
+
+ const newReaction = {
+ ...reaction,
+ count: reaction.count + 1,
+ accounts: [
+ ...reaction.accounts,
+ currentUser
+ ]
+ }
+
+ // Update count of existing reaction if it exists, otherwise append at the end
+ if (reactionIndex >= 0) {
+ set(status.emoji_reactions, reactionIndex, newReaction)
+ } else {
+ set(status, 'emoji_reactions', [...status.emoji_reactions, newReaction])
}
},
removeOwnReaction (state, { id, emoji, currentUser }) {
const status = state.allStatusesObject[id]
- const listOfUsers = status.emojiReactions[emoji] || []
- const hasSelfAlready = !!find(listOfUsers, { id: currentUser.id })
- if (hasSelfAlready) {
- const newUsers = filter(listOfUsers, user => user.id !== currentUser.id)
- set(status.emojiReactions, emoji, newUsers)
- set(status, 'reactedWithEmoji', status.reactedWithEmoji.filter(e => e !== emoji))
+ const reactionIndex = findIndex(status.emoji_reactions, { emoji })
+ if (reactionIndex < 0) return
+
+ const reaction = status.emoji_reactions[reactionIndex]
+
+ const newReaction = {
+ ...reaction,
+ count: reaction.count - 1,
+ accounts: reaction.accounts.filter(acc => acc.id === currentUser.id)
+ }
+
+ if (newReaction.count > 0) {
+ set(status.emoji_reactions, reactionIndex, newReaction)
+ } else {
+ set(status, 'emoji_reactions', status.emoji_reactions.filter(r => r.emoji !== emoji))
}
},
updateStatusWithPoll (state, { id, poll }) {
@@ -672,7 +684,7 @@ const statuses = {
commit('addOwnReaction', { id, emoji, currentUser })
rootState.api.backendInteractor.reactWithEmoji({ id, emoji }).then(
status => {
- dispatch('fetchEmojiReactions', id)
+ dispatch('fetchEmojiReactionsBy', id)
}
)
},
@@ -681,14 +693,14 @@ const statuses = {
commit('removeOwnReaction', { id, emoji, currentUser })
rootState.api.backendInteractor.unreactWithEmoji({ id, emoji }).then(
status => {
- dispatch('fetchEmojiReactions', id)
+ dispatch('fetchEmojiReactionsBy', id)
}
)
},
- fetchEmojiReactions ({ rootState, commit }, id) {
+ fetchEmojiReactionsBy ({ rootState, commit }, id) {
rootState.api.backendInteractor.fetchEmojiReactions({ id }).then(
emojiReactions => {
- commit('addEmojiReactions', { id, emojiReactions, currentUser: rootState.users.currentUser })
+ commit('addEmojiReactionsBy', { id, emojiReactions, currentUser: rootState.users.currentUser })
}
)
},
diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js
index ee007bee..03eaa5d7 100644
--- a/src/services/entity_normalizer/entity_normalizer.service.js
+++ b/src/services/entity_normalizer/entity_normalizer.service.js
@@ -233,6 +233,7 @@ export const parseStatus = (data) => {
output.statusnet_html = addEmojis(data.content, data.emojis)
output.tags = data.tags
+ output.emoji_reactions = [{ emoji: 'A', count: 5 }] // data.pleroma.emoji_reactions
if (data.pleroma) {
const { pleroma } = data
diff --git a/test/unit/specs/modules/statuses.spec.js b/test/unit/specs/modules/statuses.spec.js
index f794997b..e53aa388 100644
--- a/test/unit/specs/modules/statuses.spec.js
+++ b/test/unit/specs/modules/statuses.spec.js
@@ -241,6 +241,51 @@ describe('Statuses module', () => {
})
})
+ describe('emojiReactions', () => {
+ it('increments count in existing reaction', () => {
+ const state = defaultState()
+ const status = makeMockStatus({ id: '1' })
+ status.emoji_reactions = [ { emoji: '😂', count: 1, accounts: [] } ]
+
+ mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
+ mutations.addOwnReaction(state, { id: '1', emoji: '😂', currentUser: { id: 'me' } })
+ expect(state.allStatusesObject['1'].emoji_reactions[0].count).to.eql(2)
+ expect(state.allStatusesObject['1'].emoji_reactions[0].accounts[0].id).to.eql('me')
+ })
+
+ it('adds a new reaction', () => {
+ const state = defaultState()
+ const status = makeMockStatus({ id: '1' })
+ status.emoji_reactions = []
+
+ mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
+ mutations.addOwnReaction(state, { id: '1', emoji: '😂', currentUser: { id: 'me' } })
+ expect(state.allStatusesObject['1'].emoji_reactions[0].count).to.eql(1)
+ expect(state.allStatusesObject['1'].emoji_reactions[0].accounts[0].id).to.eql('me')
+ })
+
+ it('decreases count in existing reaction', () => {
+ const state = defaultState()
+ const status = makeMockStatus({ id: '1' })
+ status.emoji_reactions = [ { emoji: '😂', count: 2, accounts: [{ id: 'me' }] } ]
+
+ mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
+ mutations.removeOwnReaction(state, { id: '1', emoji: '😂', currentUser: {} })
+ expect(state.allStatusesObject['1'].emoji_reactions[0].count).to.eql(1)
+ expect(state.allStatusesObject['1'].emoji_reactions[0].accounts).to.eql([])
+ })
+
+ it('removes a reaction', () => {
+ const state = defaultState()
+ const status = makeMockStatus({ id: '1' })
+ status.emoji_reactions = [{ emoji: '😂', count: 1, accounts: [{ id: 'me' }] }]
+
+ mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
+ mutations.removeOwnReaction(state, { id: '1', emoji: '😂', currentUser: {} })
+ expect(state.allStatusesObject['1'].emoji_reactions.length).to.eql(0)
+ })
+ })
+
describe('showNewStatuses', () => {
it('resets the minId to the min of the visible statuses when adding new to visible statuses', () => {
const state = defaultState()
--
cgit v1.2.3-70-g09d2
From 7cfe1b05e8d16fcbb6eab3b42f19e464d57ea35b Mon Sep 17 00:00:00 2001
From: Shpuld Shpuldson
Date: Sun, 26 Jan 2020 15:57:40 +0200
Subject: remove mock data
---
src/services/entity_normalizer/entity_normalizer.service.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'src/services')
diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js
index 03eaa5d7..f66d09ac 100644
--- a/src/services/entity_normalizer/entity_normalizer.service.js
+++ b/src/services/entity_normalizer/entity_normalizer.service.js
@@ -233,7 +233,7 @@ export const parseStatus = (data) => {
output.statusnet_html = addEmojis(data.content, data.emojis)
output.tags = data.tags
- output.emoji_reactions = [{ emoji: 'A', count: 5 }] // data.pleroma.emoji_reactions
+ output.emoji_reactions = data.pleroma.emoji_reactions
if (data.pleroma) {
const { pleroma } = data
--
cgit v1.2.3-70-g09d2
From 7c074b87418602effac03c4bae34afffcfca283f Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Mon, 27 Jan 2020 04:20:13 +0200
Subject: fix rgba css generation, add some tests to automatically verify that
themes are generated properly
---
build/webpack.base.conf.js | 1 +
src/services/color_convert/color_convert.js | 2 +-
src/services/theme_data/theme_data.service.js | 2 +-
static/themes/redmond-xx-se.json | 2 +-
static/themes/redmond-xx.json | 2 +-
static/themes/redmond-xxi.json | 2 +-
.../services/theme_data/sanity_checks.spec.js | 28 ++++
.../specs/services/theme_data/theme_data.spec.js | 147 +++++++++++----------
8 files changed, 109 insertions(+), 77 deletions(-)
create mode 100644 test/unit/specs/services/theme_data/sanity_checks.spec.js
(limited to 'src/services')
diff --git a/build/webpack.base.conf.js b/build/webpack.base.conf.js
index 5cc0135e..dfef37a6 100644
--- a/build/webpack.base.conf.js
+++ b/build/webpack.base.conf.js
@@ -35,6 +35,7 @@ module.exports = {
],
alias: {
'vue$': 'vue/dist/vue.runtime.common',
+ 'static': path.resolve(__dirname, '../static'),
'src': path.resolve(__dirname, '../src'),
'assets': path.resolve(__dirname, '../src/assets'),
'components': path.resolve(__dirname, '../src/components')
diff --git a/src/services/color_convert/color_convert.js b/src/services/color_convert/color_convert.js
index 0bf8f646..b5461038 100644
--- a/src/services/color_convert/color_convert.js
+++ b/src/services/color_convert/color_convert.js
@@ -171,7 +171,7 @@ export const mixrgb = (a, b) => {
* @returns {String} CSS rgba() color
*/
export const rgba2css = function (rgba) {
- return `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`
+ return `rgba(${Math.floor(rgba.r)}, ${Math.floor(rgba.g)}, ${Math.floor(rgba.b)}, .5)`
}
/**
diff --git a/src/services/theme_data/theme_data.service.js b/src/services/theme_data/theme_data.service.js
index 0a6733a9..49b99148 100644
--- a/src/services/theme_data/theme_data.service.js
+++ b/src/services/theme_data/theme_data.service.js
@@ -353,7 +353,7 @@ export const getColors = (sourceColors, sourceOpacity, mod) => SLOT_ORDERED.redu
if (dependencySlot && sourceColors[dependencySlot] === 'transparent') {
outputColor.a = 0
} else {
- outputColor.a = sourceOpacity[opacitySlot] || OPACITIES[opacitySlot].defaultValue || 1
+ outputColor.a = Number(sourceOpacity[opacitySlot]) || OPACITIES[opacitySlot].defaultValue || 1
}
}
if (opacitySlot) {
diff --git a/static/themes/redmond-xx-se.json b/static/themes/redmond-xx-se.json
index 1a867fcc..8deab7b7 100644
--- a/static/themes/redmond-xx-se.json
+++ b/static/themes/redmond-xx-se.json
@@ -1,7 +1,7 @@
{
"_pleroma_theme_version": 2,
"name": "Redmond XX SE",
- "theme": {
+ "source": {
"shadows": {
"panel": [
{
diff --git a/static/themes/redmond-xx.json b/static/themes/redmond-xx.json
index 78c92f10..cdb89fe3 100644
--- a/static/themes/redmond-xx.json
+++ b/static/themes/redmond-xx.json
@@ -1,7 +1,7 @@
{
"_pleroma_theme_version": 2,
"name": "Redmond XX",
- "theme": {
+ "source": {
"shadows": {
"panel": [
{
diff --git a/static/themes/redmond-xxi.json b/static/themes/redmond-xxi.json
index 28f68351..79a2cb26 100644
--- a/static/themes/redmond-xxi.json
+++ b/static/themes/redmond-xxi.json
@@ -1,7 +1,7 @@
{
"_pleroma_theme_version": 2,
"name": "Redmond XXI",
- "theme": {
+ "source": {
"shadows": {
"panel": [
{
diff --git a/test/unit/specs/services/theme_data/sanity_checks.spec.js b/test/unit/specs/services/theme_data/sanity_checks.spec.js
new file mode 100644
index 00000000..f0072e7d
--- /dev/null
+++ b/test/unit/specs/services/theme_data/sanity_checks.spec.js
@@ -0,0 +1,28 @@
+import { getColors } from 'src/services/theme_data/theme_data.service.js'
+
+const checkColors = (output) => {
+ expect(output).to.have.property('colors')
+ Object.entries(output.colors).forEach(([key, v]) => {
+ expect(v, key).to.be.an('object')
+ expect(v, key).to.include.all.keys('r', 'g', 'b')
+ 'rgba'.split('').forEach(k => {
+ if ((k === 'a' && v.hasOwnProperty('a')) || k !== 'a') {
+ expect(v[k], key + '.' + k).to.be.a('number')
+ expect(v[k], key + '.' + k).to.be.least(0)
+ expect(v[k], key + '.' + k).to.be.most(k === 'a' ? 1 : 255)
+ }
+ })
+ })
+}
+
+describe('Theme Data utility functions', () => {
+ const context = require.context('static/themes/', false, /\.json$/)
+ context.keys().forEach((key) => {
+ it(`Should render all colors for ${key} properly`, () => {
+ const { theme, source } = context(key)
+ const data = source || theme
+ const colors = getColors(data.colors, data.opacity, 1)
+ checkColors(colors)
+ })
+ })
+})
diff --git a/test/unit/specs/services/theme_data/theme_data.spec.js b/test/unit/specs/services/theme_data/theme_data.spec.js
index d8a04ba7..67f4fd5a 100644
--- a/test/unit/specs/services/theme_data/theme_data.spec.js
+++ b/test/unit/specs/services/theme_data/theme_data.spec.js
@@ -1,87 +1,90 @@
import { getLayersArray, topoSort } from 'src/services/theme_data/theme_data.service.js'
-describe('getLayersArray', () => {
- const fixture = {
- layer1: null,
- layer2: 'layer1',
- layer3a: 'layer2',
- layer3b: 'layer2'
- }
+describe('Theme Data utility functions', () => {
+ describe('getLayersArray', () => {
+ const fixture = {
+ layer1: null,
+ layer2: 'layer1',
+ layer3a: 'layer2',
+ layer3b: 'layer2'
+ }
- it('should expand layers properly (3b)', () => {
- const out = getLayersArray('layer3b', fixture)
- expect(out).to.eql(['layer1', 'layer2', 'layer3b'])
- })
+ it('should expand layers properly (3b)', () => {
+ const out = getLayersArray('layer3b', fixture)
+ expect(out).to.eql(['layer1', 'layer2', 'layer3b'])
+ })
- it('should expand layers properly (3a)', () => {
- const out = getLayersArray('layer3a', fixture)
- expect(out).to.eql(['layer1', 'layer2', 'layer3a'])
- })
+ it('should expand layers properly (3a)', () => {
+ const out = getLayersArray('layer3a', fixture)
+ expect(out).to.eql(['layer1', 'layer2', 'layer3a'])
+ })
- it('should expand layers properly (2)', () => {
- const out = getLayersArray('layer2', fixture)
- expect(out).to.eql(['layer1', 'layer2'])
- })
+ it('should expand layers properly (2)', () => {
+ const out = getLayersArray('layer2', fixture)
+ expect(out).to.eql(['layer1', 'layer2'])
+ })
- it('should expand layers properly (1)', () => {
- const out = getLayersArray('layer1', fixture)
- expect(out).to.eql(['layer1'])
+ it('should expand layers properly (1)', () => {
+ const out = getLayersArray('layer1', fixture)
+ expect(out).to.eql(['layer1'])
+ })
})
-})
-describe('topoSort', () => {
- const fixture1 = {
- layerA: [],
- layer1A: ['layerA'],
- layer2A: ['layer1A'],
- layerB: [],
- layer1B: ['layerB'],
- layer2B: ['layer1B'],
- layer3AB: ['layer2B', 'layer2A']
- }
+ describe('topoSort', () => {
+ const fixture1 = {
+ layerA: [],
+ layer1A: ['layerA'],
+ layer2A: ['layer1A'],
+ layerB: [],
+ layer1B: ['layerB'],
+ layer2B: ['layer1B'],
+ layer3AB: ['layer2B', 'layer2A']
+ }
- // Same thing but messed up order
- const fixture2 = {
- layer1A: ['layerA'],
- layer1B: ['layerB'],
- layer2A: ['layer1A'],
- layerB: [],
- layer3AB: ['layer2B', 'layer2A'],
- layer2B: ['layer1B'],
- layerA: []
- }
+ // Same thing but messed up order
+ const fixture2 = {
+ layer1A: ['layerA'],
+ layer1B: ['layerB'],
+ layer2A: ['layer1A'],
+ layerB: [],
+ layer3AB: ['layer2B', 'layer2A'],
+ layer2B: ['layer1B'],
+ layerA: []
+ }
- it('should make a topologically sorted array', () => {
- const out = topoSort(fixture1, (node, inheritance) => inheritance[node])
- // This basically checks all ordering that matters
- expect(out.indexOf('layerA')).to.be.below(out.indexOf('layer1A'))
- expect(out.indexOf('layer1A')).to.be.below(out.indexOf('layer2A'))
- expect(out.indexOf('layerB')).to.be.below(out.indexOf('layer1B'))
- expect(out.indexOf('layer1B')).to.be.below(out.indexOf('layer2B'))
- expect(out.indexOf('layer2A')).to.be.below(out.indexOf('layer3AB'))
- expect(out.indexOf('layer2B')).to.be.below(out.indexOf('layer3AB'))
- })
+ it('should make a topologically sorted array', () => {
+ const out = topoSort(fixture1, (node, inheritance) => inheritance[node])
+ // This basically checks all ordering that matters
+ expect(out.indexOf('layerA')).to.be.below(out.indexOf('layer1A'))
+ expect(out.indexOf('layer1A')).to.be.below(out.indexOf('layer2A'))
+ expect(out.indexOf('layerB')).to.be.below(out.indexOf('layer1B'))
+ expect(out.indexOf('layer1B')).to.be.below(out.indexOf('layer2B'))
+ expect(out.indexOf('layer2A')).to.be.below(out.indexOf('layer3AB'))
+ expect(out.indexOf('layer2B')).to.be.below(out.indexOf('layer3AB'))
+ })
- it('order in object shouldn\'t matter', () => {
- const out = topoSort(fixture2, (node, inheritance) => inheritance[node])
- // This basically checks all ordering that matters
- expect(out.indexOf('layerA')).to.be.below(out.indexOf('layer1A'))
- expect(out.indexOf('layer1A')).to.be.below(out.indexOf('layer2A'))
- expect(out.indexOf('layerB')).to.be.below(out.indexOf('layer1B'))
- expect(out.indexOf('layer1B')).to.be.below(out.indexOf('layer2B'))
- expect(out.indexOf('layer2A')).to.be.below(out.indexOf('layer3AB'))
- expect(out.indexOf('layer2B')).to.be.below(out.indexOf('layer3AB'))
- })
+ it('order in object shouldn\'t matter', () => {
+ const out = topoSort(fixture2, (node, inheritance) => inheritance[node])
+ // This basically checks all ordering that matters
+ expect(out.indexOf('layerA')).to.be.below(out.indexOf('layer1A'))
+ expect(out.indexOf('layer1A')).to.be.below(out.indexOf('layer2A'))
+ expect(out.indexOf('layerB')).to.be.below(out.indexOf('layer1B'))
+ expect(out.indexOf('layer1B')).to.be.below(out.indexOf('layer2B'))
+ expect(out.indexOf('layer2A')).to.be.below(out.indexOf('layer3AB'))
+ expect(out.indexOf('layer2B')).to.be.below(out.indexOf('layer3AB'))
+ })
- it('dependentless nodes should be first', () => {
- const out = topoSort(fixture2, (node, inheritance) => inheritance[node])
- // This basically checks all ordering that matters
- expect(out.indexOf('layerA')).to.eql(0)
- expect(out.indexOf('layerB')).to.eql(1)
- })
+ it('dependentless nodes should be first', () => {
+ const out = topoSort(fixture2, (node, inheritance) => inheritance[node])
+ // This basically checks all ordering that matters
+ expect(out.indexOf('layerA')).to.eql(0)
+ expect(out.indexOf('layerB')).to.eql(1)
+ })
- it('ignores cyclic dependencies', () => {
- const out = topoSort({ a: 'b', b: 'a', c: 'a' }, (node, inheritance) => [inheritance[node]])
- expect(out.indexOf('a')).to.be.below(out.indexOf('c'))
+ it('ignores cyclic dependencies', () => {
+ const out = topoSort({ a: 'b', b: 'a', c: 'a' }, (node, inheritance) => [inheritance[node]])
+ expect(out.indexOf('a')).to.be.below(out.indexOf('c'))
+ })
})
+
})
--
cgit v1.2.3-70-g09d2
From e6291e4ee179ab85f212b1eef7d9e03565e6a8f8 Mon Sep 17 00:00:00 2001
From: Shpuld Shpuldson
Date: Mon, 27 Jan 2020 18:43:26 +0200
Subject: remove unnecessary anonymous function
---
src/services/api/api.service.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'src/services')
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index aa31f123..11aa0675 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -894,7 +894,7 @@ const reactWithEmoji = ({ id, emoji, credentials }) => {
method: 'POST',
credentials,
payload: { emoji }
- }).then(status => parseStatus(status))
+ }).then(parseStatus)
}
const unreactWithEmoji = ({ id, emoji, credentials }) => {
--
cgit v1.2.3-70-g09d2
From 18ca2a035bc9107288e35f11be8dac83c7539503 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 28 Jan 2020 00:25:05 +0200
Subject: fix rgba function, whoops
---
src/services/color_convert/color_convert.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'src/services')
diff --git a/src/services/color_convert/color_convert.js b/src/services/color_convert/color_convert.js
index b5461038..3b6fdcc7 100644
--- a/src/services/color_convert/color_convert.js
+++ b/src/services/color_convert/color_convert.js
@@ -171,7 +171,7 @@ export const mixrgb = (a, b) => {
* @returns {String} CSS rgba() color
*/
export const rgba2css = function (rgba) {
- return `rgba(${Math.floor(rgba.r)}, ${Math.floor(rgba.g)}, ${Math.floor(rgba.b)}, .5)`
+ return `rgba(${Math.floor(rgba.r)}, ${Math.floor(rgba.g)}, ${Math.floor(rgba.b)}, ${rgba.a})`
}
/**
--
cgit v1.2.3-70-g09d2
From 526b43eba66c597c78857da6ded3c7f672f96e49 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 28 Jan 2020 01:29:20 +0200
Subject: Kenomo (see: #624) theme. Ability to define link color for post
contents. Fixes
---
src/components/emoji_input/emoji_input.vue | 2 +
src/components/notifications/notifications.scss | 3 +
src/components/popper/popper.scss | 2 +
src/components/status/status.vue | 7 +++
src/components/style_switcher/style_switcher.vue | 17 ++++++
src/components/user_card/user_card.vue | 5 ++
src/services/theme_data/pleromafe.js | 34 ++++++++++++
static/themes/kenomo.json | 71 ++++++++++++++++++++++++
8 files changed, 141 insertions(+)
create mode 100644 static/themes/kenomo.json
(limited to 'src/services')
diff --git a/src/components/emoji_input/emoji_input.vue b/src/components/emoji_input/emoji_input.vue
index 94eae560..e9ac09c3 100644
--- a/src/components/emoji_input/emoji_input.vue
+++ b/src/components/emoji_input/emoji_input.vue
@@ -116,6 +116,8 @@
--faint: var(--popoverFaintText, $fallback--faint);
--faintLink: var(--popoverFaintLink, $fallback--faint);
--lightText: var(--popoverLightText, $fallback--lightText);
+ --postLink: var(--popoverPostLink, $fallback--link);
+ --postFaintLink: var(--popoverPostFaintLink, $fallback--link);
--icon: var(--popoverIcon, $fallback--icon);
}
}
diff --git a/src/components/notifications/notifications.scss b/src/components/notifications/notifications.scss
index 71876b14..ca762432 100644
--- a/src/components/notifications/notifications.scss
+++ b/src/components/notifications/notifications.scss
@@ -68,6 +68,9 @@
a {
color: var(--faintLink);
}
+ .status-content a {
+ color: var(--postFaintLink);
+ }
}
padding: 0;
.media-body {
diff --git a/src/components/popper/popper.scss b/src/components/popper/popper.scss
index 341416c1..8e2dcd55 100644
--- a/src/components/popper/popper.scss
+++ b/src/components/popper/popper.scss
@@ -15,6 +15,8 @@
--faint: var(--popoverFaintText, $fallback--faint);
--faintLink: var(--popoverFaintLink, $fallback--faint);
--lightText: var(--popoverLightText, $fallback--lightText);
+ --postLink: var(--popoverPostLink, $fallback--link);
+ --postFaintLink: var(--popoverPostFaintLink, $fallback--link);
--icon: var(--popoverIcon, $fallback--icon);
}
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index 1997e187..b1048832 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -451,6 +451,8 @@ $status-margin: 0.75em;
--lightText: var(--selectedPostLightText, $fallback--light);
--faint: var(--selectedPostFaintText, $fallback--faint);
--faintLink: var(--selectedPostFaintLink, $fallback--faint);
+ --postLink: var(--selectedPostPostLink, $fallback--faint);
+ --postFaintLink: var(--selectedPostFaintPostLink, $fallback--faint);
--icon: var(--selectedPostIcon, $fallback--icon);
}
@@ -640,6 +642,11 @@ $status-margin: 0.75em;
line-height: 1.4em;
white-space: pre-wrap;
+ a {
+ color: $fallback--link;
+ color: var(--postLink, $fallback--link);
+ }
+
img, video {
max-width: 100%;
max-height: 400px;
diff --git a/src/components/style_switcher/style_switcher.vue b/src/components/style_switcher/style_switcher.vue
index 6e38bd8e..0b3b0fbf 100644
--- a/src/components/style_switcher/style_switcher.vue
+++ b/src/components/style_switcher/style_switcher.vue
@@ -248,6 +248,23 @@
+
{{ $t('settings.style.advanced_colors.post') }}
+
+
+
+
{{ $t('settings.style.advanced_colors.alert') }}
brightness(20 * mod, text).rgb
},
+ postLink: {
+ depends: ['link']
+ },
+
border: {
depends: ['fg'],
opacity: 'border',
diff --git a/static/themes/kenomo.json b/static/themes/kenomo.json
new file mode 100644
index 00000000..98ddf974
--- /dev/null
+++ b/static/themes/kenomo.json
@@ -0,0 +1,71 @@
+{
+ "_pleroma_theme_version": 2,
+ "name": "Kenomo",
+ "source": {
+ "themeEngineVersion": 3,
+ "fonts": {},
+ "shadows": {
+ "panel": [],
+ "topBar": [],
+ "button": [
+ {
+ "x": 0,
+ "y": 1,
+ "blur": 0,
+ "spread": 0,
+ "color": "#FFFFFF",
+ "alpha": 0.2,
+ "inset": true
+ },
+ {
+ "x": 0,
+ "y": -1,
+ "blur": 0,
+ "spread": 0,
+ "color": "#000000",
+ "alpha": 0.2,
+ "inset": true
+ }
+ ],
+ "input": [
+ {
+ "x": 0,
+ "y": "0",
+ "blur": 0,
+ "spread": "1",
+ "color": "#576574",
+ "alpha": "1",
+ "inset": true
+ }
+ ]
+ },
+ "opacity": {
+ "underlay": "1",
+ "border": "0"
+ },
+ "colors": {
+ "bg": "#ffffff",
+ "fg": "#f6f6f6",
+ "text": "#494949",
+ "underlay": "#ffffff",
+ "link": "#818181",
+ "accent": "#818181",
+ "cBlue": "#2e86de",
+ "cRed": "#c96248",
+ "cGreen": "#0fa00f",
+ "cOrange": "#aa7623",
+ "postLink": "#2e86de",
+ "border": "#ffffff",
+ "icon": "#8a8a8a",
+ "panel": "transparent",
+ "topBarText": "#4b4b4b",
+ "tab": "--btn,-30",
+ "btn": "#576574"
+ },
+ "radii": {
+ "panel": "0",
+ "avatar": "6",
+ "avatarAlt": "6"
+ }
+ }
+}
--
cgit v1.2.3-70-g09d2
From b63e679a31a573c30868477f17322d6ed040af58 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 28 Jan 2020 02:03:21 +0200
Subject: removed one color TODO
---
src/components/popper/popper.scss | 2 ++
src/components/style_switcher/style_switcher.vue | 29 +++++++++++++++++-------
src/components/user_card/user_card.vue | 5 ++--
src/i18n/en.json | 3 +++
src/services/theme_data/pleromafe.js | 20 +++++++++++++++-
5 files changed, 47 insertions(+), 12 deletions(-)
(limited to 'src/services')
diff --git a/src/components/popper/popper.scss b/src/components/popper/popper.scss
index 8e2dcd55..99b7e6fc 100644
--- a/src/components/popper/popper.scss
+++ b/src/components/popper/popper.scss
@@ -137,6 +137,8 @@
width: 100%;
height: 100%;
+ --btnText: var(--popoverText, $fallback--text);
+
&-icon {
padding-left: 0.5rem;
diff --git a/src/components/style_switcher/style_switcher.vue b/src/components/style_switcher/style_switcher.vue
index 0b3b0fbf..9de3a96c 100644
--- a/src/components/style_switcher/style_switcher.vue
+++ b/src/components/style_switcher/style_switcher.vue
@@ -257,14 +257,6 @@
:show-optional-tickbox="typeof accentColorLocal !== 'undefined'"
/>
-
-
{{ $t('settings.style.advanced_colors.alert') }}
+
+
+
+
{{ $t('settings.style.advanced_colors.badge') }}
diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue
index 72656435..3988ff1c 100644
--- a/src/components/user_card/user_card.vue
+++ b/src/components/user_card/user_card.vue
@@ -465,14 +465,13 @@
color: var(--text, $fallback--text);
}
- // TODO use proper colors
.staff {
flex: none;
text-transform: capitalize;
color: $fallback--text;
- color: var(--btnText, $fallback--text);
+ color: var(--alertNeutralText, $fallback--text);
background-color: $fallback--fg;
- background-color: var(--btn, $fallback--fg);
+ background-color: var(--alertNeutral, $fallback--fg);
}
}
diff --git a/src/i18n/en.json b/src/i18n/en.json
index 81dde663..06cc12f0 100644
--- a/src/i18n/en.json
+++ b/src/i18n/en.json
@@ -441,7 +441,10 @@
"alert": "Alert background",
"alert_error": "Error",
"alert_warning": "Warning",
+ "alert_neutral": "Neutral",
+ "post": "Posts/User bios",
"badge": "Badge background",
+ "popover": "Tooltips, menus, popovers",
"badge_notification": "Notification",
"panel_header": "Panel header",
"top_bar": "Top bar",
diff --git a/src/services/theme_data/pleromafe.js b/src/services/theme_data/pleromafe.js
index 74e6fc1c..354009ee 100644
--- a/src/services/theme_data/pleromafe.js
+++ b/src/services/theme_data/pleromafe.js
@@ -1,4 +1,4 @@
-import { brightness } from 'chromatism'
+import { invertLightness, brightness } from 'chromatism'
import { alphaBlend, mixrgb } from '../color_convert/color_convert.js'
/* This is a definition of all layer combinations
* each key is a topmost layer, each value represents layer underneath
@@ -574,6 +574,24 @@ export const SLOT_INHERITANCE = {
textColor: true
},
+ alertNeutral: {
+ depends: ['text'],
+ opacity: 'alert'
+ },
+ alertNeutralText: {
+ depends: ['text'],
+ layer: 'alert',
+ variant: 'alertNeutral',
+ color: (mod, text) => invertLightness(text).rgb,
+ textColor: true
+ },
+ alertNeutralPanelText: {
+ depends: ['panelText'],
+ layer: 'alertPanel',
+ variant: 'alertNeutral',
+ textColor: true
+ },
+
badgeNotification: '--cRed',
badgeNotificationText: {
depends: ['text', 'badgeNotification'],
--
cgit v1.2.3-70-g09d2
From 6afff4f8c205ec70d3694564c706f6a46a61db9e Mon Sep 17 00:00:00 2001
From: Shpuld Shpuldson
Date: Tue, 28 Jan 2020 17:09:25 +0200
Subject: review changes
---
src/components/emoji_reactions/emoji_reactions.vue | 6 +++---
src/components/react_button/react_button.js | 9 +--------
src/components/react_button/react_button.vue | 3 +--
src/services/entity_normalizer/entity_normalizer.service.js | 2 +-
4 files changed, 6 insertions(+), 14 deletions(-)
(limited to 'src/services')
diff --git a/src/components/emoji_reactions/emoji_reactions.vue b/src/components/emoji_reactions/emoji_reactions.vue
index 8a229240..741fc11e 100644
--- a/src/components/emoji_reactions/emoji_reactions.vue
+++ b/src/components/emoji_reactions/emoji_reactions.vue
@@ -7,8 +7,8 @@
:class="{ 'picked-reaction': reactedWith(reaction.emoji) }"
@click="emojiOnClick(reaction.emoji, $event)"
>
- {{ reaction.count }}
{{ reaction.emoji }}
+ {{ reaction.count }}
@@ -31,10 +31,10 @@
align-items: center;
justify-content: center;
box-sizing: border-box;
- :first-child {
+ &:first-child {
margin-right: 0.25em;
}
- :last-child {
+ &:last-child {
width: 1.5em;
}
&:focus {
diff --git a/src/components/react_button/react_button.js b/src/components/react_button/react_button.js
index d1a179bc..6fb2a780 100644
--- a/src/components/react_button/react_button.js
+++ b/src/components/react_button/react_button.js
@@ -4,7 +4,6 @@ const ReactButton = {
props: ['status', 'loggedIn'],
data () {
return {
- animated: false,
showTooltip: false,
filterWord: '',
popperOptions: {
@@ -29,7 +28,7 @@ const ReactButton = {
},
computed: {
commonEmojis () {
- return ['💖', '😠', '👀', '😂', '🔥']
+ return ['❤️', '😠', '👀', '😂', '🔥']
},
emojis () {
if (this.filterWord !== '') {
@@ -37,12 +36,6 @@ const ReactButton = {
}
return this.$store.state.instance.emoji || []
},
- classes () {
- return {
- 'icon-smile': true,
- 'animate-spin': this.animated
- }
- },
...mapGetters(['mergedConfig'])
}
}
diff --git a/src/components/react_button/react_button.vue b/src/components/react_button/react_button.vue
index 7f1bc492..c925dd71 100644
--- a/src/components/react_button/react_button.vue
+++ b/src/components/react_button/react_button.vue
@@ -40,8 +40,7 @@
@click.prevent="openReactionSelect"
>