bestax-mcp 1.15.2 → 1.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/data/catalog.json +24 -1
  2. package/data/components/EmptyState.json +512 -0
  3. package/data/components/Field.json +4 -4
  4. package/data/components/SubTitle.json +3 -3
  5. package/data/components/Taginput.json +5 -5
  6. package/data/components/Title.json +3 -3
  7. package/data/skills/bestax-custom-component/SKILL.md +1 -1
  8. package/data/skills/bestax-custom-component/references/component-catalog.md +2 -1
  9. package/data/skills/bestax-form/SKILL.md +12 -12
  10. package/data/skills/bestax-form/references/api.md +1 -1
  11. package/data/skills/bestax-form/references/patterns.md +3 -3
  12. package/data/skills/bestax-layout-scaffold/SKILL.md +13 -1
  13. package/data/skills/bestax-layout-scaffold/references/archetypes.md +57 -0
  14. package/data/skills/bestax-migrate/references/bloomer/prop-map.md +33 -8
  15. package/data/skills/bestax-migrate/references/bloomer/unmappables.md +18 -0
  16. package/data/skills/bestax-migrate/references/rbx/prop-map.md +31 -8
  17. package/data/skills/bestax-migrate/references/rbx/unmappables.md +18 -0
  18. package/data/skills/bestax-migrate/references/react-bulma-components/component-map.md +1 -1
  19. package/data/skills/bestax-migrate/references/react-bulma-components/prop-map.md +22 -0
  20. package/data/skills/bestax-migrate/references/react-bulma-components/unmappables.md +24 -6
  21. package/data/skills/bestax-optimize/references/modular-build.md +1 -1
  22. package/data/skills/bestax-theming/references/css-variables.md +14 -0
  23. package/data/skills/bestax-theming/references/themeable-components.md +3 -2
  24. package/data/skills.json +13 -13
  25. package/package.json +2 -2
package/data/catalog.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": 2,
3
3
  "generatedFrom": {
4
4
  "package": "@allxsmith/bestax-bulma",
5
- "version": "5.33.1"
5
+ "version": "5.34.1"
6
6
  },
7
7
  "docsBase": "https://bestax.io/docs",
8
8
  "categories": [
@@ -60,6 +60,7 @@
60
60
  "ContextMenu",
61
61
  "Dialog",
62
62
  "Dropdown",
63
+ "EmptyState",
63
64
  "HoverCard",
64
65
  "Loading",
65
66
  "Menu",
@@ -495,6 +496,17 @@
495
496
  "propCount": 4,
496
497
  "exampleCount": 8
497
498
  },
