Skip to content

fix(bulma-ui): let Level.Item's anchor take the rest of an anchor's attributes - #675

Merged
allxsmith merged 10 commits into
mainfrom
fix/672-level-item-polymorphic
Sep 16, 2026
Merged

allxsmith merged 10 commits into
mainfrom
fix/672-level-item-polymorphic

Conversation

@allxsmith

@allxsmith allxsmith commented Sep 14, 2026 •

Copy link
Copy Markdown
Owner

The non-breaking half of #672. The rest is deferred — see below.

Important

Do not squash-merge. bestax-migrate/release.config.js opens with { scope: '!(bestax-migrate)', release: false }, so a fix(bulma-ui) squash commit would publish the library and silently suppress the codemod release. Rebase or merge commit.

What was wrong

LevelItemProps enumerated href, target and rel, so every other anchor attribute was a type error even on the anchor form:

<Level.Item as="a" download="f" />               // ❌ before
<Level.Item as="a" referrerPolicy="no-referrer" /> // ❌ before

Both are the literal symptom #641 reported.

AnchorOnlyAttributes subtracts React.HTMLAttributes from React.AnchorHTMLAttributes, so what the anchor form accepts is exactly what <a> adds — href, target, rel, download, hrefLang, ping, referrerPolicy, media, type — and it tracks React rather than this file. An earlier revision of this PR swapped the three-name list for a seven-name one; reviewers pointed out that still left media and type rejected, and still needed a human to notice the next one. A list gains an entry when someone notices; a subtraction gains it when React does.

Why enumerated rather than derived from as

Deriving them is the better shape and it is source-breaking, so it waits for the major.

This PR originally did derive them, by making Level.Item polymorphic through the shared ConstrainedPolymorphicComponentWithoutRef. That version was reviewed and reverted. It worked, and it broke three things — each verified by compiling identical probes against main and the branch:

  • <Dropdown.Item {...bag} /> where bag: DropdownItemProps<'button'> → TS2769. That component is already released. The break came from editing a shared helper, which a PR about Level.Item had no business touching.
  • const p: LevelItemProps = { onClick: e => … } → TS7006. Replacing extends HTMLAttributes<A | B | C> with a non-distributive Omit turns one handler over a union element into a union of three handler types, and contextual typing stops.
  • keyof ComponentProps<typeof Dropdown.Item> collapsed to the shared keys, so 'href' stopped being one.

None of that is needed to fix #641's symptom. What ships here cannot reach Dropdown.Item, changes no shared helper, and leaves every existing shape compiling — the spread round-trip, event handlers, ComponentProps, keyof, and React.memo, all asserted.

The half that is deferred

href and friends are declared at every as, so this still compiles:

<Level.Item as="p" download="f" />   // type-checks; renders a <p> without it

The type permits it and the runtime refuses it — the new attributes are withheld from any tag that is not an <a>, asserted in both directions. Making it a type error is what #672 keeps, under next-major, alongside #667 and #681.

The codemod half

TARGET_LINK_ATTRS records what a target declares when its props do not follow as. Level.Item was its only row, listing ['target'] — which would now strip a download the component accepts and write a TODO saying it was rejected.

Since the component carries the anchor's whole surface, a row naming every attribute decides nothing a row naming none does, so the row is gone and the existing sweep covers the target: every href-capable target without a row is asserted to accept every link attribute on its anchor. That does leave the rejectedBy = 'component' arm without a live caller — noted in the code as worth deleting rather than kept for a hypothetical.

Three shipped skill references stated the old claim verbatim and are corrected. Nothing catches that class of drift: the copies agree with each other, so skills-sync and the generators are green either way.

Filed from the review

Also fixed here

catchAllRow in the docs extractor read the props base with String.match and no /g, so a component whose base is a union of elements was described by whichever came first. Level.Item said "All standard <div> attributes" while rendering a <p> and an <a> too; Title and SubTitle lost their <p> the same way. Both generators call extractComponent, so the API pages and the MCP index were wrong together.

Verification

pnpm all green, check:conformance green, all four generators current, 1213 migrate tests, Level suite green with tests for forwarding and withholding — the withholding fixture supplies every attribute it asserts against, since checking four while passing two made two of them vacuous.

Non-breaking is measured, not asserted: the same probes compile against main and this branch with zero errors on both — event handlers, the spread round-trip, assignability to HTMLAttributes<HTMLDivElement>, ComponentProps/keyof/index access, React.memo, the released Dropdown.Item, and ordinary usage. Those probes now live in bulma-ui/src/__typetests__/polymorphic.tsx rather than in a scratch file, because the earlier revision of this PR broke five of them and a deleted probe proves nothing.

Summary by CodeRabbit

  • New Features

    • Level.Item now supports the full set of standard anchor attributes, including download, media, and type, when rendered as an anchor.
    • Anchor-only attributes remain excluded when rendered as another element.
    • Added a Storybook example demonstrating anchor-specific attributes.
  • Documentation

    • Updated component and migration guidance for anchor attributes and rendering behavior.
    • Clarified supported attributes for title and subtitle elements.
  • Tests

    • Added coverage for anchor attribute forwarding and non-anchor filtering.

Copilot AI balanced review requested due to automatic review settings September 14, 2026 23:00
@coderabbitai

coderabbitai Bot commented Sep 14, 2026 •

Copy link
Copy Markdown

Review Change StackReview Change Stack

Warning

Review limit reached

Next included review available in 27 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: d414f574-fb63-4b5a-ad49-4fb80482d9ba

📥 Commits

Reviewing files that changed from the base of the PR and between 1509f69 and b2a1405.

📒 Files selected for processing (3)
  • bestax-migrate/src/sources/_shared/polymorphic.ts
  • bulma-ui/src/layout/Level.tsx
  • scripts/props-extract.test.mjs

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: f44d1411-794a-498f-b3ea-c38985d2bc49

📥 Commits

Reviewing files that changed from the base of the PR and between e901f91 and 1509f69.

📒 Files selected for processing (14)
  • bestax-mcp/data/components/Level.json
  • bestax-mcp/data/components/SubTitle.json
  • bestax-mcp/data/components/Title.json
  • bestax-mcp/data/skills.json
  • bestax-migrate/src/sources/_shared/polymorphic.ts
  • bulma-ui/src/__typetests__/polymorphic.tsx
  • bulma-ui/src/layout/__tests__/Level.test.tsx
  • docs/docs/api/elements/subtitle.md
  • docs/docs/api/elements/title.md
  • docs/docs/api/layout/level.md
  • scripts/lib/props-extract.mjs
  • skills/bestax-migrate/references/bloomer/unmappables.md
  • skills/bestax-migrate/references/rbx/unmappables.md
  • skills/bestax-migrate/references/react-bulma-components/unmappables.md
🚧 Files skipped from review as they are similar to previous changes (6)
  • skills/bestax-migrate/references/rbx/unmappables.md
  • bulma-ui/src/layout/tests/Level.test.tsx
  • skills/bestax-migrate/references/bloomer/unmappables.md
  • bestax-mcp/data/components/Level.json
  • skills/bestax-migrate/references/react-bulma-components/unmappables.md
  • docs/docs/api/layout/level.md

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


Walkthrough

Level.Item now derives anchor-only props from React types, forwards them only for as="a", and removes them from non-anchor output. Tests, stories, migration guidance, documentation, and metadata reflect the updated behavior.

Changes

Level.Item anchor attributes

