Skip to content

fix(bulma-ui): render the four burger spans Bulma v1 positions - #785

Merged
allxsmith merged 2 commits into
mainfrom
fix/755-navbar-burger-spans
Sep 27, 2026
Merged

allxsmith merged 2 commits into
mainfrom
fix/755-navbar-burger-spans

Conversation

@allxsmith

@allxsmith allxsmith commented Sep 27, 2026 •

Copy link
Copy Markdown
Owner

Pull Request

Description

Navbar.Burger renders the four <span aria-hidden="true"> that Bulma v1's burger() mixin positions, instead of three.

  • bulma-ui (@allxsmith/bestax-bulma)
  • create-bestax (create-bestax)
  • docs (@allxsmith/bestax-docs)
  • Other (please specify):

The mixin places spans 1 and 2 in the middle, where they rotate into the X when open, span 3 above and span 4 below. With three spans the closed burger drew two bars. The open X looked right, since it only uses spans 1 and 2, which is how this went unnoticed.

I confirmed it in the browser against Bulma 1.0.4's stylesheet. Three spans: the closed burger shows two bars. Four spans: three bars. The open state is the same X in both.

The test that pinned the old count now asserts four, all aria-hidden. A code comment in Navbar.Burger says why there are four, so the count isn't "tidied" back to three.

Related Issue(s)

Closes #755

Type of Change

  • Bug fix
  • New feature
  • Refactor
  • Documentation
  • Performance
  • Build tooling
  • Other (please describe):

Checklist

  • My code follows the project style guidelines
  • I have performed a self-review of my code
  • I have added tests that prove my fix is effective or that my feature works
  • I have added/updated documentation as needed
  • I have updated Storybook stories as needed (bulma-ui)
  • My changes require a change to the documentation
  • All new and existing tests passed
  • Any relevant dependencies are updated
  • If this PR changes commands, conventions, or package structure, the affected CLAUDE.md files are updated

Screenshots / Demos

Rendered with Bulma 1.0.4's CSS:

closed open
3 spans (before) two bars X
4 spans (after) three bars X

Additional Context

Summary by CodeRabbit

  • Tests
    • Updated navbar burger coverage to verify its four decorative spans.
  • Documentation
    • Clarified the existing burger icon layout in code comments. There are no changes to the navbar’s appearance or behavior.

Bulma v1's burger mixin places spans 1 and 2 in the middle (the X when
open) and 3 and 4 above and below, so with three spans a closed
Navbar.Burger drew two bars. It now renders four, all aria-hidden, and
the test that pinned three asserts four.

Closes #755
@allxsmith

Copy link
Copy Markdown
Owner Author

deep-review: read-only: don't install, build or run tests; CI covers them on this head.

Priorities:

  1. bulma-ui/src/components/Navbar.tsx: does Navbar.Burger now match Bulma v1's burger() mixin (node_modules/bulma/sass/utilities/mixins.scss) and Bulma's own navbar markup, closed and open?
  2. bulma-ui/src/components/__tests__/Navbar.test.tsx: does the test hold the count and aria-hidden without over-specifying?

Skip: the Hero story's raw burger and bestax-migrate's navbar-burger TODO (both checked in the PR body).

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

Warning

Review limit reached

Next included review available in 49 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

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

Review profile: CHILL

Plan: Advanced

Run ID: 8fd60828-8efd-4aab-9bed-4145bf746cd6

📥 Commits

Reviewing files that changed from the base of the PR and between 5776714 and 9b7664c.

📒 Files selected for processing (4)
  • bestax-mcp/data/components/Navbar.json
  • bulma-ui/src/components/Navbar.tsx
  • bulma-ui/src/components/__tests__/Navbar.test.tsx
  • docs/docs/api/components/navbar.md

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: 867679cb-c260-4e61-b52c-4402a6a899c5

📥 Commits

Reviewing files that changed from the base of the PR and between b5fb1f5 and 5776714.

📒 Files selected for processing (2)
  • bulma-ui/src/components/Navbar.tsx
  • bulma-ui/src/components/__tests__/Navbar.test.tsx

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

The change adds a comment about the existing four-span Navbar.Burger layout and updates its test to expect four spans, each with aria-hidden="true". The rendered markup and runtime behavior do not change.

Changes

Navbar burger

Layer / File(s) Summary
Burger markup and test
bulma-ui/src/components/Navbar.tsx, bulma-ui/src/components/__tests__/Navbar.test.tsx
A comment describes the existing four-span Bulma layout. The test now expects four spans, each with aria-hidden="true".

Priority: ⬇️ Low

Estimated code review effort: 1 (Trivial) | ~5 minutes

Change: Bug fix

Suggested reviewers: bestaxbot

Merge Risk: ⚪ Minimal · up to 57767

