Skip to content

White labels on status tags, sharper and aligned column headings - #56

Merged
Fivell merged 1 commit into
activeadmin-plugins:masterfrom
yeti-switch:status-tags-and-header-text
Oct 6, 2026
Merged

Fivell merged 1 commit into
activeadmin-plugins:masterfrom
yeti-switch:status-tags-and-header-text

Conversation

@Fivell

@Fivell Fivell commented Oct 3, 2026 •

Copy link
Copy Markdown
Member

Two reports after 3.0.0 — the label inside a status tag should be white, and index-table column headings read too soft — plus what verifying them turned up.

Status tags

White on its own was the wrong fix. Against the five shipped fills it lands between 2.35:1 and 3.78:1, under the 4.5:1 small text needs, which is exactly why the label went black during the review of #49. So the fills move down with it:

fill was is
neutral #8a909a → #707681 3.21:1 4.57:1
ok / published / green / yes #8daa92 → #5e7e63 2.53:1 4.53:1
notice / blue #6090db → #3874d2 3.23:1 4.57:1
warn / orange #e29b20 → #9e6c15 2.35:1 4.56:1
error / red #d45f53 → #ce483b 3.78:1 4.55:1

The five fills join $skinStatusTagTextColor as variables, so black-on-pale is still one line away. They were literals inside the mixin call before.

Column headings

Too soft. $skinTableHeaderTextColor was #5e6469, 4.93:1 against the header fill while the rows underneath run at 10.15:1. Passing, but visibly weaker than the data it labels. It takes $skinTextColor now.

Not above their own columns. ActiveAdmin puts the sort arrow inside the heading link, on the left, cleared with padding-left: 13px. The cell and the heading share the same 12px padding, so the cell is aligned — but the label inside is pushed 13px right while the data below starts at the padding edge. Every sortable column is affected, not only the one reported.

                   before   after
cell left          559.9    559.9
heading link left  571.9    571.9
tag left           571.9    571.9
heading TEXT left  584.9    571.9

Moving the background image to the right edge is not enough: the link is display: block, so the arrow would park at the far side of the column instead of beside the label. It is a pseudo-element now, which

  • sits immediately after the text,
  • keeps the link full width, so the whole cell stays clickable,
  • takes currentColor — the stock sprite is a fixed grey PNG that cannot follow the text into dark mode.

At 0.6 opacity the unsorted marker is 3.40:1 light and 4.22:1 dark against the header fill. It is the only thing separating a sortable heading from a plain one, so WCAG 1.4.11 asks 3:1 of it.

The check that should have caught this

rake css compares the README variables table against the declarations. It was doing so in one direction, and loosely. Four holes, each reproduced before and after the fix:

what passed now
undocumented variable a new !default with no row, while the success line claimed the table matched every declaration fails
blank cell the name entered the documented set, exempting it from the undocumented check, while the mismatch check skipped it for having no value — passing on both sides fails
row listed twice the last row won, so the table could agree with the stylesheet while a reader meets the stale one fails
declared twice unnoticed, though Sass keeps the first !default and drops the rest fails

The advertised count comes from the declarations now, rather than a hand-maintained constant that said 52 while 81 variables were being compared.

Screenshots

All four README sheets are reshot. The dummy index carries a Tags column under a sortable heading — the block-column shape the reports came from — labelled release / draft / featured / deprecated / review, which between them use all five tag colours; the previous pair showed two.

Before and after, zoomed, in the comments: light and dark.

Supersedes #55.

@Fivell
Fivell force-pushed the status-tags-and-header-text branch from d18e3e5 to d0663b5 Compare October 3, 2026 12:38
@Fivell Fivell changed the title White labels on status tags, sharper column headings White labels on status tags, sharper and aligned column headings Oct 3, 2026
@Fivell
Fivell force-pushed the status-tags-and-header-text branch from d0663b5 to 95d70df Compare October 3, 2026 12:52
@Fivell

Fivell commented Oct 3, 2026

Copy link
Copy Markdown
Member Author

Before and after, zoomed. Top half of each image is 3.0.0 as released, bottom half is this branch. Same page, same data.

Light

Light

Dark

Dark

