Repository navigation
fix(bulma-ui): place a portaled picker panel by its coordinates alone - #886
Conversation
A portaled DateInput, TimeInput or DateTimeInput panel is fixed to the viewport at the top and left the positioning hook sets inline, but the corner classes still applied their own right and bottom. At bottom-right, including `auto` resolving to it, `right: 0` stretched the panel to the viewport's right edge. At the top corners, `bottom: calc(100% + offset)` collapsed the box to its padding while the content drew outside its background. The portal rule now resets right and bottom to auto, so only the inline coordinates place the panel. The in-place corners are unchanged. Popover's portal rule already resets both, so it needs no change. The new styles test compiles the partial plain and under a class prefix and checks every corner of all three pickers, portaled and in place.
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 36 minutes. View limit detailsLimit details: You’ve used the included review currently available. Review configuration: ⚙️ Run configuration
📒 Files selected for processing (12)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Preview DeploymentPreview URL: https://32451782.bestax.pages.dev |
There was a problem hiding this comment.
Deep review — 0 blocking · 2 advisory
| # | Severity | Area | Finding | Location |
|---|---|---|---|---|
| 1 | 🔵 Advisory | Robustness | The new test asserts the declarations (right: auto / bottom: auto), not the geometry the bug was about — jsdom does no layout, so it cannot regress-guard the 700px-wide / collapsed box itself |
bulma-ui/src/form/__tests__/PickerPopover.styles.test.tsx:94 |
| 2 | 🔵 Advisory | API | A portaled panel's gap is the hook's hardcoded offset: 4, so --bulma-picker-popover-offset (listed in all three pickers' theming tables) moves an in-place panel and not a portaled one |
bulma-ui/src/form/_pickerInternals/PickerPopover.tsx:44 |
Overall: The change is sound and minimal, and it is the right fix rather than a patch over a symptom. I verified the mechanism independently: with position: fixed, right: 0 alongside an inline left makes CSS solve width to fill to the viewport edge, and bottom: calc(100% + offset) alongside an inline top solves height to a negative value that clamps to 0 — exactly the two shapes the PR body describes. Resetting both in the later-but-equal-specificity .is-portal block (0,2,0 against the corners' 0,2,0, portal rule last in source order) is enough for the cascade, and it also repairs the hook's measurement: pre-fix a portaled top-corner panel was measured while collapsed, so top: rect.top - height - offset was computed from a wrong height; post-fix the first layout-effect pass measures a natural box because bottom is auto before the inline top exists. useAnchoredPosition has exactly two call sites (Popover.tsx, PickerPopover.tsx) and Popover's portal rule already resets both, so the fix closes the class rather than one instance. 1755 tests across src/form + Popover pass, including the new file's 48 cases. The riskiest part is that the regression guard is weaker than the bug it guards (advisory 1) — a human should look there first, and then at whether advisory 2 is worth folding in now that portaled panels actually render.
Residual risk:
- Other portaled panels carrying corner classes — refuted.
is-portalappears in only two partials,_popover.scssand_picker-popover.scss;_toast.scssand_badge.scssuse corner classes but never portal. Popover's rule already carriesright: auto; bottom: autoplus a margin flip for its top corners (bulma-ui/src/scss/components/_popover.scss:97-105), and it is the only other consumer ofuseAnchoredPosition. position="auto"not exercised by the new test — refuted as a real gap.autois resolved to one of the same four corner classes before the class is emitted, so the fix covers it by construction; and in jsdom everygetBoundingClientRect()is zero, soresolveAutoalways returnsbottom-left. Anautocase would assert nothing the explicitbottom-leftcase already does.- Paint before the first measurement — refuted. On the commit before the layout effect runs, a portaled bottom-corner panel still inherits
top: calc(100% + offset)from the corner rule (.is-portalresets onlyright/bottom), which for a fixed box is one viewport down.useClientLayoutEffectisuseLayoutEffectin the browser, so the inlinetop/leftland before paint. The server path is unreachable: picker open state isuseState(false)(bulma-ui/src/form/DateInputBase.tsx:297) with nodefaultOpen, so SSR renders no panel at all and there is no hydration-flash window. - Shrink-to-fit squeezing the panel now that
rightisauto— refuted. For right cornersleft = rect.right - width, so the available width is at least the measured width whenever the anchor is on screen. For left corners the behaviour is identical to pre-fix (neither corner declaredright), and the calendar grid's min-content floor keeps it from compressing. - Open: the test's assertions are satisfied by the two declarations merely existing, so a future regression that re-breaks the fixed box through a different property — an added
width, aninsetshorthand, a consumer override at higher specificity — would still pass. jsdom cannot see it, and closing it would need a real layout engine, which this repo's styles-test pattern does not have. - Open: the offset asymmetry in advisory 2. Harmless at defaults (
$picker-popover-offset: 4pxequals the hook'soffset = 4), divergent only for a consumer who overrides the variable. Popover's answer —offset: 0plusstyledGapplus margin-based gaps kept in the portal rule — is not directly transplantable, because the picker encodes its gap incalc(100% + …)ontop/bottomrather than in margins.
🏄 Two lines of
autoand the panel stops hanging ten off the back of the board — clean little fix, no wax left on the deck, paddles out as-is. The 48-case test set is a solid lineup, just know it's watching the sets from the beach, since jsdom never actually gets in the water.
📸 Story screenshots at handoff —
|
…iable A portaled DateInput, TimeInput or DateTimeInput panel sat the hook's fixed 4px from its input, so `--bulma-picker-popover-offset` moved an in-place panel and not a portaled one. The portal rule now puts the gap in a margin on the side facing the input, negative above it, as Popover does. The coordinates leave the gap out and `auto` reads it off the panel through `marginGap`, which moves out of Popover into the positioning hook so both use it. The styles test reads declarations, which jsdom can do without layout, so a new AppendToBody story on DateInput checks the geometry in a real browser. Its play function opens each corner and checks the panel sits on its input's edge, the gap away, and holds its content. Against the CSS before this PR the bottom-right panel ran to the viewport's edge and the top panels overflowed, and the story fails. The Storybook smoke passes run it in light and dark.
Preview DeploymentPreview URL: https://6ff4ce13.bestax.pages.dev |
|
Every finding from the review, fixed in abc8c50:
|
|
deep-review: fresh The advisories from the last review are fixed or answered in the comment above; this reviews abc8c50. |
There was a problem hiding this comment.
Deep review — 0 blocking · 5 advisory
| No. | Severity | Area | Finding | Location |
|---|---|---|---|---|
| 1 | 🔵 Advisory | API | The PR body is stale against commit abc8c503 — it still says "Left as is: a portaled panel's gap comes from the hook's fixed offset rather than --bulma-picker-popover-offset, so overriding that variable doesn't move a portaled panel", which is exactly what the second commit changed. The title ("place a portaled picker panel by its coordinates alone") no longer covers the second half either. Maintainer action — neither this review nor the fix agent can edit a PR body. |
PR description |
| 2 | 🔵 Advisory | API | An in-place panel's auto resolution still reserves the hook's hard-coded 4 rather than the real --bulma-picker-popover-offset, so a themed offset larger than 4px can let auto pick a bottom corner with no room for the gap — the asymmetry the portaled half of this PR just removed |
bulma-ui/src/form/_pickerInternals/PickerPopover.tsx:55 |
| 3 | 🔵 Advisory | API | register-vars declares --bulma-picker-popover-offset on .picker-popover itself, and a custom property declared on an element always beats the inherited value, so the gap tracks that variable only through $picker-popover-offset or a rule on the panel's own class — a Theme/:root override is shadowed. Pre-existing and systemic to every extras partial (Theme.tsx:59-62 already records the mechanic for --bulma-shadow), and equally true of the in-place path before this PR |
bulma-ui/src/scss/form/_picker-popover.scss:25 |
| 4 | 🔵 Advisory | Robustness | The only browser-side geometry guard is a story play function inside the smoke gate, and it has two fragile edges: Animation.finished rejects when an animation is cancelled, and a rejection inside Promise.all fails the story rather than skipping the wait; and the overflow probe subtracts integer-rounded scrollHeight/clientHeight, so a 1px rounding reads as content overflow. Green on this SHA in both passes, but a flake here reds every open PR |
bulma-ui/src/form/DateInput.stories.tsx:809 |
| 5 | 🔵 Advisory | Correctness | The new SCSS comment says "the gap is a margin on the side facing it", which reads as margin-bottom for the two top corners — they use a negative margin-top. Deleting "on the side facing it" leaves the sentence true |
bulma-ui/src/scss/form/_picker-popover.scss:63 |
Overall: Sound, and the second commit is a better fix rather than a patch over the first — moving the gap out of the coordinates and into a margin is the shape Popover already uses, and hoisting styledGap into a shared marginGap means the hook's two call sites now agree instead of one carrying a private copy. I re-derived the geometry against CSS 2.1 §10.6.4 (an absolutely positioned top places the margin edge, so top: rect.bottom with margin-top: offset lands the border box at rect.bottom + offset, and top: rect.top − height with margin-top: −offset lands its bottom at rect.top − offset) — both match the story's assertions exactly, and at the default 4px the rendered result is the same as the first commit, so this is purely the change that makes the variable live. The riskiest part is advisory 4: that story is the only thing able to see this defect class at all, and it now sits in a gate that fails every PR if it flakes — look there first, then at advisory 1, since the squash body is what ships in the changelog.
Residual risk:
- Other portaled surfaces carrying corner classes — refuted.
is-portalappears in exactly two partials (_popover.scss,_picker-popover.scss);Modal.tsx/Dialog.tsxportal but carry no corner classes, anduseAnchoredPositionstill has exactly two call sites, both of which now passmarginGap. autooscillating because it reads a margin the corner it just resolved sets — refuted.marginGaptakes the absolute magnitude and both corner groups set the same offset in magnitude, so the reported gap is identical whichever class is applied, and there is no second-pass flip. Exercised by the newPickerPopover.test.tsx:335case, which settles onis-top-leftfrom a 20px margin.- A browser-invisible regression surviving the jsdom tests — refuted for this SHA empirically rather than by reading. Chromium will not launch in this sandbox (
playwright installcannot reach its CDN here), so I read CI instead: job111475356886onabc8c503showssrc/form/DateInput.stories.tsxPASS underbrowser: chromiumin both the light and the dark smoke pass, so the play function's four-corner edge/gap/overflow assertions did execute and did hold in a real engine. Locally I ran the six jsdom suites the diff touches (172 tests), the full bulma-ui coverage run (156 suites / 5568 tests,useAnchoredPosition.tsat 100% on every metric),typecheck:tests,eslintover all five changed sources, andcheck:conformance— all green. - A portaled panel still leaving the viewport — open, pre-existing, untouched by the diff. An explicit
positionis never re-resolved, andresolveAutochecks width only on the horizontal axis, with no check that atop-*corner fits above the anchor, so a panel can still run off the top or the right. This diff changes where the gap comes from, not the fit policy. - In-place
autounder a themed offset — open; advisory 2 above.
🏄 Clean little follow-through, dude — the first commit stopped the panel blowing out to the viewport edge, and this one hands the gap back to the offset variable so themers finally get a wave to ride. The chromium pass already called it good; just freshen that PR body before you paddle out.
|
deep-review: fresh Main is merged in, so this review posts every finding, advisory included, as its own thread. It reviews 73d4c74. |
Preview DeploymentPreview URL: https://82ecb3cb.bestax.pages.dev |
There was a problem hiding this comment.
Deep review — 2 blocking · 3 advisory
| No | Severity | Area | Finding | Location |
|---|---|---|---|---|
| 1 | 🟠 Major | Correctness | The new right/bottom reset on .is-portal loses the cascade to the TimeInput :has(.timeinput-panel) mobile sheet rule (equal specificity, emitted later), so a portaled TimeInput panel at or below 768px still stretches — and the styles test compiles the bare partial, so it cannot see it |
bulma-ui/src/scss/form/_picker-popover.scss:66 |
| 2 | 🟡 Minor | API | The PR body still says a portaled panel takes no gap from --bulma-picker-popover-offset, which abc8c503 is precisely the commit that fixed (maintainer action — the finding has no line of its own) |
bulma-ui/src/components/Popover.tsx:18 |
| 3 | 🔵 Advisory | Robustness | Animation.finished rejects on cancel, so Promise.all turns a cancelled fade-in into a Storybook gate failure; the scrollHeight probe is rounding-sensitive too |
bulma-ui/src/form/DateInput.stories.tsx:809 |
| 4 | 🔵 Advisory | API | auto on an in-place panel still budgets the hard-coded 4px from the hook, so a themed offset can overflow the viewport — the asymmetry this PR removes on the portaled path only |
bulma-ui/src/form/_pickerInternals/PickerPopover.tsx:63 |
| 5 | 🔵 Advisory | Correctness | The comment calls the gap a margin on the side facing the anchor, but both corner groups use margin-top — the next reader is invited to correct it to margin-bottom, which silently does nothing |
bulma-ui/src/scss/form/_picker-popover.scss:63 |
Overall: The core change is right and well evidenced. Resetting right and bottom on .is-portal is the correct fix for a fixed box placed by coordinates; moving the gap into margin-top makes --bulma-picker-popover-offset real for portaled panels; and hoisting styledGap into marginGap is a verbatim move that leaves Popover behaviour untouched, with the coordinate deltas in PickerPopover.test.tsx being exactly the 4px that left the coordinates. The riskiest part is that the confidence of the new test does not reach as far as it reads: it compiles form/picker-popover in isolation, so the one later partial that overrides .picker-popover — the TimeInput mobile sheet — wins the cascade unseen (finding 1). Look at that first, then rule on the stale paragraph in the PR body (finding 2), since that text becomes the squash body and the changelog.
Residual risk:
- The TimeInput sheet rule at or below 768px — open, posted as finding 1. The only live path I found where the addressed failure class survives this fix.
- Other partials overriding
.picker-popover— refuted: a grep oversrc/scssfinds_timeinput.scss:346as the only rule outside_picker-popover.scssthat targets the class, and the lonemarginin_dateinput.scssis on.dateinput-cell:157, somarginGapreads nothing stray. - An
autofeedback loop through the margin it reads — refuted: both corner groups use the same magnitude (+offsetand-1 * offset), somarginGapreturns the same number before and after a flip, andfitsBelowinresolveAutocannot oscillate on it. - The prefixed flavour — refuted: the styles test compiles with a
bestax-class prefix and asserts the portal reset and the margin for all three pickers at all four corners. 172 tests green locally, withuseAnchoredPosition.tsandPickerPopover.tsxat 100% statements. - Insets left unreset on
.is-portal— open but masked: the rule resetsrightandbottombut not thetop: calc(100% + offset)of the bottom corners, which on a fixed box resolves against the viewport. Every real path masks it with the inlinetopthe hook sets, so it bites only if a measurement bails with no coordinates — not reachable today, because the panel and its anchor mount together. marginGapcalls the globalgetComputedStylewhile the hook resolvesviewfrom theownerDocumentof the anchor for iframe support. Worst case is a zero gap and a 4px-optimisticautorather than a thrown error, and it predates this PR: the function moved verbatim out ofPopover.tsx.- The
gapin the play function isparseFloatof the raw custom-property token — a theme setting the offset inremwould make the expectation of the story disagree with the real margin. No story in the repo does that, and it fails loudly rather than silently if one ever does.
🏄 Clean little set on this one, dude — the portal rule finally stops fighting its own corners, and the gap rides the theme variable like it always should have. Just watch the inside break: the narrow-screen TimeInput sheet still owns
rightandbottom, and the new test is paddling in a different lineup than the one that ships.
At 768px wide or less, TimeInput's sheet rule sets right and bottom on any picker popover that holds a TimeInput panel. It ties the portal reset on specificity and comes later, so a portaled TimeInput panel still stretched between its inline top and left and the sheet's insets. The sheet now skips a portaled panel, which keeps its corner, and appendToBody's TSDoc says so. The styles test compiled the picker partial alone, so a later partial was out of its reach. Placement is now checked in every published stylesheet at a phone and a desktop width, ranking rules by specificity and reading width media queries, neither of which jsdom's cascade does. The portaled TimeInput cases failed at phone width in every sheet before this change. The portal rule's comment no longer says the gap is a margin on the side facing the anchor, since the top corners use a negative margin-top.
A cancelled animation rejects `finished`, which failed the play function instead of skipping the wait, so the story settles them rather than awaiting them. The overflow probe also allows 1px, since the scroll and client sizes are each rounded to whole pixels.
|
deep-review: verify Every open thread has a reply: fixed, with the commit, or refuted with a reason. This settles them on e6261ed. |
Preview DeploymentPreview URL: https://4566cee8.bestax.pages.dev |
There was a problem hiding this comment.
Deep review (verify) — 5 resolved · 0 open
| # | Severity | Area | Thread | Disposition | Location |
|---|---|---|---|---|---|
| 1 | 🟠 Major | Correctness | is-portal lost the cascade to TimeInput's mobile sheet rule |
Verified fixed | bulma-ui/src/scss/form/_timeinput.scss:349 |
| 2 | 🟡 Minor | API | PR body stated the opposite of what the branch ships | Verified fixed | PR description |
| 3 | 🔵 Advisory | Robustness | A cancelled animation turned the browser-side geometry guard into a gate failure | Verified fixed | bulma-ui/src/form/DateInput.stories.tsx:810 |
| 4 | 🔵 Advisory | API | auto on an in-place panel reserves a hard-coded 4px |
Reason accepted (#904) | bulma-ui/src/form/_pickerInternals/PickerPopover.tsx:63 |
| 5 | 🔵 Advisory | Correctness | "the side facing it" vs both corner groups using margin-top |
Verified fixed | bulma-ui/src/scss/form/_picker-popover.scss:60 |
Overall: This pass settled threads and reviewed no commits. All five of my open threads are now resolved — four as fixed in 78594c9e/e6261ed7 and in the PR body, and one on a reason that holds: the in-place auto estimate predates this PR, the follow-up is tracked in open issue #904, and the author's objection to my insetGap sketch is correct (a positioned box resolves top to a used px value on the top corners, so the sketch would clamp to 0 there — a code suggestion of mine that would not have worked as written). The strongest part of the fix round is the test: PickerPopover.styles.test.tsx now compiles every published stylesheet and ranks the placement rules itself by importance → inline → specificity → source order with width media queries applied, which is what made the TimeInput cascade defect visible to jsdom at all. A human should sanity-check that hand-rolled cascade model, since it is now the thing standing between a later .picker-popover rule and a regression.
Residual risk: this was a verify pass, so no new hunt was run. For the record on what I re-checked while settling:
- The
:not(.is-portal)guard removes the match entirely rather than relying on specificity, so source order betweenpicker-popoverandtimeinputinform/_index.scssno longer matters for a portaled panel — refuted by reading the compiled selector and by the published-sheet cases at 375px passing for all three pickers × four corners. - The styles test's
placement()ignores physical-vs-logical conflicts only for theinset*shorthand, which it asserts is absent per matching rule — so aninset-block/inset-inlineadded later fails loudly rather than silently (PickerPopover.styles.test.tsx:291). - 240 tests across
PickerPopover.styles.test.tsx,PickerPopover.test.tsxanduseAnchoredPosition.test.tsxpass one6261ed7.
🏄 Paddled back out to check the set I called earlier, and every wave came in clean — the TimeInput sheet no longer drops in on the portaled panel, the story settles its animations instead of wiping out, and the one left alone has a ticket with its name on it. All threads closed out, good to go.
## [5.26.3](https://github.com/allxsmith/bestax/compare/@allxsmith/bestax-bulma@5.26.2...@allxsmith/bestax-bulma@5.26.3) (2026-10-05) ### Bug Fixes * **bulma-ui:** fire the pickers' onOpen and onClose once under StrictMode ([#896](#896)) ([20b51ed](20b51ed)) * **bulma-ui:** let focus follow the keys in an inline calendar, and skip disabled days for the tab stop ([#885](#885)) ([f55af27](f55af27)) * **bulma-ui:** make Theme colorMode switch the scheme under the prefixed builds ([#894](#894)) ([2bd6ec2](2bd6ec2)) * **bulma-ui:** place a portaled picker panel by its coordinates alone ([#886](#886)) ([040299b](040299b)) * **bulma-ui:** read picker bounds and months in years 0 to 99 as written ([#890](#890)) ([02fb619](02fb619)) * **bulma-ui:** start a date picker's focus on the focused cell ([#897](#897)) ([6a55714](6a55714)) * **bulma-ui:** stop the indeterminate progress bar and skeleton pulse under reduced motion ([bcf5407](bcf5407))
|
🎉 This PR is included in version 5.26.3 🎉 The release is available on: Your semantic-release bot 📦🚀 |
# [2.25.0](https://github.com/allxsmith/bestax/compare/bestax-migrate@2.24.0...bestax-migrate@2.25.0) (2026-10-07) ### Bug Fixes * **bulma-ui:** announce polite notifications through a status region kept from mount ([#835](#835)) ([c93478d](c93478d)) * **bulma-ui:** answer the granularity review on native input and blur ([7a17486](7a17486)) * **bulma-ui:** attach useFocusTrap to a container that mounts after it turns on ([17a944d](17a944d)) * **bulma-ui:** bring File and Taginput under the bare-Control Field rule ([cdaa6c2](cdaa6c2)) * **bulma-ui:** clear a picker's unused seed whenever its popover closes ([cbe86c5](cbe86c5)) * **bulma-ui:** color the calendar from the color prop and read TimeInput's wheel variables ([2251e67](2251e67)), closes [#832](#832) * **bulma-ui:** commit nothing when a picker popover is dismissed ([0a46209](0a46209)) * **bulma-ui:** commit nothing when Enter confirms untouched picker text ([773e146](773e146)) * **bulma-ui:** commit nothing when focus leaves a picker untouched ([30b4849](30b4849)) * **bulma-ui:** draw the time wheel focus ring where the wheel's mask shows it ([e1d8c9f](e1d8c9f)), closes [#832](#832) * **bulma-ui:** fall back when useFocusTrap's initialFocusRef can't take focus ([c191931](c191931)) * **bulma-ui:** fire the pickers' onOpen and onClose once under StrictMode ([#896](#896)) ([20b51ed](20b51ed)) * **bulma-ui:** give the selected calendar cell a ring that shows on its fill ([b3eecc6](b3eecc6)) * **bulma-ui:** hide a picker's launcher for a loading Control it sits in ([9a3888e](9a3888e)) * **bulma-ui:** hide a picker's launcher only for the spinner it draws ([7a28a0e](7a28a0e)) * **bulma-ui:** hold Portal to looking a selector up on each render ([8fe02ce](8fe02ce)) * **bulma-ui:** hold the year-1 floor under a max before it ([4f6eb18](4f6eb18)) * **bulma-ui:** judge image map areas by their image in useFocusTrap ([af7bc59](af7bc59)) * **bulma-ui:** keep a tab stop in the year list when the year falls outside it ([fe028c1](fe028c1)) * **bulma-ui:** keep an empty picker's seed while a portaled popover is open ([1e66528](1e66528)) * **bulma-ui:** keep an inline date picker's calendar on its released id ([c26da07](c26da07)), closes [#897](#897) [#897](#897) * **bulma-ui:** keep button defaults through a spread, and type the buttons that had none ([#853](#853)) ([0810482](0810482)) * **bulma-ui:** keep button types and Avatar's accessible name through a spread ([#826](#826)) ([dc798d4](dc798d4)) * **bulma-ui:** keep the Field for horizontal and fieldClassName in a bare Control ([e4dc513](e4dc513)) * **bulma-ui:** keep the picker focus rings visible in every color ([612aa09](612aa09)) * **bulma-ui:** let focus follow the keys in an inline calendar, and skip disabled days for the tab stop ([#885](#885)) ([f55af27](f55af27)) * **bulma-ui:** let the picker bases give way to a loading Control too ([66e803a](66e803a)) * **bulma-ui:** let useFocusTrap go of a container that leaves while it is on ([8c56d7a](8c56d7a)) * **bulma-ui:** make auto leave room for an in-place picker panel's themed offset ([8c534bd](8c534bd)), closes [#904](#904) * **bulma-ui:** make Theme colorMode switch the scheme under the prefixed builds ([#894](#894)) ([2bd6ec2](2bd6ec2)) * **bulma-ui:** make useFocusTrap follow radio groups and initialFocusRef past the trap ([d6219d4](d6219d4)) * **bulma-ui:** match a picker's opening focus only inside its calendar ([e3c22ed](e3c22ed)) * **bulma-ui:** place a portaled picker panel by its coordinates alone ([#886](#886)) ([040299b](040299b)) * **bulma-ui:** place toasts and notifications at the position they were shown with ([#834](#834)) ([62feab9](62feab9)) * **bulma-ui:** read clicks and focus inside a shadow root ([474f2cc](474f2cc)) * **bulma-ui:** read picker bounds and months in years 0 to 99 as written ([#890](#890)) ([02fb619](02fb619)) * **bulma-ui:** restore a portaled Modal's focus to an opener in a shadow root ([c564bd3](c564bd3)) * **bulma-ui:** return focus to the input when a date picker closes ([b741264](b741264)) * **bulma-ui:** settle Popover's deep review findings ([feadaf4](feadaf4)) * **bulma-ui:** start a date picker's focus on the focused cell ([#897](#897)) ([6a55714](6a55714)) * **bulma-ui:** stop Bulma's spinners under reduced motion in every stylesheet ([b234712](b234712)), closes [#770](#770) * **bulma-ui:** stop form wrappers nesting a Field in a bare Control ([2c6d295](2c6d295)) * **bulma-ui:** stop the date pickers at year 1 ([853142a](853142a)) * **bulma-ui:** stop the indeterminate progress bar and skeleton pulse under reduced motion ([bcf5407](bcf5407)) * **bulma-ui:** stop the Rate pop and DateTimeInput scrim under reduced motion ([3a59129](3a59129)) * **bulma-ui:** stop TimeInput reopening on the focus its popover hands back ([1c87c15](1c87c15)) * **bulma-ui:** warn when a root Theme drops its className and helpers ([05c10e0](05c10e0)) * **eslint-plugin:** judge Columns' gap by its own steps, and lengths as lengths ([4786c8d](4786c8d)) ### Features * **bestax-mcp:** publish to the official MCP Registry ([74efc7f](74efc7f)) * **bestax-migrate:** convert the gap, position, overflow, radius and aspect-ratio helpers ([13dcf63](13dcf63)) * **bulma-ui:** add Bulma's gap helper props to every component ([#877](#877)) ([1bd4abc](1bd4abc)) * **bulma-ui:** add Bulma's position, overflow, radius and aspect-ratio helper props ([#845](#845)) ([64fb91c](64fb91c)) * **bulma-ui:** add Collapses, an accordion group for Collapse ([#849](#849)) ([a12c823](a12c823)) * **bulma-ui:** add Loader, Bulma's inline spinner ([c5e9eb0](c5e9eb0)), closes [#770](#770) * **bulma-ui:** add month and year pickers to DateInput through granularity ([c4cfc2b](c4cfc2b)), closes [#773](#773) * **bulma-ui:** add Popover ([2e17fac](2e17fac)), closes [#776](#776) * **bulma-ui:** export ClientOnly and useIsHydrated ([2c0c1e6](2c0c1e6)) * **bulma-ui:** export Portal ([346d8c2](346d8c2)) * **bulma-ui:** export useFocusTrap, counting the stops the browser's Tab visits ([c304fef](c304fef)), closes [#772](#772) * **bulma-ui:** make columnGap the column gap helper on Theme ([eb2c611](eb2c611)), closes [#694](#694) * **eslint-plugin:** check the gap helper props ([b53a749](b53a749))
|
🎉 This PR is included in version 2.25.0 🎉 The release is available on: Your semantic-release bot 📦🚀 |
## [4.2.13](https://github.com/allxsmith/bestax/compare/create-bestax@4.2.12...create-bestax@4.2.13) (2026-10-08) ### Bug Fixes * **bestax-mcp:** give .image's ratios their reason in the lookup ([3ea4d0c](3ea4d0c)) * **bestax-mcp:** say an .image converts around elements written out, not an expression ([49bb27b](49bb27b)) * **bestax-migrate:** convert an .image around its children only when they're elements ([ff99907](ff99907)) * **bestax-migrate:** flag react-bulma-components Pagination's delta={0} rather than renaming it ([e339ff1](e339ff1)) * **bestax-migrate:** keep a .menu-list around a bestax Menu.List as markup ([2119c3f](2119c3f)) * **bestax-migrate:** keep a Modal part as markup inside an existing bestax Modal ([cfd5f15](cfd5f15)) * **bestax-migrate:** keep a named anchor as markup instead of saying its name does nothing ([74dc360](74dc360)), closes [#fragment](https://github.com/allxsmith/bestax/issues/fragment) * **bestax-migrate:** keep a page link as markup when its li is a component's only child ([0e72683](0e72683)) * **bestax-migrate:** know a bestax part imported under its flat export ([7a325ee](7a325ee)) * **bestax-migrate:** leave a wrapper tag alone when none of its classes would become a prop ([2397b9d](2397b9d)) * **bestax-migrate:** leave a wrapper tag with no helper class alone, TODOs and all ([1167a29](1167a29)) * **bestax-migrate:** map react-bulma-components Pagination onto the props it now renders from ([6cd4b51](6cd4b51)) * **bestax-migrate:** rename rbx innerRef to ref on a plain Navbar.Item too ([bb6ace0](bb6ace0)), closes [#734](#734) * **bestax-migrate:** say why .image's ratios stay classes ([2fbfbd5](2fbfbd5)) * **bestax-migrate:** write a File text with a backslash as a string ([212831e](212831e)) * **bestax-migrate:** write a tabIndex string as a number on every root ([546bf8a](546bf8a)), closes [#814](#814) * **bestax-migrate:** write isFullwidth from react-bulma-components too ([01da047](01da047)) * **bestax-migrate:** write isFullwidth rather than its deprecated alias from bloomer ([c2a1d22](c2a1d22)), closes [#680](#680) * **bulma-ui:** announce polite notifications through a status region kept from mount ([#835](#835)) ([c93478d](c93478d)) * **bulma-ui:** answer the granularity review on native input and blur ([7a17486](7a17486)) * **bulma-ui:** apply textColor helper class on Navbar Menu, Start, End, and Burger ([#792](#792)) ([feb83c8](feb83c8)) * **bulma-ui:** attach useFocusTrap to a container that mounts after it turns on ([17a944d](17a944d)) * **bulma-ui:** avoid empty class attribute on several components ([#793](#793)) ([7c5c316](7c5c316)) * **bulma-ui:** bring File and Taginput under the bare-Control Field rule ([cdaa6c2](cdaa6c2)) * **bulma-ui:** clear a picker's unused seed whenever its popover closes ([cbe86c5](cbe86c5)) * **bulma-ui:** close a picker's popover on Alt+ArrowUp from inside it ([b6da4ef](b6da4ef)) * **bulma-ui:** color the calendar from the color prop and read TimeInput's wheel variables ([2251e67](2251e67)), closes [#832](#832) * **bulma-ui:** color TimeInput's wheels from the color prop ([#832](#832)) ([ad370c9](ad370c9)) * **bulma-ui:** commit nothing when a picker popover is dismissed ([0a46209](0a46209)) * **bulma-ui:** commit nothing when Enter confirms untouched picker text ([773e146](773e146)) * **bulma-ui:** commit nothing when focus leaves a picker untouched ([30b4849](30b4849)) * **bulma-ui:** document the checkbox, radio and switch color and size tuples ([bd39ff3](bd39ff3)) * **bulma-ui:** draw the time wheel focus ring where the wheel's mask shows it ([e1d8c9f](e1d8c9f)), closes [#832](#832) * **bulma-ui:** drop the openOnFocus TSDoc reason that only holds for segments ([efde0d9](efde0d9)) * **bulma-ui:** Dropdown items withhold attributes by tag and answer Enter and Space ([#827](#827)) ([f6aeb2d](f6aeb2d)) * **bulma-ui:** fall back when useFocusTrap's initialFocusRef can't take focus ([c191931](c191931)) * **bulma-ui:** fire the pickers' onOpen and onClose once under StrictMode ([#896](#896)) ([20b51ed](20b51ed)) * **bulma-ui:** give the calendar's day grid rows of a week ([971a196](971a196)), closes [#774](#774) * **bulma-ui:** give the selected calendar cell a ring that shows on its fill ([b3eecc6](b3eecc6)) * **bulma-ui:** hide a picker's launcher for a loading Control it sits in ([9a3888e](9a3888e)) * **bulma-ui:** hide a picker's launcher only for the spinner it draws ([7a28a0e](7a28a0e)) * **bulma-ui:** hold Portal to looking a selector up on each render ([8fe02ce](8fe02ce)) * **bulma-ui:** hold the year-1 floor under a max before it ([4f6eb18](4f6eb18)) * **bulma-ui:** judge image map areas by their image in useFocusTrap ([af7bc59](af7bc59)) * **bulma-ui:** keep a range's end while the start's digits are coming ([8d1f862](8d1f862)) * **bulma-ui:** keep a read-only date or time picker closed on ArrowDown ([ba74bf7](ba74bf7)) * **bulma-ui:** keep a tab stop in the year list when the year falls outside it ([fe028c1](fe028c1)) * **bulma-ui:** keep an empty picker's seed while a portaled popover is open ([1e66528](1e66528)) * **bulma-ui:** keep an inline date picker's calendar on its released id ([c26da07](c26da07)), closes [#897](#897) [#897](#897) * **bulma-ui:** keep button defaults through a spread, and type the buttons that had none ([#853](#853)) ([0810482](0810482)) * **bulma-ui:** keep button types and Avatar's accessible name through a spread ([#826](#826)) ([dc798d4](dc798d4)) * **bulma-ui:** keep menuitemcheckbox and menuitemradio items in Dropdown's arrow-key order ([#786](#786)) ([064155a](064155a)) * **bulma-ui:** keep Numberinput's buttons in a row inside Field > Control ([4dff84c](4dff84c)) * **bulma-ui:** keep Numberinput's Field examples in a row and labelled ([c937c88](c937c88)) * **bulma-ui:** keep radiusless zeroing the radius inside a Theme ([07db6a3](07db6a3)), closes [#829](#829) [#694](#694) * **bulma-ui:** keep the calendar behind DateTimeInput's time wheels out of reach ([c7f674c](c7f674c)) * **bulma-ui:** keep the clock's seconds out of a picked date and time ([0af2e71](0af2e71)) * **bulma-ui:** keep the Field for horizontal and fieldClassName in a bare Control ([e4dc513](e4dc513)) * **bulma-ui:** keep the picker focus rings visible in every color ([612aa09](612aa09)) * **bulma-ui:** keep the range band under the pointer in the calendar ([c1f2008](c1f2008)) * **bulma-ui:** key the Avatar link warning on the element and attributes ([e628eba](e628eba)), closes [#733](#733) [#733](#733) * **bulma-ui:** key the Control-level warning by its advice ([24cda3d](24cda3d)) * **bulma-ui:** leave keys on a control inside a tab to that control ([4a9f7b6](4a9f7b6)) * **bulma-ui:** leave rel out of the Avatar link attribute warning ([b059476](b059476)), closes [#733](#733) [#733](#733) * **bulma-ui:** let Autocomplete's clear button give way to a loading spinner ([5c11fb2](5c11fb2)) * **bulma-ui:** let Escape in a popover's year dropdown go back to the grid ([a8b1dbf](a8b1dbf)), closes [#901](#901) * **bulma-ui:** let File's picked-files count be reworded, and document its name in the label ([e86545c](e86545c)) * **bulma-ui:** let focus follow the keys in an inline calendar, and skip disabled days for the tab stop ([#885](#885)) ([f55af27](f55af27)) * **bulma-ui:** let several isRoot Themes share the :root style element ([04f399f](04f399f)), closes [#736](#736) * **bulma-ui:** let the arrow keys move through the calendar's year dropdown ([6abc329](6abc329)), closes [#901](#901) * **bulma-ui:** let the picker bases give way to a loading Control too ([66e803a](66e803a)) * **bulma-ui:** let useFocusTrap go of a container that leaves while it is on ([8c56d7a](8c56d7a)) * **bulma-ui:** let warnOnce decide when the Avatar link warning fires ([1a5965c](1a5965c)), closes [#733](#733) * **bulma-ui:** make ArrowUp raise a time wheel's value ([c27c310](c27c310)) * **bulma-ui:** make auto leave room for an in-place picker panel's themed offset ([8c534bd](8c534bd)), closes [#904](#904) * **bulma-ui:** make Tabs keyboard operable with the WAI-ARIA tabs pattern ([fe0e7ef](fe0e7ef)) * **bulma-ui:** make Theme colorMode switch the scheme under the prefixed builds ([#894](#894)) ([2bd6ec2](2bd6ec2)) * **bulma-ui:** make Theme's radius the helper it is typed as ([36c73d3](36c73d3)), closes [#694](#694) * **bulma-ui:** make useFocusTrap follow radio groups and initialFocusRef past the trap ([d6219d4](d6219d4)) * **bulma-ui:** match a picker's opening focus only inside its calendar ([e3c22ed](e3c22ed)) * **bulma-ui:** merge className into Navbar.Divider instead of overwriting it ([#791](#791)) ([fcc0d51](fcc0d51)) * **bulma-ui:** move focus into DateTimeInput's time wheels as they open ([adfa9db](adfa9db)) * **bulma-ui:** move the year dropdown's tab stop with the arrow keys ([f56daf5](f56daf5)) * **bulma-ui:** name a picker's default icon when its icon size or column moves ([6f6de39](6f6de39)) * **bulma-ui:** name custom elements among the targets that get Avatar's target and rel ([a962259](a962259)), closes [#733](#733) * **bulma-ui:** name DateRangeInput's default icon in its Control-level warning ([15cbbb8](15cbbb8)), closes [#952](#952) * **bulma-ui:** name DateRangeInput's default icon in its Control-level warning ([9cbe7ca](9cbe7ca)), closes [#952](#952) * **bulma-ui:** name Pagination's page links, and read a count that's no number as its default ([0a1cf06](0a1cf06)) * **bulma-ui:** open DateRangeInput's popover on Alt+ArrowDown, as the other pickers ([c0e22ec](c0e22ec)) * **bulma-ui:** open the date and time popovers on Alt+ArrowDown ([6db22cc](6db22cc)) * **bulma-ui:** order the Tabs fallback stop by index and style disabled tabs ([eefd283](eefd283)) * **bulma-ui:** pick a DateInput day at midnight by key as by click ([92c27ca](92c27ca)) * **bulma-ui:** place a portaled picker panel by its coordinates alone ([#886](#886)) ([040299b](040299b)) * **bulma-ui:** place toasts and notifications at the position they were shown with ([#834](#834)) ([62feab9](62feab9)) * **bulma-ui:** prefix the is-current and is-disabled classes on Pagination's parts ([c9a5fae](c9a5fae)) * **bulma-ui:** reach Taginput's delete buttons and Autocomplete's clear button ([21a064b](21a064b)) * **bulma-ui:** read a Pagination current page that's no number as the first ([68e963b](68e963b)) * **bulma-ui:** read clicks and focus inside a shadow root ([474f2cc](474f2cc)) * **bulma-ui:** read picker bounds and months in years 0 to 99 as written ([#890](#890)) ([02fb619](02fb619)) * **bulma-ui:** render the four burger spans Bulma v1 positions ([#785](#785)) ([8e4e1e6](8e4e1e6)) * **bulma-ui:** restore a portaled Modal's focus to an opener in a shadow root ([c564bd3](c564bd3)) * **bulma-ui:** return focus to the input when a date picker closes ([b741264](b741264)) * **bulma-ui:** say a picked DateTimeInput day keeps milliseconds and meets the bounds ([3536467](3536467)) * **bulma-ui:** say Tab reaches DateRangeInput's end input only when typing ([d2d3d1a](d2d3d1a)) * **bulma-ui:** say where Numberinput goes bare and test bare={false} in a Field ([0461631](0461631)) * **bulma-ui:** send a press on DateRangeInput's field to the nearer input ([f06b2b0](f06b2b0)) * **bulma-ui:** settle Popover's deep review findings ([feadaf4](feadaf4)) * **bulma-ui:** show the picked file with File's hasName and add a keyboard focus ring ([7881db4](7881db4)) * **bulma-ui:** show toasts, notifications and dialogs raised before their container mounts ([#828](#828)) ([2ab4493](2ab4493)) * **bulma-ui:** skip the Avatar target warning on elements with their own target ([27b58f4](27b58f4)), closes [#733](#733) * **bulma-ui:** start a date picker's focus on the focused cell ([#897](#897)) ([6a55714](6a55714)) * **bulma-ui:** stop Bulma's spinners under reduced motion in every stylesheet ([b234712](b234712)), closes [#770](#770) * **bulma-ui:** stop form wrappers nesting a Field in a bare Control ([2c6d295](2c6d295)) * **bulma-ui:** stop shipping test-only exports, and document notification() ([#781](#781)) ([5f95398](5f95398)) * **bulma-ui:** stop the date pickers at year 1 ([853142a](853142a)) * **bulma-ui:** stop the indeterminate progress bar and skeleton pulse under reduced motion ([bcf5407](bcf5407)) * **bulma-ui:** stop the Rate pop and DateTimeInput scrim under reduced motion ([3a59129](3a59129)) * **bulma-ui:** stop TimeInput reopening on the focus its popover hands back ([1c87c15](1c87c15)) * **bulma-ui:** strip the Avatar link warning from production builds ([a243fa5](a243fa5)), closes [#733](#733) * **bulma-ui:** warn about a dropped Avatar href only for an as the caller wrote ([c93b27c](c93b27c)), closes [#733](#733) * **bulma-ui:** warn in development when Avatar drops an href on a non-link as ([c76e632](c76e632)), closes [#733](#733) * **bulma-ui:** warn when a root Theme drops its className and helpers ([05c10e0](05c10e0)) * **bulma-ui:** warn when a wrapper inside a Control drops its Control-level props ([cbf434b](cbf434b)), closes [#921](#921) * **bulma-ui:** warn when an inline picker drops its Control-level props ([f0494bd](f0494bd)), closes [#921](#921) * **bulma-ui:** warn when Avatar drops a target or rel on a non-link as ([50c385e](50c385e)), closes [#733](#733) [#733](#733) * **create-bestax:** check the react ranges fit the library's peers, not equal them ([8ae5a0c](8ae5a0c)), closes [#950](#950) * **create-bestax:** import the icon CSS for every Bulma flavor, not only complete ([a712b91](a712b91)), closes [#946](#946) * **create-bestax:** install react and react-dom so Yarn 1 reports no unmet peers ([9c9814c](9c9814c)), closes [#644](#644) [#950](#950) * **create-bestax:** name the files the overwrite prompt removes, and stop on a file path ([39b6232](39b6232)), closes [#945](#945) * **create-bestax:** never empty a non-empty folder under -y, and validate flags first ([917f195](917f195)), closes [#950](#950) [#945](#945) [#950](#950) * **create-bestax:** warn when the icon CSS import has nowhere to go ([f7f0b64](f7f0b64)), closes [#946](#946) [#946](#946) * **eslint-plugin:** judge Columns' gap by its own steps, and lengths as lengths ([4786c8d](4786c8d)) * **eslint-plugin:** report .file as a class the codemod converts ([72a32c9](72a32c9)) * **eslint-plugin:** report .image with the message for a class the codemod converts ([d27c19b](d27c19b)) * **eslint-plugin:** report .menu, .menu-label and .menu-list with the converts message ([8ffaccc](8ffaccc)) * **eslint-plugin:** report .select and .breadcrumb as converted ([a9d8082](a9d8082)) * **eslint-plugin:** report Bulma form markup as classes the codemod converts ([128e832](128e832)) * **eslint-plugin:** report Bulma skeletons as converted ([04ca4ee](04ca4ee)) * **eslint-plugin:** report Modal's parts with the message for a class the codemod converts ([87f3c08](87f3c08)) * **eslint-plugin:** report Pagination's converting parts with the converts message ([6b94f14](6b94f14)) * **eslint-plugin:** report the pagination links and ellipsis as classes the codemod converts ([54ba0b3](54ba0b3)) * **eslint-plugin:** report Theme's deprecated radius route accurately ([5605816](5605816)), closes [#694](#694) * **eslint-plugin:** suggest radiusless for a near miss on Theme ([21aa9a7](21aa9a7)), closes [#694](#694) ### Features * **bestax-mcp:** look up .image as Image, with the props it takes from its <img> ([3e63230](3e63230)) * **bestax-mcp:** look up .menu and its label and list as Menu's parts ([f9fe7cd](f9fe7cd)) * **bestax-mcp:** look up Card's title and footer items on the tags their as takes ([ba8193e](ba8193e)) * **bestax-mcp:** look up Modal's parts as components ([b71583a](b71583a)) * **bestax-mcp:** look up Pagination, its list and its previous and next links as components ([f1298df](f1298df)) * **bestax-mcp:** look up the bestax component and props for a Bulma class string ([4a4b246](4a4b246)), closes [#744](#744) * **bestax-mcp:** publish to the official MCP Registry ([74efc7f](74efc7f)) * **bestax-mcp:** say a Bulma field wraps its children only when horizontal ([929bc82](929bc82)) * **bestax-mcp:** say an .image converts around anything but a bare <img> ([60e9219](60e9219)) * **bestax-mcp:** say Menu.List renders .menu-list only at the top level ([dcce74f](dcce74f)) * **bestax-mcp:** say when a component renders the children from a count ([b60c295](b60c295)) * **bestax-mcp:** say when a component renders the element inside it ([4ced25c](4ced25c)) * **bestax-mcp:** say when a component renders the li around its element, or its own text ([8fd3faf](8fd3faf)) * **bestax-mcp:** say when a component renders the whole .file tree from props ([976d8a3](976d8a3)) * **bestax-migrate:** convert .file inside a Field, building its tree from props ([724dff5](724dff5)), closes [#809](#809) * **bestax-migrate:** convert .icon-text, building its icons from props ([#823](#823)) ([933868f](933868f)) * **bestax-migrate:** convert .menu, its labels and its top-level lists ([02f4db6](02f4db6)) * **bestax-migrate:** convert .select and .breadcrumb with the element inside them ([d76c569](d76c569)) * **bestax-migrate:** convert .tabs and .icon around their children ([#815](#815)) ([3967a80](3967a80)) * **bestax-migrate:** convert a menu list's items to Menu.Item ([#816](#816)) ([b385687](b385687)) * **bestax-migrate:** convert an .image and its <img> to Image ([d4f3673](d4f3673)), closes [#793](#793) * **bestax-migrate:** convert an .image around anything but a bare <img> ([0a31c5b](0a31c5b)), closes [#801](#801) * **bestax-migrate:** convert Bulma cards built from their parts ([#752](#752)) ([1b08e17](1b08e17)) * **bestax-migrate:** convert Bulma form fields, controls, inputs and textareas ([3da788d](3da788d)), closes [#743](#743) * **bestax-migrate:** convert Bulma grids and cells ([#760](#760)) ([22adc7c](22adc7c)), closes [#743](#743) * **bestax-migrate:** convert Bulma navbars ([#754](#754)) ([02fdd72](02fdd72)) * **bestax-migrate:** convert Bulma skeletons ([2574ace](2574ace)) * **bestax-migrate:** convert Card's title and footer items on the tags their as takes ([20bc0c6](20bc0c6)), closes [#794](#794) * **bestax-migrate:** convert conditional classes in clsx and classnames calls ([8948cce](8948cce)) * **bestax-migrate:** convert Modal's parts element by element ([4d41ad2](4d41ad2)), closes [#805](#805) * **bestax-migrate:** convert navbar dividers with classes, and navbar text colors ([#796](#796)) ([c97c7e9](c97c7e9)) * **bestax-migrate:** convert Pagination, its list and its previous and next links ([d75bc70](d75bc70)), closes [#807](#807) * **bestax-migrate:** convert Pagination's page links and ellipsis in their li's place ([ae720fa](ae720fa)), closes [#809](#809) * **bestax-migrate:** convert Panel and its heading, tabs and blocks ([#811](#811)) ([0694e54](0694e54)) * **bestax-migrate:** convert the gap, position, overflow, radius and aspect-ratio helpers ([13dcf63](13dcf63)) * **bestax-migrate:** fold .table-container and .fixed-grid into the component inside ([#761](#761)) ([72504f5](72504f5)), closes [#743](#743) * **bulma-ui:** add Bulma's gap helper props to every component ([#877](#877)) ([1bd4abc](1bd4abc)) * **bulma-ui:** add Bulma's position, overflow, radius and aspect-ratio helper props ([#845](#845)) ([64fb91c](64fb91c)) * **bulma-ui:** add Collapses, an accordion group for Collapse ([#849](#849)) ([a12c823](a12c823)) * **bulma-ui:** add DateRangeInput ([50fcba7](50fcba7)), closes [#774](#774) * **bulma-ui:** add Loader, Bulma's inline spinner ([c5e9eb0](c5e9eb0)), closes [#770](#770) * **bulma-ui:** add month and year pickers to DateInput through granularity ([c4cfc2b](c4cfc2b)), closes [#773](#773) * **bulma-ui:** add Popover ([2e17fac](2e17fac)), closes [#776](#776) * **bulma-ui:** export ClientOnly and useIsHydrated ([2c0c1e6](2c0c1e6)) * **bulma-ui:** export Portal ([346d8c2](346d8c2)) * **bulma-ui:** export useFocusTrap, counting the stops the browser's Tab visits ([c304fef](c304fef)), closes [#772](#772) * **bulma-ui:** let Card.Header.Title and Card.FooterItem render Bulma's own tags ([#794](#794)) ([47ecdb6](47ecdb6)) * **bulma-ui:** make columnGap the column gap helper on Theme ([eb2c611](eb2c611)), closes [#694](#694) * **bulma-ui:** render Pagination from total, current and onPageChange ([f7ddf04](f7ddf04)), closes [#813](#813) * **eslint-plugin:** add an opt-in rule for plain elements styled with a Bulma component class ([#750](#750)) ([0bb4d80](0bb4d80)) * **eslint-plugin:** check the gap helper props ([b53a749](b53a749))
|
🎉 This PR is included in version 4.2.13 🎉 The release is available on: Your semantic-release bot 📦🚀 |
## [1.14.1](https://github.com/allxsmith/bestax/compare/bestax-mcp@1.14.0...bestax-mcp@1.14.1) (2026-10-09) ### Bug Fixes * **bestax-mcp:** describe a built icon's attributes as the codemod writes them ([d2f341b](d2f341b)), closes [#942](#942) * **bestax-mcp:** hold every docs Storybook link to a real story, and floor the index's ([3a6df21](3a6df21)) * **bestax-mcp:** keep a described or named component first in a sentence-shaped search ([2e2a1ef](2e2a1ef)) * **bestax-mcp:** name every component that declares a CSS variable, its owner first ([8bf01e3](8bf01e3)) * **bestax-mcp:** point the index's Storybook links at stories that exist ([0852de4](0852de4)) * **bestax-mcp:** rank the component a search is about above passing mentions ([cc952c2](cc952c2)) * **bestax-mcp:** read self-closing names, explain Theme on every query, advertise dot-paths ([62a4a3a](62a4a3a)) * **bestax-mcp:** release the skill examples that compile in a vite-ts scaffold ([3a7f222](3a7f222)) * **bestax-mcp:** smooth the rough edges a smoke test found ([b6ed21a](b6ed21a)) * **bestax-mcp:** stop the search comment claiming every variable has an owner ([4f1d102](4f1d102)) * **bestax-migrate:** convert a .icon to Icon by the attributes Icon now writes ([a3795fb](a3795fb)), closes [#942](#942) * **bestax-migrate:** convert an unnamed .icon with a role of its own without aria-hidden ([7c5ff91](7c5ff91)), closes [#942](#942) * **bestax-migrate:** convert an unnamed .icon with a tabIndex of its own without aria-hidden ([df24c06](df24c06)), closes [#942](#942) * **bulma-ui:** attach useFocusTrap to a container that mounts after it turns on ([17a944d](17a944d)) * **bulma-ui:** bring File and Taginput under the bare-Control Field rule ([cdaa6c2](cdaa6c2)) * **bulma-ui:** carry Rate's value on its checked star, not the radiogroup ([84f86d8](84f86d8)), closes [#942](#942) * **bulma-ui:** check initializers for import-time work and stop overstating namespace imports ([20ef350](20ef350)) * **bulma-ui:** clear a picker's unused seed whenever its popover closes ([cbe86c5](cbe86c5)) * **bulma-ui:** close a picker's popover on Alt+ArrowUp from inside it ([b6da4ef](b6da4ef)) * **bulma-ui:** collapse an inline DateTimeInput's wheels on Enter ([ff44aa3](ff44aa3)) * **bulma-ui:** commit nothing when a picker popover is dismissed ([0a46209](0a46209)) * **bulma-ui:** commit nothing when Enter confirms untouched picker text ([773e146](773e146)) * **bulma-ui:** commit nothing when focus leaves a picker untouched ([30b4849](30b4849)) * **bulma-ui:** commit the time on Enter from the seconds wheel too ([d2c0920](d2c0920)) * **bulma-ui:** drop the openOnFocus TSDoc reason that only holds for segments ([efde0d9](efde0d9)) * **bulma-ui:** emit the ESM build one file per module so unused components shake out ([2893197](2893197)) * **bulma-ui:** fire the pickers' onOpen and onClose once under StrictMode ([#896](#896)) ([20b51ed](20b51ed)) * **bulma-ui:** give the calendar's day grid rows of a week ([971a196](971a196)), closes [#774](#774) * **bulma-ui:** give TimeInput's wheels an id apart from the popover's ([40824cc](40824cc)) * **bulma-ui:** hide a picker's launcher for a loading Control it sits in ([9a3888e](9a3888e)) * **bulma-ui:** hide a picker's launcher only for the spinner it draws ([7a28a0e](7a28a0e)) * **bulma-ui:** hide an unnamed Icon and make a named one an image ([f9de39c](f9de39c)), closes [#942](#942) * **bulma-ui:** hold the year-1 floor under a max before it ([4f6eb18](4f6eb18)) * **bulma-ui:** keep a press on a time wheel item from focusing the hidden item ([c57836a](c57836a)), closes [#942](#942) * **bulma-ui:** keep a range's end while the start's digits are coming ([8d1f862](8d1f862)) * **bulma-ui:** keep a read-only date or time picker closed on ArrowDown ([ba74bf7](ba74bf7)) * **bulma-ui:** keep a tab stop in the year list when the year falls outside it ([fe028c1](fe028c1)) * **bulma-ui:** keep an empty picker's seed while a portaled popover is open ([1e66528](1e66528)) * **bulma-ui:** keep an inline date picker's calendar on its released id ([c26da07](c26da07)), closes [#897](#897) [#897](#897) * **bulma-ui:** keep each Rate star's name its own at a value a hair off a whole number ([eed3d99](eed3d99)), closes [#942](#942) * **bulma-ui:** keep Numberinput's buttons in a row inside Field > Control ([4dff84c](4dff84c)) * **bulma-ui:** keep Numberinput's Field examples in a row and labelled ([c937c88](c937c88)) * **bulma-ui:** keep the calendar behind DateTimeInput's time wheels out of reach ([c7f674c](c7f674c)) * **bulma-ui:** keep the clock's seconds out of a picked date and time ([0af2e71](0af2e71)) * **bulma-ui:** keep the Field for horizontal and fieldClassName in a bare Control ([e4dc513](e4dc513)) * **bulma-ui:** keep the range band under the pointer in the calendar ([c1f2008](c1f2008)) * **bulma-ui:** keep the time wheels' items out of their spinbutton ([6a02615](6a02615)), closes [#942](#942) * **bulma-ui:** key the Control-level warning by its advice ([24cda3d](24cda3d)) * **bulma-ui:** leave an unnamed Icon with a role of its own visible ([b1e85f5](b1e85f5)), closes [#942](#942) * **bulma-ui:** leave an unnamed Icon with a tabIndex of its own visible ([a41d131](a41d131)), closes [#942](#942) * **bulma-ui:** leave Dropdown's menu nothing focusable but its items ([c1ec016](c1ec016)), closes [#942](#942) * **bulma-ui:** leave keys on a control inside a tab to that control ([4a9f7b6](4a9f7b6)) * **bulma-ui:** let Autocomplete's clear button give way to a loading spinner ([5c11fb2](5c11fb2)) * **bulma-ui:** let Escape in a popover's year dropdown go back to the grid ([a8b1dbf](a8b1dbf)), closes [#901](#901) * **bulma-ui:** let File's picked-files count be reworded, and document its name in the label ([e86545c](e86545c)) * **bulma-ui:** let focus follow the keys in an inline calendar, and skip disabled days for the tab stop ([#885](#885)) ([f55af27](f55af27)) * **bulma-ui:** let the arrow keys move through the calendar's year dropdown ([6abc329](6abc329)), closes [#901](#901) * **bulma-ui:** let the picker bases give way to a loading Control too ([66e803a](66e803a)) * **bulma-ui:** let useFocusTrap go of a container that leaves while it is on ([8c56d7a](8c56d7a)) * **bulma-ui:** make ArrowUp raise a time wheel's value ([c27c310](c27c310)) * **bulma-ui:** make auto leave room for an in-place picker panel's themed offset ([8c534bd](8c534bd)), closes [#904](#904) * **bulma-ui:** make Tabs keyboard operable with the WAI-ARIA tabs pattern ([fe0e7ef](fe0e7ef)) * **bulma-ui:** make Theme colorMode switch the scheme under the prefixed builds ([#894](#894)) ([2bd6ec2](2bd6ec2)) * **bulma-ui:** match a picker's opening focus only inside its calendar ([e3c22ed](e3c22ed)) * **bulma-ui:** move focus into DateTimeInput's time wheels as they open ([adfa9db](adfa9db)) * **bulma-ui:** move the year dropdown's tab stop with the arrow keys ([f56daf5](f56daf5)) * **bulma-ui:** name a picker's default icon when its icon size or column moves ([6f6de39](6f6de39)) * **bulma-ui:** name DateRangeInput's default icon in its Control-level warning ([51fc017](51fc017)), closes [#952](#952) * **bulma-ui:** name DateRangeInput's default icon in its Control-level warning ([633f5dc](633f5dc)), closes [#952](#952) * **bulma-ui:** name DateRangeInput's default icon in its Control-level warning ([15cbbb8](15cbbb8)), closes [#952](#952) * **bulma-ui:** name DateRangeInput's default icon in its Control-level warning ([9cbe7ca](9cbe7ca)), closes [#952](#952) * **bulma-ui:** name DateRangeInput's default icon in its Control-level warning ([25b7a0b](25b7a0b)), closes [#952](#952) * **bulma-ui:** open DateRangeInput's popover on Alt+ArrowDown, as the other pickers ([c0e22ec](c0e22ec)) * **bulma-ui:** open the date and time popovers on Alt+ArrowDown ([6db22cc](6db22cc)) * **bulma-ui:** order the Tabs fallback stop by index and style disabled tabs ([eefd283](eefd283)) * **bulma-ui:** pick a DateInput day at midnight by key as by click ([92c27ca](92c27ca)) * **bulma-ui:** place a portaled picker panel by its coordinates alone ([#886](#886)) ([040299b](040299b)) * **bulma-ui:** point Autocomplete's aria-controls at its list only while the list is on screen ([8a16115](8a16115)), closes [#942](#942) * **bulma-ui:** reach Taginput's delete buttons and Autocomplete's clear button ([21a064b](21a064b)) * **bulma-ui:** read a day that is both today and a nearby month the same inside a range band ([4164c3b](4164c3b)), closes [#983](#983) * **bulma-ui:** read DateTimeInput's footer time row at 4.5:1 in both schemes ([585aa3b](585aa3b)), closes [#976](#976) * **bulma-ui:** read every calendar day at 4.5:1 in both schemes ([876fe60](876fe60)), closes [#983](#983) * **bulma-ui:** read picker bounds and months in years 0 to 99 as written ([#890](#890)) ([02fb619](02fb619)) * **bulma-ui:** render the time wheels' inert calendar through inertProps ([f023f25](f023f25)) * **bulma-ui:** return focus to the input when a date picker closes ([b741264](b741264)) * **bulma-ui:** say a picked DateTimeInput day keeps milliseconds and meets the bounds ([3536467](3536467)) * **bulma-ui:** say Alt+ArrowUp closes DateTimeInput's popover from the wheels ([f994d7d](f994d7d)) * **bulma-ui:** say Tab reaches DateRangeInput's end input only when typing ([d2d3d1a](d2d3d1a)) * **bulma-ui:** say where Numberinput goes bare and test bare={false} in a Field ([0461631](0461631)) * **bulma-ui:** send a press on DateRangeInput's field to the nearer input ([f06b2b0](f06b2b0)) * **bulma-ui:** show the picked file with File's hasName and add a keyboard focus ring ([7881db4](7881db4)) * **bulma-ui:** start a date picker's focus on the focused cell ([#897](#897)) ([6a55714](6a55714)) * **bulma-ui:** stop form wrappers nesting a Field in a bare Control ([2c6d295](2c6d295)) * **bulma-ui:** stop the date pickers at year 1 ([853142a](853142a)) * **bulma-ui:** stop the indeterminate progress bar and skeleton pulse under reduced motion ([bcf5407](bcf5407)) * **bulma-ui:** stop the picker popover partial warning about global nth() ([0b34d84](0b34d84)) * **bulma-ui:** stop the Rate pop and DateTimeInput scrim under reduced motion ([3a59129](3a59129)) * **bulma-ui:** tie DateTimeInput's Time button to the wheels it opens ([889fc7e](889fc7e)) * **bulma-ui:** warn when a root Theme drops its className and helpers ([05c10e0](05c10e0)) * **bulma-ui:** warn when a wrapper inside a Control drops its Control-level props ([cbf434b](cbf434b)), closes [#921](#921) * **bulma-ui:** warn when an inline picker drops its Control-level props ([f0494bd](f0494bd)), closes [#921](#921) * **bulma-ui:** wire Autocomplete's combobox to a named listbox ([213f648](213f648)), closes [#942](#942) * **create-bestax:** check the react ranges fit the library's peers, not equal them ([8ae5a0c](8ae5a0c)), closes [#950](#950) * **create-bestax:** have the optimize skill install with the project's package manager ([e0ba314](e0ba314)), closes [#597](#597) * **create-bestax:** import the icon CSS for every Bulma flavor, not only complete ([a712b91](a712b91)), closes [#946](#946) * **create-bestax:** install react and react-dom so Yarn 1 reports no unmet peers ([9c9814c](9c9814c)), closes [#644](#644) [#950](#950) * **create-bestax:** make every skill example compile in a vite-ts scaffold ([6cc5fec](6cc5fec)) * **create-bestax:** name the files the overwrite prompt removes, and stop on a file path ([39b6232](39b6232)), closes [#945](#945) * **create-bestax:** never empty a non-empty folder under -y, and validate flags first ([917f195](917f195)), closes [#950](#950) [#945](#945) [#950](#950) * **create-bestax:** read the flags after a `--` that pnpm or bun forwards ([82112a2](82112a2)), closes [#950](#950) * **create-bestax:** tell the optimize skill's modular build to install bulma ([4289d0a](4289d0a)), closes [#597](#597) * **create-bestax:** warn when the icon CSS import has nowhere to go ([f7f0b64](f7f0b64)), closes [#946](#946) [#946](#946) * **eslint-plugin:** judge Columns' gap by its own steps, and lengths as lengths ([4786c8d](4786c8d)) ### Features * **bestax-migrate:** convert the gap, position, overflow, radius and aspect-ratio helpers ([13dcf63](13dcf63)) * **bulma-ui:** add Bulma's gap helper props to every component ([#877](#877)) ([1bd4abc](1bd4abc)) * **bulma-ui:** add DateRangeInput ([50fcba7](50fcba7)), closes [#774](#774) * **bulma-ui:** make columnGap the column gap helper on Theme ([eb2c611](eb2c611)), closes [#694](#694) * **eslint-plugin:** check the gap helper props ([b53a749](b53a749))
|
🎉 This PR is included in version 1.14.1 🎉 The release is available on: Your semantic-release bot 📦🚀 |




































A portaled DateInput, TimeInput or DateTimeInput panel drew at the wrong size.
.picker-popover.is-portaldidn't reset therightandbottomthat the corner classes set, so:bottom-right, includingautoflipping to it, the panel stretched to the viewport's right edge (700px wide for 224px of content in an 800px viewport);The portal rule now resets
rightandbottomtoauto, so a portaled panel is placed only by the inlinetopandleftthe positioning hook sets. In-place panels are unchanged. Measured in Chromium after the fix, every portaled corner is 224×144, and the in-place numbers are identical to before. Popover's own portal rule already resets them.A portaled panel's gap is now a margin set from
--bulma-picker-popover-offset, as on Popover, so overriding that variable moves a portaled panel too, andautomakes room for that gap. An in-place panel'sautostill budgets the hook's default 4px, since its gap sits intoporbottom, whereautocan't read it (tracked in #904).At 768px wide or less, TimeInput's bottom-sheet rule set
rightandbottomafter the portal reset at the same specificity, so a portaled TimeInput panel still stretched there. That rule now skips a portaled panel, which stays on its corner, and an in-place TimeInput panel is still a sheet.A new styles test renders all three pickers at every corner. It compiles the partial plain and with the
bestax-prefix for the portaled gap and the in-place corners, and compiles every published stylesheet to check, at a phone and a desktop width, that a portaled panel is placed by its inline coordinates alone. Every portaled case failed on main.pnpm allpasses locally.