Skip to content

fix(bulma-ui): apply textColor helper class on Navbar Menu, Start, End, and Burger - #792

Merged
allxsmith merged 4 commits into
mainfrom
claude/issue-757-20260927-1344
Sep 27, 2026
Merged

allxsmith merged 4 commits into
mainfrom
claude/issue-757-20260927-1344

Conversation

@bestaxbot

@bestaxbot bestaxbot commented Sep 27, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Navbar.Menu, Navbar.Start, Navbar.End and Navbar.Burger declared a textColor prop and never read it. It fell through into ...props → useBulmaClasses (which only reads color/backgroundColor) → rest, so it landed on the DOM element as a raw attribute and triggered React's "unrecognized DOM prop" warning, instead of rendering a has-text-* class.

Navbar.Brand and Navbar.Item already did this correctly (color: textColor), so this fix brings the remaining four in line with that pattern.

Changes

  • NavbarBurger, NavbarMenu, NavbarStart, NavbarEnd: destructure textColor and pass it to useBulmaClasses as color: textColor.
  • Added regression tests for each of the four components asserting the has-text-* class is applied and the raw textColor attribute is not forwarded to the DOM. Confirmed each new test fails against the pre-fix code and passes after the fix.

Test plan

  • pnpm --filter @allxsmith/bestax-bulma exec jest src/components/__tests__/Navbar.test.tsx — 85/85 pass
  • New tests confirmed to fail against pre-fix Navbar.tsx (regression reproduced), then pass after the fix
  • pnpm --filter @allxsmith/bestax-bulma run test:coverage — full suite green, coverage thresholds met
  • pnpm --filter @allxsmith/bestax-bulma run lint
  • pnpm --filter @allxsmith/bestax-bulma run typecheck / typecheck:tests
  • pnpm run format:check
  • pnpm run gen:catalog:check (no change — no component added/renamed)
  • pnpm run check:conformance (all checks pass; the sandbox's shallow clone makes version-regression report a false positive unrelated to this change — passes with --allow-untagged)
  • pnpm --filter @allxsmith/bestax-bulma run build
  • pnpm --filter @allxsmith/bestax-bulma run build-storybook

Fixes #757

Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes
    • Navbar color settings now apply text colors consistently across Brand, Burger, Menu, Start, and End. The textColor setting takes precedence; color is used when textColor is not set.
  • Documentation
    • Clarified that Navbar color applies text-color styling, not a filled color variant, and documented precedence and supported colors.

…d, and Burger

Navbar.Menu, Navbar.Start, Navbar.End and Navbar.Burger declared a textColor
prop but never passed it to useBulmaClasses, so it fell through to ...rest
and landed on the DOM element as an attribute (React warning, no
has-text-* class). Destructure textColor and pass it as color, matching
Navbar.Brand and Navbar.Item.

Fixes #757

Co-authored-by: Alex Smith <allxsmith@users.noreply.github.com>
@bestaxbot bestaxbot added the ai-loop AI-authored PR in the autonomous review/fix loop label Sep 27, 2026
@coderabbitai

coderabbitai Bot commented Sep 27, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: allxsmith/bestax/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 140fdc48-8006-468c-9b6f-98c50533e2f8

📥 Commits

Reviewing files that changed from the base of the PR and between f40a19c and ddf7f68.

📒 Files selected for processing (6)
  • bestax-mcp/data/components/Navbar.json
  • bulma-ui/src/components/Navbar.tsx
  • bulma-ui/src/components/__tests__/Navbar.test.tsx
  • docs/docs/api/components/navbar.md
  • scripts/gen-eslint-meta.mjs
  • scripts/gen-eslint-meta.test.mjs

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.


Walkthrough

Navbar components now use textColor in preference to color for text-color classes. The metadata guard now requires text-alias elements to declare bgColor.

Changes

Navbar text-color handling

Layer / File(s) Summary
Navbar color fallback and documentation
bulma-ui/src/components/Navbar.tsx, bulma-ui/src/components/__tests__/Navbar.test.tsx, docs/docs/api/components/navbar.md, bestax-mcp/data/components/Navbar.json
Navbar.Brand, Navbar.Burger, Navbar.Menu, Navbar.Start, and Navbar.End pass textColor ?? color to useBulmaClasses. Tests check helper classes, DOM-attribute omission, and precedence. Component descriptions clarify that color applies text-color classes, not a filled variant.

ESLint metadata guard

Layer / File(s) Summary
bgColor metadata validation
scripts/gen-eslint-meta.mjs, scripts/gen-eslint-meta.test.mjs
The guard reports text-alias elements that lack a declared bgColor prop. Tests check missing-property violations and include bgColor in valid fixtures.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Bug fix · Severity of issue fixed: Low

Suggested reviewers: allxsmith

Merge Risk: ⚪ Minimal · up to ddf7f

Navbar color props now produce the documented text-color styling without being forwarded as DOM attributes, and the metadata guard accepts current entries. No concrete merge-blocking risk is established; confirm the reported checks through normal CI.

Security Architecture Review

Security architecture risk: 🔵 Low · up to ddf7f

The visible changes affect presentation classes and a metadata validation guard, not application authority or data access. No security issue was established, but the available review does not cover every changed file.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The established effect of the changed Navbar props is browser presentation on those components; the inspected flow introduces no privileged operation or new trust transition.

Trust Boundaries and Controls

  • observed — The existing helper validates selected color values before producing classes, while the Navbar components consume color and textColor before spreading remaining props onto their elements.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the primary fix: applying the text-color helper class to the affected Navbar components. It is concise and related to the main code change.
Description check ✅ Passed The description explains the defect, affected components, implementation, regression tests, linked issue, and validation results. It does not reproduce every template section or checkbox, but it provi…
Linked Issues check ✅ Passed Issue #757 requires textColor support on Navbar.Menu, Navbar.Start, Navbar.End, and Navbar.Burger, with a has-text-* class and no DOM textColor attribute. Navbar.tsx now maps `textColo…
Out of Scope Changes check ✅ Passed The changes stay within issue #757. The Navbar.tsx implementation and tests fix and verify the reported behavior. The metadata and documentation changes keep generated component information consiste…
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 4 files. (2 skipped: 2 …
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://158acfc7.bestax.pages.dev

Comment thread bulma-ui/src/components/Navbar.tsx
@github-actions

github-actions Bot commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor

AI loop status: iteration 3/4 — fix-reviews at ddf7f68 (2026-09-27T16:38:35Z).
Managed by claude-pr-loop.yml. To resume after a pause: set iteration back to 0 on the first line, re-add ai-loop, remove ai-loop-paused, then re-run via workflow_dispatch.

…Menu, Start, End

The four parts fixed in the parent commit passed `color: textColor` but left the
declared `color` prop in `...props`, which is spread afterwards — so `props.color`
overwrote the key and `textColor` was discarded whenever both were set. Destructure
`color` and use `color: textColor ?? color`, the shape Card/Hero/Level already use and
the one #757 prescribed. Navbar.Brand had the same latent behaviour, so it gets the
same line.

Neither Bulma nor these components render an `is-*` modifier on .navbar-brand,
.navbar-burger, .navbar-menu, .navbar-start or .navbar-end, so `color` on these parts
only ever reached the text-color helper. Their TSDoc called it a "Bulma color modifier",
which was never true; it now describes the prop as a text-color alias, mirroring Card's
wording, and the API page is regenerated from it.
…Color

`Navbar.Brand`, `.Burger`, `.Menu`, `.Start` and `.End` do not declare `bgColor` —
unlike the root `Navbar`, `Navbar.Item` and `Navbar.Link`, which do — and their props
`Omit` `backgroundColor` from the helper set, so the clause pointing readers at
`bgColor` for a colored surface named a prop that is a type error on these five.
Dropped it rather than adding a prop these parts never had.

Regenerates the MCP index and the ESLint plugin metadata, which read the same TSDoc:
the five parts now join TEXT_ALIAS_COLOR_ELEMENTS, so `no-color-as-surface` reports
`color` on them and autofixes it to `textColor`, which is what they render.
@bestaxbot

Copy link
Copy Markdown
Collaborator Author

Fix pass 1 of 4 — recap

One open AI review thread this round (the Claude deep review's color clobbers textColor finding). I agreed with it, fixed it, and took its optional Navbar.Brand suggestion too. Nothing refuted.

Fixed

Finding Where Commit
color overwrote textColor — color was never destructured, so ...props still carried it and the later spread won over { color: textColor } Navbar.Menu, .Start, .End, .Burger — now color: textColor ?? color, the shape Card/Hero/Level already use and the one #757 prescribed e685b42
Same latent behaviour on Navbar.Brand (the reviewer's optional ask) Same one-line change — a second PR for the same defect wasn't worth it while the family was open e685b42
color's TSDoc read "Bulma color modifier", which was never true on these parts — only the root <Navbar> renders is-* (Navbar.tsx:92) Reworded as a text-color alias stating the precedence, mirroring Card's wording; API page regenerated from it e685b42
My own first wording then pointed readers at bgColor, which these five parts don't declare (unlike the root Navbar, .Item and .Link) and which their props Omit — a type error as written Dropped the clause rather than adding a prop these parts never had a93efe4

Tests

Added a precedence test per part (Brand, Burger, Menu, Start, End): render color="info" alone and assert has-text-info, then re-render with textColor="grey" and assert has-text-grey, no has-text-info, and no color attribute on the node. has-text-grey specifically, because textColor is the only one of the two that reaches the non-modifier colors. I verified all five fail against the reverted source (5 failed / 86 passed) and pass with the fix — Navbar suite now 91/91.

Worth a maintainer's eye (not changed here)

The TSDoc rewording puts these five into the ESLint plugin's generated TEXT_ALIAS_COLOR_ELEMENTS, so no-color-as-surface now reports color on them. The primary advice and the autofix (color to textColor) are correct, but that rule's message ends with a fixed "or bgColor if you wanted a coloured surface" clause, which is a type error on these five since they don't declare bgColor. Either giving them bgColor or softening that clause is a change to another package and a feat-shaped decision, so I left it for you rather than widening this PR.

Gates run

pnpm run lint (0 errors) · typecheck · typecheck:tests · test:coverage (52 suites, 1891 tests, thresholds met) · format:check · check:conformance (all checks) · gen:catalog:check · gen:mcp:check · gen:eslint-meta:check · build · build-storybook — all green, pushed as a93efe4.

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://63d7abc9.bestax.pages.dev

Comment thread eslint-plugin/src/generated/metadata.ts Outdated
Comment on lines +171 to +175
'Navbar.Brand',
'Navbar.Burger',
'Navbar.End',
'Navbar.Menu',
'Navbar.Start',

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

no-color-as-surface now tells these five to write bgColor, which none of them accepts — 🟡 Minor · API

What: joining TEXT_ALIAS_COLOR_ELEMENTS makes no-color-as-surface report color on all five parts with its ambiguous message, which ends "…or bgColor="{{value}}" if you wanted a coloured surface" (eslint-plugin/src/rules/no-color-as-surface.ts:85). That clause is unconditional. But bgColor is not a prop these five declare — which is precisely what commit a93efe4 established when it deleted the same clause from their TSDoc. Every one of the ten prior members declares it (elements/Box.tsx:36, components/Card.tsx:42, Block:28, Buttons:37, Container:40, Content:28, Delete:26, IconText:39, Image:28); these are the first that do not.

Why it matters: an author who reads the diagnostic and takes the surface branch gets the failure #757 reported. bgColor is an excess property on NavbarBrandProps/…Burger…/…Menu…/…StartEnd… — React 19's types declare no bgColor either, so TS errors — and in an untyped consumer useBulmaClasses never reads the key (helpers/useBulmaClasses.tsx:81-84 destructures backgroundColor, never bgColor), so it falls through to rest and lands on the DOM node with no has-background-* class: a dead attribute plus React's unrecognized-prop warning. Secondary effect: BACKGROUND_PROPS.some(named) (no-color-as-surface.ts:120) then treats that bogus bgColor as "a background is set explicitly" and goes silent, so following the advice also hides the report.

The rule's own header comment states the invariant this breaks — "bgColor is the one to write, and the one this comment names" — and guardViolations already enforces the mirror invariant for the autofix target (scripts/gen-eslint-meta.mjs:163-172: every text-alias element must declare textColor). Nothing enforces it for the prop the message names, so this membership change passed gen:eslint-meta:check clean.

Fix: add the missing guard so the set can only contain elements whose message is true, and settle the five either way (declare bgColor on them, or word their color TSDoc without the Text color alias marker so they stay out of the set):

   for (const element of textAlias) {
     if (!knownProps.get(element)?.has('textColor')) {
       violations.push(
         `${element} is in the text-alias set but does not declare ` +
           '`textColor`, which is what no-color-as-surface rewrites `color` ' +
           'to. Writing it would produce a prop the element does not accept.'
       );
     }
+    if (!knownProps.get(element)?.has('bgColor')) {
+      violations.push(
+        `${element} is in the text-alias set but does not declare ` +
+          '`bgColor`, which no-color-as-surface names as the way to get a ' +
+          'coloured surface. Reporting it would advise a prop the element ' +
+          'does not accept.'
+      );
+    }
   }
Evidence checked
  • Membership → report: elementOf resolves the dotted part, TEXT_ALIAS.has('Navbar.Brand') is now true, no spread and a readable primary in RENDERABLE ⇒ context.report({ messageId: 'ambiguous' }) (no-color-as-surface.ts:92-150). The autofix itself is correct — it writes textColor, which all five do declare.
  • bgColor undeclared: NavbarBrandProps extends React.HTMLAttributes<HTMLDivElement> + Omit<BulmaClassesProps, 'color' | 'backgroundColor'> (Navbar.tsx:117-135) and names only textColor/color. grep bgColor @types/react@19.2.18/index.d.ts → no matches. The regenerated API tables confirm it: Navbar.Brand/.Burger/.Menu/.Start/.End have no bgColor row, while Navbar, Navbar.Item and Navbar.Link do (docs/docs/api/components/navbar.md:500,538,551).
  • bgColor is inert at runtime: useBulmaClasses reads color, backgroundColor, colorShade, backgroundColorShade — never bgColor.
  • Gates are green as-is: pnpm gen:eslint-meta:check, pnpm gen:mcp:check, pnpm check:conformance (22/22), turbo test --filter=@allxsmith/eslint-plugin-bestax (217/217) all pass, so nothing existing catches this.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Fixed in ddf7f68 — you're right, and I'd missed that joining the set is a behaviour change at all. I only meant to stop the TSDoc claiming a filled variant; the Text color alias phrase is what gen-eslint-meta.mjs keys TEXT_ALIAS_COLOR_ELEMENTS off (line 87, TEXT_ALIAS_MARKER), so the reword quietly enrolled five parts in an opt-in rule whose message names a prop they don't have.

I checked the consequence you describe and it holds all the way through: bgColor isn't on NavbarBrandProps/…Burger…/…Menu…/…StartEnd… — they Omit<BulmaClassesProps, 'color' | 'backgroundColor'> — useBulmaClasses destructures backgroundColor and never bgColor, so an untyped consumer gets a dead DOM attribute, and then BACKGROUND_PROPS.some(named) (no-color-as-surface.ts:120) reads that same dead attribute as an explicit background and silences the report that asked for it. Advice that breaks and then hides itself is worse than no advice.

I took the second of the two settlements you offered rather than the first. Adding bgColor to the five would be a new public prop on parts that omit the background helpers deliberately — Navbar itself and Navbar.Item declare it, these don't — which is a feature, and #757 is a bug about textColor reaching the DOM. So their color TSDoc now opens "Renders has-text-<color>, exactly like textColor" instead of "Text color alias: …". Every substantive claim survives — what it renders, that there's no is-<color> rule for these parts, that textColor wins — and eslint-plugin/src/generated/metadata.ts is now byte-identical to main, so this PR changes no lint behaviour at all. I regenerated the API page and the MCP index with it.

And I added your guard, because wording is a weak place to hold an invariant — the next person to write "text color alias" into a Navbar TSDoc would re-enrol them with a diff that looks like a typo fix. guardViolations now refuses any text-alias element that doesn't declare bgColor, mirroring the textColor guard that was already there for the autofix target, with the #757 case named in the comment. All ten existing members declare it (Box.tsx:36, Card.tsx:42, Block:28, Buttons:37, Container:40, Content:28, Delete:26, IconText:39, Image:28), so it passes today — it just passes by check now rather than by luck. The node suite's aliasRows fixture gained a bgColor row and there's a new case asserting the guard fires; I confirmed it fails without the guard and that removing bgColor from Card's fixture reports exactly that one violation.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Verified fixed — the five stay out of the set, and the guard now makes that structural rather than incidental.

What I checked: TEXT_ALIAS_COLOR_ELEMENTS is back to its nine original members with no Navbar part (eslint-plugin/src/generated/metadata.ts:161), and git diff origin/main -- eslint-plugin/src/generated is empty — so no-color-as-surface reports exactly what it reported before this PR, and nobody is advised to write bgColor on an element that Omits the background helpers. The reword is what does it: all five now open "Renders `has-text-`, exactly like `textColor`" (Navbar.tsx:129, :286, :368, :428, and NavbarEnd via NavbarStartEndProps), and grep -n 'Text color alias' bulma-ui/src/components/Navbar.tsx has no match, so TEXT_ALIAS_MARKER (scripts/gen-eslint-meta.mjs:87) no longer fires on them. Every substantive claim I checked last round survives the reword — what it renders, that there is no is-<color> rule for these parts, and that textColor wins.

Why the settlement holds: picking the TSDoc branch over declaring bgColor is the right call — these parts omit the background helpers deliberately, and adding a public prop to close a lint-message gap would be a feature landing in a bug fix. The cost is a false negative on an opt-in rule for five parts, which is the direction TEXT_ALIAS_MARKER's own comment already names as the safe one ("KNOWN INCOMPLETE, and deliberately so").

On the guard: guardViolations now requires bgColor alongside textColor for every text-alias member (scripts/gen-eslint-meta.mjs:174-183), so a future "text color alias" rewording in a Navbar TSDoc fails the generator instead of quietly re-enrolling the parts. I confirmed it passes by check and not by luck: all nine current members declare bgColor in the tables the generator reads (docs/docs/api/elements/{block,box,buttons,content,delete,icontext,image}.md, components/card.md, layout/container.md).

Evidence
  • pnpm exec node --test scripts/gen-eslint-meta.test.mjs → 30/30 pass, including the new refuses a text-alias element that does not declare bgColor case; the pre-existing textColor case now pins its own message (/does not declare \textColor`/`) so the two cannot pass for each other's reason.
  • pnpm exec node scripts/gen-eslint-meta.mjs → wrote the file, guard did not throw against the real library, and git status --porcelain stayed clean ⇒ zero drift, so gen:eslint-meta:check is green.
  • pnpm exec node scripts/gen-mcp-index.mjs → clean tree too, so the regenerated bestax-mcp/data/components/Navbar.json matches the reworded TSDoc and gen:mcp:check stays green.
  • pnpm --filter @allxsmith/eslint-plugin-bestax run test → 217/217; pnpm --filter @allxsmith/bestax-bulma run test -- src/components/__tests__/Navbar.test.tsx → 91/91. (Both need bulma-ui built first — a cold checkout fails these four suites on Cannot find module '@allxsmith/bestax-bulma/constants', which is the environment, not the branch.)
  • docs/docs/api/components/navbar.md regenerated with the new wording and still carries no bgColor row for the five parts, which is now the consistent story end to end.

Surf's glassy and the set's back where it started — lint behaviour unchanged, guard on watch so it can't drift again. Nothing left open on my side, send it. 🏄

@claude claude Bot 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.

Deep review — 1 blocking · 3 advisory

# Severity Area Finding Location
1 🟡 Minor API Joining TEXT_ALIAS_COLOR_ELEMENTS makes no-color-as-surface advise bgColor on five parts that don't declare it — a TS error, or an inert DOM attribute in JS (the #757 failure). The guardViolations mirror check that would have caught it doesn't exist. eslint-plugin/src/generated/metadata.ts:171-175
2 🔵 Advisory Correctness Pagination.List and Pagination.Link carry the identical latent clobber this PR fixes: both declare color?: 'primary' | …, neither destructures it, and both pass { color: textColor, …props } — so props.color wins and textColor is discarded when both are set. Outside this diff; worth its own issue. bulma-ui/src/components/Pagination.tsx:225-235
3 🔵 Advisory Robustness On .navbar-brand / .navbar-menu / .navbar-start / .navbar-end the now-working has-text-* cannot recolour the Navbar.Item/Navbar.Link children, because Bulma declares color on those elements directly (bulma/sass/components/navbar.scss:281-283) and a declaration on the element beats an inherited !important from an ancestor. The prop is visually effective on bare text children and on Navbar.Burger (same-element !important wins there). No TSDoc claims otherwise — it says "renders has-text-<color>", which is exactly what it does — so this is a limitation for the record, not a false statement. bulma-ui/src/components/Navbar.tsx:396
4 🔵 Advisory API The generated set's own doc comment warns it is non-exhaustive but says nothing about which props its consumers may name; the bgColor half of the rule's message was true only by construction until this change. Noted so finding 1 is fixed at the guard, not just at these five names. eslint-plugin/src/generated/metadata.ts:161

Overall: The core fix is right and well-tested — all five parts now read textColor, textColor ?? color matches the Card/Hero/Level shape #757 prescribed, and the five precedence tests probe with grey, which sits outside the 6-value color union and so cannot pass by accident. The riskiest part is not Navbar.tsx at all but the third commit's second-order effect: rewording the TSDoc to the marker phrase silently enrolled these five in an ESLint rule whose diagnostic names a prop they do not have, and the generator's guards check the autofix target (textColor) without checking the prop the message advises (bgColor). Look at finding 1 first, and prefer the guard in scripts/gen-eslint-meta.mjs over a one-off edit to the five names, since the next component to adopt the phrase will hit the same hole.

Residual risk:

  • Declared-but-unread helper prop elsewhere in Navbar.tsx — refuted. All 33 textColor occurrences in the file account for: root :85, Brand :154, Item :249, Burger :322, Menu :396, Start :453, End :485, Link :601. Every part that declares it now reads it; none is left to reach rest.
  • The { color: X, ...props } clobber elsewhere in Navbar.tsx — refuted. Every part declaring a public color now destructures it (:150, :318, :391, :447, :479), the root consumes color for is-${color} (:74, :91), and Navbar.Item/Navbar.Link type it color?: never (:187, :517) so props cannot carry one.
  • Navbar.Dropdown / .DropdownMenu / .Divider spread ...props raw with no useBulmaClasses — refuted as this failure class. Their props extend only React.HTMLAttributes, declaring no helper props, so there is no declared-but-unread prop to leak.
  • textColor={undefined} or null silently falling back to color — accepted. That is ??'s defined behaviour and the same contract Card/Hero ship; no-color-as-surface already reasons about exactly this case (no-color-as-surface.ts:104-113).
  • colorShade applying to the wrong prop — refuted. useBulmaClasses shades whichever value arrives in the single color slot, so the shade follows the winner of textColor ?? color with no second code path.
  • Open: finding 1 (the rule's bgColor advice) and advisory 2 (the same clobber in Pagination).
  • Empirical basis: Navbar.test.tsx 91/91; full bulma-ui suite 4246/4246 with the 99% coverage gate green; eslint-plugin 217/217 via turbo (a bare pnpm --filter … test fails on an unbuilt @allxsmith/bestax-bulma/constants — environment, not this PR); gen:eslint-meta:check, gen:mcp:check and check:conformance (22/22) all clean. I did not re-revert the source to reproduce the pre-fix test failures the PR body claims; the has-text-grey probe makes them true by construction, since no value of color can produce that class.

🏄 Clean little set, bro — the barrel got fixed properly and the tests are pinned with a grey that can't fake it. Only thing is the lint rule's now yelling "go paddle to bgColor" at a break that has no such wave; patch that guard and this one's all-time.

no-color-as-surface's `ambiguous` message ends "…or bgColor="…" if you
wanted a coloured surface", unconditionally. Navbar.Brand, .Burger, .Menu,
.Start and .End Omit the background props, so an author taking that branch
writes a prop that type-errors, renders nothing, and — because
BACKGROUND_PROPS treats it as an explicit background — silences the report
that suggested it.

Their `color` TSDoc no longer opens with the `Text color alias` marker
gen-eslint-meta.mjs keys the set off, so metadata.ts returns to its
pre-PR contents and the rule's behaviour is unchanged by this PR. The
wording still says what `color` renders, that there is no is-<color> rule
for these parts, and that textColor wins.

Wording alone is luck, so guardViolations now also refuses a text-alias
element that does not declare `bgColor` — the mirror of the `textColor`
guard already there for the autofix target.
@bestaxbot

Copy link
Copy Markdown
Collaborator Author

Iteration 2 recap

One unresolved thread this pass — the deep review's finding on eslint-plugin/src/generated/metadata.ts. I fixed it, and it was a real one that I'd introduced myself in iteration 1.

The short version: last pass I reworded the five Navbar parts' color TSDoc to stop it claiming a filled variant, and opened the new text with "Text color alias: …". That phrase is exactly what gen-eslint-meta.mjs keys TEXT_ALIAS_COLOR_ELEMENTS off (TEXT_ALIAS_MARKER, line 87), so a doc fix quietly enrolled five components in the opt-in no-color-as-surface rule. That rule's ambiguous message ends "…or bgColor="…" if you wanted a coloured surface" with no condition attached — and these five Omit the background props, so anyone taking that branch writes a prop that type-errors, renders nothing, and then gets read back by BACKGROUND_PROPS.some(named) as an explicit background, silencing the very report that suggested it.

Finding Action
no-color-as-surface now tells these five to write bgColor, which none of them accepts (claude) Fixed in ddf7f68

What I changed. The reviewer offered two settlements and I took the second. Declaring bgColor on the five would be a new public prop on parts that omit the background helpers on purpose — Navbar itself and Navbar.Item declare it, these deliberately don't — and that's a feature, while #757 is a bug about textColor reaching the DOM. So their color TSDoc now opens "Renders has-text-<color>, exactly like textColor" instead of "Text color alias: …". Every substantive claim survives: what it renders, that there's no is-<color> rule for these parts, that textColor wins when both are set. eslint-plugin/src/generated/metadata.ts is back to being byte-identical to main, so this PR now changes no lint behaviour at all.

I also added the guard the reviewer asked for, because leaving the invariant resting on wording is luck — the next person to write "text color alias" into a Navbar TSDoc would re-enrol them with a diff that looks like a typo fix. guardViolations now refuses any text-alias element that doesn't declare bgColor, mirroring the textColor guard already there for the autofix target. All ten existing members declare it, so it passes today; it just passes by check now rather than by coincidence. The node fixture gained a bgColor row and there's a new case pinning the guard.

Nothing was refuted this pass.

Gates run locally, all green: lint, typecheck, typecheck:tests, test:coverage (52 suites / 1891 tests, thresholds met), node --test scripts/*.test.mjs (1016 tests), format:check, check:conformance (22/22), gen:catalog:check, gen:mcp:check, gen:eslint-meta:check, pnpm --filter @allxsmith/bestax-bulma run build, and build-storybook.

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://074c5b51.bestax.pages.dev

@bestaxbot

Copy link
Copy Markdown
Collaborator Author

Iteration 3 recap — no changes needed

I went through the review threads again and there is genuinely nothing left to act on this pass, so I pushed no commits.

Thread state

Thread Status
color still clobbers textColor (Navbar.tsx) Fixed in e685b42 and verified + resolved by the deep reviewer in iteration 1
no-color-as-surface would advise bgColor (eslint-plugin metadata) Fixed in ddf7f68 and verified by the deep reviewer in iteration 2 — its closing comment is a pass ("the set is back where it started — lint behaviour unchanged, guard on watch"), not a new finding. Left open for the reviewer to resolve, since the deep reviewer owns resolving its own threads.

No CodeRabbit or Copilot threads are open, and no new review has landed since ddf7f68.

What I re-verified before concluding that

Rather than take the thread history on trust, I checked that the two fixes are still actually present at HEAD:

  • All five parts pass color: textColor ?? color — Navbar.tsx:154 (Brand), :322 (Burger), :396 (Menu), :453 (Start), :485 (End).
  • grep "Text color alias" bulma-ui/src/components/Navbar.tsx has no match, so TEXT_ALIAS_MARKER in scripts/gen-eslint-meta.mjs does not enrol these parts.
  • git diff origin/main -- eslint-plugin/src/generated is empty, so this PR still changes no lint behaviour.

Gates

I ran no local gates and made no commits, because the tree is clean and identical to ddf7f68. The gates that matter already ran on that exact sha in CI and are all green: Build and Test, React 18 compatibility, React 19 compatibility, Build preview site, CodeQL, Dependency Review, Socket Security. Re-running them locally against an unchanged tree would tell us nothing new, and a cosmetic commit to look busy would just restart CI for no reason.

This one looks done to me — the remaining thread is open only because the deep reviewer has not clicked resolve on its own verified finding.

@bestaxbot

Copy link
Copy Markdown
Collaborator Author

🏄 Rode most of the wave, but 1 thread(s) are contested — gonna need a meat sack to call it. I pushed no code for those: they're refuted-but-open, and I already said my piece (see my recap above). Silicon's done arguing.

@allxsmith, time for a carbon-based referee — squint at the threads with those little eyeballs and make the call. The loop never merges; 'having opinions about trade-offs' is apparently still a wetware perk. 🤙

@github-actions github-actions Bot added needs-human-review Loop converged (or contested): awaiting owner review + manual merge and removed ai-loop AI-authored PR in the autonomous review/fix loop labels Sep 27, 2026
@github-actions
github-actions Bot requested a review from allxsmith September 27, 2026 16:40
@github-actions

Copy link
Copy Markdown
Contributor

📸 Story screenshots at handoff — ddf7f68

6 stories (light + dark) from this PR's changed files under bulma-ui/src/ (workflow run · artifact story-screenshots-pr-792, 30-day retention).

components-navbar--default · Components/Navbar · Default
Light Dark
components-navbar--default light components-navbar--default dark
components-navbar--brand-only · Components/Navbar · Brand Only
Light Dark
components-navbar--brand-only light components-navbar--brand-only dark
components-navbar--burger-only · Components/Navbar · Burger Only
Light Dark
components-navbar--burger-only light components-navbar--burger-only dark
components-navbar--burger-active · Components/Navbar · Burger Active
Light Dark
components-navbar--burger-active light components-navbar--burger-active dark
components-navbar--menu-start-end · Components/Navbar · Menu Start End
Light Dark
components-navbar--menu-start-end light components-navbar--menu-start-end dark
components-navbar--items-nav-links-and-dropdown · Components/Navbar · Items Nav Links And Dropdown
Light Dark
components-navbar--items-nav-links-and-dropdown light components-navbar--items-nav-links-and-dropdown dark
> ✂ 22 more matched stories skipped by the cap: `components-navbar--transparent`, `components-navbar--fixed-top`, `components-navbar--dropdown`, `components-navbar--dropdown-right`, `components-navbar--dropup`, `components-navbar--dropdown-no-arrow`, `components-navbar--active-dropdown-item`, `components-navbar--dropdown-with-divider`, `components-navbar--keyboard-accessible-dropdown`, `components-navbar--primary`, … — full set in the artifact.

github-actions Bot added a commit that referenced this pull request Sep 27, 2026
@bestaxbot

Copy link
Copy Markdown
Collaborator Author

Thanks for the approve. Your review came through with an empty body, so I read it as a plain sign-off rather than a change request — nothing pushed.

State as of ddf7f68: all required checks green (Build and Test, React 18/19 matrix, CodeQL, Dependency Review, docs preview), MERGEABLE, and both deep-review threads are answered and verified fixed. I never merge, so it is yours to squash when you are ready.

One thing worth carrying forward, from advisory 2 of the deep review — I confirmed it against the source just now rather than taking it on trust. Pagination.List and Pagination.Link have the exact defect this PR fixed: both declare color (bulma-ui/src/components/Pagination.tsx:211, :261), neither destructures it (:225-231, :281-290), and both pass { color: textColor, backgroundColor: bgColor, ...props } — so props.color overwrites the key and textColor is silently discarded whenever both are set. Milder than #757 was, since useBulmaClasses still consumes color and nothing leaks to the DOM; the prop just loses. Out of scope here — say the word and I will open an issue for it.

@allxsmith
allxsmith merged commit feb83c8 into main Sep 27, 2026
23 checks passed
@allxsmith
allxsmith deleted the claude/issue-757-20260927-1344 branch September 27, 2026 17:04
bestax-release-bot Bot pushed a commit that referenced this pull request Sep 27, 2026
## [5.16.11](https://github.com/allxsmith/bestax/compare/@allxsmith/bestax-bulma@5.16.10...@allxsmith/bestax-bulma@5.16.11) (2026-09-27)

### Bug Fixes

* **bulma-ui:** apply textColor helper class on Navbar Menu, Start, End, and Burger ([#792](#792)) ([feb83c8](feb83c8))
* **bulma-ui:** avoid empty class attribute on several components ([#793](#793)) ([7c5c316](7c5c316))
* **bulma-ui:** merge className into Navbar.Divider instead of overwriting it ([#791](#791)) ([fcc0d51](fcc0d51))
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 5.16.11 🎉

The release is available on:

Your semantic-release bot 📦🚀

allxsmith added a commit that referenced this pull request Sep 27, 2026
…nge left stale

The comment above the navbar parts still said Menu, Start and End keep
their text color as a class, which stopped being true with #792. And
Dropdown.Divider sat in bloomer's helperless list as well as its
class-hostile one, where the first match wins, so that row never applied.
bestax-release-bot Bot pushed a commit that referenced this pull request Sep 27, 2026
# [2.13.0](https://github.com/allxsmith/bestax/compare/bestax-migrate@2.12.0...bestax-migrate@2.13.0) (2026-09-27)

### Bug Fixes

* **bulma-ui:** apply textColor helper class on Navbar Menu, Start, End, and Burger ([#792](#792)) ([feb83c8](feb83c8))
* **bulma-ui:** avoid empty class attribute on several components ([#793](#793)) ([7c5c316](7c5c316))
* **bulma-ui:** merge className into Navbar.Divider instead of overwriting it ([#791](#791)) ([fcc0d51](fcc0d51))

### Features

* **bestax-migrate:** convert navbar dividers with classes, and navbar text colors ([#796](#796)) ([c97c7e9](c97c7e9))
* **bulma-ui:** let Card.Header.Title and Card.FooterItem render Bulma's own tags ([#794](#794)) ([47ecdb6](47ecdb6))
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 2.13.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

bestax-release-bot Bot pushed a commit that referenced this pull request Sep 27, 2026
# [1.7.0](https://github.com/allxsmith/bestax/compare/bestax-mcp@1.6.0...bestax-mcp@1.7.0) (2026-09-27)

### Bug Fixes

* **bestax-mcp:** give .image's ratios their reason in the lookup ([3ea4d0c](3ea4d0c))
* **bestax-migrate:** say why .image's ratios stay classes ([2fbfbd5](2fbfbd5))
* **bulma-ui:** apply textColor helper class on Navbar Menu, Start, End, and Burger ([#792](#792)) ([feb83c8](feb83c8))
* **bulma-ui:** avoid empty class attribute on several components ([#793](#793)) ([7c5c316](7c5c316))
* **bulma-ui:** keep menuitemcheckbox and menuitemradio items in Dropdown's arrow-key order ([#786](#786)) ([064155a](064155a))
* **bulma-ui:** merge className into Navbar.Divider instead of overwriting it ([#791](#791)) ([fcc0d51](fcc0d51))
* **bulma-ui:** render the four burger spans Bulma v1 positions ([#785](#785)) ([8e4e1e6](8e4e1e6))
* **bulma-ui:** stop shipping test-only exports, and document notification() ([#781](#781)) ([5f95398](5f95398))
* **eslint-plugin:** report .image with the message for a class the codemod converts ([d27c19b](d27c19b))

### Features

* **bestax-mcp:** look up .image as Image, with the props it takes from its <img> ([3e63230](3e63230))
* **bestax-migrate:** convert an .image and its <img> to Image ([d4f3673](d4f3673)), closes [#793](#793)
* **bestax-migrate:** convert conditional classes in clsx and classnames calls ([8948cce](8948cce))
* **bestax-migrate:** convert navbar dividers with classes, and navbar text colors ([#796](#796)) ([c97c7e9](c97c7e9))
* **bulma-ui:** let Card.Header.Title and Card.FooterItem render Bulma's own tags ([#794](#794)) ([47ecdb6](47ecdb6))
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 1.7.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

bestax-release-bot Bot pushed a commit that referenced this pull request Sep 27, 2026
## [1.1.4](https://github.com/allxsmith/bestax/compare/@allxsmith/eslint-plugin-bestax@1.1.3...@allxsmith/eslint-plugin-bestax@1.1.4) (2026-09-27)

### Bug Fixes

* **bestax-mcp:** give .image's ratios their reason in the lookup ([3ea4d0c](3ea4d0c))
* **bestax-migrate:** say why .image's ratios stay classes ([2fbfbd5](2fbfbd5))
* **bulma-ui:** apply textColor helper class on Navbar Menu, Start, End, and Burger ([#792](#792)) ([feb83c8](feb83c8))
* **bulma-ui:** avoid empty class attribute on several components ([#793](#793)) ([7c5c316](7c5c316))
* **bulma-ui:** keep menuitemcheckbox and menuitemradio items in Dropdown's arrow-key order ([#786](#786)) ([064155a](064155a))
* **bulma-ui:** merge className into Navbar.Divider instead of overwriting it ([#791](#791)) ([fcc0d51](fcc0d51))
* **bulma-ui:** render the four burger spans Bulma v1 positions ([#785](#785)) ([8e4e1e6](8e4e1e6))
* **bulma-ui:** stop shipping test-only exports, and document notification() ([#781](#781)) ([5f95398](5f95398))
* **eslint-plugin:** report .image with the message for a class the codemod converts ([d27c19b](d27c19b))

### Features

* **bestax-mcp:** look up .image as Image, with the props it takes from its <img> ([3e63230](3e63230))
* **bestax-migrate:** convert an .image and its <img> to Image ([d4f3673](d4f3673)), closes [#793](#793)
* **bestax-migrate:** convert conditional classes in clsx and classnames calls ([8948cce](8948cce))
* **bestax-migrate:** convert navbar dividers with classes, and navbar text colors ([#796](#796)) ([c97c7e9](c97c7e9))
* **bulma-ui:** let Card.Header.Title and Card.FooterItem render Bulma's own tags ([#794](#794)) ([47ecdb6](47ecdb6))
bestax-release-bot Bot pushed a commit that referenced this pull request Oct 8, 2026
## [4.2.13](https://github.com/allxsmith/bestax/compare/create-bestax@4.2.12...create-bestax@4.2.13) (2026-10-08)

### Bug Fixes

* **bestax-mcp:** give .image's ratios their reason in the lookup ([3ea4d0c](3ea4d0c))
* **bestax-mcp:** say an .image converts around elements written out, not an expression ([49bb27b](49bb27b))
* **bestax-migrate:** convert an .image around its children only when they're elements ([ff99907](ff99907))
* **bestax-migrate:** flag react-bulma-components Pagination's delta={0} rather than renaming it ([e339ff1](e339ff1))
* **bestax-migrate:** keep a .menu-list around a bestax Menu.List as markup ([2119c3f](2119c3f))
* **bestax-migrate:** keep a Modal part as markup inside an existing bestax Modal ([cfd5f15](cfd5f15))
* **bestax-migrate:** keep a named anchor as markup instead of saying its name does nothing ([74dc360](74dc360)), closes [#fragment](https://github.com/allxsmith/bestax/issues/fragment)
* **bestax-migrate:** keep a page link as markup when its li is a component's only child ([0e72683](0e72683))
* **bestax-migrate:** know a bestax part imported under its flat export ([7a325ee](7a325ee))
* **bestax-migrate:** leave a wrapper tag alone when none of its classes would become a prop ([2397b9d](2397b9d))
* **bestax-migrate:** leave a wrapper tag with no helper class alone, TODOs and all ([1167a29](1167a29))
* **bestax-migrate:** map react-bulma-components Pagination onto the props it now renders from ([6cd4b51](6cd4b51))
* **bestax-migrate:** rename rbx innerRef to ref on a plain Navbar.Item too ([bb6ace0](bb6ace0)), closes [#734](#734)
* **bestax-migrate:** say why .image's ratios stay classes ([2fbfbd5](2fbfbd5))
* **bestax-migrate:** write a File text with a backslash as a string ([212831e](212831e))
* **bestax-migrate:** write a tabIndex string as a number on every root ([546bf8a](546bf8a)), closes [#814](#814)
* **bestax-migrate:** write isFullwidth from react-bulma-components too ([01da047](01da047))
* **bestax-migrate:** write isFullwidth rather than its deprecated alias from bloomer ([c2a1d22](c2a1d22)), closes [#680](#680)
* **bulma-ui:** announce polite notifications through a status region kept from mount ([#835](#835)) ([c93478d](c93478d))
* **bulma-ui:** answer the granularity review on native input and blur ([7a17486](7a17486))
* **bulma-ui:** apply textColor helper class on Navbar Menu, Start, End, and Burger ([#792](#792)) ([feb83c8](feb83c8))
* **bulma-ui:** attach useFocusTrap to a container that mounts after it turns on ([17a944d](17a944d))
* **bulma-ui:** avoid empty class attribute on several components ([#793](#793)) ([7c5c316](7c5c316))
* **bulma-ui:** bring File and Taginput under the bare-Control Field rule ([cdaa6c2](cdaa6c2))
* **bulma-ui:** clear a picker's unused seed whenever its popover closes ([cbe86c5](cbe86c5))
* **bulma-ui:** close a picker's popover on Alt+ArrowUp from inside it ([b6da4ef](b6da4ef))
* **bulma-ui:** color the calendar from the color prop and read TimeInput's wheel variables ([2251e67](2251e67)), closes [#832](#832)
* **bulma-ui:** color TimeInput's wheels from the color prop ([#832](#832)) ([ad370c9](ad370c9))
* **bulma-ui:** commit nothing when a picker popover is dismissed ([0a46209](0a46209))
* **bulma-ui:** commit nothing when Enter confirms untouched picker text ([773e146](773e146))
* **bulma-ui:** commit nothing when focus leaves a picker untouched ([30b4849](30b4849))
* **bulma-ui:** document the checkbox, radio and switch color and size tuples ([bd39ff3](bd39ff3))
* **bulma-ui:** draw the time wheel focus ring where the wheel's mask shows it ([e1d8c9f](e1d8c9f)), closes [#832](#832)
* **bulma-ui:** drop the openOnFocus TSDoc reason that only holds for segments ([efde0d9](efde0d9))
* **bulma-ui:** Dropdown items withhold attributes by tag and answer Enter and Space ([#827](#827)) ([f6aeb2d](f6aeb2d))
* **bulma-ui:** fall back when useFocusTrap's initialFocusRef can't take focus ([c191931](c191931))
* **bulma-ui:** fire the pickers' onOpen and onClose once under StrictMode ([#896](#896)) ([20b51ed](20b51ed))
* **bulma-ui:** give the calendar's day grid rows of a week ([971a196](971a196)), closes [#774](#774)
* **bulma-ui:** give the selected calendar cell a ring that shows on its fill ([b3eecc6](b3eecc6))
* **bulma-ui:** hide a picker's launcher for a loading Control it sits in ([9a3888e](9a3888e))
* **bulma-ui:** hide a picker's launcher only for the spinner it draws ([7a28a0e](7a28a0e))
* **bulma-ui:** hold Portal to looking a selector up on each render ([8fe02ce](8fe02ce))
* **bulma-ui:** hold the year-1 floor under a max before it ([4f6eb18](4f6eb18))
* **bulma-ui:** judge image map areas by their image in useFocusTrap ([af7bc59](af7bc59))
* **bulma-ui:** keep a range's end while the start's digits are coming ([8d1f862](8d1f862))
* **bulma-ui:** keep a read-only date or time picker closed on ArrowDown ([ba74bf7](ba74bf7))
* **bulma-ui:** keep a tab stop in the year list when the year falls outside it ([fe028c1](fe028c1))
* **bulma-ui:** keep an empty picker's seed while a portaled popover is open ([1e66528](1e66528))
* **bulma-ui:** keep an inline date picker's calendar on its released id ([c26da07](c26da07)), closes [#897](#897) [#897](#897)
* **bulma-ui:** keep button defaults through a spread, and type the buttons that had none ([#853](#853)) ([0810482](0810482))
* **bulma-ui:** keep button types and Avatar's accessible name through a spread ([#826](#826)) ([dc798d4](dc798d4))
* **bulma-ui:** keep menuitemcheckbox and menuitemradio items in Dropdown's arrow-key order ([#786](#786)) ([064155a](064155a))
* **bulma-ui:** keep Numberinput's buttons in a row inside Field > Control ([4dff84c](4dff84c))
* **bulma-ui:** keep Numberinput's Field examples in a row and labelled ([c937c88](c937c88))
* **bulma-ui:** keep radiusless zeroing the radius inside a Theme ([07db6a3](07db6a3)), closes [#829](#829) [#694](#694)
* **bulma-ui:** keep the calendar behind DateTimeInput's time wheels out of reach ([c7f674c](c7f674c))
* **bulma-ui:** keep the clock's seconds out of a picked date and time ([0af2e71](0af2e71))
* **bulma-ui:** keep the Field for horizontal and fieldClassName in a bare Control ([e4dc513](e4dc513))
* **bulma-ui:** keep the picker focus rings visible in every color ([612aa09](612aa09))
* **bulma-ui:** keep the range band under the pointer in the calendar ([c1f2008](c1f2008))
* **bulma-ui:** key the Avatar link warning on the element and attributes ([e628eba](e628eba)), closes [#733](#733) [#733](#733)
* **bulma-ui:** key the Control-level warning by its advice ([24cda3d](24cda3d))
* **bulma-ui:** leave keys on a control inside a tab to that control ([4a9f7b6](4a9f7b6))
* **bulma-ui:** leave rel out of the Avatar link attribute warning ([b059476](b059476)), closes [#733](#733) [#733](#733)
* **bulma-ui:** let Autocomplete's clear button give way to a loading spinner ([5c11fb2](5c11fb2))
* **bulma-ui:** let Escape in a popover's year dropdown go back to the grid ([a8b1dbf](a8b1dbf)), closes [#901](#901)
* **bulma-ui:** let File's picked-files count be reworded, and document its name in the label ([e86545c](e86545c))
* **bulma-ui:** let focus follow the keys in an inline calendar, and skip disabled days for the tab stop ([#885](#885)) ([f55af27](f55af27))
* **bulma-ui:** let several isRoot Themes share the :root style element ([04f399f](04f399f)), closes [#736](#736)
* **bulma-ui:** let the arrow keys move through the calendar's year dropdown ([6abc329](6abc329)), closes [#901](#901)
* **bulma-ui:** let the picker bases give way to a loading Control too ([66e803a](66e803a))
* **bulma-ui:** let useFocusTrap go of a container that leaves while it is on ([8c56d7a](8c56d7a))
* **bulma-ui:** let warnOnce decide when the Avatar link warning fires ([1a5965c](1a5965c)), closes [#733](#733)
* **bulma-ui:** make ArrowUp raise a time wheel's value ([c27c310](c27c310))
* **bulma-ui:** make auto leave room for an in-place picker panel's themed offset ([8c534bd](8c534bd)), closes [#904](#904)
* **bulma-ui:** make Tabs keyboard operable with the WAI-ARIA tabs pattern ([fe0e7ef](fe0e7ef))
* **bulma-ui:** make Theme colorMode switch the scheme under the prefixed builds ([#894](#894)) ([2bd6ec2](2bd6ec2))
* **bulma-ui:** make Theme's radius the helper it is typed as ([36c73d3](36c73d3)), closes [#694](#694)
* **bulma-ui:** make useFocusTrap follow radio groups and initialFocusRef past the trap ([d6219d4](d6219d4))
* **bulma-ui:** match a picker's opening focus only inside its calendar ([e3c22ed](e3c22ed))
* **bulma-ui:** merge className into Navbar.Divider instead of overwriting it ([#791](#791)) ([fcc0d51](fcc0d51))
* **bulma-ui:** move focus into DateTimeInput's time wheels as they open ([adfa9db](adfa9db))
* **bulma-ui:** move the year dropdown's tab stop with the arrow keys ([f56daf5](f56daf5))
* **bulma-ui:** name a picker's default icon when its icon size or column moves ([6f6de39](6f6de39))
* **bulma-ui:** name custom elements among the targets that get Avatar's target and rel ([a962259](a962259)), closes [#733](#733)
* **bulma-ui:** name DateRangeInput's default icon in its Control-level warning ([15cbbb8](15cbbb8)), closes [#952](#952)
* **bulma-ui:** name DateRangeInput's default icon in its Control-level warning ([9cbe7ca](9cbe7ca)), closes [#952](#952)
* **bulma-ui:** name Pagination's page links, and read a count that's no number as its default ([0a1cf06](0a1cf06))
* **bulma-ui:** open DateRangeInput's popover on Alt+ArrowDown, as the other pickers ([c0e22ec](c0e22ec))
* **bulma-ui:** open the date and time popovers on Alt+ArrowDown ([6db22cc](6db22cc))
* **bulma-ui:** order the Tabs fallback stop by index and style disabled tabs ([eefd283](eefd283))
* **bulma-ui:** pick a DateInput day at midnight by key as by click ([92c27ca](92c27ca))
* **bulma-ui:** place a portaled picker panel by its coordinates alone ([#886](#886)) ([040299b](040299b))
* **bulma-ui:** place toasts and notifications at the position they were shown with ([#834](#834)) ([62feab9](62feab9))
* **bulma-ui:** prefix the is-current and is-disabled classes on Pagination's parts ([c9a5fae](c9a5fae))
* **bulma-ui:** reach Taginput's delete buttons and Autocomplete's clear button ([21a064b](21a064b))
* **bulma-ui:** read a Pagination current page that's no number as the first ([68e963b](68e963b))
* **bulma-ui:** read clicks and focus inside a shadow root ([474f2cc](474f2cc))
* **bulma-ui:** read picker bounds and months in years 0 to 99 as written ([#890](#890)) ([02fb619](02fb619))
* **bulma-ui:** render the four burger spans Bulma v1 positions ([#785](#785)) ([8e4e1e6](8e4e1e6))
* **bulma-ui:** restore a portaled Modal's focus to an opener in a shadow root ([c564bd3](c564bd3))
* **bulma-ui:** return focus to the input when a date picker closes ([b741264](b741264))
* **bulma-ui:** say a picked DateTimeInput day keeps milliseconds and meets the bounds ([3536467](3536467))
* **bulma-ui:** say Tab reaches DateRangeInput's end input only when typing ([d2d3d1a](d2d3d1a))
* **bulma-ui:** say where Numberinput goes bare and test bare={false} in a Field ([0461631](0461631))
* **bulma-ui:** send a press on DateRangeInput's field to the nearer input ([f06b2b0](f06b2b0))
* **bulma-ui:** settle Popover's deep review findings ([feadaf4](feadaf4))
* **bulma-ui:** show the picked file with File's hasName and add a keyboard focus ring ([7881db4](7881db4))
* **bulma-ui:** show toasts, notifications and dialogs raised before their container mounts ([#828](#828)) ([2ab4493](2ab4493))
* **bulma-ui:** skip the Avatar target warning on elements with their own target ([27b58f4](27b58f4)), closes [#733](#733)
* **bulma-ui:** start a date picker's focus on the focused cell ([#897](#897)) ([6a55714](6a55714))
* **bulma-ui:** stop Bulma's spinners under reduced motion in every stylesheet ([b234712](b234712)), closes [#770](#770)
* **bulma-ui:** stop form wrappers nesting a Field in a bare Control ([2c6d295](2c6d295))
* **bulma-ui:** stop shipping test-only exports, and document notification() ([#781](#781)) ([5f95398](5f95398))
* **bulma-ui:** stop the date pickers at year 1 ([853142a](853142a))
* **bulma-ui:** stop the indeterminate progress bar and skeleton pulse under reduced motion ([bcf5407](bcf5407))
* **bulma-ui:** stop the Rate pop and DateTimeInput scrim under reduced motion ([3a59129](3a59129))
* **bulma-ui:** stop TimeInput reopening on the focus its popover hands back ([1c87c15](1c87c15))
* **bulma-ui:** strip the Avatar link warning from production builds ([a243fa5](a243fa5)), closes [#733](#733)
* **bulma-ui:** warn about a dropped Avatar href only for an as the caller wrote ([c93b27c](c93b27c)), closes [#733](#733)
* **bulma-ui:** warn in development when Avatar drops an href on a non-link as ([c76e632](c76e632)), closes [#733](#733)
* **bulma-ui:** warn when a root Theme drops its className and helpers ([05c10e0](05c10e0))
* **bulma-ui:** warn when a wrapper inside a Control drops its Control-level props ([cbf434b](cbf434b)), closes [#921](#921)
* **bulma-ui:** warn when an inline picker drops its Control-level props ([f0494bd](f0494bd)), closes [#921](#921)
* **bulma-ui:** warn when Avatar drops a target or rel on a non-link as ([50c385e](50c385e)), closes [#733](#733) [#733](#733)
* **create-bestax:** check the react ranges fit the library's peers, not equal them ([8ae5a0c](8ae5a0c)), closes [#950](#950)
* **create-bestax:** import the icon CSS for every Bulma flavor, not only complete ([a712b91](a712b91)), closes [#946](#946)
* **create-bestax:** install react and react-dom so Yarn 1 reports no unmet peers ([9c9814c](9c9814c)), closes [#644](#644) [#950](#950)
* **create-bestax:** name the files the overwrite prompt removes, and stop on a file path ([39b6232](39b6232)), closes [#945](#945)
* **create-bestax:** never empty a non-empty folder under -y, and validate flags first ([917f195](917f195)), closes [#950](#950) [#945](#945) [#950](#950)
* **create-bestax:** warn when the icon CSS import has nowhere to go ([f7f0b64](f7f0b64)), closes [#946](#946) [#946](#946)
* **eslint-plugin:** judge Columns' gap by its own steps, and lengths as lengths ([4786c8d](4786c8d))
* **eslint-plugin:** report .file as a class the codemod converts ([72a32c9](72a32c9))
* **eslint-plugin:** report .image with the message for a class the codemod converts ([d27c19b](d27c19b))
* **eslint-plugin:** report .menu, .menu-label and .menu-list with the converts message ([8ffaccc](8ffaccc))
* **eslint-plugin:** report .select and .breadcrumb as converted ([a9d8082](a9d8082))
* **eslint-plugin:** report Bulma form markup as classes the codemod converts ([128e832](128e832))
* **eslint-plugin:** report Bulma skeletons as converted ([04ca4ee](04ca4ee))
* **eslint-plugin:** report Modal's parts with the message for a class the codemod converts ([87f3c08](87f3c08))
* **eslint-plugin:** report Pagination's converting parts with the converts message ([6b94f14](6b94f14))
* **eslint-plugin:** report the pagination links and ellipsis as classes the codemod converts ([54ba0b3](54ba0b3))
* **eslint-plugin:** report Theme's deprecated radius route accurately ([5605816](5605816)), closes [#694](#694)
* **eslint-plugin:** suggest radiusless for a near miss on Theme ([21aa9a7](21aa9a7)), closes [#694](#694)

### Features

* **bestax-mcp:** look up .image as Image, with the props it takes from its <img> ([3e63230](3e63230))
* **bestax-mcp:** look up .menu and its label and list as Menu's parts ([f9fe7cd](f9fe7cd))
* **bestax-mcp:** look up Card's title and footer items on the tags their as takes ([ba8193e](ba8193e))
* **bestax-mcp:** look up Modal's parts as components ([b71583a](b71583a))
* **bestax-mcp:** look up Pagination, its list and its previous and next links as components ([f1298df](f1298df))
* **bestax-mcp:** look up the bestax component and props for a Bulma class string ([4a4b246](4a4b246)), closes [#744](#744)
* **bestax-mcp:** publish to the official MCP Registry ([74efc7f](74efc7f))
* **bestax-mcp:** say a Bulma field wraps its children only when horizontal ([929bc82](929bc82))
* **bestax-mcp:** say an .image converts around anything but a bare <img> ([60e9219](60e9219))
* **bestax-mcp:** say Menu.List renders .menu-list only at the top level ([dcce74f](dcce74f))
* **bestax-mcp:** say when a component renders the children from a count ([b60c295](b60c295))
* **bestax-mcp:** say when a component renders the element inside it ([4ced25c](4ced25c))
* **bestax-mcp:** say when a component renders the li around its element, or its own text ([8fd3faf](8fd3faf))
* **bestax-mcp:** say when a component renders the whole .file tree from props ([976d8a3](976d8a3))
* **bestax-migrate:** convert .file inside a Field, building its tree from props ([724dff5](724dff5)), closes [#809](#809)
* **bestax-migrate:** convert .icon-text, building its icons from props ([#823](#823)) ([933868f](933868f))
* **bestax-migrate:** convert .menu, its labels and its top-level lists ([02f4db6](02f4db6))
* **bestax-migrate:** convert .select and .breadcrumb with the element inside them ([d76c569](d76c569))
* **bestax-migrate:** convert .tabs and .icon around their children ([#815](#815)) ([3967a80](3967a80))
* **bestax-migrate:** convert a menu list's items to Menu.Item ([#816](#816)) ([b385687](b385687))
* **bestax-migrate:** convert an .image and its <img> to Image ([d4f3673](d4f3673)), closes [#793](#793)
* **bestax-migrate:** convert an .image around anything but a bare <img> ([0a31c5b](0a31c5b)), closes [#801](#801)
* **bestax-migrate:** convert Bulma cards built from their parts ([#752](#752)) ([1b08e17](1b08e17))
* **bestax-migrate:** convert Bulma form fields, controls, inputs and textareas ([3da788d](3da788d)), closes [#743](#743)
* **bestax-migrate:** convert Bulma grids and cells ([#760](#760)) ([22adc7c](22adc7c)), closes [#743](#743)
* **bestax-migrate:** convert Bulma navbars ([#754](#754)) ([02fdd72](02fdd72))
* **bestax-migrate:** convert Bulma skeletons ([2574ace](2574ace))
* **bestax-migrate:** convert Card's title and footer items on the tags their as takes ([20bc0c6](20bc0c6)), closes [#794](#794)
* **bestax-migrate:** convert conditional classes in clsx and classnames calls ([8948cce](8948cce))
* **bestax-migrate:** convert Modal's parts element by element ([4d41ad2](4d41ad2)), closes [#805](#805)
* **bestax-migrate:** convert navbar dividers with classes, and navbar text colors ([#796](#796)) ([c97c7e9](c97c7e9))
* **bestax-migrate:** convert Pagination, its list and its previous and next links ([d75bc70](d75bc70)), closes [#807](#807)
* **bestax-migrate:** convert Pagination's page links and ellipsis in their li's place ([ae720fa](ae720fa)), closes [#809](#809)
* **bestax-migrate:** convert Panel and its heading, tabs and blocks ([#811](#811)) ([0694e54](0694e54))
* **bestax-migrate:** convert the gap, position, overflow, radius and aspect-ratio helpers ([13dcf63](13dcf63))
* **bestax-migrate:** fold .table-container and .fixed-grid into the component inside ([#761](#761)) ([72504f5](72504f5)), closes [#743](#743)
* **bulma-ui:** add Bulma's gap helper props to every component ([#877](#877)) ([1bd4abc](1bd4abc))
* **bulma-ui:** add Bulma's position, overflow, radius and aspect-ratio helper props ([#845](#845)) ([64fb91c](64fb91c))
* **bulma-ui:** add Collapses, an accordion group for Collapse ([#849](#849)) ([a12c823](a12c823))
* **bulma-ui:** add DateRangeInput ([50fcba7](50fcba7)), closes [#774](#774)
* **bulma-ui:** add Loader, Bulma's inline spinner ([c5e9eb0](c5e9eb0)), closes [#770](#770)
* **bulma-ui:** add month and year pickers to DateInput through granularity ([c4cfc2b](c4cfc2b)), closes [#773](#773)
* **bulma-ui:** add Popover ([2e17fac](2e17fac)), closes [#776](#776)
* **bulma-ui:** export ClientOnly and useIsHydrated ([2c0c1e6](2c0c1e6))
* **bulma-ui:** export Portal ([346d8c2](346d8c2))
* **bulma-ui:** export useFocusTrap, counting the stops the browser's Tab visits ([c304fef](c304fef)), closes [#772](#772)
* **bulma-ui:** let Card.Header.Title and Card.FooterItem render Bulma's own tags ([#794](#794)) ([47ecdb6](47ecdb6))
* **bulma-ui:** make columnGap the column gap helper on Theme ([eb2c611](eb2c611)), closes [#694](#694)
* **bulma-ui:** render Pagination from total, current and onPageChange ([f7ddf04](f7ddf04)), closes [#813](#813)
* **eslint-plugin:** add an opt-in rule for plain elements styled with a Bulma component class ([#750](#750)) ([0bb4d80](0bb4d80))
* **eslint-plugin:** check the gap helper props ([b53a749](b53a749))
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 4.2.13 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

claude-assisted deep-review needs-human-review Loop converged (or contested): awaiting owner review + manual merge released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] bulma-ui: textColor on Navbar.Menu, Start, End and Burger reaches the DOM as an attribute

2 participants