Three things change in the same frame:

  1. Tag labels go from black on a pale fill to white on a darker one — the fill moves with the label so the result still clears 4.5:1.
  2. Headings line up with their columns. LegA DC sat 13px right of the tags it labels, Published On 13px right of the dates. Both start at the column edge now.
  3. The sort marker sits beside the label instead of in front of it, and takes currentColor — the stock sprite is a fixed grey PNG, which is why in the dark half of each image the old arrow is barely there while the new one matches the heading.

The marker also still covers the whole cell for clicking: the link keeps display: block, only the arrow moved into a pseudo-element.

@Fivell
Fivell force-pushed the status-tags-and-header-text branch from 95d70df to c57e4cf Compare October 3, 2026 14:32
@Fivell

Fivell commented Oct 3, 2026

Copy link
Copy Markdown
Member Author

Rebased on #57, which this now sits on top of — the four commits collapse to three once that lands.

#57 is right about something this branch had wrong, and it is my regression: > li#theme_toggle { display: flex } breaks the utility navigation, because ActiveAdmin lays that row out as li { display: inline }. My screenshots never showed it, because the dummy admin had an empty utility nav and the injected switch was the only item in it. The dummy now declares a username, a clock and a logout link, as yeti-web does, so the row has something to break.

Utility nav

Top: 3.0.0 as released — the switch takes a line of its own and pushes the username, clock and logout onto a second row. Bottom: with inline-flex.

Two changes to #57's work

The guard it added only fires while display is written first. It matches /^\s*display:\s*(?:flex|block|grid)\s*;/ against the whole rule, which works because sassc puts the first declaration on its own line. Swap the two declarations in the source and it returns nil — I checked. It now reads the rule body and compares each declaration, so order does not matter. Verified by writing { align-items: center; display: flex; } and watching it fail.

DECLARED_ROWS was fiction. Nothing compares it to anything; it is interpolated into the success line. It said 52, #57 raised it to 53, and the real number of variables being compared is 81. It is counted from the comparison now.

The one real disagreement

#57 makes the label white but leaves the fills as they were, which is 2.35:1 to 3.78:1 — its own comment says to set #000000 for AA. This branch moves the fills down with the label instead, so white clears 4.5:1 with nothing to configure:

fill was is
neutral #8a909a → #707681 3.21:1 4.57:1
ok #8daa92 → #5e7e63 2.53:1 4.53:1
notice #6090db → #3874d2 3.23:1 4.57:1
warn #e29b20 → #9e6c15 2.35:1 4.56:1
error #d45f53 → #ce483b 3.78:1 4.55:1

$skinStatusTagTextColor stays, and the five fills become variables alongside it, so the other choice is still one line away.

Everything in one frame

Light

Light

Dark

Dark

Top half of each is 3.0.0 as released, bottom half is this branch. Tag labels go white on darker fills; headings line up with their columns instead of sitting 13px right of them; the sort marker moves beside the label and takes currentColor, which is why the old arrow is barely visible in the dark half and the new one matches the heading.

@Fivell
Fivell force-pushed the status-tags-and-header-text branch from c57e4cf to 9891a41 Compare October 3, 2026 14:36
@Fivell
Fivell requested a balanced review from Copilot October 3, 2026 14:49

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

A duplicate Sass variable and incomplete declaration-to-documentation comparison should be corrected.

Review effort: Balanced
Findings: 1 Medium severity · 1 Low severity

Open (2)
What changed in this PR

Improves status-tag contrast and index-table heading clarity and alignment.

Changes:

  • Adds configurable, WCAG-compliant status-tag colors.
  • Strengthens and realigns sortable table headings.
  • Extends Sass override and README consistency checks.
File Description
README.md Documents updated theme variables.
active_admin_theme.scss Updates tag colors and table headings.
test/​css_check.rb Expands Sass and documentation checks.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread test/css_check.rb Outdated
Comment thread app/assets/stylesheets/wigu/active_admin_theme.scss
@Fivell

Fivell commented Oct 3, 2026

Copy link
Copy Markdown
Member Author

Both findings confirmed and fixed in 83be687.

Duplicate declaration. Right, and it arrived when this branch rebased onto #57 — that PR added its own $skinStatusTagTextColor next to the table header colours while this branch declares it beside the status tag fills. Sass keeps the first !default, so the second was dead code. Both read #ffffff, so nothing rendered differently; it was waiting to drift. One declaration now, with the fills it belongs to.

