16 Chroma – Changelog

20 min read

What shipped in each Scylla Chroma release, from the initial nine-tab window down through every fix and refinement that follows.

These are the release notes for Scylla Chroma, the editor-only color authoring tool. Versions are listed newest at the top; each entry groups its bullets under Added, Removed, Changed, and Fixed. Chroma follows its own semver line, independent of the framework modules whose color assets it produces.

1.2.1

A maintenance release that moves Chroma’s color math into Scylla Core.

Added

  • ChromaMenuItems.SHORTCUT_CHROMA, the Chroma window’s keyboard shortcut.

Changed

  • Requires Scylla Core 1.2.0 or newer.
  • The measurements and generators behind the Accessibility and Theory tabs now come from Scylla Core: contrast, luminance, color difference, color temperature, color blindness simulation, harmonies, and tint, shade and material tone ramps. Chroma shows the same results as before, and game code can now use the same calculations at runtime through Core’s ColorAnalysis, ColorBlindnessSimulator, ColorHarmony and ColorRamps.
  • A swatch’s name is now its ID, the key code uses to look the color up. Changing a swatch’s color in the Palette tab’s list view no longer replaces it with the nearest named color, which used to overwrite IDs such as the entries of TextMode theme palettes. The list view’s Name column is now the ID column, and a new read-only Color Name column shows the nearest named color from the selected color name list. The name follows color edits and is never saved in the palette. Its header sorts by it.
  • The Sort menu’s By Name is now By ID and is still applied last. A new By Color Name key sorts by the nearest named color and stacks with the other keys, since two swatches can share a color name.
  • The Palette tab’s list view gives the ID column the most room, so long IDs such as BrightMagenta show in full. The Color Name, Hex and Role columns keep their width.
  • A swatch’s tooltip in the Palette tab’s grid view shows its ID and hex value on the first line and the nearest color name on the second.
  • The Gradient tab’s stop list column that shows the nearest named color is now titled Color Name.
  • Chroma palette files (.cpalette) now store each swatch’s ID under id instead of name, and their schema version is 2. Files written by earlier versions still import.
  • ChromaMenuItems.MENU_CHROMA no longer ends with the shortcut. The menu entry is registered by the Scylla Core menu registry and keeps its path and Ctrl/Cmd+Shift+K.

Fixed

  • The Library’s Swatches tab loaded only the first 256 swatches of a collection, and the next edit saved the collection back without the rest. It now loads every swatch.
  • Locked palette entries were marked with a dot in the Palette tab but could still be edited and removed there. The Palette tab now leaves them alone: their color, name and role are read-only, Replace with Active Color is disabled for them, and Remove, Delete and Remove Duplicates keep them and report how many were kept in the status bar.
  • Pasting a translucent color such as #E84B3A80 into the header hex field did nothing, because the field cut the value off at eight characters, # included. The field now takes the full value and drops the leading #, so a color copied with the field’s own Copy button pastes straight back in.
  • The Hex List (.hex, .txt) importer accepted only .hex files, both in the import file dialog and when a file was dropped onto the Library. It now accepts .txt files as well.
  • The Recolor tab suggested _Recolored as the output file name for a texture that has no asset path. It now suggests the texture’s own name followed by _Recolored.
  • Extract in the Image Sampler tab asked to turn on Read/Write and reimport every texture that did not have it, although a texture larger than the extractor’s working size is read on the GPU and does not need it. The prompt now appears only for textures small enough to be read directly. Point sampling, Gradient and Trace still need Read/Write and still ask for it.
  • Menu labels, status messages, Accessibility help text and .grd import warnings used the British spelling “colour”. They now read “color” like the rest of Chroma.

1.2.0

This release brings a large batch of factory palettes (general-purpose, semantic, and reproductions of published reference and measurement scales), several palette-tab workflow additions (a stackable sort preview, a fixed column count, a hex column, and clipboard import), image icons on the tabs, and cross-platform-safe asset naming.

