Skip to content

feat(bulma-ui): compound (dot-notation) sub-components for all parent/child families via shared withSubComponents helper - #331

Merged
allxsmith merged 2 commits into
mainfrom
claude/bestax-compound-expressions-w7vdi7
Jul 20, 2026
Merged

allxsmith merged 2 commits into
mainfrom
claude/bestax-compound-expressions-w7vdi7

Conversation

@allxsmith

@allxsmith allxsmith commented Jul 19, 2026 •

Copy link
Copy Markdown
Owner

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:

  1. refactor(bulma-ui) — new internal helper src/helpers/withSubComponents.ts that attaches statics by mutating the base component (identity-preserving — Modal's child.type === ModalCard check and Field's displayName-based child detection depend on it) and sets displayName on 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 / *WithCompounds casts). Also fixes the named Media export, which previously lacked the statics in its type (only the default export had them).
  2. 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, and Field.Control (joining Field.Label/Field.Body).

Each new family ships with identity + dot-path render tests, a CompoundUsage story, and a ### Compound (dot-notation) usage live 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 via pnpm gen:catalog.

  • bulma-ui (@allxsmith/bestax-bulma)
  • create-bestax (create-bestax)
  • docs (@allxsmith/bestax-docs)
  • Other (please specify): skills (generated catalog + layout-scaffold references), scripts/gen-component-catalog.mjs header text

Related Issue(s)

Refs #330 (follow-up: parity artifacts for the 17 pre-existing compound families + codifying the standard in CLAUDE.md)

Type of Change

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

Checklist

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

Screenshots / Demos

// Before: separate imports required          // After: dot notation also works
<Columns>                                     <Columns>
  <Column>One</Column>                          <Columns.Column>One</Columns.Column>
</Columns>                                    </Columns>

<Table>
  <Table.Thead>
    <Table.Tr><Table.Th>Name</Table.Th></Table.Tr>
  </Table.Thead>
</Table>

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

🤖 Generated with Claude Code

https://claude.ai/code/session_01NuJRpjY81Dzoo92ZooE8Xt


Generated by Claude Code

Summary by CodeRabbit

  • New Features
    • Added dot-notation compound component access across layout, form, element, and navigation components, including Table.Tr, Columns.Column, Field.Control, and others.
    • Added Storybook examples demonstrating compound component composition.
  • Documentation
    • Added usage guidance and examples for compound components throughout the component documentation.
    • Updated component catalog references with additional dot-notation examples.
  • Tests
    • Added coverage validating compound component references, rendering, and ref forwarding.

claude added 2 commits July 19, 2026 11:17
…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
@coderabbitai

coderabbitai Bot commented Jul 19, 2026 •

Copy link
Copy Markdown

Review Change Stack

Walkthrough

Adds withSubComponents and applies it across Bulma UI components to expose compound subcomponents through dot notation. Adds tests, Storybook examples, and documentation for the resulting APIs.

Changes

Compound component foundation

