ForHosting KIT · Developer Utilities

Material Design palette generator

Turn one hexadecimal color into a complete Material Design shade scale for interfaces, design tokens, prototypes, and documentation.

● BetaFree · in your browser
Use it from WebAPIEmailTelegramApp soon

The generator keeps your supplied color at step 500 and calculates the familiar lighter steps from 50 to 400 and darker steps from 600 to 900. Every result is returned as uppercase #RRGGBB text, making it easy to copy into CSS, a theme file, or a token pipeline. The calculation is immediate, repeatable, and does not rely on a network service or subjective color selection.

Start with a dependable base color

Enter a six-digit hexadecimal color with the leading hash, such as #3F51B5. That value becomes shade 500, the visual anchor of the generated scale. A strict input format is useful because it removes ambiguity between abbreviated, alpha-enabled, and bare hexadecimal notations. Before choosing the base, consider where it will appear most often. A brand accent used for buttons may need enough contrast against both light and dark surfaces, while a decorative chart color may be chosen for separation from neighboring series. The generator does not silently modify the anchor to meet contrast targets; preserving step 500 ensures that the palette remains traceable to the color you selected. Lower-numbered shades are progressively lighter, while higher-numbered shades are progressively darker. The output uses uppercase six-digit values so it can move cleanly into CSS custom properties, JSON token files, component themes, or design documentation without another normalization step. Invalid strings are rejected instead of being guessed or partially parsed.

Understand how the shade ladder is produced

The palette follows the established Material shade labels 50, 100, 200, 300, 400, 500, 600, 700, 800, and 900. Step 500 is exactly the submitted base. For the lighter side, each red, green, and blue channel is blended toward white by fixed amounts, with shade 50 receiving the strongest tint. For the darker side, the same channels are blended toward black, with shade 900 receiving the strongest shade. Every channel is rounded to the nearest integer and serialized back to hexadecimal. Using fixed RGB interpolation makes the algorithm transparent and deterministic: the same input always produces the same ten values in the same order. It also avoids hidden dependencies on display profiles, browser color management, network APIs, or changing design software defaults. This generated scale is a practical Material-style tonal family rather than a claim that every shade has identical perceived lightness spacing. Human vision responds differently across hues, so teams with rigorous perceptual requirements can use the result as a stable starting point and review it in context.

Apply the palette without losing accessibility

Map the returned values to semantic tokens instead of scattering shade numbers throughout an application. For example, a theme may assign one shade to an interactive background, another to hover state, and a lighter shade to a selected surface. Keeping that mapping in one token layer lets you adjust the visual system without editing every component. Always test foreground and background combinations at the actual font size and weight you ship. A shade label does not guarantee a particular contrast ratio, and two different base hues can produce very different accessibility results at the same numbered step. Review focus indicators, disabled controls, data visualizations, dark mode, and high-contrast settings separately. The generated palette is especially useful during exploration because it supplies coherent candidates quickly, but final selection should still account for context and meaning. Avoid using color as the only signal for errors or status. When the palette is shared between design and engineering, record the original base color and generated values together so later changes are reproducible rather than dependent on an undocumented manual adjustment.

Create interface design tokens

Convert one approved brand color into a predictable ten-step scale for component states and surfaces.

Prototype a Material theme

Produce copy-ready hexadecimal shades before deciding which values will serve primary, hover, and selected states.

Standardize developer handoff

Share a reproducible palette in JSON-friendly form instead of passing loosely named color swatches between tools.

What input format is accepted?

Use exactly a leading hash followed by six hexadecimal digits, for example #3F51B5. Three-digit shorthand, alpha channels, and values without the hash are rejected.

Which shade contains my original color?

Shade 500 is the normalized uppercase form of your original color. It is never changed by the generator.

How are lighter and darker shades calculated?

RGB channels are blended by fixed proportions toward white for steps 50 through 400 and toward black for steps 600 through 900.

Does a generated shade guarantee accessible contrast?

No. Contrast depends on both foreground and background colors as well as text size and weight, so test each intended pairing.

What does an API request cost?

Each API request costs $0.002. The browser version performs the same deterministic calculation locally.

Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.

POSThttps://api.kit.forhosting.com/color/material-palette-generate

Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.

curl -X POST https://api.kit.forhosting.com/color/material-palette-generate \
  -H "Authorization: Bearer $KIT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"base_color":"#3F51B5"}'
{
  "base_color": "#3F51B5"
}
{
  "task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
  "type": "color.material_palette_generate",
  "status": "queued",
  "_links": {
    "result": "/tasks/tsk_…/result"
  }
}

The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.

Per request$0.002

Published price — no tokens, no invented credits. A failed task is never charged.

HTTPCodeMeaning
401unauthorizedMissing or invalid API key.
402insufficient_balanceYour balance doesn't cover the task price.
404unknown_typeThat task type doesn't exist.
429rate_limitedToo many requests. Use the webhook instead of polling.

Read the full KIT documentation →