Vivid light blend
Combine a base and a top color the way vivid light does: gray #808080 under a lighter #C0C0C0 brightens all the way to #FFFFFF. Every channel is judged against mid-grey 128 separately, giving strong, punchy contrast. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Base
- #808080
- Top
- #C0C0C0
- Hex
- #FFFFFF
- Rgb string
- rgb(255, 255, 255)
- Mode r
- color_dodge
- Mode g
- color_dodge
Vivid light is a high-contrast compositing blend mode that applies color-burn or color-dodge independently on each RGB channel according to the top blend colour. When a top channel sits below mid-grey, vivid light burns: contrast increases and the base channel is darkened as if the inverse of the base were divided by twice the top. When a top channel sits at or above mid-grey, vivid light dodges: the base channel is lifted as if divided by twice the inverse of the top, producing bright, punchy highlights. Photographers, texture artists, and theme-pipeline engineers reach for vivid light when they need the same Photoshop preview from two hex tokens — overlaying a contrast mask, matching a layer-blend swatch in continuous integration, or generating accent colours without opening a desktop editor. This capability accepts two validated hex colours, applies one deterministic per-channel rule, and returns the blended swatch as hex and RGB.
How vivid light chooses color-burn or color-dodge on each channel
Vivid light treats the top colour as a contrast decision surface, not as a mix ratio. For every channel in the zero-to-two-hundred-fifty-five range, compare the top channel against mid-grey (one hundred twenty-eight). If the top channel is strictly less than one hundred twenty-eight, the color-burn branch runs: twice the top channel becomes the burn divisor.
The result is two hundred fifty-five minus the rounded product of the inverse base and two hundred fifty-five divided by that divisor, then clamped to the legal channel range. When the top channel is zero the burn divisor vanishes; the result is zero unless the base channel is already white, which stays white. If the top channel is greater than or equal to one hundred twenty-eight, the color-dodge branch runs: twice the inverse of the top channel becomes the dodge divisor.
The result is the rounded product of the base channel and two hundred fifty-five divided by that divisor, then clamped. When the top channel is white the dodge divisor vanishes; the result is white unless the base channel is already black, which stays black. Mid-grey top channels sit on the pivot and leave most base values nearly intact because the burn and dodge envelopes meet near the identity.
Order matters: swapping base and top is a different operation, unlike a fifty-percent RGB lerp.
Workflows, pricing, and how vivid light differs from other colour tools
Call the free in-browser vivid light blend for quick contrast-mask checks, logo overlay experiments, and texture previews without installing a desktop suite. Vivid light is the right search intent when users type vivid light blend mode, vivid light two colors, or Photoshop vivid light hex — those queries are not served by a generic mixer or by pin light. Keep requests to two hex strings, avoid shipping named colours without conversion, and document that base is the bottom layer so teammates never reverse the order by accident.
Authors mapping software-development kits can surface hex and the three mode labels next to colour pickers that students and production designers already expect.
What you can do with it
Punchy contrast overlays from two hex tokens
Composite a mid-tone panel colour under a top mask hex so dark top channels burn shadows and light top channels dodge highlights without a full image editor.
Game and UI accent generation
Material authors blend a base albedo token with a top lighting hint colour to generate vivid-light accent swatches for HUD skins and prop palettes.
FAQ
How does vivid light blend two colours?
For each RGB channel, if top is below 128 the result is a color-burn with twice the top; if top is 128 or higher the result is a color-dodge with twice the inverse of the top. Send base and top as hex.
What is the difference between base and top?
Base is the bottom layer colour. Top is the blend colour that chooses color-burn or color-dodge per channel. Order matters; swapping them is a different result.
What happens if I send an invalid hex code?
Both colours must be 3- or 6-digit hexadecimal (optional #). Bad length or non-hex digits are rejected and not charged.
Is the vivid light blender free?
The browser tool runs free on your device.
Is this the same as pin light or color.mix?
No. color.mix is a linear RGB lerp by ratio. Pin light chooses darken or lighten. Vivid light chooses color-burn or color-dodge — higher contrast, different search intent.
Related tools
For developers — API access
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.
API endpoint
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.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/color/vivid-light \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"base":"#808080","top":"#C0C0C0"}'const res = await fetch("https://api.kit.forhosting.com/color/vivid-light", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"base": "#808080",
"top": "#C0C0C0"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/color/vivid-light",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"base": "#808080",
"top": "#C0C0C0"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/color/vivid-light", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"base":"#808080","top":"#C0C0C0"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"base":"#808080","top":"#C0C0C0"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/color/vivid-light", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"base": "#808080",
"top": "#C0C0C0"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "color.vivid_light",
"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.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Invalid or missing inputs fail with invalid_input so scripts never ship a silent wrong colour. The free browser path and the prepaid API share one pure module, so goldens stay bit-identical at $0.002 per successful item.
How vivid light chooses color-burn or color-dodge on each channel
The algorithm is pure arithmetic with no network, no random seed, and no wall clock, so identical inputs always produce identical JSON.
Input contract, response fields, and validation errors
Each value must be a three- or six-digit hexadecimal colour with optional hash or zero-x prefix. Named CSS colours and rgb parenthesis strings are out of scope — normalize those upstream. Validation failures are not charged. Use hex when you need a single token for theme files; use rgb when canvas code or accessibility tooling expects separate channels; use the mode labels when teaching or debugging which contrast branch fired on a mixed grey-and-tint top colour. POST a JSON body with two required string fields: base (the bottom layer) and top (the blend layer that selects color-burn or color-dodge). Aliases color1, bottom, hex1, from, and background map to base; color2, blend, hex2, to, and foreground map to top, so older form fields and design-tool vocabularies connect cleanly. On success the payload echoes normalized base and top hex, base_rgb and top_rgb channel objects, the blended hex, rgb as integer red green blue, rgb_string for paste into a stylesheet, mode_r mode_g and mode_b as the words color_burn or color_dodge for each channel, and method always equal to vivid_light so clients can branch without sniffing shapes. Missing base, missing top, empty strings, non-hex digits, and wrong lengths all fail with invalid_input; messages name the field so form validation can highlight the exact control. Keep both strings short: this endpoint never reads images, never samples pixels, and never calls a graphics library — it is two hex tokens in and one blended swatch out.
Workflows, pricing, and how vivid light differs from other colour tools
Use the prepaid API when a design-system pipeline, game material generator, ecommerce swatch service, or marketing asset bot needs a stable contract under KIT balance at $0.002 per successful item. Pair this endpoint with color.mix when you need a ratio lerp instead of a selective burn-or-dodge, with color.mix_subtractive when you want paint-like RYB mud, with color.pin_light when you want the milder darken-or-lighten sibling, and with color.lighten or color.darken when only one colour should shift by a percentage.
Integration use cases
Match Photoshop vivid-light previews in CI
Theme and texture pipelines call the API so automated builds reproduce the same vivid-light hex a designer saw in Photoshop, bit-identical every run.