This change documents existing burger markup and aligns its test with the four hidden spans. No behavior change or merge-blocking risk is identified.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely identifies the main change: rendering four burger spans for Bulma v1 positioning.
Description check ✅ Passed The description includes the required sections, identifies the affected package, links issue #755, classifies the change as a bug fix, documents the implementation and test updates, and records checkl…
Linked Issues check ✅ Passed Issue #755 requires four <span aria-hidden="true"> elements in Navbar.Burger. The reviewed code renders four decorative spans before custom children. The updated test asserts a count of four and v…
Out of Scope Changes check ✅ Passed The pull request changes only Navbar.Burger markup, adds an explanatory Bulma v1 comment, and updates its focused test. These changes directly support issue #755. No unrelated implementation or test…
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 docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

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

❤️ Share

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

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://0e7e165e.bestax.pages.dev

@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 — 0 blocking · 2 advisory

# Severity Area Finding Location
1 🔵 Advisory API The #755 workaround now over-corrects, and nothing a consumer reads says so — only the PR body does. A consumer who added a fourth <span aria-hidden="true" /> child gets five spans, and span 5 matches the base span rule (absolute, currentColor, 2×20px) with no nth-child inset, so it lands at its static position and draws a visible extra bar. bulma-ui/src/components/Navbar.tsx:322
2 🔵 Advisory Coverage Nothing pins the spans before children, which is what the CSS contract actually needs (the burger's own spans must be nth-child 1–4). The count assertion still passes if a refactor put {children} first. children on Navbar.Burger has no test at all — pre-existing, not introduced here. bulma-ui/src/components/__tests__/Navbar.test.tsx:276

Overall: The fix is correct, and I confirmed it from the stylesheet rather than the diff. With Bulma 1.0.4's defaults (themes/light.scss:92-94 — gap 5px, item-height 2px, item-width 20px) in a 40px box (navbar.scss:266, @include mx.burger(2.5rem)), the mixin puts spans 1–2 at 19–21px, span 3 at 13–15px (bottom: calc(50% + gap)) and span 4 at 25–27px (top: calc(50% + gap)): four spans draw three bars 6px apart, three spans draw only the 13px and 19px bars — a top-heavy two-bar glyph. is-active rotates 1 and 2 and zeroes the opacity of 3 and 4, so the open X is identical either way, exactly as the PR body explains the miss. The riskiest part is the silent rendering change for anyone carrying the #755 workaround (row 1); there is nothing for a human to fix in the code.

Residual risk:

  • An older Bulma without the four-span mixin. Refuted: bulma-ui/package.json:89 declares "bulma": "^1.0.4" as a direct dependency, so the lowest stylesheet a consumer resolves already carries these nth-child rules. A hand-pinned 0.9.x stylesheet from a CDN would draw an extra bar, but that is outside a v1-only library's contract.
  • Another surface still pinning three spans. Refuted by grep: the changed assertion is the only span-count assertion in the repo. bestax-migrate/src/sources/bulma-classes/__testfixtures__/navbar.{input,output}.tsx and eval/agent-loop/fixtures/bulma-app/src/components/SiteNavbar.tsx already use four, and skills/bestax-migrate/references/bulma-classes/unmappables.md:165 says "renders its own spans" — count-agnostic, so no skills/ update is owed.
  • Docs or generated artefacts going stale. Refuted: docs/docs/api/components/navbar.md states no span count and its three burger examples render the component live; the MCP index, skill catalog and ESLint metadata are generated from props and JSDoc, not the render body, so a JSX comment inside return cannot stale them.
  • fragile-prose rejecting the new comment's counts. Refuted: that check targets only .github/** yaml, CLAUDE.md files and docs/docs/guides (scripts/check-conformance.mjs:3958-3975); component source is deliberately out of scope.
  • Open: row 2 — the spans-before-children ordering the mixin depends on is asserted nowhere.

🏄 Two bars where Bulma wanted three, and the X hid the evidence the whole time — classic. One extra span, a test that counts them and confirms they're all hidden, and the burger finally looks like a burger. Ship it.

Navbar.Burger's children render after its four bar spans, and Bulma
styles every span in the burger as a bar, so its TSDoc now says an
extra span draws an extra bar. A test holds the spans ahead of
children, the order the mixin's nth-child rules rely on.
@allxsmith

Copy link
Copy Markdown
Owner Author

Thanks for the deep review. Both advisories are fixed in the latest commit:

  1. The workaround over-corrects. children's TSDoc now says they render after the burger's four bar spans, and that Bulma styles every <span> in the burger as a bar, so an extra span draws an extra bar. The regenerated props table on the Navbar page and the MCP index carry it, so readers of the types and the docs both see it.
  2. Spans before children. A new test renders a child and asserts the first four children are the spans and the child comes after. I moved {children} ahead of the spans to watch it fail, then restored it.

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://d0237288.bestax.pages.dev

@allxsmith

Copy link
Copy Markdown
Owner Author

deep-review: fresh

Read-only: do not install, build or run tests; CI is green on this head.
Review the whole PR as it stands now, including 9b7664c (the children TSDoc, the ordering test, and the regenerated props table and MCP entry).
Priorities: 1. bulma-ui/src/components/Navbar.tsx against Bulma v1 burger() mixin. 2. bulma-ui/src/components/__tests__/Navbar.test.tsx. 3. docs/docs/api/components/navbar.md and bestax-mcp/data/components/Navbar.json agree with the TSDoc.

@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 — 0 blocking · 1 advisory

No. Severity Area Finding Location
1 🔵 Advisory Correctness The new TSDoc sentence — an extra span here draws an extra bar — holds only in the open state. A fifth span matches .navbar-burger span (absolute, currentColor, 20x2px, left: 10px) but no nth-child inset, so it takes its flex static position: vertically centred in the 40px box at top: 19px, identical to spans 1-2 at calc(50% - 1px) = 19px. Closed, it hides under the middle bar; only is-active (which rotates 1-2 and zeroes 3-4) exposes it, as a bar across the X. This refines my own prior row 1, which called it a visible extra bar with no state qualifier. No wording change requested — the sentence claims a bar is drawn, and one is. bulma-ui/src/components/Navbar.tsx:283

Overall: The fix is correct, and I confirmed it from the stylesheet rather than the diff. sass/utilities/mixins.scss:172-183 puts spans 1-2 at top: calc(50% - item-height/2), span 3 at bottom: calc(50% + gap) and span 4 at top: calc(50% + gap); with the Bulma 1.0.4 defaults (gap 5px, item-height 2px, item-width 20px — css/bulma.css:1897-1899) in the 40px burger box that is bars at 13px, 19px and 25px, so three spans drew a top-heavy two-bar glyph and four draw the intended three. is-active (mixins.scss:205-219) touches only spans 1-4, the same way in both cases, which is exactly why the open X hid the defect. The second commit closes my prior coverage row: Navbar.test.tsx:283-297 now pins the four spans ahead of children by tag name and asserts the child lands at index 4, so a refactor moving children first fails on the first element being an EM instead of passing a bare count. Nothing here for a human to fix; the one thing worth a glance is the silent DOM change for anyone carrying the workaround from issue 755, which the TSDoc now names.

Residual risk:

  • The three prose copies drifting from the TSDoc. Refuted: Custom content inside the burger appears in exactly three files (Navbar.tsx, docs/docs/api/components/navbar.md, bestax-mcp/data/components/Navbar.json) and all three carry the identical sentence. Both derived copies are machine-gated rather than trusted: the MCP props come from props-extract.mjs (gen-mcp-index.mjs:629, gated by gen:mcp:check), and the docs Props table sits inside the generated props region (navbar.md:493-626), which checkDocsGenerated() in scripts/check-conformance.mjs:462-484 re-renders and byte-compares — so gen:api-docs:check being absent from ci.yml and from pnpm all does not leave that table unguarded. props-extract.mjs:405 collapses the multi-line TSDoc to single spaces, which is exactly what the one-line cell holds.
  • Another surface still asserting three spans. Refuted by grep: the changed assertion was the only span-count assertion in the repo, and the two raw-markup burgers (bulma-ui/src/layout/Hero.stories.tsx:254-259, eval/agent-loop/fixtures/bulma-app/src/components/SiteNavbar.tsx:24-27) already wrote four. No snapshot covers the burger. The count-agnostic wording in skills/bestax-migrate/references/bulma-classes/unmappables.md:165 and bestax-migrate/src/sources/bulma-classes/class-map.ts:1509 (renders its own spans) means no skills/ or codemod update is owed.
  • A consumer on a stylesheet whose mixin wants three. Refuted: bulma-ui/package.json:89 pins bulma ^1.0.4 as a direct dependency, so the lowest stylesheet a consumer resolves already carries the four-span nth-child rules; a hand-pinned 0.9.x CDN sheet sits outside the contract of a v1-only library.
  • A nested span inside children becoming a bar. Open, and correctly described rather than fixed: the compiled rule is the descendant selector .navbar-burger span (css/bulma.css:7501), not a child selector, so the wrapper span of an Icon passed as a child is styled as a bar too — which is what the phrase about every span in the burger says. Closing it would mean changing where children render, a public-API change rather than this patch.
  • Open — no automated surface can see the glyph regress. jsdom applies no Bulma CSS, so the new tests pin DOM shape only, and .navbar-burger is display: none above the desktop breakpoint (css/bulma.css:7744-7746), which the stories already acknowledge (Navbar.stories.tsx:390): BurgerOnly and BurgerActive render nothing at the Storybook default width. The docs live examples force display: flex (navbar.md:107,124) and do show it, so a human on the docs site is the only check on the rendered bars.

🏄 Two bars pretending to be three, and the open X covered for it the whole time — sneaky. The mixin says four, the geometry says 13/19/25, and now a test even holds the spans in line ahead of the kids. Clean set, paddle out. 🤙

@allxsmith

Copy link
Copy Markdown
Owner Author

Thanks for the fresh review. No change for the single advisory: as you note, the TSDoc sentence ("an extra span here draws an extra bar") holds, since a bar is drawn in both states. Closed, it just sits under the middle one. This round has nothing blocking and no open threads on the current head.

@allxsmith
allxsmith merged commit 8e4e1e6 into main Sep 27, 2026
30 checks passed
@allxsmith
allxsmith deleted the fix/755-navbar-burger-spans branch September 27, 2026 13:21
bestax-release-bot Bot pushed a commit that referenced this pull request Sep 27, 2026
## [5.16.10](https://github.com/allxsmith/bestax/compare/@allxsmith/bestax-bulma@5.16.9...@allxsmith/bestax-bulma@5.16.10) (2026-09-27)

### Bug Fixes

* **bestax-migrate:** carry the ref escape hatch onto plain tags, and cut the roster guard back ([3aee721](3aee721))
* **bestax-migrate:** flag every unmapped innerRef, and hold the carve-out to the library ([69f7773](69f7773))
* **bestax-migrate:** flag innerRef on a plain Navbar.Item, and test the roster's polarity ([bd5c403](bd5c403)), closes [#734](#734)
* **bestax-migrate:** keep JSX text, directives and quoted classes as written when reprinting ([c9f860b](c9f860b))
* **bestax-migrate:** keep one of each prop when Breadcrumb.Item merges onto its anchor ([7da699e](7da699e))
* **bestax-migrate:** keep one ref on a plain tag, and report what the Table.Container fold drops ([04044e3](04044e3))
* **bestax-migrate:** merge Breadcrumb.Item onto its anchor the way collapseOntoChild does ([e41e0fb](e41e0fb))
* **bestax-migrate:** name every ref-forwarding component in the codemod's TODOs ([4a32258](4a32258)), closes [pre-#661](https://github.com/pre-/issues/661) [#734](#734)
* **bestax-migrate:** report an older bestax-bulma the app already declares ([c2d67a6](c2d67a6))
* **bulma-ui:** keep menuitemcheckbox and menuitemradio items in Dropdown's arrow-key order ([#786](#786)) ([064155a](064155a))
* **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))
* **create-bestax:** say that the codemod flags an unmapped innerRef ([8778a04](8778a04))
* **create-bestax:** ship the corrected ref roster to scaffolded apps ([1e0ac82](1e0ac82)), closes [#661](#661) [#597](#597)
* **create-bestax:** stop the ref guidance over-claiming the form controls ([f920004](f920004)), closes [#666](#666)
* **create-bestax:** tell scaffolded apps the migrate skill covers raw Bulma classes ([3769180](3769180))
* **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))

