@allxsmith/bestax-bulma 5.67.9 → 5.67.11

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 (81) hide show
  1. package/README.md +3 -3
  2. package/dist/bestax.css +1 -1
  3. package/dist/bestax.css.map +1 -1
  4. package/dist/esm/components/ContextMenu.js +2 -2
  5. package/dist/esm/components/ContextMenu.js.map +1 -1
  6. package/dist/esm/components/HoverCard.js.map +1 -1
  7. package/dist/esm/components/Message.js +4 -1
  8. package/dist/esm/components/Message.js.map +1 -1
  9. package/dist/esm/components/Modal.js +5 -2
  10. package/dist/esm/components/Modal.js.map +1 -1
  11. package/dist/esm/components/Panel.js.map +1 -1
  12. package/dist/esm/components/Popover.js.map +1 -1
  13. package/dist/esm/components/Sidebar.js.map +1 -1
  14. package/dist/esm/elements/Notification.js +13 -4
  15. package/dist/esm/elements/Notification.js.map +1 -1
  16. package/dist/esm/form/ColorInputBase.js.map +1 -1
  17. package/dist/esm/form/Combobox.js.map +1 -1
  18. package/dist/esm/form/DateInputBase.js.map +1 -1
  19. package/dist/esm/form/DateRangeInputBase.js.map +1 -1
  20. package/dist/esm/form/DateTimeInputBase.js.map +1 -1
  21. package/dist/esm/form/TimeInputBase.js.map +1 -1
  22. package/dist/esm/form/TreeSelect.js.map +1 -1
  23. package/dist/esm/helpers/Config.js.map +1 -1
  24. package/dist/esm/helpers/portal.js +8 -3
  25. package/dist/esm/helpers/portal.js.map +1 -1
  26. package/dist/esm/helpers/scrollLock.js +29 -4
  27. package/dist/esm/helpers/scrollLock.js.map +1 -1
  28. package/dist/esm/layout/AppFrame.js +9 -3
  29. package/dist/esm/layout/AppFrame.js.map +1 -1
  30. package/dist/extras.css +1 -1
  31. package/dist/extras.css.map +1 -1
  32. package/dist/index.cjs +66 -17
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/types/components/HoverCard.d.ts +11 -11
  35. package/dist/types/components/Modal.d.ts +9 -5
  36. package/dist/types/components/Panel.d.ts +6 -1
  37. package/dist/types/components/Popover.d.ts +6 -6
  38. package/dist/types/components/Sidebar.d.ts +10 -1
  39. package/dist/types/form/ColorInputBase.d.ts +2 -2
  40. package/dist/types/form/Combobox.d.ts +6 -6
  41. package/dist/types/form/DateInputBase.d.ts +2 -2
  42. package/dist/types/form/DateRangeInputBase.d.ts +2 -2
  43. package/dist/types/form/DateTimeInputBase.d.ts +2 -2
  44. package/dist/types/form/TimeInputBase.d.ts +2 -2
  45. package/dist/types/form/TreeSelect.d.ts +1 -1
  46. package/dist/types/helpers/Config.d.ts +9 -5
  47. package/dist/types/helpers/portal.d.ts +7 -3
  48. package/dist/types/helpers/scrollLock.d.ts +13 -0
  49. package/dist/types/layout/AppFrame.d.ts +5 -1
  50. package/dist/types-cjs/components/HoverCard.d.ts +11 -11
  51. package/dist/types-cjs/components/Modal.d.ts +9 -5
  52. package/dist/types-cjs/components/Panel.d.ts +6 -1
  53. package/dist/types-cjs/components/Popover.d.ts +6 -6
  54. package/dist/types-cjs/components/Sidebar.d.ts +10 -1
  55. package/dist/types-cjs/form/ColorInputBase.d.ts +2 -2
  56. package/dist/types-cjs/form/Combobox.d.ts +6 -6
  57. package/dist/types-cjs/form/DateInputBase.d.ts +2 -2
  58. package/dist/types-cjs/form/DateRangeInputBase.d.ts +2 -2
  59. package/dist/types-cjs/form/DateTimeInputBase.d.ts +2 -2
  60. package/dist/types-cjs/form/TimeInputBase.d.ts +2 -2
  61. package/dist/types-cjs/form/TreeSelect.d.ts +1 -1
  62. package/dist/types-cjs/helpers/Config.d.ts +9 -5
  63. package/dist/types-cjs/helpers/portal.d.ts +7 -3
  64. package/dist/types-cjs/helpers/scrollLock.d.ts +13 -0
  65. package/dist/types-cjs/layout/AppFrame.d.ts +5 -1
  66. package/dist/versions/bestax-no-dark-mode.css +1 -1
  67. package/dist/versions/bestax-no-dark-mode.css.map +1 -1
  68. package/dist/versions/bestax-no-helpers-prefixed.css +1 -1
  69. package/dist/versions/bestax-no-helpers-prefixed.css.map +1 -1
  70. package/dist/versions/bestax-no-helpers.css +1 -1
  71. package/dist/versions/bestax-no-helpers.css.map +1 -1
  72. package/dist/versions/bestax-prefixed.css +1 -1
  73. package/dist/versions/bestax-prefixed.css.map +1 -1
  74. package/package.json +2 -2
  75. package/src/scss/CLAUDE.md +5 -0
  76. package/src/scss/_variables.scss +6 -0
  77. package/src/scss/components/_affix.scss +10 -5
  78. package/src/scss/components/_index.scss +1 -0
  79. package/src/scss/components/_navbar.scss +19 -1
  80. package/src/scss/components/_panel.scss +31 -0
  81. package/src/scss/components/_toast.scss +18 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allxsmith/bestax-bulma",