Added

  • Palette tab Sort menu reworked into a stackable preview. Every key is now a checkbox and several can be on at once, By Name and By Role join the existing seven, a tenth key By Similarity arranges the colors into a smooth nearest-neighbor walk through Oklab space (exclusive, since it is a whole-sequence arrangement that cannot combine with the per-color keys), and nothing reaches the palette until Apply Sort writes the previewed order as a single Undo step and clears the keys. None (Stored Order) clears them without writing. Previously a sort wrote straight to the asset, so trying one out was a destructive edit to undo. Several keys apply in the order they were ticked, each showing its rank as a number in the menu so the sequence stays visible. Name is the exception, always applied last however it was ticked: swatch names are unique, so as a primary key it would leave every other key with no ties to break. The toolbar owns the sort for both views, so a list-view column header click sets it to that key; the Hex column header no longer sorts, having no toolbar equivalent and being a worse ordering than any of the color keys. A Reverse modifier below the keys flips the whole order end to end, on top of whatever the keys produce, the Similarity walk, or the stored order when nothing is ticked; Apply bakes a reverse-only flip in as readily as a sort.
  • Palette tab Columns icon button, at the right of the toolbar in grid view beside the view toggles, pinning the swatch grid to a fixed number of columns instead of wrapping to whatever fits. Auto (fit width) stays the default and is unchanged; any count from 2 to 32 holds that many columns and stretches the swatches to keep filling the pane, so cells become wider than they are tall rather than leaving a ragged right margin. The count is per user, survives a restart, shows on the button’s tooltip, and the button is hidden in list view where it has no meaning. The window’s Reset action returns it to Auto along with the Color tab’s view settings.
  • Palette tab Actions > New from Recent, which builds a palette out of the recent-colors strip plus the current Old and New preview swatches, so a session’s worth of picked colors can be captured as a palette in one step. Colors land oldest-first (the same order the Add button’s Shift-click bulk-add uses), each named from the nearest match in the configured color database, and the menu item names the count it would create. Recurring colors are kept as separate entries rather than collapsed; run Remove Duplicates to fold them.
  • Palette tab Actions > Clear Recent Colors, a companion to New from Recent that empties the recent-colors strip and resets the Old and New preview swatches to black and white in one step, without the full window Reset.
  • Palette tab Actions > New from Clipboard, which builds a palette out of whatever color format the clipboard holds: CSS custom properties, SCSS variables, a Tailwind config with its nested shade ramps, a JSON array, a quoted or comma-separated list, bare hex codes with no #, the CSS rgb() / rgba() / hsl() / hsla() functions, CSS color names, a pasted GIMP palette block, and all six formats the Copy Selected As submenu produces. Variable names become swatch names (--fresh-sky gives Fresh Sky, a Tailwind shade gives Fresh Sky 500), and Tailwind DEFAULT keys are skipped because each repeats its family’s 500 shade. The menu item names the count it would create and is disabled when there is nothing to paste. Bare hex without a # is accepted only when every token in the text parses as one, since a great many ordinary words are also valid hex.
  • Palette tab Actions > Add from Recent and Add from Clipboard, the append counterparts of the two New-from items: they add the same color sets (the recent strip plus Old and New, or the parsed clipboard) to the palette already open in the tab instead of creating a new asset. Both name their count and are disabled when no palette is loaded. Add from Clipboard keeps each color’s parsed name, uniquified against the existing entries; Add from Recent names colors from the nearest database match, matching the Add button’s Shift-click bulk-add.
  • Palette tab list view Hex column, between Name and Role, showing each swatch as #RRGGBB or #RRGGBBAA when it carries alpha. It is read-only and follows the Color column, so editing a color in the row updates it straight away, and it sorts on the value shown, which orders by red, then green, then blue. Double-clicking a hex value copies it to the clipboard, with the status bar confirming the copy since a clipboard write leaves nothing on screen to show it worked.
  • Three general-purpose factory palettes alongside the retro hardware set, all tagged for filtering. Pastels holds 32 soft tints ordered by hue, from pinks through greens and blues to warm and cool neutrals. Hue Ramps covers 12 hues, each as a seven-step ramp of three tints, the fully-saturated hue, and three shades, with hue constant down the ramp. Spectrum 256 is a 256-color working palette of 24 hue families in ten tones each (50 through 900, base at 500) plus a 16-step neutral ramp on the 0x11 grid; lightness is fixed per tone across families, so the same tone number reads at the same weight whichever family it comes from.
  • Seven semantic factory palettes, whose entry names carry meaning so a color can be looked up by what it represents:
    • Signal, nine categorical colors that hold at least 0.10 Oklab delta-E from one another under normal vision and under simulated protanopia, deuteranopia, and tritanopia, while clearing 3:1 contrast on a near-black background and 2:1 on a near-white one. Nine is what that separation floor allows; the widely used eight-color recommendations reach about 0.05 by the same measure. There is no bright yellow because no yellow bright enough to read as yellow clears the contrast floor against white.
    • Biomes, 36 terrain colors (Shoal, WetSand, Steppe, Cliff, Glacier) ordered from the lowest elevation to the highest so a height value maps onto an entry index, with four volcanic tones at the end outside the elevation run.
    • Materials, six metals (Gold, Silver, Copper, Bronze, Iron, Steel) and four surfaces (Wood, Stone, Leather, Cloth) as four-step shadow / base / light / highlight ramps, with hue rotating along each ramp (shadows cooler, highlights warmer and less saturated) rather than value scaling alone.
    • Rarity, six loot tiers from Common to Mythic, each with a Dim variant for locked or unavailable items.
    • Skin and Hair, 18 skin tones across six depths and three undertones, spaced evenly in lightness across the full range instead of bunching at the light end, plus 14 natural hair colors.
    • Values, a 16-step neutral ramp with perceptually even spacing, for value studies and contrast checks. Distinct from Spectrum 256’s neutrals, which are even in byte values and therefore visually bunched through the midtones.
    • Neon, 16 high-chroma colors near the edge of the sRGB gamut, tuned for dark backgrounds, UI accents, and bloom.
  • Entry names across every factory palette are readable words rather than run-together camel case: Bright Black, Gold Shadow, Cotton Candy, Skin01 Cool, Row0 Dark Gray. On the measurement, eye, and hair scales the name is the reading followed by its published description, for example FU05 Turquoise, Gardner11 Dark Topaz, PtCo015 Drinking Water Aesthetic Limit, MS09 Amber, and Level10 Lightest Blonde. The reading stays first so entries sort by it; on Fischer-Saller, the letter keeps the names unique, since five of its shades share the description Light Blond.
  • Three reference palettes that reproduce published data rather than being designed:
    • Elements, the visible color of all 118 chemical elements in atomic-number order, so entry index plus one is the atomic number. Accuracy is tiered and the palette says so: nine entries (Aluminium, Titanium, Chromium, Cobalt, Nickel, Copper, Silver, Platinum, Gold) are reflectance converted from published optical constants, 88 are observed appearance in the standard state, and 21 carry a flat placeholder because no one has produced enough of the element to look at. The nine colorless gases deliberately share one pale neutral.
    • Skin Color – Monk, the ten tones of the Monk Skin Tone Scale at their published values, for checking that a character creator or photo pipeline covers the range.
    • Skin Color – Von Luschan, the 36 tiles of the historical chromatic scale, sampled from a reproduction of the printed chart and kept for reference work. The scale was abandoned in the 1950s for reflectance spectrophotometry and its values are approximations, which the palette description states.
    • Hair Color – Fischer-Saller, the anthropometric hair scale: 25 lettered shades darkening from A very light blond to Y black, plus a six-step red series kept outside that run because red is a separate pigment rather than a point on the blond-to-black ramp. The red entries are prefixed (RedI to RedVI) since their published roman numerals would otherwise collide with the letters.
    • Hair Color – Level System, the ten depth levels salons and color manufacturers work in, black at Level01 to lightest blonde at Level10. It describes depth only and says nothing about tone, which is why product codes pair a level with a separate tone number. Entries are ordered lightest to darkest so the strip reads the same way as Fischer-Saller and the skin palettes, which puts Level10 first and Level01 last since the level numbers themselves count the other way. Each level is paired with its undertone, the pigment left exposed as lifting removes the darker one, running Undertone10 Pale Yellow at the palest level down to Undertone01 Darkest Red at the darkest. The ten levels are followed by the ten undertones in the same order, so entry i and entry i + 10 belong together, and a colorist picks a toner to cancel the undertone at the level being lifted to. Both the level and undertone values are sampled from one published levels-and-pigments chart, averaged over the interior of each swatch, and the level names are that chart’s own, which is why level 8 is plain Blonde here. One value is corrected rather than reproduced: as drawn, the chart’s level 3 is lighter than its level 4 and nearly neutral where its neighbors are warm, which a depth scale cannot be, so it is interpolated from levels 2 and 4.
    • Eye Color – Martin-Schultz, the 20 iris categories of the physical-anthropology eye color scale, from MS01a pale-blue to MS16 black. It is written as a sixteen-point scale but has twenty categories, since the first numbers carry letter subdivisions. The ordering tracks pigment rather than luminance, so it steps back up in lightness more than once, which is faithful rather than an error. The scale is a set of physical glass eyes with no digital definition, so the values are authored to match each published category description.
    • Water Color – Forel-Ule, the 21 steps limnologists and oceanographers use to classify the color of natural water, running indigo blue at FU01 through turquoise, the greens, and leaf yellow to cola brown at FU21. The entry index is the scale reading, so a classifier resolving water to FU 12 indexes entry 11. The values render the progression rather than reproducing the measured colorimetry, which the palette description states.
    • Yellowness – Gardner, the 18 standards used to grade the yellowness of transparent oils, resins, fatty acids, and varnishes, from a barely tinted off-white at Gardner01 to a deep red-brown at Gardner18. The ramp behaves like an absorbing liquid: lightness falls at every step and chroma peaks around Gardner11 before the darker standards go deep rather than more colorful. ASTM D1544 defines the standards colorimetrically and these values are not derived from that definition, which the palette description states.
    • Yellowness – Pt-Co, nine steps of the platinum-cobalt scale (also called APHA or Hazen) used for water, solvents, and clear chemicals, from distilled water at PtCo000 through the drinking water limit at PtCo015 to the undiluted stock solution at PtCo500. The steps are deliberately uneven, so the reading lives in the entry name rather than the index.
    • Yellowness – Pt-Co Low Range, a finer companion covering only the bottom of the same scale: 18 steps from 0 to 75 units, including half steps at 2.5 and 7.5, since the drinking water limit is 15 units and most process water grades below 20. Two supplied values arrived fractionally out of order against their neighbors, which a dilution series cannot do; both are interpolated back onto the ramp so the series darkens at every step, and the palette description records which two.
  • Three metallic chrome gradients, tagged Metallic: Chrome Silver, Chrome Gold, and Chrome Copper, for the shiny reflective metal look used on text and material effects. Each is a vertical sheen with a bright highlight in the upper half, a crisp dark reflection line across the center, and a bounce-light highlight at the bottom; only the hue changes between the three.
  • Image icons on the library and editor tabs, replacing the text glyphs. Each of the three library sub-tabs (Palettes, Gradients, Swatches) and the nine editor tabs shows a scale-to-fit icon, the original text stays on as the tab tooltip so icon-only tabs are still identifiable, and a tab falls back to its text label whenever its icon is missing. The icons render at 20px and hold a 16px floor, so narrowing the window no longer shrinks them toward nothing.
  • To Mixer swatch context-menu actions on the Library Swatches and Palette editor tabs, sending colors straight into the Color Mixer without re-picking them. Right-click one selected swatch for To Mixer Color A and To Mixer Color B, or exactly two for To Mixer Colors (the first fills Color A, the second Color B, in list order). Either loads the Mixer’s slots and switches to the Mixer tab. Three or more selected shows no mixer item, since the Mixer has only the two slots.

