create-bestax 4.1.0 → 4.1.2

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Alex Smith
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/index.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-bestax",
3
- "version": "4.1.0",
3
+ "version": "4.1.2",
4
4
  "description": "Create a new bestax-bulma project",
5
5
  "type": "module",
6
6
  "bin": {
@@ -10,25 +10,6 @@
10
10
  "dist",
11
11
  "templates"
12
12
  ],
13
- "scripts": {
14
- "build": "node scripts/sync-skills.mjs && tsc",
15
- "prepack": "node scripts/sync-skills.mjs",
16
- "dev": "tsc --watch",
17
- "test": "NODE_OPTIONS=\"--experimental-vm-modules\" jest",
18
- "test:watch": "NODE_OPTIONS=\"--experimental-vm-modules\" jest --watch",
19
- "test:coverage": "NODE_OPTIONS=\"--experimental-vm-modules\" jest --coverage",
20
- "test:e2e": "playwright test --config=e2e/playwright.config.ts",
21
- "test:e2e:ui": "playwright test --config=e2e/playwright.config.ts --ui",
22
- "test:e2e:headed": "playwright test --config=e2e/playwright.config.ts --headed",
23
- "test:e2e:update": "playwright test --config=e2e/playwright.config.ts --update-snapshots",
24
- "test:e2e:report": "playwright show-report e2e/playwright-report",
25
- "lint": "eslint src e2e/tests e2e/utils",
26
- "typecheck": "tsc --noEmit",
27
- "format": "prettier --write \"src/**/*.{ts,tsx}\"",
28
- "format:check": "prettier --check \"src/**/*.{ts,tsx}\"",
29
- "clean": "rimraf dist",
30
- "release": "npx semantic-release"
31
- },
32
13
  "keywords": [
33
14
  "bestax",
34
15
  "bulma",
@@ -73,7 +54,25 @@
73
54
  "wait-on": "^9.1.0"
74
55
  },