One-directional check. Also right, and the success line was the worse half of it: I added $skinTotallyUndocumented: #ff00ff and rake css passed while printing README table matches 81 declarations. It compares both sets now — a declaration with no row fails, a row naming nothing fails, and a second declaration of the same name fails. The count comes from the declarations, not the rows.

Verified by reintroducing each defect:

$skinTotallyUndocumented: declared in the stylesheet, absent from the README table
$skinStatusTagOkColor: declared more than once; Sass keeps the first !default and drops the rest

The second one is how I noticed a git checkout -- app during testing had quietly reverted the dedup — the guard caught its own fix going missing.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The README checker can overlook paired variables whose documented default is blank.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)
Resolved since last review (2)

Comment thread test/css_check.rb Outdated
@Fivell
Fivell force-pushed the status-tags-and-header-text branch from 04915c3 to 0d84f26 Compare October 3, 2026 15:17
@Fivell
Fivell requested a balanced review from Copilot October 3, 2026 15:32

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The sort indicator misses accessibility contrast requirements, and README validation can overlook incomplete or duplicate entries.

Review effort: Balanced
Findings: 4 Medium severity · 1 Low severity

Open (5)

Comment thread app/assets/stylesheets/wigu/active_admin_theme.scss Outdated
Comment thread test/css_check.rb Outdated
Comment thread test/css_check.rb
Comment thread app/assets/stylesheets/wigu/active_admin_theme.scss Outdated
@Fivell

Fivell commented Oct 5, 2026

Copy link
Copy Markdown
Member Author

All five confirmed and fixed in 3c7823d. The numbers on the marker were exact — I measured the blend rather than trusting them:

light  #323537 on #e6e9ee   opacity 0.4 → 2.13:1    0.6 → 3.40:1
dark   #dde2e8 on #363c43   opacity 0.4 → 2.73:1    0.6 → 4.22:1

0.6 it is. It is the only thing telling a sortable heading from a plain one, so 1.4.11 applies.

Blank cells. Right, and worse than described: the name went into documented, which exempted it from the undocumented check, while the mismatch check skipped it for having no value — it passed on both sides. Blank cells are not recorded now. Reproduced with a paired row ending | `#ffffff` / |:

$skinInputBgColorDark: declared in the stylesheet, absent from the README table

Duplicate rows. Also right, and symmetric to the declaration side I had already added. Reproduced by listing $skinBorderRadius twice:

$skinBorderRadius: listed more than once in the README table

The contradictory comment. Fair — 2.35 to 3.78 belonged to the fills this palette replaces, not to the ones the sentence sits above. Reworded so the old range is identified as the old one.

Screenshots reshot for the marker change.

@Fivell
Fivell force-pushed the status-tags-and-header-text branch from 0d84f26 to 56fbbd9 Compare October 5, 2026 08:30
@Fivell
Fivell requested a balanced review from Copilot October 5, 2026 09:00

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment thread README.md Outdated
@Fivell
Fivell force-pushed the status-tags-and-header-text branch from 56fbbd9 to 4c3f43b Compare October 5, 2026 09:07
@Fivell
Fivell requested a balanced review from Copilot October 6, 2026 09:01

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Blank duplicate README entries can still bypass the strengthened consistency check.

Review effort: Balanced
Findings: 1 Medium severity · 1 Low severity

Open (2)

Comment thread test/css_check.rb Outdated
@Fivell
Fivell force-pushed the status-tags-and-header-text branch from 4c3f43b to aa8b126 Compare October 6, 2026 10:25
@Fivell

Fivell commented Oct 6, 2026

Copy link
Copy Markdown
Member Author

Both confirmed, both fixed in aa8b126.

The combined hole is real, and it is one I opened. Skipping blank cells was my fix for the previous finding, and it took blank rows out of duplicate detection along with it. Reproduced exactly as described — a blank row and a good row for the same name:

| `$skinBorderRadius` |  |  |
| `$skinBorderRadius` | `4px` |  |
→ css_check: 13 overrides compile clean, 12 bad ones rejected, README table matches 81 declarations

Every row counts towards duplicate detection now, blank or not, and a blank cell also fails on its own rather than only being inferred from the undocumented check. The same case after:

$skinBorderRadius: listed more than once in the README table
$skinBorderRadius: listed in the README table with no default

Four shapes checked, each reproduced before and after: blank + good row, blank row alone, blank dark twin, two good rows.