Changed

  • The 16 retro and terminal factory palettes are now named with a Retro - prefix (Retro - ANSI, Retro - C64, Retro - Game Boy, and so on), which groups them in the library sidebar and in the generated asset folder now that not every factory palette is a hardware reproduction. Registry lookups by the old bare names no longer resolve; the ColorPalettes accessor properties are unchanged.
  • Palette, gradient, and swatch names are now restricted to characters that are legal in a file name on Windows, macOS, and Linux, filtered live as you type and normalized once on commit. Committing a name renames the backing .asset file, so a name typed on macOS with a : or ? used to be written to disk verbatim and break the project when opened on Windows; swatch names were not validated at all before. Trailing spaces and periods are left alone while typing and trimmed on commit, so a name can be typed through a space rather than having it vanish keystroke by keystroke.

Removed

  • The palette list view’s Tags column. It was read-only and nothing in Chroma could set a per-swatch tag, so it only ever showed an empty value across the width of the list. The runtime ColorPaletteEntry.Tags field is unchanged and still round-trips through the Chroma JSON importer and exporter.

1.1.0

This release adds two authoring conveniences on the Color and Palette tabs: a web-safe color mode and multi-swatch text copy.

Added

  • Color tab web-safe mode, a Web toolbar toggle that restricts authoring to the classic 216-color web-safe palette (each RGB channel held to 00 / 33 / 66 / 99 / CC / FF). When on, all four pickers and their hue / lightness side strips render the posterized web-safe grid, and the active color snaps to the nearest web-safe color from every input source (picker, slider, hex, name, eyedropper); alpha is never quantized. The toggle is persisted per-user and cleared by the window’s Reset action.
  • Palette tab Copy Selected As context-menu submenu, which copies every selected swatch to the clipboard one color per line in palette order, in any of six formats (Hex, Unity Color, Unity Color32, CSS rgb(), HLSL float4, JSON). Per-color output is identical to the Color tab’s single-color Copy menu, and the status bar confirms with Copied N colors as <format>.