75
56
  "publishConfig": {
76
- "access": "public",
77
- "provenance": true
78
- }
79
- }
57
+ "access": "public"
58
+ },
59
+ "scripts": {
60
+ "build": "node scripts/sync-skills.mjs && tsc",
61
+ "dev": "tsc --watch",
62
+ "test": "NODE_OPTIONS=\"--experimental-vm-modules\" jest",
63
+ "test:watch": "NODE_OPTIONS=\"--experimental-vm-modules\" jest --watch",
64
+ "test:coverage": "NODE_OPTIONS=\"--experimental-vm-modules\" jest --coverage",
65
+ "test:e2e": "playwright test --config=e2e/playwright.config.ts",
66
+ "test:e2e:ui": "playwright test --config=e2e/playwright.config.ts --ui",
67
+ "test:e2e:headed": "playwright test --config=e2e/playwright.config.ts --headed",
68
+ "test:e2e:update": "playwright test --config=e2e/playwright.config.ts --update-snapshots",
69
+ "test:e2e:report": "playwright show-report e2e/playwright-report",
70
+ "lint": "eslint src e2e/tests e2e/utils",
71
+ "typecheck": "tsc --noEmit",
72
+ "format": "prettier --write \"src/**/*.{ts,tsx}\"",
73
+ "format:check": "prettier --check \"src/**/*.{ts,tsx}\"",
74
+ "clean": "rimraf dist",
75
+ "release": "npx semantic-release"
76
+ },
77
+ "readme": "# create-bestax\n\n[![npm version](https://img.shields.io/npm/v/create-bestax.svg)](https://www.npmjs.com/package/create-bestax)\n[![npm downloads](https://img.shields.io/npm/dm/create-bestax.svg)](https://www.npmjs.com/package/create-bestax)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Socket Badge](https://socket.dev/api/badge/npm/package/create-bestax)](https://socket.dev/npm/package/create-bestax/overview)\n[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/allxsmith/bestax/badge)](https://scorecard.dev/viewer/?uri=github.com/allxsmith/bestax)\n[![npm provenance](https://img.shields.io/badge/npm-provenance-3fb950.svg)](https://www.npmjs.com/package/create-bestax#provenance)\n[![Security policy](https://img.shields.io/badge/security-policy-blue.svg)](https://github.com/allxsmith/bestax/blob/main/SECURITY.md)\n\nThe scaffolder for [`@allxsmith/bestax-bulma`](https://www.npmjs.com/package/@allxsmith/bestax-bulma) — spin up a Vite app pre-wired for the **Bulma v1** React component library in one command. Picks your framework (JS or TypeScript), CSS flavor, and icon library, and can drop in the bestax **AI skills** so an agent like Claude Code knows the library from the first prompt.\n\nPart of the [bestax monorepo](https://github.com/allxsmith/bestax) — see also [`@allxsmith/bestax-bulma`](https://www.npmjs.com/package/@allxsmith/bestax-bulma) for the components themselves.\n\n## Requirements\n\n- **Node.js 22 or newer.** Node 18 and 20 are both past end-of-life. On an older runtime the\n CLI exits immediately with an explicit upgrade message.\n- npm 10 or newer (ships with Node 22), or yarn/pnpm.\n\n## Usage\n\n### Quick Start\n\n```bash\n# Using npm\nnpm create bestax@latest my-app\n\n# Using npx\nnpx create-bestax@latest my-app\n\n# Alternative naming\nnpm create bestax-bulma@latest my-app\n```\n\n### Interactive Mode\n\nRunning without arguments will prompt you for all options:\n\n```bash\nnpm create bestax@latest\n```\n\nYou'll be asked to:\n\n1. Enter a project name\n2. Select a framework (Vite or Vite + TypeScript)\n3. Choose a Bulma CSS flavor (Complete or Minimal)\n4. Select an icon library (Font Awesome, Material Icons, etc.)\n5. Choose whether to install the bestax AI skills into `.claude/skills/`\n\nEvery prompt has a flag equivalent, so the whole flow is scriptable and CI-friendly — see the options below.\n\n### Command Line Options\n\n```bash\nnpm create bestax@latest [project-directory] [options]\n```\n\n**Arguments:**\n\n- `[project-directory]` - Optional project directory name\n\n**Options:**\n\n- `-t, --template <template>` - Template to use: `vite` or `vite-ts` \n **Default:** `vite`\n- `-b, --bulma <flavor>` - Bulma CSS flavor:\n - `complete` - Full Bulma CSS with all components and helpers\n - `prefixed` - Prefixed version for compatibility\n - `no-helpers` - Without helper classes\n - `no-helpers-prefixed` - Prefixed without helpers\n - `no-dark-mode` - Without dark mode support \n **Default:** `complete`\n- `-i, --icon <library>` - Icon library:\n - `none` - No icon library\n - `fontawesome` - Font Awesome\n - `mdi` - Material Design Icons\n - `ionicons` - Ionicons\n - `material-icons` - Material Icons\n - `material-symbols` - Material Symbols \n **Default:** `none`\n- `--skills` / `--no-skills` - Install (or skip) the bestax AI skills into\n `.claude/skills/` (with a `CLAUDE.md`) so a Claude Code session picks them up\n automatically. When omitted you're prompted; with `-y` the default is to install.\n- `-y, --yes` - Skip prompts and use defaults or provided options. \n When used, the following defaults are selected unless overridden by flags:\n - Template: `vite`\n - Bulma flavor: `complete`\n - Icon library: `none`\n - AI skills: installed (pass `--no-skills` to opt out)\n\n**Example:**\n\n```bash\n# Create a TypeScript project with Font Awesome icons\nnpm create bestax@latest my-app -t vite-ts -i fontawesome -b complete\n\n# Use all defaults (skip prompts)\nnpm create bestax@latest my-app -y\n```\n\n## Templates\n\nAvailable templates:\n\n- `vite` - Vite + JavaScript\n- `vite-ts` - Vite + TypeScript\n\nEach template includes:\n\n- Pre-configured bestax-bulma integration (React 19)\n- The latest `@allxsmith/bestax-bulma`, which ships Bulma v1 automatically\n- Icon library support (Font Awesome, Material Design, etc.)\n- Sample components demonstrating library usage\n- Development and build scripts\n\n## For AI Tools\n\nScaffolding for an AI agent? Pass `--skills` (or accept the prompt) to drop the bestax\nAgent Skills and a `CLAUDE.md` into the new project so Claude Code, Cursor, or Copilot\nbuild the bestax way from the start. The library also ships LLM-optimized docs:\n\n- [LLMs guide](https://bestax.io/docs/guides/llms) — using bestax with Claude Code, Cursor, Copilot\n- [Agent Skills](https://bestax.io/docs/skills/intro) — teach your agent the bestax conventions\n- [llms.txt](https://bestax.io/llms.txt) (curated index) · [llms-full.txt](https://bestax.io/llms-full.txt) (full docs)\n\n## Development\n\n```bash\nnpm run build # Build the CLI\nnpm run dev # Watch mode\nnpm test # Run tests\nnpm run lint # Lint CLI source code\nnpm run typecheck # Type check CLI source code\n```\n\n**Note on Templates:** Template files in `templates/` are excluded from linting. They should be manually validated by scaffolding a test project and running lint/build there before releasing.\n\n## Hardened by default\n\nA scaffolder runs with write access to your filesystem and picks your starting dependencies, so how it is built and published matters:\n\n- **Signed provenance** — every release carries a sigstore attestation linking the tarball to the exact commit and CI run that built it. Check the **Provenance** section on the [npm page](https://www.npmjs.com/package/create-bestax#provenance), or run `npm audit signatures`.\n- **npm OIDC trusted publishing** — short-lived, per-run credentials; no long-lived `NPM_TOKEN` exists to be stolen. Release commits and tags are GPG-signed.\n- **Socket.dev scans every PR** for malware, install scripts, obfuscated code, and privilege escalation before it can reach `main`.\n- **Dependencies are a deliberate act** — install scripts are blocked unless individually allow-listed, freshly published versions are refused for 3 days, and CI installs only what the reviewed lockfile resolves.\n- **Every GitHub Action is pinned to a full commit SHA**, so a compromised action release can't roll silently into a build of this CLI.\n- **CodeQL, Dependency Review, and Dependabot** run continuously, alongside a high-severity `pnpm audit` gate.\n- **Layered AI review before merge** — [CodeRabbit](https://coderabbit.ai) plus an independent adversarial Claude review (a different model from the one writing AI-authored changes), on top of required green CI, an approving review, and a human merge.\n\nFull detail: [`SECURITY.md`](https://github.com/allxsmith/bestax/blob/main/SECURITY.md) · [Security guide](https://bestax.io/docs/guides/security)\n\n## Publishing\n\nThis package uses semantic-release with scope-based rules. Only commits with `feat(create-bestax)` or `fix(create-bestax)` will trigger releases.\n"
78
+ }
@@ -12,11 +12,23 @@ Everything below is public API. Where to import from depends on your context:
12
12
  Turns Bulma helper props into a class string and returns the leftover (non-helper) props.
13
13
 
14
14
  ```ts
15
- const { bulmaHelperClasses, rest } = useBulmaClasses(props);
15
+ const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses(props);
16
16
  // bulmaHelperClasses: e.g. 'has-text-primary is-size-3 m-3'
17
- // rest: every prop that was NOT a recognized helper (safe to spread on the DOM)
17
+ // bulmaHelperStyles: inline styles for scheme-aware values, or undefined (see below)
18
+ // rest: every prop that was NOT a recognized helper; destructure your own
19
+ // component props and `style` before spreading it on a DOM element
18
20
  ```
19
21
 
22
+ `bulmaHelperStyles` is `undefined` unless `backgroundColor` is one of the six
23
+ `validSchemeColors` values (`scheme-main`, `scheme-main-bis`, `scheme-main-ter`,
24
+ `scheme-invert`, `scheme-invert-bis`, `scheme-invert-ter`). Bulma ships no
25
+ `has-background-scheme-*` classes, so those values emit no class; the hook returns
26
+ `{ backgroundColor: 'var(--bulma-<value>)' }` instead — a dark-mode-safe inline style. Put it
27
+ on the root element with `mergeBulmaStyles(bulmaHelperStyles, style)`
28
+ (`helpers/mergeBulmaStyles.ts`): the user's `style` prop wins on conflicts, and the result is
29
+ `undefined` when both are absent so unaffected components keep an attribute-free DOM.
30
+ (`useColorStyles` is the underlying per-concern hook.)
31
+
20
32
  `BulmaClassesProps` is the union of all helper prop groups, composed from per-concern hooks
21
33
  that can also be used on their own:
22
34
 
@@ -56,16 +68,22 @@ de-dupes. Related exports:
56
68
  Re-exported through `useBulmaClasses`. Use them to type component-specific props and to drive
57
69
  Storybook `argTypes`/tests:
58
70
 
59
- `validColors`, `validColorShades`, `validSizes`, `validTextSizes`, `validAlignments`,
60
- `validTextTransforms`, `validTextWeights`, `validFontFamilies`, `validDisplays`,
61
- `validVisibilities`, `validFlexDirections`, `validFlexWraps`, `validJustifyContents`,
62
- `validAlignContents`, `validAlignItems`, `validAlignSelfs`, `validFlexGrowShrink`,
63
- `validViewports`.
71
+ `validColors`, `validColorShades`, `validSchemeColors`, `validSizes`, `validTextSizes`,
72
+ `validAlignments`, `validTextTransforms`, `validTextWeights`, `validFontFamilies`,
73
+ `validDisplays`, `validVisibilities`, `validFlexDirections`, `validFlexWraps`,
74
+ `validJustifyContents`, `validAlignContents`, `validAlignItems`, `validAlignSelfs`,
75
+ `validFlexGrowShrink`, `validViewports`.
64
76
 
65
77
  ```ts
66
78
  export type MyColor = (typeof validColors)[number];
67
79
  ```
68
80
 
81
+ `validSchemeColors` is the scheme-background tuple consumed by `bulmaHelperStyles` (above).
82
+ Components that support scheme backgrounds widen their own `bgColor` union with
83
+ `(typeof validSchemeColors)[number]` — the widening is deliberate and per-component, so a
84
+ component that has not wired `bulmaHelperStyles` onto its root element must keep the narrow
85
+ union (a compile error beats a silent no-op).
86
+
69
87
  ## `ConfigProvider` / `Theme` — `helpers/Config.tsx`, `helpers/Theme.tsx`
70
88
 
71
89
  `ConfigProvider` provides the runtime `classPrefix` (and `iconLibrary`) consumed via `useConfig`;
@@ -143,7 +143,7 @@ component is guaranteed to appear (the generator fails if one lacks an API page)
143
143
 
144
144
  - [ConfigProvider](https://bestax.io/docs/api/helpers/config) — The `ConfigProvider` component provides a React context for configuring global settings across all Bulma UI components.
145
145
  - [Theme](https://bestax.io/docs/api/helpers/theme) — The `Theme` component provides a powerful way to customize Bulma's appearance using CSS custom properties (CSS variables).
146
- - [Valid value constants](https://bestax.io/docs/api/helpers/valid-values) — The `valid*` constant arrays enumerate every accepted value for the shared Bulma helper props — public API you can import to build prop types and validation.
146
+ - [Valid value constants](https://bestax.io/docs/api/helpers/valid-values) — The `valid*` tuples enumerate the core accepted values for the shared Bulma helper props — public API for building prop types and validation.
147
147
  - [classNames](https://bestax.io/docs/api/helpers/classnames) — `classNames` is a utility function for conditionally joining class names together.
148
148
  - [useBulmaClasses](https://bestax.io/docs/api/helpers/usebulmaclasses) — `useBulmaClasses` is a custom React hook that generates Bulma helper class strings from a set of props.
149
149
  - [usePrefixedClassNames](https://bestax.io/docs/api/helpers/useprefixedclassnames) — `usePrefixedClassNames` builds a component class string that honors the `classPrefix` from `ConfigProvider` — the hook every bestax component uses for its own…
@@ -70,10 +70,15 @@ Centered; a collection of items → Card grid. For mixed requests, pick the domi
70
70
  `textWeight`, `textSize` directly (their `color` prop colors the cell; for muted cell text
71
71
  wrap content in `Span textColor="grey"`). Set the app-wide icon library once with
72
72
  `<ConfigProvider iconLibrary="…">` at the root rather than `library` on every `<Icon>`.
73
- - **Decorative CSS is budgeted: three compact rules, ≤13 lines per app — comments count:
73
+ - **Alternating section bands are a prop, not CSS: `bgColor="scheme-main-bis"` on every
74
+ other `Section` (next band `scheme-main-ter`).** The scheme values render as a
75
+ dark-mode-safe inline `background-color: var(--bulma-scheme-*)` — zero custom CSS — and
76
+ still never `bgColor="light"`/`"white"`: those are fixed colors that stay light when dark
77
+ mode flips the text.
78
+ - **Decorative CSS is budgeted: two compact rules, ≤10 lines per app — comments count:
74
79
  at most one short inline note, never a file-header comment block — every value derived
75
- from `--bulma-*`.** A marketing page gets at most one hero wash, one alternating section
76
- band, and one featured-card ring, applied via `className` — no resets (Bulma ships one;
80
+ from `--bulma-*`.** A marketing page gets at most one hero wash and one featured-card
81
+ ring, applied via `className` — no resets (Bulma ships one;
77
82
  body/list margins are already zero) and no grid textures, masks, or multi-layer backdrops;
78
83
  the components carry the design:
79
84
 
@@ -85,9 +90,6 @@ Centered; a collection of items → Card grid. For mixed requests, pick the domi
85
90
  transparent 60%
86
91
  );
87
92
  }
88
- .section-alt {
89
- background: var(--bulma-scheme-main-bis); /* next band: -ter */
90
- }
91
93
  .featured-ring {
92
94
  --bulma-shadow: 0 0 0 2px var(--bulma-primary);
93
95
  }
@@ -188,8 +190,10 @@ inline `style`.
188
190
  - [ ] Style with helper props, not inline `style` — translate via the mapping table; values
189
191
  with no helper get a named class in the stylesheet, never `style={{}}`. No raw Bulma
190
192
  `className`s either (`Span`/`Paragraph` wrap bare text; `Th`/`Td` take `textAlign`/`textWeight`).
191
- - [ ] Decorative CSS ≤13 lines total incl. comments — no file-header comment (hero wash +
192
- section band + featured-card ring), `--bulma-*`-derived; no resets — Bulma ships one.
193
+ - [ ] Alternating bands are `bgColor="scheme-main-bis"` (next band `scheme-main-ter`) on
194
+ every other `Section` never band CSS, never `bgColor="light"`/`"white"`.
195
+ - [ ] Decorative CSS ≤10 lines total incl. comments — no file-header comment (hero wash +
196
+ featured-card ring), `--bulma-*`-derived; no resets — Bulma ships one.
193
197
  The ring sets `--bulma-shadow` in a CSS rule; `Theme bulmaVars` has no such key.
194
198
  - [ ] Set the icon library once via `<ConfigProvider iconLibrary="…">` at the root.
195
199
  - [ ] Site built? ~800 KB raw / ~82 KB gzip CSS is the expected default-flavor size — to shrink
@@ -155,8 +155,11 @@ the `Hero`; if it's `fixed="top"`, the same `<html class="has-navbar-fixed-top">
155
155
  applies here too.
156
156
 
157
157
  **Alternating section bands:** tint every other `Section` with a scheme step —
158
- `.section-alt { background: var(--bulma-scheme-main-bis); }` (next step `-ter`) — not
159
- `bgColor="light"`/`"white"`: those are fixed colors that stay light when dark mode flips the text.
158
+ `bgColor="scheme-main-bis"` (next step `scheme-main-ter`) — not `bgColor="light"`/`"white"`:
159
+ those are fixed colors that stay light when dark mode flips the text. Scheme values emit no
160
+ class; the component renders a dark-mode-safe inline `background-color: var(--bulma-scheme-*)`
161
+ style, so bands cost zero custom CSS. The same values work on `Hero` (and its
162
+ `Head`/`Body`/`Foot`), `Footer`, `Container`, `Box`, and `Card`.
160
163
 
161
164
  **Hero CTAs:** on a colored hero use **filled** buttons only — `color="light"` for the primary
162
165
  CTA and `color="primary" isInverted` (solid white, primary text) for a secondary. A thin
@@ -44,9 +44,13 @@ color tokens or fixed-color surfaces exist:
44
44
  (`--my-canvas: var(--bulma-scheme-main)`) — or flip them yourself under **both** dark-mode
45
45
  paths: `[data-theme='dark']` **and** `@media (prefers-color-scheme: dark)` scoped to
46
46
  `:root:not([data-theme])`, since `colorMode="system"` removes the attribute (snippets in
47
- `references/css-variables.md`). Alternating/tinted section bands are this case:
48
- `background: var(--bulma-scheme-main-bis)` (then `-ter`), never `bgColor="light"`
49
- `light`/`white`/grey helper backgrounds are fixed colors that fight dark mode.
47
+ `references/css-variables.md`). Alternating/tinted section bands are first-class props:
48
+ `bgColor="scheme-main-bis"` (then `"scheme-main-ter"`) on `Section` (also `Hero`, `Footer`,
49
+ `Container`, `Box`, `Card`) renders a scheme-tracking inline background never
50
+ `bgColor="light"`: `light`/`white`/grey helper backgrounds are fixed colors that fight
51
+ dark mode. Keep the derive-from-scheme-vars CSS for other custom surfaces. `Theme
52
+ bulmaVars` now accepts `--bulma-scheme-main`/`-bis`/`-ter` (and the `-invert` trio)
53
+ overrides, so one Theme re-tints every band at once.
50
54
  - **Fixed-color surface → fixed-color content.** On a surface that never changes (a dark hero,
51
55
  a brand banner), pin the content's colors too: solid/filled buttons and explicit text colors,
52
56
  never scheme-derived defaults or thin outlines that depend on the flipping scheme.
@@ -81,13 +81,14 @@ and numeric shades `--bulma-<c>-00` … `--bulma-<c>-95`.
81
81
 
82
82
  ## Scheme, text, background, border (light/dark surfaces)
83
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 |
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); `Theme bulmaVars`-overridable, and the scheme `bgColor` values render them inline |
88
+ | `--bulma-scheme-invert`, `--bulma-scheme-invert-bis`, `--bulma-scheme-invert-ter` | inverted scheme surfaces; `Theme bulmaVars`-overridable, and the scheme `bgColor` values render them inline (pair with a foreground — see the color guide) |
89
+ | `--bulma-background` | secondary background |
90
+ | `--bulma-text`, `--bulma-text-strong`, `--bulma-text-weak` | body / emphasized / muted text |
91
+ | `--bulma-border`, `--bulma-border-weak` | borders |
91
92
 
92
93
  ## Radius, typography
93
94