Skip to content

feat(bestax-migrate): convert .select and .breadcrumb with the element inside them - #764

Merged
allxsmith merged 3 commits into
mainfrom
feat/bulma-classes-absorb
Sep 26, 2026
Merged

allxsmith merged 3 commits into
mainfrom
feat/bulma-classes-absorb

Conversation

@allxsmith

@allxsmith allxsmith commented Sep 26, 2026 •

Copy link
Copy Markdown
Owner

Part of #743, after the wrapper folds (#761). SelectBase renders the <select> inside .select itself, and Breadcrumb renders the <ul> inside .breadcrumb. So in both, two raw elements become one component, the other way round from a fold: the outer element names the component, and the inner one is the part it renders. This adds that.

<div className="select is-small">
  <select name="plan" onChange={pick}>
    <option>Free</option>
  </select>
</div>
// becomes
<SelectBase size="small" name="plan" onChange={pick}>
  <option>Free</option>
</SelectBase>

How it decides

  • A new entry field, absorbs, names the child's tag and where the component puts the attributes it's given. The planner gets the element's only child as a new fact (soleChild: its tag, classes and attributes), and the transform writes the component in that child's place: the element's props and attributes first, then the child's, and the element goes. Writing it in the child's place keeps the child's children where they were, and comments in the tags that go move onto the component's name.
  • SelectBase puts every attribute on the <select>, so the .select may carry nothing but a key, and the <select>'s attributes become SelectBase's. is-hovered and is-focused on the <select> become props, and any other class on it keeps the pair as markup. multiple renders both .is-multiple on the wrapper and the attribute on the <select>, so the two convert only as a pair, and size becomes multipleSize beside it (a number, or the expression as written). A select's color stays a class, like an input's, since color renders has-text-<color> too.
  • Breadcrumb renders its <ul> bare and puts what it's given on the <nav>, so the <ul> carries nothing. It writes aria-label="breadcrumbs" before those attributes, so a .breadcrumb converts with any label of its own, and without one it gets defaults:Breadcrumb.
  • Anything else keeps both as markup with a TODO: something beside the child (children:), an attribute that would move or be lost (attr), a spread or a computed class on the child (spread:, dynamic-class:).

The other surfaces

  • MCP (feat(bestax-mcp)): lookup_bulma_classes names SelectBase and Breadcrumb where it used to say "by hand", says each renders the element inside it, and says what moves where. .is-multiple says it needs a bare multiple on the <select>.
  • ESLint (fix(eslint-plugin)): the rule reports both with the converts message. Its "two families" test used .select, so it uses .dropdown and .modal now.
  • Skill and docs: a new "An element a component renders inside itself" section in the component map, rows in the prop map, the refusals in the unmappables, and a line in the migration guide. The family:select and family:breadcrumb recipes are gone. The ref: section also loses a sentence naming which components forward refs, which had gone stale.

Checked

  • The render truth test sweeps both roots like any other (every modifier and helper, and the fuzz), rendering the raw pair against the component. It adds a pass per root for the child: each of its classes, each attribute it hands over, the multiple pair and the size rename, and every refusal. Mapping is-hovered to the wrong prop fails it.
  • The props e2e typechecks the same cases, including multipleSize={4}; writing that as a string fails it.
  • The rules sweep now reaches every new refusal and holds its id to the vocabulary.
  • An absorbed fixture pair and both families in the kitchen sink render the same before and after, and the form fixture's select now converts. A second run changes nothing.
  • pnpm all passes locally.

Summary by CodeRabbit

  • New Features

    • Bulma .select markup can now be converted to SelectBase, including supported attributes and hover, focus, and multiple-selection settings.
    • Bulma breadcrumb markup can now be converted to Breadcrumb, with alignment, separator, and size settings supported.
    • Conversions retain the original markup when child elements or attributes cannot be safely represented.
  • Documentation

    • Updated migration guidance to cover select and breadcrumb conversions, supported properties, and cases where markup remains unchanged.

