Skip to main content

HSLA color naming system for use in CSS generators

Project description

## HSLA colors for HTML

With CSS3 the hsl(a) color values were introduced. These have had cross browser
support since early 2011, yet see only limited use.

Possibly because the existing `#ff1ab3` hex-style colors offer the same palet and
were always supported across browsers. With universal browser support for hsla,
the time is overdue to challenge this.

This library offers a naming system for selectors and a python Hsla class
to manage colors for use in CSS generators.

## Why use hsl(a) colors?

+ Hex colors offer no opacity, necessitating a partial switch to rgba or hsla
colors anyways (this may change with the CSS4 spec).
+ Graphical designers are used to working with hsla, as it is the color picker
in applications such as Sketch.
+ It makes it easier to reason about colors: a lower luminosity means a darker color;
a higher saturation means more vibrant.

It also opens the door to more uniform, expansive and unambiguous naming of color
selectors. The existing "semantic" approaches do not work well in most cases and
give the designer non-descriptive class names such as `color-secondary` or bastardly
descriptions as `color-primary-darker`. Descriptive solutions are often limited in
scope (`darkest-blue` *will we also need a darkest-darkest blue?*) and fall short of
giving a proper representation (`near-white` *how near?*)

## About hues

It is easy to see that color `hsla(30, 100%, 50%, 0.7)` is a vibrant color,
light neither dark and with 70% opacity. It is less clear or "human-friendly"
to find out what hue 30 is supposed to represent. Spoiler: it's an orangy hue.

This library contains a well-thought-out system to address various hues by name.
The following were the considerations:

+ A named hue for every 10 steps on the hue scale, resulting in 36 hues;
+ When the hues match a HTML color for 100% saturation and 50% luminosity, the
HTML color is used for the hue (0: `red`, 60 `yellow`, 120: `lime`, 180: `cyan`, 240: `blue`
& 300 `magenta`)
+ For the other names, the HTML color names are avoided to prevent ambiguity and confusion.
+ All other names are single-words and do not contain other color names, again to be
unambiguous (no "cornflower blue")
+ The names were chosen to be broadly recognized and memorable, often the colors of
minerals, plants, etc.

## Getting started

### Creating hsla colors

The hue names and integer values in the naming sytem combine to create more than 345 million
colors. Here is how you would create:
+ a dark orange/red
+ a muted & light lila/blue
+ a black with 60% opacity:

```python
from hsla import Hsla

color1 = Hsla('scarlet', lum=18)
color2 = Hsla('majorelle', 40, 80)
color3 = Hsla('black', alpha=60)
```
Suppose we want to use the colors we created for genetating CSS selectors and values.

```python
# The hsl representation is used with alpha=100
print(color1)
# 'hsl(10, 100%, 18%)'

color1.suffix
# 'scarlet-18'

print(color2)
# 'hsl(250, 40%, 80%)

color2.suffix
# 'majorelle40-80'

print(color3)
# 'hsla(0, 0, 0, 0.6)'

color3.suffix
# 'black-60a'
```

Notice that for the selectors, the saturation value is directly attached to the hue.
The luminosity and alpha values by a hyphen and the latter has an 'a' suffixed. All
values other than than the hue are optional. They default to:

+ `100` for saturation (`0` for black, white and gray)
+ `50` for luminosity (`0` for black, `100` for white and gray lies in between)
+ `100` for alpha

More formally: `<hue>[<sat>][-<lum>][-<alpha>a]`

### Generate a palet

The code below uses a catesian product of hues, saturations and luminosities to quickly
generate a color palet. Bear in mind that this method is exponential with the value count,
so you may end up generating many colors.

```python
colors = [Hsla(*hsl) for hsl in itertools.product(list(HUES)[::3], (100, 60), (92, 70, 50, 25))]
```

Notice that we take every 3rd value from the keys of the HUES dictionary (=12) **x**
2 saturation values **x** 4 luminosities to get a palet of 96 colors and shades. We may
also want to generate gray in muliple luminosities and black & white in various opacities:

```python
# Grays from various luminosities
grays = [Hsla('gray', lum=l) for l in (98, 95, 90, 80, 50, 65, 35, 20, 10, 5)]

# Blacks and whites from various alpha values
black_white = [Hsla(h, alpha=a) for h in ['black', 'white'] for a in (100, 80, 60, 40, 20, 10, 5)]
```

We now have a perfectly usable palet for use in a CSS generator such as Glueball.

```python
palet = colors + grays + black_white

palet[51].suffix
# cobalt60-70
```

### Hsla in your project

This method above may be suitable to create a palet for a versatile framework or
for flexibility early in the development phase.

It is just as easy to create the colors individually for your project, or you can
forego the Hsla class altogether and only use the method to create consistent and readable
names throughout your projects.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Glueball-hsla-1.1.2.tar.gz (6.0 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page