499
+ {
500
+ "name": "EmptyState",
501
+ "kind": "component",
502
+ "category": "components",
503
+ "purpose": "The `EmptyState` component renders the block an app shows where content would be: an empty list, a search with no results, or a first-run screen.",
504
+ "slug": "components/emptystate",
505
+ "import": "import { EmptyState } from '@allxsmith/bestax-bulma';",
506
+ "compound": true,
507
+ "propCount": 33,
508
+ "exampleCount": 10
509
+ },
498
510
  {
499
511
  "name": "Field",
500
512
  "kind": "component",
@@ -1571,6 +1583,17 @@
1571
1583
  "--bulma-dropdown-item-selected-l": ["Dropdown"],
1572
1584
  "--bulma-dropdown-item-selected-s": ["Dropdown"],
1573
1585
  "--bulma-dropdown-menu-min-width": ["Dropdown"],
1586
+ "--bulma-empty-state-description-color": ["EmptyState"],
1587
+ "--bulma-empty-state-description-max-width": ["EmptyState"],
1588
+ "--bulma-empty-state-description-size": ["EmptyState"],
1589
+ "--bulma-empty-state-gap": ["EmptyState"],
1590
+ "--bulma-empty-state-icon-size": ["EmptyState"],
1591
+ "--bulma-empty-state-indicator-background": ["EmptyState"],
1592
+ "--bulma-empty-state-indicator-color": ["EmptyState"],
1593
+ "--bulma-empty-state-indicator-radius": ["EmptyState"],
1594
+ "--bulma-empty-state-indicator-size": ["EmptyState"],
1595
+ "--bulma-empty-state-padding": ["EmptyState"],
1596
+ "--bulma-empty-state-title-size": ["EmptyState"],
1574
1597
  "--bulma-field-block-spacing": ["Field"],
1575
1598
  "--bulma-file-active-background-l-delta": ["File"],
1576
1599
  "--bulma-file-active-border-l-delta": ["File"],
@@ -0,0 +1,512 @@
1
+ {
2
+ "name": "EmptyState",
3
+ "kind": "component",
4
+ "category": "components",
5
+ "slug": "components/emptystate",
6
+ "docsUrl": "https://bestax.io/docs/api/components/emptystate",
7
+ "examples": [
8
+ {
9
+ "title": "Basic Usage",
10
+ "code": "<Box>\n <EmptyState\n icon=\"folder-open\"\n title=\"No projects yet\"\n description=\"Projects you create or join show up here.\"\n >\n <Button color=\"primary\">New project</Button>\n </EmptyState>\n</Box>"
11
+ },
12
+ {
13
+ "title": "More Than One Action",
14
+ "code": "<Box>\n <EmptyState\n icon=\"folder-open\"\n title=\"No projects yet\"\n description=\"Projects you create or join show up here.\"\n >\n <EmptyState.Actions>\n <Button color=\"primary\">New project</Button>\n <Button>Import</Button>\n </EmptyState.Actions>\n </EmptyState>\n</Box>"
15
+ },
16
+ {
17
+ "title": "Sizes",
18
+ "code": "<Columns isMultiline>\n {(['small', 'normal', 'medium', 'large'] as const).map(size => (\n <Column key={size} size=\"half\" display=\"flex\" flexDirection=\"column\">\n <Box\n flexGrow=\"1\"\n display=\"flex\"\n flexDirection=\"column\"\n justifyContent=\"center\"\n >\n <EmptyState\n size={size}\n icon=\"inbox\"\n title=\"No messages\"\n description=\"Messages people send you show up here.\"\n >\n <Button>Write a message</Button>\n </EmptyState>\n </Box>\n </Column>\n ))}\n</Columns>"
19
+ },
20
+ {
21
+ "title": "Colors",
22
+ "code": "<Columns isMultiline>\n <Column size=\"one-third\">\n <Box>\n <EmptyState\n size=\"small\"\n color=\"primary\"\n icon=\"folder-open\"\n title=\"No projects yet\"\n />\n </Box>\n </Column>\n <Column size=\"one-third\">\n <Box>\n <EmptyState\n size=\"small\"\n color=\"link\"\n icon=\"bookmark\"\n title=\"No bookmarks yet\"\n />\n </Box>\n </Column>\n <Column size=\"one-third\">\n <Box>\n <EmptyState\n size=\"small\"\n color=\"info\"\n icon=\"upload\"\n title=\"Nothing uploaded yet\"\n />\n </Box>\n </Column>\n <Column size=\"one-third\">\n <Box>\n <EmptyState size=\"small\" color=\"success\" icon=\"check\" title=\"All done\" />\n </Box>\n </Column>\n <Column size=\"one-third\">\n <Box>\n <EmptyState\n size=\"small\"\n color=\"warning\"\n icon=\"box-archive\"\n title=\"No backups yet\"\n />\n </Box>\n </Column>\n <Column size=\"one-third\">\n <Box>\n <EmptyState\n size=\"small\"\n color=\"danger\"\n icon=\"trash\"\n title=\"The trash is empty\"\n />\n </Box>\n </Column>\n</Columns>"
23
+ },
24
+ {
25
+ "title": "Variants",
26
+ "code": "<Columns>\n <Column>\n <Box>\n <EmptyState size=\"small\" icon=\"bell\" title=\"No alerts\" />\n </Box>\n </Column>\n <Column>\n <Box>\n <EmptyState size=\"small\" variant=\"filled\" icon=\"bell\" title=\"No alerts\" />\n </Box>\n </Column>\n <Column>\n <Box>\n <EmptyState size=\"small\" color=\"success\" icon=\"check\" title=\"All done\" />\n </Box>\n </Column>\n <Column>\n <Box>\n <EmptyState\n size=\"small\"\n color=\"success\"\n variant=\"filled\"\n icon=\"check\"\n title=\"All done\"\n />\n </Box>\n </Column>\n</Columns>"
27
+ },
28
+ {
29
+ "title": "Alignment",
30
+ "code": "<Box>\n <EmptyState\n align=\"left\"\n color=\"primary\"\n icon=\"users\"\n title=\"No one else is here yet\"\n description=\"Invite the people you work with, and they'll show up in this list.\"\n >\n <EmptyState.Actions>\n <Button color=\"primary\">Invite people</Button>\n <Button>Copy invite link</Button>\n </EmptyState.Actions>\n </EmptyState>\n</Box>"
31
+ },
32
+ {
33
+ "title": "In a Card",
34
+ "code": "<Columns>\n <Column>\n <Card header=\"Invoices\">\n <EmptyState\n size=\"small\"\n align=\"left\"\n color=\"success\"\n variant=\"filled\"\n icon=\"check\"\n title=\"All paid up\"\n titleAs=\"h3\"\n description=\"New invoices show up here when they arrive.\"\n />\n </Card>\n </Column>\n <Column>\n <Card header=\"Files\">\n <EmptyState\n size=\"small\"\n icon=\"cloud-arrow-up\"\n title=\"Nothing uploaded yet\"\n titleAs=\"h3\"\n description=\"Files you add to this project show up here.\"\n >\n <Button size=\"small\" color=\"info\">\n Upload files\n </Button>\n </EmptyState>\n </Card>\n </Column>\n</Columns>"
35
+ },
36
+ {
37
+ "title": "A Search With No Results",
38
+ "code": "function example() {\n const projects = ['Apollo', 'Gemini', 'Mercury'];\n const [query, setQuery] = useState('kraken');\n const searchRef = React.useRef<HTMLInputElement>(null);\n const term = query.trim().toLowerCase();\n const shown = projects.filter(name => name.toLowerCase().includes(term));\n\n function clear() {\n setQuery('');\n // The button goes away with the empty state, so focus goes back to the field.\n searchRef.current?.focus();\n }\n\n return (\n <Box>\n <Title as=\"h2\" textSize=\"5\">\n Projects\n </Title>\n <Field label=\"Search projects\">\n <Control>\n <Input\n ref={searchRef}\n type=\"search\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n />\n </Control>\n </Field>\n {/* Always in the page, so a change to its text is announced. */}\n <Paragraph role=\"status\" aria-atomic=\"true\" visibility=\"sr-only\">\n {shown.length === 0\n ? 'No projects match the search'\n : `${shown.length} of ${projects.length} projects`}\n </Paragraph>\n {shown.length === 0 ? (\n <EmptyState\n icon=\"magnifying-glass\"\n title={`No projects match “${query}”`}\n titleAs=\"h3\"\n description=\"Check the spelling, or clear the search.\"\n >\n <Button onClick={clear}>Clear search</Button>\n </EmptyState>\n ) : (\n <UnorderedList>\n {shown.map(name => (\n <ListItem key={name}>{name}</ListItem>\n ))}\n </UnorderedList>\n )}\n </Box>\n );\n}"
39
+ },
40
+ {
41
+ "title": "A First-Run Screen",
42
+ "code": "<Hero color=\"primary\">\n <Hero.Body>\n <EmptyState\n size=\"large\"\n icon=\"rocket\"\n title=\"Welcome to your workspace\"\n titleAs=\"h1\"\n description=\"Make a project to get started. You can invite people once it's set up.\"\n >\n <Button color=\"primary\" isInverted>\n Make a project\n </Button>\n </EmptyState>\n </Hero.Body>\n</Hero>"
43
+ },
44
+ {
45
+ "title": "Compound (dot-notation) usage",
46
+ "code": "<Box>\n <EmptyState align=\"left\" color=\"warning\">\n <EmptyState.Indicator>\n <Icon name=\"star\" variant=\"regular\" />\n </EmptyState.Indicator>\n <EmptyState.Title as=\"h3\">No favorites yet</EmptyState.Title>\n <EmptyState.Description>\n Star a project to keep it here. A few to start with:\n </EmptyState.Description>\n <UnorderedList>\n <ListItem>\n <a href=\"#apollo\">Apollo</a>\n </ListItem>\n <ListItem>\n <a href=\"#gemini\">Gemini</a>\n </ListItem>\n </UnorderedList>\n <EmptyState.Actions size=\"small\">\n <Button color=\"warning\">Browse projects</Button>\n <Button>Not now</Button>\n </EmptyState.Actions>\n </EmptyState>\n</Box>"
47
+ }
48
+ ],
49
+ "accessibility": "- **The title is a heading:** it's always one, `h1` to `h6`, and `h2` by default. Pick the level\n under the heading of the list it stands in for: an `h2` on a page, an `h3` or an `h4` in a Card.\n `titleAs` sets it for the `title` prop and `as` sets it on `EmptyState.Title`, and nothing about\n the size changes it. The size comes from the EmptyState, so `EmptyState.Title` doesn't take\n `Title`'s `size`.\n- **The picture is decoration:** the indicator has `aria-hidden=\"true\"`, so everything in it is\n hidden, an `Icon` with an `ariaLabel` included. Say what it means in the title or the\n description.\n- **No role and no live region:** an empty state is content, and the heading makes it findable. It\n doesn't announce itself, since it arrives already filled, would read its buttons along with it,\n and is gone when results come back. After a search or a filter, announce the result with a\n `role=\"status\"` region that's in the page the whole time, beside the search field, as in\n [A Search With No Results](https://bestax.io/docs/api/components/emptystate#a-search-with-no-results). Primer's\n [loading pattern](https://primer.style/product/ui-patterns/loading/) describes the same thing.\n- **Focus:** nothing in the component moves focus. A \"Clear search\" button goes away with the\n empty state, so its click handler puts focus back in the search field rather than leaving it on\n the page's `<body>`.\n- **Not for loading or errors:** while the data loads, show a [`Skeleton`](https://bestax.io/docs/api/elements/skeleton)\n or a [`Loader`](https://bestax.io/docs/api/elements/loader), so \"No projects yet\" doesn't flash before the projects\n arrive. A load that failed is a [`Message`](https://bestax.io/docs/api/components/message) or a\n [`Notification`](https://bestax.io/docs/api/elements/notification).\n- **Contrast:** the description is the color of the text around it, so it keeps the contrast its\n container has, a colored Hero included, and the title is Bulma's title color. The circle is\n decoration, so it doesn't owe a contrast ratio, but every pairing reads in light and dark mode.\n- **Forced colors:** in Windows high contrast mode the icon takes the system's text color and\n stays visible. The circle's fill drops out, since it's decoration.\n- **No motion:** nothing animates.",
50
+ "related": [
51
+ "Buttons",
52
+ "Icon",
53
+ "Loader",
54
+ "Media",
55
+ "Message",
56
+ "Skeleton",
57
+ "Title",
58
+ "useBulmaClasses"
59
+ ],
60
+ "storybook": "https://bestax.io/storybook/?path=/story/components-emptystate--default",
61
+ "summary": "The `EmptyState` component renders the block an app shows where content would be: an empty list, a search with no results, or a first-run screen. It's a column of a picture in a circle, a heading, a line of text and the actions, with one layout whether it's written with the `icon`, `title` and `description` props or with the parts. The children always render as written, after the parts the props render. It has no role and no live region. It arrives already filled and goes away when results come back, so it can't announce a search that matched nothing: keep a `role=\"status\"` region beside the search field for that, in the page the whole time. While the data loads, show a `Skeleton` or a `Loader` instead, so \"No projects yet\" doesn't flash first, and show a load that failed in a `Message` or a `Notification`.",
62
+ "import": "import { EmptyState } from '@allxsmith/bestax-bulma';",
63
+ "sourceFile": "bulma-ui/src/components/EmptyState.tsx",
64
+ "rootClass": "empty-state",
65
+ "parts": [
66
+ {
67
+ "path": "EmptyState",
68
+ "summary": "The `EmptyState` component renders the block an app shows where content would be: an empty list, a search with no results, or a first-run screen. It's a column of a picture in a circle, a heading, a line of text and the actions, with one layout whether it's written with the `icon`, `title` and `description` props or with the parts. The children always render as written, after the parts the props render. It has no role and no live region. It arrives already filled and goes away when results come back, so it can't announce a search that matched nothing: keep a `role=\"status\"` region beside the search field for that, in the page the whole time. While the data loads, show a `Skeleton` or a `Loader` instead, so \"No projects yet\" doesn't flash first, and show a load that failed in a `Message` or a `Notification`.",
69
+ "component": null,
70
+ "props": [
71
+ {
72
+ "name": "className",
73
+ "type": "string",
74
+ "default": null,
75
+ "description": "Additional CSS classes to apply.",
76
+ "required": false,
77
+ "inherited": false,
78
+ "deprecated": false
79
+ },
80
+ {
81
+ "name": "icon",
82
+ "type": "React.ReactNode",
83
+ "default": null,
84
+ "description": "The picture in the indicator's circle. A string is an `Icon` name, drawn from the icon library `ConfigProvider` sets. Anything else (an `<Icon>` with its own `variant` or `library`, an SVG, an `<img>`) renders as it is. It's decorative and hidden from assistive tech, so the title says what it means.",
85
+ "required": false,
86
+ "inherited": false,
87
+ "deprecated": false
88
+ },
89
+ {
90
+ "name": "title",
91
+ "type": "React.ReactNode",
92
+ "default": null,
93
+ "description": "The heading, rendered as `EmptyState.Title`. It's always a real heading, at the level `titleAs` sets.",
94
+ "required": false,
95
+ "inherited": false,
96
+ "deprecated": false
97
+ },
98
+ {
99
+ "name": "titleAs",
100
+ "type": "'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'",
101
+ "default": "'h2'",
102
+ "description": "The heading level for `title`: the level under the heading of the list it stands in for, such as `h3` for a list under an `h2`. Only this sets the level, and the size comes from `size`.",
103
+ "required": false,
104
+ "inherited": false,
105
+ "deprecated": false
106
+ },
107
+ {
108
+ "name": "description",
109
+ "type": "React.ReactNode",
110
+ "default": null,
111
+ "description": "A sentence or two under the title, rendered as `EmptyState.Description`.",
112
+ "required": false,
113
+ "inherited": false,
114
+ "deprecated": false
115
+ },
116
+ {
117
+ "name": "children",
118
+ "type": "React.ReactNode",
119
+ "default": null,
120
+ "description": "Rendered as written, after whatever `icon`, `title` and `description` render. One button can go straight in, and it sits centered under the text. Group two or more in `EmptyState.Actions`, or they stack. Without the props, write the parts here in the order they're shown: `EmptyState.Indicator`, `.Title`, `.Description`, then the actions.",
121
+ "required": false,
122
+ "inherited": false,
123
+ "deprecated": false
124
+ },
125
+ {
126
+ "name": "color",
127
+ "type": "'primary' | 'link' | 'info' | 'success' | 'warning' | 'danger'",
128
+ "default": null,
129
+ "description": "The indicator's color. It colors the circle and its icon, not the text. Without it the circle is neutral, since an empty list isn't a status.",
130
+ "required": false,
131
+ "inherited": false,
132
+ "deprecated": false
133
+ },
134
+ {
135
+ "name": "variant",
136
+ "type": "'light' | 'filled'",
137
+ "default": "'light'",
138
+ "description": "`light` is a soft tint of `color` behind the icon in the color. `filled` is the color itself, with the icon in its invert.",
139
+ "required": false,
140
+ "inherited": false,
141
+ "deprecated": false
142
+ },
143
+ {
144
+ "name": "size",
145
+ "type": "'small' | 'normal' | 'medium' | 'large'",
146
+ "default": "'normal'",
147
+ "description": "Sizes the indicator, the title, the description and the spacing together.",
148
+ "required": false,
149
+ "inherited": false,
150
+ "deprecated": false
151
+ },
152
+ {
153
+ "name": "align",
154
+ "type": "'center' | 'left'",
155
+ "default": "'center'",
156
+ "description": "`center` stacks everything in a centered column. `left` puts the indicator beside the text, at the start of the line, so on the right in a right-to-left page, and keeps the block at least as tall as the circle whatever block padding is in effect. Without an indicator, it only puts the text at the start of the line. In `left`, the padding at the start of the line is what makes room for the indicator, so pad it with `py` rather than `p` or `px`.",
157
+ "required": false,
158
+ "inherited": false,
159
+ "deprecated": false
160
+ },
161
+ {
162
+ "name": "textColor",
163
+ "type": "Bulma color | 'inherit' | 'current'",
164
+ "default": null,
165
+ "description": "Text color helper.",
166
+ "required": false,
167
+ "inherited": false,
168
+ "deprecated": false,
169
+ "valuesRef": "helpers/valid-values"
170
+ },
171
+ {
172
+ "name": "bgColor",
173
+ "type": "Bulma color | 'inherit' | 'current'",
174
+ "default": null,
175
+ "description": "Background color helper.",
176
+ "required": false,
177
+ "inherited": false,
178
+ "deprecated": false,
179
+ "valuesRef": "helpers/valid-values"
180
+ }
181
+ ],
182
+ "extraProps": [
183
+ {
184
+ "name": "ref",
185
+ "type": "React.Ref<HTMLDivElement>",
186
+ "default": null,
187
+ "description": "Ref forwarded to the root `<div>`.",
188
+ "required": false,
189
+ "inherited": false,
190
+ "deprecated": false
191
+ }
192
+ ],
193
+ "catchAll": "All standard <div> attributes and Bulma helper props",
194
+ "types": []
195
+ },
196
+ {
197
+ "path": "EmptyState.Indicator",
198
+ "summary": "The circle the picture sits in, hidden from assistive tech whatever is in it.",
199
+ "component": null,
200
+ "props": [
201
+ {
202
+ "name": "className",
203
+ "type": "string",
204
+ "default": null,
205
+ "description": "Additional CSS classes to apply.",
206
+ "required": false,
207
+ "inherited": false,
208
+ "deprecated": false
209
+ },
210
+ {
211
+ "name": "children",
212
+ "type": "React.ReactNode",
213
+ "default": null,
214
+ "description": "The picture: an `Icon`, an SVG or an `<img>`. The indicator is hidden from assistive tech, an `Icon` with an `ariaLabel` included, so anything it means goes in the title or the description.",
215
+ "required": false,
216
+ "inherited": false,
217
+ "deprecated": false
218
+ },
219
+ {
220
+ "name": "textColor",
221
+ "type": "Bulma color | 'inherit' | 'current'",
222
+ "default": null,
223
+ "description": "Text color helper.",
224
+ "required": false,
225
+ "inherited": false,
226
+ "deprecated": false,
227
+ "valuesRef": "helpers/valid-values"
228
+ },
229
+ {
230
+ "name": "bgColor",
231
+ "type": "Bulma color | 'inherit' | 'current'",
232
+ "default": null,
233
+ "description": "Background color helper.",
234
+ "required": false,
235
+ "inherited": false,
236
+ "deprecated": false,
237
+ "valuesRef": "helpers/valid-values"
238
+ }
239
+ ],
240
+ "extraProps": [],
241
+ "catchAll": "All standard <div> attributes and Bulma helper props",
242
+ "types": []
243
+ },
244
+ {
245
+ "path": "EmptyState.Title",
246
+ "summary": "The heading, a Bulma `Title` at the level `as` sets, `h2` by default, and at the EmptyState's size.",
247
+ "component": null,
248
+ "props": [
249
+ {
250
+ "name": "as",
251
+ "type": "'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'",
252
+ "default": "'h2'",
253
+ "description": "The heading level: the level under the heading of the list the empty state stands in for.",
254
+ "required": false,
255
+ "inherited": false,
256
+ "deprecated": false
257
+ },
258
+ {
259
+ "name": "className",
260
+ "type": "string",
261
+ "default": null,
262
+ "description": "Additional CSS classes to apply.",
263
+ "required": false,
264
+ "inherited": true,
265
+ "deprecated": false
266
+ },
267
+ {
268
+ "name": "hasSkeleton",
269
+ "type": "boolean",
270
+ "default": "false",
271
+ "description": "Applies the `has-skeleton` class to part of the content.",
272
+ "required": false,
273
+ "inherited": true,
274
+ "deprecated": false
275
+ },
276
+ {
277
+ "name": "children",
278
+ "type": "React.ReactNode",
279
+ "default": null,
280
+ "description": "Title content.",
281
+ "required": false,
282
+ "inherited": true,
283
+ "deprecated": false
284
+ },
285
+ {
286
+ "name": "textColor",
287
+ "type": "Bulma color | 'inherit' | 'current'",
288
+ "default": null,
289
+ "description": "Text color helper.",
290
+ "required": false,
291
+ "inherited": true,
292
+ "deprecated": false,
293
+ "valuesRef": "helpers/valid-values"
294
+ },
295
+ {
296
+ "name": "bgColor",
297
+ "type": "Bulma color | 'inherit' | 'current'",
298
+ "default": null,
299
+ "description": "Background color helper.",
300
+ "required": false,
301
+ "inherited": true,
302
+ "deprecated": false,
303
+ "valuesRef": "helpers/valid-values"
304
+ }
305
+ ],
306
+ "extraProps": [
307
+ {
308
+ "name": "skeleton",
309
+ "type": "boolean",
310
+ "default": null,
311
+ "description": "Applies the `is-skeleton` class to the entire component.",
312
+ "required": false,
313
+ "inherited": false,
314
+ "deprecated": false
315
+ }
316
+ ],
317
+ "catchAll": "All standard <h1>–<h6> / <p> attributes and Bulma helper props",
318
+ "types": []
319
+ },
320
+ {
321
+ "path": "EmptyState.Description",
322
+ "summary": "A sentence or two under the title, in the color of the text around it.",
323
+ "component": null,
324
+ "props": [
325
+ {
326
+ "name": "className",
327
+ "type": "string",
328
+ "default": null,
329
+ "description": "Additional CSS classes to apply.",
330
+ "required": false,
331
+ "inherited": true,
332
+ "deprecated": false
333
+ },
334
+ {
335
+ "name": "textColor",
336
+ "type": "Bulma color | 'inherit' | 'current'",
337
+ "default": null,
338
+ "description": "Text color helper.",
339
+ "required": false,
340
+ "inherited": true,
341
+ "deprecated": false,
342
+ "valuesRef": "helpers/valid-values"
343
+ },
344
+ {
345
+ "name": "bgColor",
346
+ "type": "Bulma color | 'inherit' | 'current'",
347
+ "default": null,
348
+ "description": "Background color helper.",
349
+ "required": false,
350
+ "inherited": true,
351
+ "deprecated": false,
352
+ "valuesRef": "helpers/valid-values"
353
+ },
354
+ {
355
+ "name": "children",
356
+ "type": "React.ReactNode",
357
+ "default": null,
358
+ "description": "Content to render inside the paragraph.",
359
+ "required": false,
360
+ "inherited": true,
361
+ "deprecated": false
362
+ }
363
+ ],
364
+ "extraProps": [],
365
+ "catchAll": "All standard <p> attributes and Bulma helper props",
366
+ "types": []
367
+ },
368
+ {
369
+ "path": "EmptyState.Actions",
370
+ "summary": "A row of buttons, centered under the text or at the start of the line beside the indicator.",
371
+ "component": null,
372
+ "props": [
373
+ {
374
+ "name": "className",
375
+ "type": "string",
376
+ "default": null,
377
+ "description": "Additional CSS classes to apply.",
378
+ "required": false,
379
+ "inherited": true,
380
+ "deprecated": false
381
+ },
382
+ {
383
+ "name": "textColor",
384
+ "type": "Bulma color | 'inherit' | 'current'",
385
+ "default": null,
386
+ "description": "Text color helper for the button group.",
387
+ "required": false,
388
+ "inherited": true,
389
+ "deprecated": false,
390
+ "valuesRef": "helpers/valid-values"
391
+ },
392
+ {
393
+ "name": "color",
394
+ "type": "'primary' | 'link' | 'info' | 'success' | 'warning' | 'danger'",
395
+ "default": null,
396
+ "description": "Text color alias: renders `has-text-<color>`, exactly like `textColor`. Not a filled variant (no `.buttons.is-<color>` CSS exists; color the individual `Button`s instead). Prefer `textColor`, which takes precedence when both are set; use `bgColor` for a colored surface.",
397
+ "required": false,
398
+ "inherited": true,
399
+ "deprecated": false
400
+ },
401
+ {
402
+ "name": "bgColor",
403
+ "type": "Bulma color | 'inherit' | 'current'",
404
+ "default": null,
405
+ "description": "Background color helper for the button group.",
406
+ "required": false,
407
+ "inherited": true,
408
+ "deprecated": false,
409
+ "valuesRef": "helpers/valid-values"
410
+ },
411
+ {
412
+ "name": "hasAddons",
413
+ "type": "boolean",
414
+ "default": "false",
415
+ "description": "Group buttons together as addons (removes spacing between them).",
416
+ "required": false,
417
+ "inherited": true,
418
+ "deprecated": false
419
+ },
420
+ {
421
+ "name": "size",
422
+ "type": "'small' | 'medium' | 'large'",
423
+ "default": null,
424
+ "description": "Size of the button group.",
425
+ "required": false,
426
+ "inherited": true,
427
+ "deprecated": false
428
+ },
429
+ {
430
+ "name": "children",
431
+ "type": "React.ReactNode",
432
+ "default": null,
433
+ "description": "The button elements to render inside the group.",
434
+ "required": false,
435
+ "inherited": true,
436
+ "deprecated": false
437
+ }
438
+ ],
439
+ "extraProps": [],
440
+ "catchAll": "All standard <div> attributes and Bulma helper props",
441
+ "types": []
442
+ }
443
+ ],
444
+ "cssVars": [
445
+ {
446
+ "css": "--bulma-empty-state-gap",
447
+ "sass": "$empty-state-gap",
448
+ "default": "1rem",
449
+ "scope": "root"
450
+ },
451
+ {
452
+ "css": "--bulma-empty-state-padding",
453
+ "sass": "$empty-state-padding",
454
+ "default": "3rem",
455
+ "scope": "root"
456
+ },
457
+ {
458
+ "css": "--bulma-empty-state-indicator-size",
459
+ "sass": "$empty-state-indicator-size",
460
+ "default": "3rem",
461
+ "scope": "root"
462
+ },
463
+ {
464
+ "css": "--bulma-empty-state-indicator-radius",
465
+ "sass": "$empty-state-indicator-radius",
466
+ "default": "var(--bulma-radius-rounded)",
467
+ "scope": "root"
468
+ },
469
+ {
470
+ "css": "--bulma-empty-state-indicator-background",
471
+ "sass": "$empty-state-indicator-background",
472
+ "default": "var(--bulma-background)",
473
+ "scope": "root"
474
+ },
475
+ {
476
+ "css": "--bulma-empty-state-indicator-color",
477
+ "sass": "$empty-state-indicator-color",
478
+ "default": "var(--bulma-text-weak)",
479
+ "scope": "root"
480
+ },
481
+ {
482
+ "css": "--bulma-empty-state-icon-size",
483
+ "sass": "$empty-state-icon-size",
484
+ "default": "1.5rem",
485
+ "scope": "root"
486
+ },
487
+ {
488
+ "css": "--bulma-empty-state-title-size",
489
+ "sass": "$empty-state-title-size",
490
+ "default": "var(--bulma-size-5)",
491
+ "scope": "root"
492
+ },
493
+ {
494
+ "css": "--bulma-empty-state-description-size",
495
+ "sass": "$empty-state-description-size",
496
+ "default": "var(--bulma-size-6)",
497
+ "scope": "root"
498
+ },
499
+ {
500
+ "css": "--bulma-empty-state-description-color",
501
+ "sass": "$empty-state-description-color",
502
+ "default": "currentColor",
503
+ "scope": "root"
504
+ },
505
+ {
506
+ "css": "--bulma-empty-state-description-max-width",
507
+ "sass": "$empty-state-description-max-width",
508
+ "default": "32em",
509
+ "scope": "root"
510
+ }
511
+ ]
512
+ }
@@ -86,7 +86,7 @@
86
86
  "code": "<Field horizontal>\n <Field.Label size=\"normal\">\n <label className=\"label\" htmlFor=\"compound-name\">\n Name\n </label>\n </Field.Label>\n <Field.Body>\n <Field.Control>\n <Input id=\"compound-name\" placeholder=\"Jane Doe\" />\n </Field.Control>\n </Field.Body>\n</Field>"
87
87
  }
