Security News
RubyGems.org Adds New Maintainer Role
RubyGems.org has added a new "maintainer" role that allows for publishing new versions of gems. This new permission type is aimed at improving security for gem owners and the service overall.
simpler-color
Advanced tools
Create your own complete Web color system fast and easy, from as little as one base color!
Color is at the heart of every UI design system. A cohesive color system enables your application to:
Simpler Color makes it super easy to implement your own CSS-compliant color system for any JavaScript/TypeScript project, no matter what platform, framework, or UI library you are using. It works in the browser, server (Node), mobile (React Native) and desktop (Electron).
Step 1: Install simpler-color
npm install simpler-color
Step 2: Define your color palettes and their corresponding base colors
const baseColors = {
primary: '#609E3F',
secondary: '#5D745D',
neutral: '#5E5F5A',
...etc,
}
—OR— just give simpler-color ONE base color, and it will generate the rest!
import { harmony } from 'simpler-color'
// Generate 5 harmonious base colors from your main brand color!
const baseColors = harmony('#609E3F')
Step 3: Create your color scheme(s) by mapping UI roles to specific colors from the auto-generated palettes
import { colorScheme } from 'simpler-color'
const scheme = colorScheme(
baseColors, // 👈 From these base colors...
// 👇 ...your color palettes are auto-generated
colors => ({
// 👇 which you then map to UI roles.
primaryButton: colors.primary(40),
primaryButtonText: colors.primary(95),
surface: colors.neutral(98),
text: colors.neutral(10),
...etc,
}),
)
// Access various UI colors as `scheme.primaryButton` and so on.
If some of those terms sound alien to you, read on...
BUT FIRST, if you like this library, the concept, and its simplicity, please give it a star ⭐️ on the GitHub repo to let me know. 😀
We're not gonna discuss Color Theory here, but let's talk a bit about what a proper color system comprises.
Creating your color system begins with building your color palettes. Each palette consists of a group of related colors, generated from one base color.
You decide what sort of relationship should be between colors in the palette. The most common type is the tonal palette (also called monochromatic), which is made up of various "tones" of the same general hue. For example, various shades of green is a tonal palette.
Each color in a palette is accessed by a unique color key, which is a string or number that indicates its relationship with the base color. The color values are determined by a color mapping function, which returns a specific color value for a given color key.
Palettes are automatically created by simpler-color based on your specified base colors. By default, it generates tonal palettes, with specific tones accessed by passing a numeric key between 0 and 100, which represents % lightness (0 = black, 100 = white). Any value in between generates a specific shade of the base color. So, for example, if your primary
palette is based on green (like in the illustration above), primary(40)
gives you green with 40% lightness.
You can, of course, define your own color mapping function to override the default. This also means that you can define a completely different set of color keys, which can be any of these common alternatives:
The color set is simply the collective term for all the color palettes built.
Typically a color set would have a primary palette. This represents the main "brand" color of your app. This is the most prominent hue across your UI.
Common additional palettes can be any of (but not limited to) these:
To ensure consistency of your color set, simpler-color enforces that you use the same set of color keys (and thus the same color mapping function) across all your palettes.
A color system consists of one or several color schemes. These days, it's quite common to implement both Light and Dark color schemes. You can also choose to add some High Contrast schemes for accessibility.
To create a color scheme, you first identify the various UI roles in your design system. Each role indicates a specific use or purpose of color as it applies to specific elements of the UI.
Some common examples of UI role:
The final step is to map each UI role to a specific color value from one of the palettes in your color set. Each such mapping gives us one color scheme. By using a consistent set of color roles, simpler-color helps ensure that your UI can easily and safely switch between color schemes.
import { complement, saturation } from 'simpler-color'
function awesomeColor(baseColor, key) {
return complement(saturation(baseColor, 80), key)
}
const uiColors = colorScheme(
'blue',
colors => ({
primaryButton: colors.primary(0),
floatingActionButton: colors.primary(2),
...etc,
}),
{
colorMapping: awesomeColor, // 👈
},
)
Color mapping functions are not only used to generate entire palettes, but also to calculate individual colors based on another. The format is always fn(baseColor, key)
where the valid key
values vary depending on the function. They can also be nested to perform more complex calculations.
import { analogue, complement, saturation } from 'simpler-color'
const brandColor = '#336699'
const baseColors = {
primary: brandColor,
secondary: analogue(brandColor, 2),
accent: saturation(complement(brandColor, 1), 80),
}
saturation(baseColor, percentSaturation)
Generates a new color value by adjusting the base color's % saturation (the "S" value in HSL color).
lightness(baseColor, percentLightness)
Generates a new color value by adjusting the base color's % lightness (the "L" value in HSL color). This is the default color mapping used to generate tonal palettes.
rotation(baseColor, rotationAngle)
Rotates the hue of the base color by a specified angle around the color wheel. A negative angle reverses the direction of rotation.
analogue(baseColor, step)
Generates a color that is analogous to the base color. An analogous color is one that is located adjacent to the base color around the color wheel, i.e. at around 30˚ angle. It is visually similar to the base.
This mapping function rotates the hue in steps of 30˚. A negative step value rotates in the opposite direction.
complement(baseColor, step)
Generates a color that is complementary to the base color. A complementary color is one that is located at the opposite side of the color wheel, i.e. at 180˚ angle. This provides excellent color contrast.
This mapping function cycles through multiple sets of "double complementary" hue rotation. The algorithm loops from 1 to step
, rotates Hue by 180˚ on every odd iteration, and 30˚ on even. A negative step value rotates in the opposite direction.
triad(baseColor, step)
Generates a triadic complementary color to the base color. A triadic palette consists of 3 colors that are equally spaced around the color wheel. Therefore, producing a triadic complementary color means rotating the hue by 120˚ angle. This provides a more subtle contrast.
This mapping function is cyclic. A negative step value rotates in the opposite direction.
opacity(baseColor, alpha)
Generates a new color value by adjusting the base color's opacity (the alpha or "A" value in RGBA) between 0 (transparent) and 1 (opaque).
FAQs
Simpler Color - Create your own complete color system fast and easy!
We found that simpler-color demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
RubyGems.org has added a new "maintainer" role that allows for publishing new versions of gems. This new permission type is aimed at improving security for gem owners and the service overall.
Security News
Node.js will be enforcing stricter semver-major PR policies a month before major releases to enhance stability and ensure reliable release candidates.
Security News
Research
Socket's threat research team has detected five malicious npm packages targeting Roblox developers, deploying malware to steal credentials and personal data.