Skip to content

fix(bulma-ui): merge className into Navbar.Divider instead of overwriting it - #791

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

allxsmith merged 3 commits into
mainfrom
claude/issue-756-20260927-1344

Conversation

@bestaxbot

@bestaxbot bestaxbot commented Sep 27, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Navbar.Divider rendered as <hr className={usePrefixedClassNames('navbar-divider')} {...props} />, so a className passed by the caller was spread after (and replaced) the component's own navbar-divider class — every other component in the Navbar family merges the two with classNames(...) instead.

  • Destructure className out of props and merge it with classNames(usePrefixedClassNames('navbar-divider'), className), matching the pattern already used by NavbarDropdownMenu and the rest of the family.

Reproduction

<Navbar.Divider className="my-2" />

Before: <hr class="my-2"/> (divider loses all Bulma styling)
After: <hr class="navbar-divider my-2"/>

Test plan

  • Added a regression test (merges a custom className with navbar-divider instead of replacing it) that fails against the old implementation and passes against the fix
  • pnpm --filter @allxsmith/bestax-bulma run lint
  • pnpm --filter @allxsmith/bestax-bulma run typecheck
  • pnpm --filter @allxsmith/bestax-bulma run test:coverage (129 suites, 4237 tests passing; coverage above thresholds)
  • pnpm run format:check
  • pnpm run gen:catalog:check
  • pnpm run check:conformance

Fixes #756

Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Navbar dividers now accept custom CSS classes, allowing you to apply additional styling while retaining the default divider appearance. Other standard divider attributes continue to work as before.

…ting it

NavbarDivider spread props after setting its own className, so a
caller-supplied className replaced navbar-divider instead of merging
with it, silently dropping the divider's Bulma styling.

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: 5bc8bf7c-81e2-4fd5-9aac-430c63dd673d

📥 Commits

Reviewing files that changed from the base of the PR and between e1ef1a3 and 5896689.

📒 Files selected for processing (3)
  • bestax-mcp/data/skills.json
  • skills/bestax-migrate/references/bulma-classes/component-map.md
  • skills/bestax-migrate/references/bulma-classes/unmappables.md

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

NavbarDivider now combines its default navbar-divider class with a supplied className and forwards remaining props. A test checks both classes. Migration references and their recorded sizes are updated.

Changes

Navbar divider class handling

Layer / File(s) Summary
Merge divider classes
bulma-ui/src/components/Navbar.tsx, bulma-ui/src/components/__tests__/Navbar.test.tsx
NavbarDivider combines navbar-divider with the supplied className and forwards remaining props to <hr>. The test checks that both classes are present.
Update migration references
skills/bestax-migrate/references/bulma-classes/component-map.md, skills/bestax-migrate/references/bulma-classes/unmappables.md, bestax-mcp/data/skills.json
The migration references update their guidance for .navbar-divider elements with additional classes. The recorded byte sizes for both reference files also change.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~7 minutes

Change: Bug fix · Severity of issue fixed: Low

Merge Risk: ⚪ Minimal · up to 58966

The divider now retains its Bulma class alongside caller classes, with regression coverage. The migration guidance preserves the documented codemod limitation; no merge-blocking issue is evident.

Architecture Summary

Architecture risk: 🔵 Low · up to 58966

The change affects 3 systems.

Changed systems: bulma-ui, skills, bestax-mcp

Architecture concerns
No architecture-level concerns identified.

Review details

Systems and components

  • observed — bulma-ui (ui) was modified; 2 changed files map to changed impact.
  • observed — skills (service) was modified; 2 changed files map to changed impact.
  • observed — bestax-mcp (service) was modified; 1 changed file maps to changed impact.