88
88
  ],
89
- "accessibility": "- For a single control, prefer the control's own `label` prop, with `horizontal` for a side-by-side row. It renders this `Field` and its label and wires the `for` itself, to your `id` when you pass one: `<Input label=\"Email\" id=\"email\" horizontal />`.\n- The `label` prop names the one control the Field holds. A composed `InputBase`, `SelectBase`, `TextAreaBase`, `DateInputBase`, `TimeInputBase`, or `DateTimeInputBase`, or a bestax input that renders a single input of its own (`Input`, `Select`, `TextArea`, `Numberinput`, `Slider`, `DateInput`, `TimeInput`, `DateTimeInput`, `Autocomplete`, `Taginput`, `File`), adopts a generated id the label's `for` points at, so clicking the label focuses the control and assistive technology announces it. An `inline` picker renders no input, so it takes nothing.\n- A control with an `id` of its own keeps it and never takes the generated one, so `<Field label=\"Email\"><Input id=\"email\" /></Field>` renders a label that names nothing. Leave the `id` off, or pass the same value as `labelProps={{ htmlFor: 'email' }}`. Pass `labelProps={{ htmlFor: undefined }}` to opt out of the association entirely.\n- A range `Slider` takes that id on its low thumb, and its thumbs also point `aria-labelledby` at the label (at `labelProps.id` when you set one), so under a label of \"Price range\" they announce as \"Price range Minimum value\" and \"Price range Maximum value\". An `ariaLabel` entry names its thumb instead, and an `aria-label` or `aria-labelledby` on the Slider takes the label's place in both names. A label you wire by hand with `labelProps={{ htmlFor }}` gets no generated id, so it reaches the thumbs' names only when you give it an `id` there too, as in `labelProps={{ htmlFor: 'price', id: 'price-label' }}`.\n- An `Autocomplete` points its open suggestion list's `aria-labelledby` at the label the same way, so under a label of \"Country\" the list announces as \"Country\" rather than its fallback name, \"Suggestions\". A label you wire by hand needs an `id` in `labelProps` for this too, as in `labelProps={{ htmlFor: 'country', id: 'country-label' }}`.\n- A group (`Radios`, `Checkboxes`, `Rate`, `DateRangeInput`, or a composed `DateRangeInputBase`, `inline` or not) can't take a `for`, so the label gets an id (yours from `labelProps.id`, otherwise a generated one) and the group points `aria-labelledby` at it. An `aria-label` or `aria-labelledby` you set on the group wins over the Field's label, as it does over a group's own `label`.\n- Association is skipped for `grouped`/`hasAddons` fields (they hold several controls), and a `Field` nested inside a labeled one starts its own scope. A horizontal Field wraps its children in a `Field.Body` of its own and keeps the association, but the pattern with an inner `Field` in that body needs it wired by hand. A label you wire by hand names the control its `for` points at in a `grouped` or `hasAddons` field too, and with an `id` in `labelProps` it names a range `Slider`'s thumbs and an `Autocomplete`'s list there as well. No group points at it on its own.\n- Two controls in one plain labeled Field would both adopt its id. Give each an `id` of its own and label it individually.\n- Once a labeled Field's content has mounted, its label keeps the generated `for` only while one of the inputs above holds the id, and drops it over anything else: a group, a `Checkbox`, `Radio` or `Switch`, an `inline` picker, an inner `Field`, an input with an `id` of its own, markup of your own, or nothing at all. A server render, and the first render while hydrating, still write the `for`, so hydration matches, and an input that mounts later puts it back. A `for` you set with `labelProps={{ htmlFor }}` always stays. `Checkbox`, `Radio` and `Switch` take nothing from the label on their own: each is named by its own children, so put the text there, and the label names one only when you wire it as you would any control with an `id` of its own, `labelProps={{ htmlFor }}` plus that control's `id`. Where you point content at the label by hand, as with a group in an inner `Field`, `labelProps={{ id }}` is enough in the browser, and `labelProps={{ id, htmlFor: undefined }}` keeps the `for` out of server-rendered HTML too.\n- Grouped/horizontal layouts use Bulma’s grid for layout.",
89
+ "accessibility": "- For a single control, prefer the control's own `label` prop, with `horizontal` for a side-by-side row. It renders this `Field` and its label and wires the `for` itself, to your `id` when you pass one: `<Input label=\"Email\" id=\"email\" horizontal />`.\n- The `label` prop names the one control the Field holds. A composed `InputBase`, `SelectBase`, `TextAreaBase`, `DateInputBase`, `TimeInputBase`, or `DateTimeInputBase`, or a bestax input that renders a single input of its own (`Input`, `Select`, `TextArea`, `Numberinput`, `Slider`, `DateInput`, `TimeInput`, `DateTimeInput`, `Autocomplete`, `Taginput`, `File`), adopts a generated id the label's `for` points at, so clicking the label focuses the control and assistive technology announces it. An `inline` picker renders no input, so it takes nothing.\n- A control with an `id` of its own keeps it and never takes the generated one, so `<Field label=\"Email\"><Input id=\"email\" /></Field>` renders a label that names nothing. Leave the `id` off, or pass the same value as `labelProps={{ htmlFor: 'email' }}`. Pass `labelProps={{ htmlFor: undefined }}` to opt out of the association entirely.\n- A range `Slider` takes that id on its low thumb, and its thumbs also point `aria-labelledby` at the label (at `labelProps.id` when you set one), so under a label of \"Price range\" they announce as \"Price range Minimum value\" and \"Price range Maximum value\". An `ariaLabel` entry names its thumb instead, and an `aria-label` or `aria-labelledby` on the Slider takes the label's place in both names. A label you wire by hand with `labelProps={{ htmlFor }}` gets no generated id, so it reaches the thumbs' names only when you give it an `id` there too, as in `labelProps={{ htmlFor: 'price', id: 'price-label' }}`.\n- An `Autocomplete` or a `Taginput` points its open suggestion list's `aria-labelledby` at the label the same way, so under a label of \"Country\" the list announces as \"Country\" rather than its fallback name, \"Suggestions\". A label you wire by hand needs an `id` in `labelProps` for this too, as in `labelProps={{ htmlFor: 'country', id: 'country-label' }}`.\n- A group (`Radios`, `Checkboxes`, `Rate`, `DateRangeInput`, or a composed `DateRangeInputBase`, `inline` or not) can't take a `for`, so the label gets an id (yours from `labelProps.id`, otherwise a generated one) and the group points `aria-labelledby` at it. An `aria-label` or `aria-labelledby` you set on the group wins over the Field's label, as it does over a group's own `label`.\n- Association is skipped for `grouped`/`hasAddons` fields (they hold several controls), and a `Field` nested inside a labeled one starts its own scope. A horizontal Field wraps its children in a `Field.Body` of its own and keeps the association, but the pattern with an inner `Field` in that body needs it wired by hand. A label you wire by hand names the control its `for` points at in a `grouped` or `hasAddons` field too, and with an `id` in `labelProps` it names a range `Slider`'s thumbs and an `Autocomplete`'s or `Taginput`'s list there as well. No group points at it on its own.\n- Two controls in one plain labeled Field would both adopt its id. Give each an `id` of its own and label it individually.\n- Once a labeled Field's content has mounted, its label keeps the generated `for` only while one of the inputs above holds the id, and drops it over anything else: a group, a `Checkbox`, `Radio` or `Switch`, an `inline` picker, an inner `Field`, an input with an `id` of its own, markup of your own, or nothing at all. A server render, and the first render while hydrating, still write the `for`, so hydration matches, and an input that mounts later puts it back. A `for` you set with `labelProps={{ htmlFor }}` always stays. `Checkbox`, `Radio` and `Switch` take nothing from the label on their own: each is named by its own children, so put the text there, and the label names one only when you wire it as you would any control with an `id` of its own, `labelProps={{ htmlFor }}` plus that control's `id`. Where you point content at the label by hand, as with a group in an inner `Field`, `labelProps={{ id }}` is enough in the browser, and `labelProps={{ id, htmlFor: undefined }}` keeps the `for` out of server-rendered HTML too.\n- Grouped/horizontal layouts use Bulma’s grid for layout.",
90
90
  "related": [
91
91
  "Checkbox",
92
92
  "Checkboxes",
@@ -149,7 +149,7 @@
149
149
  "name": "label",
150
150
  "type": "React.ReactNode",
151
151
  "default": null,
152
- "description": "Field label, rendered above the widget. Automatically names the one control the Field holds: a composed `InputBase`, `SelectBase`, `TextAreaBase`, `DateInputBase`, `TimeInputBase` or `DateTimeInputBase` (an `inline` picker has no input, so it takes nothing), or a bestax input that renders a single input of its own (`Input`, `Select`, `TextArea`, `Numberinput`, `Slider`, `DateInput`, `TimeInput`, `DateTimeInput`, `Autocomplete`, `Taginput`, `File`), adopts a generated id that the label's `htmlFor` points at, and a group (`Radios`, `Checkboxes`, `Rate`, `DateRangeInput`, or a composed `DateRangeInputBase`, `inline` or not) points `aria-labelledby` at the label's own id unless you gave the group an `aria-label` or `aria-labelledby`. A range `Slider` takes the id on its low thumb and also starts each thumb's name with the label through `aria-labelledby`, unless its `ariaLabel` names that thumb or its own `aria-label` or `aria-labelledby` takes the label's place. An `Autocomplete` also names its open suggestion list after the label through `aria-labelledby`. Nothing else takes the label: `Checkbox`, `Radio` and `Switch` are named by their own children, and the label names one only when you wire it as you would any control with an `id` of its own, `labelProps={{ htmlFor }}` plus that control's `id`. Only the single inputs take the `htmlFor`, so once the Field's content has mounted the label keeps it only while one of them holds the id, and drops it over anything else: a group, a `Checkbox`, `Radio` or `Switch`, an `inline` picker, an inner `Field`, an input with an `id` of its own, markup of your own, or nothing at all. A server render, and the first render while hydrating, still write the `htmlFor`, which keeps hydration matching, and an input that mounts later puts it back. The label names an input with an `id` of your own only through `labelProps={{ htmlFor }}` set to that `id`, a `for` it always keeps; `labelProps={{ htmlFor: undefined }}` opts out. Skipped for `grouped`/`hasAddons` fields (multiple controls), and a nested `Field` starts its own scope, so a horizontal Field whose body holds an inner `Field` names the control there only when you wire it. Two controls in one plain labeled Field would both adopt the id, so give each an `id` of its own.",
152
+ "description": "Field label, rendered above the widget. Automatically names the one control the Field holds: a composed `InputBase`, `SelectBase`, `TextAreaBase`, `DateInputBase`, `TimeInputBase` or `DateTimeInputBase` (an `inline` picker has no input, so it takes nothing), or a bestax input that renders a single input of its own (`Input`, `Select`, `TextArea`, `Numberinput`, `Slider`, `DateInput`, `TimeInput`, `DateTimeInput`, `Autocomplete`, `Taginput`, `File`), adopts a generated id that the label's `htmlFor` points at, and a group (`Radios`, `Checkboxes`, `Rate`, `DateRangeInput`, or a composed `DateRangeInputBase`, `inline` or not) points `aria-labelledby` at the label's own id unless you gave the group an `aria-label` or `aria-labelledby`. A range `Slider` takes the id on its low thumb and also starts each thumb's name with the label through `aria-labelledby`, unless its `ariaLabel` names that thumb or its own `aria-label` or `aria-labelledby` takes the label's place. An `Autocomplete` or a `Taginput` also names its open suggestion list after the label through `aria-labelledby`. Nothing else takes the label: `Checkbox`, `Radio` and `Switch` are named by their own children, and the label names one only when you wire it as you would any control with an `id` of its own, `labelProps={{ htmlFor }}` plus that control's `id`. Only the single inputs take the `htmlFor`, so once the Field's content has mounted the label keeps it only while one of them holds the id, and drops it over anything else: a group, a `Checkbox`, `Radio` or `Switch`, an `inline` picker, an inner `Field`, an input with an `id` of its own, markup of your own, or nothing at all. A server render, and the first render while hydrating, still write the `htmlFor`, which keeps hydration matching, and an input that mounts later puts it back. The label names an input with an `id` of your own only through `labelProps={{ htmlFor }}` set to that `id`, a `for` it always keeps; `labelProps={{ htmlFor: undefined }}` opts out. Skipped for `grouped`/`hasAddons` fields (multiple controls), and a nested `Field` starts its own scope, so a horizontal Field whose body holds an inner `Field` names the control there only when you wire it. Two controls in one plain labeled Field would both adopt the id, so give each an `id` of its own.",
153
153
  "required": false,
154
154
  "inherited": false,
155
155
  "deprecated": false
@@ -167,7 +167,7 @@
167
167
  "name": "labelProps",
168
168
  "type": "React.LabelHTMLAttributes<HTMLLabelElement> & { [key: string]: unknown; }",
169
169
  "default": null,
170
- "description": "Props for the label element. An explicit `htmlFor` key — even set to `undefined` — takes over the association. While the association is on, the label renders with the `id` given here, or a generated one, and a group control, a range `Slider`'s thumbs and an `Autocomplete`'s suggestion list point `aria-labelledby` at it. A label you take over gets no generated id, and no group points at it on its own. With an `id` here, though, a range `Slider` or an `Autocomplete` whose `id` your `htmlFor` names still points its thumbs or its suggestion list at it, in a `grouped` or `hasAddons` Field too. To point a group in an inner `Field` at this label by hand, pass that `id`. Nothing in the inner `Field` takes the generated `htmlFor`, so the label drops it after mounting, and adding `htmlFor: undefined` keeps it out of server-rendered markup too.",
170
+ "description": "Props for the label element. An explicit `htmlFor` key — even set to `undefined` — takes over the association. While the association is on, the label renders with the `id` given here, or a generated one, and a group control, a range `Slider`'s thumbs and an `Autocomplete`'s or `Taginput`'s suggestion list point `aria-labelledby` at it. A label you take over gets no generated id, and no group points at it on its own. With an `id` here, though, a range `Slider`, an `Autocomplete` or a `Taginput` whose `id` your `htmlFor` names still points its thumbs or its suggestion list at it, in a `grouped` or `hasAddons` Field too. To point a group in an inner `Field` at this label by hand, pass that `id`. Nothing in the inner `Field` takes the generated `htmlFor`, so the label drops it after mounting, and adding `htmlFor: undefined` keeps it out of server-rendered markup too.",
171
171
  "required": false,
172
172
  "inherited": false,
173
173
  "deprecated": false
@@ -226,7 +226,7 @@
226
226
  },
