Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/oddbird/cascading-color-system
CSS Custom Property color-theming
https://github.com/oddbird/cascading-color-system
Last synced: 8 days ago
JSON representation
CSS Custom Property color-theming
- Host: GitHub
- URL: https://github.com/oddbird/cascading-color-system
- Owner: oddbird
- License: other
- Created: 2019-09-07T20:39:51.000Z (about 5 years ago)
- Default Branch: main
- Last Pushed: 2024-06-17T15:19:10.000Z (5 months ago)
- Last Synced: 2024-10-29T18:48:47.245Z (16 days ago)
- Language: SCSS
- Size: 1.58 MB
- Stars: 71
- Watchers: 5
- Forks: 2
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE.md
Awesome Lists containing this project
README
# Cascading Colors
[Demo Site](https://cascading-colors.netlify.app/) |
[Documentation](https://www.oddbird.net/cascading-colors/docs/)Generate dynamic and themable color palettes using CSS custom properties,
and allow (persistent) user-adjustments with a bit of light-weight JS.We provide both the Sass,
and a pre-built CSS file.
Both allow adjustments to default settings --
but only the Sass files can change how many colors are generated.## Installation & Requirements
Download the files from [GitHub][gh],
or install using npm or yarn:```bash
npm install cascading-color-systems --save-dev
yarn add cascading-color-systems --dev
```### CSS (minimal configuration)
The default configuration can be used as plain CSS:
```css
/* css */
@import "/cascading-color-systems/css/ccs.css";
``````html
```
You can copy that file anywhere you want,
and it works without dependencies.### Sass (full configuration)
If you want to use the Sass features,
you will need [Dart-Sass][sass] `v1.23+`
(which may still be in Beta).
This was partially an experiment
in the latest Sass feature: Modules.Import using the new module import syntax:
```scss
@use '/cascading-color-systems/' as ccs with (
/* configuration options */
);
```[gh]: https://github.com/oddbird/cascading-color-system/
[sass]: https://www.npmjs.com/package/sass## Getting started
### CCS Root
Both imports generate
core configuration options
as CSS custom properties
(set by Sass when applicable) eg:```scss
[data-ccs="root"] {
--ccs-prime--config: 330;
--ccs-lightness--config: 50%;
--ccs-saturation--config: 50%;
--ccs-contrast--config: 50%;
--ccs-fade-background--config: 0.9;
}
```Add the `data-ccs='root'` attribute to your `html` element
in order to make your Cascading Colors configuration
available to an entire page.
This attribute will also be used by JavaScript
to apply dynamic user settings globally.### CCS Color Attributes
Custom properties only re-calculate
where they are defined --
so we've created a
`[data-ccs-colors]` attribute,
which can be applied anywhere
new colors are needed.We configure the default `color` and `background-color` settings:
```scss
[data-ccs-colors] {
background-color: var(--ccs-background, var(--ccs--bg-full));
color: var(--ccs-color, var(--ccs--fg-full));
}
```Along with fallback values for light/dark modes,
in case CSS custom properties are not supported:```scss
[data-ccs-colors],
[data-ccs-colors="light"] {
background-color: $fallback-light;
color: $fallback-dark;
}[data-ccs-colors="invert"],
[data-ccs-colors="dark"] {
background-color: $fallback-dark;
color: $fallback-light;
}
```You can override the default colors and backgrounds
by defining `--ccs-color` and `--ccs-background`:```scss
[data-ccs-colors] {
--ccs-background: var(--ccs-neutral--bg-full);
--ccs-color: var(--ccs-neutral--fg-full);
}
```This attribute generates all your colors as custom properties:
- `--ccs-prime`, `--ccs-*`:
Colors generated from the given `$hues`, `$saturation`, and `$lightness` --
along with any `neutral` colors,
which will use their own customizable (low) `$saturation`
- `--ccs-*--fg-full` :
All color hues get a full-contrast foreground
- `--ccs-*--bg-full` :
All color hues get a full-contrast background
- `--ccs--bg-full` white or black, depending on light/dark mode
- `--ccs--fg-full` white or black, depending on light/dark modeWe also provide the color attributes needed
to generate a larger palette:- `--ccs-h--*`:
the calculated hue for each color,
after resolving user-settings, theme-settings, and global configuration
- `--ccs-contrast`:
the calculated contrast range
based on theme, user, and global settings
- `--ccs-l`, `--ccs-l---contrast`:
the calculated base lightness (user, theme, global)
and full-contrast fg/bg values
- `--ccs-s`, `--ccs-s---contrast`:
the calculated base saturation (user, theme, global)
and full-contrast fg/bg values
- `--ccs-mode`:
the calculated light (`1`) or dark (`-1`) mode
(user, theme, html, or system preference)
- `--ccs-invert` the opposite of CCS-modeYou can pass explicit light/dark mode overrides in html
by including a value with the attribute:```html
```
### CCS Color Palettes
More complex color palettes have to be generated in Sass,
based on the number of `$steps` desired
to get from the base colors to their full-contrast versions.If you import the static CSS file,
we generate a palette based on the default settings,
with 4 steps in either direction.
Each step is named `--ccs---`,
eg `--ccs-prime--fg1`, or `--ccs-accent--bg3`.### Creating Themes
Themes can be used to pre-set any color values
(especially the accent hue),
and even show/hide user customization controls.
We provide several built-in themes,
and you can add your own
using the `[data-ccs-theme]` attribute:```scss
[data-ccs-theme="complement"] {
/* set the accent color 180 degrees off the primary color */
--ccs-accent--theme: calc(var(--ccs-h--prime) + 180);
}[data-ccs-theme="triad"] {
/* triad logic */
}
```### Sass Configuration
In most cases,
you'll want to define the `prime` hue,
and possibly a few other options --
and then trigger a build from the module itself.
Here's the code from one of my sites:```scss
@use "../../node_modules/cascading-color-systems/" as ccs with (
$hues: 120, // shorthand for setting the prime hue only
$saturation: 70%,
$contrast: 48%,
$steps: 6,
$fade-background: 15%,
$fades: 0.75,
$build: true,
);
```The `$build: true` configuration
will generate CSS output based on your settings.
I recommend that for most use-cases,
but you can leave that out
and apply individual mixins:```scss
[data-ccs-colors] {
@include colors;
}
```### User Settings & JavaScript
The provided JS
can be hooked up to a form
to accept user-input,
generate custom properties based on their input,
store their preferences in `localStorage`,
or revert back to the configured site defaults.Use the `dist.js` UMD module directly in a browser:
```html
ccs.default();
```
Or import and use `index.js`,
if you have a modern build system with ES Module support:```js
import ccs from "cascading-color-systems";ccs();
```### HTML Attributes
We provide several attributes
that can be used to build
a user-interface for changing colors.
The `root` attribute is required:- `[data-ccs="root"]`:
where user settings should be applied#### General Controls:
- `[data-ccs="menu"]`:
You can hide the settings menu and unset buttons by default,
and we'll show them when the JS is available
- `[data-ccs-input="unset"]`:
A button to unset all user preferences
and clear related local storage#### Light/Dark Mode:
Mode can be toggled with a button:
- `[data-ccs-input="mode"]`:
A button to toggle light/dark modesOr mode can be set explicitly using radio inputs:
- `[data-ccs-input="light-mode"]`:
Set light mode when checked
- `[data-ccs-input="dark-mode"]`:
Set dark mode when checked
- `[data-ccs-input="auto-mode"]`:
Unset explicit mode when checked,
and fallback on browser/operating-system settings#### Themes & Values:
- `[data-ccs-input~="theme"]`:
Allow users to select from available `theme` options.
Add `unset-values` to revert all other theme values
when changing themes.
- `[data-ccs-input="hue"]`:
Allow users to change the primary hue
- `[data-ccs-input="saturation"]`:
Allow users to adjust the baseline saturation
- `[data-ccs-input="lightness"]`:
Allow users to adjust the baseline lightness
- `[data-ccs-input="contrast"]`:
Allow users to adjust the contrast rangeThemes can also use `[data-ccs-field]` attributes
with the values above
to show and hide inputs/labels based on a given theme.
For example, a high-contrast theme
might not accept user `contrast` input:```scss
[data-ccs-theme="contrast"] {
--ccs-contrast: 200%; /* override all other contrast settings */
--ccs-custom-contrast: none; /* hide [data-ccs-field="contrast"] */
}
```