@terrazzo/use-color
Version:
React hook for memoizing and transforming any web-compatible color. Uses Culori.
91 lines (65 loc) • 5.16 kB
Markdown
# /use-color
React hook for memoizing and transforming any web-compatible color. Only 12 kB (with full support for all web colorspaces!) thanks to Culori.
## Setup
```sh
npm i /use-color
```
```tsx
import useColor, { formatCSS } from "@terrazzo/use-color";
const [color, setColor] = useColor("color(srgb 0.0 0.3 1.0)");
// Reading
color.css; // color(srgb 0.0 0.3 1.0)
color.original; // { mode: "srgb", r: 0, g: 0.3, b: 1.0, alpha: 1 }
color.p3; // { mode: "p3", r: 0.1184, g: 0.2956, b: 0.9611 }
formatCSS(color.p3); // color(display-p3 0.1184 0.2956 0.9611)
// Setting color
setColor("color(display-p3 0.12 0.3 0.98)");
setColor({ mode: "p3", r: 0.12, g: 0.3, b: 0.98 });
// Adjusting color relatively (lighten by 10% via Oklab)
setColor({ ...color.original.oklab, l: color.oklab.l + 0.1 });
```
## Reading color
The color is fully memoized, so it can be used in any `useEffect()` hooks. This uses Culori to convert colors, but only the [CSS Color Module 4](https://www.w3.org/TR/css-color-4/) colorspaces are loaded. Further, all the properties are **getters** that cache their output, so even if accessing a different format, work will never be redone. You have the following property available:
| Property | Type | Description |
| :------------ | :------- | :---------------------------------------------------------------------------------------------------------- |
| `css` | `string` | CSS-compatible color using Color Module 4 |
| `original` | `object` | Culori color object using the original mode of the color (tip: use `color.original.mode` to see the format) |
| `a98` | `object` | Culori A98 color object |
| `hsl` | `object` | Culori HSL color object |
| `hsv` | `object` | Culori HSV color object |
| `lrgb` | `object` | Culori LinearRGB color object |
| `lab` | `object` | Culori CIELab color object (not to be confused with Oklab) |
| `lch` | `object` | Culori CIELCh color object (not to be confused with Oklch) |
| `luv` | `object` | Culori LUV color object |
| `okhsl` | `object` | Culori Okhsl color object |
| `okhsv` | `object` | Culori Okhsv color object |
| `oklab` | `object` | Culori Oklab color object |
| `oklch` | `object` | Culori Oklch color object |
| `p3` | `object` | Culori P3 color object |
| `prophotoRgb` | `object` | Culori ProPhotoRGB color object |
| `rec2020` | `object` | Culori Rec2020 color object |
| `rgb` | `object` | (sRGB) Culori RGB color object |
| `srgb` | `object` | (alias of `rgb`) |
| `xyz` | `object` | (alias of `xyz65`) |
| `xyz50` | `object` | Culori Xyz50 color object |
| `xyz65` | `object` | Culori Xyz65 color object |
## Setting color
Setting color can be done by either passing in any valid CSS string:
```tsx
const [color, setColor] = useColor();
setColor("color(display-p3 0.12 0.3 0.98)");
```
Or any Culori object:
```tsx
const [color, setColor] = useColor();
setColor({ mode: "p3", r: 0.12, g: 0.3, b: 0.98 });
```
Or adjusting the color object relatively (tip: for most purposes, adjusting by `oklab` will yield the best results):
```tsx
const [color, setColor] = useColor();
setColor({
...color.original.oklab,
l: color.oklab.l + 0.1, // Lighten by 10% via Oklab
});
```
_Note: if adjusting by a different colorspace, that will affect the `color.original` and `color.css` output, which pulls the most-recently-used colorspace._