3
- "version": "5.67.9",
3
+ "version": "5.67.11",
4
4
  "description": "Component library based on React, Bulma, with Agent Skills and MCP",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.esm.js",
@@ -228,5 +228,5 @@
228
228
  "test-storybook:dark": "STORYBOOK_THEME=dark vitest run --config vitest.storybook.config.ts",
229
229
  "test-storybook:ci": "node scripts/test-storybook-ci.mjs"
230
230
  },
231
- "readme": "# @allxsmith/bestax-bulma\n\n[![npm version](https://img.shields.io/npm/v/@allxsmith/bestax-bulma.svg)](https://www.npmjs.com/package/@allxsmith/bestax-bulma)\n[![npm downloads](https://img.shields.io/npm/dm/@allxsmith/bestax-bulma.svg)](https://www.npmjs.com/package/@allxsmith/bestax-bulma)\n[![TypeScript](https://img.shields.io/badge/TypeScript-100%25-blue.svg)](https://www.typescriptlang.org/)\n[![Coverage](https://img.shields.io/badge/coverage-99%25-brightgreen.svg)](https://github.com/allxsmith/bestax/blob/main/bulma-ui/vitest.config.ts)\n[![Bulma](https://img.shields.io/badge/Bulma-v1.0+-00d1b2.svg)](https://bulma.io)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Socket Badge](https://badge.socket.dev/npm/package/@allxsmith/bestax-bulma/latest)](https://socket.dev/npm/package/@allxsmith/bestax-bulma/overview)\n[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/allxsmith/bestax/badge)](https://scorecard.dev/viewer/?uri=github.com/allxsmith/bestax)\n[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/14361/badge)](https://www.bestpractices.dev/projects/14361)\n[![npm provenance](https://img.shields.io/badge/npm-provenance-3fb950.svg)](https://www.npmjs.com/package/@allxsmith/bestax-bulma#provenance)\n[![Security policy](https://img.shields.io/badge/security-policy-blue.svg)](https://github.com/allxsmith/bestax/blob/main/SECURITY.md)\n\nTypeScript-first React component library for the **Bulma v1** CSS framework — 80+ fully typed, tree-shakeable components, including extras like Carousel, Dialog, Sidebar, Steps, and date/time pickers.\n\n**Requires React `^18 || ^19`.** Bulma v1 is the only runtime dependency and installs automatically.\n\nPart of the [bestax monorepo](https://github.com/allxsmith/bestax) — see also [`create-bestax`](https://www.npmjs.com/package/create-bestax) for scaffolding new projects.\n\n---\n\n## 📚 Comprehensive Documentation\n\n**Looking for full documentation, guides, API references, and best practices?** \n👉 **Visit our official docs at [https://bestax.io](https://bestax.io)**\n\n> The documentation site is the best place to learn about all bestax-bulma features, usage patterns, and updates. We strongly recommend using the docs as your primary resource!\n\n---\n\n## 🚀 Getting Started\n\nStarting fresh? Scaffold a ready-to-go app instead: `npm create bestax@latest my-app`.\n\n### 1. Install the package\n\n```bash\nnpm install @allxsmith/bestax-bulma\n# or\npnpm add @allxsmith/bestax-bulma\n```\n\n### 2. Import the CSS\n\nThe library bundles its own CSS (Bulma v1 + the bestax extras). Import it once in your main JS/TS file:\n\n```js\nimport '@allxsmith/bestax-bulma/bestax.css';\n```\n\nPrefer stock Bulma? That works too — add `extras.css` for the bestax-only components' styles:\n\n```js\nimport 'bulma/css/bulma.min.css';\nimport '@allxsmith/bestax-bulma/extras.css';\n```\n\nMore flavors are shipped as subpath exports — prefixed classes (`versions/bestax-prefixed.css` + `<ConfigProvider classPrefix=\"bestax-\">`), no-helpers, no-dark-mode, and raw SCSS at `@allxsmith/bestax-bulma/scss/*`. See the [installation guide](https://bestax.io/docs/guides/getting-started/installation).\n\n### 3. (Optional) Add an Icon Library\n\nFive icon libraries are supported as optional peer dependencies: [Font Awesome](https://fontawesome.com/) (`@fortawesome/fontawesome-free`), Material Design Icons (`@mdi/font`), `ionicons`, `material-icons`, and `material-symbols`.\n\n```bash\nnpm install @fortawesome/fontawesome-free\n```\n\nSet the default for your whole app with [`ConfigProvider`](https://bestax.io/docs/api/helpers/config), e.g. `<ConfigProvider iconLibrary=\"fa\">`.\n\n### 4. Quick Example\n\n```tsx\nimport '@allxsmith/bestax-bulma/bestax.css';\nimport { Button } from '@allxsmith/bestax-bulma';\n\nfunction App() {\n return (\n <Button color=\"primary\" onClick={() => alert('Clicked!')}>\n Click Me\n </Button>\n );\n}\n\nexport default App;\n```\n\n### 5. Theming and Dark Mode\n\nWrap your app in [`Theme`](https://bestax.io/docs/api/helpers/theme) to override Bulma's `--bulma-*` CSS variables and control the color scheme:\n\n```tsx\nimport { Theme } from '@allxsmith/bestax-bulma';\n\n<Theme isRoot colorMode=\"system\">\n {/* colorMode: 'light' | 'dark' | 'system' */}\n <App />\n</Theme>;\n```\n\n---\n\n## ⭐ Why Choose bestax-bulma?\n\n- **Supports the latest Bulma v1.x**\n Other React Bulma libraries are stuck on Bulma 0.9.4 — bestax-bulma is built for the future.\n- **80+ components**\n All of Bulma v1, plus extras: Carousel, Dialog, Sidebar, Steps, Autocomplete, Taginput, DateInput/TimeInput/DateTimeInput pickers, and more. (Migrating from v2? Snackbar merged into [Toast](https://bestax.io/docs/api/components/toast).)\n- **Dark mode & theming built in**\n `Theme colorMode`, `--bulma-*` variable overrides, and prefixed-class builds via `ConfigProvider`.\n- **Just one dependency: Bulma**\n Every Bulma library depends on it — we ship it automatically. Clean install, fewer security concerns.\n- **Tree-shakeable ESM**\n Import only what you use; your bundler drops the rest. A CJS build is there for `require`.\n- **99% unit test coverage**\n Enforced in CI by the [Vitest config](https://github.com/allxsmith/bestax/blob/main/bulma-ui/vitest.config.ts) — not just claimed.\n- **100% TypeScript**\n Full type safety for you and your team.\n- **Active developer support**\n Issues? Questions? PRs? Get fast responses and real improvements.\n\n---\n\n## 📦 NPM Package\n\nView the package on npmjs: \n👉 [https://www.npmjs.com/package/@allxsmith/bestax-bulma](https://www.npmjs.com/package/@allxsmith/bestax-bulma)\n\n---\n\n## 🔒 Hardened by default\n\nThis package is one runtime dependency deep (Bulma) and is published under a deliberately strict pipeline:\n\n- **Signed provenance** — every release carries a sigstore attestation linking the tarball to the exact commit and CI run that built it. Verify it in the **Provenance** section of the [npm page](https://www.npmjs.com/package/@allxsmith/bestax-bulma#provenance), or run `npm audit signatures` in your project.\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 package.\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---\n\n## 📚 Documentation\n\n**For full documentation, guides, and best practices, please use our official docs site:**\n\n👉 [https://bestax.io](https://bestax.io)\n\n> **Always refer to the [documentation site](https://bestax.io) first:** \n> It's the most complete and up-to-date source for everything bestax-bulma!\n\n---\n\n## 📖 Storybook\n\nExplore live, interactive component examples in our Storybook:\n\n👉 [https://bestax.io/storybook](https://bestax.io/storybook)\n\n---\n\n## 🤖 For AI Tools\n\nBuilding with an AI agent (Claude Code, Cursor, Copilot)? bestax-bulma ships LLM-optimized docs:\n\n- 📘 **[LLMs guide](https://bestax.io/docs/guides/llms)** — how to use the library with AI tools\n- 📄 **[llms.txt](https://bestax.io/llms.txt)** — curated index · **[llms-full.txt](https://bestax.io/llms-full.txt)** — the full docs in one file · every docs page is also served as raw markdown\n- 📦 **In the npm package** — the tarball ships `llms.txt`, `AGENTS.md`, and `CLAUDE.md` pointer files, so agents exploring `node_modules` land on these resources by filename\n- 🧩 **[Agent Skills](https://bestax.io/docs/skills/intro)** — teach your agent the bestax way:\n\n | Skill | Use it when… |\n | ------------------------- | -------------------------------------------------------------------------------- |\n | `bestax-layout-scaffold` | Turning a high-level request (dashboard, landing page, …) into a responsive page |\n | `bestax-form` | Building forms — Field/Control composition and the full input inventory |\n | `bestax-theming` | Customizing colors, fonts, dark mode via `Theme` and `--bulma-*` variables |\n | `bestax-custom-component` | Building a new custom component beyond stock Bulma, the bestax way |\n | `bestax-icons` | Adding icons — Icon/IconText and the five supported icon libraries |\n | `bestax-optimize` | Shrinking the built CSS — flavor builds, modular Sass, import hygiene |\n | `bestax-migrate` | Moving an app off react-bulma-components (v4) onto bestax-bulma |\n\n ```bash\n npx skills add https://github.com/allxsmith/bestax --skill bestax-layout-scaffold\n ```\n\n New projects get the skills automatically with `npm create bestax@latest my-app --skills` (plus a generated `CLAUDE.md`).\n\n---\n\n## 🙏 Attribution\n\nbestax-bulma is built on top of the incredible [Bulma](https://bulma.io) CSS framework,\n© [Jeremy Thomas](https://github.com/jgthms) and licensed under the\n[MIT License](https://github.com/jgthms/bulma/blob/main/LICENSE), whose notice ships with the\npackage in [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md). Some example content and documentation is\nadapted from the Bulma website\n([CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)), © Jeremy Thomas.\n\nIf you find Bulma useful, please consider\n[sponsoring Jeremy Thomas](https://github.com/sponsors/jgthms) to support its continued\ndevelopment.\n\n_We are not affiliated with Bulma or Jeremy Thomas in any way — we're just big fans of the\nBulma framework!_\n\n## License\n\nSource code licensed MIT\n"
231
+ "readme": "# @allxsmith/bestax-bulma\n\n[![npm version](https://img.shields.io/npm/v/@allxsmith/bestax-bulma.svg)](https://www.npmjs.com/package/@allxsmith/bestax-bulma)\n[![npm downloads](https://img.shields.io/npm/dm/@allxsmith/bestax-bulma.svg)](https://www.npmjs.com/package/@allxsmith/bestax-bulma)\n[![TypeScript](https://img.shields.io/badge/TypeScript-100%25-blue.svg)](https://www.typescriptlang.org/)\n[![Coverage](https://img.shields.io/badge/coverage-99%25-brightgreen.svg)](https://github.com/allxsmith/bestax/blob/main/bulma-ui/vitest.config.ts)\n[![Bulma](https://img.shields.io/badge/Bulma-v1.0+-00d1b2.svg)](https://bulma.io)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Socket Badge](https://badge.socket.dev/npm/package/@allxsmith/bestax-bulma/latest)](https://socket.dev/npm/package/@allxsmith/bestax-bulma/overview)\n[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/allxsmith/bestax/badge)](https://scorecard.dev/viewer/?uri=github.com/allxsmith/bestax)\n[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/14361/badge)](https://www.bestpractices.dev/projects/14361)\n[![npm provenance](https://img.shields.io/badge/npm-provenance-3fb950.svg)](https://www.npmjs.com/package/@allxsmith/bestax-bulma#provenance)\n[![Security policy](https://img.shields.io/badge/security-policy-blue.svg)](https://github.com/allxsmith/bestax/blob/main/SECURITY.md)\n\nTypeScript-first React component library for the **Bulma v1** CSS framework — 110+ fully typed, tree-shakeable components, including extras like Carousel, Dialog, Sidebar, Steps, and date/time pickers.\n\n**Requires React `^18 || ^19`.** Bulma v1 is the only runtime dependency and installs automatically.\n\nPart of the [bestax monorepo](https://github.com/allxsmith/bestax) — see also [`create-bestax`](https://www.npmjs.com/package/create-bestax) for scaffolding new projects.\n\n---\n\n## 📚 Comprehensive Documentation\n\n**Looking for full documentation, guides, API references, and best practices?** \n👉 **Visit our official docs at [https://bestax.io](https://bestax.io)**\n\n> The documentation site is the best place to learn about all bestax-bulma features, usage patterns, and updates. We strongly recommend using the docs as your primary resource!\n\n---\n\n## 🚀 Getting Started\n\nStarting fresh? Scaffold a ready-to-go app instead: `npm create bestax@latest my-app`.\n\n### 1. Install the package\n\n```bash\nnpm install @allxsmith/bestax-bulma\n# or\npnpm add @allxsmith/bestax-bulma\n```\n\n### 2. Import the CSS\n\nThe library bundles its own CSS (Bulma v1 + the bestax extras). Import it once in your main JS/TS file:\n\n```js\nimport '@allxsmith/bestax-bulma/bestax.css';\n```\n\nPrefer stock Bulma? That works too — add `extras.css` for the bestax-only components' styles:\n\n```js\nimport 'bulma/css/bulma.min.css';\nimport '@allxsmith/bestax-bulma/extras.css';\n```\n\nMore flavors are shipped as subpath exports — prefixed classes (`versions/bestax-prefixed.css` + `<ConfigProvider classPrefix=\"bestax-\">`), no-helpers, no-dark-mode, and raw SCSS at `@allxsmith/bestax-bulma/scss/*`. See the [installation guide](https://bestax.io/docs/guides/getting-started/installation).\n\n### 3. (Optional) Add an Icon Library\n\nFive icon libraries are supported as optional peer dependencies: [Font Awesome](https://fontawesome.com/) (`@fortawesome/fontawesome-free`), Material Design Icons (`@mdi/font`), `ionicons`, `material-icons`, and `material-symbols`.\n\n```bash\nnpm install @fortawesome/fontawesome-free\n```\n\nSet the default for your whole app with [`ConfigProvider`](https://bestax.io/docs/api/helpers/config), e.g. `<ConfigProvider iconLibrary=\"fa\">`.\n\n### 4. Quick Example\n\n```tsx\nimport '@allxsmith/bestax-bulma/bestax.css';\nimport { Button } from '@allxsmith/bestax-bulma';\n\nfunction App() {\n return (\n <Button color=\"primary\" onClick={() => alert('Clicked!')}>\n Click Me\n </Button>\n );\n}\n\nexport default App;\n```\n\n### 5. Theming and Dark Mode\n\nWrap your app in [`Theme`](https://bestax.io/docs/api/helpers/theme) to override Bulma's `--bulma-*` CSS variables and control the color scheme:\n\n```tsx\nimport { Theme } from '@allxsmith/bestax-bulma';\n\n<Theme isRoot colorMode=\"system\">\n {/* colorMode: 'light' | 'dark' | 'system' */}\n <App />\n</Theme>;\n```\n\n---\n\n## ⭐ Why Choose bestax-bulma?\n\n- **Supports the latest Bulma v1.x**\n Other React Bulma libraries are stuck on Bulma 0.9.4 — bestax-bulma is built for the future.\n- **110+ components**\n All of Bulma v1, plus extras: Carousel, Dialog, Sidebar, Steps, Autocomplete, Taginput, DateInput/TimeInput/DateTimeInput pickers, and more. (Migrating from v2? Snackbar merged into [Toast](https://bestax.io/docs/api/components/toast).)\n- **Dark mode & theming built in**\n `Theme colorMode`, `--bulma-*` variable overrides, and prefixed-class builds via `ConfigProvider`.\n- **Just one dependency: Bulma**\n Every Bulma library depends on it — we ship it automatically. Clean install, fewer security concerns.\n- **Tree-shakeable ESM**\n Import only what you use; your bundler drops the rest. Modular Sass does the same for CSS, and a CJS build is there for `require`.\n- **99% unit test coverage**\n Enforced in CI by the [Vitest config](https://github.com/allxsmith/bestax/blob/main/bulma-ui/vitest.config.ts) — not just claimed.\n- **100% TypeScript**\n Full type safety for you and your team.\n- **Active developer support**\n Issues? Questions? PRs? Get fast responses and real improvements.\n\n---\n\n## 📦 NPM Package\n\nView the package on npmjs: \n👉 [https://www.npmjs.com/package/@allxsmith/bestax-bulma](https://www.npmjs.com/package/@allxsmith/bestax-bulma)\n\n---\n\n## 🔒 Hardened by default\n\nThis package is one runtime dependency deep (Bulma) and is published under a deliberately strict pipeline:\n\n- **Signed provenance** — every release carries a sigstore attestation linking the tarball to the exact commit and CI run that built it. Verify it in the **Provenance** section of the [npm page](https://www.npmjs.com/package/@allxsmith/bestax-bulma#provenance), or run `npm audit signatures` in your project.\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 package.\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---\n\n## 📚 Documentation\n\n**For full documentation, guides, and best practices, please use our official docs site:**\n\n👉 [https://bestax.io](https://bestax.io)\n\n> **Always refer to the [documentation site](https://bestax.io) first:** \n> It's the most complete and up-to-date source for everything bestax-bulma!\n\n---\n\n## 📖 Storybook\n\nExplore live, interactive component examples in our Storybook:\n\n👉 [https://bestax.io/storybook](https://bestax.io/storybook)\n\n---\n\n## 🤖 For AI Tools\n\nBuilding with an AI agent (Claude Code, Cursor, Copilot)? bestax-bulma ships LLM-optimized docs:\n\n- 📘 **[LLMs guide](https://bestax.io/docs/guides/llms)** — how to use the library with AI tools\n- 📄 **[llms.txt](https://bestax.io/llms.txt)** — curated index · **[llms-full.txt](https://bestax.io/llms-full.txt)** — the full docs in one file · every docs page is also served as raw markdown\n- 📦 **In the npm package** — the tarball ships `llms.txt`, `AGENTS.md`, and `CLAUDE.md` pointer files, so agents exploring `node_modules` land on these resources by filename\n- 🧩 **[Agent Skills](https://bestax.io/docs/skills/intro)** — teach your agent the bestax way:\n\n | Skill | Use it when… |\n | ------------------------- | -------------------------------------------------------------------------------- |\n | `bestax-layout-scaffold` | Turning a high-level request (dashboard, landing page, …) into a responsive page |\n | `bestax-form` | Building forms — Field/Control composition and the full input inventory |\n | `bestax-theming` | Customizing colors, fonts, dark mode via `Theme` and `--bulma-*` variables |\n | `bestax-custom-component` | Building a new custom component beyond stock Bulma, the bestax way |\n | `bestax-icons` | Adding icons — Icon/IconText and the five supported icon libraries |\n | `bestax-optimize` | Shrinking the built CSS — flavor builds, modular Sass, import hygiene |\n | `bestax-migrate` | Moving an app off react-bulma-components (v4) onto bestax-bulma |\n\n ```bash\n npx skills add https://github.com/allxsmith/bestax --skill bestax-layout-scaffold\n ```\n\n New projects get the skills automatically with `npm create bestax@latest my-app --skills` (plus a generated `CLAUDE.md`).\n\n---\n\n## 🙏 Attribution\n\nbestax-bulma is built on top of the incredible [Bulma](https://bulma.io) CSS framework,\n© [Jeremy Thomas](https://github.com/jgthms) and licensed under the\n[MIT License](https://github.com/jgthms/bulma/blob/main/LICENSE), whose notice ships with the\npackage in [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md). Some example content and documentation is\nadapted from the Bulma website\n([CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)), © Jeremy Thomas.\n\nIf you find Bulma useful, please consider\n[sponsoring Jeremy Thomas](https://github.com/sponsors/jgthms) to support its continued\ndevelopment.\n\n_We are not affiliated with Bulma or Jeremy Thomas in any way — we're just big fans of the\nBulma framework!_\n\n## License\n\nSource code licensed MIT\n"
232
232
  }