227
227
  {
228
228
  "path": "Field.Label",
229
- "summary": "FieldLabel component for rendering a Bulma field label. It renders the label column of a horizontal `Field` (a `div` with the `field-label` class), not a `<label>`, so text placed straight in it names nothing. Put a `<label>` with the `label` class inside it and point its `htmlFor` at the control's `id`, or give the horizontal `Field` a `label` prop, which renders this column and its `<label>` for you. A `<label>` you put here names the control through its `htmlFor` alone: a range `Slider`'s thumbs and an `Autocomplete`'s suggestion list point `aria-labelledby` at a `Field`'s label only when its `label` prop renders it and it names the control. Where it would not name the control on its own, as in an inner `Field`, pass `labelProps={{ htmlFor, id }}` with a matching `id` on the control.",
229
+ "summary": "FieldLabel component for rendering a Bulma field label. It renders the label column of a horizontal `Field` (a `div` with the `field-label` class), not a `<label>`, so text placed straight in it names nothing. Put a `<label>` with the `label` class inside it and point its `htmlFor` at the control's `id`, or give the horizontal `Field` a `label` prop, which renders this column and its `<label>` for you. A `<label>` you put here names the control through its `htmlFor` alone: a range `Slider`'s thumbs and an `Autocomplete`'s or `Taginput`'s suggestion list point `aria-labelledby` at a `Field`'s label only when its `label` prop renders it and it names the control. Where it would not name the control on its own, as in an inner `Field`, pass `labelProps={{ htmlFor, id }}` with a matching `id` on the control.",
230
230
  "component": null,
231
231
  "props": [
232
232
  {