The contract was overstated. .empty, .unknown and .none have no fill and take var(--aa-text-muted) at :1511-1514, so $skinStatusTagTextColor does not reach them. The row now says label inside a filled status tag; empty / unknown / none have no fill and keep $skinTextMutedColor.

@Fivell

Fivell commented Oct 6, 2026

Copy link
Copy Markdown
Member Author

This one is a false positive — the four images are in the change. GitHub's own files API for this PR lists them:

README.md                                            modified  +7/-2
app/assets/stylesheets/wigu/active_admin_theme.scss  modified  +61/-11
img/dark.png                                         modified  +0/-0
img/inputs.png                                       modified  +0/-0
img/light.png                                        modified  +0/-0
img/switch.png                                       modified  +0/-0
test/css_check.rb                                    modified  +118/-12

The +0/-0 is what binaries always report, and I suspect that is what read as not included. The blobs differ from master:

         master     branch
light    7a508da    a6292c4
dark     dde249c    7598940
inputs   a91cd09    4f6fdd3
switch   9d5fedf    cc73859

And the content differs where it should — 5.35% of img/light.png changed, including the tag fills:

master  srgb(240,242,245)    the old pale ok fill
branch  srgb(251,251,251)    row background; the tags moved with the new Tags column

Nothing to change here. Worth saying that this is the first of ten findings across five rounds on this branch that has not held up — the other nine were all real, including two in code I had written in answer to earlier ones.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The contrast checker mishandles several valid Sass color formats.

Review effort: Balanced
Findings: 1 High severity · 1 Low severity

Open (2)

Comment thread test/css_check.rb Outdated
@Fivell
Fivell force-pushed the status-tags-and-header-text branch from a0fb8fc to 62fb4d4 Compare October 6, 2026 11:33
@Fivell

Fivell commented Oct 6, 2026

Copy link
Copy Markdown
Member Author

Confirmed in part, and the fix is bigger than the finding. 62fb4d4.

I put the same low-contrast green behind the variable in every form Sass accepts and ran the guard on each:

