Repository navigation
fix(bulma-ui): apply textColor helper class on Navbar Menu, Start, End, and Burger - #792
Conversation
…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>
|
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 configurationConfiguration used: Repository: allxsmith/bestax/.coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (6)
Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review. WalkthroughNavbar components now use ChangesNavbar text-color handling
ESLint metadata guard
Priority: ⬇️ Low Estimated code review effort: 3 (Moderate) | ~20 minutes Change: Bug fix · Severity of issue fixed: Low Suggested reviewers: Merge Risk: ⚪ Minimal · up to 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 ReviewSecurity architecture risk: 🔵 Low · up to 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 Security review detailsSecurity Blast Radius
Trust Boundaries and Controls
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
Preview DeploymentPreview URL: https://158acfc7.bestax.pages.dev |
|
AI loop status: iteration 3/4 — |
…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.
Fix pass 1 of 4 — recapOne open AI review thread this round (the Claude deep review's Fixed
TestsAdded a precedence test per part (Brand, Burger, Menu, Start, End): render Worth a maintainer's eye (not changed here)The TSDoc rewording puts these five into the ESLint plugin's generated Gates run
|
Preview DeploymentPreview URL: https://63d7abc9.bestax.pages.dev |
| 'Navbar.Brand', | ||
| 'Navbar.Burger', | ||
| 'Navbar.End', | ||
| 'Navbar.Menu', | ||
| 'Navbar.Start', |
There was a problem hiding this comment.
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:
elementOfresolves the dotted part,TEXT_ALIAS.has('Navbar.Brand')is now true, no spread and a readableprimaryinRENDERABLE⇒context.report({ messageId: 'ambiguous' })(no-color-as-surface.ts:92-150). The autofix itself is correct — it writestextColor, which all five do declare. bgColorundeclared:NavbarBrandPropsextendsReact.HTMLAttributes<HTMLDivElement>+Omit<BulmaClassesProps, 'color' | 'backgroundColor'>(Navbar.tsx:117-135) and names onlytextColor/color.grep bgColor @types/react@19.2.18/index.d.ts→ no matches. The regenerated API tables confirm it:Navbar.Brand/.Burger/.Menu/.Start/.Endhave nobgColorrow, whileNavbar,Navbar.ItemandNavbar.Linkdo (docs/docs/api/components/navbar.md:500,538,551).bgColoris inert at runtime:useBulmaClassesreadscolor,backgroundColor,colorShade,backgroundColorShade— neverbgColor.- 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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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 newrefuses a text-alias element that does not declare bgColorcase; the pre-existingtextColorcase 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, andgit status --porcelainstayed clean ⇒ zero drift, sogen:eslint-meta:checkis green.pnpm exec node scripts/gen-mcp-index.mjs→ clean tree too, so the regeneratedbestax-mcp/data/components/Navbar.jsonmatches the reworded TSDoc andgen:mcp:checkstays 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 needbulma-uibuilt first — a cold checkout fails these four suites onCannot find module '@allxsmith/bestax-bulma/constants', which is the environment, not the branch.)docs/docs/api/components/navbar.mdregenerated with the new wording and still carries nobgColorrow 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. 🏄
There was a problem hiding this comment.
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 33textColoroccurrences 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 reachrest. - The
{ color: X, ...props }clobber elsewhere inNavbar.tsx— refuted. Every part declaring a publiccolornow destructures it (:150,:318,:391,:447,:479), the root consumescolorforis-${color}(:74,:91), andNavbar.Item/Navbar.Linktype itcolor?: never(:187,:517) sopropscannot carry one. Navbar.Dropdown/.DropdownMenu/.Dividerspread...propsraw with nouseBulmaClasses— refuted as this failure class. Their props extend onlyReact.HTMLAttributes, declaring no helper props, so there is no declared-but-unread prop to leak.textColor={undefined}ornullsilently falling back tocolor— accepted. That is??'s defined behaviour and the same contractCard/Heroship;no-color-as-surfacealready reasons about exactly this case (no-color-as-surface.ts:104-113).colorShadeapplying to the wrong prop — refuted.useBulmaClassesshades whichever value arrives in the singlecolorslot, so the shade follows the winner oftextColor ?? colorwith no second code path.- Open: finding 1 (the rule's
bgColoradvice) and advisory 2 (the same clobber inPagination). - Empirical basis:
Navbar.test.tsx91/91; full bulma-ui suite 4246/4246 with the 99% coverage gate green;eslint-plugin217/217 via turbo (a barepnpm --filter … testfails on an unbuilt@allxsmith/bestax-bulma/constants— environment, not this PR);gen:eslint-meta:check,gen:mcp:checkandcheck:conformance(22/22) all clean. I did not re-revert the source to reproduce the pre-fix test failures the PR body claims; thehas-text-greyprobe makes them true by construction, since no value ofcolorcan produce that class.
🏄 Clean little set, bro — the barrel got fixed properly and the tests are pinned with a
greythat can't fake it. Only thing is the lint rule's now yelling "go paddle tobgColor" 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.
Iteration 2 recapOne unresolved thread this pass — the deep review's finding on The short version: last pass I reworded the five Navbar parts'
What I changed. The reviewer offered two settlements and I took the second. Declaring 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. Nothing was refuted this pass. Gates run locally, all green: |
Preview DeploymentPreview URL: https://074c5b51.bestax.pages.dev |
Iteration 3 recap — no changes neededI went through the review threads again and there is genuinely nothing left to act on this pass, so I pushed no commits. Thread state
No CodeRabbit or Copilot threads are open, and no new review has landed since What I re-verified before concluding thatRather than take the thread history on trust, I checked that the two fixes are still actually present at HEAD:
GatesI ran no local gates and made no commits, because the tree is clean and identical to 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. |
|
🏄 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. 🤙 |
📸 Story screenshots at handoff —
|
|
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 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. |
## [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))
|
🎉 This PR is included in version 5.16.11 🎉 The release is available on: Your semantic-release bot 📦🚀 |
…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.
# [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))
|
🎉 This PR is included in version 2.13.0 🎉 The release is available on: Your semantic-release bot 📦🚀 |
# [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))
|
🎉 This PR is included in version 1.7.0 🎉 The release is available on: Your semantic-release bot 📦🚀 |
## [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))
## [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))
|
🎉 This PR is included in version 4.2.13 🎉 The release is available on: Your semantic-release bot 📦🚀 |












