bestax-mcp 0.0.0
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.
- package/README.md +90 -0
- package/data/catalog.json +1869 -0
- package/data/components/Autocomplete.json +604 -0
- package/data/components/Avatar.json +220 -0
- package/data/components/Avatars.json +294 -0
- package/data/components/Badge.json +261 -0
- package/data/components/Block.json +105 -0
- package/data/components/Box.json +157 -0
- package/data/components/Breadcrumb.json +155 -0
- package/data/components/Button.json +599 -0
- package/data/components/Buttons.json +533 -0
- package/data/components/Card.json +506 -0
- package/data/components/Carousel.json +512 -0
- package/data/components/Cell.json +154 -0
- package/data/components/Checkbox.json +176 -0
- package/data/components/Checkboxes.json +240 -0
- package/data/components/Code.json +128 -0
- package/data/components/Collapse.json +218 -0
- package/data/components/Column.json +284 -0
- package/data/components/Columns.json +542 -0
- package/data/components/ConfigProvider.json +16 -0
- package/data/components/Container.json +149 -0
- package/data/components/Content.json +228 -0
- package/data/components/Control.json +484 -0
- package/data/components/DateInput.json +872 -0
- package/data/components/DateTimeInput.json +952 -0
- package/data/components/Delete.json +153 -0
- package/data/components/Dialog.json +285 -0
- package/data/components/Divider.json +68 -0
- package/data/components/Dropdown.json +353 -0
- package/data/components/Emphasis.json +99 -0
- package/data/components/Field.json +539 -0
- package/data/components/Figure.json +143 -0
- package/data/components/File.json +403 -0
- package/data/components/Footer.json +109 -0
- package/data/components/Grid.json +357 -0
- package/data/components/Hero.json +340 -0
- package/data/components/Icon.json +232 -0
- package/data/components/IconText.json +307 -0
- package/data/components/Image.json +166 -0
- package/data/components/Input.json +583 -0
- package/data/components/Level.json +332 -0
- package/data/components/Link.json +154 -0
- package/data/components/LinkButton.json +247 -0
- package/data/components/ListItem.json +101 -0
- package/data/components/Loading.json +323 -0
- package/data/components/Media.json +345 -0
- package/data/components/Menu.json +317 -0
- package/data/components/Message.json +303 -0
- package/data/components/Modal.json +444 -0
- package/data/components/Navbar.json +996 -0
- package/data/components/Notification.json +165 -0
- package/data/components/Numberinput.json +364 -0
- package/data/components/OrderedList.json +189 -0
- package/data/components/Pagination.json +619 -0
- package/data/components/Panel.json +582 -0
- package/data/components/Paragraph.json +107 -0
- package/data/components/Pre.json +114 -0
- package/data/components/Progress.json +137 -0
- package/data/components/Radio.json +164 -0
- package/data/components/Radios.json +240 -0
- package/data/components/Rate.json +466 -0
- package/data/components/Reveal.json +177 -0
- package/data/components/Section.json +123 -0
- package/data/components/Select.json +526 -0
- package/data/components/Sidebar.json +488 -0
- package/data/components/Skeleton.json +162 -0
- package/data/components/Slider.json +534 -0
- package/data/components/Span.json +100 -0
- package/data/components/Steps.json +452 -0
- package/data/components/Strong.json +105 -0
- package/data/components/SubTitle.json +233 -0
- package/data/components/Switch.json +291 -0
- package/data/components/Table.json +490 -0
- package/data/components/Tabs.json +592 -0
- package/data/components/Tag.json +197 -0
- package/data/components/Taginput.json +587 -0
- package/data/components/Tags.json +181 -0
- package/data/components/TextArea.json +483 -0
- package/data/components/Theme.json +65 -0
- package/data/components/TimeInput.json +906 -0
- package/data/components/Title.json +240 -0
- package/data/components/Toast.json +308 -0
- package/data/components/Tooltip.json +212 -0
- package/data/components/UnorderedList.json +149 -0
- package/data/components/Valid value constants.json +16 -0
- package/data/components/classNames.json +65 -0
- package/data/components/useBulmaClasses.json +169 -0
- package/data/components/usePrefixedClassNames.json +25 -0
- package/data/skills/bestax-custom-component/SKILL.md +196 -0
- package/data/skills/bestax-custom-component/examples/stat-card.tsx +105 -0
- package/data/skills/bestax-custom-component/references/api.md +90 -0
- package/data/skills/bestax-custom-component/references/component-catalog.md +149 -0
- package/data/skills/bestax-custom-component/references/library-contributor.md +395 -0
- package/data/skills/bestax-custom-component/references/patterns.md +136 -0
- package/data/skills/bestax-form/SKILL.md +254 -0
- package/data/skills/bestax-form/references/api.md +103 -0
- package/data/skills/bestax-form/references/patterns.md +210 -0
- package/data/skills/bestax-icons/SKILL.md +80 -0
- package/data/skills/bestax-icons/examples/icon-usage.tsx +80 -0
- package/data/skills/bestax-icons/references/icon-libraries.md +131 -0
- package/data/skills/bestax-layout-scaffold/SKILL.md +196 -0
- package/data/skills/bestax-layout-scaffold/examples/app-shell.tsx +86 -0
- package/data/skills/bestax-layout-scaffold/examples/card-grid.tsx +106 -0
- package/data/skills/bestax-layout-scaffold/examples/centered.tsx +56 -0
- package/data/skills/bestax-layout-scaffold/examples/content-page.tsx +90 -0
- package/data/skills/bestax-layout-scaffold/examples/landing.tsx +122 -0
- package/data/skills/bestax-layout-scaffold/references/archetypes.md +246 -0
- package/data/skills/bestax-layout-scaffold/references/layout-components.md +269 -0
- package/data/skills/bestax-migrate/SKILL.md +78 -0
- package/data/skills/bestax-migrate/references/component-map.md +91 -0
- package/data/skills/bestax-migrate/references/css-migration.md +100 -0
- package/data/skills/bestax-migrate/references/prop-map.md +48 -0
- package/data/skills/bestax-migrate/references/unmappables.md +124 -0
- package/data/skills/bestax-optimize/SKILL.md +131 -0
- package/data/skills/bestax-optimize/references/modular-build.md +173 -0
- package/data/skills/bestax-theming/SKILL.md +117 -0
- package/data/skills/bestax-theming/examples/dark-mode.tsx +38 -0
- package/data/skills/bestax-theming/examples/theme-config.tsx +60 -0
- package/data/skills/bestax-theming/references/css-variables.md +466 -0
- package/data/skills/bestax-theming/references/themeable-components.md +119 -0
- package/data/skills.json +148 -0
- package/dist/data.d.ts +131 -0
- package/dist/data.d.ts.map +1 -0
- package/dist/data.js +111 -0
- package/dist/format.d.ts +37 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +178 -0
- package/dist/helper-props.d.ts +57 -0
- package/dist/helper-props.d.ts.map +1 -0
- package/dist/helper-props.js +249 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/search.d.ts +32 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +194 -0
- package/dist/server.d.ts +28 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +616 -0
- package/dist/version.d.ts +29 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +147 -0
- package/package.json +70 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# Layout component inventory
|
|
2
|
+
|
|
3
|
+
Self-contained reference for the `@allxsmith/bestax-bulma` layout components. All values are
|
|
4
|
+
source-verified. Import everything from the package root:
|
|
5
|
+
|
|
6
|
+
```tsx
|
|
7
|
+
import {
|
|
8
|
+
Container,
|
|
9
|
+
Section,
|
|
10
|
+
Hero,
|
|
11
|
+
Footer,
|
|
12
|
+
Level,
|
|
13
|
+
Columns,
|
|
14
|
+
Column,
|
|
15
|
+
Grid,
|
|
16
|
+
Cell,
|
|
17
|
+
Navbar,
|
|
18
|
+
Menu,
|
|
19
|
+
Card,
|
|
20
|
+
} from '@allxsmith/bestax-bulma';
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Every component also accepts the shared Bulma helper props (`m`/`p` spacing, `textAlign`,
|
|
24
|
+
`textColor`, `bgColor`, etc.). Flex helpers take the standard CSS values spelled in full:
|
|
25
|
+
`justifyContent="space-between"`, `alignItems="center"`.
|
|
26
|
+
|
|
27
|
+
> **Use helper props, never inline `style`, for spacing / alignment / color.** `mt="4"` (= 1rem)
|
|
28
|
+
> not `style={{ marginTop: '1rem' }}`; `textAlign="centered"` not `style={{ textAlign: 'center' }}`;
|
|
29
|
+
> `textColor="grey"` / `bgColor="light"` not `style={{ color }}`. Spacing scale is `0`–`6` | `auto`
|
|
30
|
+
> (`4` = 1rem). Reserve `style`/CSS vars only for values the design system doesn't tokenize.
|
|
31
|
+
|
|
32
|
+
> **There is no `Tile` component.** For uniform grids (cards, galleries) use `Grid` / `Cell` —
|
|
33
|
+
> equal-height cells for free; for proportional or per-breakpoint layouts use
|
|
34
|
+
> `Columns` / `Column`.
|
|
35
|
+
|
|
36
|
+
## Container
|
|
37
|
+
|
|
38
|
+
`<Container>` centers and constrains page content.
|
|
39
|
+
|
|
40
|
+
| Prop | Type | Notes |
|
|
41
|
+
| --------------------------------- | --------------------------------------- | ----------------------------------------- |
|
|
42
|
+
| `fluid` | `boolean` | Full width with a small gutter. |
|
|
43
|
+
| `widescreen` / `fullhd` | `boolean` | Only constrain at that breakpoint and up. |
|
|
44
|
+
| `breakpoint` | `'tablet' \| 'desktop' \| 'widescreen'` | Max-width breakpoint. |
|
|
45
|
+
| `isMax` | `boolean` | Use the `is-max-*` width. |
|
|
46
|
+
| `color` / `textColor` / `bgColor` | Bulma color | — |
|
|
47
|
+
|
|
48
|
+
## Section
|
|
49
|
+
|
|
50
|
+
`<Section>` adds vertical page rhythm (padding).
|
|
51
|
+
|
|
52
|
+
| Prop | Type |
|
|
53
|
+
| --------------------------------- | ---------------------------------------- |
|
|
54
|
+
| `size` | `'medium' \| 'large'` (omit for default) |
|
|
55
|
+
| `color` / `textColor` / `bgColor` | Bulma color |
|
|
56
|
+
|
|
57
|
+
## Hero
|
|
58
|
+
|
|
59
|
+
`<Hero>` is a full-width banner. Subcomponents: `Hero.Head`, `Hero.Body`, `Hero.Foot`.
|
|
60
|
+
|
|
61
|
+
| Prop | Type |
|
|
62
|
+
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
63
|
+
| `color` | `primary \| link \| info \| success \| warning \| danger \| black \| white \| light \| dark` (CSS-backed). Also accepted but deprecated, no CSS, dev-warn: `black-bis`, `black-ter`, the greys, `inherit`, `current` |
|
|
64
|
+
| `size` | `'small' \| 'medium' \| 'large' \| 'fullheight' \| 'fullheight-with-navbar'` |
|
|
65
|
+
| `fullheightWithNavbar` | `boolean` |
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
<Hero color="primary" size="medium">
|
|
69
|
+
<Hero.Body>…</Hero.Body>
|
|
70
|
+
</Hero>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Footer
|
|
74
|
+
|
|
75
|
+
`<Footer>` is the page footer.
|
|
76
|
+
|
|
77
|
+
| Prop | Type |
|
|
78
|
+
| --------------------------------- | ------------------- |
|
|
79
|
+
| `as` | `'footer' \| 'div'` |
|
|
80
|
+
| `color` / `textColor` / `bgColor` | Bulma color |
|
|
81
|
+
|
|
82
|
+
## Level
|
|
83
|
+
|
|
84
|
+
`<Level>` is a horizontal toolbar (left/right groups). Subcomponents: `Level.Left`, `Level.Right`,
|
|
85
|
+
`Level.Item`.
|
|
86
|
+
|
|
87
|
+
| Prop | Type |
|
|
88
|
+
| ---------------------------- | ------------------------------------- |
|
|
89
|
+
| `Level.isMobile` | `boolean` (keep horizontal on mobile) |
|
|
90
|
+
| `Level.Item.as` | `'div' \| 'p' \| 'a'` |
|
|
91
|
+
| `Level.Item.hasTextCentered` | `boolean` |
|
|
92
|
+
|
|
93
|
+
## Columns / Column
|
|
94
|
+
|
|
95
|
+
The responsive grid. `Columns` is the row; `Column` is a cell (also reachable as
|
|
96
|
+
`Columns.Column`).
|
|
97
|
+
|
|
98
|
+
**Columns**
|
|
99
|
+
|
|
100
|
+
| Prop | Type |
|
|
101
|
+
| -------------------------------------------------------------------------------- | -------------------------------------------------------- |
|
|
102
|
+
| `isMultiline` | `boolean` (wrap cells onto new rows) |
|
|
103
|
+
| `isCentered` | `boolean` (center the row) |
|
|
104
|
+
| `isVCentered` | `boolean` (vertical centering — capital V) |
|
|
105
|
+
| `isGapless` | `boolean` |
|
|
106
|
+
| `isMobile` | `boolean` (stay side-by-side on mobile) |
|
|
107
|
+
| `isDesktop` | `boolean` |
|
|
108
|
+
| `gap` / `gapMobile` / `gapTablet` / `gapDesktop` / `gapWidescreen` / `gapFullhd` | `0`–`8` (number or string, same scale as `Grid`'s `gap`) |
|
|
109
|
+
|
|
110
|
+
**Column**
|
|
111
|
+
|
|
112
|
+
| Prop | Type |
|
|
113
|
+
| -------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- |
|
|
114
|
+
| `size` (+ `sizeMobile` / `sizeTablet` / `sizeDesktop` / `sizeWidescreen` / `sizeFullhd`) | `BulmaColumnSize` |
|
|
115
|
+
| `offset` (+ per-breakpoint) | `BulmaColumnSize` |
|
|
116
|
+
| `isNarrow` (+ per-breakpoint: `isNarrowMobile` / `isNarrowTablet` / `isNarrowTouch` / `isNarrowDesktop` / `isNarrowWidescreen` / `isNarrowFullhd`) | `boolean` |
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
type BulmaColumnSize =
|
|
120
|
+
| number // 1–12
|
|
121
|
+
| 'full'
|
|
122
|
+
| 'half'
|
|
123
|
+
| 'one-third'
|
|
124
|
+
| 'two-thirds'
|
|
125
|
+
| 'one-quarter'
|
|
126
|
+
| 'three-quarters'
|
|
127
|
+
| 'one-fifth'
|
|
128
|
+
| 'two-fifths'
|
|
129
|
+
| 'three-fifths'
|
|
130
|
+
| 'four-fifths';
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Numeric sizes are **numbers** — `sizeDesktop={7}`, never `"7"`; only the fraction names are
|
|
134
|
+
strings. (`gap` is the exception that accepts number **or** string.)
|
|
135
|
+
|
|
136
|
+
> Columns **stack on mobile** by default and go side-by-side at the tablet breakpoint and up.
|
|
137
|
+
> Use the per-breakpoint `size*` props to control how many cells share a row at each width.
|
|
138
|
+
|
|
139
|
+
**Equal-height cards inside Columns** — columns are equal height, but a card inside one does
|
|
140
|
+
**not** stretch to fill it (and `height: 100%` on the card doesn't help — it resolves against
|
|
141
|
+
the column's auto height). Make the `Column` a flex container and let the card grow:
|
|
142
|
+
|
|
143
|
+
```tsx
|
|
144
|
+
<Columns isMultiline>
|
|
145
|
+
{items.map(item => (
|
|
146
|
+
<Column
|
|
147
|
+
key={item.id}
|
|
148
|
+
sizeTablet="half"
|
|
149
|
+
sizeDesktop="one-third"
|
|
150
|
+
display="flex"
|
|
151
|
+
flexDirection="column"
|
|
152
|
+
>
|
|
153
|
+
<Card flexGrow="1">{item.blurb}</Card>
|
|
154
|
+
</Column>
|
|
155
|
+
))}
|
|
156
|
+
</Columns>
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
`display`, `flexDirection`, and `flexGrow` are helper props every component accepts;
|
|
160
|
+
`flexGrow` takes a string (`"1"`).
|
|
161
|
+
|
|
162
|
+
## Grid / Cell
|
|
163
|
+
|
|
164
|
+
Bulma's CSS Grid (`Cell` is also reachable as `Grid.Cell`). **Preferred for uniform grids** — same-shaped items in a repeating pattern
|
|
165
|
+
(card grids, galleries, dashboards): CSS Grid gives **equal-height cells for free** (per row —
|
|
166
|
+
each row's cells match its tallest), with no flex recipe needed. Reach for `Columns`/`Column` instead when you need proportional or
|
|
167
|
+
per-breakpoint column _sizes_ (a 2/3 + 1/3 split, different counts per breakpoint).
|
|
168
|
+
|
|
169
|
+
**Grid**
|
|
170
|
+
|
|
171
|
+
| Prop | Type |
|
|
172
|
+
| ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
|
|
173
|
+
| `gap` / `columnGap` / `rowGap` | `0`–`8` (number or string, same scale as Columns' `gap`) |
|
|
174
|
+
| `minCol` | `1`–`32` (smart grid: min column width step, `is-col-min-X`) |
|
|
175
|
+
| `isFixed` | `boolean` (fixed column count instead of auto-fill) |
|
|
176
|
+
| `fixedCols` (+ `fixedColsMobile` / `fixedColsTablet` / `fixedColsDesktop` / `fixedColsWidescreen` / `fixedColsFullhd`) | `0`–`12` or `'auto'` (fixed grid only) |
|
|
177
|
+
|
|
178
|
+
**Cell**
|
|
179
|
+
|
|
180
|
+
| Prop | Type |
|
|
181
|
+
| ------------------------------------- | --------------------------------------- |
|
|
182
|
+
| `colStart` / `colFromEnd` / `colSpan` | `number` (manual column placement/span) |
|
|
183
|
+
| `rowStart` / `rowFromEnd` / `rowSpan` | `number` (manual row placement/span) |
|
|
184
|
+
|
|
185
|
+
By default the smart grid **auto-fills**: cells flow into as many columns as fit (tune the
|
|
186
|
+
minimum width with `minCol`). `isFixed` + `fixedCols*` pins an exact column count per
|
|
187
|
+
breakpoint instead.
|
|
188
|
+
|
|
189
|
+
```tsx
|
|
190
|
+
// Uniform card grid — equal heights for free, responsive column count for free.
|
|
191
|
+
<Grid
|
|
192
|
+
isFixed
|
|
193
|
+
fixedColsMobile={1}
|
|
194
|
+
fixedColsTablet={2}
|
|
195
|
+
fixedColsDesktop={3}
|
|
196
|
+
gap={4}
|
|
197
|
+
>
|
|
198
|
+
{items.map(item => (
|
|
199
|
+
<Cell key={item.id}>
|
|
200
|
+
<Card header={item.name}>{item.blurb}</Card>
|
|
201
|
+
</Cell>
|
|
202
|
+
))}
|
|
203
|
+
</Grid>
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
> To stretch each card to its cell's full (equal) height, the same `display="flex"
|
|
207
|
+
flexDirection="column"` + `flexGrow="1"` pattern applies to `Cell` + `Card`.
|
|
208
|
+
|
|
209
|
+
## Navbar
|
|
210
|
+
|
|
211
|
+
`<Navbar>` is the top bar. Subcomponents: `Navbar.Brand`, `Navbar.Item`, `Navbar.Link`,
|
|
212
|
+
`Navbar.Burger`, `Navbar.Menu`, `Navbar.Start`, `Navbar.End`, `Navbar.Dropdown`,
|
|
213
|
+
`Navbar.DropdownMenu`, `Navbar.Divider`.
|
|
214
|
+
|
|
215
|
+
| Prop | Type |
|
|
216
|
+
| --------------- | ---------------------------------------------------------------------------------------------------------------- |
|
|
217
|
+
| `fixed` | `'top' \| 'bottom'` |
|
|
218
|
+
| `transparent` | `boolean` |
|
|
219
|
+
| `color` | `'primary' \| 'link' \| 'info' \| 'success' \| 'warning' \| 'danger' \| 'black' \| 'dark' \| 'light' \| 'white'` |
|
|
220
|
+
| `Navbar.Item` | `as?`, `active?`, `href` |
|
|
221
|
+
| `Navbar.Burger` | `active?`, `onClick` |
|
|
222
|
+
| `Navbar.Menu` | `active?` (toggled open on mobile) |
|
|
223
|
+
|
|
224
|
+
The burger/menu is controlled state — toggle `Navbar.Burger active`/`onClick` and pass the same
|
|
225
|
+
flag to `Navbar.Menu active`. **A `fixed="top"` navbar requires `has-navbar-fixed-top` on `<html>`**
|
|
226
|
+
(Bulma offsets the page from it); the library adds no helper. Set it statically —
|
|
227
|
+
`<html class="has-navbar-fixed-top">` in `index.html` — reserving a `classList.add` effect for
|
|
228
|
+
a navbar that mounts conditionally.
|
|
229
|
+
|
|
230
|
+
**Routing:** in a routed app, don't use `href="#"` — render items as the router's link
|
|
231
|
+
component. `Menu.Item as={Link} to="/x"` and `Navbar.Item as={Link} to="/x"` both compile
|
|
232
|
+
without casts (their props allow extra keys). Drive `active` from `useLocation().pathname`.
|
|
233
|
+
Full patterns (including Buttons that navigate and Next.js `href`): the docs guide at
|
|
234
|
+
https://bestax.io/docs/guides/features/routing.
|
|
235
|
+
|
|
236
|
+
## Menu
|
|
237
|
+
|
|
238
|
+
`<Menu>` is a vertical sidebar menu. Subcomponents: `Menu.Label`, `Menu.List`, `Menu.Item`.
|
|
239
|
+
|
|
240
|
+
| Prop | Type |
|
|
241
|
+
| ----------- | ------------------------------------------------------------------------------------------------- |
|
|
242
|
+
| `Menu.Item` | `active?`, `href?`, `as?` (custom link component); nest a `Menu.List` inside an item for submenus |
|
|
243
|
+
|
|
244
|
+
```tsx
|
|
245
|
+
<Menu>
|
|
246
|
+
<Menu.Label>General</Menu.Label>
|
|
247
|
+
<Menu.List>
|
|
248
|
+
<Menu.Item active href="#">
|
|
249
|
+
Dashboard
|
|
250
|
+
</Menu.Item>
|
|
251
|
+
<Menu.Item href="#">Customers</Menu.Item>
|
|
252
|
+
</Menu.List>
|
|
253
|
+
</Menu>
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Card
|
|
257
|
+
|
|
258
|
+
`<Card>` for catalog/grid items. Use the props form (`header`, `image`, `footer`) or the compound
|
|
259
|
+
subcomponents (`Card.Header` + `.Title`/`.Icon`, `Card.Image`, `Card.Content`, `Card.Footer`,
|
|
260
|
+
`Card.FooterItem`).
|
|
261
|
+
|
|
262
|
+
| Prop | Type |
|
|
263
|
+
| ------------------------------- | ----------------------------- |
|
|
264
|
+
| `header` | `ReactNode` |
|
|
265
|
+
| `image` | `string` (URL) or `ReactNode` |
|
|
266
|
+
| `imageAlt` | `string` |
|
|
267
|
+
| `footer` | `ReactNode \| ReactNode[]` |
|
|
268
|
+
| `hasShadow` | `boolean` (default `true`) |
|
|
269
|
+
| `headerCentered` / `headerIcon` | `boolean` / `ReactNode` |
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bestax-migrate
|
|
3
|
+
description: Migrate an existing app from react-bulma-components (v4) to @allxsmith/bestax-bulma on Bulma v1 — run the bestax-migrate codemod, then resolve every TODO(bestax-migrate) comment it leaves using the mapping references. Use when a repo imports react-bulma-components and wants to move to bestax-bulma, when TODO(bestax-migrate) comments are present in a codebase, or when asked to migrate off an unmaintained React Bulma library.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Migrating from react-bulma-components to bestax-bulma
|
|
8
|
+
|
|
9
|
+
`react-bulma-components` is unmaintained (last release 2022, Bulma 0.9.x).
|
|
10
|
+
`@allxsmith/bestax-bulma` is an actively maintained React library for **Bulma v1**. The
|
|
11
|
+
`bestax-migrate` codemod automates most of the conversion; this skill drives the codemod and
|
|
12
|
+
finishes what it flags.
|
|
13
|
+
|
|
14
|
+
## Workflow
|
|
15
|
+
|
|
16
|
+
Run these steps in order. Don't hand-convert what the codemod converts automatically.
|
|
17
|
+
|
|
18
|
+
1. **Dry-run the codemod** on the source directory and review the report:
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
pnpm dlx bestax-migrate react-bulma-components src/ --dry
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
2. **Apply it** (same command without `--dry`), then run the project's formatter — the
|
|
25
|
+
codemod preserves surrounding formatting but doesn't prettify what it rewrites.
|
|
26
|
+
Besides the components, it also migrates **stylesheets** (CSS imports →
|
|
27
|
+
`@allxsmith/bestax-bulma/bestax.css`; SCSS `@import 'bulma/bulma'` + `$var` overrides
|
|
28
|
+
→ `@use 'bulma/sass' with (…)` plus the bestax extras) and **package.json**
|
|
29
|
+
(react-bulma-components removed, bestax-bulma added, bulma → ^1, node-sass → sass).
|
|
30
|
+
Flags: `--css bulma|keep` for other stylesheet targets, `--no-deps` to leave
|
|
31
|
+
package.json alone.
|
|
32
|
+
|
|
33
|
+
3. **Install** — the codemod edits package.json but never runs a package manager:
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
npm install # or pnpm/yarn
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The report's `peer-deps` entries predict install failures: bestax-bulma needs
|
|
40
|
+
**React 18/19** (RBC also ran on 17 — upgrade react/react-dom first) and its optional
|
|
41
|
+
Font Awesome peer wants **FA ≥ 6.7** (an app pinned to FA 5 either upgrades or
|
|
42
|
+
installs with `npm install --legacy-peer-deps`).
|
|
43
|
+
|
|
44
|
+
4. **Resolve every TODO**: `grep -rn "TODO(bestax-migrate)" src/`. Each comment names the
|
|
45
|
+
prop/component and a hint. Recipes for every recurring case are in
|
|
46
|
+
[references/unmappables.md](references/unmappables.md); the full component and prop
|
|
47
|
+
tables are in [references/component-map.md](references/component-map.md) and
|
|
48
|
+
[references/prop-map.md](references/prop-map.md). Delete each comment as you resolve it.
|
|
49
|
+
|
|
50
|
+
5. **Finish the stylesheet layer** — flagged Sass cases (computed variables,
|
|
51
|
+
indented-syntax `.sass` files), CSS flavor choice, and Bulma 0.9→1 styling changes:
|
|
52
|
+
follow [references/css-migration.md](references/css-migration.md).
|
|
53
|
+
|
|
54
|
+
6. **Finish**: typecheck/build, and review the rendered app side by side against the
|
|
55
|
+
pre-migration UI.
|
|
56
|
+
|
|
57
|
+
## What the codemod handles vs. flags
|
|
58
|
+
|
|
59
|
+
All 32 react-bulma-components v4 components have a mapping. Imports (named, namespace, and
|
|
60
|
+
`const { Input } = Form` destructuring), component renames, prop renames/value conversions,
|
|
61
|
+
responsive breakpoint objects, CSS/SCSS stylesheet imports, and package.json dependencies
|
|
62
|
+
convert automatically. It flags with
|
|
63
|
+
`TODO(bestax-migrate)` instead of guessing: `Element` and `Tile` (no bestax equivalent —
|
|
64
|
+
Tile is replaced by Bulma v1's Grid), controlled `Dropdown`/`Dropdown.Item value`,
|
|
65
|
+
`touch`/`until*` breakpoints, dynamic prop values it can't rewrite, and props with no
|
|
66
|
+
bestax counterpart. Files in formats it can't parse (`.astro`, `.vue`, `.svelte`, `.mdx`)
|
|
67
|
+
that import react-bulma-components are reported as `unsupported-file` — migrate those by
|
|
68
|
+
hand with the component map. Never "fix" a TODO by silencing it — convert the code per the
|
|
69
|
+
references, or deliberately keep the old markup with `className` styling.
|
|
70
|
+
|
|
71
|
+
## Rules
|
|
72
|
+
|
|
73
|
+
- The codemod is idempotent on already-migrated files (it only touches files importing
|
|
74
|
+
`react-bulma-components`) — safe to re-run after partial manual work.
|
|
75
|
+
- Don't downgrade converted props back to RBC names; bestax uses `is*` booleans
|
|
76
|
+
(`isLoading`), string size unions (`textSize="4"`), and `as` instead of `renderAs`.
|
|
77
|
+
- If a component the app uses isn't in the component map, it wasn't part of RBC v4 —
|
|
78
|
+
check for a local wrapper component and migrate its internals instead.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Component map: react-bulma-components v4 → @allxsmith/bestax-bulma
|
|
2
|
+
|
|
3
|
+
Every RBC v4 export and compound sub-component, with its bestax target. **Auto** = the
|
|
4
|
+
codemod converts it; **Flagged** = it leaves a `TODO(bestax-migrate)` comment (see
|
|
5
|
+
[unmappables.md](unmappables.md) for the recipes).
|
|
6
|
+
|
|
7
|
+
## Top-level components
|
|
8
|
+
|
|
9
|
+
| RBC | bestax | Notes |
|
|
10
|
+
| -------------- | -------------------------------------------- | ------------------------------------------------------------------------------------- |
|
|
11
|
+
| `Block` | `Block` | Auto |
|
|
12
|
+
| `Box` | `Box` | Auto |
|
|
13
|
+
| `Breadcrumb` | `Breadcrumb` | Auto; `align` → `alignment` (`center`→`centered`) |
|
|
14
|
+
| `Button` | `Button` | Auto; `<Button remove/>` → `<Delete/>`; see prop map |
|
|
15
|
+
| `Card` | `Card` | Auto |
|
|
16
|
+
| `Columns` | `Columns` | Auto; `breakpoint="mobile"`→`isMobile`, `multiline`→`isMultiline`, … |
|
|
17
|
+
| `Container` | `Container` | Auto; `breakpoint="fluid"`→`fluid`, `max`→`isMax` |
|
|
18
|
+
| `Content` | `Content` | Auto |
|
|
19
|
+
| `Dropdown` | `Dropdown` | Structure auto; controlled `value`/`onChange` flagged |
|
|
20
|
+
| `Element` | — | Flagged: no generic element; use a semantic component + helper props |
|
|
21
|
+
| `Footer` | `Footer` | Auto |
|
|
22
|
+
| `Form.*` | flat imports | See Form table below |
|
|
23
|
+
| `Heading` | `Title` / `SubTitle` / `<p class="heading">` | Auto; `subtitle` picks `SubTitle`, `heading` picks the plain element |
|
|
24
|
+
| `Hero` | `Hero` | Auto; `hasNavbar`→`fullheightWithNavbar`; `halfheight`/`gradient` flagged |
|
|
25
|
+
| `Icon` | `Icon` | `<i class="fas fa-x">` children → `name`/`library`/`variant` props; else flagged |
|
|
26
|
+
| `Image` | `Image` | Auto; numeric `size={128}` → `size="128x128"`, `rounded`→`isRounded` |
|
|
27
|
+
| `Level` | `Level` | Auto; `breakpoint="mobile"`→`isMobile` |
|
|
28
|
+
| `Loader` | plain `<div className="loader">` | Auto (Bulma v1 still ships the class) |
|
|
29
|
+
| `Media` | `Media` | Auto |
|
|
30
|
+
| `Menu` | `Menu` | Auto |
|
|
31
|
+
| `Message` | `Message` | Auto; `size` flagged |
|
|
32
|
+
| `Modal` | `Modal` | `show`→`active`; `closeOnEsc`/`closeOnBlur`/`showClose` flagged (defaults cover them) |
|
|
33
|
+
| `Navbar` | `Navbar` | Auto; see dropdown note below |
|
|
34
|
+
| `Notification` | `Notification` | Auto; `light`→`isLight` |
|
|
35
|
+
| `Pagination` | `Pagination` | `onChange`→`onPageChange`; `delta`/labels/`showFirstLast`/`autoHide` flagged |
|
|
36
|
+
| `Panel` | `Panel` | Auto |
|
|
37
|
+
| `Progress` | `Progress` | Auto |
|
|
38
|
+
| `Section` | `Section` | Auto |
|
|
39
|
+
| `Table` | `Table` | Auto; `size="fullwidth"`→`isFullwidth`, `striped`→`isStriped`, … |
|
|
40
|
+
| `Tabs` | `Tabs` | Auto; children wrapped in `Tabs.List`; `type="toggle-rounded"`→`toggle rounded` |
|
|
41
|
+
| `Tag` | `Tag` | Auto; `remove`→`isDelete`, `rounded`→`isRounded` |
|
|
42
|
+
| `Tile` | — | Flagged: Bulma v1 replaced tiles with `Grid`/`Cell` |
|
|
43
|
+
|
|
44
|
+
## Compound sub-components
|
|
45
|
+
|
|
46
|
+
| RBC | bestax |
|
|
47
|
+
| ----------------------------------------------------------- | ------------------------------------------------------------------------ |
|
|
48
|
+
| `Breadcrumb.Item` | plain `<li><a href=…>` (`active` → `is-active`) |
|
|
49
|
+
| `Button.Group` | `Buttons` (`align="right"`→`isRight`) |
|
|
50
|
+
| `Card.Header` / `.Title` / `.Icon` | `Card.Header` / `.Header.Title` / `.Header.Icon` |
|
|
51
|
+
| `Card.Image` | `Card.Image` wrapping an inner `<Image>` |
|
|
52
|
+
| `Card.Content` | `Card.Content` |
|
|
53
|
+
| `Card.Footer` / `Card.Footer.Item` | `Card.Footer` / `Card.FooterItem` |
|
|
54
|
+
| `Columns.Column` | `Column` (flat import) |
|
|
55
|
+
| `Dropdown.Item` / `.Divider` | `Dropdown.Item` / `Dropdown.Divider` |
|
|
56
|
+
| `Hero.Header` / `.Body` / `.Footer` | `Hero.Head` / `Hero.Body` / `Hero.Foot` |
|
|
57
|
+
| `Icon.Text` | `IconText` |
|
|
58
|
+
| `Level.Side align` / `Level.Item` | `Level.Left` or `Level.Right` / `Level.Item` |
|
|
59
|
+
| `Media.Item align` | `MediaLeft` / `MediaContent` / `MediaRight` (flat) |
|
|
60
|
+
| `Menu.List` (+ `title`) | `Menu.List` (+ a `Menu.Label` sibling) |
|
|
61
|
+
| `Menu.List.Item` | `Menu.Item` |
|
|
62
|
+
| `Message.Header` / `.Body` | `Message.Header` / `Message.Body` |
|
|
63
|
+
| `Modal.Content` | `Modal.Content` |
|
|
64
|
+
| `Modal.Card` `.Header`/`.Body`/`.Footer`/`.Title` | `Modal.Card` `.Head`/`.Body`/`.Foot`/`.Title` |
|
|
65
|
+
| `Navbar.Brand`/`.Burger`/`.Menu`/`.Item`/`.Link`/`.Divider` | same names |
|
|
66
|
+
| `Navbar.Container align` | `Navbar.Start` / `Navbar.End` |
|
|
67
|
+
| `Navbar.Item` wrapping a dropdown | `Navbar.Dropdown` (container) |
|
|
68
|
+
| `Navbar.Dropdown` (the menu) | `Navbar.DropdownMenu` |
|
|
69
|
+
| `Panel.Header` | `Panel.Heading` |
|
|
70
|
+
| `Panel.Tabs` / `Panel.Tabs.Tab` | `Panel.Tabs` / plain `<a>` children |
|
|
71
|
+
| `Panel.Block` / `Panel.Icon` | `Panel.Block` / `Panel.Icon` (icon child → `name`) |
|
|
72
|
+
| `Table.Container` | `isResponsive` on the child `Table` (or `<div class="table-container">`) |
|
|
73
|
+
| `Tabs.Tab` | `Tabs.Item` (inside a generated `Tabs.List`) |
|
|
74
|
+
| `Tag.Group` | `Tags` (`gapless` → `hasAddons`) |
|
|
75
|
+
|
|
76
|
+
## Form namespace → flat imports
|
|
77
|
+
|
|
78
|
+
| RBC | bestax |
|
|
79
|
+
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------- |
|
|
80
|
+
| `Form.Field` | `Field` (`kind="group"`→`grouped`, `kind="addons"`→`hasAddons`, `align` folds into the value, `multiline`→`grouped="multiline"`) |
|
|
81
|
+
| `Form.Field.Label` | `FieldLabel` |
|
|
82
|
+
| `Form.Field.Body` | `FieldBody` |
|
|
83
|
+
| `Form.Control` | `Control` (`fullwidth`→`isExpanded`, `loading`→`isLoading`) |
|
|
84
|
+
| `Form.Input` | `Input` (`rounded`→`isRounded`, `status="focus"`→`isFocused`) |
|
|
85
|
+
| `Form.Label` | plain `<label className="label">` |
|
|
86
|
+
| `Form.Textarea` | `TextArea` (`fixedSize`→`hasFixedSize`) |
|
|
87
|
+
| `Form.Select` | `Select` (`loading`→`isLoading`, `fullwidth`→`isFullwidth`) |
|
|
88
|
+
| `Form.Checkbox` | `Checkbox` |
|
|
89
|
+
| `Form.Radio` | `Radio` |
|
|
90
|
+
| `Form.Help` | plain `<p className="help is-…">` (prefer Field `message`/`messageColor`) |
|
|
91
|
+
| `Form.InputFile` | `File` (`filename`→`fileName`+`hasName`, `boxed`→`isBoxed`, `label`→`buttonLabel`) |
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Stylesheets: Bulma 0.9 → Bulma v1 + bestax
|
|
2
|
+
|
|
3
|
+
react-bulma-components apps style with Bulma 0.9.x; bestax-bulma targets Bulma v1. The
|
|
4
|
+
codemod automates most of this layer — this reference explains what it did and how to
|
|
5
|
+
finish what it flagged.
|
|
6
|
+
|
|
7
|
+
## What the codemod already did (default `--css bestax`)
|
|
8
|
+
|
|
9
|
+
- **CSS imports**: `bulma/css/bulma(.min).css` and v3-era
|
|
10
|
+
`react-bulma-components/dist/*.css` imports became the recommended combined bundle
|
|
11
|
+
`@allxsmith/bestax-bulma/bestax.css` (Bulma v1 + the bestax extras that themed
|
|
12
|
+
Radio/Checkbox and the advanced form controls need). A separate `extras.css` import
|
|
13
|
+
next to it is collapsed.
|
|
14
|
+
**Visual note**: `bestax.css` ships with `$primary` set to bestax blue (`#1e6b99`),
|
|
15
|
+
not Bulma's stock turquoise — `is-primary` surfaces (hero, navbar, buttons) change
|
|
16
|
+
color. Keep the stock Bulma look with `--css bulma`, or set your own brand color via
|
|
17
|
+
`--bulma-primary-*` CSS variables / a Sass build.
|
|
18
|
+
|
|
19
|
+
- **SCSS files**: Bulma 0.9's `@import 'bulma/bulma.sass'` (plus preceding
|
|
20
|
+
`$var: value !default;` overrides) became Bulma v1 module syntax, with simple literal
|
|
21
|
+
overrides folded in:
|
|
22
|
+
|
|
23
|
+
```scss
|
|
24
|
+
@use 'bulma/sass' with (
|
|
25
|
+
$primary: #ff6b35,
|
|
26
|
+
$family-primary: 'Nunito',
|
|
27
|
+
sans-serif
|
|
28
|
+
);
|
|
29
|
+
@use '@allxsmith/bestax-bulma/scss/extras';
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
0.9 `_all` aggregator imports (`bulma/sass/elements/_all`) became directory modules
|
|
33
|
+
(`@use 'bulma/sass/elements';`). Relative node_modules paths
|
|
34
|
+
(`@import '../../node_modules/bulma/bulma'`, common under Parcel) keep their prefix,
|
|
35
|
+
and the extras `@use` then points at the shipped file
|
|
36
|
+
(`…/node_modules/@allxsmith/bestax-bulma/src/scss/extras`) since such toolchains
|
|
37
|
+
resolve raw paths, not package specifiers. Building Bulma v1 from Sass needs
|
|
38
|
+
**dart-sass ≥ 1.79** — the codemod's node-sass replacement installs that, but check
|
|
39
|
+
bundler-pinned older versions (Parcel's sass transformer pins 1.66).
|
|
40
|
+
|
|
41
|
+
- **package.json**: `react-bulma-components` removed, `@allxsmith/bestax-bulma` added,
|
|
42
|
+
`bulma` bumped to `^1.0.4` (or added when sources still import `bulma/…` directly),
|
|
43
|
+
and dead `node-sass` replaced with dart `sass`. Run the package manager's install
|
|
44
|
+
afterwards — the codemod never installs anything.
|
|
45
|
+
|
|
46
|
+
Flag reference: `--css bulma` keeps plain `bulma/css/bulma.min.css` and adds a separate
|
|
47
|
+
`@allxsmith/bestax-bulma/extras.css` import; `--css keep` leaves stylesheets alone;
|
|
48
|
+
`--no-deps` skips the package.json step.
|
|
49
|
+
|
|
50
|
+
## Finishing the flagged cases
|
|
51
|
+
|
|
52
|
+
- **Computed Sass variables** (`$primary: lighten(#333, 10%);` and anything with
|
|
53
|
+
functions/interpolation): move them into the `with (…)` configuration by hand —
|
|
54
|
+
`with (…)` values must be compile-time literals, so resolve the expression or compute
|
|
55
|
+
it after the `@use`.
|
|
56
|
+
- **Indented-syntax `.sass` files**: flagged, not rewritten. Convert `@import` lines to
|
|
57
|
+
`@use "bulma/sass" with (…)` manually (same rules as SCSS, minus semicolons/braces).
|
|
58
|
+
- **Unknown 0.9 partial paths**: the v1 sass tree is `bulma/sass/{utilities,base,
|
|
59
|
+
elements,form,components,grid,layout,helpers,themes}` with leaf partials like
|
|
60
|
+
`bulma/sass/utilities/initial-variables` — find the equivalent module and `@use` it.
|
|
61
|
+
- **Third-party Bulma extensions** (`bulma-checkradio`, `bulma-switch`, `bulma-tooltip`,
|
|
62
|
+
…): flagged, left in place. These are 0.9-era add-ons — check each one's Bulma v1
|
|
63
|
+
compatibility. Class-based usage (`className="is-checkradio"`) keeps needing the
|
|
64
|
+
extension; usage that migrated to bestax components (Radio, Checkbox, the advanced
|
|
65
|
+
form controls) is already styled by the bestax extras, so the import can go.
|
|
66
|
+
|
|
67
|
+
## Choosing a CSS flavor (optional)
|
|
68
|
+
|
|
69
|
+
`bestax.css` is right for almost every app. Alternatives (swap the import specifier):
|
|
70
|
+
|
|
71
|
+
| Import | Use when |
|
|
72
|
+
| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
|
|
73
|
+
| `@allxsmith/bestax-bulma/versions/bestax-prefixed.css` | class conflicts with another framework — pair with `<ConfigProvider classPrefix="bestax-">` |
|
|
74
|
+
| `@allxsmith/bestax-bulma/versions/bestax-no-helpers.css` | smallest CSS; **helper props like `mt="4"` stop working** |
|
|
75
|
+
| `@allxsmith/bestax-bulma/versions/bestax-no-helpers-prefixed.css` | both of the above |
|
|
76
|
+
| `@allxsmith/bestax-bulma/versions/bestax-no-dark-mode.css` | light-mode-only product |
|
|
77
|
+
|
|
78
|
+
## Custom SCSS builds with bestax
|
|
79
|
+
|
|
80
|
+
Do **not** `@use '@allxsmith/bestax-bulma/scss/bestax'` when you need your own
|
|
81
|
+
`$variable` overrides — that entry pre-configures `bulma/sass` and Sass forbids
|
|
82
|
+
configuring a module twice. The correct pairing (what the codemod emits) is:
|
|
83
|
+
|
|
84
|
+
```scss
|
|
85
|
+
@use 'bulma/sass' with (
|
|
86
|
+
$primary: …
|
|
87
|
+
);
|
|
88
|
+
@use '@allxsmith/bestax-bulma/scss/extras';
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Per-component partials also exist (`@use '@allxsmith/bestax-bulma/scss/components/dialog';`,
|
|
92
|
+
`…/scss/form/autocomplete`, …) for modular builds.
|
|
93
|
+
|
|
94
|
+
## Runtime theming
|
|
95
|
+
|
|
96
|
+
Bulma v1 themes with `--bulma-*` CSS variables at runtime (dark mode is automatic).
|
|
97
|
+
Sass `with (…)` is for compile-time tokens; for brand/dark-mode work use the bestax
|
|
98
|
+
`Theme` component — see the `bestax-theming` skill and
|
|
99
|
+
https://bestax.io/docs/guides/getting-started/migration/bulma-0-9-to-1 for the broader
|
|
100
|
+
0.9 → 1 changes (Tiles → Grid, `is-bold` gradients removed, automatic dark mode).
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Universal prop map (RBC modifier props → bestax helper props)
|
|
2
|
+
|
|
3
|
+
react-bulma-components spreads a modifier-prop set onto every component. bestax-bulma has
|
|
4
|
+
the same idea via `useBulmaClasses`, with these differences. The codemod applies all of
|
|
5
|
+
this automatically for literal values; dynamic values get TODOs.
|
|
6
|
+
|
|
7
|
+
## Renames and value changes
|
|
8
|
+
|
|
9
|
+
| RBC | bestax |
|
|
10
|
+
| --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
11
|
+
| `renderAs` | `as` — **only** on polymorphic components (Button, Title/SubTitle, Footer, Level.Item, Media\*, Menu.Item, Navbar.Item/Link, Dropdown.Item); elsewhere flagged |
|
|
12
|
+
| `domRef` | flagged — use a `ref` on a DOM child instead |
|
|
13
|
+
| `backgroundColor` | `bgColor` |
|
|
14
|
+
| `textColor` | `textColor` (same) |
|
|
15
|
+
| `colorVariant` | flagged — use `isLight` or a color shade |
|
|
16
|
+
| `textSize={4}` | `textSize="4"` (string union `'1'`–`'7'`) |
|
|
17
|
+
| `textAlign="center"` | `textAlign="centered"` (`justify`→`justified`) |
|
|
18
|
+
| `textFamily` | `fontFamily` |
|
|
19
|
+
| `italic` | `textTransform="italic"` |
|
|
20
|
+
| `m/mt/…/py={3}` | `m="3"` (string union `'0'`–`'6'`) |
|
|
21
|
+
| `pull="right"` | `float="right"` |
|
|
22
|
+
| `marginless` / `paddingless` | `m="0"` / `p="0"` |
|
|
23
|
+
| `clipped` | `overflow="clipped"` |
|
|
24
|
+
| `radiusless` / `shadowless` | `radius="radiusless"` / `shadow="shadowless"` |
|
|
25
|
+
| `unselectable` | `interaction="unselectable"` |
|
|
26
|
+
| `hidden` / `invisible` / `srOnly` | `visibility="hidden"` / `"invisible"` / `"sr-only"` |
|
|
27
|
+
| `display="hidden"` | `visibility="hidden"` |
|
|
28
|
+
| `display="relative"` | boolean `relative` |
|
|
29
|
+
| flexbox props | same names/values (`flexDirection`, `justifyContent`, …) |
|
|
30
|
+
| `clearfix`, `overlay` | same |
|
|
31
|
+
|
|
32
|
+
## Boolean modifier convention
|
|
33
|
+
|
|
34
|
+
RBC uses bare booleans (`loading`, `outlined`, `rounded`, `fullwidth`); bestax prefixes
|
|
35
|
+
with `is`/`has` (`isLoading`, `isOutlined`, `isRounded`, `isFullWidth`). Per-component
|
|
36
|
+
tables live in [component-map.md](component-map.md).
|
|
37
|
+
|
|
38
|
+
## Responsive breakpoint objects → flat per-viewport props
|
|
39
|
+
|
|
40
|
+
| RBC | bestax |
|
|
41
|
+
| ----------------------------------------------------------------------------- | ----------------------------------------------------------- |
|
|
42
|
+
| `mobile={{ display: 'flex' }}` | `displayMobile="flex"` |
|
|
43
|
+
| `tablet={{ textSize: 5 }}` | `textSizeTablet="5"` |
|
|
44
|
+
| `desktop={{ textAlign: 'center' }}` | `textAlignDesktop="centered"` |
|
|
45
|
+
| `widescreen={{ invisible: true }}` | `visibilityWidescreen="invisible"` |
|
|
46
|
+
| `Columns.Column mobile={{ size: 4, offset: 2, narrow: true }}` | `sizeMobile={4} offsetMobile={2} isNarrowMobile` |
|
|
47
|
+
| `Columns tablet={{ gap: 3 }}` | `gapTablet={3}` |
|
|
48
|
+
| `touch={{…}}`, `untilWidescreen={{…}}`, `untilFullhd={{…}}`, `{ only: true }` | flagged — no bestax helper variants; use `className` or CSS |
|