1.0.0

The initial release introduces Scylla Chroma as a single Editor window with nine purpose-built tabs that share a single color state, plus a library sidebar over every color asset in the project.

Added

  • Chroma editor window, opened from Tools > Scylla > Utilities > Chroma... or via Cmd/Ctrl+Shift+K, with nine tabs that share one active color and one library sidebar.
  • Color tab, Chroma’s shared picker, with four interchangeable 2D pickers (HSV Wheel, HSV Square, RGB Cube Slice, Oklch LCh Plane), channel sliders in integer or float mode, a hex field, multi-space readouts (sRGB, Linear, Oklch, HSL, CSS, Unity code, JSON), a screen eyedropper, color history, pinned favorites, and a named-color search field.
  • Palette tab, with a swatch grid and a tabular list view, multi-select, drag-reorder, per-swatch tags and lock flag, optional semantic color roles, seven sort modes (hue, saturation, value, lightness, luminance, chroma, alpha), and Remove Duplicates plus Convert to Gradient actions.
  • Gradient tab, with independent color and alpha rails (the alpha bar appears as soon as the gradient carries any alpha stops), per-stop interpolation override across 18 curves (None, SmoothStep, SmootherStep, plus the 15 Penner easings), per-color-stop blend modes (Normal, Multiply, Screen, Add), three color spaces for the blend math (RGB, HSV, Oklab), smooth or stepped mode, a non-destructive Reduction slider with Apply, and a Bake-to-texture dialog that emits PNG, TGA, or EXR in sRGB or linear.
  • Image Sampler tab, which loads any texture and samples in Point, Average, Gradient, or Trace mode, with a magnifier overlay and arrow-key pixel nudging, plus four palette-extraction strategies (K-Means in Oklab, Median Cut, Luminance Buckets, Most Saturated) whose output saves as a palette or gradient asset.
  • Theory tab, a color-theory bench that turns one base color into a palette through a harmony generator (10 types including Complementary, Triadic, Tetradic, Analogous, Monochromatic) with a live hue wheel and three hue-rotation backends (Oklch, HSV, OkHSL), Tints / Shades / Tones with an optional symmetric ramp, a four-tone material set (Shadow, Midtone, Highlight, Rim), a Planckian blackbody ramp, a jitter palette, a multi-noise-driven palette, and a seeded random palette with Oklab delta-E minimum.
  • Accessibility tab, with a WCAG 2.1 contrast checker (sample-text preview, AA / AAA badges), an eight-type color blindness simulator via the Vienot-Brettel-Mollon model, an Oklab delta-E calculator with descriptive labels, named-color lookup across CSS Level 4 / X11 / RAL Classic / Chroma Colors, Correlated Color Temperature via McCamy’s formula, and a palette statistics readout.
  • Mixer tab, a two-color blend preview rendered side-by-side in sRGB, Linear RGB, Oklab, and HSV simultaneously, with a ratio slider and Create Palette and Create Gradient buttons for the four-color result.
  • Compare tab, side-by-side palette analysis that maps every entry in palette A to its nearest entry in palette B by Oklab delta-E and reports min, average, and max statistics.
  • Recolor tab, a non-destructive texture remap that snaps each pixel of a source texture to its nearest source-palette entry in Oklab and rewrites it as the corresponding target-palette entry, saved as a new PNG with the original alpha preserved.
  • Library sidebar, with three sub-tabs (Palettes, Gradients, Swatches) over every color asset in the project, thumbnail previews, search and tag filtering, multi-select, context menus, drag-drop into and out of the active tab, and live refresh on disk changes.
  • Preferences page at Edit > Preferences > Scylla > Chroma, with default named-color database, transparent-preview checkerboard cell size, double-click-to-open toggle, and maintenance buttons for color history and favorites.
  • Project integration, with custom property drawers for ColorPaletteAsset and ColorGradientAsset showing inline previews and an “Open in Chroma” button, plus optional double-click-from-Project-window behavior.
  • Asset I/O surface: palettes import from ASE, GPL, Lospec JSON, ACT, plain hex lists, and Chroma JSON; palettes export to ASE, GPL, Lospec JSON, CSS variables, C# array literals, and Chroma JSON; gradients import from Chroma JSON and Photoshop GRD (GRD3 and GRD5, including foreground / background sentinels and multi-gradient library files); gradients export to Chroma JSON.