Layer / File(s) Summary
Anchor attribute forwarding
bulma-ui/src/layout/Level.tsx, bestax-migrate/src/sources/_shared/polymorphic.ts
LevelItemProps derives anchor-only attributes from React types, including media and type. Anchor rendering forwards the full prop set. Non-anchor rendering filters anchor-only names. Component-level link-attribute restrictions no longer apply to Level.Item.
Forwarding validation
bulma-ui/src/layout/__tests__/Level.test.tsx, bulma-ui/src/layout/Level.stories.tsx, bulma-ui/src/__typetests__/polymorphic.tsx, bestax-migrate/e2e/as-unions.test.ts
Tests verify anchor attribute typing, forwarding, and filtering. The AnchorItem story demonstrates anchor-specific attributes. The former Level.Item-specific negative type assertion is removed.
Migration and published metadata
scripts/lib/props-extract.mjs, skills/bestax-migrate/references/*/unmappables.md, docs/docs/api/layout/level.md, docs/docs/api/elements/{subtitle,title}.md, bestax-mcp/data/components/{Level,SubTitle,Title}.json, bestax-mcp/data/catalog.json, bestax-mcp/data/skills.json
Documentation describes the derived anchor attributes and paragraph attributes. Props extraction now includes all HTML element types in union bases. Catalog counts and reference byte counts are updated.

Priority: ⚪ Pending latest changes

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

Change: Bug fix · Severity of issue fixed: Medium

Suggested reviewers: claude

Merge Risk: ⚪ Minimal · up to 1509f

The documented Level.Item element surface now includes paragraph rendering alongside anchor and div support. No actionable merge-blocking risk remains.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning Issue #641 requires polymorphic props and ref types derived from as, rejection of invalid attributes for non-matching elements, and type-level coverage for Button, Navbar.Link, Navbar.Item, an… Implement the generic prop and ref model for every component in issue #641, including valid and invalid type-level tests for each listed component. Then satisfy the issue acceptance checks, including typecheck, test coverage, conformance, a…
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 2 functions across 9 files. (10 skipped: 1… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Out of Scope Changes check ✅ Passed The source change, runtime tests, migration updates, type tests, documentation, skill references, and generated outputs support the Level.Item anchor-attribute compatibility work or its generated re…
Title check ✅ Passed The title clearly identifies the primary change: allowing Level.Item anchors to receive the remaining anchor attributes.
Description check ✅ Passed The description gives a detailed summary, affected areas, linked issues, rationale, deferred scope, tests, documentation, and verification results. It does not reproduce the template headings or check…
Full details: Linked Issues check

Explanation

Issue #641 requires polymorphic props and ref types derived from as, rejection of invalid attributes for non-matching elements, and type-level coverage for Button, Navbar.Link, Navbar.Item, and Menu.Item. The reviewed changes modify only Level.Item. Its type tests explicitly preserve a non-polymorphic contract and defer deriving attributes from as. The required component coverage and invalid-attribute checks are not present.

Resolution

Implement the generic prop and ref model for every component in issue #641, including valid and invalid type-level tests for each listed component. Then satisfy the issue acceptance checks, including typecheck, test coverage, conformance, and regenerated documentation.

Full details: Docstring Coverage

Explanation

Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 2 functions across 9 files. (10 skipped: 10 unsupported.)

✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/672-level-item-polymorphic

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.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

The public props alias lacks the claimed compatibility tests, and migration test documentation remains stale.

Get a fresh assessment by requesting another Copilot review.

Pull request overview

Updates Level.Item so anchor variants accept native anchor attributes while preserving compatibility.

Changes:

  • Adds constrained polymorphic typing and type/story coverage.
  • Removes the obsolete migration exception.
  • Regenerates API and MCP documentation.
File summaries
File Description
docs/docs/api/layout/level.md Updates generated API documentation.
bulma-ui/src/layout/Level.tsx Adds polymorphic Level.Item props.
bulma-ui/src/layout/Level.stories.tsx Demonstrates anchor attributes.
bulma-ui/src/__typetests__/polymorphic.tsx Tests component-level typing.
bestax-migrate/src/sources/_shared/polymorphic.ts Removes the obsolete link-attribute exception.
bestax-migrate/e2e/as-unions.test.ts Tests the constrained as union by use.
bestax-mcp/data/components/Level.json Regenerates component metadata.
Review details
  • Files reviewed: 7/7 changed files
  • Comments generated: 2
  • Review effort level: Balanced

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

Comment thread bulma-ui/src/layout/Level.tsx Outdated
Comment thread bestax-migrate/src/sources/_shared/polymorphic.ts Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

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

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://298524cb.bestax.pages.dev

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

The new overload breaks existing ComponentProps and React.memo usage for non-default Level.Item elements.

Review details

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

bulma-ui/src/layout/Level.tsx:288

  • This cast's final derivation overload is pinned to 'div', so React.ComponentProps<typeof Level.Item> and React.memo(Level.Item) now reject as="p" and as="a". Previously LevelItem was React.FC<LevelItemProps>, whose prop type included all three tags, making this a source-breaking change in a patch described as non-breaking. Preserve a final derivation overload based on the whole-union LevelItemProps while retaining the generic overload for direct-call precision, and pin both ComponentProps and memo compatibility in the type tests.
  • Files reviewed: 8/8 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

Copilot AI review requested due to automatic review settings September 15, 2026 00:39
@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://633a7562.bestax.pages.dev

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

The new HOC-derived union loses element-specific prop correlation and accepts invalid attribute combinations.

Get a fresh assessment by requesting another Copilot review.

Review details
  • Files reviewed: 9/9 changed files
  • Comments generated: 1
  • Review effort level: Balanced

Comment thread bulma-ui/src/helpers/polymorphic.ts Outdated
Copilot AI review requested due to automatic review settings September 15, 2026 01:10
@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

The fallback overload accepts anchor-only props without as="a", and related shipped guidance is stale.

Review details

Suppressed comments (2)

Previously missed (1) — in code that hasn't changed since the last review.

bulma-ui/src/helpers/polymorphic.ts:174

  • This new constrained-HOC behavior leaves the shipped contributor guidance stale: skills/bestax-custom-component/references/library-contributor.md:130-132 still says React.memo collapses a constrained component onto its default element. bulma-ui/CLAUDE.md:30 requires guidance invalidated by a component change to be updated in the same PR.

bulma-ui/src/helpers/polymorphic.ts:179

  • This fallback overload makes as optional in every member of the Allowed union. Consequently <Level.Item download="f" /> (and the memoized equivalent) can match the anchor member even though runtime defaults to <div> and forwards download there. Keep as optional only for the default member and require it for every non-default member.
  (props: PolymorphicProps<Allowed, Own>): React.ReactElement | null;
  • Files reviewed: 9/9 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

Copilot AI review requested due to automatic review settings September 15, 2026 01:35
@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://6237d3f9.bestax.pages.dev

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

The derived union still accepts anchor-only properties without an explicit anchor as.

Get a fresh assessment by requesting another Copilot review.

Review details
  • Files reviewed: 11/11 changed files
  • Comments generated: 1
  • Review effort level: Balanced

Comment thread bulma-ui/src/helpers/polymorphic.ts Outdated
Copilot AI review requested due to automatic review settings September 15, 2026 01:43
@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

The generic overload still permits selecting a non-default element type without supplying as, causing the rendered element and accepted attributes to diverge.

Get a fresh assessment by requesting another Copilot review.

Review details
  • Files reviewed: 11/11 changed files
  • Comments generated: 2
  • Review effort level: Balanced

Comment thread bulma-ui/src/layout/Level.tsx Outdated
Comment thread bestax-migrate/e2e/as-unions.test.ts Outdated
Copilot AI review requested due to automatic review settings September 15, 2026 01:51
@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

The derived union remains non-exclusive, and shipped migration guidance still describes the removed exception.

Get a fresh assessment by requesting another Copilot review.

Review details
  • Files reviewed: 11/11 changed files
  • Comments generated: 1
  • Review effort level: Balanced

Comment thread bestax-migrate/src/sources/_shared/polymorphic.ts Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://7809a0c3.bestax.pages.dev

Both citations in the `HREF_OK` docblock pointed into files this PR rewrote, and
one had already rotted: `bulma-ui/src/layout/Level.tsx:227` now lands on a
comment terminator. The claims around them are still true, so the next reader
checking the premise behind this table would have found nothing and either
re-derived it or deleted a correct note.

A symbol survives an edit above it; a line number does not.

Refs #672

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

The runtime filter can drift from its derived type, and the extractor fix lacks a focused regression test.

Get a fresh assessment by requesting another Copilot review.

Review details

Suppressed comments (2)

Previously missed (1) — in code that hasn't changed since the last review.

bulma-ui/src/layout/Level.tsx:168

  • rel is already declared by React.HTMLAttributes, so this Omit removes it from AnchorOnlyAttributes. Listing it as an attribute supplied by this alias misstates the type and contradicts the migration code's explanation that rel is global; clarify that it remains available through the other base interface.

This issue also appears on line 255 of the same file.

bulma-ui/src/layout/Level.tsx:265

  • The public type now gains new anchor-only keys automatically from React, but this filter remains an unchecked manual list. After such a type update, a new key would compile on as="p" and leak to the <p>, violating the documented withholding guarantee. Make the runtime map statically exhaustive against keyof AnchorOnlyAttributes (plus the deliberately stripped global rel) so type checking forces the two surfaces to stay synchronized.
  const ANCHOR_ONLY = [
    'href',
    'target',
    'rel',
    'download',
    'hrefLang',
    'ping',
    'referrerPolicy',
    'media',
    'type',
  ] as const;
  • Files reviewed: 18/18 changed files
  • Comments generated: 1
  • Review effort level: Balanced

Comment thread scripts/lib/props-extract.mjs
Copilot AI review requested due to automatic review settings September 16, 2026 02:42
@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://64b49c4c.bestax.pages.dev

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

The runtime attribute list can drift from its derived type, and the extractor fix lacks a direct regression test.

Review details

Suppressed comments (3)

Previously missed (2) — in code that hasn't changed since the last review.

bulma-ui/src/layout/Level.tsx:265

  • This manually maintained array can drift from the derived AnchorOnlyAttributes, recreating the failure mode the subtraction is intended to prevent: a future React anchor key would become accepted at every as but would leak onto <div>/<p> because it is absent here. Make this an exhaustive keyed object such as Record<keyof AnchorOnlyAttributes | 'rel', true> and filter with key in ANCHOR_ONLY, so an upstream type addition causes a compile-time failure until runtime filtering is updated.
    bulma-ui/src/layout/Level.tsx:168
  • rel is not part of this derived type: this repository's React contract explicitly treats rel as a member of HTMLAttributes (see components/Dropdown.tsx:415-419 and bestax-migrate/e2e/as-unions.test.ts:350-352), so the Omit removes it. LevelItemProps still accepts rel through its HTMLAttributes base, but this documentation currently misstates what AnchorOnlyAttributes contains.

scripts/lib/props-extract.mjs:1198

  • The new multi-element extraction path has no direct regression test. scripts/props-extract.test.mjs already pins several catch-all contracts, but none asserts the Level/Title union output, so a return to first-match behavior could be accepted simply by regenerating the currently checked-in docs and MCP data. Add an extractor test that expects every element in one of these union bases.
    for (const m of e.text.matchAll(/HTML\w*Element/g)) {
      elements.add(DOM_ELEMENT_LABELS[m[0]] ?? 'HTML');
    }
  • Files reviewed: 18/18 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

The extractor fix had only the regenerated pages as evidence, and those are not
a guard: a one-match implementation regenerates them just as incomplete, and
`gen:api-docs:check` calls that fresh. `Level.Item` must name its `<a>`, `<div>`
and `<p>`, and `Title`/`SubTitle` their `<p>`.

Refs #672
Copilot AI review requested due to automatic review settings September 16, 2026 02:51
@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://5fa4281c.bestax.pages.dev

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

The behavior is comprehensively covered and generated surfaces are synchronized; only a minor inline documentation correction remains.

Review details

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

bulma-ui/src/layout/Level.tsx:168

  • rel is not produced by this subtraction: as the migration code notes, React declares it on HTMLAttributes, so AnchorOnlyAttributes excludes it. Listing it here as anchor-only contradicts the actual type and obscures why the runtime filter treats rel as a separate compatibility case.
  • Files reviewed: 19/19 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

The type was derived and the runtime filter was a hand-written array beside it,
which drifts in the one direction that matters: the day React adds an anchor
attribute, `AnchorOnlyAttributes` accepts it at every `as` while the array lets
it leak onto a `<div>`. That is the failure mode the subtraction was chosen to
prevent, reintroduced two lines below it.

`Record<keyof AnchorOnlyAttributes | 'rel', true>` makes an upstream addition a
compile error here until the filter catches up — verified by removing a key and
watching `tsc` name it.

`rel` is separate on purpose, and the docblock claimed otherwise: React declares
it on `HTMLAttributes`, so the subtraction removes it. This component withholds
it from a non-anchor because it always has, which is a compatibility decision
rather than a fact about anchors — now stated where each name comes from.

Refs #672
Copilot AI review requested due to automatic review settings September 16, 2026 03:11

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

The compatibility-preserving implementation is consistently documented and covered across runtime, types, migrations, and generated outputs.

Review details
  • Files reviewed: 19/19 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://129a1fc3.bestax.pages.dev

@allxsmith
allxsmith merged commit 59e8e34 into main Sep 16, 2026
13 checks passed
@allxsmith
allxsmith deleted the fix/672-level-item-polymorphic branch September 16, 2026 03:21
bestax-release-bot Bot pushed a commit that referenced this pull request Sep 16, 2026
## [5.15.3](https://github.com/allxsmith/bestax/compare/@allxsmith/bestax-bulma@5.15.2...@allxsmith/bestax-bulma@5.15.3) (2026-09-16)

### Bug Fixes

* **bulma-ui:** let Level.Item's anchor take the rest of an anchor's attributes ([#675](#675)) ([59e8e34](59e8e34))
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 5.15.3 🎉

The release is available on:

Your semantic-release bot 📦🚀

bestax-release-bot Bot pushed a commit that referenced this pull request Sep 16, 2026
## [2.3.4](https://github.com/allxsmith/bestax/compare/bestax-migrate@2.3.3...bestax-migrate@2.3.4) (2026-09-16)

### Bug Fixes

* **bulma-ui:** let Level.Item's anchor take the rest of an anchor's attributes ([#675](#675)) ([59e8e34](59e8e34))
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 2.3.4 🎉

The release is available on:

Your semantic-release bot 📦🚀

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

### Bug Fixes

* **bestax-mcp:** restamp the index after the valid-values docs edit ([ff4512a](ff4512a)), closes [#521](#521)
* **bestax-migrate:** a spread hides the element, not the component ([7f88614](7f88614))
* **bestax-migrate:** an anchor cannot wrap an element whose parent is fixed ([1e2e78b](1e2e78b)), closes [#663](#663)
* **bestax-migrate:** an anchor may not wrap interactive content either ([5637976](5637976)), closes [#663](#663)
* **bestax-migrate:** announce the one removal that was still silent ([9f2e3ac](9f2e3ac))
* **bestax-migrate:** apply the nested-anchor rule on the plain-markup path too ([ba27e3a](ba27e3a)), closes [#663](#663)
* **bestax-migrate:** bound the link attributes by the component too, not just the element ([ca54273](ca54273))
* **bestax-migrate:** decide the href from the element, not the leftovers ([87ccb17](87ccb17)), closes [#662](#662)
* **bestax-migrate:** do not advise nesting an <a> inside an element that holds none ([156c793](156c793)), closes [#663](#663)
* **bestax-migrate:** drop an href on the targets that declare none ([478f7a4](478f7a4)), closes [#662](#662)
* **bestax-migrate:** give the TODO the remedy that works on the target it names ([fccb4d9](fccb4d9))
* **bestax-migrate:** judge every link attribute against the element, not as a group ([1825b9e](1825b9e)), closes [#368](#368)
* **bestax-migrate:** judge props against the component they will end up on ([f0241e4](f0241e4))
* **bestax-migrate:** keep a TODO on one line, and correct the link-attribute table ([581833e](581833e))
* **bestax-migrate:** keep an href the plain tag takes, and quieten the shadow TODO ([e78ced2](e78ced2))
* **bestax-migrate:** keep href on the anchor, and as inside its union ([894a633](894a633)), closes [#641](#641) [#662](#662) [#662](#662)
* **bestax-migrate:** keep the href `Dropdown.Item` now takes ([e261cdd](e261cdd)), closes [#663](#663)
* **bestax-migrate:** only rbx's spread can carry an `as` ([84a6f85](84a6f85))
* **bestax-migrate:** plain markup keeps the href its own tag accepts ([8dc9b0c](8dc9b0c))
* **bestax-migrate:** read iframe and label off their own content models ([6612821](6612821)), closes [#663](#663)
* **bestax-migrate:** read the element a target renders, not the type it declares ([7296a50](7296a50))
* **bestax-migrate:** read the element before advising an <a> inside it ([88a95a3](88a95a3)), closes [#663](#663)
* **bestax-migrate:** run the link cleanup on react-bulma-components' plain rewrites too ([8ea05cb](8ea05cb))
* **bestax-migrate:** say where the two link rules disagree, not that they agree ([8468858](8468858)), closes [#682](#682)
* **bestax-migrate:** stop conflating the two directions an anchor can be invalid ([c7dac64](c7dac64)), closes [#663](#663)
* **bestax-migrate:** take the anchor's other attributes with it, and stop guessing at a falsy href ([9382e4a](9382e4a))
* **bestax-migrate:** the component and the element must both allow the attribute ([c009e85](c009e85))
* **bestax-migrate:** trust an `as` a spread cannot overwrite, and stop three messages lying ([19fdb09](19fdb09))
* **bestax-migrate:** white-bis and white-ter are bestax colours now ([d951c2f](d951c2f))
* **bestax-migrate:** widen the element universe until it disagreed, and fix the Delete hint ([4979d94](4979d94))
* **bulma-ui:** accept no children on Avatar, rather than deriving them from `as` ([a8897d2](a8897d2)), closes [#665](#665)
* **bulma-ui:** apply the custom-element and event guards consistently ([cc8818c](cc8818c))
* **bulma-ui:** carry the deprecated `icon` path through every consumer of IconProps ([b8eb722](b8eb722)), closes [#663](#663)
* **bulma-ui:** catch the other shape a declaration specifier can take ([4f69e20](4f69e20))
* **bulma-ui:** correct the sibling claim, and make the strip set's type check it ([7ffa0e7](7ffa0e7)), closes [#682](#682)
* **bulma-ui:** declare backgroundColor unavailable, and check the whole class ([daf636a](daf636a))
* **bulma-ui:** declare the deprecated `icon` path `Icon` still honours ([80124d1](80124d1)), closes [#663](#663)
* **bulma-ui:** define the kept props instead of assigning them ([b5722f2](b5722f2)), closes [#682](#682)
* **bulma-ui:** give the constants subpath a CommonJS types target ([e97d609](e97d609))
* **bulma-ui:** keep DropdownItemProps accepting every tag it always accepted ([d621b88](d621b88)), closes [#667](#667) [#667](#667) [#667](#667) [#663](#663) [#667](#667)
* **bulma-ui:** keep React's own node shapes out of the icon-props branch ([638e329](638e329)), closes [#663](#663)
* **bulma-ui:** keep stripping disabled where the element does not own it ([afd94a7](afd94a7))
* **bulma-ui:** keep the button default against a spread, and tag the deprecated props ([fcc148b](fcc148b)), closes [#663](#663)
* **bulma-ui:** keep the form attributes an `as="input"` owns ([3ae7bd8](3ae7bd8))
* **bulma-ui:** leave custom elements out of the built-in attribute backstops ([94f6f48](94f6f48))
* **bulma-ui:** let Dropdown.Item's props follow its constrained `as` ([f9c998f](f9c998f)), closes [#663](#663)
* **bulma-ui:** let Level.Item's anchor take the rest of an anchor's attributes ([#675](#675)) ([59e8e34](59e8e34))
* **bulma-ui:** make props and refs follow the polymorphic `as` ([7528d87](7528d87)), closes [#188](#188) [#641](#641)
* **bulma-ui:** match a spread's enumerability, and close the `type` gap ([84b5cd2](84b5cd2)), closes [#682](#682)
* **bulma-ui:** publish only the polymorphic types, and keep role="img" without an href ([b0c8dfe](b0c8dfe))
* **bulma-ui:** reject the LinkButton props Button eats, and split a conflated assertion ([b0c7a16](b0c7a16))
* **bulma-ui:** restore union `as`, and stop the props type collapsing to any ([dfec253](dfec253)), closes [#641](#641)
* **bulma-ui:** scope the two attribute filters independently ([d132427](d132427)), closes [#663](#663)
* **bulma-ui:** stop a Dropdown.Item button submitting the form it sits in ([a27f0d6](a27f0d6)), closes [#663](#663)
* **bulma-ui:** stop Avatar widening to every element, and forward custom props ([74f452b](74f452b)), closes [#661](#661) [#641](#641)
* **bulma-ui:** stop guessing which attributes a target element owns ([9baafe9](9baafe9)), closes [#641](#641)
* **bulma-ui:** stop stripping attributes the target element accepts ([65800e8](65800e8))
* **bulma-ui:** stop the color exclusion reaching custom targets, and guard the disabled blocker ([3299b54](3299b54)), closes [#665](#665)
* **bulma-ui:** stop the ref cells naming a type parameter no page declares ([5931850](5931850))
* **bulma-ui:** strip only the keys a caller named, and correct three claims ([7747335](7747335)), closes [#682](#682) [#682](#682)
* **bulma-ui:** test the icon-config shape, and keep one copy of the guard ([f8c9c5b](f8c9c5b)), closes [#663](#663)
* **bulma-ui:** the eight smaller defects review found in [#661](#661) ([a6df70f](a6df70f))
* **bulma-ui:** treat optionality modifiers as unsupported, and correct two contracts ([9ca5de9](9ca5de9))
* **bulma-ui:** warn on the new white shades as component modifiers ([7c617a6](7c617a6))
* **bulma-ui:** withhold an href from a Dropdown.Item that is not an anchor ([f597cf2](f597cf2)), closes [#667](#667) [#667](#667) [#663](#663)
* **create-bestax:** ship the polymorphic `as` guidance to scaffolded apps ([4aa322c](4aa322c)), closes [#641](#641)
* **eslint-plugin:** a `true` display no longer buys silence on inert flex props ([a350ba8](a350ba8))
* **eslint-plugin:** a readable null is still nullish ([30ef3de](30ef3de))
* **eslint-plugin:** guard the textColor rewrite the way replacements are guarded ([a4028ec](a4028ec))
* **eslint-plugin:** judge only the JSX attribute that wins ([fc740d1](fc740d1)), closes [#686](#686) [#678](#678)
* **eslint-plugin:** judge only the values a spread cannot overwrite ([0b8d61e](0b8d61e))
* **eslint-plugin:** make the preset lint, and stop the fixes breaking code ([f39e49b](f39e49b))
* **eslint-plugin:** make the preset's file glob honest about its parser ([59d1a54](59d1a54))
* **eslint-plugin:** membership-test the shade before naming the class ([58599d1](58599d1))
* **eslint-plugin:** report both spellings of a `true` helper value ([ed3ddf9](ed3ddf9))
* **eslint-plugin:** stop reporting `radius` on Theme, which is a CSS variable ([b326ce5](b326ce5))
* **eslint-plugin:** stop three autofixes changing what renders ([4853aa5](4853aa5))
* **eslint-plugin:** withhold the color fix when the name is doubled ([85fd556](85fd556))

### Features

* **bulma-ui:** add ./constants subpath export ([595cf3e](595cf3e))
* **bulma-ui:** add the white-bis and white-ter colours the CSS already ships ([0597580](0597580))
* **bulma-ui:** export the other-helper value tuples ([1346973](1346973))
* **eslint-plugin:** add @allxsmith/eslint-plugin-bestax ([790d4e9](790d4e9)), closes [#350](#350)
* **eslint-plugin:** check the other-helper props now that they have tuples ([15fced4](15fced4))
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 1.2.5 🎉

The release is available on:

Your semantic-release bot 📦🚀

bestax-release-bot Bot pushed a commit that referenced this pull request Sep 20, 2026
# 1.0.0 (2026-09-20)

* feat(bulma-ui)!: remove bestax-bulma-prefixed CSS variant ([94baa34](https://github.com/allxsmith/bestax/commit/94baa3489ac54587e6026a8bece9f86816af9372))
* feat(create-bestax)!: require Node.js 18+ and align with bestax-bulma v2 ([#118](https://github.com/allxsmith/bestax/issues/118)) ([b22f183](https://github.com/allxsmith/bestax/commit/b22f183acfa2f0fa6e50b9cd399ca7cd9ac67f94))

### Bug Fixes

* add comprehensive rules to prevent bulma-ui versioning on non-bulma-ui commits ([#122](https://github.com/allxsmith/bestax/issues/122)) ([525ccfa](https://github.com/allxsmith/bestax/commit/525ccfa7beff0e46fdbc5c2e25603e562baabd67)), closes [#119](https://github.com/allxsmith/bestax/issues/119)
* **bestax-mcp:** add the README badge block and regenerate the index ([58d4974](https://github.com/allxsmith/bestax/commit/58d4974c4f7949bc303afef27d678c6e54882a1a))
* **bestax-mcp:** carry each CSS variable's declaring scope in the index ([79a5b2c](https://github.com/allxsmith/bestax/commit/79a5b2c9e9eccfd34e54a6d53375972f4b15021c))
* **bestax-mcp:** declare @allxsmith/bestax-bulma as a dependency ([#649](https://github.com/allxsmith/bestax/issues/649)) ([04076c3](https://github.com/allxsmith/bestax/commit/04076c34596bb4285955b96e7ef2e06dcad3deb9)), closes [#537](https://github.com/allxsmith/bestax/issues/537) [#644](https://github.com/allxsmith/bestax/issues/644)
* **bestax-mcp:** derive the near-miss guidance from the skill, and only when it helps ([1141cca](https://github.com/allxsmith/bestax/commit/1141ccad60459038485b13b4841fb125f904be6b))
* **bestax-mcp:** do not split a helper-prop table cell on an escaped pipe ([bdac820](https://github.com/allxsmith/bestax/commit/bdac8207db46f2402ad6b765500be8a3af066095))
* **bestax-mcp:** keep URL fragments when attributing docs links ([1ef43ce](https://github.com/allxsmith/bestax/commit/1ef43ce5c11e30eee4eb6e8dab65058baa4f8c59))
* **bestax-mcp:** lead get_helper_props with the inline-style prohibition ([ffc627a](https://github.com/allxsmith/bestax/commit/ffc627a9ddc3f32bc823bfbc875558d1e2e18291))
* **bestax-mcp:** make list_components point at the next step ([8ddb2fd](https://github.com/allxsmith/bestax/commit/8ddb2fdacd94e45c8e97adbbe7f5844bf98b4b46))
* **bestax-mcp:** make tests and cached builds work from a clean checkout ([6e63820](https://github.com/allxsmith/bestax/commit/6e6382007dadce9964c86ba8d29deedb11ae2777)), closes [bestax-mcp#build](https://github.com/bestax-mcp/issues/build)
* **bestax-mcp:** name list_components as the entry point, not search_bestax ([206380b](https://github.com/allxsmith/bestax/commit/206380b209a0d5d89b25477ff2fab6806f55ac70))
* **bestax-mcp:** name the three near-miss components in the list_components footer ([1c7af67](https://github.com/allxsmith/bestax/commit/1c7af673cf9ba3cbd48fb6bd1cb979f80e940ba4))
* **bestax-mcp:** note source order beside matched-specificity advice ([e8d960f](https://github.com/allxsmith/bestax/commit/e8d960f5b151c6b94d3b9069126ef1665ee20f02))
* **bestax-mcp:** regenerate data index for Theme shadow vars change ([bc631b9](https://github.com/allxsmith/bestax/commit/bc631b904160fe017541247391291c6707b7b5fb))
* **bestax-mcp:** release the index carrying the background-click correction ([673adcd](https://github.com/allxsmith/bestax/commit/673adcd149b4dbf67b3b2ea32f2116dcc0899dcb))
* **bestax-mcp:** release the index carrying the corrected examples ([51a5828](https://github.com/allxsmith/bestax/commit/51a5828b285d3a9685a280b241338f503d553963))
* **bestax-mcp:** release the index carrying the corrected Modal guidance ([5c7eb18](https://github.com/allxsmith/bestax/commit/5c7eb188d6ab3377ff263428d97b8aa3e83a5e70))
* **bestax-mcp:** release the index carrying the corrected rbc Modal guidance ([6903aa3](https://github.com/allxsmith/bestax/commit/6903aa3ed92a75f515feea8ed48a80ef475c2e19))
* **bestax-mcp:** release the index carrying the corrected ref guidance ([6722933](https://github.com/allxsmith/bestax/commit/67229333e0e8b8793609e93b927aa7e7ff3245d4))
* **bestax-mcp:** release the index carrying the Modal.Container ref mapping ([6e0d3da](https://github.com/allxsmith/bestax/commit/6e0d3dac2e7f03b5454b4f30cad2b6cb5e11cec4))
* **bestax-mcp:** release the index carrying the ref docs and corrected guidance ([fcf0c95](https://github.com/allxsmith/bestax/commit/fcf0c95be0c31ce04fffc46e6e3d5b07cc9b7b00))
* **bestax-mcp:** release the regenerated index carrying the new ref definitions ([9845b53](https://github.com/allxsmith/bestax/commit/9845b53dbefba8eb65b193da9309cc79e1fc19be))
* **bestax-mcp:** restamp the index after the valid-values docs edit ([ff4512a](https://github.com/allxsmith/bestax/commit/ff4512a8d50cda3cab53d6b1877b5cf2eec472c1)), closes [#521](https://github.com/allxsmith/bestax/issues/521)
* **bestax-mcp:** route helper questions to the tool that answers them ([cd6ce12](https://github.com/allxsmith/bestax/commit/cd6ce124a1ab856896579d9b00965cbe295523ed))
* **bestax-mcp:** validate the one input that is not ours, and bound the rest ([3e1adc9](https://github.com/allxsmith/bestax/commit/3e1adc9bb0c9d1064d66cf55e55dd75f90158c39))
* **bestax-migrate:** a spread hides the element, not the component ([7f88614](https://github.com/allxsmith/bestax/commit/7f88614df21ad40d0ec28a4458070e777f181051))
* **bestax-migrate:** add the OpenSSF Best Practices badge to the README ([0f35c2e](https://github.com/allxsmith/bestax/commit/0f35c2e6cece9b76a274023224b87fb2d903da0e))
* **bestax-migrate:** address the PR [#613](https://github.com/allxsmith/bestax/issues/613) review round ([7faf2d8](https://github.com/allxsmith/bestax/commit/7faf2d86ee564e92e17c1cacd51f685471e517f9))
* **bestax-migrate:** address the second review round on PR [#613](https://github.com/allxsmith/bestax/issues/613) ([df222c3](https://github.com/allxsmith/bestax/commit/df222c3ea924900842d209e8165c3071c2f8b110))
* **bestax-migrate:** address the third review round on PR [#613](https://github.com/allxsmith/bestax/issues/613) ([92fc2a0](https://github.com/allxsmith/bestax/commit/92fc2a04b55d6b2c1c2083b3cf951300c41bbfcb))
* **bestax-migrate:** align the modal docblock with the advisory it explains ([f9130fe](https://github.com/allxsmith/bestax/commit/f9130fe7eeda31b22d6464d11b481d1876204cdc))
* **bestax-migrate:** align the rbx fixture and e2e comments with the advisory ([1f71d4e](https://github.com/allxsmith/bestax/commit/1f71d4ee4f2c1317c65eb59935b0226e5800c0f4))
* **bestax-migrate:** an anchor cannot wrap an element whose parent is fixed ([1e2e78b](https://github.com/allxsmith/bestax/commit/1e2e78b0508ba9b825411b5a070a188aba74b4a6)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bestax-migrate:** an anchor may not wrap interactive content either ([5637976](https://github.com/allxsmith/bestax/commit/5637976a9f734f98e62ea45a7ea1089630eb92e8)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bestax-migrate:** announce the one removal that was still silent ([9f2e3ac](https://github.com/allxsmith/bestax/commit/9f2e3acd544b22e84faf89754be7e8822451cff1))
* **bestax-migrate:** apply the nested-anchor rule on the plain-markup path too ([ba27e3a](https://github.com/allxsmith/bestax/commit/ba27e3a9108fc673f147a37312e8a15d06a46449)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bestax-migrate:** bound the link attributes by the component too, not just the element ([ca54273](https://github.com/allxsmith/bestax/commit/ca54273b148ea763c7d0e7ba2cb184bd807f122f))
* **bestax-migrate:** close seven defects found reviewing the rbx source ([c2147d9](https://github.com/allxsmith/bestax/commit/c2147d9935e45c8a59344ed2a95fc390fa2e94f9))
* **bestax-migrate:** close two false-exemption paths in the publish classifier ([e76c592](https://github.com/allxsmith/bestax/commit/e76c592abc03587ead58f84c5954d23ea407581a)), closes [#412](https://github.com/allxsmith/bestax/issues/412) [#412](https://github.com/allxsmith/bestax/issues/412)
* **bestax-migrate:** colocate the shell-quoting contract and narrow the exemption ([de4a299](https://github.com/allxsmith/bestax/commit/de4a299422ed281b924086e01613e46fb61c2e1d)), closes [#435](https://github.com/allxsmith/bestax/issues/435)
* **bestax-migrate:** correct the forwardRefAs TODO's list of ref-forwarding components ([76d6d6a](https://github.com/allxsmith/bestax/commit/76d6d6ad967eb02528d4d077e869db2025ab4651))
* **bestax-migrate:** correct the Navbar dropdown target and doc drift ([dee9f08](https://github.com/allxsmith/bestax/commit/dee9f08640e34046446d5dd9157f10e96810ac70))
* **bestax-migrate:** correct the rbc domRef guidance for the newly forwarded refs ([f93c844](https://github.com/allxsmith/bestax/commit/f93c844da57b463f28f09f2bd75ea45dcf8d69e7))
* **bestax-migrate:** correct the rbc Modal guidance the compound form contradicts ([76e62d0](https://github.com/allxsmith/bestax/commit/76e62d02dd94c7f239a127bdf806c8847103b392))
* **bestax-migrate:** correct the rbx closeOnBlur claim about background clicks ([8ccae65](https://github.com/allxsmith/bestax/commit/8ccae65cdb44e3a9eb8cd964e4a569b83e249e65))
* **bestax-migrate:** correct the rbx Modal guidance that bulma-ui outgrew ([ae62415](https://github.com/allxsmith/bestax/commit/ae62415fe32a79c773b08c0f4293a81a60436726)), closes [#633](https://github.com/allxsmith/bestax/issues/633)
* **bestax-migrate:** decide the href from the element, not the leftovers ([87ccb17](https://github.com/allxsmith/bestax/commit/87ccb17a2847e22e592840bb36b4e41552888a34)), closes [#662](https://github.com/allxsmith/bestax/issues/662)
* **bestax-migrate:** declare @allxsmith/bestax-bulma as a dependency ([#650](https://github.com/allxsmith/bestax/issues/650)) ([2094d9b](https://github.com/allxsmith/bestax/commit/2094d9b55b1bf0253944b4da5fb107266f0b346c)), closes [#537](https://github.com/allxsmith/bestax/issues/537) [#644](https://github.com/allxsmith/bestax/issues/644)
* **bestax-migrate:** disambiguate Navbar.Dropdown in the forwardRefAs advisory ([242e3d4](https://github.com/allxsmith/bestax/commit/242e3d4514cc1f049fee2d1032c00e2d5cb84716))
* **bestax-migrate:** do not advise nesting an <a> inside an element that holds none ([156c793](https://github.com/allxsmith/bestax/commit/156c7938f076ff9aa8fba49d3ebbaa76101b59ab)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bestax-migrate:** drain the Copilot backlog — 9 findings ([34b75ad](https://github.com/allxsmith/bestax/commit/34b75ade0f06ff90b13c48d8d9ab9a22964d8c49))
* **bestax-migrate:** drop an href on the targets that declare none ([478f7a4](https://github.com/allxsmith/bestax/commit/478f7a42d6413773f9dbe20b42b2b17b72016bed)), closes [#662](https://github.com/allxsmith/bestax/issues/662)
* **bestax-migrate:** fix the alias collision in react-bulma-components too ([9d8219b](https://github.com/allxsmith/bestax/commit/9d8219bb906e86a12249d979dc9af9fe64124f7e))
* **bestax-migrate:** flag dropped RBC deep partials instead of losing their CSS ([7db47db](https://github.com/allxsmith/bestax/commit/7db47db794c6a8960718e0b12a163bd56d6cc8c2))
* **bestax-migrate:** flag labelled dividers, parse pre-1.0 ranges, match require.resolve ([794e0a7](https://github.com/allxsmith/bestax/commit/794e0a726731384fd6c4b2ce632b1bf46d558450))
* **bestax-migrate:** flag the Modal behaviours bestax does not implement ([5f37135](https://github.com/allxsmith/bestax/commit/5f371355aa50be600e9e66cd47fbecf1638cf886))
* **bestax-migrate:** four more findings that arrived mid-pass ([d637083](https://github.com/allxsmith/bestax/commit/d637083378c0ba7d7f0195ca0d9e681f6afdcf30))
* **bestax-migrate:** give the kitchen-sink e2e a per-process scratch dir ([2211ea5](https://github.com/allxsmith/bestax/commit/2211ea514475f6cc2de7c60c1433b1797cb02199))
* **bestax-migrate:** give the TODO the remedy that works on the target it names ([fccb4d9](https://github.com/allxsmith/bestax/commit/fccb4d959328db8cf7e662d9ff4457ac1f55dda6))
* **bestax-migrate:** guard prepack, which npm pack runs and prepublishOnly does not ([830c621](https://github.com/allxsmith/bestax/commit/830c621efa4f3df1b57de9fd55dec57b07a44546)), closes [#412](https://github.com/allxsmith/bestax/issues/412) [pre-#436](https://github.com/pre-/issues/436)
* **bestax-migrate:** judge every link attribute against the element, not as a group ([1825b9e](https://github.com/allxsmith/bestax/commit/1825b9ef3e6f5bfcd77bb4cdc2450b2ab6b95400)), closes [#368](https://github.com/allxsmith/bestax/issues/368)
* **bestax-migrate:** judge props against the component they will end up on ([f0241e4](https://github.com/allxsmith/bestax/commit/f0241e4d082e3a291038112fb757c7f244061948))
* **bestax-migrate:** keep a namespace import referenced as a value ([2feca47](https://github.com/allxsmith/bestax/commit/2feca47aff22b211f6c6d6b6d84844aa74b122c5)), closes [#4](https://github.com/allxsmith/bestax/issues/4)
* **bestax-migrate:** keep a TODO on one line, and correct the link-attribute table ([581833e](https://github.com/allxsmith/bestax/commit/581833ee9433079873b211ab03f87f2dac0ad95d))
* **bestax-migrate:** keep an href the plain tag takes, and quieten the shadow TODO ([e78ced2](https://github.com/allxsmith/bestax/commit/e78ced2a22b36555581c67ab4b8e9da650742cd7))
* **bestax-migrate:** keep dynamic Heading props and never drop them in the collapse ([8a076c0](https://github.com/allxsmith/bestax/commit/8a076c04764741a11ce95e12aba0e53220e9caf1))
* **bestax-migrate:** keep href on the anchor, and as inside its union ([894a633](https://github.com/allxsmith/bestax/commit/894a6334f55c59b829427c8ce73f444e1eb55a51)), closes [#641](https://github.com/allxsmith/bestax/issues/641) [#662](https://github.com/allxsmith/bestax/issues/662) [#662](https://github.com/allxsmith/bestax/issues/662)
* **bestax-migrate:** keep subtitle class when literal subtitle collapses with heading ([85c4e91](https://github.com/allxsmith/bestax/commit/85c4e91dccf2d1eb136d06543518e5a356981411))
* **bestax-migrate:** keep the domRef advice off the Delete that Button becomes ([617fbb6](https://github.com/allxsmith/bestax/commit/617fbb62636ff09db5484e52d4f31c67f297306e))
* **bestax-migrate:** keep the href `Dropdown.Item` now takes ([e261cdd](https://github.com/allxsmith/bestax/commit/e261cddc88566377bccccdbeb3d2a7466d919409)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bestax-migrate:** key aliases by scope and reserve retained partial roots ([402a950](https://github.com/allxsmith/bestax/commit/402a950e6a997bfcb2072e9ff759df358727b32e))
* **bestax-migrate:** key the publish guard on the packer, not on an inherited agent ([cf49058](https://github.com/allxsmith/bestax/commit/cf49058ccad10190c2b2bf6dac81ec8d3e07f326)), closes [#412](https://github.com/allxsmith/bestax/issues/412)
* **bestax-migrate:** let a nearer binding win over a shadowed alias ([0c45ff3](https://github.com/allxsmith/bestax/commit/0c45ff3c8f8c71e5df57b6c9e6999bf506e7d111))
* **bestax-migrate:** map rbx innerRef to ref on Button/Dropdown/Modal/Navbar ([5207a79](https://github.com/allxsmith/bestax/commit/5207a791b3a157993b9758d77ab04d11e4a98e2a))
* **bestax-migrate:** migrate component references through a namespace import ([aaef103](https://github.com/allxsmith/bestax/commit/aaef10347f6c451870e7385d0085bb9eaa802f81))
* **bestax-migrate:** name the wire caps and pin them to the worker ([06b3653](https://github.com/allxsmith/bestax/commit/06b3653c5489e5f35bdc082c8dac476eef173de2))
* **bestax-migrate:** only convert Button remove to Delete on a true literal ([2ee5d0b](https://github.com/allxsmith/bestax/commit/2ee5d0bb78e6e31d6b6f1b24c814c4367d10bf5f)), closes [#553](https://github.com/allxsmith/bestax/issues/553)
* **bestax-migrate:** only rbx's spread can carry an `as` ([84a6f85](https://github.com/allxsmith/bestax/commit/84a6f8510ec5e2f711864430870358b4433816a1))
* **bestax-migrate:** parenthesize comma-valued folded Sass variables ([5a7b052](https://github.com/allxsmith/bestax/commit/5a7b05284f3faa870c6305b0a02556e53851e93a)), closes [#554](https://github.com/allxsmith/bestax/issues/554)
* **bestax-migrate:** pick Heading target by prop value, not presence ([81b6374](https://github.com/allxsmith/bestax/commit/81b6374bc3e73949247e4ce73ece0876d5c631a1)), closes [#552](https://github.com/allxsmith/bestax/issues/552)
* **bestax-migrate:** pin both halves of the rbx ref pass-through ([1d87cc2](https://github.com/allxsmith/bestax/commit/1d87cc2872487dd01ec91af61d32620c99cb3e90)), closes [#622](https://github.com/allxsmith/bestax/issues/622)
* **bestax-migrate:** plain markup keeps the href its own tag accepts ([8dc9b0c](https://github.com/allxsmith/bestax/commit/8dc9b0c3a9180d5c140cbb3e4f6e23b4a5e2af53))
* **bestax-migrate:** port four value-reference fixes to the RBC source ([bc0096a](https://github.com/allxsmith/bestax/commit/bc0096a6b4db73ed5b22a4a26a9aa07f04ab225a))
* **bestax-migrate:** port namespace-import retention to react-bulma-components ([1c35319](https://github.com/allxsmith/bestax/commit/1c35319b1f446f0afe93f1f7c7d4882bd1850b05))
* **bestax-migrate:** preserve shorthand object keys, and read deps signals on parse failure ([9dd22df](https://github.com/allxsmith/bestax/commit/9dd22df61e04f0d9662c8d1d09db81dd9e59ddcc))
* **bestax-migrate:** read iframe and label off their own content models ([6612821](https://github.com/allxsmith/bestax/commit/6612821a0e7d4d385a96bc19a251fe53f1d74f44)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bestax-migrate:** read spaced comparators and stop calling non-semver bulma "v1" ([ea287b6](https://github.com/allxsmith/bestax/commit/ea287b68936c53134e672c9037423bb3a17fe9f6))
* **bestax-migrate:** read the element a target renders, not the type it declares ([7296a50](https://github.com/allxsmith/bestax/commit/7296a504e277319bb12c08970a13bfb002191e57))
* **bestax-migrate:** read the element before advising an <a> inside it ([88a95a3](https://github.com/allxsmith/bestax/commit/88a95a3e2c0aab8aab661815596418cc8b911d66)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bestax-migrate:** recognise every plugin shape semantic-release accepts ([37ba3ea](https://github.com/allxsmith/bestax/commit/37ba3ea0e9a11944ccd119ed220785e49a6e1b57)), closes [#436](https://github.com/allxsmith/bestax/issues/436)
* **bestax-migrate:** recognize Sass block comments only outside strings ([cdf4ad6](https://github.com/allxsmith/bestax/commit/cdf4ad69a017cadf6d9e7eca7936b6df1fe166bf)), closes [#554](https://github.com/allxsmith/bestax/issues/554)
* **bestax-migrate:** refresh the MCP index after the reference edits ([443829f](https://github.com/allxsmith/bestax/commit/443829ff5ff5882cd1e0e16526050936eb0916e6))
* **bestax-migrate:** refuse a publish that is not pnpm's ([bf27cd4](https://github.com/allxsmith/bestax/commit/bf27cd4f22fb8a5c102c9770f44673c6c97fff86))
* **bestax-migrate:** refuse only packers we can name, not everything unfamiliar ([0b12a94](https://github.com/allxsmith/bestax/commit/0b12a94fe34b76f582485aee7299fb38671ca17f))
* **bestax-migrate:** regenerate MCP index for component-map ([ba745f2](https://github.com/allxsmith/bestax/commit/ba745f2cee8f36868f071a5addb25531864da62f))
* **bestax-migrate:** reject pnpm's workspace alias form instead of unwrapping it ([de6a900](https://github.com/allxsmith/bestax/commit/de6a90081c749ca8e3a761ce9cb9c1bee9e2386a))
* **bestax-migrate:** rename innerRef on rbx Navbar.Burger and Navbar.Link ([b935a16](https://github.com/allxsmith/bestax/commit/b935a166b496717a17a1a4fca63a9f40386efa30))
* **bestax-migrate:** rename rbx innerRef on Modal.Container, which becomes Modal ([90f9840](https://github.com/allxsmith/bestax/commit/90f9840af715a0112d6018c5035edc4c5b7b3d2d))
* **bestax-migrate:** rename rbx innerRef on the Navbar.Item that becomes a Dropdown ([16155fe](https://github.com/allxsmith/bestax/commit/16155fe9d21072d61a422fe9a86eb5c20e0b74ca))
* **bestax-migrate:** report what actually happened to bulma, not a fixed line ([a208436](https://github.com/allxsmith/bestax/commit/a20843691ccdfc66fe2ff8920f87144e6ddeedbc))
* **bestax-migrate:** require the pack script to exist, not just be named ([5315efe](https://github.com/allxsmith/bestax/commit/5315efe86c89205dc4ac97ec94f89b853832b696))
* **bestax-migrate:** resolve aliases by location, reserve value-retained roots, keep extension CSS ([1f02e12](https://github.com/allxsmith/bestax/commit/1f02e1284180f3a7eb526c35f998f3c57f481bf5))
* **bestax-migrate:** resolve bare workspace: and guard the catalog: protocol ([7fda9db](https://github.com/allxsmith/bestax/commit/7fda9dbd1537439edc9ec694a9a9d140c2bfc467)), closes [#417](https://github.com/allxsmith/bestax/issues/417) [#412](https://github.com/allxsmith/bestax/issues/412)
* **bestax-migrate:** resolve component references by binding, not by name ([0722674](https://github.com/allxsmith/bestax/commit/072267461d8214c76bdf45a80e66ba000957b586))
* **bestax-migrate:** resolve destructured aliases and protect aliased imports ([58b14cf](https://github.com/allxsmith/bestax/commit/58b14cfcafaa74f495be6935c6aef9ac93a54865))
* **bestax-migrate:** resolve dotted targets for bare alias references ([3f53bea](https://github.com/allxsmith/bestax/commit/3f53beaf0ac1fe0d53bd62253c6b7b2877325f2e))
* **bestax-migrate:** resolve shorthand and destructured aliases correctly ([9c0dea8](https://github.com/allxsmith/bestax/commit/9c0dea832b21e63c09b423ae1f4f367f94035ebf))
* **bestax-migrate:** resolve static string/number Button remove by truthiness ([62084bf](https://github.com/allxsmith/bestax/commit/62084bfc4aa6ea71cf725d48ca39e930a97e3787))
* **bestax-migrate:** resolve static string/number Heading props by truthiness ([f063086](https://github.com/allxsmith/bestax/commit/f063086344b7fa3f7cc6c368a95669c6fc27a14b)), closes [#558](https://github.com/allxsmith/bestax/issues/558)
* **bestax-migrate:** resolve workspace: specifiers before publishing ([782829a](https://github.com/allxsmith/bestax/commit/782829a7672e3a44827b53651b738ff37b3581b7)), closes [bestax-migrate#test](https://github.com/bestax-migrate/issues/test) [#412](https://github.com/allxsmith/bestax/issues/412)
* **bestax-migrate:** restore the npm link in the release success comment ([64b7a8a](https://github.com/allxsmith/bestax/commit/64b7a8a650c10af70467fcc5effebb0cb41305f6))
* **bestax-migrate:** rewrite RBC stylesheet as a real Bulma root, folding vars ([036cf79](https://github.com/allxsmith/bestax/commit/036cf79130e1397df0e2e708d1d115bec217511c))
* **bestax-migrate:** run the link cleanup on react-bulma-components' plain rewrites too ([8ea05cb](https://github.com/allxsmith/bestax/commit/8ea05cba3e3ebe2bd6a51843415b91da98e913e7))
* **bestax-migrate:** say where the two link rules disagree, not that they agree ([8468858](https://github.com/allxsmith/bestax/commit/846885833c4f57ca4ccac3a9999d858472f461c3)), closes [#682](https://github.com/allxsmith/bestax/issues/682)
* **bestax-migrate:** share the bulma range parser so RBC bumps comparator ranges too ([#629](https://github.com/allxsmith/bestax/issues/629)) ([491847c](https://github.com/allxsmith/bestax/commit/491847c2ab9f9a91f62241075f8942f240ad6b23))
* **bestax-migrate:** stop collapsing containers onto children they don't wrap ([e659ed8](https://github.com/allxsmith/bestax/commit/e659ed8e25481ae4e496c105d2f33385b7850e28))
* **bestax-migrate:** stop conflating the two directions an anchor can be invalid ([c7dac64](https://github.com/allxsmith/bestax/commit/c7dac646c8e8e6b035514621381d727a0f98f5a3)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bestax-migrate:** stop mislabeling RBC's own stylesheet as a third-party extension ([6a18553](https://github.com/allxsmith/bestax/commit/6a185530b04e49b79bad57caa320b4ff427b984b)), closes [#555](https://github.com/allxsmith/bestax/issues/555)
* **bestax-migrate:** stop naming a close handler in the showClose TODO too ([ce5a337](https://github.com/allxsmith/bestax/commit/ce5a337e6dbb80a358e4d3d26c0691033e75be2c))
* **bestax-migrate:** stop naming a close handler the user may not have ([6cfb557](https://github.com/allxsmith/bestax/commit/6cfb5574289884db108e95c4ed50cb8fcd37df83))
* **bestax-migrate:** stop sending changedBucket, honor Ctrl-C at consent ([271ba4c](https://github.com/allxsmith/bestax/commit/271ba4c3f19ef2846cad80be696c8b3af1991030))
* **bestax-migrate:** stop the pack hooks excusing a catalog: devDependency ([4127ead](https://github.com/allxsmith/bestax/commit/4127ead622f052808ae17644f06af2b77ae89c56)), closes [#412-shaped](https://github.com/allxsmith/bestax/issues/412-shaped)
* **bestax-migrate:** stop the release-info tail from being able to fail a release ([f9048cf](https://github.com/allxsmith/bestax/commit/f9048cf4ffc8761ff53b338d085068b4ab159b0c))
* **bestax-migrate:** strip `responsive` from plain elements, cover the shared RBC changes ([f12c3a3](https://github.com/allxsmith/bestax/commit/f12c3a3921905207fc79a80f77dc77309044661e))
* **bestax-migrate:** strip Sass block comments before scanning folded values ([c3fbd46](https://github.com/allxsmith/bestax/commit/c3fbd46b34e4ed0639747afdec18a46a40115c83)), closes [#554](https://github.com/allxsmith/bestax/issues/554)
* **bestax-migrate:** take the anchor's other attributes with it, and stop guessing at a falsy href ([9382e4a](https://github.com/allxsmith/bestax/commit/9382e4ac73fe9963533bab19560cba7d61c57965))
* **bestax-migrate:** the component and the element must both allow the attribute ([c009e85](https://github.com/allxsmith/bestax/commit/c009e85c7d62853ed20b32801ecbeb91a35aa962))
* **bestax-migrate:** track backslash escapes when scanning folded Sass values ([eac92eb](https://github.com/allxsmith/bestax/commit/eac92ebeb2ff94d8771c8629d9edb78299a2071e))
* **bestax-migrate:** trust an `as` a spread cannot overwrite, and stop three messages lying ([19fdb09](https://github.com/allxsmith/bestax/commit/19fdb0969789ab76bb97979c7f0ecccc7f589a88))
* **bestax-migrate:** white-bis and white-ter are bestax colours now ([d951c2f](https://github.com/allxsmith/bestax/commit/d951c2fbeb8f549943b89a554e4b3599f6682049))
* **bestax-migrate:** widen the element universe until it disagreed, and fix the Delete hint ([4979d94](https://github.com/allxsmith/bestax/commit/4979d94dec8ed6281e81deb358466c52896f3678))
* **bulma-ui:** a compound matches one simple selector, not co-occurrence ([#703](https://github.com/allxsmith/bestax/issues/703)) ([ce20396](https://github.com/allxsmith/bestax/commit/ce2039691ec93fb3f4d708c881be85f061eaaa73))
* **bulma-ui:** a11y + case-insensitive Taginput matching from PR review ([d576829](https://github.com/allxsmith/bestax/commit/d57682926f510d029839e79d6ba05bd62cc20323))
* **bulma-ui:** accept no children on Avatar, rather than deriving them from `as` ([a8897d2](https://github.com/allxsmith/bestax/commit/a8897d29798fa4545e9c4c89c4280d53c328ab8d)), closes [#665](https://github.com/allxsmith/bestax/issues/665)
* **bulma-ui:** accept router props like `to` on Navbar.Item without casts ([#311](https://github.com/allxsmith/bestax/issues/311)) ([b78856b](https://github.com/allxsmith/bestax/commit/b78856ba62986c693e13e545dd86746f206c3ab9)), closes [#306](https://github.com/allxsmith/bestax/issues/306)
* **bulma-ui:** add --bulma-shadow to Theme's bulmaVars union ([753ad41](https://github.com/allxsmith/bestax/commit/753ad41bae0a090bfaf2053c4f4afa3760209cee)), closes [#499](https://github.com/allxsmith/bestax/issues/499)
* **bulma-ui:** Add build step to publish in ci.yml ([e3707fc](https://github.com/allxsmith/bestax/commit/e3707fcdc0c4ba59dc1d68d81fdd9dc57d4436be))
* **bulma-ui:** add fontawesome-free as explicit devDependency ([a4a5389](https://github.com/allxsmith/bestax/commit/a4a53895f8797ca0889060403ae5d1e21cd09bec))
* **bulma-ui:** add keyboard and focus support to Dropdown and Navbar.Dropdown ([#628](https://github.com/allxsmith/bestax/issues/628)) ([381f22d](https://github.com/allxsmith/bestax/commit/381f22d6403b8a95d3e3ee6b4efabb495e1210aa))
* **bulma-ui:** add missing exports ([0d16633](https://github.com/allxsmith/bestax/commit/0d166338a8843df55af265d30a079858e0bf7da1))
* **bulma-ui:** Add Skeleton to exports ([e481599](https://github.com/allxsmith/bestax/commit/e481599047bd4f094f894569656c878faca3e1ea))
* **bulma-ui:** add the OpenSSF Best Practices badge to the README ([de746d4](https://github.com/allxsmith/bestax/commit/de746d43c0b99f70500745267648dcf1a5425fba))
* **bulma-ui:** admit material-symbols 0.46 in the peer range ([1d5c1d4](https://github.com/allxsmith/bestax/commit/1d5c1d4040bc7ff01fb826999f792638bfacd97f))
* **bulma-ui:** another attempt to fix semantic release builds with ci.yml ([cc3a3e2](https://github.com/allxsmith/bestax/commit/cc3a3e2416361d3da3288c97c894d700a4323a36))
* **bulma-ui:** another attempt to fix semantic release builds with ci.yml ([314bc39](https://github.com/allxsmith/bestax/commit/314bc394d57b4766d20590ae6fd59fe433443c8f))
* **bulma-ui:** another attempt to fix semantic release builds with ci.yml ([c930693](https://github.com/allxsmith/bestax/commit/c930693439e8a289f373c87a568b48fecabc53ae))
* **bulma-ui:** apply the custom-element and event guards consistently ([cc8818c](https://github.com/allxsmith/bestax/commit/cc8818c98881a73fdca0b238bcb16bcc06633f49))
* **bulma-ui:** associate Autocomplete and Taginput labels with their inner inputs ([7ae37d4](https://github.com/allxsmith/bestax/commit/7ae37d48f7a5af85bf29d21c7517abbea7c9448b))
* **bulma-ui:** associate Autocomplete and Taginput labels with their inner inputs ([384bd38](https://github.com/allxsmith/bestax/commit/384bd387639764fa346912cbe6df2d5b02cdaab6))
* **bulma-ui:** associate the form label prop with its control via a generated id ([e6686af](https://github.com/allxsmith/bestax/commit/e6686afa28d006120d5e0dd8181e61036d7fb075))
* **bulma-ui:** attribute shared picker-popover CSS variables to date/time pickers ([80f62ce](https://github.com/allxsmith/bestax/commit/80f62cedb67cde0a6844012be4171edc2df5950e)), closes [#543](https://github.com/allxsmith/bestax/issues/543) [#543](https://github.com/allxsmith/bestax/issues/543)
* **bulma-ui:** carry the deprecated `icon` path through every consumer of IconProps ([b8eb722](https://github.com/allxsmith/bestax/commit/b8eb722492d61d471d9440b68668027e47aac5eb)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bulma-ui:** catch the other shape a declaration specifier can take ([4f69e20](https://github.com/allxsmith/bestax/commit/4f69e20b698fabc14783a72d9c4c6d6673164eb5))
* **bulma-ui:** chunk the constants bundle as .cjs, and ask the path for the remedy ([83223f7](https://github.com/allxsmith/bestax/commit/83223f703a707dd1a1c6f77b57e042c1fb7fe32c)), closes [#688](https://github.com/allxsmith/bestax/issues/688)
* **bulma-ui:** complete domain migration and fix semantic-release configuration ([#64](https://github.com/allxsmith/bestax/issues/64)) ([f4cd71d](https://github.com/allxsmith/bestax/commit/f4cd71d531b757465bf3227aeb5c4e98419cfb97))
* **bulma-ui:** correct blog post examples and add Modal compound components ([#81](https://github.com/allxsmith/bestax/issues/81)) ([559c2e3](https://github.com/allxsmith/bestax/commit/559c2e30fa15580c02f014754fa3846fdd5ed2f6))
* **bulma-ui:** correct NPM_TOKEN env variable in ci.yml ([94b48b4](https://github.com/allxsmith/bestax/commit/94b48b47aec94b83d25f94dade6af793fd7b1672))
* **bulma-ui:** correct the sibling claim, and make the strip set's type check it ([7ffa0e7](https://github.com/allxsmith/bestax/commit/7ffa0e75077d9826fe49dbe874e91a4743ed33c7)), closes [#682](https://github.com/allxsmith/bestax/issues/682)
* **bulma-ui:** cover horizontal-layout group label association ([ef3ca9f](https://github.com/allxsmith/bestax/commit/ef3ca9f4b99a149b43f359cb8105255c9a3f2770))
* **bulma-ui:** declare backgroundColor unavailable, and check the whole class ([daf636a](https://github.com/allxsmith/bestax/commit/daf636a5e91d96d3920792651f118ad268ea18d1))
* **bulma-ui:** declare the deprecated `icon` path `Icon` still honours ([80124d1](https://github.com/allxsmith/bestax/commit/80124d12c6f27feb4828815c91d033dcb75853ba)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bulma-ui:** define the kept props instead of assigning them ([b5722f2](https://github.com/allxsmith/bestax/commit/b5722f275e19a4cb17bdfb03a57ba0e00215cfb3)), closes [#682](https://github.com/allxsmith/bestax/issues/682)
* **bulma-ui:** deprecate CSS-less color values, warn in dev, fix has-text fall-through ([fb111eb](https://github.com/allxsmith/bestax/commit/fb111eb9f08a412821efe07a77e2ba29ee9993b8))
* **bulma-ui:** emit the CommonJS bundle as .cjs, so require() can load it ([f64286c](https://github.com/allxsmith/bestax/commit/f64286ccfce8b173bcd8461911532355f921db73)), closes [#688](https://github.com/allxsmith/bestax/issues/688)
* **bulma-ui:** enumerate string size literals so the docs extractor keeps concrete type values ([00bfff3](https://github.com/allxsmith/bestax/commit/00bfff32ed715f8c4e9b4858be8e1f3159b71e0f))
* **bulma-ui:** exclude disabled/hidden controls from Modal initial focus ([f4091f8](https://github.com/allxsmith/bestax/commit/f4091f8420a03261ce07c55c747cd0c4a3110f2a))
* **bulma-ui:** exclude undefined from Icon children and add node stories ([b607db1](https://github.com/allxsmith/bestax/commit/b607db1b5c4301ca17fa0351eaf7b5b7cd5032d7))
* **bulma-ui:** exempt everything module-sync serves, and pin the chunk guards ([c87f6a7](https://github.com/allxsmith/bestax/commit/c87f6a731e81f1e49ec55aae0ad7ebcadc7ad96c)), closes [#688](https://github.com/allxsmith/bestax/issues/688)
* **bulma-ui:** fail closed on missing process and scope color guidance to real props ([117c0c0](https://github.com/allxsmith/bestax/commit/117c0c08b5f16ad36d7e402aa714f886a7a9ef3e))
* **bulma-ui:** Fix release.config.js to include package-lock.json ([390da59](https://github.com/allxsmith/bestax/commit/390da5938deeb9a790d063c79c2ca693f9b7d0b9))
* **bulma-ui:** fix standalone Badge pointer-events, pulse halo, and falsy content ([#295](https://github.com/allxsmith/bestax/issues/295)) ([a9db031](https://github.com/allxsmith/bestax/commit/a9db03189c087eb0a61f56357e179296bd4cebf9)), closes [#264](https://github.com/allxsmith/bestax/issues/264)
* **bulma-ui:** full classPrefix support across layout/grid + prefix utils ([4ce0b53](https://github.com/allxsmith/bestax/commit/4ce0b53b337ff2ff961cc18a17790ee75d860dfa))
* **bulma-ui:** give the CommonJS chunks the extension too, and finish the target test ([bdcba5c](https://github.com/allxsmith/bestax/commit/bdcba5ca4546368dff3db957cc978753c729a972)), closes [#688](https://github.com/allxsmith/bestax/issues/688)
* **bulma-ui:** give the constants subpath a CommonJS types target ([e97d609](https://github.com/allxsmith/bestax/commit/e97d6095860309c64f6882a04b8dc8666e843a5f))
* **bulma-ui:** give the emitted declarations extensions, so their specifiers resolve ([#702](https://github.com/allxsmith/bestax/issues/702)) ([2a4672f](https://github.com/allxsmith/bestax/commit/2a4672f94ebe774c3825e076455286f01bf2b8c4))
* **bulma-ui:** honor the htmlFor opt-out in the convenience hook and tighten the association docs ([92aa622](https://github.com/allxsmith/bestax/commit/92aa622c0ebd231b41562504da6d104128207000))
* **bulma-ui:** honour callback-ref cleanups on Dialog, Sidebar, Toast and Carousel ([dbbdc23](https://github.com/allxsmith/bestax/commit/dbbdc2393b1c5dc1af186fbcaeea2297d94cb7f1))
* **bulma-ui:** improve npm package discoverability with optimized keywords and badges ([#72](https://github.com/allxsmith/bestax/issues/72)) ([8c7a696](https://github.com/allxsmith/bestax/commit/8c7a69664fcc6409096cd72b9bb006ff8edf8ddc))
* **bulma-ui:** Initial semantic release changes ([b78d785](https://github.com/allxsmith/bestax/commit/b78d785e5d3e7aec5b49f178784aad3d97b5434c))
* **bulma-ui:** judge an mjs require target, and certify module-sync by loading ([ce984f5](https://github.com/allxsmith/bestax/commit/ce984f569189dbf8fc0027ed0a66103583881fe0)), closes [#688](https://github.com/allxsmith/bestax/issues/688)
* **bulma-ui:** judge both runtimes, not the modern one with a fallback ([525ef79](https://github.com/allxsmith/bestax/commit/525ef79b961f6e6be67490596227a551e5ae2c32)), closes [#688](https://github.com/allxsmith/bestax/issues/688)
* **bulma-ui:** judge only the branches a require() can enter ([10ffd2e](https://github.com/allxsmith/bestax/commit/10ffd2e5430c96f6ac0c14c0b9fa0a9041986b2a)), closes [#688](https://github.com/allxsmith/bestax/issues/688)
* **bulma-ui:** judge what an older Node reaches behind module-sync ([5b4dd6d](https://github.com/allxsmith/bestax/commit/5b4dd6d2a164f032a7266004e3c73e8e9d6bae9d)), closes [#688](https://github.com/allxsmith/bestax/issues/688)
* **bulma-ui:** keep DropdownItemProps accepting every tag it always accepted ([d621b88](https://github.com/allxsmith/bestax/commit/d621b88d86bd7f3bc053474d215726b03df35408)), closes [#667](https://github.com/allxsmith/bestax/issues/667) [#667](https://github.com/allxsmith/bestax/issues/667) [#667](https://github.com/allxsmith/bestax/issues/667) [#663](https://github.com/allxsmith/bestax/issues/663) [#667](https://github.com/allxsmith/bestax/issues/667)
* **bulma-ui:** keep React's own node shapes out of the icon-props branch ([638e329](https://github.com/allxsmith/bestax/commit/638e329929beaa3f90709cffb7458adcc155c90c)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bulma-ui:** keep stripping disabled where the element does not own it ([afd94a7](https://github.com/allxsmith/bestax/commit/afd94a72b739f22dffc0151de1cbe984acf1646b))
* **bulma-ui:** keep Taginput's fallback name unless the label targets its input ([73cec33](https://github.com/allxsmith/bestax/commit/73cec33709b72f968645a951cda0fa6a664847c5))
* **bulma-ui:** keep Taginput's fallback name unless the label targets its input ([ca5996a](https://github.com/allxsmith/bestax/commit/ca5996a73f5b0816ff82fa4984455bb82ef6060c))
* **bulma-ui:** keep the button default against a spread, and tag the deprecated props ([fcc148b](https://github.com/allxsmith/bestax/commit/fcc148b74655a42c99ddc595f38dc5dd11f82e95)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bulma-ui:** keep the form attributes an `as="input"` owns ([3ae7bd8](https://github.com/allxsmith/bestax/commit/3ae7bd873f02a3471022537e1c5d35157d0409a6))
* **bulma-ui:** keep Toast's empty-container fallback, filter to real tab stops, re-key focus across the portal move ([511a7ae](https://github.com/allxsmith/bestax/commit/511a7ae4cd56bf0c63aab99b0440fb6b5c6b0d6a))
* **bulma-ui:** leave custom elements out of the built-in attribute backstops ([94f6f48](https://github.com/allxsmith/bestax/commit/94f6f48e9fa476fa5f9755bd139aeb742b30b344))
* **bulma-ui:** let Dropdown.Item's props follow its constrained `as` ([f9c998f](https://github.com/allxsmith/bestax/commit/f9c998f483997e99deaed4b2a45b176bc2e4743c)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bulma-ui:** let Level.Item's anchor take the rest of an anchor's attributes ([#675](https://github.com/allxsmith/bestax/issues/675)) ([59e8e34](https://github.com/allxsmith/bestax/commit/59e8e348ec69ace8144d429f8345e85591d2a3f2))
* **bulma-ui:** make props and refs follow the polymorphic `as` ([7528d87](https://github.com/allxsmith/bestax/commit/7528d87d995bfcdf21e33b5e25da9a3e1c2a0b34)), closes [#188](https://github.com/allxsmith/bestax/issues/188) [#641](https://github.com/allxsmith/bestax/issues/641)
* **bulma-ui:** match a spread's enumerability, and close the `type` gap ([84b5cd2](https://github.com/allxsmith/bestax/commit/84b5cd2aae9785b8393d697474c5f6d1905b9bda)), closes [#682](https://github.com/allxsmith/bestax/issues/682)
* **bulma-ui:** match compound selectors in either class order ([1cb026e](https://github.com/allxsmith/bestax/commit/1cb026ea9915f0d276731dadb4ee04a998e3bcba))
* **bulma-ui:** memoize Toast's merged ref so the cleanup fires only on detach ([e4e6b04](https://github.com/allxsmith/bestax/commit/e4e6b04be2bf329c2cef0043cb9fe582c4d6bf02))
* **bulma-ui:** migrate domain from bestax.cc to bestax.io ([#64](https://github.com/allxsmith/bestax/issues/64)) ([4870b1e](https://github.com/allxsmith/bestax/commit/4870b1e7d9edd7295f907ae07df9fe00f1217f46))
* **bulma-ui:** migrate ionicons to v8 to unblock publish and Storybook ([927a55b](https://github.com/allxsmith/bestax/commit/927a55b024db8d2c9da7448a958d2a51daef3cca)), closes [#142](https://github.com/allxsmith/bestax/issues/142)
* **bulma-ui:** name Rate, Checkboxes, and Radios groups from their labels via aria-labelledby ([dce0ee7](https://github.com/allxsmith/bestax/commit/dce0ee7e2b2d5c2678e5b996437ab713cc45365b))
* **bulma-ui:** name Rate, Checkboxes, and Radios groups from their labels via aria-labelledby ([#497](https://github.com/allxsmith/bestax/issues/497)) ([5c4222e](https://github.com/allxsmith/bestax/commit/5c4222e2eca35c151a2c355e329c6b5a47a8195f))
* **bulma-ui:** name the three near-miss components in AGENTS.md ([c63f491](https://github.com/allxsmith/bestax/commit/c63f491274ef3e5db173eb4ee5039c645df74bd1)), closes [#344](https://github.com/allxsmith/bestax/issues/344)
* **bulma-ui:** never let labelProps.htmlFor wire a group label to a control ([3b3aaaf](https://github.com/allxsmith/bestax/commit/3b3aaafa6573bfc0c84930ee1517f402105fbc1d))
* **bulma-ui:** preserve Modal's forwarded callback-ref cleanup, restore its [@extra](https://github.com/extra)Prop ([cf9c70d](https://github.com/allxsmith/bestax/commit/cf9c70d3bd20ecdbda8f4639e45a8889e10280d5))
* **bulma-ui:** publish only the polymorphic types, and keep role="img" without an href ([b0c8dfe](https://github.com/allxsmith/bestax/commit/b0c8dfe11d5d44a044ff7de051224e5d3ecf3129))
* **bulma-ui:** publish rewritten README to npm ([9810081](https://github.com/allxsmith/bestax/commit/981008179d96b19f692ca73c17a02ae3f5fa6298))
* **bulma-ui:** publish with npm provenance attestation ([172da62](https://github.com/allxsmith/bestax/commit/172da62349b464d414da552058dfa4db238ab720)), closes [#180](https://github.com/allxsmith/bestax/issues/180)
* **bulma-ui:** reference llms docs from README and package.json ([#198](https://github.com/allxsmith/bestax/issues/198)) ([db8aab3](https://github.com/allxsmith/bestax/commit/db8aab32c1c07d81071e7da0c74e811150289d40))
* **bulma-ui:** reject predicate-blocked values during manual entry ([a8f6e28](https://github.com/allxsmith/bestax/commit/a8f6e28b92b997f0cdbb25feed0e039ecc1503b5))
* **bulma-ui:** reject the LinkButton props Button eats, and split a conflated assertion ([b0c7a16](https://github.com/allxsmith/bestax/commit/b0c7a162f584a8ae442006f4815ffd7492175c8d))
* **bulma-ui:** resolve flex item properties and Card compound component issues ([#55](https://github.com/allxsmith/bestax/issues/55)) ([e774da3](https://github.com/allxsmith/bestax/commit/e774da3b7a8890b77d7d699c5b5d0d3a20920fed))
* **bulma-ui:** resolve flex item properties and Card compound component issues ([#55](https://github.com/allxsmith/bestax/issues/55)) ([7641a53](https://github.com/allxsmith/bestax/commit/7641a536db1c4a3928ccc7a15407b939fe205b06))
* **bulma-ui:** resolve react-hooks v7 and [@eslint-react](https://github.com/eslint-react) findings ([14caaaf](https://github.com/allxsmith/bestax/commit/14caaafa1db777ae5ce59c512ac253968df21fc3))
* **bulma-ui:** resolve security vulnerabilities and update dependencies ([#128](https://github.com/allxsmith/bestax/issues/128)) ([112f6e4](https://github.com/allxsmith/bestax/commit/112f6e4841fa9ea9c4ba49200984e413c1bc5f22)), closes [#127](https://github.com/allxsmith/bestax/issues/127)
* **bulma-ui:** restore union `as`, and stop the props type collapsing to any ([dfec253](https://github.com/allxsmith/bestax/commit/dfec253473e743fdb562a7d4352f03bae0f081ee)), closes [#641](https://github.com/allxsmith/bestax/issues/641)
* **bulma-ui:** restrict semantic-release to bulma-ui scoped commits only ([2d67bf9](https://github.com/allxsmith/bestax/commit/2d67bf9a0ed65d1258c664ca741a1b0966445b79)), closes [#62](https://github.com/allxsmith/bestax/issues/62)
* **bulma-ui:** retry failed Avatar src, flatten Fragment children in Avatars, RTL-safe overlap ([#297](https://github.com/allxsmith/bestax/issues/297)) ([c00b9db](https://github.com/allxsmith/bestax/commit/c00b9db6aa21fab055302fd3320dccd4c0cbc824))
* **bulma-ui:** route every hardcoded class through the prefix helpers; add classPrefix sweep test ([#301](https://github.com/allxsmith/bestax/issues/301)) ([a50b134](https://github.com/allxsmith/bestax/commit/a50b134949e08c9c4a207dbd1890213cc3389cd5)), closes [#286](https://github.com/allxsmith/bestax/issues/286)
* **bulma-ui:** run a forwarded callback ref's cleanup on Dropdown detach ([f36032c](https://github.com/allxsmith/bestax/commit/f36032c32b898c314b68bd6a4d665049e89118af))
* **bulma-ui:** scope Modal keyboard/focus handling to the topmost modal ([6d3096d](https://github.com/allxsmith/bestax/commit/6d3096d13b1cee29da9d3e4fc13275c4db1a6527))
* **bulma-ui:** scope the two attribute filters independently ([d132427](https://github.com/allxsmith/bestax/commit/d132427012be570331ce469e2b586fcb74f3cb20)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bulma-ui:** set displayName on the newly forwarded-ref components ([603d745](https://github.com/allxsmith/bestax/commit/603d745914d36644630358062f702cf1650fa989))
* **bulma-ui:** setup gpg signing with semantic-release ([3e24722](https://github.com/allxsmith/bestax/commit/3e24722d05cd231638864eebb5ff768991633c42))
* **bulma-ui:** stop a Dropdown.Item button submitting the form it sits in ([a27f0d6](https://github.com/allxsmith/bestax/commit/a27f0d6702fe5afbf830bcb84a40cea2a1022195)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bulma-ui:** stop Avatar widening to every element, and forward custom props ([74f452b](https://github.com/allxsmith/bestax/commit/74f452b30956f6a8efbad6ed91135b4a55124909)), closes [#661](https://github.com/allxsmith/bestax/issues/661) [#641](https://github.com/allxsmith/bestax/issues/641)
* **bulma-ui:** stop emitting are-multiline from Tags, deprecate isMultiline ([#624](https://github.com/allxsmith/bestax/issues/624)) ([0f97eac](https://github.com/allxsmith/bestax/commit/0f97eac1123bf7be11756cfc222cd215ea2b6f68))
* **bulma-ui:** stop guessing which attributes a target element owns ([9baafe9](https://github.com/allxsmith/bestax/commit/9baafe9eca9832946fad96186d33214b2e93c0fa)), closes [#641](https://github.com/allxsmith/bestax/issues/641)
* **bulma-ui:** stop predicting the symptom, and drop a claim about the corpus ([2af4883](https://github.com/allxsmith/bestax/commit/2af4883c29b7fe0884ef0ec6f0eb83c7f3181da2)), closes [#688](https://github.com/allxsmith/bestax/issues/688)
* **bulma-ui:** stop stripping attributes the target element accepts ([65800e8](https://github.com/allxsmith/bestax/commit/65800e8e85087ea0c17f30149f68c6f0975a9d34))
* **bulma-ui:** stop the color exclusion reaching custom targets, and guard the disabled blocker ([3299b54](https://github.com/allxsmith/bestax/commit/3299b54088db6b25ec0cfbdc0ccb939c608faeec)), closes [#665](https://github.com/allxsmith/bestax/issues/665)
* **bulma-ui:** stop the ref cells naming a type parameter no page declares ([5931850](https://github.com/allxsmith/bestax/commit/59318506589e18b7cfad4d3e6d953e514798e18f))
* **bulma-ui:** strip only the keys a caller named, and correct three claims ([7747335](https://github.com/allxsmith/bestax/commit/7747335acec4dcb27d253c7aeb9b4ae62bff14cb)), closes [#682](https://github.com/allxsmith/bestax/issues/682) [#682](https://github.com/allxsmith/bestax/issues/682)
* **bulma-ui:** strip redundant library prefix from Icon name ([#242](https://github.com/allxsmith/bestax/issues/242)) ([dbe3622](https://github.com/allxsmith/bestax/commit/dbe36221af3db5be729dd65a3d528042986ee3ec)), closes [#189](https://github.com/allxsmith/bestax/issues/189)
* **bulma-ui:** surface supply-chain posture in agent pointer files ([#519](https://github.com/allxsmith/bestax/issues/519)) ([51573e9](https://github.com/allxsmith/bestax/commit/51573e9b0d7655de2aaf49b1ac6c37234b1f07d3)), closes [#413](https://github.com/allxsmith/bestax/issues/413)
* **bulma-ui:** test the icon-config shape, and keep one copy of the guard ([f8c9c5b](https://github.com/allxsmith/bestax/commit/f8c9c5b48e97297d5dab900ca2b78f15be59b54c)), closes [#663](https://github.com/allxsmith/bestax/issues/663)
* **bulma-ui:** the eight smaller defects review found in [#661](https://github.com/allxsmith/bestax/issues/661) ([a6df70f](https://github.com/allxsmith/bestax/commit/a6df70f308afdd6ea4d7e3e628c5a8fb60fd4e83))
* **bulma-ui:** treat falsy icon nodes as absent in Control and IconText ([c36f5b2](https://github.com/allxsmith/bestax/commit/c36f5b2728c1759c7b8cfdf5a847bf6af5114c09))
* **bulma-ui:** treat optionality modifiers as unsupported, and correct two contracts ([9ca5de9](https://github.com/allxsmith/bestax/commit/9ca5de982a165c4924fbaa0e2747ed1228906d50))
* **bulma-ui:** trigger release to publish via OIDC trusted publishing ([e2d09c5](https://github.com/allxsmith/bestax/commit/e2d09c5e312df3788aa140f0e5e86370a545a989))
* **bulma-ui:** update bundle size claims to accurate 21KB gzipped ([#66](https://github.com/allxsmith/bestax/issues/66)) ([6e381bd](https://github.com/allxsmith/bestax/commit/6e381bdc16ad5572a40983ccc079e33c7882c0c6))
* **bulma-ui:** update package-lock.json ([853d585](https://github.com/allxsmith/bestax/commit/853d585ddfb0622c963b29b050c23f96923fad81))
* **bulma-ui:** update package.json for better seo, exports, types, engines, funding, etc ([98cbc56](https://github.com/allxsmith/bestax/commit/98cbc5637b81c6cba560953bf95eb4c6371b4392))
* **bulma-ui:** use createRequire for ESM compatibility in Storybook 10 ([#130](https://github.com/allxsmith/bestax/issues/130)) ([b27e60e](https://github.com/allxsmith/bestax/commit/b27e60e074dda007e76ad38d867573539b8bcb41)), closes [#129](https://github.com/allxsmith/bestax/issues/129)
* **bulma-ui:** warn on the new white shades as component modifiers ([7c617a6](https://github.com/allxsmith/bestax/commit/7c617a6df9ff798d3d00b9d3864a69115195dfd7))
* **bulma-ui:** withhold an href from a Dropdown.Item that is not an anchor ([f597cf2](https://github.com/allxsmith/bestax/commit/f597cf2ae36ebca4c4b57a65ac69c3c259187153)), closes [#667](https://github.com/allxsmith/bestax/issues/667) [#667](https://github.com/allxsmith/bestax/issues/667) [#663](https://github.com/allxsmith/bestax/issues/663)
* **ci:** collect screenshots as artifacts and commit in single batch to avoid conflicts ([27b259d](https://github.com/allxsmith/bestax/commit/27b259d774d4088fa371bb7ad2688cc97d4258ab))
* **ci:** ensure npm install uses fresh downloads with --prefer-online ([1f2e15d](https://github.com/allxsmith/bestax/commit/1f2e15ddf2c4b51094ed58d04b26decc317dfa2e))
* **ci:** properly extract base path for recursive file search ([e0330ff](https://github.com/allxsmith/bestax/commit/e0330ff9ca0efe12ad96603cfe134307f3a09b83))
* **ci:** use find command instead of glob module in verified-commit action ([0e2d159](https://github.com/allxsmith/bestax/commit/0e2d159177760c7285c4ddd5930f49e6ac7c5566))
* **ci:** use npm ci for scaffolded app dependencies ([35652c8](https://github.com/allxsmith/bestax/commit/35652c8d84ecd2e1b8f5c2d0bc7b2f573d1e9717))
* collapse the duplicated docs route segment so Grid and Columns URLs resolve ([#598](https://github.com/allxsmith/bestax/issues/598)) ([a11333b](https://github.com/allxsmith/bestax/commit/a11333b7bbc0b444dd45f6d3bb6f4335153d4e89)), closes [#597](https://github.com/allxsmith/bestax/issues/597)
* **create-bestax:** add the OpenSSF Best Practices badge to the README ([baad987](https://github.com/allxsmith/bestax/commit/baad987d592cf91eceb5d59f1da302fca8049270))
* **create-bestax:** concrete inline-style → helper-prop mapping for the never-inline rule ([#357](https://github.com/allxsmith/bestax/issues/357)) ([5f72a90](https://github.com/allxsmith/bestax/commit/5f72a90eea06162f4fd5260587098df919ddc4fc)), closes [#350](https://github.com/allxsmith/bestax/issues/350) [#350](https://github.com/allxsmith/bestax/issues/350)
* **create-bestax:** correct browser title to prioritize Bestax branding ([#106](https://github.com/allxsmith/bestax/issues/106)) ([23aa535](https://github.com/allxsmith/bestax/commit/23aa535a82639e2b5552294b03636894ed686a4d)), closes [#105](https://github.com/allxsmith/bestax/issues/105)
* **create-bestax:** correct template path resolution from ../../ to ../ ([65b4493](https://github.com/allxsmith/bestax/commit/65b44931859e162c46bfc8cdd6e0849942778968)), closes [#78](https://github.com/allxsmith/bestax/issues/78)
* **create-bestax:** dark-mode contrast rules in theming/layout skills and docs ([#303](https://github.com/allxsmith/bestax/issues/303)) ([490bf21](https://github.com/allxsmith/bestax/commit/490bf21ad9ee101e4f2630bf53f5b3e8ef22fc9e)), closes [#194](https://github.com/allxsmith/bestax/issues/194) [#195](https://github.com/allxsmith/bestax/issues/195)
* **create-bestax:** declare @allxsmith/bestax-bulma as a dependency ([#645](https://github.com/allxsmith/bestax/issues/645)) ([5d785f9](https://github.com/allxsmith/bestax/commit/5d785f998847da69b51c15596747e5bbdec70b7f)), closes [#537](https://github.com/allxsmith/bestax/issues/537) [#644](https://github.com/allxsmith/bestax/issues/644)
* **create-bestax:** document strictPort port-collision recovery in generated CLAUDE.md ([7ba0756](https://github.com/allxsmith/bestax/commit/7ba0756a59c654a1857012119352ab425d20c203)), closes [#371](https://github.com/allxsmith/bestax/issues/371)
* **create-bestax:** exclude templates directory from linting and typecheck ([18fec0b](https://github.com/allxsmith/bestax/commit/18fec0b50fe71b2ba0bf41beb4bbb1e5bd399e22))
* **create-bestax:** fail closed on foreign consent records, gate ignored files ([81df919](https://github.com/allxsmith/bestax/commit/81df91954cd421c57df7df0495698178be083f5a))
* **create-bestax:** fail fast with guidance instead of hanging when stdin is not a TTY ([#293](https://github.com/allxsmith/bestax/issues/293)) ([46a172d](https://github.com/allxsmith/bestax/commit/46a172d503bb283a5fc168f397261f8afa558b19)), closes [#192](https://github.com/allxsmith/bestax/issues/192)
* **create-bestax:** gate consent on both TTYs, honor DNT and Ctrl-C ([8def8da](https://github.com/allxsmith/bestax/commit/8def8da80ce70160d50efba1ae2869827c5814b3))
* **create-bestax:** move templates into package directory and update docs ([195bf01](https://github.com/allxsmith/bestax/commit/195bf01fae72ce268a75156140912e2bc40052c3)), closes [#78](https://github.com/allxsmith/bestax/issues/78)
* **create-bestax:** name rbx in the scaffolded CLAUDE.md skill roster ([fcf11dc](https://github.com/allxsmith/bestax/commit/fcf11dc40502421a51904e1a90a09719f5f37647))
* **create-bestax:** never send telemetry from the e2e scaffold harness ([a6db102](https://github.com/allxsmith/bestax/commit/a6db10299c77368622988c1cfc1687b433f5d602))
* **create-bestax:** point scaffolded CLAUDE.md at llms docs; document skills ([#198](https://github.com/allxsmith/bestax/issues/198)) ([b2e0514](https://github.com/allxsmith/bestax/commit/b2e0514c0ed4a04192b56fda8e2fc23a67898f97))
* **create-bestax:** publish with npm provenance attestation ([21ffe8f](https://github.com/allxsmith/bestax/commit/21ffe8f753419eeded407b1fa8685bcbd473fbfe)), closes [#180](https://github.com/allxsmith/bestax/issues/180)
* **create-bestax:** put the near-miss guidance where every session sees it ([6db49f3](https://github.com/allxsmith/bestax/commit/6db49f308b888f778f7454ffc934e4aa7d7b2b0d))
* **create-bestax:** read version from package.json instead of hardcoded value ([#109](https://github.com/allxsmith/bestax/issues/109)) ([8605699](https://github.com/allxsmith/bestax/commit/8605699141c90cfde95fba229f21e601e7723586))
* **create-bestax:** refresh README and bump scaffolded bestax-bulma to ^5 ([4e19e86](https://github.com/allxsmith/bestax/commit/4e19e8691781cc0dce9bf6b277a4d0e90a9ec693))
* **create-bestax:** reject dot-only project names, pin icon versions, bundle bestax-icons skill ([#310](https://github.com/allxsmith/bestax/issues/310)) ([ddff8e5](https://github.com/allxsmith/bestax/commit/ddff8e5c54b08f669aa0c34aa5a466050f8929e5))
* **create-bestax:** remove dead ionicons nomodule fallback from generated & shipped surfaces ([db3d588](https://github.com/allxsmith/bestax/commit/db3d5883ad6abf30567c8048cc8ff6c2b9131e07)), closes [#564](https://github.com/allxsmith/bestax/issues/564)
* **create-bestax:** review-thread fixes across the telemetry surface ([750b53e](https://github.com/allxsmith/bestax/commit/750b53e052ccb1acf803e01c5ee7bdafbba21b1a)), closes [#550](https://github.com/allxsmith/bestax/issues/550)
* **create-bestax:** scaffold @allxsmith/bestax-bulma ^4.0.0 ([1d3b802](https://github.com/allxsmith/bestax/commit/1d3b802eb7285ca05c64cfb0a44bdb96ddb2d82b))
* **create-bestax:** scaffold bundled bestax CSS flavors, not stock Bulma ([43621dc](https://github.com/allxsmith/bestax/commit/43621dc7cebef2dd51f017feccc91a2154e1f7a3))
* **create-bestax:** scope the strictPort recovery kill to the TCP listener ([5fe5397](https://github.com/allxsmith/bestax/commit/5fe5397cd665fd32d693c46f4e2204b076bf73a1)), closes [#371](https://github.com/allxsmith/bestax/issues/371)
* **create-bestax:** ship improved bundled skills + component catalog ([#199](https://github.com/allxsmith/bestax/issues/199)) ([a1515c2](https://github.com/allxsmith/bestax/commit/a1515c2742fa1a2b82052045674c4f1b41d0c792))
* **create-bestax:** ship scaffold .gitignore via rename-on-copy and ignore *.tsbuildinfo ([2094086](https://github.com/allxsmith/bestax/commit/209408608e7a45d7346369e98ef106bacfc48cf8)), closes [#371](https://github.com/allxsmith/bestax/issues/371)
* **create-bestax:** ship the corrected background-click guidance to scaffolded apps ([067eed8](https://github.com/allxsmith/bestax/commit/067eed818cebd9fd7bd0011718bada6d095c6807))
* **create-bestax:** ship the corrected rbc Modal guidance to scaffolded apps ([1374104](https://github.com/allxsmith/bestax/commit/1374104e0eeeb12db29846ed48ebc430da602e84))
* **create-bestax:** ship the corrected rbx Modal guidance to scaffolded apps ([b864e90](https://github.com/allxsmith/bestax/commit/b864e90c92bca15fe1a5401039047ab9e1ba3d4b)), closes [#633](https://github.com/allxsmith/bestax/issues/633)
* **create-bestax:** ship the corrected ref guidance to scaffolded apps ([bd0cfd3](https://github.com/allxsmith/bestax/commit/bd0cfd3d6b99106dad7c66a5ab9d359e40eb1159))
* **create-bestax:** ship the custom-icon-node guidance to scaffolded apps ([e96b7b9](https://github.com/allxsmith/bestax/commit/e96b7b98acad80a77e9c6e316159e3032e2b0533)), closes [#597](https://github.com/allxsmith/bestax/issues/597)
* **create-bestax:** ship the Modal.Container ref mapping to scaffolded apps ([06b470f](https://github.com/allxsmith/bestax/commit/06b470fb76bb8170410bf6c37f224bfbcf1022e7))
* **create-bestax:** ship the polymorphic `as` guidance to scaffolded apps ([4aa322c](https://github.com/allxsmith/bestax/commit/4aa322c752fd0e04c3548f44720a4ccf557ca8b5)), closes [#641](https://github.com/allxsmith/bestax/issues/641)
* **create-bestax:** shrink the near-miss block and pin the copies together ([d582da5](https://github.com/allxsmith/bestax/commit/d582da567dc0ebc877300399ec221d83af2ec80a))
* **create-bestax:** skills-sync conformance gate + theming skill reference backfill ([#326](https://github.com/allxsmith/bestax/issues/326)) ([9584133](https://github.com/allxsmith/bestax/commit/95841337838139f2e32c482641d7d6c6305800fb)), closes [#285](https://github.com/allxsmith/bestax/issues/285)
* **create-bestax:** stop claiming rbx puts innerRef on every component ([83f6f21](https://github.com/allxsmith/bestax/commit/83f6f21401c0eca92400838aef674cd159b47e5e))
* **create-bestax:** stop telling scaffolded apps a carried-over ref needs no work ([d1fe477](https://github.com/allxsmith/bestax/commit/d1fe477b7c7910a9863b3ae7415a6f91446d9642)), closes [#622](https://github.com/allxsmith/bestax/issues/622)
* **create-bestax:** stop the skills teaching a Theme call that does not compile ([2935bb2](https://github.com/allxsmith/bestax/commit/2935bb273d0da959049194f1498229cbbb61cfd3))
* **create-bestax:** synchronize version with bestax-bulma to 2.4.0 ([623ee79](https://github.com/allxsmith/bestax/commit/623ee79a5510261c7603dcb867db9baf3d7e6586)), closes [#96](https://github.com/allxsmith/bestax/issues/96)
* **create-bestax:** teach the skills the three components Bulma hides ([22dcff7](https://github.com/allxsmith/bestax/commit/22dcff753fd0cd84751a6ea9ecffc8f811483935))
* **create-bestax:** update template dependency to ^2.4.0 ([200971d](https://github.com/allxsmith/bestax/commit/200971d4500283a8be1d64c5bf3ca8396b76cdb1))
* **create-bestax:** use scenario-specific screenshot directories to prevent overwrites ([#108](https://github.com/allxsmith/bestax/issues/108)) ([c675957](https://github.com/allxsmith/bestax/commit/c675957d406d0c86907da06e6bdf7d71ec975b81)), closes [#107](https://github.com/allxsmith/bestax/issues/107)
* **create-bestax:** validate at submit in the bestax-form signup example ([0b9518f](https://github.com/allxsmith/bestax/commit/0b9518f595932182cabce5160892730079aed51c))
* **create-bestax:** wire labeled controls in the skill showcase story ([af49a16](https://github.com/allxsmith/bestax/commit/af49a160961f09047fad1b152115ee5623d3a0ae))
* **docs:** announce the hero copy, and stop remounting the icons ([98e2cb0](https://github.com/allxsmith/bestax/commit/98e2cb0236b68d0af54db7e8429f309d3b4cb325)), closes [#434](https://github.com/allxsmith/bestax/issues/434)
* **docs:** attribute four orphaned SCSS partials to the API pages that own them ([2f72490](https://github.com/allxsmith/bestax/commit/2f7249076574ff3840e57f79ed5dcf991b71b6b4)), closes [#543](https://github.com/allxsmith/bestax/issues/543)
* **docs:** correct Content Signals syntax in robots.txt ([#134](https://github.com/allxsmith/bestax/issues/134)) ([85dd9de](https://github.com/allxsmith/bestax/commit/85dd9de7c147b06f43b9e6a51c6c304a9530b121))
* **docs:** correct the frozen-install translation and reject leaked fences ([1883de3](https://github.com/allxsmith/bestax/commit/1883de3ddea548e13e022a8f40787cf9624de243))
* **docs:** drop dead nomodule ionicons fallback ([82be3e4](https://github.com/allxsmith/bestax/commit/82be3e4a1cefb5c72c79d5a30a06d013bb18cdd1))
* **docs:** emit per-page markdown so llms.txt links resolve ([#200](https://github.com/allxsmith/bestax/issues/200)) ([7877083](https://github.com/allxsmith/bestax/commit/7877083da55d53bdc57811ddc14d5065fd0efdae))
* **docs:** escape apostrophe in QuickStart notification text ([25d6d72](https://github.com/allxsmith/bestax/commit/25d6d7229d691245c3e2ca8475caaac7e9369478))
* **docs:** fail the build on broken anchor links ([0d2f497](https://github.com/allxsmith/bestax/commit/0d2f497112cc459275e243309bd2ca51a9977ac8)), closes [#467](https://github.com/allxsmith/bestax/issues/467)
* **docs:** generate llms.txt so the advertised homepage link resolves ([9fae464](https://github.com/allxsmith/bestax/commit/9fae464305595c284335eda65d721480d1accb25)), closes [#177](https://github.com/allxsmith/bestax/issues/177)
* **docs:** give every batch run its own port — slot reuse was corrupting runs ([6ef1755](https://github.com/allxsmith/bestax/commit/6ef1755cde7d0ae3a943963ba10fc5c7a193d0fe))
* **docs:** harden PackageManagerTabs and document how to author it ([5b0d3e6](https://github.com/allxsmith/bestax/commit/5b0d3e68389998b35a436ab6e90cc46e68949a37)), closes [#434](https://github.com/allxsmith/bestax/issues/434)
* **docs:** harden the hero copy button and share the tab storage key ([9e16cd7](https://github.com/allxsmith/bestax/commit/9e16cd7e9bdd97f7ac6707a74debe2fbc6295d4c))
* **docs:** improve homepage hero layout and button spacing ([5f7a5a7](https://github.com/allxsmith/bestax/commit/5f7a5a78faa3e51766d8f4449e93bc4d6519fde9))
* **docs:** make the eval batch resumable after a container restart ([d56229e](https://github.com/allxsmith/bestax/commit/d56229eb4ba2db2b5313b3051362fcae21df15d0))
* **docs:** make the hero package-manager switcher a real radiogroup ([aa14ff2](https://github.com/allxsmith/bestax/commit/aa14ff25efba2312776a430ee88b5e34ecaf52db)), closes [#434](https://github.com/allxsmith/bestax/issues/434)
* **docs:** make the preview deploy include dotfiles, and validate offset dates ([6162fec](https://github.com/allxsmith/bestax/commit/6162fecf4863f04c82800e7d70eb42222ec92192))
* **docs:** move robots.txt to correct deployment location ([#90](https://github.com/allxsmith/bestax/issues/90)) ([1e2aeee](https://github.com/allxsmith/bestax/commit/1e2aeee38fa01097db832b9bc7c920114db194b0))
* **docs:** rebrand and reorganize Storybook ([#83](https://github.com/allxsmith/bestax/issues/83)) ([dfb9937](https://github.com/allxsmith/bestax/commit/dfb99379b65135bc448f6f5e267fe2f473e8e106))
* **docs:** remove dead ionicons nomodule fallback script ([c96cc29](https://github.com/allxsmith/bestax/commit/c96cc2930e827e9ea9dfcfe8782cc0e5464a821e)), closes [#445](https://github.com/allxsmith/bestax/issues/445)
* **docs:** remove Google Analytics and add robots.txt ([94776f7](https://github.com/allxsmith/bestax/commit/94776f7a020af5411a8d679b794e09be2de7bf9e))
* **docs:** scope picker calendar/wheel vars to their constituent element ([888…
bestax-release-bot Bot pushed a commit that referenced this pull request Sep 21, 2026
## [4.2.9](https://github.com/allxsmith/bestax/compare/create-bestax@4.2.8...create-bestax@4.2.9) (2026-09-21)

### Bug Fixes

* **bestax-mcp:** restamp the index after the valid-values docs edit ([ff4512a](ff4512a)), closes [#521](#521)
* **bestax-migrate:** a spread hides the element, not the component ([7f88614](7f88614))
* **bestax-migrate:** an anchor cannot wrap an element whose parent is fixed ([1e2e78b](1e2e78b)), closes [#663](#663)
* **bestax-migrate:** an anchor may not wrap interactive content either ([5637976](5637976)), closes [#663](#663)
* **bestax-migrate:** announce the one removal that was still silent ([9f2e3ac](9f2e3ac))
* **bestax-migrate:** apply the nested-anchor rule on the plain-markup path too ([ba27e3a](ba27e3a)), closes [#663](#663)
* **bestax-migrate:** bound the link attributes by the component too, not just the element ([ca54273](ca54273))
* **bestax-migrate:** decide the href from the element, not the leftovers ([87ccb17](87ccb17)), closes [#662](#662)
* **bestax-migrate:** do not advise nesting an <a> inside an element that holds none ([156c793](156c793)), closes [#663](#663)
* **bestax-migrate:** drop an href on the targets that declare none ([478f7a4](478f7a4)), closes [#662](#662)
* **bestax-migrate:** give the TODO the remedy that works on the target it names ([fccb4d9](fccb4d9))
* **bestax-migrate:** judge every link attribute against the element, not as a group ([1825b9e](1825b9e)), closes [#368](#368)
* **bestax-migrate:** judge props against the component they will end up on ([f0241e4](f0241e4))
* **bestax-migrate:** keep a TODO on one line, and correct the link-attribute table ([581833e](581833e))
* **bestax-migrate:** keep an href the plain tag takes, and quieten the shadow TODO ([e78ced2](e78ced2))
* **bestax-migrate:** keep href on the anchor, and as inside its union ([894a633](894a633)), closes [#641](#641) [#662](#662) [#662](#662)
* **bestax-migrate:** keep the href `Dropdown.Item` now takes ([e261cdd](e261cdd)), closes [#663](#663)
* **bestax-migrate:** only rbx's spread can carry an `as` ([84a6f85](84a6f85))
* **bestax-migrate:** plain markup keeps the href its own tag accepts ([8dc9b0c](8dc9b0c))
* **bestax-migrate:** read iframe and label off their own content models ([6612821](6612821)), closes [#663](#663)
* **bestax-migrate:** read the element a target renders, not the type it declares ([7296a50](7296a50))
* **bestax-migrate:** read the element before advising an <a> inside it ([88a95a3](88a95a3)), closes [#663](#663)
* **bestax-migrate:** run the link cleanup on react-bulma-components' plain rewrites too ([8ea05cb](8ea05cb))
* **bestax-migrate:** say where the two link rules disagree, not that they agree ([8468858](8468858)), closes [#682](#682)
* **bestax-migrate:** stop conflating the two directions an anchor can be invalid ([c7dac64](c7dac64)), closes [#663](#663)
* **bestax-migrate:** take the anchor's other attributes with it, and stop guessing at a falsy href ([9382e4a](9382e4a))
* **bestax-migrate:** the component and the element must both allow the attribute ([c009e85](c009e85))
* **bestax-migrate:** trust an `as` a spread cannot overwrite, and stop three messages lying ([19fdb09](19fdb09))
* **bestax-migrate:** white-bis and white-ter are bestax colours now ([d951c2f](d951c2f))
* **bestax-migrate:** widen the element universe until it disagreed, and fix the Delete hint ([4979d94](4979d94))
* **bulma-ui:** a compound matches one simple selector, not co-occurrence ([#703](#703)) ([ce20396](ce20396))
* **bulma-ui:** carry the deprecated `icon` path through every consumer of IconProps ([b8eb722](b8eb722)), closes [#663](#663)
* **bulma-ui:** catch the other shape a declaration specifier can take ([4f69e20](4f69e20))
* **bulma-ui:** chunk the constants bundle as .cjs, and ask the path for the remedy ([83223f7](83223f7)), closes [#688](#688)
* **bulma-ui:** correct the sibling claim, and make the strip set's type check it ([7ffa0e7](7ffa0e7)), closes [#682](#682)
* **bulma-ui:** declare the deprecated `icon` path `Icon` still honours ([80124d1](80124d1)), closes [#663](#663)
* **bulma-ui:** define the kept props instead of assigning them ([b5722f2](b5722f2)), closes [#682](#682)
* **bulma-ui:** emit the CommonJS bundle as .cjs, so require() can load it ([f64286c](f64286c)), closes [#688](#688)
* **bulma-ui:** exempt everything module-sync serves, and pin the chunk guards ([c87f6a7](c87f6a7)), closes [#688](#688)
* **bulma-ui:** give the CommonJS chunks the extension too, and finish the target test ([bdcba5c](bdcba5c)), closes [#688](#688)
* **bulma-ui:** give the constants subpath a CommonJS types target ([e97d609](e97d609))
* **bulma-ui:** give the emitted declarations extensions, so their specifiers resolve ([#702](#702)) ([2a4672f](2a4672f))
* **bulma-ui:** judge an mjs require target, and certify module-sync by loading ([ce984f5](ce984f5)), closes [#688](#688)
* **bulma-ui:** judge both runtimes, not the modern one with a fallback ([525ef79](525ef79)), closes [#688](#688)
* **bulma-ui:** judge only the branches a require() can enter ([10ffd2e](10ffd2e)), closes [#688](#688)
* **bulma-ui:** judge what an older Node reaches behind module-sync ([5b4dd6d](5b4dd6d)), closes [#688](#688)
* **bulma-ui:** keep DropdownItemProps accepting every tag it always accepted ([d621b88](d621b88)), closes [#667](#667) [#667](#667) [#667](#667) [#663](#663) [#667](#667)
* **bulma-ui:** keep React's own node shapes out of the icon-props branch ([638e329](638e329)), closes [#663](#663)
* **bulma-ui:** keep the button default against a spread, and tag the deprecated props ([fcc148b](fcc148b)), closes [#663](#663)
* **bulma-ui:** let Dropdown.Item's props follow its constrained `as` ([f9c998f](f9c998f)), closes [#663](#663)
* **bulma-ui:** let Level.Item's anchor take the rest of an anchor's attributes ([#675](#675)) ([59e8e34](59e8e34))
* **bulma-ui:** match a spread's enumerability, and close the `type` gap ([84b5cd2](84b5cd2)), closes [#682](#682)
* **bulma-ui:** match compound selectors in either class order ([1cb026e](1cb026e))
* **bulma-ui:** stop a Dropdown.Item button submitting the form it sits in ([a27f0d6](a27f0d6)), closes [#663](#663)
* **bulma-ui:** stop predicting the symptom, and drop a claim about the corpus ([2af4883](2af4883)), closes [#688](#688)
* **bulma-ui:** strip only the keys a caller named, and correct three claims ([7747335](7747335)), closes [#682](#682) [#682](#682)
* **bulma-ui:** test the icon-config shape, and keep one copy of the guard ([f8c9c5b](f8c9c5b)), closes [#663](#663)
* **bulma-ui:** warn on the new white shades as component modifiers ([7c617a6](7c617a6))
* **bulma-ui:** withhold an href from a Dropdown.Item that is not an anchor ([f597cf2](f597cf2)), closes [#667](#667) [#667](#667) [#663](#663)
* **eslint-plugin:** a `true` display no longer buys silence on inert flex props ([a350ba8](a350ba8))
* **eslint-plugin:** a readable null is still nullish ([30ef3de](30ef3de))
* **eslint-plugin:** guard the textColor rewrite the way replacements are guarded ([a4028ec](a4028ec))
* **eslint-plugin:** judge only the JSX attribute that wins ([fc740d1](fc740d1)), closes [#686](#686) [#678](#678)
* **eslint-plugin:** judge only the values a spread cannot overwrite ([0b8d61e](0b8d61e))
* **eslint-plugin:** make the preset lint, and stop the fixes breaking code ([f39e49b](f39e49b))
* **eslint-plugin:** make the preset's file glob honest about its parser ([59d1a54](59d1a54))
* **eslint-plugin:** membership-test the shade before naming the class ([58599d1](58599d1))
* **eslint-plugin:** report both spellings of a `true` helper value ([ed3ddf9](ed3ddf9))
* **eslint-plugin:** stop reporting `radius` on Theme, which is a CSS variable ([b326ce5](b326ce5))
* **eslint-plugin:** stop three autofixes changing what renders ([4853aa5](4853aa5))
* **eslint-plugin:** withhold the color fix when the name is doubled ([85fd556](85fd556))
* refuse an ambiguous tagFormat rather than taking the first one ([e31c922](e31c922)), closes [#123](#123) [#705](#705)

### Features

* **bulma-ui:** add ./constants subpath export ([595cf3e](595cf3e))
* **bulma-ui:** add the white-bis and white-ter colours the CSS already ships ([0597580](0597580))
* **bulma-ui:** export the other-helper value tuples ([1346973](1346973))
* **eslint-plugin:** add @allxsmith/eslint-plugin-bestax ([790d4e9](790d4e9)), closes [#350](#350)
* **eslint-plugin:** check the other-helper props now that they have tuples ([15fced4](15fced4))
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 4.2.9 🎉

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] bulma-ui: props and ref types do not follow the polymorphic as

2 participants