@@ -69,6 +69,11 @@ Rules the pattern encodes:
69
69
  dark-mode bug.
70
70
  - **Reuse `extras-*` mixins** for transitions, focus outlines, and screen-reader-only content
71
71
  instead of re-rolling them (focus style consistency is an a11y requirement).
72
+ - **A part fixed to an edge of the window adds the scroll lock's room on that side**
73
+ (`$extras-scroll-lock-offset-left` or `-right`, from `_variables.scss`) to its offset there, as
74
+ `_affix.scss` and `_toast.scss` do. While an overlay locks the page, the window grows by the
75
+ room the page's scrollbar had and the lock pads `<html>` by it, which a fixed box doesn't see,
76
+ so without it the part moves by the scrollbar's width.
72
77
  - New CSS variables should be documented in
73
78
  `skills/bestax-theming/references/css-variables.md`, and the component's rows added to
74
79
  `skills/bestax-theming/references/themeable-components.md`, in the same PR.
@@ -61,6 +61,12 @@ $extras-size-large: var(--bulma-size-large, 1.5rem);
61
61
  // Spacing
62
62
  $extras-block-spacing: var(--bulma-block-spacing, 1.5rem);
63
63
 
64
+ // The room the page's scrollbar gave back on each side while an overlay locks
65
+ // the page's scrolling, which the lock sets on `<html>`, and 0 otherwise. A
66
+ // part fixed to that edge of the window adds it to its offset there.
67
+ $extras-scroll-lock-offset-left: var(--bulma-scroll-lock-offset-left, 0px);
68
+ $extras-scroll-lock-offset-right: var(--bulma-scroll-lock-offset-right, 0px);
69
+
64
70
  // Borders and radius
65
71
  $extras-radius-small: var(--bulma-radius-small, 2px);
66
72
  $extras-radius: var(--bulma-radius, 4px);
@@ -33,15 +33,18 @@ $affix-z-index: $extras-z-index-dropdown - 1 !default;
33
33
  // stays on the right in right-to-left text. Each side adds the device's
34
34
  // safe-area inset for that edge, which is 0 unless the page sets
35
35
  // `viewport-fit=cover`. A margin from the spacing helpers adds to the
36
- // distance, since a fixed box's margin pushes it off its inset.
36
+ // distance, since a fixed box's margin pushes it off its inset. The sides
37
+ // also add the room the page's scrollbar gave back there while an overlay
38
+ // locks the page, so the Affix stays put as the scrollbar goes.
37
39
  .#{iv.$class-prefix}affix {
38
40
  position: fixed;
39
41
  z-index: cv.getVar('affix-z-index');
40
42
  // As wide as its content, and never wider than the viewport less the
41
- // offset and the safe area on both sides.
43
+ // offset, the safe area and the scrollbar's room on both sides.
42
44
  max-width: calc(
43
45
  100% - 2 * #{cv.getVar('affix-offset-horizontal')} -
44
- env(safe-area-inset-left, 0px) - env(safe-area-inset-right, 0px)
46
+ env(safe-area-inset-left, 0px) - env(safe-area-inset-right, 0px) -
47
+ #{$extras-scroll-lock-offset-left} - #{$extras-scroll-lock-offset-right}
45
48
  );
46
49
 
47
50
  &.#{iv.$class-prefix}is-top-right,
@@ -61,14 +64,16 @@ $affix-z-index: $extras-z-index-dropdown - 1 !default;
61
64
  &.#{iv.$class-prefix}is-top-right,
62
65
  &.#{iv.$class-prefix}is-bottom-right {
63
66
  right: calc(
64
- #{cv.getVar('affix-offset-horizontal')} + env(safe-area-inset-right, 0px)
67
+ #{cv.getVar('affix-offset-horizontal')} + env(safe-area-inset-right, 0px) +
68
+ #{$extras-scroll-lock-offset-right}
65
69
  );
66
70
  }
67
71
 
68
72
  &.#{iv.$class-prefix}is-top-left,
69
73
  &.#{iv.$class-prefix}is-bottom-left {
70
74
  left: calc(
71
- #{cv.getVar('affix-offset-horizontal')} + env(safe-area-inset-left, 0px)
75
+ #{cv.getVar('affix-offset-horizontal')} + env(safe-area-inset-left, 0px) +
76
+ #{$extras-scroll-lock-offset-left}
72
77
  );
73
78
  }
74
79
  }
@@ -30,3 +30,4 @@
30
30
  @use 'pagination';
31
31
  @use 'affix';
32
32
  @use 'navbar';
33
+ @use 'panel';
@@ -3,13 +3,23 @@
3
3
  // on a button with no background. Forced colors (Windows' contrast themes)
4
4
  // replaces background colors, and Chromium paints the bars in the page's
5
5
  // Canvas color, so the burger vanishes while it still works. This keeps
6
- // the bars in ButtonText. Outside forced colors it changes nothing.
6
+ // the bars in ButtonText.
7
7
  //
8
8
  // Bulma's CSS can land on either side of this partial, as it can for
9
9
  // `_delete.scss`, so the selector names its class twice to outrank Bulma's
10
10
  // `.navbar-burger span`, wherever the two load.
11
+ //
12
+ // A navbar fixed to the top or the bottom of the window (`Navbar fixed`)
13
+ // spans it. While an overlay locks the page, the window takes back the room
14
+ // the page's scrollbar had, and the lock pads the page by it, so a margin of
15
+ // that room on each side keeps the navbar over the page as the scrollbar
16
+ // goes. Outside a lock the margins are 0. A margin adds to the insets that
17
+ // place the navbar, Bulma's or an app's, and Bulma sets none on a navbar, so
18
+ // this needs no weight over Bulma's rules. `:where()` keeps it at none, so a
19
+ // margin an app gives its navbar still wins.
11
20
 
12
21
  @use 'bulma/sass/utilities/initial-variables' as iv;
22
+ @use '../variables' as *;
13
23
 
14
24
  @media (forced-colors: active) {
15
25
  .#{iv.$class-prefix}navbar-burger.#{iv.$class-prefix}navbar-burger span {
@@ -18,3 +28,11 @@
18
28
  background-color: ButtonText;
19
29
  }
20
30
  }
31
+
32
+ :where(
33
+ .#{iv.$class-prefix}navbar.#{iv.$class-prefix}is-fixed-top,
34
+ .#{iv.$class-prefix}navbar.#{iv.$class-prefix}is-fixed-bottom
35
+ ) {
36
+ margin-left: $extras-scroll-lock-offset-left;
37
+ margin-right: $extras-scroll-lock-offset-right;
38
+ }
@@ -0,0 +1,31 @@
1
+ // Bestax Extras - Panel Styles
2
+ // Bulma paints a panel's heading in the text color and writes its title in
3
+ // `text-invert`, unless the panel has a color of its own. The dark scheme
4
+ // lightens the text color but leaves `text-invert` near white, so on that
5
+ // scheme a panel with no color has white text on a light gray heading.
6
+ //
7
+ // Text is chosen to read on the page background, so the page background
8
+ // reads on text too. This gives the panel the scheme's own background
9
+ // lightness as its `text-invert`, near white on the light scheme as before
10
+ // and near black on the dark one. The heading is the only part of Bulma's
11
+ // panel that reads `text-invert`. A colored panel takes the heading's text
12
+ // from its own color's invert, so this leaves it as it is.
13
+ //
14
+ // Bulma declares `--bulma-text-invert-l` on the root and the panel's heading
15
+ // variables on the panel, which resolve `var()` against the panel's own value,
16
+ // so this reaches the heading whichever order Bulma's CSS and this partial
17
+ // load in. Something inside a panel that reads `text-invert` itself, such as
18
+ // the `has-text-text-invert` helper, gets the same value.
19
+
20
+ @use 'bulma/sass/utilities/initial-variables' as iv;
21
+ @use 'bulma/sass/utilities/css-variables' as cv;
22
+
23
+ $panel-text-invert-l: cv.getVar('scheme-main-l') !default;
24
+
25
+ .#{iv.$class-prefix}panel {
26
+ @include cv.register-vars(
27
+ (
28
+ 'text-invert-l': #{$panel-text-invert-l},
29
+ )
30
+ );
31
+ }
@@ -46,6 +46,14 @@ $toast-action-hover-opacity: 0.1 !default;
46
46
  // Toast container — positions toasts on screen and stacks multiples vertically.