@allxsmith

Copy link
Copy Markdown
Owner Author

deep-review: fresh

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

Read absorb() and the absorbs handling in plan() in bestax-migrate/src/sources/bulma-classes/plan.ts, the absorb branch of the application loop plus childFacts and writeClassName in transform.ts, and the select and breadcrumb entries in class-map.ts, against bulma-ui/src/form/SelectBase.tsx and bulma-ui/src/components/Breadcrumb.tsx. Priorities: 1) a conversion that renders different markup than the raw pair, 2) a way the transform loses or mangles source when it writes the component in the child's place (comments, attributes, children, keys).

Skip the MCP and ESLint packages, generated files, fixtures and the markdown.

@coderabbitai

coderabbitai Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

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

Warning

Review limit reached

Next included review available in 38 minutes.

Check out review usage here.

View limit details

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

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

Learn how review limits work.

Review configuration:

⚙️ Run configuration

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

Review profile: CHILL

Plan: Advanced

Run ID: c0a5055d-6d26-489e-af8c-d118747d929c

📥 Commits

Reviewing files that changed from the base of the PR and between 1eaeef2 and a9d8082.

⛔ Files ignored due to path filters (1)
  • eslint-plugin/src/generated/metadata.ts is excluded by !**/generated/**
📒 Files selected for processing (25)
  • bestax-mcp/data/bulma-classes.json
  • bestax-mcp/data/skills.json
  • bestax-mcp/src/__tests__/bulma-classes-agree.test.ts
  • bestax-mcp/src/__tests__/server.test.ts
  • bestax-mcp/src/bulma-classes.ts
  • bestax-migrate/CLAUDE.md
  • bestax-migrate/e2e/bulma-classes-props.test.ts
  • bestax-migrate/e2e/bulma-classes-truth.test.ts
  • bestax-migrate/fixtures/bulma-classes-kitchen-sink/src/elements.tsx
  • bestax-migrate/fixtures/bulma-classes-kitchen-sink/src/layout.tsx
  • bestax-migrate/src/sources/bulma-classes/__testfixtures__/absorbed.input.tsx
  • bestax-migrate/src/sources/bulma-classes/__testfixtures__/absorbed.output.tsx
  • bestax-migrate/src/sources/bulma-classes/__testfixtures__/form.output.tsx
  • bestax-migrate/src/sources/bulma-classes/__tests__/rules.test.ts
  • bestax-migrate/src/sources/bulma-classes/__tests__/transform.test.ts
  • bestax-migrate/src/sources/bulma-classes/class-map.ts
  • bestax-migrate/src/sources/bulma-classes/plan.ts
  • bestax-migrate/src/sources/bulma-classes/rules.ts
  • bestax-migrate/src/sources/bulma-classes/transform.ts
  • docs/docs/guides/getting-started/migration/bulma-classes.md
  • eslint-plugin/src/__tests__/no-bulma-component-class.test.ts
  • scripts/gen-mcp-index.mjs
  • skills/bestax-migrate/references/bulma-classes/component-map.md
  • skills/bestax-migrate/references/bulma-classes/prop-map.md
  • skills/bestax-migrate/references/bulma-classes/unmappables.md

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Advanced

Run ID: 0f82e2ad-8ba5-4b76-927c-56b6e6c62acb

📥 Commits

Reviewing files that changed from the base of the PR and between eac461d and 1eaeef2.

⛔ Files ignored due to path filters (1)
  • eslint-plugin/src/generated/metadata.ts is excluded by !**/generated/**
📒 Files selected for processing (25)
  • bestax-mcp/data/bulma-classes.json
  • bestax-mcp/data/skills.json
  • bestax-mcp/src/__tests__/bulma-classes-agree.test.ts
  • bestax-mcp/src/__tests__/server.test.ts
  • bestax-mcp/src/bulma-classes.ts
  • bestax-migrate/CLAUDE.md
  • bestax-migrate/e2e/bulma-classes-props.test.ts
  • bestax-migrate/e2e/bulma-classes-truth.test.ts
  • bestax-migrate/fixtures/bulma-classes-kitchen-sink/src/elements.tsx
  • bestax-migrate/fixtures/bulma-classes-kitchen-sink/src/layout.tsx
  • bestax-migrate/src/sources/bulma-classes/__testfixtures__/absorbed.input.tsx
  • bestax-migrate/src/sources/bulma-classes/__testfixtures__/absorbed.output.tsx
  • bestax-migrate/src/sources/bulma-classes/__testfixtures__/form.output.tsx
  • bestax-migrate/src/sources/bulma-classes/__tests__/rules.test.ts
  • bestax-migrate/src/sources/bulma-classes/__tests__/transform.test.ts
  • bestax-migrate/src/sources/bulma-classes/class-map.ts
  • bestax-migrate/src/sources/bulma-classes/plan.ts
  • bestax-migrate/src/sources/bulma-classes/rules.ts
  • bestax-migrate/src/sources/bulma-classes/transform.ts
  • docs/docs/guides/getting-started/migration/bulma-classes.md
  • eslint-plugin/src/__tests__/no-bulma-component-class.test.ts
  • scripts/gen-mcp-index.mjs
  • skills/bestax-migrate/references/bulma-classes/component-map.md
  • skills/bestax-migrate/references/bulma-classes/prop-map.md
  • skills/bestax-migrate/references/bulma-classes/unmappables.md

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


Walkthrough

The migration planner and transformer now support converting a mapped wrapper together with its sole child. The Bulma mappings add SelectBase and Breadcrumb conversions, with corresponding lookup guidance, tests, examples, and documentation.

Changes

Absorbed component conversions

Layer / File(s) Summary
Absorption contracts and component mappings
bestax-migrate/src/sources/bulma-classes/class-map.ts, bestax-mcp/data/bulma-classes.json, docs/docs/guides/getting-started/migration/bulma-classes.md, skills/bestax-migrate/references/bulma-classes/*, eslint-plugin/src/__tests__/no-bulma-component-class.test.ts
The root mapping defines absorbed-child rules. .select maps to SelectBase, and .breadcrumb maps to Breadcrumb. The mappings and guidance specify modifier, attribute, and conversion conditions.
Planner validation and refusal rules
bestax-migrate/src/sources/bulma-classes/plan.ts, bestax-migrate/src/sources/bulma-classes/rules.ts, bestax-migrate/src/sources/bulma-classes/__tests__/rules.test.ts, bestax-migrate/e2e/bulma-classes-props.test.ts, bestax-migrate/CLAUDE.md, skills/bestax-migrate/references/bulma-classes/unmappables.md
The planner reads sole-child facts and returns absorbed props, attribute renames, or refusals. Tests and guidance cover child shape, classes, spreads, attributes, and configured attribute pairs.
Child replacement and conversion tests
bestax-migrate/src/sources/bulma-classes/transform.ts, bestax-migrate/src/sources/bulma-classes/__tests__/transform.test.ts, bestax-migrate/e2e/bulma-classes-truth.test.ts, bestax-migrate/src/sources/bulma-classes/__testfixtures__/*
The transformer replaces an absorbing wrapper with the component on its child and applies the planned attributes and props. Tests cover select and breadcrumb conversions, refusals, and comments.
Lookup guidance and usage examples
bestax-mcp/src/bulma-classes.ts, bestax-mcp/src/__tests__/bulma-classes-agree.test.ts, bestax-mcp/src/__tests__/server.test.ts, scripts/gen-mcp-index.mjs, bestax-mcp/data/skills.json, bestax-migrate/fixtures/bulma-classes-kitchen-sink/src/*
The MCP lookup returns absorption metadata and conversion explanations. Lookup tests and fixtures cover Select and Breadcrumb examples.

Priority: ➖ Normal

Estimated code review effort: 4 (Complex) | ~45 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant transform
  participant plan
  participant JSX_AST
  transform->>plan: ElementFacts with soleChild
  plan-->>transform: Conversion with absorbed props and attribute changes
  transform->>JSX_AST: Replace wrapper with component on child
Loading

Merge Risk: ⚪ Minimal · up to 1eaee

The reviewed conversions preserve the investigated accessibility label and keyed component identity. No actionable merge-blocking issue remains after normal checks.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 1eaee

The conversion has a meaningful design surface, but the inspected paths preserve or reject sensitive markup rather than silently moving it. No introduced security issue was established. Coverage is incomplete, so this is not a minimal-risk assessment.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The inspected effect is on JSX source converted by the migration and on subsequent lookup guidance. Any downstream exposure depends on adopting the converted UI; the inspected conversion path does not add a service or credential authority transition.

Trust Boundaries and Controls

  • observed — When absorption selects child attributes, they still enter the planner's attribute checks. The absorbed-child checks refuse spreads, unsupported or computed classes, a child key, conflicting renames, and select attributes that would no longer occupy the same element.

Resilience and Maintainability Implications

  • inferred — Refusing incompatible inputs before applying the absorbed-child splice limits accidental changes to form attributes or navigation markup. This is a containment property of the inspected conversion, not a guarantee for uninspected migration paths.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 46.67% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 30 functions across 18 files. (7 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: converting .select and .breadcrumb elements together with their nested elements.
Description check ✅ Passed The description provides a detailed summary, affected surfaces, related issue references, conversion rules, refusal cases, testing details, and local validation results. It does not reproduce the temp…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

Docstring coverage is 46.67% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 30 functions across 18 files. (7 skipped: 7 unsupported.)

✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

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

❤️ Share

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

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

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

Comment thread bestax-migrate/src/sources/bulma-classes/plan.ts Outdated

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Deep review — 1 blocking · 3 advisory

# Severity Area Finding Location
1 🟡 Minor Correctness A non-literal size={expr} renames to multipleSize and SelectBase then drops it, because attributeValue cannot tell size={3} from size={rows} bestax-migrate/src/sources/bulma-classes/plan.ts:604
2 🔵 Advisory Robustness The top-level drop loop runs before absorbs.renames are applied, and removeAttr(holder, undefined) is a silent no-op — unreachable today only because no absorbs entry declares untypedAttrs bestax-migrate/src/sources/bulma-classes/transform.ts:714
3 🔵 Advisory Robustness inTags re-attaches tagComments(child) to the name while child.openingElement/closingElement themselves survive the replace, so a comment recast hangs on either node would print twice; the new test asserts toContain, not a count bestax-migrate/src/sources/bulma-classes/transform.ts:709
4 🔵 Advisory Coverage orList's single-name branch is unreachable — the only entry with absorbs.modifiers has two bestax-migrate/src/sources/bulma-classes/plan.ts:470

Overall: The design is sound and the guards are unusually thorough — for attributesOn: 'child' the element may carry nothing but a key, for attributesOn: 'element' the child may carry nothing at all, and absorb() runs before the attribute/defaults/adoptsIdFrom checks so those read the attributes the component is actually given (which is what makes adoptsIdFrom correct for the <select>'s id). The riskiest part is the one place a converted value is forwarded conditionally rather than verbatim: SelectBase.tsx:112 writes size only when typeof multipleSize === 'number', and the planner cannot see the difference between size={3} and size={rows} — that is finding 1, and the only blocking one. Look at that first; everything else is on the record rather than in the way.

Residual risk:

  • Source lost when the component is written in the child's place — refuted. For .select the planner refuses on any element attribute but key (plan.ts:568), and key rides along on the merged attribute list (transform.ts:731); for .breadcrumb it refuses on any child attribute at all. Checked against absorbed.input/output.tsx and the truth sweep's refusal table.
  • Children or whitespace dropped by elementPath.replace(child) — refuted. soleChild only filters JSXText that reachesReact() rejects, so a comment or text beside the child refuses (children:SelectBase, covered by a new transform test), and the child's own children are never touched.
  • key moved or duplicated — refuted. A key on the child refuses (attr:key, and key was added to the rule vocabulary so the id stays informative); a key on the element stays on the component in its place, which is the same position in the array.
  • The id a labelled Field injects into SelectBase — refuted. adoptsIdFrom: ['Field'] walks every ancestor through bestaxAround/componentsAround, and Field publishes a targetId only when given a label prop (Field.tsx:230-236), which a same-run-converted .field never gets — so the id-less SelectBase inside a converted Field in form.output.tsx is markup-identical.
  • Class divergence between the raw pair and the component — refuted. The main truth sweep now renders both new roots for the root alone, for every modifier and for every helper token; is-primary stays a class (omits + textColor: null) exactly as it does for .input/.textarea, and bgColor: 'backgroundColor' lands on the wrapper either way.
  • Other conditionally-forwarded props — checked and clear. SelectBase.tsx:112 is the only runtime type check in either component; Breadcrumb's validBreadcrumbAlignments/Separators/Sizes guards only ever see literals the modifier table wrote.
  • Open (low): omits is documentation only — nothing in plan.ts reads it, so an omits entry drifting from modifiers fails nothing. Pre-existing and shared with .input/.textarea, not introduced here.

🏄 Clean set, dude — the codemod paddles out, swallows the <select> whole and comes back up with the same markup it went in with. Just one gnarly little ripple where a size={expr} can get washed off the board in plain JS; patch that and this one's glassy all the way to the beach.

…t inside them

SelectBase renders the <select> inside .select itself, and Breadcrumb the
<ul> inside .breadcrumb, so each pair is two raw elements that become one
component. A new entry field, absorbs, lets a root convert together with
its only child: the component is written in the child's place, with the
element's props first and the child's attributes after them.

- SelectBase gives its <select> every attribute it's given, so the
  .select may carry none but a key, and is-hovered and is-focused on the
  <select> become props. multiple pairs with .is-multiple, and size
  becomes multipleSize beside it.
- Breadcrumb renders its <ul> bare, and writes aria-label="breadcrumbs"
  unless it's given one, so the <ul> carries nothing and the nav needs a
  label of its own.
lookup_bulma_classes used to call .select and .breadcrumb families
converted by hand. It now names SelectBase and Breadcrumb, says each
renders the element inside it, and says what moves onto the component and
what the <select>'s classes and size become.
The generator reads the codemod's table, so the rule now reports both
with the converts message instead of "converted by hand".
@allxsmith
allxsmith force-pushed the feat/bulma-classes-absorb branch from 1eaeef2 to a9d8082 Compare September 26, 2026 20:44
@allxsmith

Copy link
Copy Markdown
Owner Author

On the deep review's advisory rows:

  • 2, the top-level drop running before the renames: the child's drops and renames now run first, so every name in drop is found where it is, by the name the component is given.
  • 3, a comment on the child's tags printing twice: only the child's tag names hand their comments over now, since those are the nodes that get replaced; the child's opening and closing elements stay, with whatever is on them. I couldn't find a spot where recast hangs a comment on those elements themselves (each one I tried landed on a name or an attribute), so the new count test (every comment in the tags, printed exactly once) passes on the old code as well. The change makes it hold by construction rather than by where recast attaches.
  • 4, orList's single-name branch: the wrapsChildren refusal in plan() built the same list by hand, so it uses orList now, and Card.Header's single part reaches that branch.

All three are folded into the feat(bestax-migrate) commit, and the regenerated index into feat(bestax-mcp).

@allxsmith

Copy link
Copy Markdown
Owner Author

deep-review: verify

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

Verify the fix for the open thread and the three advisory rows of the last review: the rename branch of absorb() in bestax-migrate/src/sources/bulma-classes/plan.ts (a size converts only as a literal), childAttributeValue and the absorb branch of the application loop in transform.ts (renames and drops before the element's drops, only the child's tag names handing their comments over), and orList in the wrapsChildren refusal. The new tests are in __tests__/transform.test.ts under 'an element a component renders inside itself', and in e2e/bulma-classes-truth.test.ts.

Skip the MCP and ESLint packages, generated files, fixtures and the markdown.

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://33c318e1.bestax.pages.dev

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Deep review (verify) — 1 resolved · 0 open

Thread Severity Finding Outcome
plan.ts:610 🟡 Minor · Correctness A non-literal size={expr} renamed to multipleSize and SelectBase then dropped it ✅ Verified fixed — replied and resolved

Overall: This pass settled threads and reviewed no commits. childAttributeValue (transform.ts:228) now carries a number literal through as a number, so the rename branch of absorb() can tell size={3} from size={rows} and refuses everything that is neither a number nor a string; given() keeps the literal verbatim so numberAttrs does not touch it, and a non-renderable string (size="04") still refuses downstream. The three advisory rows of the last review were all addressed in the same push and are noted below — nothing new was raised, per verify mode.

Advisories from the previous review, re-checked (no threads were open on these):

  • Drop-before-rename ordering (transform.ts:728-735) — addressed. absorbs.drop and absorbs.renames now run inside the if (child) block before the conversion.drop loop, so a conversion.drop naming a renamed attribute finds it on the child; holder still falls back to child, which is non-undefined whenever conversion.absorbs is set.
  • Comment duplication in inTags (transform.ts:717-724) — addressed. inTags now reads only child.openingElement.name / child.closingElement?.name, whose nodes are discarded by the child.openingElement.name = element.openingElement.name splice, while the openingElement and closingElement nodes of the child survive and keep their own comments. renameElement builds fresh name nodes, so the tag comments captured from the element are re-attached rather than duplicated. The new "keeps each comment in the tags, once" test counts occurrences (split(...).length - 1) across six comment positions instead of asserting toContain.
  • orList single-name branch (plan.ts:469-476) — addressed. The helper is now also used by the wrapsChildren refusal, where the unless list on card-header holds a single name (Card.Header.Title), so the branch is live. The extraction is behaviour-identical to the inline list it replaced.

Residual risk:

  • Other value kinds reaching the rename — refuted. literalValueOf yields exactly string | number | boolean | expression; childAttributeValue maps number to itself and everything else through attributeValue, which returns true only for a boolean literal that is true, else null. So a bare size, size={true}, size={false} and any expression all land on null/true and refuse.
  • A number literal leaking into a name-blind check — refuted. Every downstream consumer of the merged attributes map (dangerouslySetInnerHTML, ownProps, defaults/missing, adoptsIdFrom, dropsAttr) tests has(name); the two that read values (untypedAttrs equality, numberAttrs) both treat the null a number literal collapses to as "not convertible", which refuses or skips rather than mis-writing.
  • pairs seeing a number — refuted. spec.pairs requires child.attributes.get(name) === true, so multiple={1} refuses.
  • Open (low): the Build and Test check was still in_progress on a9d80822 when this pass ran, so the three new test blocks were verified by reading, not by execution (the steer is read-only). The React 18/19 matrix is green but covers bulma-ui only.

🏄 Came back out for one last check on that size set, and yeah — the codemod now knows a real number from a mystery wave and lets the sketchy ones roll on by. Threads all closed out, board is waxed, this one is good to paddle in.

@allxsmith
allxsmith merged commit 46b93a8 into main Sep 26, 2026
48 checks passed
@allxsmith
allxsmith deleted the feat/bulma-classes-absorb branch September 26, 2026 22:30
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 2.10.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 1.5.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 5.16.10 🎉

The release is available on:

Your semantic-release bot 📦🚀

@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 4.2.13 🎉

The release is available on:

Your semantic-release bot 📦🚀

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant