Skip to content

v0.12.2

Choose a tag to compare

@daopk daopk released this 17 Sep 09:40
· 68 commits to main since this release

Two breaking changes in the palette and four fixes, and the one to read is the build fix: the
published package had been dropping the reads that subscribe an effect, so a computed that
depended on one answered once and never again. The splitter never laid out at all.

Breaking

ropav/styles/compat-0.10.css is gone

The aliases that answered the palette under its pre-prefix names were opt-in, and they were always
going before 1.0. Delete the import:

@import "ropav/styles";
-@import "ropav/styles/compat-0.10.css";

Anything still spelling --accent, --background, --field-border and the rest has to spell them
with rp- now. Tokens lists the names, and a theme that
maps only the names it writes is still the advice — a mapping carrying the whole set is mostly names
nothing writes, and a name nothing writes cannot be found to be wrong.

--rp-danger moves away from the page in each scheme, and its dark label flips

- --rp-danger: oklch(0.6532 0.2328 25.74);   /* light */
+ --rp-danger: oklch(0.55 0.2328 25.74);

- --rp-danger: oklch(0.594 0.1967 24.63);    /* dark */
- --rp-danger-foreground: var(--rp-snow);
+ --rp-danger: oklch(0.7 0.1967 24.63);
+ --rp-danger-foreground: var(--rp-eclipse);

Danger is the only semantic colour the library paints both as a solid fill carrying a button label
and as body text — field-error, the error message, the destructive menu item. Those two jobs pull
the same way within a scheme and opposite ways across them: on a light page both want a dark red, on
a dark page both want a light one. The old value sat between them and failed both, and there is no
third option — contrast against white multiplied by contrast against black is 21 for any colour, so
a red that carries white text at AA is by construction too dark to read against a dark page.

The dark scheme crosses the lightness threshold that decides the label, which is why the fill now
takes a dark one, the way the brand themes whose reds already sit up there are handled. If you paint
your own text on --rp-danger in dark, it needs to be dark now. default, hero, lavender, mint
and sky move; the brand themes are unchanged.

Fixed

  • A computed that depends on a reactive read updates in the published build. The build told the
    bundler that reading a property is pure — in a reactivity library it is the opposite, because
    reading .value off a ref is what subscribes the surrounding effect. Every read whose result went
    unused was therefore dropped, which is exactly what void version.value; is, across
    use-collection, use-table-collection, use-virtualizer, use-single-select-list-state,
    Breadcrumbs and the splitter's registry. A computed whose only dependency was one had no
    dependencies at all and cached its first answer for good. The splitter is the worst case: its key
    registry first computes while the panel map is still empty, so the published splitter never laid
    out — no panel received a flex-basis, defaultSize, minSize and maxSize were ignored, and
    dragging a handle did nothing. flex: 1 split the container evenly, which looks close enough to
    working that it went unreported. Source and tests, which run against source, were green throughout;
    only the published package was affected. Costs about 1.4kB across the library.
  • A form field draws its own inset edge, rather than relying on a fill the container may share.
    --rp-field-background is --rp-surface, so a field inside a card or a popover was painted in the
    fill behind it with nothing left to mark where it starts. The new --rp-field-edge is an alpha of
    the field's own foreground, which holds against any of them — 18% on a light page and 12% on a dark
    one, because the same alpha reads stronger over a dark fill and the two land on the same contrast.
  • A row header keeps its name while the row is being edited. Name-from-contents covers a cell
    holding text and covers nothing else, so a cell that swaps its text for an input read as an empty
    header, and so did the row pointed at it. Give that cell text-value and it is the name — deriving
    one from the control would name the row after the field, and every row being renamed would answer
    to "Name".
  • The empty and loading rows stop claiming to be a row header. Both carried role="rowheader",
    naming a row that does not exist; they are gridcell now.
npm i ropav@0.12.2

Full changelog: v0.12.1...v0.12.2