47
47
  // Uses SCSS variables directly since the container is a parent of .toast
48
48
  // (CSS vars registered on .toast don't cascade up).
49
+ //
50
+ // While an overlay locks the page, the window's edges take back the room the
51
+ // page's scrollbar had, so each side adds that room and a centered stack
52
+ // moves by half of the difference: the toasts stay put as the scrollbar goes.
53
+ $-centered-left: calc(
54
+ 50% + (#{$extras-scroll-lock-offset-left} - #{$extras-scroll-lock-offset-right}) / 2
55
+ );
56
+
49
57
  .#{iv.$class-prefix}toast-container {
50
58
  position: fixed;
51
59
  z-index: #{$toast-container-z-index};
@@ -54,24 +62,27 @@ $toast-action-hover-opacity: 0.1 !default;
54
62
  gap: #{$toast-container-gap};
55
63
  padding: #{$toast-container-padding};
56
64
  pointer-events: none;
57
- max-width: 100%;
65
+ max-width: calc(
66
+ 100% - #{$extras-scroll-lock-offset-left} -
67
+ #{$extras-scroll-lock-offset-right}
68
+ );
58
69
 
59
70
  // Top positions
60
71
  &.#{iv.$class-prefix}is-top-right {
61
72
  top: 0;
62
- right: 0;
73
+ right: $extras-scroll-lock-offset-right;
63
74
  align-items: flex-end;
64
75
  }
65
76
 
66
77
  &.#{iv.$class-prefix}is-top-left {
67
78
  top: 0;
68
- left: 0;
79
+ left: $extras-scroll-lock-offset-left;
69
80
  align-items: flex-start;
70
81
  }
71
82
 
72
83
  &.#{iv.$class-prefix}is-top-center {
73
84
  top: 0;
74
- left: 50%;
85
+ left: $-centered-left;
75
86
  transform: translateX(-50%);
76
87
  align-items: center;
77
88
  }
@@ -80,21 +91,21 @@ $toast-action-hover-opacity: 0.1 !default;
80
91
  // edge as a top one grows down from the top, the first toast nearest it
81
92
  &.#{iv.$class-prefix}is-bottom-right {
82
93
  bottom: 0;
83
- right: 0;
94
+ right: $extras-scroll-lock-offset-right;
84
95
  align-items: flex-end;
85
96
  flex-direction: column-reverse;
86
97
  }
87
98
 
88
99
  &.#{iv.$class-prefix}is-bottom-left {
89
100
  bottom: 0;
90
- left: 0;
101
+ left: $extras-scroll-lock-offset-left;
91
102
  align-items: flex-start;
92
103
  flex-direction: column-reverse;
93
104
  }
94
105
 
95
106
  &.#{iv.$class-prefix}is-bottom-center {
96
107
  bottom: 0;
97
- left: 50%;
108
+ left: $-centered-left;
98
109
  transform: translateX(-50%);
99
110
  align-items: center;
100
111
  flex-direction: column-reverse;