feat(bulma-ui): compound (dot-notation) sub-components for all parent/child families via shared withSubComponents helper - #331
Conversation
…hared withSubComponents helper All 17 compound parents (Card, Navbar, Tabs, Modal, Message, Field, Media, Level, Hero, Panel, Pagination, Dropdown, Menu, Sidebar, Steps, Avatars, Figure) previously used three divergent attachment idioms (Object.assign, inline intersection types, *WithCompounds casts). They now share one typed helper that mutates the base component in place — preserving the identity checks in Modal and Field — and sets displayName on the parent. Also fixes the named Media export, which previously lacked the sub-component statics in its type (only the default export had them). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NuJRpjY81Dzoo92ZooE8Xt
…hild families New compound statics, with every existing named export unchanged: Columns.Column, Grid.Cell, Table.Thead/.Tbody/.Tfoot/.Tr/.Th/.Td, Buttons.Button/.LinkButton, Tags.Tag, OrderedList.Item, UnorderedList.Item, IconText.Icon, Checkboxes.Checkbox, Radios.Radio, and Field.Control (joining the existing Field.Label/Field.Body). Each family gains identity + dot-path render tests, a CompoundUsage story, and a compound-usage docs section; the skill catalog header and layout skill references now mention the new dot paths. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NuJRpjY81Dzoo92ZooE8Xt
WalkthroughAdds ChangesCompound component foundation
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related issues
Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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://81e3c99c.bestax.pages.dev |
There was a problem hiding this comment.
🧹 Nitpick comments (2)
bulma-ui/src/elements/__tests__/IconText.test.tsx (1)
187-197: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winPrefer React Testing Library semantic queries over
container.querySelector.React Testing Library best practices strongly discourage using
querySelectoras it tightly couples tests to DOM structure. Consider refactoring this test to use semantic queries (getByText,getByLabelText) matching the pattern used in the rest of this test file.♻️ Proposed refactor
- test('renders an icon through the dot path', () => { - const { container } = render( + test('renders an icon through the dot path', () => { + render( <IconText> <IconText.Icon name="star" ariaLabel="star icon" /> Starred </IconText> ); - expect(container.querySelector('.icon-text')).toBeInTheDocument(); - expect(container.querySelector('.icon')).toBeInTheDocument(); + expect(screen.getByText('Starred').parentElement).toHaveClass('icon-text'); + expect(screen.getByLabelText('star icon')).toHaveClass('icon'); });🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@bulma-ui/src/elements/__tests__/IconText.test.tsx` around lines 187 - 197, Refactor the test “renders an icon through the dot path” to replace both container.querySelector assertions with React Testing Library semantic queries. Use the existing accessible label for the icon and the rendered “Starred” text, while preserving the assertions that the icon text component and icon are present.bulma-ui/src/grid/Grid.stories.tsx (1)
256-265: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueUse types from
@storybook/react-viteand CSF3 format.To align with the project's Storybook conventions and other files in this PR, please define the story using the CSF3 object format with the appropriate type from
@storybook/react-vite(e.g.,StoryorStoryObj). As per coding guidelines:bulma-ui/src/**/*.stories.{ts,tsx}: Use types from@storybook/react-vite``.♻️ Proposed refactor
-export const CompoundUsage = () => ( - <Grid> - <Grid.Cell> - <Notification color="primary">Cell via dot notation</Notification> - </Grid.Cell> - <Grid.Cell> - <Notification color="info">Another cell via dot notation</Notification> - </Grid.Cell> - </Grid> -); +export const CompoundUsage: Story = { + render: () => ( + <Grid> + <Grid.Cell> + <Notification color="primary">Cell via dot notation</Notification> + </Grid.Cell> + <Grid.Cell> + <Notification color="info">Another cell via dot notation</Notification> + </Grid.Cell> + </Grid> + ), +};🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@bulma-ui/src/grid/Grid.stories.tsx` around lines 256 - 265, Convert CompoundUsage from the function story format to a CSF3 object story, and type it with the appropriate Story or StoryObj type imported from `@storybook/react-vite`. Preserve the existing Grid and Grid.Cell rendering content.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@bulma-ui/src/elements/__tests__/IconText.test.tsx`:
- Around line 187-197: Refactor the test “renders an icon through the dot path”
to replace both container.querySelector assertions with React Testing Library
semantic queries. Use the existing accessible label for the icon and the
rendered “Starred” text, while preserving the assertions that the icon text
component and icon are present.
In `@bulma-ui/src/grid/Grid.stories.tsx`:
- Around line 256-265: Convert CompoundUsage from the function story format to a
CSF3 object story, and type it with the appropriate Story or StoryObj type
imported from `@storybook/react-vite`. Preserve the existing Grid and Grid.Cell
rendering content.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 81034d2c-f662-4bc4-b7c0-dc7a3f675a25
📒 Files selected for processing (65)
bulma-ui/src/columns/Columns.stories.tsxbulma-ui/src/columns/Columns.tsxbulma-ui/src/columns/__tests__/Columns.test.tsxbulma-ui/src/components/Avatars.tsxbulma-ui/src/components/Card.tsxbulma-ui/src/components/Dropdown.tsxbulma-ui/src/components/Menu.tsxbulma-ui/src/components/Message.tsxbulma-ui/src/components/Modal.tsxbulma-ui/src/components/Navbar.tsxbulma-ui/src/components/Pagination.tsxbulma-ui/src/components/Panel.tsxbulma-ui/src/components/Sidebar.tsxbulma-ui/src/components/Steps.tsxbulma-ui/src/components/Tabs.tsxbulma-ui/src/elements/Buttons.stories.tsxbulma-ui/src/elements/Buttons.tsxbulma-ui/src/elements/Figure.tsxbulma-ui/src/elements/IconText.stories.tsxbulma-ui/src/elements/IconText.tsxbulma-ui/src/elements/OrderedList.stories.tsxbulma-ui/src/elements/OrderedList.tsxbulma-ui/src/elements/Table.stories.tsxbulma-ui/src/elements/Table.tsxbulma-ui/src/elements/Tags.stories.tsxbulma-ui/src/elements/Tags.tsxbulma-ui/src/elements/UnorderedList.stories.tsxbulma-ui/src/elements/UnorderedList.tsxbulma-ui/src/elements/__tests__/Buttons.test.tsxbulma-ui/src/elements/__tests__/IconText.test.tsxbulma-ui/src/elements/__tests__/OrderedList.test.tsxbulma-ui/src/elements/__tests__/Table.test.tsxbulma-ui/src/elements/__tests__/Tags.test.tsxbulma-ui/src/elements/__tests__/UnorderedList.test.tsxbulma-ui/src/form/Checkboxes.stories.tsxbulma-ui/src/form/Checkboxes.tsxbulma-ui/src/form/Field.stories.tsxbulma-ui/src/form/Field.tsxbulma-ui/src/form/Radios.stories.tsxbulma-ui/src/form/Radios.tsxbulma-ui/src/form/__tests__/Checkboxes.test.tsxbulma-ui/src/form/__tests__/Field.test.tsxbulma-ui/src/form/__tests__/Radios.test.tsxbulma-ui/src/grid/Grid.stories.tsxbulma-ui/src/grid/Grid.tsxbulma-ui/src/grid/__tests__/Grid.test.tsxbulma-ui/src/helpers/__tests__/withSubComponents.test.tsxbulma-ui/src/helpers/withSubComponents.tsbulma-ui/src/layout/Hero.tsxbulma-ui/src/layout/Level.tsxbulma-ui/src/layout/Media.tsxdocs/docs/api/columns/columns.mddocs/docs/api/elements/buttons.mddocs/docs/api/elements/icontext.mddocs/docs/api/elements/orderedlist.mddocs/docs/api/elements/table.mddocs/docs/api/elements/tags.mddocs/docs/api/elements/unorderedlist.mddocs/docs/api/form/checkboxes.mddocs/docs/api/form/field.mddocs/docs/api/form/radios.mddocs/docs/api/grid/grid.mdscripts/gen-component-catalog.mjsskills/bestax-custom-component/references/component-catalog.mdskills/bestax-layout-scaffold/references/layout-components.md
|
@claude deep review |
|
Claude finished @allxsmith's task in 4m 17s —— View job Deep review
Setup note: this sandbox's
|
There was a problem hiding this comment.
Deep review — 0 finding(s)
| # | Severity | Area | Finding | Location |
|---|---|---|---|---|
| — | — | — | No blocking defects found. | — |
Overall: This is a genuinely clean refactor-plus-additive-feature. The new withSubComponents helper mutates the base component in place and returns the same object, which correctly preserves every identity check in the library (child.type === ModalCard/CardHeader/TabsContent/MenuList) and Field's displayName-based child detection — I verified this by grepping all .type === / displayName === sites and running the affected suites (268 tests pass across Modal, Card, Tabs, Field, Checkboxes, Radios, Table, Buttons, Media). Typecheck is clean, the named Media export type bug is properly fixed, and no file lost a default export or introduced a parent-child import cycle. The riskiest surface — the shared helper touching 17 compound families at once — is well covered by the new identity/dot-path tests and the forwardRef case, so the human's attention only needs a light pass on whether the 11 new CompoundUsage stories/docs read well.
🏄 Total glass, dude — 28 components all paddling out on one clean helper, every
===identity wave still lands, nothing wipes out. Ship it and catch the next set.
# [5.7.0](https://github.com/allxsmith/bestax/compare/@allxsmith/bestax-bulma@5.6.2...@allxsmith/bestax-bulma@5.7.0) (2026-07-20) ### Bug Fixes * **create-bestax:** reject dot-only project names, pin icon versions, bundle bestax-icons skill ([#310](#310)) ([ddff8e5](ddff8e5)) * **create-bestax:** skills-sync conformance gate + theming skill reference backfill ([#326](#326)) ([9584133](9584133)), closes [#285](#285) ### Features * **bulma-ui:** compound (dot-notation) sub-components for all parent/child families via shared withSubComponents helper ([#331](#331)) ([07516c5](07516c5)) * **create-bestax:** add bestax-optimize skill for shrinking built CSS ([#329](#329)) ([f597b9f](f597b9f))
|
🎉 This PR is included in version 5.7.0 🎉 The release is available on: Your semantic-release bot 📦🚀 |
# 1.0.0 (2026-07-20) * feat(bulma-ui)!: remove bestax-bulma-prefixed CSS variant ([94baa34](94baa34)) * feat(create-bestax)!: require Node.js 18+ and align with bestax-bulma v2 ([#118](#118)) ([b22f183](b22f183)) ### Bug Fixes * add comprehensive rules to prevent bulma-ui versioning on non-bulma-ui commits ([#122](#122)) ([525ccfa](525ccfa)), closes [#119](#119) * **bulma-ui:** a11y + case-insensitive Taginput matching from PR review ([d576829](d576829)) * **bulma-ui:** accept router props like `to` on Navbar.Item without casts ([#311](#311)) ([b78856b](b78856b)), closes [#306](#306) * **bulma-ui:** Add build step to publish in ci.yml ([e3707fc](e3707fc)) * **bulma-ui:** add fontawesome-free as explicit devDependency ([a4a5389](a4a5389)) * **bulma-ui:** add missing exports ([0d16633](0d16633)) * **bulma-ui:** Add Skeleton to exports ([e481599](e481599)) * **bulma-ui:** another attempt to fix semantic release builds with ci.yml ([cc3a3e2](cc3a3e2)) * **bulma-ui:** another attempt to fix semantic release builds with ci.yml ([314bc39](314bc39)) * **bulma-ui:** another attempt to fix semantic release builds with ci.yml ([c930693](c930693)) * **bulma-ui:** complete domain migration and fix semantic-release configuration ([#64](#64)) ([f4cd71d](f4cd71d)) * **bulma-ui:** correct blog post examples and add Modal compound components ([#81](#81)) ([559c2e3](559c2e3)) * **bulma-ui:** correct NPM_TOKEN env variable in ci.yml ([94b48b4](94b48b4)) * **bulma-ui:** Fix release.config.js to include package-lock.json ([390da59](390da59)) * **bulma-ui:** fix standalone Badge pointer-events, pulse halo, and falsy content ([#295](#295)) ([a9db031](a9db031)), closes [#264](#264) * **bulma-ui:** full classPrefix support across layout/grid + prefix utils ([4ce0b53](4ce0b53)) * **bulma-ui:** improve npm package discoverability with optimized keywords and badges ([#72](#72)) ([8c7a696](8c7a696)) * **bulma-ui:** Initial semantic release changes ([b78d785](b78d785)) * **bulma-ui:** migrate domain from bestax.cc to bestax.io ([#64](#64)) ([4870b1e](4870b1e)) * **bulma-ui:** migrate ionicons to v8 to unblock publish and Storybook ([927a55b](927a55b)), closes [#142](#142) * **bulma-ui:** publish rewritten README to npm ([9810081](9810081)) * **bulma-ui:** publish with npm provenance attestation ([172da62](172da62)), closes [#180](#180) * **bulma-ui:** reference llms docs from README and package.json ([#198](#198)) ([db8aab3](db8aab3)) * **bulma-ui:** reject predicate-blocked values during manual entry ([a8f6e28](a8f6e28)) * **bulma-ui:** resolve flex item properties and Card compound component issues ([#55](#55)) ([e774da3](e774da3)) * **bulma-ui:** resolve flex item properties and Card compound component issues ([#55](#55)) ([7641a53](7641a53)) * **bulma-ui:** resolve react-hooks v7 and [@eslint-react](https://github.com/eslint-react) findings ([14caaaf](14caaaf)) * **bulma-ui:** resolve security vulnerabilities and update dependencies ([#128](#128)) ([112f6e4](112f6e4)), closes [#127](#127) * **bulma-ui:** restrict semantic-release to bulma-ui scoped commits only ([2d67bf9](2d67bf9)), closes [#62](#62) * **bulma-ui:** retry failed Avatar src, flatten Fragment children in Avatars, RTL-safe overlap ([#297](#297)) ([c00b9db](c00b9db)) * **bulma-ui:** route every hardcoded class through the prefix helpers; add classPrefix sweep test ([#301](#301)) ([a50b134](a50b134)), closes [#286](#286) * **bulma-ui:** setup gpg signing with semantic-release ([3e24722](3e24722)) * **bulma-ui:** strip redundant library prefix from Icon name ([#242](#242)) ([dbe3622](dbe3622)), closes [#189](#189) * **bulma-ui:** trigger release to publish via OIDC trusted publishing ([e2d09c5](e2d09c5)) * **bulma-ui:** update bundle size claims to accurate 21KB gzipped ([#66](#66)) ([6e381bd](6e381bd)) * **bulma-ui:** update package-lock.json ([853d585](853d585)) * **bulma-ui:** update package.json for better seo, exports, types, engines, funding, etc ([98cbc56](98cbc56)) * **bulma-ui:** use createRequire for ESM compatibility in Storybook 10 ([#130](#130)) ([b27e60e](b27e60e)), closes [#129](#129) * **ci:** collect screenshots as artifacts and commit in single batch to avoid conflicts ([27b259d](27b259d)) * **ci:** ensure npm install uses fresh downloads with --prefer-online ([1f2e15d](1f2e15d)) * **ci:** properly extract base path for recursive file search ([e0330ff](e0330ff)) * **ci:** use find command instead of glob module in verified-commit action ([0e2d159](0e2d159)) * **ci:** use npm ci for scaffolded app dependencies ([35652c8](35652c8)) * **create-bestax:** correct browser title to prioritize Bestax branding ([#106](#106)) ([23aa535](23aa535)), closes [#105](#105) * **create-bestax:** correct template path resolution from ../../ to ../ ([65b4493](65b4493)), closes [#78](#78) * **create-bestax:** dark-mode contrast rules in theming/layout skills and docs ([#303](#303)) ([490bf21](490bf21)), closes [#194](#194) [#195](#195) * **create-bestax:** exclude templates directory from linting and typecheck ([18fec0b](18fec0b)) * **create-bestax:** fail fast with guidance instead of hanging when stdin is not a TTY ([#293](#293)) ([46a172d](46a172d)), closes [#192](#192) * **create-bestax:** move templates into package directory and update docs ([195bf01](195bf01)), closes [#78](#78) * **create-bestax:** point scaffolded CLAUDE.md at llms docs; document skills ([#198](#198)) ([b2e0514](b2e0514)) * **create-bestax:** publish with npm provenance attestation ([21ffe8f](21ffe8f)), closes [#180](#180) * **create-bestax:** read version from package.json instead of hardcoded value ([#109](#109)) ([8605699](8605699)) * **create-bestax:** refresh README and bump scaffolded bestax-bulma to ^5 ([4e19e86](4e19e86)) * **create-bestax:** reject dot-only project names, pin icon versions, bundle bestax-icons skill ([#310](#310)) ([ddff8e5](ddff8e5)) * **create-bestax:** scaffold @allxsmith/bestax-bulma ^4.0.0 ([1d3b802](1d3b802)) * **create-bestax:** scaffold bundled bestax CSS flavors, not stock Bulma ([43621dc](43621dc)) * **create-bestax:** ship improved bundled skills + component catalog ([#199](#199)) ([a1515c2](a1515c2)) * **create-bestax:** skills-sync conformance gate + theming skill reference backfill ([#326](#326)) ([9584133](9584133)), closes [#285](#285) * **create-bestax:** synchronize version with bestax-bulma to 2.4.0 ([623ee79](623ee79)), closes [#96](#96) * **create-bestax:** update template dependency to ^2.4.0 ([200971d](200971d)) * **create-bestax:** use scenario-specific screenshot directories to prevent overwrites ([#108](#108)) ([c675957](c675957)), closes [#107](#107) * **docs:** correct Content Signals syntax in robots.txt ([#134](#134)) ([85dd9de](85dd9de)) * **docs:** emit per-page markdown so llms.txt links resolve ([#200](#200)) ([7877083](7877083)) * **docs:** escape apostrophe in QuickStart notification text ([25d6d72](25d6d72)) * **docs:** generate llms.txt so the advertised homepage link resolves ([9fae464](9fae464)), closes [#177](#177) * **docs:** improve homepage hero layout and button spacing ([5f7a5a7](5f7a5a7)) * **docs:** move robots.txt to correct deployment location ([#90](#90)) ([1e2aeee](1e2aeee)) * **docs:** rebrand and reorganize Storybook ([#83](#83)) ([dfb9937](dfb9937)) * **docs:** remove Google Analytics and add robots.txt ([94776f7](94776f7)) * **docs:** update Storybook logo path to /img/logo.svg for deployed site ([bf59758](bf59758)) * **e2e:** correct notification CSS selectors to use contains instead of ends-with ([182acc1](182acc1)) * implement independent package versioning strategy ([#111](#111)) ([7819c73](7819c73)), closes [#110](#110) * prevent bulma-ui from versioning on create-bestax commits ([#120](#120)) ([4dfaf9c](4dfaf9c)), closes [#119](#119) * resolve React Hooks violations and ESLint configuration issues ([32d2931](32d2931)) * upgrade Turbo, Storybook, and Docusaurus dependencies ([5b4ebdd](5b4ebdd)), closes [#98](#98) ### Documentation * fix stale versioning and coverage docs; drop CLAUDE.md stale-docs flags ([71c4583](71c4583)) ### Features * add theme system and config provider with comprehensive test coverage ([f3ca7f0](f3ca7f0)) * **bestax-migrate:** react-bulma-components → bestax-bulma codemod CLI, skill, and docs ([#333](#333)) ([e04a12b](e04a12b)), closes [#1e6b99](https://github.com/allxsmith/bestax/issues/1e6b99) * **bulma-ui:** add Avatar, Avatars, and Badge components ([#257](#257)) ([0817018](0817018)), closes [#256](#256) * **bulma-ui:** add colorMode dark-mode prop to Theme ([4acc41e](4acc41e)), closes [#174](#174) * **bulma-ui:** add consistent gap prop to Columns, aliasing gapSize ([#300](#300)) ([6c36455](6c36455)), closes [#282](#282) * **bulma-ui:** add cursor helper, closeDelay prop, and polish Tooltip stories ([37945b5](37945b5)) * **bulma-ui:** add extra components, form elements, and SCSS styles ([59daf28](59daf28)) * **bulma-ui:** add HTML element wrapper components ([#135](#135)) ([#136](#136)) ([20fb16d](20fb16d)) * **bulma-ui:** add manual-entry stories for format, bounds, and blocked-value variations ([e93d51c](e93d51c)) * **bulma-ui:** add Reveal component for scroll-triggered animations ([#255](#255)) ([a89c574](a89c574)) * **bulma-ui:** Add skeletons ([6c46e4b](6c46e4b)) * **bulma-ui:** add themed Checkbox/Radio, convenience Field components, and Autocomplete cleanup ([3c57a5a](3c57a5a)) * **bulma-ui:** add typing-first story variants for all picker property variations ([078433f](078433f)) * **bulma-ui:** avatar/badge a11y batch — decorative alt, accessible names, live region, button type, surplus i18n, focus ring ([#298](#298)) ([508477f](508477f)), closes [#266](#266) [#266](#266) * **bulma-ui:** change the default primary color to [#1](#1 ([8872620](8872620)), closes [#1e6b99](https://github.com/allxsmith/bestax/issues/1e6b99) [#1e6b99](https://github.com/allxsmith/bestax/issues/1e6b99) * **bulma-ui:** compound (dot-notation) sub-components for all parent/child families via shared withSubComponents helper ([#331](#331)) ([07516c5](07516c5)) * **bulma-ui:** dim and blur the calendar behind the Datetimepicker time wheels ([3d90619](3d90619)) * **bulma-ui:** finalize the 3.0 component set ([87ccc0e](87ccc0e)) * **bulma-ui:** make Button and Link as prop polymorphic (React.ElementType) ([#238](#238)) ([ce90304](ce90304)), closes [#188](#188) * **bulma-ui:** require React 18 as the minimum supported version ([c7251b0](c7251b0)) * **ci:** add verified-commit action for GPG-signed commits ([d078dfa](d078dfa)) * **create-bestax:** add bestax-optimize skill for shrinking built CSS ([#329](#329)) ([f597b9f](f597b9f)) * **create-bestax:** add CLI tool with Vite templates and automated publishing ([9748c3d](9748c3d)) * **create-bestax:** add cross-platform emoji support with figures ([#103](#103)) ([15567d9](15567d9)) * **create-bestax:** add README with templates location note ([8ddc73d](8ddc73d)) * **create-bestax:** add visual regression testing and synchronized versioning ([17e1e22](17e1e22)), closes [#94](#94) * **create-bestax:** bestax-icons skill — teach agents the icon system ([#302](#302)) ([61c8ef2](61c8ef2)), closes [#287](#287) * **create-bestax:** improve favicon visibility and add distinct branding ([621590d](621590d)), closes [#100](#100) * **create-bestax:** modernize templates (Vite 8, ESLint 10, TS 6) + add working lint config ([4537629](4537629)), closes [#167](#167) * **create-bestax:** offer to install the bestax AI skills when scaffolding ([625b7bf](625b7bf)), closes [#174](#174) * **create-bestax:** scaffold-aware CLAUDE.md with setup facts and house style ([#271](#271)) ([c1681b0](c1681b0)) * **docs:** add Google Analytics tracking for usage insights ([#68](#68)) ([90ab951](90ab951)) * **docs:** add pronunciation guide and dark mode support ([#58](#58)) ([48a8916](48a8916)) * **docs:** migrate from GitHub Pages to Cloudflare Pages ([#132](#132)) ([2154672](2154672)), closes [#131](#131) * **form:** add Datepicker, Timepicker, and Datetimepicker components ([c6684e6](c6684e6)) ### BREAKING CHANGES * footer requirement, and the commitlint scope rule - CONTRIBUTING.md: replace the type-less commit example with a commitlint-valid conventional format (verified against commitlint); correct all four coverage mentions to the real jest thresholds (bulma-ui 99%, create-bestax 95%/78% branches); fix the npm package name (@allxsmith/bestax-bulma, plus create-bestax) and link VERSIONING.md - CLAUDE.md: remove the stale-docs warning and asides now that the underlying docs are correct; point at VERSIONING.md again Closes #206. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0131uD6QKmAij7Byk3SByyLh * the @allxsmith/bestax-bulma/versions/bestax-bulma-prefixed.css export is removed. Use versions/bestax-prefixed.css with classPrefix="bestax-". * **bulma-ui:** React 16 and 17 are no longer supported; the minimum supported React version is now 18. * **bulma-ui:** Snackbar has been removed and merged into Toast; use Toast with its positioning and queue props instead. * **bulma-ui:** form controls now auto-wrap in Field/Control, and Checkbox and Radio ship new themed visuals. See the 2.x -> 3.x migration guide. * This version requires Node.js 18.0.0 or higher. The CLI now enforces this requirement and will exit with an error message if running on older Node.js versions. This aligns create-bestax with the bestax-bulma v2.x ecosystem. * fix(create-bestax): correct Prettier formatting in index.ts * None - all changes are additive and backward compatible
|
🎉 This PR is included in version 1.0.0 🎉 The release is available on: Your semantic-release bot 📦🚀 |
…sage stories, live docs sections (#336) * test(bulma-ui): compound component parity for pre-existing families (#330) Bring the 17 pre-existing compound families up to the standard shipped with the newly-compound families in #331: - describe('Compound components') identity tests per static (.toBe for named exports, toBeDefined + dot-path render for module-private subs) in every family's test file - CompoundUsage stories (matching each file's local story style) - "Compound (dot-notation) usage" live docs sections at the end of each API page's Usage section - Field identity top-ups (Field.Label/Field.Body); Avatars verified already complete; Steps reuses its existing CompoundComponents story - Codify the standard in bulma-ui/CLAUDE.md and src/components/CLAUDE.md Tests/stories/docs only — no runtime code changes. * test(bulma-ui): normalize compound describe blocks to 'Compound components' * chore: add .claude/launch.json so agent sessions can launch docs/storybook previews * test(bulma-ui): move Avatars identity test into a Compound components block with a dot-path render
# [3.5.0](https://github.com/allxsmith/bestax/compare/create-bestax@3.4.0...create-bestax@3.5.0) (2026-07-21) ### Features * **bestax-migrate:** react-bulma-components → bestax-bulma codemod CLI, skill, and docs ([#333](#333)) ([e04a12b](e04a12b)), closes [#1e6b99](https://github.com/allxsmith/bestax/issues/1e6b99) * **bulma-ui:** compound (dot-notation) sub-components for all parent/child families via shared withSubComponents helper ([#331](#331)) ([07516c5](07516c5)) * **create-bestax:** scaffold .claude/launch.json with the AI skills opt-in ([#343](#343)) ([189135a](189135a))
|
🎉 This PR is included in version 3.5.0 🎉 The release is available on: Your semantic-release bot 📦🚀 |
Pull Request
Description
Adds compound (dot-notation) sub-component access across the library and converges every compound parent onto one shared, typed attachment helper. Two commits:
refactor(bulma-ui)— new internal helpersrc/helpers/withSubComponents.tsthat attaches statics by mutating the base component (identity-preserving —Modal'schild.type === ModalCardcheck andField's displayName-based child detection depend on it) and setsdisplayNameon the parent. All 17 existing compound parents (Card, Navbar, Tabs, Modal, Message, Field, Media, Level, Hero, Panel, Pagination, Dropdown, Menu, Sidebar, Steps, Avatars, Figure) migrated off three divergent idioms (Object.assign/ inline intersection types /*WithCompoundscasts). Also fixes the namedMediaexport, which previously lacked the statics in its type (only the default export had them).feat(bulma-ui)— 10 new compound families, every existing named export unchanged (purely additive):Columns.Column,Grid.Cell,Table.Thead/.Tbody/.Tfoot/.Tr/.Th/.Td(exact export names),Buttons.Button/Buttons.LinkButton,Tags.Tag,OrderedList.Item,UnorderedList.Item,IconText.Icon,Checkboxes.Checkbox,Radios.Radio, andField.Control(joiningField.Label/Field.Body).Each new family ships with identity + dot-path render tests, a
CompoundUsagestory, and a### Compound (dot-notation) usagelive example on its API docs page. The skill catalog header now cites the new dot paths (Columns.Column,Table.Tr) and the layout-scaffold skill references mention them; catalog regenerated viapnpm gen:catalog.@allxsmith/bestax-bulma)create-bestax)@allxsmith/bestax-docs)scripts/gen-component-catalog.mjsheader textRelated Issue(s)
Refs #330 (follow-up: parity artifacts for the 17 pre-existing compound families + codifying the standard in CLAUDE.md)
Type of Change
Checklist
CLAUDE.mdfiles are updatedScreenshots / Demos
Live examples render on each affected API docs page (the live-codeblock scope spreads the full library, so dot statics resolve in the browser preview).
Additional Context
pnpm all(build, typecheck, tests + 99% coverage on all metrics, bundle:stats, lint, format:check, storybook build) andpnpm check:conformance; catalog freshness verified.@allxsmith/bestax-bulma(featoutranks therefactorpatch).src/index.ts), so no new public API beyond the statics themselves.🤖 Generated with Claude Code
https://claude.ai/code/session_01NuJRpjY81Dzoo92ZooE8Xt
Generated by Claude Code
Summary by CodeRabbit
Table.Tr,Columns.Column,Field.Control, and others.