Layer / File(s) Summary
Shared helper and coverage
bulma-ui/src/helpers/withSubComponents.ts, bulma-ui/src/helpers/__tests__/withSubComponents.test.tsx
Adds withSubComponents, which attaches subcomponents, preserves identity, manages display names, and supports forward-ref components.
Component and layout wiring
bulma-ui/src/components/*, bulma-ui/src/layout/*
Replaces manual static-property assignments and casts with withSubComponents exports while preserving existing component implementations.
New compound APIs
bulma-ui/src/columns/*, bulma-ui/src/elements/*, bulma-ui/src/form/*, bulma-ui/src/grid/*
Exposes subcomponents such as Columns.Column, Table.Tr, Field.Control, and Grid.Cell, with Storybook examples demonstrating dot notation.
Compound API tests
bulma-ui/src/**/__tests__/*
Verifies subcomponent identity and rendered DOM structure through compound-component access paths.
Documentation and catalogs
docs/docs/api/*, scripts/gen-component-catalog.mjs, skills/*
Documents compound usage and updates catalog examples with additional dot-notation forms.

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

Possibly related issues

  • allxsmith/bestax#330 — The PR implements the compound-component foundation and related parity artifacts described by this issue.

Possibly related PRs

  • allxsmith/bestax#267 — Both changes update Columns.stories.tsx, connecting the compound-usage story with Storybook conformance metadata.

Suggested labels: deep-review

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title matches the PR’s main change: introducing dot-notation subcomponents via withSubComponents across bulma-ui.
Description check ✅ Passed The description follows the template closely, covering affected packages, change type, tests, docs, stories, demos, and context.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/bestax-compound-expressions-w7vdi7

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

❤️ Share

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

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://81e3c99c.bestax.pages.dev

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (2)
bulma-ui/src/elements/__tests__/IconText.test.tsx (1)

187-197: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Prefer React Testing Library semantic queries over container.querySelector.

React Testing Library best practices strongly discourage using querySelector as 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 value

Use types from @storybook/react-vite and 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., Story or StoryObj). 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

📥 Commits

Reviewing files that changed from the base of the PR and between dd2c479 and e7dc08b.

📒 Files selected for processing (65)
  • bulma-ui/src/columns/Columns.stories.tsx
  • bulma-ui/src/columns/Columns.tsx
  • bulma-ui/src/columns/__tests__/Columns.test.tsx
  • bulma-ui/src/components/Avatars.tsx
  • bulma-ui/src/components/Card.tsx
  • bulma-ui/src/components/Dropdown.tsx
  • bulma-ui/src/components/Menu.tsx
  • bulma-ui/src/components/Message.tsx
  • bulma-ui/src/components/Modal.tsx
  • bulma-ui/src/components/Navbar.tsx
  • bulma-ui/src/components/Pagination.tsx
  • bulma-ui/src/components/Panel.tsx
  • bulma-ui/src/components/Sidebar.tsx
  • bulma-ui/src/components/Steps.tsx
  • bulma-ui/src/components/Tabs.tsx
  • bulma-ui/src/elements/Buttons.stories.tsx
  • bulma-ui/src/elements/Buttons.tsx
  • bulma-ui/src/elements/Figure.tsx
  • bulma-ui/src/elements/IconText.stories.tsx
  • bulma-ui/src/elements/IconText.tsx
  • bulma-ui/src/elements/OrderedList.stories.tsx
  • bulma-ui/src/elements/OrderedList.tsx
  • bulma-ui/src/elements/Table.stories.tsx
  • bulma-ui/src/elements/Table.tsx
  • bulma-ui/src/elements/Tags.stories.tsx
  • bulma-ui/src/elements/Tags.tsx
  • bulma-ui/src/elements/UnorderedList.stories.tsx
  • bulma-ui/src/elements/UnorderedList.tsx
  • bulma-ui/src/elements/__tests__/Buttons.test.tsx
  • bulma-ui/src/elements/__tests__/IconText.test.tsx
  • bulma-ui/src/elements/__tests__/OrderedList.test.tsx
  • bulma-ui/src/elements/__tests__/Table.test.tsx
  • bulma-ui/src/elements/__tests__/Tags.test.tsx
  • bulma-ui/src/elements/__tests__/UnorderedList.test.tsx
  • bulma-ui/src/form/Checkboxes.stories.tsx
  • bulma-ui/src/form/Checkboxes.tsx
  • bulma-ui/src/form/Field.stories.tsx
  • bulma-ui/src/form/Field.tsx
  • bulma-ui/src/form/Radios.stories.tsx
  • bulma-ui/src/form/Radios.tsx
  • bulma-ui/src/form/__tests__/Checkboxes.test.tsx
  • bulma-ui/src/form/__tests__/Field.test.tsx
  • bulma-ui/src/form/__tests__/Radios.test.tsx
  • bulma-ui/src/grid/Grid.stories.tsx
  • bulma-ui/src/grid/Grid.tsx
  • bulma-ui/src/grid/__tests__/Grid.test.tsx
  • bulma-ui/src/helpers/__tests__/withSubComponents.test.tsx
  • bulma-ui/src/helpers/withSubComponents.ts
  • bulma-ui/src/layout/Hero.tsx
  • bulma-ui/src/layout/Level.tsx
  • bulma-ui/src/layout/Media.tsx
  • docs/docs/api/columns/columns.md
  • docs/docs/api/elements/buttons.md
  • docs/docs/api/elements/icontext.md
  • docs/docs/api/elements/orderedlist.md
  • docs/docs/api/elements/table.md
  • docs/docs/api/elements/tags.md
  • docs/docs/api/elements/unorderedlist.md
  • docs/docs/api/form/checkboxes.md
  • docs/docs/api/form/field.md
  • docs/docs/api/form/radios.md
  • docs/docs/api/grid/grid.md
  • scripts/gen-component-catalog.mjs
  • skills/bestax-custom-component/references/component-catalog.md
  • skills/bestax-layout-scaffold/references/layout-components.md

@allxsmith

Copy link
Copy Markdown
Owner Author

@claude deep review

@claude

claude Bot commented Jul 20, 2026 •

Copy link
Copy Markdown

Claude finished @allxsmith's task in 4m 17s —— View job


Deep review

  • Gather context (PR description, diff, CodeRabbit review)
  • Read withSubComponents helper and its tests
  • Review migrated existing compound parents (Card, Modal, Field, Sidebar, etc.) for identity-preservation correctness
  • Review new compound families (Columns, Table, Buttons, Tags, lists, IconText, Checkboxes, Radios, Field.Control)
  • Check TypeScript typing correctness of the helper across ref-forwarding components
  • Check docs/stories consistency
  • Post final review

Setup note: this sandbox's git fetch/pnpm install require interactive approval that wasn't available in this run, so I reviewed by reading the checked-out branch directly rather than running pnpm all/tests. Nothing below depends on that — it's all confirmed by tracing the render logic.

withSubComponents helper — looks solid

bulma-ui/src/helpers/withSubComponents.ts mutates and returns the same function object via Object.assign, which is exactly what identity checks like child.type === ModalCard (Modal.tsx:334-337) and child.type === CardHeader (Card.tsx:82-88, still valid since CardHeaderCompound = withSubComponents(CardHeader, {...}) returns the same CardHeader reference) depend on. Verified this across Modal, Card, Field, and the forwardRef case (Sidebar/Control) — all consistent. The helper's own tests (withSubComponents.test.tsx) cover identity, static attachment, displayName behavior, and the forwardRef case well.

Bug: IconText's dot-notation form produces different (broken) markup than the prop-based form

bulma-ui/src/elements/IconText.tsx:79-96:

return (
  <span className={iconTextClasses} {...rest}>
    {items ? (
      ...
    ) : (
      <>
        {iconProps && <Icon {...iconProps} />}
        {children && <span>{children}</span>}
      </>
    )}
  </span>
);

The prop-based API (<IconText iconProps={...}>Star</IconText>) renders Icon and the text <span> as siblings directly under .icon-text — correct per Bulma's .icon-text flex layout spec.

But the new dot-notation form (<IconText><IconText.Icon .../>Starred</IconText>) doesn't pass iconProps at all — everything arrives via children. Since iconProps is undefined, the iconProps && <Icon .../> branch renders nothing, and the whole children (including IconText.Icon) falls into {children && <span>{children}</span>}. That means the actual DOM is:

<span class="icon-text">
  <span>
    <span class="icon">...</span>
    Starred
  </span>
</span>

i.e. Icon and the text end up nested inside an extra wrapping <span> instead of being direct flex children of .icon-text. This breaks Bulma's icon/text alignment and spacing (.icon-text relies on being a flex container of its direct children).

This isn't just a theoretical edge case — it's the shape used in the new test (bulma-ui/src/elements/__tests__/IconText.test.tsx:187-197), the story (IconText.stories.tsx:311-317), and the live docs example (docs/docs/api/elements/icontext.md:265-270), so the shipped "recommended" dot-notation usage renders incorrect markup. The existing test only asserts .icon-text and .icon are present in the document (container.querySelector), which doesn't catch the extra wrapper — that's also why CodeRabbit's suggestion to switch to getByText(...).parentElement semantic queries would have caught this if applied literally (that assertion would fail as written, since Icon's parent is the inner <span>, not .icon-text).

Fix: IconTextComponent needs to render raw compound children (IconText.Icon + text) as direct children of .icon-text, the same way Buttons/Tags/Columns/etc. do, rather than routing everything through the iconProps/children-wrapped-in-<span> branch built for the legacy single-icon API. Fix this →

Everything else checked out

  • Table, Buttons, Tags, Columns, Grid, Checkboxes/Radios, OrderedList/UnorderedList, Field.Control: all render children straight through, so no equivalent double-wrap risk — dot-notation composition matches the plain import composition exactly.
  • No circular-import issues between Field/Control/Checkboxes/Radios.
  • CodeRabbit's two nitpicks are reasonable but low-severity style/consistency items (RTL semantic queries in IconText.test.tsx, CSF3 object format for Grid.stories.tsx's CompoundUsage) — worth picking up, not blocking.

Summary

One real, user-facing correctness bug (IconText dot-notation markup), otherwise the withSubComponents convergence is careful and correctly preserves the identity invariants the codebase depends on.

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Deep review — 0 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.

@allxsmith
allxsmith merged commit 07516c5 into main Jul 20, 2026
32 checks passed
@allxsmith
allxsmith deleted the claude/bestax-compound-expressions-w7vdi7 branch July 20, 2026 22:23
github-actions Bot pushed a commit that referenced this pull request Jul 20, 2026
# [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))
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 5.7.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

github-actions Bot pushed a commit that referenced this pull request Jul 20, 2026
# 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
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 1.0.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

allxsmith added a commit that referenced this pull request Jul 21, 2026
…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
github-actions Bot pushed a commit that referenced this pull request Jul 21, 2026
# [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))
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.5.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

bestax-release-bot Bot pushed a commit that referenced this pull request Aug 12, 2026
# 1.0.0 (2026-08-12)

* 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)
* **bestax-mcp:** derive the near-miss guidance from the skill, and only when it helps ([1141cca](1141cca))
* **bestax-mcp:** do not split a helper-prop table cell on an escaped pipe ([bdac820](bdac820))
* **bestax-mcp:** lead get_helper_props with the inline-style prohibition ([ffc627a](ffc627a))
* **bestax-mcp:** make list_components point at the next step ([8ddb2fd](8ddb2fd))
* **bestax-mcp:** make tests and cached builds work from a clean checkout ([6e63820](6e63820)), closes [bestax-mcp#build](https://github.com/bestax-mcp/issues/build)
* **bestax-mcp:** name list_components as the entry point, not search_bestax ([206380b](206380b))
* **bestax-mcp:** name the three near-miss components in the list_components footer ([1c7af67](1c7af67))
* **bestax-mcp:** route helper questions to the tool that answers them ([cd6ce12](cd6ce12))
* **bestax-mcp:** validate the one input that is not ours, and bound the rest ([3e1adc9](3e1adc9))
* **bestax-migrate:** give the kitchen-sink e2e a per-process scratch dir ([2211ea5](2211ea5))
* **bestax-migrate:** reject pnpm's workspace alias form instead of unwrapping it ([de6a900](de6a900))
* **bestax-migrate:** require the pack script to exist, not just be named ([5315efe](5315efe))
* **bestax-migrate:** resolve bare workspace: and guard the catalog: protocol ([7fda9db](7fda9db)), closes [#417](#417) [#412](#412)
* **bestax-migrate:** resolve workspace: specifiers before publishing ([782829a](782829a)), closes [bestax-migrate#test](https://github.com/bestax-migrate/issues/test) [#412](#412)
* **bestax-migrate:** stop the pack hooks excusing a catalog: devDependency ([4127ead](4127ead)), closes [#412-shaped](#412)
* **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:** associate Autocomplete and Taginput labels with their inner inputs ([7ae37d4](7ae37d4))
* **bulma-ui:** associate Autocomplete and Taginput labels with their inner inputs ([384bd38](384bd38))
* **bulma-ui:** associate the form label prop with its control via a generated id ([e6686af](e6686af))
* **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:** cover horizontal-layout group label association ([ef3ca9f](ef3ca9f))
* **bulma-ui:** deprecate CSS-less color values, warn in dev, fix has-text fall-through ([fb111eb](fb111eb))
* **bulma-ui:** fail closed on missing process and scope color guidance to real props ([117c0c0](117c0c0))
* **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:** honor the htmlFor opt-out in the convenience hook and tighten the association docs ([92aa622](92aa622))
* **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:** keep Taginput's fallback name unless the label targets its input ([73cec33](73cec33))
* **bulma-ui:** keep Taginput's fallback name unless the label targets its input ([ca5996a](ca5996a))
* **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:** name Rate, Checkboxes, and Radios groups from their labels via aria-labelledby ([dce0ee7](dce0ee7))
* **bulma-ui:** name Rate, Checkboxes, and Radios groups from their labels via aria-labelledby ([#497](#497)) ([5c4222e](5c4222e))
* **bulma-ui:** name the three near-miss components in AGENTS.md ([c63f491](c63f491)), closes [#344](#344)
* **bulma-ui:** never let labelProps.htmlFor wire a group label to a control ([3b3aaaf](3b3aaaf))
* **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:** concrete inline-style → helper-prop mapping for the never-inline rule ([#357](#357)) ([5f72a90](5f72a90)), closes [#350](#350) [#350](#350)
* **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:** put the near-miss guidance where every session sees it ([6db49f3](6db49f3))
* **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:** shrink the near-miss block and pin the copies together ([d582da5](d582da5))
* **create-bestax:** skills-sync conformance gate + theming skill reference backfill ([#326](#326)) ([9584133](9584133)), closes [#285](#285)
* **create-bestax:** stop the skills teaching a Theme call that does not compile ([2935bb2](2935bb2))
* **create-bestax:** synchronize version with bestax-bulma to 2.4.0 ([623ee79](623ee79)), closes [#96](#96)
* **create-bestax:** teach the skills the three components Bulma hides ([22dcff7](22dcff7))
* **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)
* **create-bestax:** validate at submit in the bestax-form signup example ([0b9518f](0b9518f))
* **create-bestax:** wire labeled controls in the skill showcase story ([af49a16](af49a16))
* **docs:** announce the hero copy, and stop remounting the icons ([98e2cb0](98e2cb0)), closes [#434](#434)
* **docs:** correct Content Signals syntax in robots.txt ([#134](#134)) ([85dd9de](85dd9de))
* **docs:** correct the frozen-install translation and reject leaked fences ([1883de3](1883de3))
* **docs:** drop dead nomodule ionicons fallback ([82be3e4](82be3e4))
* **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:** give every batch run its own port — slot reuse was corrupting runs ([6ef1755](6ef1755))
* **docs:** harden PackageManagerTabs and document how to author it ([5b0d3e6](5b0d3e6)), closes [#434](#434)
* **docs:** harden the hero copy button and share the tab storage key ([9e16cd7](9e16cd7))
* **docs:** improve homepage hero layout and button spacing ([5f7a5a7](5f7a5a7))
* **docs:** make the eval batch resumable after a container restart ([d56229e](d56229e))
* **docs:** make the hero package-manager switcher a real radiogroup ([aa14ff2](aa14ff2)), closes [#434](#434)
* **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:** stop cssnano stripping Font Awesome [@font-face](https://github.com/font-face), add [#3](#3) CSS framework blog post ([#401](#401)) ([5d114e1](5d114e1)), closes [#400](#400)
* **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)

### chore

* **deps:** consolidate the dependabot backlog, require Node 22 in both CLIs ([#447](#447)) ([e68148c](e68148c)), closes [#427](#427) [#428](#428) [#431](#431) [#432](#432) [#440](#440) [#393](#393)

### 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-mcp:** serve component docs, props, examples and skills over MCP ([c2abcc4](c2abcc4))
* **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)
* **bestax-migrate:** require Node 22 and take chalk 6 ([#449](#449)) ([4c0e1e2](4c0e1e2)), closes [#447](#447)
* **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:** associate Field's label with a composed base control ([219f631](219f631))
* **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))
* **bulma-ui:** ship agent-discovery files in the npm tarball ([#345](#345)) ([4b58739](4b58739)), closes [#344](#344) [#344](#344) [#344](#344)
* **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 controlled-Burger Navbar to the landing archetype ([#355](#355)) ([36d4d09](36d4d09)), closes [#348](#348)
* **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:** agent-validated guidance for skills, scaffold CLAUDE.md, and catalog ([#365](#365)) ([6fd06ae](6fd06ae)), closes [#2](#2)
* **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:** require Node 22 and take chalk 6 ([#448](#448)) ([90fced2](90fced2)), closes [#447](#447)
* **create-bestax:** scaffold .claude/launch.json with the AI skills opt-in ([#343](#343)) ([189135a](189135a))
* **create-bestax:** scaffold-aware CLAUDE.md with setup facts and house style ([#271](#271)) ([c1681b0](c1681b0))
* **create-bestax:** set scaffolded index.html title to the project name ([#356](#356)) ([3bfbea3](3bfbea3)), closes [#349](#349) [#349](#349)
* **docs:** add Google Analytics tracking for usage insights ([#68](#68)) ([90ab951](90ab951))
* **docs:** add package-manager switches to the homepage hero ([374caf8](374caf8))
* **docs:** add PackageManagerTabs and register it globally ([23c9989](23c9989))
* **docs:** add pronunciation guide and dark mode support ([#58](#58)) ([48a8916](48a8916))
* **docs:** aggregate-runs.mjs — distribution stats across a runs directory ([5de9c07](5de9c07))
* **docs:** batch runner for the eval harness, with the concurrency fixes it needed ([f8e268c](f8e268c))
* **docs:** migrate from GitHub Pages to Cloudflare Pages ([#132](#132)) ([2154672](2154672)), closes [#131](#131)
* **docs:** rubric v2 and a brief that demands the components beyond Bulma ([e6047be](e6047be))
* **docs:** show all posts in the blog sidebar ([d29e9c6](d29e9c6))
* **form:** add Datepicker, Timepicker, and Datetimepicker components ([c6684e6](c6684e6))

### Performance Improvements

* **bestax-mcp:** stop get_helper_props costing half the session ([b865651](b865651))
* **docs:** defer live previews until they scroll into view ([d6bf87b](d6bf87b))
* **docs:** share one parsed stylesheet set across every live preview ([feb993a](feb993a))

### BREAKING CHANGES

* **bestax-migrate:** bestax-migrate now requires Node.js 22 or newer. Node 18 and
20 are both past end-of-life. Running it on an older runtime prints an explicit
upgrade message and exits 1. This applies to the runtime the codemod executes
on, not to the app being migrated.

Claude-Session: https://claude.ai/code/session_01TGA6sFTUGsJ6oXhfpjKEnh
* **create-bestax:** create-bestax now requires Node.js 22 or newer. Node 18 and 20
are both past end-of-life. Running it on an older runtime prints an explicit
upgrade message and exits 1.

Claude-Session: https://claude.ai/code/session_01TGA6sFTUGsJ6oXhfpjKEnh
* **deps:** create-bestax now requires Node.js 22 or newer. Node 18 and 20
are both past end-of-life. Running it on an older runtime prints an explicit
upgrade message and exits 1.

Claude-Session: https://claude.ai/code/session_01TGA6sFTUGsJ6oXhfpjKEnh

* feat(bestax-migrate): require Node 22 and take chalk 6

chalk 6 drops support for Node below 22. The API surface this package uses is
unchanged, so no calling code changes.

The version guard in src/index.ts moves ahead of every import and no longer
depends on anything: import declarations are hoisted and evaluated before any
statement in the module, and chalk 6 itself requires Node >= 22, so a static
import would fail to load on exactly the runtimes the guard exists to catch.
./cli.js is now imported dynamically for the same reason.

@babel/parser deliberately stays on 7.x. Babel 8 removes the
`deprecatedImportAssert` plugin with no replacement, and this package parses
the legacy `import x from 'y' assert { type: 'json' }` form on purpose — a
codemod that migrates older codebases must not crash on the syntax those
codebases still contain. There is a regression test for it ("parses the legacy
import-assert syntax"), which Babel 8 fails outright. jscodeshift 17 bundles
its own Babel 7 regardless, so staying on 7 also keeps a single parser in the
tree rather than two.
* **deps:** bestax-migrate now requires Node.js 22 or newer. Node 18 and
20 are both past end-of-life. Running it on an older runtime prints an explicit
upgrade message and exits 1.

Claude-Session: https://claude.ai/code/session_01TGA6sFTUGsJ6oXhfpjKEnh
* 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
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 1.0.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants