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.
Files changed (144) hide show
  1. package/README.md +90 -0
  2. package/data/catalog.json +1869 -0
  3. package/data/components/Autocomplete.json +604 -0
  4. package/data/components/Avatar.json +220 -0
  5. package/data/components/Avatars.json +294 -0
  6. package/data/components/Badge.json +261 -0
  7. package/data/components/Block.json +105 -0
  8. package/data/components/Box.json +157 -0
  9. package/data/components/Breadcrumb.json +155 -0
  10. package/data/components/Button.json +599 -0
  11. package/data/components/Buttons.json +533 -0
  12. package/data/components/Card.json +506 -0
  13. package/data/components/Carousel.json +512 -0
  14. package/data/components/Cell.json +154 -0
  15. package/data/components/Checkbox.json +176 -0
  16. package/data/components/Checkboxes.json +240 -0
  17. package/data/components/Code.json +128 -0
  18. package/data/components/Collapse.json +218 -0
  19. package/data/components/Column.json +284 -0
  20. package/data/components/Columns.json +542 -0
  21. package/data/components/ConfigProvider.json +16 -0
  22. package/data/components/Container.json +149 -0
  23. package/data/components/Content.json +228 -0
  24. package/data/components/Control.json +484 -0
  25. package/data/components/DateInput.json +872 -0
  26. package/data/components/DateTimeInput.json +952 -0
  27. package/data/components/Delete.json +153 -0
  28. package/data/components/Dialog.json +285 -0
  29. package/data/components/Divider.json +68 -0
  30. package/data/components/Dropdown.json +353 -0
  31. package/data/components/Emphasis.json +99 -0
  32. package/data/components/Field.json +539 -0
  33. package/data/components/Figure.json +143 -0
  34. package/data/components/File.json +403 -0
  35. package/data/components/Footer.json +109 -0
  36. package/data/components/Grid.json +357 -0
  37. package/data/components/Hero.json +340 -0
  38. package/data/components/Icon.json +232 -0
  39. package/data/components/IconText.json +307 -0
  40. package/data/components/Image.json +166 -0
  41. package/data/components/Input.json +583 -0
  42. package/data/components/Level.json +332 -0
  43. package/data/components/Link.json +154 -0
  44. package/data/components/LinkButton.json +247 -0
  45. package/data/components/ListItem.json +101 -0
  46. package/data/components/Loading.json +323 -0
  47. package/data/components/Media.json +345 -0
  48. package/data/components/Menu.json +317 -0
  49. package/data/components/Message.json +303 -0
  50. package/data/components/Modal.json +444 -0
  51. package/data/components/Navbar.json +996 -0
  52. package/data/components/Notification.json +165 -0
  53. package/data/components/Numberinput.json +364 -0
  54. package/data/components/OrderedList.json +189 -0
  55. package/data/components/Pagination.json +619 -0
  56. package/data/components/Panel.json +582 -0
  57. package/data/components/Paragraph.json +107 -0
  58. package/data/components/Pre.json +114 -0
  59. package/data/components/Progress.json +137 -0
  60. package/data/components/Radio.json +164 -0
  61. package/data/components/Radios.json +240 -0
  62. package/data/components/Rate.json +466 -0
  63. package/data/components/Reveal.json +177 -0
  64. package/data/components/Section.json +123 -0
  65. package/data/components/Select.json +526 -0
  66. package/data/components/Sidebar.json +488 -0
  67. package/data/components/Skeleton.json +162 -0
  68. package/data/components/Slider.json +534 -0
  69. package/data/components/Span.json +100 -0
  70. package/data/components/Steps.json +452 -0
  71. package/data/components/Strong.json +105 -0
  72. package/data/components/SubTitle.json +233 -0
  73. package/data/components/Switch.json +291 -0
  74. package/data/components/Table.json +490 -0
  75. package/data/components/Tabs.json +592 -0
  76. package/data/components/Tag.json +197 -0
  77. package/data/components/Taginput.json +587 -0
  78. package/data/components/Tags.json +181 -0
  79. package/data/components/TextArea.json +483 -0
  80. package/data/components/Theme.json +65 -0
  81. package/data/components/TimeInput.json +906 -0
  82. package/data/components/Title.json +240 -0
  83. package/data/components/Toast.json +308 -0
  84. package/data/components/Tooltip.json +212 -0
  85. package/data/components/UnorderedList.json +149 -0
  86. package/data/components/Valid value constants.json +16 -0
  87. package/data/components/classNames.json +65 -0
  88. package/data/components/useBulmaClasses.json +169 -0
  89. package/data/components/usePrefixedClassNames.json +25 -0
  90. package/data/skills/bestax-custom-component/SKILL.md +196 -0
  91. package/data/skills/bestax-custom-component/examples/stat-card.tsx +105 -0
  92. package/data/skills/bestax-custom-component/references/api.md +90 -0
  93. package/data/skills/bestax-custom-component/references/component-catalog.md +149 -0
  94. package/data/skills/bestax-custom-component/references/library-contributor.md +395 -0
  95. package/data/skills/bestax-custom-component/references/patterns.md +136 -0
  96. package/data/skills/bestax-form/SKILL.md +254 -0
  97. package/data/skills/bestax-form/references/api.md +103 -0
  98. package/data/skills/bestax-form/references/patterns.md +210 -0
  99. package/data/skills/bestax-icons/SKILL.md +80 -0
  100. package/data/skills/bestax-icons/examples/icon-usage.tsx +80 -0
  101. package/data/skills/bestax-icons/references/icon-libraries.md +131 -0
  102. package/data/skills/bestax-layout-scaffold/SKILL.md +196 -0
  103. package/data/skills/bestax-layout-scaffold/examples/app-shell.tsx +86 -0
  104. package/data/skills/bestax-layout-scaffold/examples/card-grid.tsx +106 -0
  105. package/data/skills/bestax-layout-scaffold/examples/centered.tsx +56 -0
  106. package/data/skills/bestax-layout-scaffold/examples/content-page.tsx +90 -0
  107. package/data/skills/bestax-layout-scaffold/examples/landing.tsx +122 -0
  108. package/data/skills/bestax-layout-scaffold/references/archetypes.md +246 -0
  109. package/data/skills/bestax-layout-scaffold/references/layout-components.md +269 -0
  110. package/data/skills/bestax-migrate/SKILL.md +78 -0
  111. package/data/skills/bestax-migrate/references/component-map.md +91 -0
  112. package/data/skills/bestax-migrate/references/css-migration.md +100 -0
  113. package/data/skills/bestax-migrate/references/prop-map.md +48 -0
  114. package/data/skills/bestax-migrate/references/unmappables.md +124 -0
  115. package/data/skills/bestax-optimize/SKILL.md +131 -0
  116. package/data/skills/bestax-optimize/references/modular-build.md +173 -0
  117. package/data/skills/bestax-theming/SKILL.md +117 -0
  118. package/data/skills/bestax-theming/examples/dark-mode.tsx +38 -0
  119. package/data/skills/bestax-theming/examples/theme-config.tsx +60 -0
  120. package/data/skills/bestax-theming/references/css-variables.md +466 -0
  121. package/data/skills/bestax-theming/references/themeable-components.md +119 -0
  122. package/data/skills.json +148 -0
  123. package/dist/data.d.ts +131 -0
  124. package/dist/data.d.ts.map +1 -0
  125. package/dist/data.js +111 -0
  126. package/dist/format.d.ts +37 -0
  127. package/dist/format.d.ts.map +1 -0
  128. package/dist/format.js +178 -0
  129. package/dist/helper-props.d.ts +57 -0
  130. package/dist/helper-props.d.ts.map +1 -0
  131. package/dist/helper-props.js +249 -0
  132. package/dist/index.d.ts +3 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +18 -0
  135. package/dist/search.d.ts +32 -0
  136. package/dist/search.d.ts.map +1 -0
  137. package/dist/search.js +194 -0
  138. package/dist/server.d.ts +28 -0
  139. package/dist/server.d.ts.map +1 -0
  140. package/dist/server.js +616 -0
  141. package/dist/version.d.ts +29 -0
  142. package/dist/version.d.ts.map +1 -0
  143. package/dist/version.js +147 -0
  144. package/package.json +70 -0
@@ -0,0 +1,466 @@
1
+ # Bulma CSS variables & override mechanisms
2
+
3
+ `@allxsmith/bestax-bulma` wraps **Bulma 1.x**, which is themed entirely through `--bulma-*` CSS
4
+ custom properties. Every color, font, size, and radius resolves from one of these variables, so
5
+ theming means overriding the right `--bulma-*` values.
6
+
7
+ ## How to override (three paths)
8
+
9
+ ### 1. The `Theme` component (runtime, recommended)
10
+
11
+ `Theme` is exported from the package and writes `--bulma-*` variables for you.
12
+
13
+ - `isRoot` → injects the variables globally at `:root` (use once, at the app root).
14
+ - without `isRoot` → wraps children in a `<div>` and scopes the variables to that subtree.
15
+ - Named props set the color/scheme HSL channels and common values (see "Theme props" below).
16
+ - `bulmaVars` sets any other variable, keyed by its real `--bulma-*` name:
17
+
18
+ ```tsx
19
+ <Theme
20
+ isRoot
21
+ primaryH="265"
22
+ primaryS="65%"
23
+ primaryL="55%"
24
+ bulmaVars={{
25
+ '--bulma-radius': '0.75rem',
26
+ '--bulma-family-primary': "'Inter', sans-serif",
27
+ }}
28
+ >
29
+ <App />
30
+ </Theme>
31
+ ```
32
+
33
+ > Note: the type of the `bulmaVars` keys is not exported — pass it as an object literal (TypeScript
34
+ > still checks the keys against the allowed `--bulma-*` names).
35
+
36
+ > `--bulma-family-*` only selects the family — also load the font itself (a `<link>` in
37
+ > `index.html` or an `@fontsource/*` package import), or the browser silently falls back to
38
+ > the system font.
39
+
40
+ ### 2. Plain CSS
41
+
42
+ Set the variables yourself on any selector. `:root` themes the whole document; a class scopes it.
43
+
44
+ ```css
45
+ :root {
46
+ --bulma-primary-h: 265;
47
+ --bulma-primary-s: 65%;
48
+ --bulma-primary-l: 55%;
49
+ --bulma-radius: 0.75rem;
50
+ }
51
+ ```
52
+
53
+ ### 3. Build-time Sass
54
+
55
+ If compiling Bulma's Sass yourself, set the SCSS variables before the CSS variables are generated:
56
+
57
+ ```scss
58
+ @use 'bulma/sass' with (
59
+ $primary: #1e6b99,
60
+ $link: #485fc7
61
+ );
62
+ ```
63
+
64
+ (The library itself ships `$primary: #1e6b99` — HSL `202 / 67% / 36%` — this way.)
65
+
66
+ ## Colors — override the H/S/L trio to recolor
67
+
68
+ Bulma derives a color's entire palette (shades, light/dark/invert variants) from three channels.
69
+ Override the trio; the rest follows automatically. For each color `<c>` ∈ `primary`, `link`,
70
+ `info`, `success`, `warning`, `danger`:
71
+
72
+ | Variable | Meaning | `Theme` prop |
73
+ | --------------- | -------------------------- | ------------------------ |
74
+ | `--bulma-<c>-h` | hue (unitless, e.g. `265`) | `<c>H` (e.g. `primaryH`) |
75
+ | `--bulma-<c>-s` | saturation (`%`) | `<c>S` |
76
+ | `--bulma-<c>-l` | lightness (`%`) | `<c>L` |
77
+
78
+ Read-only derived values (set automatically; reference if you need them): `--bulma-<c>` (the
79
+ resolved color), `--bulma-<c>-invert`, `--bulma-<c>-light`, `--bulma-<c>-dark`, `--bulma-<c>-rgb`,
80
+ and numeric shades `--bulma-<c>-00` … `--bulma-<c>-95`.
81
+
82
+ ## Scheme, text, background, border (light/dark surfaces)
83
+
84
+ | Variable | Role |
85
+ | --------------------------------------------------------------------------- | ----------------------------------------------------- |
86
+ | `--bulma-scheme-h`, `--bulma-scheme-s` | scheme hue/saturation (`Theme`: `schemeH`, `schemeS`) |
87
+ | `--bulma-scheme-main`, `--bulma-scheme-main-bis`, `--bulma-scheme-main-ter` | page/surface backgrounds (main + subtle steps) |
88
+ | `--bulma-background` | secondary background |
89
+ | `--bulma-text`, `--bulma-text-strong`, `--bulma-text-weak` | body / emphasized / muted text |
90
+ | `--bulma-border`, `--bulma-border-weak` | borders |
91
+
92
+ ## Radius, typography
93
+
94
+ | Variable | Default | `Theme` prop |
95
+ | ----------------------------------------------------------------------------- | --------------------------------- | --------------- |
96
+ | `--bulma-radius-small` / `--bulma-radius` / `--bulma-radius-large` | 0.25 / 0.375 / 0.75rem | via `bulmaVars` |
97
+ | `--bulma-radius-rounded` | 9999px | via `bulmaVars` |
98
+ | `--bulma-family-primary` / `--bulma-family-secondary` / `--bulma-family-code` | sans / sans / mono | via `bulmaVars` |
99
+ | `--bulma-size-1` … `--bulma-size-7` | 3rem … 0.75rem | via `bulmaVars` |
100
+ | `--bulma-size-small` / `-normal` / `-medium` / `-large` | 0.75 / 1 / 1.25 / 1.5rem | via `bulmaVars` |
101
+ | `--bulma-weight-light/normal/medium/semibold/bold/extrabold` | 300 / 400 / 500 / 600 / 700 / 800 | via `bulmaVars` |
102
+
103
+ ## Shadow — the one token `bulmaVars` cannot set
104
+
105
+ `--bulma-shadow` is a real Bulma variable (`.box` and `.card` both derive
106
+ `--bulma-box-shadow`/`--bulma-card-shadow` from it), but it is **not a key of `bulmaVars`** —
107
+ that record is a closed union built from an explicit list, and shadow was left out. Writing
108
+ `<Theme bulmaVars={{ '--bulma-shadow': … }}>` is a compile error, and it is the single most
109
+ repeated invention in this library's cold-start evals: every run on every guidance channel
110
+ tried it.
111
+
112
+ Set it in CSS instead, then apply the class to the one element that needs it:
113
+
114
+ ```css
115
+ .featured-ring {
116
+ --bulma-shadow: 0 0 0 2px var(--bulma-primary);
117
+ }
118
+ ```
119
+
120
+ Do **not** reach for `--bulma-box-shadow`/`--bulma-card-shadow` from an ancestor instead —
121
+ those are re-declared on `.box`/`.card` themselves, so an inherited value always loses (the
122
+ same rule as the extras section below).
123
+
124
+ ## Extras component variables
125
+
126
+ Every "Beyond Bulma" extra registers its own `--bulma-<component>-*` variables. They are
127
+ registered on the component's **own selector** (`.avatar`, `.dialog`, `.tooltip`, … —
128
+ `.bestax-avatar` etc. with the prefixed CSS flavor), not on `:root`. A value set on a wrapping
129
+ ancestor — including `Theme`'s `bulmaVars` on a wrapping `Theme` — is only _inherited_ and
130
+ always loses to the component-level declaration, so it will NOT take effect. Working overrides
131
+ target the component's own element instead: redeclare on the component's own class in your CSS
132
+ (mind the class prefix), e.g. `.avatar { --bulma-avatar-size: 3.5rem; }`, or pass a
133
+ `className` and scope the override under it
134
+ (`.avatar.big-avatar { --bulma-avatar-size: 3.5rem; }`), or set it via the component's `style`
135
+ prop. Several default to core theme vars above, so they already flow through a custom theme.
136
+
137
+ ### Avatar / Avatars / Badge
138
+
139
+ | Variable | Default |
140
+ | ----------------------------------------------------------------- | -------------------------------- |
141
+ | `--bulma-avatar-size` | `48px` |
142
+ | `--bulma-avatar-background` / `--bulma-avatar-color` | `background` / `text` |
143
+ | `--bulma-avatar-weight` | `weight-semibold` |
144
+ | `--bulma-avatar-rounded-radius` | `radius-large` |
145
+ | `--bulma-avatars-ring-color` / `--bulma-avatars-ring-width` | `scheme-main` / `2px` |
146
+ | `--bulma-avatars-spacing` | `0.75rem` (`sm` 0.5 / `lg` 1rem) |
147
+ | `--bulma-badge-height` / `--bulma-badge-min-width` | `1.25em` / `1.25em` |
148
+ | `--bulma-badge-padding` / `--bulma-badge-font-size` | `0 0.4em` / `0.7rem` |
149
+ | `--bulma-badge-radius` | `radius-rounded` |
150
+ | `--bulma-badge-ring-color` / `--bulma-badge-ring-width` | `scheme-main` / `2px` |
151
+ | `--bulma-badge-dot-size` | `0.65em` |
152
+ | `--bulma-badge-inset-circle` / `--bulma-badge-animation-duration` | `12%` / `1.4s` |
153
+
154
+ The remaining extras register the variables below — names only; each default lives in the
155
+ component's SCSS partial under `bulma-ui/src/scss/` as a `$<name> !default` variable. The same
156
+ own-selector override rule applies.
157
+
158
+ ### Autocomplete
159
+
160
+ `--bulma-autocomplete-border-color`, `--bulma-autocomplete-border-hover-color`,
161
+ `--bulma-autocomplete-dropdown-background`, `--bulma-autocomplete-dropdown-offset`,
162
+ `--bulma-autocomplete-dropdown-padding-y`, `--bulma-autocomplete-dropdown-radius`,
163
+ `--bulma-autocomplete-dropdown-shadow`, `--bulma-autocomplete-dropdown-z-index`,
164
+ `--bulma-autocomplete-empty-color`, `--bulma-autocomplete-header-footer-color`,
165
+ `--bulma-autocomplete-header-footer-padding`, `--bulma-autocomplete-header-footer-size`,
166
+ `--bulma-autocomplete-icon-hover-color`, `--bulma-autocomplete-item-color`,
167
+ `--bulma-autocomplete-item-disabled-color`, `--bulma-autocomplete-item-disabled-opacity`,
168
+ `--bulma-autocomplete-item-hover-background`, `--bulma-autocomplete-item-hover-color`,
169
+ `--bulma-autocomplete-item-large-padding`, `--bulma-autocomplete-item-medium-padding`,
170
+ `--bulma-autocomplete-item-padding`, `--bulma-autocomplete-item-small-padding`,
171
+ `--bulma-autocomplete-loader-active-color`, `--bulma-autocomplete-loader-border-color`,
172
+ `--bulma-autocomplete-loader-duration`, `--bulma-autocomplete-scrollbar-thumb`,
173
+ `--bulma-autocomplete-scrollbar-thumb-hover`, `--bulma-autocomplete-scrollbar-track`,
174
+ `--bulma-autocomplete-scrollbar-width`
175
+
176
+ ### Carousel
177
+
178
+ `--bulma-carousel-arrow-background`, `--bulma-carousel-arrow-background-hover`,
179
+ `--bulma-carousel-arrow-color`, `--bulma-carousel-arrow-disabled-opacity`,
180
+ `--bulma-carousel-arrow-icon-size`, `--bulma-carousel-arrow-icon-size-mobile`,
181
+ `--bulma-carousel-arrow-offset`, `--bulma-carousel-arrow-offset-mobile`,
182
+ `--bulma-carousel-arrow-radius`, `--bulma-carousel-arrow-size`,
183
+ `--bulma-carousel-arrow-size-mobile`, `--bulma-carousel-fade-duration`,
184
+ `--bulma-carousel-indicator-background`, `--bulma-carousel-indicator-background-active`,
185
+ `--bulma-carousel-indicator-background-hover`, `--bulma-carousel-indicator-bar-height`,
186
+ `--bulma-carousel-indicator-bar-height-mobile`, `--bulma-carousel-indicator-bar-width`,
187
+ `--bulma-carousel-indicator-bar-width-mobile`, `--bulma-carousel-indicator-circle-size`,
188
+ `--bulma-carousel-indicator-gap`, `--bulma-carousel-indicator-gap-mobile`,
189
+ `--bulma-carousel-indicator-line-height`, `--bulma-carousel-indicator-line-height-mobile`,
190
+ `--bulma-carousel-indicator-line-radius`, `--bulma-carousel-indicator-line-width`,
191
+ `--bulma-carousel-indicator-line-width-mobile`, `--bulma-carousel-indicator-size`,
192
+ `--bulma-carousel-indicator-size-mobile`, `--bulma-carousel-overlay-arrow-background`,
193
+ `--bulma-carousel-overlay-arrow-background-hover`, `--bulma-carousel-overlay-arrow-color`,
194
+ `--bulma-carousel-overlay-indicator-background`,
195
+ `--bulma-carousel-overlay-indicator-background-active`,
196
+ `--bulma-carousel-overlay-indicator-background-hover`, `--bulma-carousel-transition-duration`
197
+
198
+ ### Checkbox
199
+
200
+ `--bulma-checkbox-active-color`, `--bulma-checkbox-background`, `--bulma-checkbox-border-color`,
201
+ `--bulma-checkbox-border-width`, `--bulma-checkbox-check-color`,
202
+ `--bulma-checkbox-focus-shadow-size`, `--bulma-checkbox-indeterminate-color`,
203
+ `--bulma-checkbox-label-gap`, `--bulma-checkbox-radius`, `--bulma-checkbox-size`,
204
+ `--bulma-checkbox-transition-duration`
205
+
206
+ ### Collapse
207
+
208
+ `--bulma-collapse-border-color`, `--bulma-collapse-group-gap`, `--bulma-collapse-header-weight`,
209
+ `--bulma-collapse-margin-bottom`, `--bulma-collapse-radius`,
210
+ `--bulma-collapse-trigger-icon-margin`, `--bulma-collapse-trigger-icon-size`
211
+
212
+ ### DateInput
213
+
214
+ `--bulma-dateinput-cell-color`, `--bulma-dateinput-cell-disabled-color`,
215
+ `--bulma-dateinput-cell-hover-bg`, `--bulma-dateinput-cell-other-month-color`,
216
+ `--bulma-dateinput-cell-radius`, `--bulma-dateinput-cell-selected-bg`,
217
+ `--bulma-dateinput-cell-selected-color`, `--bulma-dateinput-cell-size`,
218
+ `--bulma-dateinput-cell-today-color`, `--bulma-dateinput-day-name-color`,
219
+ `--bulma-dateinput-day-name-size`, `--bulma-dateinput-header-padding`,
220
+ `--bulma-dateinput-min-width`, `--bulma-dateinput-nav-button-size`
221
+
222
+ ### DateTimeInput
223
+
224
+ `--bulma-datetimeinput-gap`, `--bulma-datetimeinput-time-card-background`,
225
+ `--bulma-datetimeinput-time-card-border-color`, `--bulma-datetimeinput-time-card-padding`,
226
+ `--bulma-datetimeinput-time-card-radius`, `--bulma-datetimeinput-time-card-shadow`,
227
+ `--bulma-datetimeinput-time-overlay-background`, `--bulma-datetimeinput-time-overlay-blur`
228
+
229
+ ### Dialog
230
+
231
+ `--bulma-dialog-animation-duration`, `--bulma-dialog-background`, `--bulma-dialog-body-color`,
232
+ `--bulma-dialog-body-line-height`, `--bulma-dialog-body-padding`, `--bulma-dialog-border-color`,
233
+ `--bulma-dialog-footer-gap`, `--bulma-dialog-footer-padding`, `--bulma-dialog-header-padding`,
234
+ `--bulma-dialog-icon-margin`, `--bulma-dialog-icon-size`, `--bulma-dialog-max-width`,
235
+ `--bulma-dialog-radius`, `--bulma-dialog-shadow`, `--bulma-dialog-title-color`,
236
+ `--bulma-dialog-title-size`, `--bulma-dialog-title-weight`, `--bulma-dialog-width`
237
+
238
+ ### LinkButton
239
+
240
+ `--bulma-link-button-ghost-color`, `--bulma-link-button-ghost-hover-color`,
241
+ `--bulma-link-button-transition-duration`, `--bulma-link-button-underline-offset`
242
+
243
+ ### Loading
244
+
245
+ `--bulma-loading-animation-duration`, `--bulma-loading-cancel-background`,
246
+ `--bulma-loading-cancel-border-color`, `--bulma-loading-cancel-color`,
247
+ `--bulma-loading-cancel-hover-border-color`, `--bulma-loading-cancel-hover-color`,
248
+ `--bulma-loading-cancel-radius`, `--bulma-loading-cancel-size`, `--bulma-loading-content-gap`,
249
+ `--bulma-loading-icon-border-width`, `--bulma-loading-icon-border-width-large`,
250
+ `--bulma-loading-icon-border-width-medium`, `--bulma-loading-icon-border-width-small`,
251
+ `--bulma-loading-icon-size`, `--bulma-loading-icon-size-large`,
252
+ `--bulma-loading-icon-size-medium`, `--bulma-loading-icon-size-small`,
253
+ `--bulma-loading-icon-spin-color`, `--bulma-loading-overlay-background`,
254
+ `--bulma-loading-overlay-fullpage-opacity`, `--bulma-loading-overlay-opacity`,
255
+ `--bulma-loading-overlay-opacity-dark`, `--bulma-loading-overlay-opacity-light`,
256
+ `--bulma-loading-overlay-opacity-opaque`, `--bulma-loading-text-color`,
257
+ `--bulma-loading-text-size`
258
+
259
+ ### Numberinput
260
+
261
+ `--bulma-numberinput-disabled-opacity`, `--bulma-numberinput-rounded-button-size`,
262
+ `--bulma-numberinput-stepper-border-color`, `--bulma-numberinput-stepper-button-color`,
263
+ `--bulma-numberinput-stepper-button-hover-bg`, `--bulma-numberinput-stepper-button-hover-color`,
264
+ `--bulma-numberinput-stepper-width`
265
+
266
+ ### Picker popover (DateInput / TimeInput / DateTimeInput)
267
+
268
+ `--bulma-picker-popover-animation-duration`, `--bulma-picker-popover-background`,
269
+ `--bulma-picker-popover-border-color`, `--bulma-picker-popover-offset`,
270
+ `--bulma-picker-popover-padding`, `--bulma-picker-popover-radius`,
271
+ `--bulma-picker-popover-shadow`, `--bulma-picker-popover-z-index`,
272
+ `--bulma-picker-trigger-color`, `--bulma-picker-trigger-hover-color`,
273
+ `--bulma-picker-trigger-width`
274
+
275
+ ### Radio
276
+
277
+ `--bulma-radio-active-color`, `--bulma-radio-background`, `--bulma-radio-border-color`,
278
+ `--bulma-radio-border-width`, `--bulma-radio-dot-color`, `--bulma-radio-focus-shadow-size`,
279
+ `--bulma-radio-label-gap`, `--bulma-radio-size`, `--bulma-radio-transition-duration`
280
+
281
+ ### Rate
282
+
283
+ `--bulma-rate-color-active`, `--bulma-rate-color-hover`, `--bulma-rate-color-inactive`,
284
+ `--bulma-rate-disabled-opacity`, `--bulma-rate-font-icon-size`,
285
+ `--bulma-rate-font-icon-size-large`, `--bulma-rate-font-icon-size-medium`,
286
+ `--bulma-rate-font-icon-size-small`, `--bulma-rate-gap`, `--bulma-rate-icon-size`,
287
+ `--bulma-rate-icon-size-large`, `--bulma-rate-icon-size-medium`, `--bulma-rate-icon-size-small`,
288
+ `--bulma-rate-pop-scale`, `--bulma-rate-score-color`, `--bulma-rate-score-weight`,
289
+ `--bulma-rate-spaced-gap`, `--bulma-rate-text-color`, `--bulma-rate-text-size`,
290
+ `--bulma-rate-transition-duration`
291
+
292
+ ### Reveal
293
+
294
+ `--bulma-reveal-duration`, `--bulma-reveal-easing`, `--bulma-reveal-flip-angle`,
295
+ `--bulma-reveal-offset`, `--bulma-reveal-offset-large`, `--bulma-reveal-scale`
296
+
297
+ ### Sidebar
298
+
299
+ `--bulma-sidebar-background`, `--bulma-sidebar-close-color`,
300
+ `--bulma-sidebar-close-hover-background`, `--bulma-sidebar-close-line-width`,
301
+ `--bulma-sidebar-close-radius`, `--bulma-sidebar-close-size`, `--bulma-sidebar-content-padding`,
302
+ `--bulma-sidebar-footer-border-color`, `--bulma-sidebar-footer-margin-top`,
303
+ `--bulma-sidebar-footer-padding`, `--bulma-sidebar-header-border-color`,
304
+ `--bulma-sidebar-header-margin-bottom`, `--bulma-sidebar-header-padding`,
305
+ `--bulma-sidebar-menu-item-active-background`, `--bulma-sidebar-menu-item-active-color`,
306
+ `--bulma-sidebar-menu-item-hover-background`, `--bulma-sidebar-menu-item-padding`,
307
+ `--bulma-sidebar-menu-item-radius`, `--bulma-sidebar-overlay-background`,
308
+ `--bulma-sidebar-scrollbar-color`, `--bulma-sidebar-scrollbar-color-hover`,
309
+ `--bulma-sidebar-scrollbar-width`, `--bulma-sidebar-shadow`,
310
+ `--bulma-sidebar-static-border-color`, `--bulma-sidebar-title-color`,
311
+ `--bulma-sidebar-title-size`, `--bulma-sidebar-title-weight`,
312
+ `--bulma-sidebar-transition-duration`, `--bulma-sidebar-width`
313
+
314
+ ### Slider
315
+
316
+ `--bulma-slider-disabled-opacity`, `--bulma-slider-fill-color`,
317
+ `--bulma-slider-output-background`, `--bulma-slider-output-color`,
318
+ `--bulma-slider-output-font-size`, `--bulma-slider-output-font-weight`, `--bulma-slider-radius`,
319
+ `--bulma-slider-thumb-border`, `--bulma-slider-thumb-color`, `--bulma-slider-thumb-shadow`,
320
+ `--bulma-slider-thumb-size`, `--bulma-slider-thumb-size-large`,
321
+ `--bulma-slider-thumb-size-medium`, `--bulma-slider-thumb-size-small`,
322
+ `--bulma-slider-tick-color`, `--bulma-slider-tick-height`, `--bulma-slider-tick-label-color`,
323
+ `--bulma-slider-tick-label-font-size`, `--bulma-slider-tick-opacity`,
324
+ `--bulma-slider-tick-width`, `--bulma-slider-track-color`, `--bulma-slider-track-height`,
325
+ `--bulma-slider-track-height-large`, `--bulma-slider-track-height-medium`,
326
+ `--bulma-slider-track-height-small`, `--bulma-slider-transition-duration`,
327
+ `--bulma-slider-vertical-height`
328
+
329
+ ### Steps
330
+
331
+ `--bulma-steps-animation-duration`, `--bulma-steps-content-margin-top`,
332
+ `--bulma-steps-default-color`, `--bulma-steps-divider-height`, `--bulma-steps-marker-background`,
333
+ `--bulma-steps-marker-font-size`, `--bulma-steps-marker-font-weight`,
334
+ `--bulma-steps-marker-size`, `--bulma-steps-marker-size-large`,
335
+ `--bulma-steps-marker-size-medium`, `--bulma-steps-marker-size-small`,
336
+ `--bulma-steps-navigation-margin-top`, `--bulma-steps-title-active-color`,
337
+ `--bulma-steps-title-active-weight`, `--bulma-steps-title-color`, `--bulma-steps-title-size`,
338
+ `--bulma-steps-title-weight`, `--bulma-steps-vertical-content-margin-left`,
339
+ `--bulma-steps-vertical-padding`
340
+
341
+ ### Switch
342
+
343
+ `--bulma-switch-active-color`, `--bulma-switch-background`, `--bulma-switch-border-width`,
344
+ `--bulma-switch-circle-color`, `--bulma-switch-circle-shadow`, `--bulma-switch-focus-shadow`,
345
+ `--bulma-switch-height`, `--bulma-switch-label-gap`, `--bulma-switch-padding`,
346
+ `--bulma-switch-radius`, `--bulma-switch-thin-circle-size`, `--bulma-switch-thin-height`,
347
+ `--bulma-switch-transition-duration`, `--bulma-switch-width`
348
+
349
+ ### Tabs
350
+
351
+ `--bulma-tabs-content-padding`, `--bulma-tabs-vertical-border-color`,
352
+ `--bulma-tabs-vertical-border-width`, `--bulma-tabs-vertical-min-width`
353
+
354
+ ### Taginput
355
+
356
+ `--bulma-taginput-background`, `--bulma-taginput-border-color`, `--bulma-taginput-border-radius`,
357
+ `--bulma-taginput-dropdown-max-height`, `--bulma-taginput-height`, `--bulma-taginput-min-height`,
358
+ `--bulma-taginput-padding`, `--bulma-taginput-tag-gap`, `--bulma-taginput-transition-duration`
359
+
360
+ ### TimeInput
361
+
362
+ `--bulma-timeinput-footer-padding`, `--bulma-timeinput-separator-color`,
363
+ `--bulma-timeinput-separator-size`, `--bulma-timeinput-wheel-bg`,
364
+ `--bulma-timeinput-wheel-color`, `--bulma-timeinput-wheel-dim-color`,
365
+ `--bulma-timeinput-wheel-gap`, `--bulma-timeinput-wheel-hover-bg`,
366
+ `--bulma-timeinput-wheel-item-height`, `--bulma-timeinput-wheel-mask`,
367
+ `--bulma-timeinput-wheel-radius`, `--bulma-timeinput-wheel-selected-bg`,
368
+ `--bulma-timeinput-wheel-selected-color`, `--bulma-timeinput-wheel-width`
369
+
370
+ ### Toast
371
+
372
+ `--bulma-toast-action-hover-opacity`, `--bulma-toast-action-radius`,
373
+ `--bulma-toast-action-weight`, `--bulma-toast-animation-duration`, `--bulma-toast-background`,
374
+ `--bulma-toast-color`, `--bulma-toast-gap`, `--bulma-toast-max-width`,
375
+ `--bulma-toast-message-size`, `--bulma-toast-min-width`, `--bulma-toast-padding`,
376
+ `--bulma-toast-radius`, `--bulma-toast-shadow`
377
+
378
+ ### Tooltip
379
+
380
+ `--bulma-tooltip-arrow-margin`, `--bulma-tooltip-arrow-size`, `--bulma-tooltip-background`,
381
+ `--bulma-tooltip-color`, `--bulma-tooltip-dashed-color`, `--bulma-tooltip-font-size`,
382
+ `--bulma-tooltip-font-weight`, `--bulma-tooltip-line-height`, `--bulma-tooltip-max-width`,
383
+ `--bulma-tooltip-multiline-width`, `--bulma-tooltip-padding`, `--bulma-tooltip-radius`,
384
+ `--bulma-tooltip-z-index`
385
+
386
+ ## Dark mode (`Theme colorMode`)
387
+
388
+ Drive the light/dark scheme with the `Theme` component's **`colorMode`** prop —
389
+ `'light' | 'dark' | 'system'`:
390
+
391
+ ```tsx
392
+ <Theme isRoot colorMode={mode}>
393
+ <App />
394
+ </Theme>
395
+ ```
396
+
397
+ `colorMode` writes Bulma's **`data-theme`** attribute on `<html>`, so it is always **global** (even
398
+ on a scoped `Theme`). `'system'` removes the attribute, so Bulma falls back to the OS
399
+ `@media (prefers-color-scheme: dark)`. Omitting `colorMode` leaves the current setting untouched.
400
+
401
+ Under the hood this is Bulma 1.x's own mechanism — `[data-theme="dark"]` / `.theme-dark` selectors
402
+ (plus the `prefers-color-scheme` media query). Setting the attribute by hand still works
403
+ (`document.documentElement.setAttribute('data-theme', 'dark')`); `colorMode` just does it for you.
404
+
405
+ Under dark mode Bulma flips the scheme/text/border/background lightness variables (e.g.
406
+ `--bulma-scheme-main-l` 100% → 9%, `--bulma-text-l` 29% → 71%). Your brand color overrides from
407
+ `Theme isRoot` or `:root` still apply on top, because they set the hue/saturation/lightness
408
+ channels directly.
409
+
410
+ ### The single-mode contrast trap
411
+
412
+ Because the OS preference applies whenever no `data-theme` attribute is set — the default state
413
+ of every app that never configured `colorMode` — a light-only design silently breaks for any
414
+ dark-mode visitor: Bulma's text goes near-white while author-defined fixed tokens stay light —
415
+ white text on cream. The failure is invisible unless the author's own OS is in dark mode.
416
+
417
+ **If the design is single-mode, pin the scheme** so text can't flip out from under the palette:
418
+
419
+ ```tsx
420
+ <Theme isRoot colorMode="light">
421
+ <App />
422
+ </Theme>
423
+ ```
424
+
425
+ **If both modes are supported, never expose a fixed custom token to the flip** — derive it from
426
+ scheme variables, or flip it yourself:
427
+
428
+ ```css
429
+ /* Preferred: track the scheme automatically. */
430
+ :root {
431
+ --my-canvas: var(--bulma-scheme-main);
432
+ --my-ink: var(--bulma-text);
433
+ }
434
+ /* Or, when custom values must be kept, provide the dark pair for BOTH
435
+ ways dark mode arrives — the explicit attribute (colorMode="dark")… */
436
+ [data-theme='dark'] {
437
+ --my-canvas: #14251b;
438
+ --my-ink: #eef3e7;
439
+ }
440
+
441
+ /* …and the OS preference, which applies when no data-theme is set
442
+ (colorMode="system" removes the attribute): */
443
+ @media (prefers-color-scheme: dark) {
444
+ :root:not([data-theme]) {
445
+ --my-canvas: #14251b;
446
+ --my-ink: #eef3e7;
447
+ }
448
+ }
449
+ ```
450
+
451
+ Deriving from scheme variables is preferred precisely because it covers both dark-mode paths
452
+ with no extra selector.
453
+
454
+ The same reasoning applies to **fixed-color surfaces** inside either kind of page (a dark hero,
455
+ a brand banner): content sitting on a surface that never flips must use pinned colors — filled
456
+ buttons and explicit text colors — not scheme-derived defaults (see the layout skill's hero CTA
457
+ rule).
458
+
459
+ ## `Theme` props (named)
460
+
461
+ Color trios: `primaryH/primaryS/primaryL`, `linkH/linkS/linkL`, `infoH/S/L`, `successH/S/L`,
462
+ `warningH/S/L`, `dangerH/S/L`. Scheme: `schemeH`, `schemeS`, `lightL`, `darkL`, `lightInvertL`,
463
+ `darkInvertL`, `softL`, `boldL`, `softInvertL`, `boldInvertL`. Interaction deltas:
464
+ `hoverBackgroundLDelta`, `activeBackgroundLDelta`, `hoverBorderLDelta`, `activeBorderLDelta`,
465
+ `hoverColorLDelta`, `activeColorLDelta`, `hoverShadowADelta`, `activeShadowADelta`. Everything else:
466
+ `bulmaVars={{ '--bulma-…': '…' }}`. All values are strings.
@@ -0,0 +1,119 @@
1
+ # Themeable component props
2
+
3
+ This is the self-contained inventory of the color/size/variant props that matter for theming in
4
+ `@allxsmith/bestax-bulma`. All values are source-verified. Components import from the package root:
5
+ `import { Button, Notification, Tag, Box, Message, Input, Title, SubTitle } from '@allxsmith/bestax-bulma'`.
6
+
7
+ ## Two kinds of color props
8
+
9
+ 1. **Component `color` modifier** → emits `is-<color>` (the filled Bulma variant). The accepted
10
+ values are component-specific (see the table). Example: `<Button color="primary">` → `is-primary`.
11
+ ⚠️ Some unions are **typed wider than the CSS Bulma ships** — the class is emitted but no rule
12
+ matches. No component ships `is-grey*`/`is-*-bis`/`is-*-ter` rules at all: those `validColors`
13
+ members still typecheck on `Progress`/`Notification`/`Hero` but style nothing. They are
14
+ **deprecated**: passing one logs a console warning in development, and they will be removed
15
+ from those unions in the next major (the `has-text-*`/`has-background-*` **helpers** do cover
16
+ all 17). On the `Hero` root, `inherit` and `current` are equally CSS-less and deprecated
17
+ (its `Head`/`Body`/`Foot` sub-components keep them, as text helpers). `Pagination` and
18
+ `Tabs` ship no color CSS for **any** value — their entire `color`
19
+ prop is deprecated. Before relying on an unusual value, grep the shipped CSS:
20
+ `node_modules/@allxsmith/bestax-bulma/dist/bestax.css` for e.g. `.progress.is-grey`.
21
+ 2. **Helper color props** (on most components, applied as utility classes):
22
+ - `color` / `textColor` → `has-text-<color>` (text color)
23
+ - `backgroundColor` / `bgColor` → `has-background-<color>` (background)
24
+ - `colorShade` / `backgroundColorShade` → adds a shade suffix, e.g. `has-text-primary-30`
25
+
26
+ Components with a real `is-<color>` modifier (`Button`, `Hero`) drop the `color` helper and
27
+ re-expose it as **`textColor`** / **`bgColor`**. `Box`/`Card`/`Section` ship no `is-<color>`
28
+ rule — their `color` _is_ the text helper (`has-text-<color>`; narrowed to the 6 on
29
+ `Box`/`Card`), so `color` and `textColor` are the same lever there (prefer `textColor`; it
30
+ takes precedence when both are set). `Tag` and `Td`/`Th` have
31
+ **no text-color prop** — wrap content in `<Span textColor="…">`. `Input` has none either and
32
+ the wrapper trick can't work (it renders a native `<input>`; a child can't color its value):
33
+ recolor via the upstream `--bulma-text-strong-l`, since Bulma re-declares `--bulma-input-*` on
34
+ `.input` itself and an ancestor `<Theme>` can't reach those. Raw `backgroundColor` still works
35
+ on `Tag` and `Input`.
36
+
37
+ `<color>` for the helper props is one of **`validColors`**:
38
+
39
+ ```
40
+ primary, link, info, success, warning, danger,
41
+ black, black-bis, black-ter, grey-darker, grey-dark, grey, grey-light, grey-lighter,
42
+ white, light, dark
43
+ ```
44
+
45
+ Shades (`colorShade` / `backgroundColorShade`): `00, 05, 10, … 95, invert, light, dark, soft, bold, on-scheme`.
46
+
47
+ ## Component `color` / `size` props (verbatim unions)
48
+
49
+ | Component | `color` accepts | `size` accepts | Notes |
50
+ | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
51
+ | `Button` | `primary \| link \| info \| success \| warning \| danger \| white \| light \| dark \| black \| text \| ghost` | `small \| normal \| medium \| large` | adds `text`, `ghost`; also `isLight`, `isOutlined`, `isInverted`, `isRounded` |
52
+ | `Notification` | the 17 `validColors` (`black-bis`, `black-ter`, and greys deprecated: no CSS, dev-warn, removed next major — see ⚠️) | — | also `isLight` |
53
+ | `Tag` | `primary \| link \| info \| success \| warning \| danger \| black \| dark \| light \| white` | `normal \| medium \| large` | also `isRounded`, `isDelete`, `isHoverable` — **no `isLight`** |
54
+ | `Box` | `primary \| link \| info \| success \| warning \| danger` | — | `color` renders `has-text-<color>`, same as `textColor` (which wins when both are set; no `.box.is-*` ships — tint via `bgColor`); also `hasShadow` |
55
+ | `Message` | `primary \| link \| info \| success \| warning \| danger` | — | the 6 only |
56
+ | `Input` | `primary \| link \| info \| success \| warning \| danger \| black \| dark \| light \| white` | `small \| medium \| large` | also `isRounded`, `isStatic` |
57
+ | `Avatar` | `primary \| link \| info \| success \| warning \| danger \| black \| dark \| light \| white` | `16x16 \| 24x24 \| 32x32 \| 48x48 \| 64x64 \| 96x96 \| 128x128 \| number` | initials/icon background (auto-derived from `name` when unset); also `shape` |
58
+ | `Badge` | `primary \| link \| info \| success \| warning \| danger \| black \| dark \| light \| white` | — | pill background; default `danger` |
59
+ | `Title` | — (no `color`; use `textColor`) | `1 \| 2 \| 3 \| 4 \| 5 \| 6` | also `isSpaced` |
60
+ | `SubTitle` | — (no `color`; use `textColor`) | `1 \| 2 \| 3 \| 4 \| 5 \| 6` | — |
61
+ | `Autocomplete` | `primary \| link \| info \| success \| warning \| danger` | `small \| medium \| large` | the 6 only |
62
+ | `Checkbox` | `primary \| link \| info \| success \| warning \| danger` | `small \| normal \| medium \| large` | the 6 only |
63
+ | `DateInput` | `primary \| link \| info \| success \| warning \| danger` | `small \| medium \| large` | also `isRounded` |
64
+ | `DateTimeInput` | `primary \| link \| info \| success \| warning \| danger` | `small \| medium \| large` | also `isRounded` |
65
+ | `File` | `primary \| link \| info \| success \| warning \| danger \| black \| dark \| light \| white` | `small \| medium \| large` | also `isBoxed`, `isFullwidth` |
66
+ | `Hero` | the 17 `validColors` + `inherit`/`current` (`black-bis`, `black-ter`, greys, `inherit`, `current` deprecated: no CSS, dev-warn, removed next major — see ⚠️) | `small \| medium \| large \| fullheight \| fullheight-with-navbar` | section background |
67
+ | `LinkButton` | `primary \| link \| info \| success \| warning \| danger \| white \| light \| dark \| black` | — | button-styled link; emits `link-button-<color>` — **no `isLight`/`isOutlined`/`isInverted`** |
68
+ | `Loading` | `primary \| link \| info \| success \| warning \| danger` | `small \| medium \| large` | spinner color; default light grey |
69
+ | `Navbar` | `primary \| link \| info \| success \| warning \| danger \| black \| dark \| light \| white` | — | — |
70
+ | `Numberinput` | `primary \| link \| info \| success \| warning \| danger \| light \| dark` | `small \| medium \| large` | also `inputColor` (the 6) for the inner input |
71
+ | `Pagination` | `primary \| link \| info \| success \| warning \| danger \| black \| dark \| light \| white` | `small \| medium \| large` | **entire `color` prop deprecated** (no CSS ships; dev-warn; removal next major) |
72
+ | `Panel` | `primary \| link \| info \| success \| warning \| danger \| black \| dark \| light \| white` | — | — |
73
+ | `Progress` | the 17 `validColors` (`black-bis`, `black-ter`, and greys deprecated: no CSS, dev-warn, removed next major — see ⚠️) | `small \| medium \| large` | — |
74
+ | `Radio` | `primary \| link \| info \| success \| warning \| danger` | `small \| normal \| medium \| large` | the 6 only |
75
+ | `Rate` | `primary \| link \| info \| success \| warning \| danger` | `small \| medium \| large` | the 6 only |
76
+ | `Select` | `primary \| link \| info \| success \| warning \| danger \| black \| dark \| light \| white` | `small \| medium \| large` | also `isRounded` |
77
+ | `Slider` | `primary \| link \| info \| success \| warning \| danger` | `small \| medium \| large` | also `isRounded`, `isCircle` |
78
+ | `Steps` | `primary \| link \| info \| success \| warning \| danger` | `small \| medium \| large` | the 6 only |
79
+ | `Switch` | `primary \| link \| info \| success \| warning \| danger` | `small \| normal \| medium \| large` | also `isRounded`, `isThin`, `isOutlined` |
80
+ | `Tabs` | `primary \| link \| info \| success \| warning \| danger \| black \| dark \| light \| white` | `small \| medium \| large` | **entire `color` prop deprecated** (no CSS ships; dev-warn; removal next major) |
81
+ | `Taginput` | `primary \| link \| info \| success \| warning \| danger` | `small \| medium \| large` | also `tagColor` (the 6 + `dark \| light`) for the tags |
82
+ | `TextArea` | `primary \| link \| info \| success \| warning \| danger \| black \| dark \| light \| white` | `small \| medium \| large` | also `isRounded`, `isStatic` |
83
+ | `TimeInput` | `primary \| link \| info \| success \| warning \| danger` | `small \| medium \| large` | — |
84
+ | `Tooltip` | `primary \| link \| info \| success \| warning \| danger \| dark \| light` | `small \| medium \| large` | — |
85
+ | `Tr` / `Td` / `Th` | `primary \| link \| info \| success \| warning \| danger \| black \| dark \| light \| white` | — | cell background; cells take `textAlign`/`textWeight`/`textSize` directly |
86
+
87
+ The 6 brand colors (`primary, link, info, success, warning, danger`) are the ones a custom theme
88
+ recolors via the HSL trios (see `css-variables.md`). The greyscale and `white`/`light`/`dark`
89
+ entries follow the scheme variables.
90
+
91
+ ## Typography & misc helper props (on most components)
92
+
93
+ | Prop | Accepts | Class |
94
+ | -------------------------------------------- | --------------------------------------------------------- | ---------------------- |
95
+ | `textSize` | `1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7` | `is-size-<n>` |
96
+ | `textWeight` | `light \| normal \| medium \| semibold \| bold` | `has-text-weight-<w>` |
97
+ | `fontFamily` | `sans-serif \| monospace \| primary \| secondary \| code` | `is-family-<f>` |
98
+ | `textAlign` | `centered \| justified \| left \| right` | `has-text-<a>` |
99
+ | `radius` | `radiusless` | `is-radiusless` |
100
+ | `shadow` | `shadowless` | `is-shadowless` |
101
+ | `m` / `p` (+ `mt/mr/mb/ml/mx/my`, `pt/…/py`) | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| auto` | `m-<n>` / `p-<n>` etc. |
102
+
103
+ These map to Bulma utility classes that read the same `--bulma-*` variables, so a custom theme
104
+ flows through them automatically.
105
+
106
+ ## Pattern
107
+
108
+ ```tsx
109
+ // Brand-colored, themeable components — colors recolor with the theme's HSL trios:
110
+ <Button color="primary">Save</Button>
111
+ <Notification color="info">Heads up</Notification>
112
+ <Tag color="success">Active</Tag>
113
+
114
+ // Utility coloring on a component that already has its own `color`:
115
+ <Button color="primary" textColor="white">Save</Button>
116
+
117
+ // Shade + background:
118
+ <Box bgColor="primary" backgroundColorShade="05">Subtle brand surface</Box>
119
+ ```