Before / after behavior

  • observed — Modified behavior in bulma-ui/src/components/Navbar.tsx: NavbarDivider now destructures className, combines it with the prefixed class, and forwards the remaining props to <hr>. Previously, it forwarded all props directly and applied only the prefixed class.
  • observed — Modified behavior in bulma-ui/src/components/tests/Navbar.test.tsx: Added a test that renders Navbar.Divider with className="my-2" and checks that both navbar-divider and my-2 are present.
  • observed — Modified behavior in bestax-mcp/data/skills.json: The recorded size for references/bulma-classes/component-map.md changed from 14,392 to 14,319 bytes.
  • observed — Modified behavior in bestax-mcp/data/skills.json: The recorded size for references/bulma-classes/unmappables.md changed from 15,743 to 15,628 bytes.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main change: merging the caller's className with Navbar.Divider's default navbar-divider class.
Description check ✅ Passed The description explains the bug, affected component, expected behavior, reproduction, fix, regression test, validation checks, and linked issue. It does not reproduce every template heading or explic…
Linked Issues check ✅ Passed Issue #756 requires Navbar.Divider to retain navbar-divider when the caller supplies className. The PR destructures and merges className with the prefixed class. The regression test verifies b…
Out of Scope Changes check ✅ Passed The implementation and regression test directly address issue #756. The migration-reference edits remove stale workaround claims, and the generated skills.json sizes reflect those edits. The codemod…
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 2…
✨ Finishing Touches
🧪 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://2f60e4a3.bestax.pages.dev

Comment thread bulma-ui/src/components/Navbar.tsx

