Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
fddfd65
fix(bestax-mcp): give Theme, ConfigProvider, Portal and ClientOnly pr…
allxsmith Oct 7, 2026
e72aee0
fix(bestax-mcp): document Theme's variable props, point at the prose …
allxsmith Oct 8, 2026
67f1552
fix(bestax-mcp): read an overloaded component's implementation, not i…
allxsmith Oct 8, 2026
fd134fa
fix(bestax-mcp): make the links in markdown the index ships absolute
allxsmith Oct 8, 2026
1a7dec6
test(bestax-mcp): match link targets by pattern rather than URL subst…
allxsmith Oct 8, 2026
224e9ed
Merge remote-tracking branch 'origin/main' into gate-fix-933-helper-c…
allxsmith Oct 8, 2026
914b92a
fix(bulma-ui): name DateRangeInput's default icon in its Control-leve…
allxsmith Oct 8, 2026
02551c9
Merge remote-tracking branch 'origin/main' into work-969-merge
allxsmith Oct 8, 2026
e620347
fix(bestax-mcp): resolve links in every string the index ships, and r…
allxsmith Oct 8, 2026
e45b4b8
fix(bestax-mcp): point at a component's page only under a table it ca…
allxsmith Oct 8, 2026
fe41ed0
Merge remote-tracking branch 'origin/main' into gate-fix-933-helper-c…
allxsmith Oct 8, 2026
6158d0b
chore: regenerate after merging main
allxsmith Oct 8, 2026
d6d4c57
fix(bestax-mcp): tag the bestax.io links inside index answers, like t…
allxsmith Oct 8, 2026
27fc36a
docs: say the MCP tags the links inside its answers too
allxsmith Oct 8, 2026
f94fda2
Merge remote-tracking branch 'origin/main' into work-969-utm
allxsmith Oct 8, 2026
f210570
fix(bestax-mcp): match bestax.io links with an anchored pattern, not …
allxsmith Oct 9, 2026
82290e0
test(bestax-mcp): sweep every served record for an untagged site link
allxsmith Oct 9, 2026
25e4173
test(bestax-mcp): check the skill body, not the version note, for the…
allxsmith Oct 9, 2026
2355731
docs: drop the reference-docs clause from the plugin's tagging note
allxsmith Oct 9, 2026
7a01fd1
Merge remote-tracking branch 'origin/main' into gate-fix-933-helper-c…
allxsmith Oct 9, 2026
f60ee05
chore: regenerate after merging main
allxsmith Oct 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions bestax-mcp/data/catalog.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"schemaVersion": 2,
"generatedFrom": {
"package": "@allxsmith/bestax-bulma",
"version": "5.27.0"
"version": "5.27.1"
},
"docsBase": "https://bestax.io/docs",
"categories": [
Expand Down Expand Up @@ -252,7 +252,7 @@
"name": "Cell",
"kind": "component",
"category": "grid",
"purpose": "The `Cell` component provides a single Bulma grid cell for use inside the [`Grid`](./grid.md) component.",
"purpose": "The `Cell` component provides a single Bulma grid cell for use inside the [`Grid`](https://bestax.io/docs/api/grid) component.",
"slug": "grid/cell",
"import": "import { Cell } from '@allxsmith/bestax-bulma';",
"compound": false,
Expand Down Expand Up @@ -283,13 +283,13 @@
},
{
"name": "ClientOnly",
"kind": "helper",
"kind": "component",
"category": "helpers",
"purpose": "`ClientOnly` renders its children only in the browser, after hydration, and a `fallback` until then, so content that depends on browser-only state doesn't…",
"slug": "helpers/clientonly",
"import": "import { ClientOnly, useIsHydrated } from '@allxsmith/bestax-bulma';",
"compound": false,
"propCount": 0,
"propCount": 2,
"exampleCount": 3
},
{
Expand Down Expand Up @@ -340,7 +340,7 @@
"name": "Columns",
"kind": "component",
"category": "columns",
"purpose": "The `Columns` component provides Bulma's flexible, responsive grid container for aligning and distributing [`Column`](./column.md) components.",
"purpose": "The `Columns` component provides Bulma's flexible, responsive grid container for aligning and distributing [`Column`](https://bestax.io/docs/api/columns/column) components.",
"slug": "columns/columns",
"import": "import { Columns, Column } from '@allxsmith/bestax-bulma';",
"compound": true,
Expand All @@ -349,13 +349,13 @@
},
{
"name": "ConfigProvider",
"kind": "helper",
"kind": "component",
"category": "helpers",
"purpose": "The `ConfigProvider` component provides a React context for configuring global settings across all Bulma UI components.",
"slug": "helpers/config",
"import": "import { ConfigProvider, useConfig } from '@allxsmith/bestax-bulma';",
"compound": false,
"propCount": 0,
"propCount": 3,
"exampleCount": 0
},
{
Expand Down Expand Up @@ -789,13 +789,13 @@
},
{
"name": "Portal",
"kind": "helper",
"kind": "component",
"category": "helpers",
"purpose": "`Portal` renders its children into another part of the page, `document.body` unless `container` says otherwise, so floating content escapes an ancestor's…",
"slug": "helpers/portal",
"import": "import { Portal } from '@allxsmith/bestax-bulma';",
"compound": false,
"propCount": 0,
"propCount": 3,
"exampleCount": 3
},
{
Expand Down Expand Up @@ -1042,13 +1042,13 @@
},
{
"name": "Theme",
"kind": "helper",
"kind": "component",
"category": "helpers",
"purpose": "The `Theme` component provides a powerful way to customize Bulma's appearance using CSS custom properties (CSS variables).",
"slug": "helpers/theme",
"import": "import { Theme } from '@allxsmith/bestax-bulma';",
"compound": false,
"propCount": 0,
"propCount": 43,
"exampleCount": 12
},
{
Expand Down
2 changes: 1 addition & 1 deletion bestax-mcp/data/components/Avatars.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
"code": "<Avatars>\n <Avatars.Avatar name=\"Ada Lovelace\" />\n <Avatars.Avatar name=\"Grace Hopper\" />\n <Avatars.Avatar name=\"Katherine Johnson\" />\n</Avatars>"
}
],
"accessibility": "- `Avatars` is a plain container — each child `Avatar` carries its own accessible name (see\n [Avatar's accessibility notes](./avatar.md#accessibility)).\n- The `+N` surplus avatar gets an accessible name of `\"{N} more\"` (via its `alt`), so assistive\n tech announces how many members are hidden. Localize it with `surplusLabel`, e.g.\n ``surplusLabel={count => `${count} weitere`}``.\n- A focused clickable avatar is lifted above its overlapping neighbours so its focus outline\n is never partially covered.\n- When the group represents a labelled set (e.g. \"Project members\"), give the container a\n `role=\"group\"` and an `aria-label` describing it.",
"accessibility": "- `Avatars` is a plain container — each child `Avatar` carries its own accessible name (see\n [Avatar's accessibility notes](https://bestax.io/docs/api/components/avatar#accessibility)).\n- The `+N` surplus avatar gets an accessible name of `\"{N} more\"` (via its `alt`), so assistive\n tech announces how many members are hidden. Localize it with `surplusLabel`, e.g.\n ``surplusLabel={count => `${count} weitere`}``.\n- A focused clickable avatar is lifted above its overlapping neighbours so its focus outline\n is never partially covered.\n- When the group represents a labelled set (e.g. \"Project members\"), give the container a\n `role=\"group\"` and an `aria-label` describing it.",
"related": ["Avatar", "Badge", "Tags", "useBulmaClasses"],
"storybook": "https://bestax.io/storybook/?path=/story/components-avatars--default",
"summary": "The `Avatars` component renders an overlapping/stacked group of `Avatar`s, the \"members\" list pattern.",
Expand Down
4 changes: 2 additions & 2 deletions bestax-mcp/data/components/Cell.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,14 @@
"accessibility": null,
"related": [],
"storybook": null,
"summary": "The `Cell` component provides a single Bulma grid cell for use inside the [`Grid`](./grid.md) component.",
"summary": "The `Cell` component provides a single Bulma grid cell for use inside the [`Grid`](https://bestax.io/docs/api/grid) component.",
"import": "import { Cell } from '@allxsmith/bestax-bulma';",
"sourceFile": "bulma-ui/src/grid/Cell.tsx",
"rootClass": "cell",
"parts": [
{
"path": "Cell",
"summary": "The `Cell` component provides a single Bulma grid cell for use inside the [`Grid`](./grid.md) component.",
"summary": "The `Cell` component provides a single Bulma grid cell for use inside the [`Grid`](https://bestax.io/docs/api/grid) component.",
"component": null,
"props": [
{
Expand Down
43 changes: 37 additions & 6 deletions bestax-mcp/data/components/ClientOnly.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ClientOnly",
"kind": "helper",
"kind": "component",
"category": "helpers",
"slug": "helpers/clientonly",
"docsUrl": "https://bestax.io/docs/api/helpers/clientonly",
Expand All @@ -18,12 +18,43 @@
"code": "<ClientOnly fallback={<Skeleton variant=\"lines\" lines={3} />}>\n {() => <RecentlyViewed items={readHistory(localStorage)} />}\n</ClientOnly>"
}
],
"accessibility": "- Content that arrives after hydration is not announced by screen readers on its own. Keep what a reader needs on first load out of `ClientOnly`, and use it for enhancements.\n- Match the fallback's size to the content, so the page doesn't shift under someone who has started reading or scrolling.\n- Assistive technology meets the fallback until it is replaced. An empty [`Skeleton`](../elements/skeleton.md) gives it nothing to read; a text fallback such as \"Loading…\" is read out.",
"accessibility": "- Content that arrives after hydration is not announced by screen readers on its own. Keep what a reader needs on first load out of `ClientOnly`, and use it for enhancements.\n- Match the fallback's size to the content, so the page doesn't shift under someone who has started reading or scrolling.\n- Assistive technology meets the fallback until it is replaced. An empty [`Skeleton`](https://bestax.io/docs/api/elements/skeleton) gives it nothing to read; a text fallback such as \"Loading…\" is read out.",
"related": ["Modal", "Reveal", "Skeleton"],
"storybook": "https://bestax.io/storybook/?path=/story/helpers-clientonly--default",
"summary": "`ClientOnly` renders its children only in the browser, after hydration, and a `fallback` until then, so content that depends on browser-only state doesn't…",
"summary": "Renders its children only in the browser, after hydration, and a `fallback` until then, so content that depends on browser-only state doesn't cause a hydration mismatch. The server render and the hydrating client render both show `fallback`, which keeps them identical; the children replace it in the commit that follows. In an app without server rendering the children show on the first render.",
"import": "import { ClientOnly, useIsHydrated } from '@allxsmith/bestax-bulma';",
"doc": "# ClientOnly\n\n## Overview\n\n`ClientOnly` renders its children only in the browser, after hydration, and a `fallback` until then, so content that depends on browser-only state doesn't cause a hydration mismatch.\n\nThe server render and the hydrating client render both show `fallback`, which keeps them identical; the children replace it in the commit that follows. Reach for it when the markup itself would differ between server and browser: the reader's time zone or locale, a value from `localStorage`, the viewport size, a widget that needs `window` to render at all. In an app without server rendering the children show on the first render, so wrapping something in `ClientOnly` costs nothing there.\n\nThe hook underneath, `useIsHydrated`, is exported too, for components that need the answer rather than a wrapper.\n\n---\n\n## Import\n\n```tsx\nimport { ClientOnly, useIsHydrated } from '@allxsmith/bestax-bulma';\n```\n\n---\n\n## Hooks\n\n### useIsHydrated\n\nReturns `false` during server rendering and during the hydrating client render, then `true` from the commit that follows. A component that mounts after hydration (after a route change, or in an app with no server rendering) gets `true` on its first render, so it pays for no extra render.\n\n```tsx\nfunction Greeting() {\n const hydrated = useIsHydrated();\n // localStorage only exists in the browser, so the server render and the\n // hydrating render both show the generic greeting.\n const name = hydrated ? localStorage.getItem('name') : null;\n return <Title size=\"4\">{name ? `Welcome back, ${name}` : 'Welcome'}</Title>;\n}\n```\n\n---\n\n## Usage\n\n### Browser-only content\n\nPass the content as a function and it is called only after hydration, so an expression that reads `window`, `document` or `Intl` state never runs on the server. Plain children work too, but JSX children are evaluated by the component that renders `ClientOnly`, on the server included; a function is what keeps a browser-only expression off the server.\n\n```tsx live\n<ClientOnly fallback={<Skeleton variant=\"lines\" lines={1} />}>\n {() => (\n <Notification color=\"info\">\n Times are shown in{' '}\n <strong>{Intl.DateTimeFormat().resolvedOptions().timeZone}</strong>.\n </Notification>\n )}\n</ClientOnly>\n```\n\n### A component that needs the browser\n\nA component's own render is deferred along with it, so a component child works without the function form.\n\n```tsx\n<ClientOnly fallback={<Skeleton variant=\"block\" />}>\n <MapWidget center={office} />\n</ClientOnly>\n```\n\n### A fallback that holds the layout\n\nWithout a `fallback` nothing renders until hydration, and the content pushes the page down when it arrives. A placeholder of the same size, such as a [`Skeleton`](../elements/skeleton.md), avoids the jump.\n\n```tsx\n<ClientOnly fallback={<Skeleton variant=\"lines\" lines={3} />}>\n {() => <RecentlyViewed items={readHistory(localStorage)} />}\n</ClientOnly>\n```\n\n---\n\n## Accessibility\n\n- Content that arrives after hydration is not announced by screen readers on its own. Keep what a reader needs on first load out of `ClientOnly`, and use it for enhancements.\n- Match the fallback's size to the content, so the page doesn't shift under someone who has started reading or scrolling.\n- Assistive technology meets the fallback until it is replaced. An empty [`Skeleton`](../elements/skeleton.md) gives it nothing to read; a text fallback such as \"Loading…\" is read out.\n\n---\n\n## Related Components\n\n- [`Modal`](../components/modal.md): Its `portal` prop follows the same rule, rendering inline until the page has hydrated.\n- [`Skeleton`](../elements/skeleton.md): A placeholder to pass as `fallback`.\n- [`Reveal`](../components/reveal.md): Renders its final state on the server and animates only in the browser.\n\n---\n\n## Additional Resources\n\n- [Storybook: ClientOnly Stories](https://bestax.io/storybook/?path=/story/helpers-clientonly--default)\n- [React: hydration mismatches](https://react.dev/reference/react-dom/client/hydrateRoot#handling-different-client-and-server-content)\n\n---\n\n## Props\n\n| Prop | Type | Default | Description |\n| ---------- | -------------------------------- | ------- | -------------------------------------------------------------------------------------------------------- |\n| `children` | `ReactNode` \\| `() => ReactNode` | — | Content to render once hydrated. A function is called only then, never on the server. |\n| `fallback` | `ReactNode` | `null` | Rendered on the server and during hydration instead, such as a placeholder the same size as the content. |",
"parts": [],
"cssVars": []
"sourceFile": "bulma-ui/src/helpers/ClientOnly.tsx",
"rootClass": null,
"parts": [
{
"path": "ClientOnly",
"summary": "Renders its children only in the browser, after hydration, and a `fallback` until then, so content that depends on browser-only state doesn't cause a hydration mismatch. The server render and the hydrating client render both show `fallback`, which keeps them identical; the children replace it in the commit that follows. In an app without server rendering the children show on the first render.",
"component": null,
"props": [
{
"name": "children",
"type": "React.ReactNode | (() => React.ReactNode)",
"default": null,
"description": "Content to render once the page has hydrated. A function is called only then, so an inline expression that reads `window`, `document` or `localStorage` never runs on the server.",
"required": false,
"inherited": false,
"deprecated": false
},
{
"name": "fallback",
"type": "React.ReactNode",
"default": "null",
"description": "Rendered on the server and during hydration instead of `children`, such as a placeholder the same size as the content so the layout doesn't shift when it arrives.",
"required": false,
"inherited": false,
"deprecated": false
}
],
"extraProps": [],
"catchAll": null,
"types": []
}
],
"cssVars": [],
"doc": "# ClientOnly\n\n## Overview\n\n`ClientOnly` renders its children only in the browser, after hydration, and a `fallback` until then, so content that depends on browser-only state doesn't cause a hydration mismatch.\n\nThe server render and the hydrating client render both show `fallback`, which keeps them identical; the children replace it in the commit that follows. Reach for it when the markup itself would differ between server and browser: the reader's time zone or locale, a value from `localStorage`, the viewport size, a widget that needs `window` to render at all. In an app without server rendering the children show on the first render, so wrapping something in `ClientOnly` costs nothing there.\n\nThe hook underneath, `useIsHydrated`, is exported too, for components that need the answer rather than a wrapper.\n\n---\n\n## Import\n\n```tsx\nimport { ClientOnly, useIsHydrated } from '@allxsmith/bestax-bulma';\n```\n\n---\n\n## Hooks\n\n### useIsHydrated\n\nReturns `false` during server rendering and during the hydrating client render, then `true` from the commit that follows. A component that mounts after hydration (after a route change, or in an app with no server rendering) gets `true` on its first render, so it pays for no extra render.\n\n```tsx\nfunction Greeting() {\n const hydrated = useIsHydrated();\n // localStorage only exists in the browser, so the server render and the\n // hydrating render both show the generic greeting.\n const name = hydrated ? localStorage.getItem('name') : null;\n return <Title size=\"4\">{name ? `Welcome back, ${name}` : 'Welcome'}</Title>;\n}\n```\n\n---\n\n## Usage\n\n### Browser-only content\n\nPass the content as a function and it is called only after hydration, so an expression that reads `window`, `document` or `Intl` state never runs on the server. Plain children work too, but JSX children are evaluated by the component that renders `ClientOnly`, on the server included; a function is what keeps a browser-only expression off the server.\n\n```tsx live\n<ClientOnly fallback={<Skeleton variant=\"lines\" lines={1} />}>\n {() => (\n <Notification color=\"info\">\n Times are shown in{' '}\n <strong>{Intl.DateTimeFormat().resolvedOptions().timeZone}</strong>.\n </Notification>\n )}\n</ClientOnly>\n```\n\n### A component that needs the browser\n\nA component's own render is deferred along with it, so a component child works without the function form.\n\n```tsx\n<ClientOnly fallback={<Skeleton variant=\"block\" />}>\n <MapWidget center={office} />\n</ClientOnly>\n```\n\n### A fallback that holds the layout\n\nWithout a `fallback` nothing renders until hydration, and the content pushes the page down when it arrives. A placeholder of the same size, such as a [`Skeleton`](https://bestax.io/docs/api/elements/skeleton), avoids the jump.\n\n```tsx\n<ClientOnly fallback={<Skeleton variant=\"lines\" lines={3} />}>\n {() => <RecentlyViewed items={readHistory(localStorage)} />}\n</ClientOnly>\n```\n\n---\n\n## Accessibility\n\n- Content that arrives after hydration is not announced by screen readers on its own. Keep what a reader needs on first load out of `ClientOnly`, and use it for enhancements.\n- Match the fallback's size to the content, so the page doesn't shift under someone who has started reading or scrolling.\n- Assistive technology meets the fallback until it is replaced. An empty [`Skeleton`](https://bestax.io/docs/api/elements/skeleton) gives it nothing to read; a text fallback such as \"Loading…\" is read out.\n\n---\n\n## Related Components\n\n- [`Modal`](https://bestax.io/docs/api/components/modal): Its `portal` prop follows the same rule, rendering inline until the page has hydrated.\n- [`Skeleton`](https://bestax.io/docs/api/elements/skeleton): A placeholder to pass as `fallback`.\n- [`Reveal`](https://bestax.io/docs/api/components/reveal): Renders its final state on the server and animates only in the browser.\n\n---\n\n## Additional Resources\n\n- [Storybook: ClientOnly Stories](https://bestax.io/storybook/?path=/story/helpers-clientonly--default)\n- [React: hydration mismatches](https://react.dev/reference/react-dom/client/hydrateRoot#handling-different-client-and-server-content)\n\n---\n\n## Props\n\n| Prop | Type | Default | Description |\n| ---------- | -------------------------------- | ------- | -------------------------------------------------------------------------------------------------------- |\n| `children` | `ReactNode` \\| `() => ReactNode` | — | Content to render once hydrated. A function is called only then, never on the server. |\n| `fallback` | `ReactNode` | `null` | Rendered on the server and during hydration instead, such as a placeholder the same size as the content. |"
}
Loading
Loading