### Features

* **bestax-mcp:** look up the bestax component and props for a Bulma class string ([4a4b246](4a4b246)), closes [#744](#744)
* **bestax-mcp:** say a Bulma field wraps its children only when horizontal ([929bc82](929bc82))
* **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-migrate:** add bulma-classes as a migration source ([c3603d1](c3603d1)), closes [#743](#743)
* **bestax-migrate:** convert .select and .breadcrumb with the element inside them ([d76c569](d76c569))
* **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 conditional classes in clsx and classnames calls ([8948cce](8948cce))
* **bestax-migrate:** fold .table-container and .fixed-grid into the component inside ([#761](#761)) ([72504f5](72504f5)), closes [#743](#743)
* **eslint-plugin:** add an opt-in rule for plain elements styled with a Bulma component class ([#750](#750)) ([0bb4d80](0bb4d80))
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 5.16.10 🎉

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.12.0](https://github.com/allxsmith/bestax/compare/bestax-migrate@2.11.0...bestax-migrate@2.12.0) (2026-09-27)

### Bug Fixes

* **bulma-ui:** keep menuitemcheckbox and menuitemradio items in Dropdown's arrow-key order ([#786](#786)) ([064155a](064155a))
* **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))

### Features

* **bestax-migrate:** convert conditional classes in clsx and classnames calls ([8948cce](8948cce))
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 2.12.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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] bulma-ui: Navbar.Burger renders three spans where Bulma v1's burger places four

1 participant