@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 Two shipped skill reference files state Navbar.Divider "drops its own class for a className it's given" — false once this releases; CLAUDE.md requires skills/ to move in the same PR (and gen:mcp re-run, since skills.json records each reference's byte size) skills/bestax-migrate/references/bulma-classes/component-map.md:101
2 🔵 Advisory Robustness ownClassOnly: true keeps the codemod refusing a .navbar-divider that carries another class, and the same rationale is emitted as user-facing text by the CLI (plan.ts:561) and the MCP server (bulma-classes.ts:560). #756 defers lifting it — correctly: flipping it before this patch is published would emit <Navbar.Divider className="mt-2" /> that silently loses styling on an installed 5.16.9 bestax-migrate/src/sources/bulma-classes/class-map.ts:1255
3 🔵 Advisory Correctness The identical spread-after-className defect is still live in three sibling components outside this diff — PaginationEllipsis, PanelInputBlock, PanelCheckboxBlock bulma-ui/src/components/Panel.tsx:254
4 🔵 Advisory Robustness Nothing in check:conformance or the ESLint plugin rejects {...props} spread after a literal className, so this class of bug can land again unnoticed scripts/check-conformance.mjs

Overall: The code change is correct and minimal — it reproduces the family's own idiom (classNames(usePrefixedClassNames(...), className), exactly as NavbarDropdownMenu and every other Navbar subcomponent do), classNames de-duplicates so className="navbar-divider" is harmless, and the caller's class stays unprefixed like everywhere else. The regression test is targeted and the full suite is green (129 suites / 4237 tests, matching the PR body). The riskiest part is not the component at all — it is that this fix silently invalidates prose and codemod behaviour that three other packages derive from the old bug; the human should look at the skills edit first, then decide whether the ownClassOnly follow-up is filed before this releases.

Residual risk:

  • Rest of the Navbar family — refuted. After the change, Navbar.tsx contains no remaining className={usePrefixedClassNames(…)} immediately followed by {...props}; every subcomponent (Brand, Item, Link, Burger, Menu, Start, End, Dropdown, DropdownMenu) merges through classNames.
  • Same failure class elsewhere in the library — open. A sweep of bulma-ui/src found three surviving instances, none touched by this diff: bulma-ui/src/components/Pagination.tsx:343 (PaginationEllipsis), bulma-ui/src/components/Panel.tsx:254 (PanelInputBlock) and bulma-ui/src/components/Panel.tsx:284 (PanelCheckboxBlock) all leave className inside props and spread it over their own class.
  • Look-alikes — refuted. Modal, Carousel, Field, Tabs, Message, Sidebar, LinkButton and the other Panel blocks all destructure className before building their class string.
  • Recurrence — open. No lint or conformance rule guards the pattern, so the sweep above is a point-in-time result, not a gate.
  • Config prefix / duplicate classes — refuted. usePrefixedClassNames prefixes only the library's own class and classNames collapses duplicates via a Set, so <Navbar.Divider className="navbar-divider" /> renders one class and a configured prefix is unaffected.
  • Generated artefacts — refuted at HEAD. pnpm gen:mcp:check is clean on this branch (the props type is unchanged, so no metadata moved). pnpm check:conformance fails here only on version-regression, which is the shallow-clone guard firing in this checkout, not a defect in the PR.

🏄 Clean little one-liner — caught the wave the rest of the Navbar family was already riding, and the test locks it in. Only thing still bobbing out back is the migrate skill telling folks the surf's closed out; tidy that up and it's smooth all the way to the beach.

@github-actions

Copy link
Copy Markdown
Contributor

AI loop status: iteration 1/4 — fix-reviews at e1ef1a3 (2026-09-27T13:59:31Z).
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.

… skill

The bulma-classes skill references stated, as a fact about the component,
that `Navbar.Divider` drops its own class when given a `className`. This
PR fixes that, so the clause is false as of this change.

Deleted the clause in both files. The codemod behaviour they describe is
unchanged — a `.navbar-divider` carrying another class still converts to
markup with an `attr:className` TODO — so only the stale explanation goes.
Regenerated `bestax-mcp/data/skills.json`, which records a byte size per
reference file.

Co-Authored-By: Claude <noreply@anthropic.com>
@bestaxbot

Copy link
Copy Markdown
Collaborator Author

Fix pass 1 recap

One open AI review thread, and it was a real one. Handled it and pushed 3cd96f5.

Fixed

Finding Where What I did
Shipped skill guidance still asserted the behaviour this PR removes (thread) skills/bestax-migrate/references/bulma-classes/component-map.md:101, .../unmappables.md:47 Deleted the false clause in each — both stated, as a fact about the component, that Navbar.Divider drops its own class for a className it's given. Kept the surrounding codemod facts, which are unchanged: a .navbar-divider carrying another class still converts to markup with an attr:className TODO. Lifting that restriction is #756's follow-up PR, not this one.
— bestax-mcp/data/skills.json Re-ran the generator, since the index records a bytes size per reference file. Exactly two values moved (14392→14319, 15109→14994) and nothing else, so gen:mcp:check stays green.

Refuted

None — nothing to escalate from this pass.

Gates run

Gate Result
pnpm run lint pass (0 errors; the 7 react-hooks/exhaustive-deps warnings are pre-existing in Slider.tsx/Taginput.tsx, untouched here)
pnpm run typecheck pass (7 packages)
pnpm run typecheck:tests pass
test:coverage (bulma-ui) pass — 129 suites, 4237 tests, thresholds met
test (bestax-mcp, bestax-migrate) pass — 52 suites, 1891 tests
pnpm run build (bulma-ui) pass
pnpm run format:check pass
pnpm run check:conformance pass (22 checks, including skills-sync and fragile-prose)
pnpm run gen:mcp:check pass
pnpm run gen:catalog:check pass

I skipped build-storybook this round — the pushed commit touches only Markdown and the generated JSON index, no component source, so it can't move that build. CI runs it anyway.

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://7b4ddcca.bestax.pages.dev

@bestaxbot

Copy link
Copy Markdown
Collaborator Author

🏄 Clean sets, no drop-ins — this one's converged. 1 iteration(s) of grinding, CI lit up greener than a kelp bed, and not one AI review thread left in the impact zone.

Only the meat build ships with merge permissions — @allxsmith, do the wet-mammal thing and squash-merge when it feels right. Loop never merges; apparently 'ship it' needs a pulse. 🤙

@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 14:23
@github-actions

Copy link
Copy Markdown
Contributor

📸 Story screenshots at handoff — 3cd96f5

6 stories (light + dark) from this PR's changed files under bulma-ui/src/ (workflow run · artifact story-screenshots-pr-791, 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
@allxsmith

Copy link
Copy Markdown
Owner

Merged main in to clear the conflict with #795. The only conflict was bestax-mcp/data/skills.json, which is generated, so it's regenerated rather than hand-merged; unmappables.md merged on its own and keeps both this PR's divider edit and #795's recipes. No change to the fix itself.

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://56701b72.bestax.pages.dev

@bestaxbot

Copy link
Copy Markdown
Collaborator Author

Thanks — I re-verified the merge at 5896689 rather than taking it on trust, and it holds. Nothing to push.

The generated index really is back in sync. pnpm run gen:mcp:check is green, so the regeneration reproduces byte-for-byte. I also checked the two numbers by hand, since a regenerated file that merely looks plausible is the failure mode here: wc -c reports 15628 for unmappables.md and 14319 for component-map.md, which is exactly what bestax-mcp/data/skills.json:106,116 now records. The unmappables.md delta is -115 bytes against the post-#795 base — the same -115 my pre-merge commit applied to the smaller base (15109→14994), which is what you want to see: the divider edit re-applied cleanly on top of #795 rather than either side winning outright.

Both sides survived. The cleanest check was diffing the merge against each parent:

So the merge is exactly the union, with no third thing introduced. Navbar.tsx:799-806 still merges via classNames(usePrefixedClassNames('navbar-divider'), className), and grep -rn "drops its own class" skills/ returns nothing, so the stale guidance stayed deleted through the merge.

Gates on the merge commit

Gate Result
gen:mcp:check pass (no diff)
gen:catalog:check pass
check:conformance pass (22 checks, incl. skills-sync, fragile-prose)
test:coverage (bulma-ui) pass — 129 suites, 4237 tests, thresholds met
typecheck pass (7 packages)
typecheck:tests pass
lint pass — 0 errors (7 react-hooks/exhaustive-deps warnings, all pre-existing in Autocomplete.tsx/Slider.tsx/Taginput.tsx, untouched here)
format:check pass

Working tree came back clean after running the generators, so there is no un-committed drift.

One thing I looked at and deliberately left alone: skills/bestax-migrate/references/bloomer/prop-map.md:154 still says Navbar.Divider and two siblings "write their own className last or take no props at all". That justification is now stale for Navbar.Divider specifically. I agree with the deep review's call to defer it — the behaviour it documents is still true (the helper is named in a TODO), because NO_CLASSNAME_TARGETS in bestax-migrate/src/sources/bloomer/mapping.ts:156-161 is unchanged by this PR. It should move in the #756 follow-up that actually lifts the codemod restriction, and that edit will need its own pnpm gen:mcp.

Only Build and Test is still pending; everything else is green. Yours to squash-merge.

@bestaxbot

Copy link
Copy Markdown
Collaborator Author

Thanks for the approval. Nothing outstanding on my side, so no code pushed.

Quick state check at 5896689, since my last comment left one thing hanging:

  • Build and Test is now green (11m25s) — that was the only pending gate when I reported in. Every other required check passes too: React 18 and 19 matrix, CodeQL, Dependency Review, Socket, preview deploy.
  • The fix is intact at head — bulma-ui/src/components/Navbar.tsx:804 still merges through classNames(usePrefixedClassNames('navbar-divider'), className), and grep -rn "drops its own class" skills/ returns nothing, so the stale skill guidance stayed deleted through your main merge.
  • The one review thread is resolved; no unresolved threads remain.

Left deliberately untouched, as before: skills/bestax-migrate/references/bloomer/prop-map.md:154 still gives "write their own className last or take no props at all" as the reason NO_CLASSNAME_TARGETS excludes Navbar.Divider. That rationale is stale for the divider now, but the codemod behaviour it documents is unchanged by this PR, so it belongs in the #756 follow-up that actually lifts the restriction — along with its own pnpm gen:mcp.

Yours to squash-merge whenever. 🏄

@allxsmith
allxsmith merged commit fcc0d51 into main Sep 27, 2026
21 checks passed
@allxsmith
allxsmith deleted the claude/issue-756-20260927-1344 branch September 27, 2026 17:05
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 📦🚀

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 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: Navbar.Divider loses its own class when given a className

2 participants