Palette generation
The main Palette Generator stores five HEX colors in browser memory. Its standard Generate action replaces each unlocked slot with a randomly selected 24-bit HEX value using the browser's Math.random(). Locked slots are left unchanged.
The generator is not an AI model and does not call a remote generation service. Its built-in harmony actions use HSL math: the monochrome mode keeps one randomly chosen hue with 70% saturation while stepping lightness; the analogous mode steps hue by 28° across five colors and alternates lightness values.
How the palette collection is composed and sorted
The Studio collection replaces the large algorithmic catalogue with explicit color compositions. Each starts with a visual direction, an intended canvas and ink pair, and a limited number of supporting colors. The selection was prepared with AI assistance and reviewed in applied layouts; it is not a claim of review or endorsement by an external human designer.
The current collection contains 215 distinct compositions across all 101 category pages. It retains the original 72 selected palettes and adds 140 reviewed directions adapted from the site's examples plus three eight-role interface systems. Sixteen close alternatives were merged into existing compositions rather than published as duplicates. The 100,000 earlier algorithmic records remain archived. Existing HEX-based share links and browser-saved palettes continue to work.
- Studio selection alternates design directions in a deliberate sequence. There is no numerical beauty score.
- Text contrast sorts matching palettes by the unrounded ratio between their assigned Ink and Canvas colors. Every published Ink/Canvas pair passes 4.5:1; other pairs need their own check.
- Arrange swatches changes the display to measured dark-to-light luminance, light-to-dark luminance or the original role order. It does not change the preview, named roles or share URL.
- Latest additions uses the record’s actual publication date. Random starting point chooses a valid position in the published collection. Unsupported popularity claims are not shown.
Each palette includes a purpose, specific usage notes, semantic roles and suggested area proportions. Proportions are starting points, not rules. The on-primary text color may use black or white when those give better contrast than the palette’s own ink. Copying role CSS includes this extra text token. Eight-role systems also export label colors for success, warning and danger fills; status always needs a label or icon as well as color.
Duplicate checks compare exact unordered HEX sets. A second check optimally matches colors between same-size compositions in OKLab and omits a candidate when every matched color is within six units on a 0–100 scale. This is a similarity heuristic, not an aesthetic standard, and it does not compare different-size sets. Color families are recalculated from the actual swatches; palette-size filters use the actual number of colors. Use-case and style labels are editorial suggestions. Category examples come from the same published collection as the results. Filter counts refresh from the published data, and an included snapshot keeps browsing available when live updates cannot be reached. Recheck your layout, fonts, states, imagery and print process before production.
Contrast calculations
The redesigned Contrast Checker and Palette Accessibility Matrix normalize six-digit HEX colors, convert sRGB channels to linear-light values with the current 0.04045 breakpoint, calculate relative luminance with the standard coefficients 0.2126 R + 0.7152 G + 0.0722 B, then compute (Llighter + 0.05) / (Ldarker + 0.05).
Pass/fail decisions use the unrounded ratio. The current text thresholds are 4.5:1 for WCAG AA normal text, 3:1 for AA large text, 7:1 for AAA normal text, and 4.5:1 for AAA large text. Display rounding does not turn a raw value below a threshold into a pass.
Image color extraction
The Image Color Picker validates PNG, JPG, and WebP files up to 20 MB and rejects decoded images above 40 megapixels. The selected image is opened through a temporary browser object URL and sampled into a canvas whose longest edge is capped at 240 pixels.
Extraction first groups sampled pixels into a coarse RGB histogram. Very transparent pixels are skipped; partially transparent pixels are composited against white for extraction. A weighted median-cut process splits the histogram into candidate clusters, then a second selection step balances cluster population, OKLab chroma, and perceptual distance so the final palette includes dominant colors without filling every slot with near-duplicates. Up to eight HEX colors are returned.
The route-specific extraction script contains no network upload call for the selected image. Object URLs are revoked when they are replaced/reset. See the Privacy Policy for the important distinction between local image processing and third-party page scripts.
Color conversion
The Color Converter keeps one canonical state consisting of normalized sRGB channels plus alpha. Editing HEX, RGB/RGBA, HSL/HSLA, HWB, Lab, LCH, OKLab, or OKLCH parses that input into the canonical state and then regenerates every displayed format from the same color.
Lab/LCH conversion uses the CSS Color 4 D65↔D50 chromatic-adaptation path; OKLab/OKLCH use the corresponding CSS Color conversion matrices. Perceptual-format edits that convert outside the converter's sRGB output gamut are rejected with an error rather than silently clipping to a different sRGB color.
Accessibility logic beyond one contrast pair
The Palette Accessibility Matrix computes every pairwise contrast relationship across 2–8 colors and labels normal-text and large-text thresholds with text and icons. The Palette Visualizer audits selected semantic text/background combinations and suggests stronger palette alternatives when available, but it does not silently replace user choices.
The Color Blindness Simulator applies documented protanopia, deuteranopia, and tritanopia matrices to linear-light sRGB values, preserves image alpha, and downsizes large image previews before pixel transforms. It is a design simulation, not a medical diagnosis or an exact prediction of any individual's vision.
Colorrow's accessibility guidance intentionally recommends labels, icons, shape, position, and other non-color cues where meaning would otherwise depend on color alone.
Privacy and data behavior
Saved palettes use browser localStorage; compatibility code can read the current colorrowSaved key plus several legacy keys. Theme and cookie-banner choices are also stored locally. There is no current Colorrow account database or cloud-sync flow for saved palettes.
Palette discovery is different: Explore and collection pages make browser REST requests to a Supabase-hosted public palette catalog using a publishable key. If that service is unavailable, a bundled copy of the reviewed collection is shown with a visible notice and a retry control. Google Analytics is now loaded only after an accepted analytics choice; an essential choice leaves it unloaded. Google AdSense ad serving is currently disabled, while the publisher verification meta tag and ads.txt remain in place.
The local Colorrow banner is an analytics preference control, not a Google-certified TCF CMP. Before personalized AdSense serving is enabled for users in the EEA, UK, or Switzerland, a Google-certified CMP and the final ad placements must be configured and reviewed.
What the methodology does not claim
- Random or mathematical harmony does not guarantee an attractive or appropriate design.
- A contrast pass does not establish whole-interface WCAG conformance.
- Color-vision simulation is not diagnosis and cannot reproduce every person's perception.
- Image palette extraction is a quantized summary, not a list of every pixel color.
- Color conversion is bounded by format precision and, where noted, the sRGB output gamut.
- Local image processing does not mean the entire webpage is offline or free of third-party scripts.