Summary
Navbar.Menu,Navbar.Start,Navbar.EndandNavbar.Burgerdeclared atextColorprop and never read it. It fell through into...props→useBulmaClasses(which only readscolor/backgroundColor) →rest, so it landed on the DOM element as a raw attribute and triggered React's "unrecognized DOM prop" warning, instead of rendering ahas-text-*class.Navbar.BrandandNavbar.Itemalready did this correctly (color: textColor), so this fix brings the remaining four in line with that pattern.Changes
NavbarBurger,NavbarMenu,NavbarStart,NavbarEnd: destructuretextColorand pass it touseBulmaClassesascolor: textColor.has-text-*class is applied and the rawtextColorattribute 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 passNavbar.tsx(regression reproduced), then pass after the fixpnpm --filter @allxsmith/bestax-bulma run test:coverage— full suite green, coverage thresholds metpnpm --filter @allxsmith/bestax-bulma run lintpnpm --filter @allxsmith/bestax-bulma run typecheck/typecheck:testspnpm run format:checkpnpm run gen:catalog:check(no change — no component added/renamed)pnpm run check:conformance(all checks pass; the sandbox's shallow clone makesversion-regressionreport a false positive unrelated to this change — passes with--allow-untagged)pnpm --filter @allxsmith/bestax-bulma run buildpnpm --filter @allxsmith/bestax-bulma run build-storybookFixes #757
Generated with Claude Code
Summary by CodeRabbit
textColorsetting takes precedence;coloris used whentextColoris not set.colorapplies text-color styling, not a filled color variant, and documented precedence and supported colors.