#8daa92                caught   2.53:1
rgb(141,170,146)       caught   2.53:1     sassc normalises to hex
rgba(141,170,146,1)    caught   2.53:1     likewise
hsl(127,19%,61%)       caught   2.47:1     likewise
mix(#8daa92,#8daa92)   caught   2.53:1     likewise
darkseagreen           PASSED   2.15:1     emitted as a name, skipped
#8da9                  CRASHED             nil can't be coerced into Float

So rgb() and friends were never the problem — sassc hands those back as hex. Named colours and the four-digit form were, exactly as described, and a silent pass on 2.15:1 is the worse of the two.

Rather than widen the regular expression, the guard no longer parses colours at all. It appends a probe to the compiled source and lets Sass resolve them:

.css-check-ok { r: red($skinStatusTagOkColor); g: green(...); b: blue(...); }

Every form above now resolves, including the two that did not. The probe also raises if it comes back without all six colours, so the check cannot quietly stop covering anything — which is the failure mode that made this worth fixing rather than patching.

Two things that came out of writing it:

  • red() on an hsl() colour is not a whole number, and my first pattern matched integers only — it found nothing for that case and the probe's own assertion caught it.
  • A translucent fill is left out on purpose and said so in the comment: the ratio would be against whatever shows through, which the stylesheet does not know.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The contrast probe ignores alpha and can approve unreadable translucent colors.

Review effort: Balanced
Findings: 1 Medium severity · 1 Low severity

Open (2)
Resolved since last review (1)

Comment thread test/css_check.rb

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The styling, documentation, and validation changes are consistent and no blocking issues were identified.

Review effort: Balanced
Findings: 1 Medium severity · 1 Low severity

Open (2)

@Fivell

Fivell commented Oct 6, 2026

Copy link
Copy Markdown
Member Author

Right, and the sharper version of the point is that my comment said the case was out of scope while the code let it through. Documented is not excluded. transparent scored 21:1 — black against white — and passed.

The probe reads alpha() now and reports rather than measures:

transparent             status tag ok: translucent, so the label ratio cannot be measured
rgba(141,170,146,0.4)   status tag ok: translucent, so the label ratio cannot be measured
rgba(0,0,0,0)           status tag ok: translucent, so the label ratio cannot be measured
rgba(255,255,255,0.6)   status tag label: translucent, so the label ratio cannot be measured

Opaque colours are unaffected, in every form:

#8daa92             2.53:1
darkseagreen        2.15:1
hsl(127,19%,61%)    2.47:1

I did not composite against the surfaces, as the alternative you offered. A tag sits on a table row, and the row is striped, hovered, selected and themed — there is no single backdrop to composite against, so any number it produced would be true for one of four states. Reporting is the honest answer, and the shipped palette has no reason to be translucent anyway.

That makes three guards in this file that were quiet rather than wrong: the one-directional table comparison, the colour form it could not parse, and this. Same failure mode each time — the check appears to cover something it does not — which is worth more than any one of the defects.

@Fivell
Fivell force-pushed the status-tags-and-header-text branch from 62fb4d4 to c9abda0 Compare October 6, 2026 11:59
@Fivell
Fivell requested a balanced review from Copilot October 6, 2026 12:39

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The accessibility and styling changes are coherent, configurable, and supported by strengthened validation.

Review effort: Balanced
Findings: 1 Low severity

Open (1)
Resolved since last review (1)

@Fivell
Fivell force-pushed the status-tags-and-header-text branch 2 times, most recently from aec5b37 to 513abcb Compare October 6, 2026 13:00
@Fivell
Fivell requested a balanced review from Copilot October 6, 2026 14:38
@Fivell
Fivell force-pushed the status-tags-and-header-text branch from 513abcb to 568572b Compare October 6, 2026 14:40
@Fivell

Fivell commented Oct 6, 2026

Copy link
Copy Markdown
Member Author

Another pass of my own over the branch as it stands. One finding worth fixing, two not.

A blank row and a missing row gave the same message. Both reported declared in the stylesheet, absent from the README table, but in the first case the row is there — it just has no value. Someone chasing that message would grep the table, find the row, and have nothing to go on.

row present but empty   →  listed in the README table with no default
row genuinely missing   →  declared in the stylesheet, absent from the README table
empty row + good row    →  listed more than once in the README table
                           listed in the README table with no default

Absent is measured against every row now, blank ones included, which also removed the set subtraction that existed only to stop the two messages overlapping.

Also renamed @readme_variable_rows, which held a count of declarations rather than rows and read as the opposite of what it was.

Two things I checked and left alone:

  • The declaration scan would count a commented-out !default and would miss one split across lines. Neither exists in the file — 81 declarations, none wrapped, none commented — so the stricter pattern would buy nothing today and cost a reader something.
  • A foreign link in a sortable heading still inherits ActiveAdmin's own sprite, because the theme deliberately no longer touches anything but a[href*="order="]. That is ActiveAdmin's behaviour and predates this branch.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The sort marker has an accessibility issue, and the utility-navigation guard misses !important declarations.

Review effort: Balanced
Findings: 2 Medium severity · 1 Low severity

Open (3)

Comment on lines +929 to +933
// 0.6, not lower: the marker is the only thing separating a sortable
// heading from a plain one, so WCAG 1.4.11 asks 3:1 of it. Against the
// header fill it gives 3.40 light and 4.22 dark; at 0.4 it was 2.13
// and 2.73.
opacity: 0.6;
Comment thread test/css_check.rb
# `display` is written first in the stylesheet. Reorder the two lines in the
# source and the guard goes blind.
blocky = utility.select do |rule|
rule[/\{(.*)\}/m, 1].to_s.split(";").any? { |d| d.strip =~ /\Adisplay:\s*(?:flex|block|grid)\z/ }
Two reports after 3.0.0, and what verifying them turned up.

## Status tags

The label was black on a mid-tone fill. White on its own was the wrong fix —
against the five shipped fills it lands between 2.35:1 and 3.78:1, under the
4.5:1 small text needs, which is why it went black during the review of activeadmin-plugins#49.
So the fills move down with the label. Measured against white:

  neutral  #8a909a -> #707681   3.21 -> 4.57
  ok       #8daa92 -> #5e7e63   2.53 -> 4.53
  notice   #6090db -> #3874d2   3.23 -> 4.57
  warn     #e29b20 -> #9e6c15   2.35 -> 4.56
  error    #d45f53 -> #ce483b   3.78 -> 4.55

The five fills join $skinStatusTagTextColor as variables, so the other choice
is still one line away. They were literals inside the mixin call before. The
label applies to filled tags; empty, unknown and none have no fill and keep
$skinTextMutedColor, which the table now says.

This pairing is the one thing here that has been got wrong twice — once by
shipping white on a mid-tone fill, once by darkening the fill and leaving the
label behind — and nothing was checking it. rake css now computes the ratio
for every tag rule the theme emits and fails under 4.5:1.

## Column headings

$skinTableHeaderTextColor was #5e6469, 4.93:1 against the header fill while
the rows underneath run at 10.15:1 — passing, but visibly softer than the data
it labels, which is what made it look blurry. It takes $skinTextColor now.

They also did not line up with their own columns. ActiveAdmin puts the sort
arrow inside the heading link, on the left, cleared with `padding-left: 13px`.
Cell and heading share the same 12px padding, so the cell is aligned, but the
label inside is pushed 13px right while the data below starts at the padding
edge. Measured on a block column of status tags, the shape the report came
from:

  cell left          559.9   559.9
  heading link left  571.9   571.9
  tag left           571.9   571.9
  heading TEXT left  584.9   571.9

Moving the image to the right edge is not enough: the link is `display: block`,
so the arrow would park at the far side of the column. It is a pseudo-element
now, which puts it beside the label, keeps the link full width so the whole
cell stays clickable, and lets the marker take currentColor — the stock sprite
is a fixed grey PNG that cannot follow the text into dark mode. At 0.6 opacity
it is 3.40:1 light and 4.22:1 dark against the header fill; it is the only
thing separating a sortable heading from a plain one, so WCAG 1.4.11 asks 3:1.

The unused side of the triangle has no width rather than a transparent one, so
the box is as tall as the mark in it and both sort states sit at the same
height. Keeping all four sides and nudging the ascending one with a margin put
them visibly apart, because `vertical-align: middle` centres the box and the
visible half then sits off-centre within it.

## The check that was supposed to prevent this

rake css compares the README variables table against the declarations. It was
doing so in one direction only, and loosely:

- a variable with no row in the table passed, while the success line claimed
  the table matched every declaration;
- a blank cell counted as documentation — the name entered the documented set,
  which exempted it from the undocumented check, while the mismatch check
  skipped it for having no value, so it passed on both sides;
- skipping blank cells outright then opened a narrower version of the same
  hole: one blank row and one good row for the same name, where the good row
  satisfied the lookup and the blank one never reached duplicate detection;
- a name listed twice kept the last row, so the table could agree with the
  stylesheet while a reader meets the stale row first;
- a name declared twice went unnoticed, though Sass keeps the first !default
  and drops the rest.

Every row counts towards duplicate detection now, blank or not, and a blank
cell fails on its own. Each hole was reproduced before and after. The
advertised count comes from the declarations rather than a hand-maintained
constant that said 52 while 81 variables were being compared.
@Fivell
Fivell force-pushed the status-tags-and-header-text branch from 568572b to 6128a73 Compare October 6, 2026 14:52
@Fivell
Fivell requested a balanced review from Copilot October 6, 2026 15:04

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The implementation is sound; only a non-blocking diagnostic wording correction was identified.

Review effort: Balanced
Findings: 2 Medium severity · 1 Low severity

Open (3)

@Fivell
Fivell merged commit 265412f into activeadmin-plugins:master Oct 6, 2026
2 checks passed
@Fivell Fivell mentioned this pull request Oct 6, 2026
Fivell added a commit that referenced this pull request Oct 6, 2026
Minor, not major: the variable contract only grows. Six status tag colours
join it, every default that moved is reachable through one of them, and
nothing that worked against 3.0.0 stops working.

What moved since 3.0.0:

  #57  the theme switch no longer breaks the utility nav onto two lines
  #56  status tag labels are white on darker fills, clearing 4.5:1 where the
       old pairing ran 2.35 to 3.78; column headings take the body text
       colour and line up with their own columns; the sort marker is drawn
       by the theme in currentColor instead of ActiveAdmin's grey sprite

Upgrading gains a 3.1.0 section for the two colour changes, and the 3.0.0 one
is corrected — it said two things had changed and then listed three.

Both artefacts checked: the gem carries the stylesheet and the switch script,
and npm run prepublishOnly + npm pack puts src/active_admin_theme.scss and
src/theme_toggle.js in the tarball. The npm install snippet moves to ^3.1.0.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants