/* Copyright: Ankitects Pty Ltd and contributors * License: GNU AGPL, version 3 or later, http://www.gnu.org/licenses/agpl.html */ @use "sass:map"; @use "sass:color"; @use "functions" as *; @use "color-palette" as *; @function palette($key, $shade) { $color: map.get($color-palette, $key); @return map.get($color, $shade); } $vars: ( props: ( font: ( size: ( default: 15px, ), ), border-radius: ( default: ( "Used to round corners of various UI elements", ( default: 5px, ), ), medium: ( "Used for container corners", ( default: 12px, ), ), large: ( "Used for pill-shaped buttons", ( default: 15px, ), ), ), transition: ( default: ( "Default duration of transitions in milliseconds", ( default: 180ms, ), ), medium: ( "Slightly longer transition duration in milliseconds", ( default: 500ms, ), ), slow: ( "Long transition duration in milliseconds", ( default: 1000ms, ), ), ), blur: ( default: ( "Default background blur value", ( default: 20px, ), ), ), ), colors: ( fg: ( default: ( "Default text/icon color", ( light: palette(darkgray, 9), dark: palette(lightgray, 0), ), ), subtle: ( "Placeholder text, icons in idle state", ( light: palette(darkgray, 0), dark: palette(lightgray, 9), ), ), disabled: ( "Foreground color of disabled UI elements", ( light: palette(lightgray, 9), dark: palette(darkgray, 0), ), ), faint: ( "Foreground color that barely stands out against canvas", ( light: palette(lightgray, 7), dark: palette(darkgray, 2), ), ), link: ( "Hyperlink foreground color", ( light: palette(blue, 7), dark: palette(blue, 2), ), ), ), canvas: ( default: ( "Window background", ( light: palette(lightgray, 2), dark: palette(darkgray, 5), ), ), elevated: ( "Background of containers", ( light: white, dark: palette(darkgray, 4), ), ), inset: ( "Background of inputs inside containers", ( light: white, dark: palette(darkgray, 5), ), ), overlay: ( "Background of floating elements (menus, tooltips)", ( light: palette(lightgray, 0), dark: palette(darkgray, 5), ), ), code: ( "Background of code editors", ( light: white, dark: palette(darkgray, 6), ), ), glass: ( "Transparent background for surfaces containing text", ( light: color.scale(white, $alpha: -60%), dark: color.scale(palette(darkgray, 4), $alpha: -60%), ), ), ), border: ( default: ( "Border color with medium contrast against window background", ( light: palette(lightgray, 6), dark: palette(darkgray, 7), ), ), subtle: ( "Border color with low contrast against window background", ( light: palette(lightgray, 4), dark: palette(darkgray, 6), ), ), strong: ( "Border color with high contrast against window background", ( light: palette(lightgray, 9), dark: palette(darkgray, 9), ), ), focus: ( "Border color of focused input elements", ( light: palette(blue, 5), dark: palette(blue, 5), ), ), ), button: ( bg: ( "Background color of buttons", ( light: palette(lightgray, 0), dark: color.scale(palette(darkgray, 4), $lightness: 5%), ), ), gradient: ( start: ( "Start value of default button gradient", ( light: white, dark: color.scale(palette(darkgray, 4), $lightness: 10%), ), ), end: ( "End value of default button gradient", ( light: palette(lightgray, 0), dark: color.scale(palette(darkgray, 4), $lightness: 5%), ), ), ), hover: ( border: ( "Border color of default button in hover state", ( light: palette(lightgray, 8), dark: palette(darkgray, 8), ), ), ), disabled: ( "Background color of disabled button", ( light: color.scale(palette(lightgray, 5), $alpha: -50%), dark: color.scale(palette(darkgray, 3), $alpha: -50%), ), ), primary: ( bg: ( "Background color of primary button", ( light: color.scale(palette(blue, 6), $lightness: 5%), dark: color.scale(palette(blue, 7), $saturation: -10%), ), ), gradient: ( start: ( "Start value of primary button gradient", ( light: palette(blue, 5), dark: color.scale(palette(blue, 6), $saturation: -10%), ), ), end: ( "End value of primary button gradient", ( light: color.scale(palette(blue, 6), $lightness: 5%), dark: color.scale(palette(blue, 7), $saturation: -10%), ), ), ), disabled: ( "Background color of primary button in disabled state", ( light: palette(blue, 3), dark: color.scale(palette(blue, 5), $saturation: -10%), ), ), ), ), scrollbar: ( bg: ( default: ( "Background of scrollbar in idle state (Win/Lin only)", ( light: palette(lightgray, 5), dark: palette(darkgray, 3), ), ), hover: ( "Background of scrollbar in hover state (Win/Lin only)", ( light: palette(lightgray, 6), dark: palette(darkgray, 2), ), ), active: ( "Background of scrollbar in pressed state (Win/Lin only)", ( light: palette(lightgray, 7), dark: palette(darkgray, 1), ), ), ), ), shadow: ( default: ( "Default box-shadow color", ( light: palette(lightgray, 6), dark: palette(darkgray, 8), ), ), inset: ( "Inset box-shadow color", ( light: palette(darkgray, 3), dark: palette(darkgray, 7), ), ), subtle: ( "Box-shadow color with lower contrast against window background", ( light: palette(darkgray, 0), dark: palette(darkgray, 4), ), ), focus: ( "Box-shadow color for elements in focused state", ( default: palette(indigo, 5), ), ), ), accent: ( card: ( "Accent color for cards", ( light: palette(blue, 4), dark: palette(blue, 3), ), ), note: ( "Accent color for notes", ( light: palette(green, 5), dark: palette(green, 4), ), ), danger: ( "Saturated accent color to grab attention", ( light: palette(red, 5), dark: palette(red, 4), ), ), ), flag: ( 1: ( "Flag 1 (red)", ( light: palette(red, 5), dark: palette(red, 4), ), ), 2: ( "Flag 2 (orange)", ( light: palette(orange, 4), dark: palette(orange, 3), ), ), 3: ( "Flag 3 (green)", ( light: palette(green, 4), dark: palette(green, 3), ), ), 4: ( "Flag 4 (blue)", ( light: palette(blue, 5), dark: palette(blue, 4), ), ), 5: ( "Flag 5 (pink)", ( light: palette(fuchsia, 4), dark: palette(fuchsia, 3), ), ), 6: ( "Flag 6 (turquoise)", ( light: palette(teal, 4), dark: palette(teal, 3), ), ), 7: ( "Flag 7 (purple)", ( light: palette(purple, 5), dark: palette(purple, 4), ), ), ), state: ( new: ( "Accent color for new cards", ( light: palette(blue, 5), dark: palette(blue, 3), ), ), learn: ( "Accent color for cards in learning state", ( light: palette(red, 6), dark: palette(red, 4), ), ), review: ( "Accent color for cards in review state", ( light: palette(green, 6), dark: palette(green, 5), ), ), buried: ( "Accent color for buried cards", ( light: palette(amber, 5), dark: palette(amber, 8), ), ), suspended: ( "Accent color for suspended cards", ( light: palette(yellow, 4), dark: palette(yellow, 1), ), ), marked: ( "Accent color for marked cards", ( light: palette(indigo, 5), dark: palette(purple, 5), ), ), ), highlight: ( bg: ( "Background color of highlighted items", ( light: color.scale(palette(blue, 6), $alpha: -50%), dark: color.scale(palette(blue, 3), $alpha: -50%), ), ), fg: ( "Foreground color of highlighted items", ( light: black, dark: white, ), ), ), selected: ( bg: ( "Background color of selected text", ( light: color.scale(palette(lightgray, 5), $alpha: -50%), dark: color.scale(palette(blue, 3), $alpha: -50%), ), ), fg: ( "Foreground color of selected text", ( light: black, dark: white, ), ), ), ), ); @function prop($keyword) { @return var(--#{$keyword}); } @function color($keyword) { @return var(--#{$keyword}); } @function palette-of($keyword, $theme: default) { $colors: map.get($vars, colors); @return get-value-from-map($colors, $keyword, $theme); }