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.
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 some discovery surfaces make browser REST requests to a Supabase-hosted public palette catalog using a publishable key. Google Analytics is now loaded only after an accepted analytics choice; an essential choice leaves it unloaded. Live Google AdSense ad-serving JavaScript is disabled during the Phase 26 review build, 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.