pleromafe.js (17211B)
- 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
- * this is essentially a simplified tree
- */
- export const LAYERS = {
- undelay: null, // root
- topBar: null, // no transparency support
- badge: null, // no transparency support
- profileTint: null, // doesn't matter
- fg: null,
- bg: 'underlay',
- highlight: 'bg',
- panel: 'bg',
- popover: 'bg',
- selectedMenu: 'popover',
- btn: 'bg',
- btnPanel: 'panel',
- btnTopBar: 'topBar',
- input: 'bg',
- inputPanel: 'panel',
- inputTopBar: 'topBar',
- alert: 'bg',
- alertPanel: 'panel',
- poll: 'bg',
- chatBg: 'underlay',
- chatMessage: 'chatBg'
- }
- /* By default opacity slots have 1 as default opacity
- * this allows redefining it to something else
- */
- export const DEFAULT_OPACITY = {
- profileTint: 0.5,
- alert: 0.5,
- input: 0.5,
- faint: 0.5,
- underlay: 0.15,
- alertPopup: 0.95
- }
- /** 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
- },
- wallpaper: {
- depends: ['bg'],
- color: (mod, bg) => brightness(-2 * mod, bg).rgb
- },
- fg: {
- depends: [],
- priority: 1
- },
- text: {
- depends: [],
- layer: 'bg',
- opacity: null,
- 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'
- },
- postFaintLink: {
- depends: ['postLink'],
- opacity: 'faint'
- },
- cBlue: '#0000ff',
- cRed: '#FF0000',
- cGreen: '#00FF00',
- cOrange: '#E3FF00',
- profileBg: {
- depends: ['bg'],
- color: (mod, bg) => ({
- r: Math.floor(bg.r * 0.53),
- g: Math.floor(bg.g * 0.56),
- b: Math.floor(bg.b * 0.59)
- })
- },
- profileTint: {
- depends: ['bg'],
- layer: 'profileTint',
- opacity: 'profileTint'
- },
- highlight: {
- depends: ['bg'],
- color: (mod, bg) => brightness(5 * mod, bg).rgb
- },
- highlightLightText: {
- depends: ['lightText'],
- layer: 'highlight',
- textColor: true
- },
- highlightPostLink: {
- depends: ['postLink'],
- layer: 'highlight',
- textColor: 'preserve'
- },
- highlightFaintText: {
- depends: ['faint'],
- layer: 'highlight',
- textColor: true
- },
- highlightFaintLink: {
- depends: ['faintLink'],
- layer: 'highlight',
- textColor: 'preserve'
- },
- highlightPostFaintLink: {
- depends: ['postFaintLink'],
- 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)
- },
- popover: {
- depends: ['bg'],
- opacity: 'popover'
- },
- popoverLightText: {
- depends: ['lightText'],
- layer: 'popover',
- textColor: true
- },
- popoverPostLink: {
- depends: ['postLink'],
- layer: 'popover',
- textColor: 'preserve'
- },
- popoverFaintText: {
- depends: ['faint'],
- layer: 'popover',
- textColor: true
- },
- popoverFaintLink: {
- depends: ['faintLink'],
- layer: 'popover',
- textColor: 'preserve'
- },
- popoverPostFaintLink: {
- depends: ['postFaintLink'],
- 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'],
- layer: 'highlight',
- variant: 'selectedPost',
- textColor: true
- },
- selectedPostLightText: {
- depends: ['highlightLightText'],
- layer: 'highlight',
- variant: 'selectedPost',
- textColor: true
- },
- selectedPostPostLink: {
- depends: ['highlightPostLink'],
- layer: 'highlight',
- variant: 'selectedPost',
- textColor: 'preserve'
- },
- 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: {
- depends: ['bg'],
- color: (mod, bg) => brightness(5 * mod, bg).rgb
- },
- selectedMenuLightText: {
- depends: ['highlightLightText'],
- layer: 'selectedMenu',
- variant: 'selectedMenu',
- textColor: true
- },
- selectedMenuFaintText: {
- depends: ['highlightFaintText'],
- layer: 'selectedMenu',
- variant: 'selectedMenu',
- textColor: true
- },
- selectedMenuFaintLink: {
- depends: ['highlightFaintLink'],
- layer: 'selectedMenu',
- variant: 'selectedMenu',
- textColor: 'preserve'
- },
- selectedMenuText: {
- depends: ['highlightText'],
- layer: 'selectedMenu',
- variant: 'selectedMenu',
- textColor: true
- },
- selectedMenuLink: {
- depends: ['highlightLink'],
- layer: 'selectedMenu',
- variant: 'selectedMenu',
- textColor: 'preserve'
- },
- selectedMenuIcon: {
- depends: ['selectedMenu', 'selectedMenuText'],
- 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'],
- layer: 'bg',
- textColor: 'preserve',
- color: (mod, text) => brightness(20 * mod, text).rgb
- },
- postLink: {
- depends: ['link'],
- layer: 'bg',
- textColor: 'preserve'
- },
- postGreentext: {
- depends: ['cGreen'],
- layer: 'bg',
- textColor: 'preserve'
- },
- postCyantext: {
- depends: ['cBlue'],
- layer: 'bg',
- textColor: 'preserve'
- },
- 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'],
- variant: 'btn',
- opacity: 'btn'
- },
- btnText: {
- depends: ['fgText'],
- layer: 'btn',
- textColor: true
- },
- btnPanelText: {
- depends: ['btnText'],
- layer: 'btnPanel',
- variant: 'btn',
- textColor: true
- },
- btnTopBarText: {
- depends: ['btnText'],
- layer: 'btnTopBar',
- variant: 'btn',
- textColor: true
- },
- // Buttons: pressed
- btnPressed: {
- depends: ['btn'],
- layer: 'btn'
- },
- btnPressedText: {
- depends: ['btnText'],
- layer: 'btn',
- variant: 'btnPressed',
- textColor: true
- },
- btnPressedPanel: {
- depends: ['btnPressed'],
- layer: 'btn'
- },
- btnPressedPanelText: {
- depends: ['btnPanelText'],
- layer: 'btnPanel',
- variant: 'btnPressed',
- textColor: true
- },
- btnPressedTopBar: {
- depends: ['btnPressed'],
- layer: 'btn'
- },
- btnPressedTopBarText: {
- depends: ['btnTopBarText'],
- layer: 'btnTopBar',
- variant: 'btnPressed',
- textColor: true
- },
- // Buttons: toggled
- btnToggled: {
- depends: ['btn'],
- layer: '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.25, bg)
- },
- btnDisabledText: {
- depends: ['btnText', 'btnDisabled'],
- layer: 'btn',
- variant: 'btnDisabled',
- color: (mod, text, btn) => alphaBlend(text, 0.25, btn)
- },
- btnDisabledPanelText: {
- depends: ['btnPanelText', 'btnDisabled'],
- layer: 'btnPanel',
- variant: 'btnDisabled',
- color: (mod, text, btn) => alphaBlend(text, 0.25, btn)
- },
- btnDisabledTopBarText: {
- depends: ['btnTopBarText', 'btnDisabled'],
- layer: 'btnTopBar',
- variant: 'btnDisabled',
- color: (mod, text, btn) => alphaBlend(text, 0.25, btn)
- },
- // 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
- },
- alertSuccess: {
- depends: ['cGreen'],
- opacity: 'alert'
- },
- alertSuccessText: {
- depends: ['text'],
- layer: 'alert',
- variant: 'alertSuccess',
- textColor: true
- },
- alertSuccessPanelText: {
- depends: ['panelText'],
- layer: 'alertPanel',
- variant: 'alertSuccess',
- 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
- },
- alertPopupError: {
- depends: ['alertError'],
- opacity: 'alertPopup'
- },
- alertPopupErrorText: {
- depends: ['alertErrorText'],
- layer: 'popover',
- variant: 'alertPopupError',
- textColor: true
- },
- alertPopupWarning: {
- depends: ['alertWarning'],
- opacity: 'alertPopup'
- },
- alertPopupWarningText: {
- depends: ['alertWarningText'],
- layer: 'popover',
- variant: 'alertPopupWarning',
- textColor: true
- },
- alertPopupSuccess: {
- depends: ['alertSuccess'],
- opacity: 'alertPopup'
- },
- alertPopupSuccessText: {
- depends: ['alertSuccessText'],
- layer: 'popover',
- variant: 'alertPopupSuccess',
- textColor: true
- },
- alertPopupNeutral: {
- depends: ['alertNeutral'],
- opacity: 'alertPopup'
- },
- alertPopupNeutralText: {
- depends: ['alertNeutralText'],
- layer: 'popover',
- variant: 'alertPopupNeutral',
- textColor: true
- },
- badgeNotification: '--cRed',
- badgeNotificationText: {
- depends: ['text', 'badgeNotification'],
- layer: 'badge',
- variant: 'badgeNotification',
- textColor: 'bw'
- },
- badgeNeutral: '--cGreen',
- badgeNeutralText: {
- depends: ['text', 'badgeNeutral'],
- layer: 'badge',
- variant: 'badgeNeutral',
- textColor: 'bw'
- },
- chatBg: {
- depends: ['bg']
- },
- chatMessageIncomingBg: {
- depends: ['chatBg']
- },
- chatMessageIncomingText: {
- depends: ['text'],
- layer: 'chatMessage',
- variant: 'chatMessageIncomingBg',
- textColor: true
- },
- chatMessageIncomingLink: {
- depends: ['link'],
- layer: 'chatMessage',
- variant: 'chatMessageIncomingBg',
- textColor: 'preserve'
- },
- chatMessageIncomingBorder: {
- depends: ['border'],
- opacity: 'border',
- color: (mod, border) => brightness(2 * mod, border).rgb
- },
- chatMessageOutgoingBg: {
- depends: ['chatMessageIncomingBg'],
- color: (mod, chatMessage) => brightness(5 * mod, chatMessage).rgb
- },
- chatMessageOutgoingText: {
- depends: ['text'],
- layer: 'chatMessage',
- variant: 'chatMessageOutgoingBg',
- textColor: true
- },
- chatMessageOutgoingLink: {
- depends: ['link'],
- layer: 'chatMessage',
- variant: 'chatMessageOutgoingBg',
- textColor: 'preserve'
- },
- chatMessageOutgoingBorder: {
- depends: ['chatMessageOutgoingBg'],
- opacity: 'border',
- color: (mod, border) => brightness(2 * mod, border).rgb
- }
- }