{"_id":"@banxa-official/banxa-ui","_rev":"4-81b3f1db50b661db112ab8276ef193b1","name":"@banxa-official/banxa-ui","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@banxa-official/banxa-ui","version":"0.1.0","keywords":["vue","vue3","design-system","component-library","ui","banxa"],"author":{"name":"Banxa"},"license":"MIT","_id":"@banxa-official/banxa-ui@0.1.0","maintainers":[{"name":"banxasystem","email":"system@banxa.com"}],"homepage":"https://gitlab.com/banxa/banxa-ui#readme","bugs":{"url":"https://gitlab.com/banxa/banxa-ui/-/issues"},"dist":{"shasum":"12503f134ab1b65d03b3bda9c471f81d8df49e13","tarball":"https://registry.npmjs.org/@banxa-official/banxa-ui/-/banxa-ui-0.1.0.tgz","fileCount":36,"integrity":"sha512-pYMUMHSO0dmXTzPeBGqM/A58Wk1e14ecMg75DLh4sBziTW01cjM+s696zlW+4KGBEsZrNLl7Pu3KzpPKPCLSbw==","signatures":[{"sig":"MEUCIQCHv5QJcDUuca5B4GhUxMyHoBYEZOVv5V/yUwMORvJT/AIgGxV2OaOytgTvEOY2A+d3Zk0wWaCg9hM1U5YlxDz+uYo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166532},"main":"./dist/banxa-ui.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/banxa-ui.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/banxa-ui.es.js","default":"./dist/banxa-ui.es.js"},"./style.css":"./dist/style.css"},"gitHead":"dbf8bc4f728fce703ab3bfb0c9291dcbad5c1100","scripts":{"dev":"vite","lint":"eslint src stories --ext .vue,.ts,.js --fix","build":"vite build","storybook":"storybook dev -p 6006","typecheck":"vue-tsc --noEmit","lint:check":"eslint src stories --ext .vue,.ts,.js","postinstall":"node -e \"const fs=require('fs');const p=require('path');const src=p.resolve(__dirname,'node_modules/vite');['@storybook/builder-vite','@storybook/vue3-vite'].forEach(pkg=>{const d=p.resolve(__dirname,'../../node_modules',pkg,'node_modules');fs.mkdirSync(d,{recursive:true});const t=p.join(d,'vite');try{fs.symlinkSync(src,t)}catch(e){}})\"","test:visual":"npm run build-storybook && npx playwright test --config=tests/visual/playwright.config.ts","prepublishOnly":"npm run build","build-storybook":"storybook build","test:visual:update":"npm run build-storybook && UPDATE_BASELINES=true npx playwright test --config=tests/visual/playwright.config.ts"},"_npmUser":{"name":"banxasystem","email":"system@banxa.com"},"repository":{"url":"git+https://gitlab.com/banxa/banxa-ui.git","type":"git"},"_npmVersion":"10.9.2","description":"Banxa's Vue 3 design system — accessible, themeable components built on a CSS custom property token cascade.","directories":{},"_nodeVersion":"22.17.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","sass":"^1.49.9","vite":"^5.0.0","pngjs":"^7.0.0","vue-tsc":"^2.0.0","storybook":"^8.0.0","pixelmatch":"^5.3.0","typescript":"^5.0.0","http-server":"^14.1.1","@types/pngjs":"^6.0.0","@storybook/vue3":"^8.0.0","vite-plugin-dts":"^5.0.3","@playwright/test":"^1.45.0","@vitejs/plugin-vue":"^5.0.0","@storybook/vue3-vite":"^8.0.0","@typescript-eslint/parser":"^7.0.0","@storybook/addon-essentials":"^8.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","eslint-import-resolver-typescript":"^3.6.0"},"peerDependencies":{"vue":"^3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/banxa-ui_0.1.0_1785377264677_0.2778275441675264","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@banxa-official/banxa-ui","version":"0.1.1","keywords":["vue","vue3","design-system","component-library","ui","banxa"],"author":{"name":"Banxa"},"license":"MIT","_id":"@banxa-official/banxa-ui@0.1.1","maintainers":[{"name":"banxasystem","email":"system@banxa.com"}],"homepage":"https://gitlab.com/banxa/banxa-ui#readme","bugs":{"url":"https://gitlab.com/banxa/banxa-ui/-/issues"},"dist":{"shasum":"218a8d50801082e60904c64516f5175dd0bca46e","tarball":"https://registry.npmjs.org/@banxa-official/banxa-ui/-/banxa-ui-0.1.1.tgz","fileCount":36,"integrity":"sha512-0IXyn4Illc3AGHZyl5H6vImTlA6y/qlArFoyGroctcwkrH4frQ+T6UXbryiOp73ntFXJ+88niNRyDbidk2unaQ==","signatures":[{"sig":"MEUCIQDTo8dHApdeP576lrrChJwnIm1TtzL4gCpABU64yghiOwIgQVM5+fvXpPOYDV/28ftgc/OW4PZAgh1PsqJ2cxDmfSk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166614},"main":"./dist/banxa-ui.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/banxa-ui.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/banxa-ui.es.js","default":"./dist/banxa-ui.es.js"},"./style.css":"./dist/style.css"},"gitHead":"d19964a83fa64dec258b3bbdf8ec9cf2960b96ca","scripts":{"dev":"vite","lint":"eslint src stories --ext .vue,.ts,.js --fix","build":"vite build","storybook":"storybook dev -p 6006","typecheck":"vue-tsc --noEmit","lint:check":"eslint src stories --ext .vue,.ts,.js","postinstall":"node -e \"const fs=require('fs');const p=require('path');const src=p.resolve(__dirname,'node_modules/vite');['@storybook/builder-vite','@storybook/vue3-vite'].forEach(pkg=>{const d=p.resolve(__dirname,'../../node_modules',pkg,'node_modules');fs.mkdirSync(d,{recursive:true});const t=p.join(d,'vite');try{fs.symlinkSync(src,t)}catch(e){}})\"","test:visual":"npm run build-storybook && npx playwright test --config=tests/visual/playwright.config.ts","prepublishOnly":"npm run build","build-storybook":"storybook build","test:visual:update":"npm run build-storybook && UPDATE_BASELINES=true npx playwright test --config=tests/visual/playwright.config.ts"},"_npmUser":{"name":"banxasystem","email":"system@banxa.com"},"repository":{"url":"git+https://gitlab.com/banxa/banxa-ui.git","type":"git"},"_npmVersion":"10.9.2","description":"Banxa's Vue 3 design system — accessible, themeable components built on a CSS custom property token cascade.","directories":{},"_nodeVersion":"22.17.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","sass":"^1.49.9","vite":"^5.0.0","pngjs":"^7.0.0","vue-tsc":"^2.0.0","storybook":"^8.0.0","pixelmatch":"^5.3.0","typescript":"^5.0.0","http-server":"^14.1.1","@types/pngjs":"^6.0.0","@storybook/vue3":"^8.0.0","vite-plugin-dts":"^5.0.3","@playwright/test":"^1.45.0","@vitejs/plugin-vue":"^5.0.0","@storybook/vue3-vite":"^8.0.0","@typescript-eslint/parser":"^7.0.0","@storybook/addon-essentials":"^8.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","eslint-import-resolver-typescript":"^3.6.0"},"peerDependencies":{"vue":"^3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/banxa-ui_0.1.1_1785380011224_0.5688546639083059","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@banxa-official/banxa-ui","version":"0.1.2","keywords":["vue","vue3","design-system","component-library","ui","banxa"],"author":{"name":"Banxa"},"license":"MIT","_id":"@banxa-official/banxa-ui@0.1.2","maintainers":[{"name":"banxasystem","email":"system@banxa.com"}],"homepage":"https://gitlab.com/banxa/applications/banxa-ui#readme","bugs":{"url":"https://gitlab.com/banxa/applications/banxa-ui/-/issues"},"dist":{"shasum":"3c0b85d294b8d7a2740be204e9451b716d6394a2","tarball":"https://registry.npmjs.org/@banxa-official/banxa-ui/-/banxa-ui-0.1.2.tgz","fileCount":41,"integrity":"sha512-KkODJVBJLArMcmjo0RVFICrids/GMuqE4J3x2qP1iY5w4GJYkskGNSYwUBjJKDFnGaH6JiJMJhGASDxDhmsq5Q==","signatures":[{"sig":"MEUCIQDRJGCTGnj3gXAGlKnqmXBqOAiBdMFHo+sFRJzpAerQKwIgQXmD3tIQwwmbU0T2fC35hc8ZC3gw19+/gwyL574t1i8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEcA40x6KHfmD53eva29GAPJK7UTv0mQxqFjrnY5XzHBAiBkFCtXN6cnddA8UTxR9APuqjW6w0x1hLNEB27V6VIu7Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":234580},"main":"./dist/banxa-ui.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/banxa-ui.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/banxa-ui.es.js","default":"./dist/banxa-ui.es.js"},"./style.css":"./dist/style.css"},"gitHead":"5bba427ecce38fe1d33dfedb7cfc390a194e5329","scripts":{"dev":"vite","lint":"eslint src stories --ext .vue,.ts,.js --fix","test":"vitest run","build":"vite build && node scripts/copy-landing-page.mjs","storybook":"storybook dev -p 6006","typecheck":"vue-tsc --noEmit","lint:check":"eslint src stories --ext .vue,.ts,.js","test:watch":"vitest","postinstall":"node -e \"const fs=require('fs');const p=require('path');const src=p.resolve(__dirname,'node_modules/vite');['@storybook/builder-vite','@storybook/vue3-vite'].forEach(pkg=>{const d=p.resolve(__dirname,'../../node_modules',pkg,'node_modules');fs.mkdirSync(d,{recursive:true});const t=p.join(d,'vite');try{fs.symlinkSync(src,t)}catch(e){}})\"","test:visual":"npm run build-storybook && npx playwright test --config=tests/visual/playwright.config.ts","prepublishOnly":"npm run build","build-storybook":"storybook build","test:visual:update":"npm run build-storybook && UPDATE_BASELINES=true npx playwright test --config=tests/visual/playwright.config.ts"},"_npmUser":{"name":"banxasystem","email":"system@banxa.com"},"repository":{"url":"git+https://gitlab.com/banxa/applications/banxa-ui.git","type":"git"},"_npmVersion":"10.9.2","description":"Banxa's Vue 3 design system — accessible, themeable components built on a CSS custom property token cascade.","directories":{},"_nodeVersion":"22.17.1","dependencies":{"dompurify":"^3.4.15"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","sass":"^1.49.9","vite":"^5.0.0","jsdom":"25.0.1","pngjs":"^7.0.0","eslint":"8.57.1","vitest":"3.2.7","vue-tsc":"^2.0.0","storybook":"^8.0.0","pixelmatch":"^5.3.0","typescript":"^5.0.0","http-server":"^14.1.1","@types/pngjs":"^6.0.0","@storybook/vue3":"^8.0.0","@vue/test-utils":"2.4.6","vite-plugin-dts":"^5.0.3","@playwright/test":"^1.45.0","@types/dompurify":"^3.0.5","eslint-plugin-vue":"9.33.0","@vitejs/plugin-vue":"^5.0.0","@storybook/vue3-vite":"^8.0.0","eslint-plugin-import":"2.32.0","@typescript-eslint/parser":"^7.0.0","@storybook/addon-essentials":"^8.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","eslint-import-resolver-typescript":"^3.6.0"},"peerDependencies":{"vue":"^3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/banxa-ui_0.1.2_1790124579249_0.8843390243336409","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"_id":"@banxa-official/banxa-ui@0.2.0","bugs":{"url":"https://gitlab.com/banxa/applications/banxa-ui/-/issues"},"dist":{"shasum":"60b074fe472eab5b99e68f5b036bafec76a1d766","tarball":"https://registry.npmjs.org/@banxa-official/banxa-ui/-/banxa-ui-0.2.0.tgz","fileCount":41,"integrity":"sha512-hz4kg+2KcrwuYmXneeuKv8t/mSRuocHwlNRDYrAXLJ//rSNz+28WuvRXLd8SwhT3enQjGuO/EnJkmMRq/wOSMQ==","signatures":[{"sig":"MEQCIC0l7UNmgZNSeVTrx2nOzSwFqhjKjDc9AQz1xbfFithSAiByH4U0gu6ItuzNF//VStyPEa62ykrI8wCdyxNexAtofw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGzPxWLlYd5paYUpUo2Drh4tzRkLjAAiYGjU5liyCHxIAiBQgSb9w0m7hg4cns5M17ujdFIz1wPwgcFpm5MLVdKW0A=="}],"unpackedSize":234306},"main":"./dist/banxa-ui.es.js","name":"@banxa-official/banxa-ui","type":"module","types":"./dist/index.d.ts","author":{"name":"Banxa"},"module":"./dist/banxa-ui.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/banxa-ui.es.js","default":"./dist/banxa-ui.es.js"},"./style.css":"./dist/style.css"},"gitHead":"e731699e5484ab4883decc3648d9ff3424f40871","license":"MIT","scripts":{"dev":"vite","lint":"eslint src stories --ext .vue,.ts,.js --fix","test":"vitest run","build":"vite build && node scripts/copy-landing-page.mjs","storybook":"storybook dev -p 6006","typecheck":"vue-tsc --noEmit","lint:check":"eslint src stories --ext .vue,.ts,.js","test:watch":"vitest","postinstall":"node -e \"const fs=require('fs');const p=require('path');const src=p.resolve(__dirname,'node_modules/vite');['@storybook/builder-vite','@storybook/vue3-vite'].forEach(pkg=>{const d=p.resolve(__dirname,'../../node_modules',pkg,'node_modules');fs.mkdirSync(d,{recursive:true});const t=p.join(d,'vite');try{fs.symlinkSync(src,t)}catch(e){}})\"","test:visual":"npm run build-storybook && npx playwright test --config=tests/visual/playwright.config.ts","prepublishOnly":"npm run build","build-storybook":"storybook build","test:visual:update":"npm run build-storybook && UPDATE_BASELINES=true npx playwright test --config=tests/visual/playwright.config.ts"},"version":"0.2.0","_npmUser":{"name":"banxasystem","email":"system@banxa.com"},"homepage":"https://gitlab.com/banxa/applications/banxa-ui#readme","keywords":["vue","vue3","design-system","component-library","ui","banxa"],"repository":{"url":"git+https://gitlab.com/banxa/applications/banxa-ui.git","type":"git"},"_npmVersion":"10.9.2","description":"Banxa's Vue 3 design system — accessible, themeable components built on a CSS custom property token cascade.","directories":{},"maintainers":[{"name":"banxasystem","email":"system@banxa.com"}],"_nodeVersion":"22.17.1","dependencies":{"dompurify":"^3.4.15"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","sass":"^1.49.9","vite":"^5.0.0","jsdom":"25.0.1","pngjs":"^7.0.0","eslint":"8.57.1","vitest":"3.2.7","vue-tsc":"^2.0.0","storybook":"^8.0.0","pixelmatch":"^5.3.0","typescript":"^5.0.0","http-server":"^14.1.1","@types/pngjs":"^6.0.0","@storybook/vue3":"^8.0.0","@vue/test-utils":"2.4.6","vite-plugin-dts":"^5.0.3","@playwright/test":"^1.45.0","@types/dompurify":"^3.0.5","eslint-plugin-vue":"9.33.0","@vitejs/plugin-vue":"^5.0.0","@storybook/vue3-vite":"^8.0.0","eslint-plugin-import":"2.32.0","@typescript-eslint/parser":"^7.0.0","@storybook/addon-essentials":"^8.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","eslint-import-resolver-typescript":"^3.6.0"},"peerDependencies":{"vue":"^3.2.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/banxa-ui_0.2.0_1790218039302_0.1572032916345827"}}},"time":{"created":"2026-07-30T02:07:44.561Z","modified":"2026-09-24T02:47:19.602Z","0.1.0":"2026-07-30T02:07:44.834Z","0.1.1":"2026-07-30T02:53:31.372Z","0.1.2":"2026-09-23T00:49:39.333Z","0.2.0":"2026-09-24T02:47:19.419Z"},"bugs":{"url":"https://gitlab.com/banxa/applications/banxa-ui/-/issues"},"author":{"name":"Banxa"},"license":"MIT","homepage":"https://gitlab.com/banxa/applications/banxa-ui#readme","keywords":["vue","vue3","design-system","component-library","ui","banxa"],"repository":{"url":"git+https://gitlab.com/banxa/applications/banxa-ui.git","type":"git"},"description":"Banxa's Vue 3 design system — accessible, themeable components built on a CSS custom property token cascade.","maintainers":[{"name":"banxasystem","email":"system@banxa.com"}],"readme":"# @banxa-official/banxa-ui\n\nBanxa's Vue 3 design system — a set of accessible, themeable UI components built on a\nthree-tier CSS custom property token cascade (primitives → semantic → component), with\nfirst-class TypeScript support and a dark-mode-first theme that can be fully overridden\nby consuming applications.\n\n## Installation\n\n```bash\nnpm install @banxa-official/banxa-ui\n```\n\n`vue` (`^3.2.0`) is a peer dependency and must already be installed in your project.\n\n## Getting started\n\nImport the components you need and the stylesheet once, globally, in your app's entry point:\n\n```js\n// main.js / main.ts\nimport { createApp } from 'vue'\nimport App from './App.vue'\nimport '@banxa-official/banxa-ui/style.css'\n\ncreateApp(App).mount('#app')\n```\n\nThen use components directly in your `.vue` files:\n\n```vue\n<script setup>\nimport { ref } from 'vue'\nimport { BxButton, BxInput } from '@banxa-official/banxa-ui'\n\nconst email = ref('')\n</script>\n\n<template>\n  <BxInput v-model=\"email\" label=\"Email address\" placeholder=\"you@example.com\" />\n  <BxButton variant=\"primary\" @click=\"submit\">Continue</BxButton>\n</template>\n```\n\nOnly import what you use — the library is tree-shakeable, so unused components are\ndropped from your production bundle.\n\n### Available components\n\n| Category   | Components |\n|------------|------------|\n| Foundation | `BxButton`, `BxIcon`, `BxDivider`, `BxBadge` |\n| Form       | `BxInput`, `BxSelect`, `BxSelectField`, `BxCombobox`, `BxCheckbox`, `BxRadio`, `BxSwitch`, `BxOtpInput` |\n| Feedback   | `BxAlert`, `BxToast`, `BxProgress`, `BxSpinner`, `BxDots`, `BxSkeleton` |\n| Surface    | `BxCard`, `BxModal`, `BxTooltip`, `BxDescriptionList` |\n| Navigation | `BxDropdownMenu`, `BxDropdownMenuItem`, `BxTabs` |\n| Composite  | `BxCollapsible` |\n\nBrowse every component, prop, and variant interactively in [Storybook](#storybook).\n\n## Theming\n\nComponents never hardcode colours — every visual token is a CSS custom property, applied\nat three tiers:\n\n1. **Primitives** — raw palette/scale values (`--space-16`, `--radius-standard`, ...)\n2. **Semantic** — what things *mean* (`--fills-cta`, `--fills-background`, `--fills-alert-error`, ...)\n3. **Component** — per-component hooks for narrow overrides (`--bx-button-bg`, ...)\n\nThe library ships dark mode by default (tokens on `:root`) and a light mode you opt into\nby adding a `.lightmode` class to any ancestor element (typically `<html>` or `<body>`):\n\n```js\ndocument.documentElement.classList.toggle('lightmode', isLightMode)\n```\n\n### Overriding colours (brand/merchant theming)\n\nBecause every token is a real CSS custom property, a host application can override the\nwhole palette without touching component code — just redeclare the variables on an\nancestor element, after the library's stylesheet has loaded:\n\n```css\n:root {\n  --fills-cta: #ff5a1f;\n  --fills-cta-hover: #e64f1a;\n  --fills-cta-active: #cc4517;\n  --fills-cta-foreground: #ffffff;\n  --fills-background: #0b0b0d;\n}\n```\n\nThis works because CSS custom properties resolve via normal inheritance: a declaration on\na container element always wins over an inherited value from `:root`, regardless of\nstylesheet load order — so it's safe to apply per-tenant/per-merchant theming at runtime\n(e.g. via `element.style.setProperty('--fills-cta', merchantColor)`).\n\n## TypeScript support\n\nThe package ships its own type declarations (`dist/index.d.ts`, generated from source) —\nno `@types/*` package needed. Component prop types, emitted event types, exported\ncomposables, and shared types are all available out of the box:\n\n```ts\nimport { BxSelect } from '@banxa-official/banxa-ui'\nimport type { SelectOption } from '@banxa-official/banxa-ui'\n\nconst options: SelectOption[] = [\n  { label: 'USD', value: 'usd' },\n  { label: 'EUR', value: 'eur' }\n]\n```\n\n`moduleResolution: \"bundler\"` or `\"node16\"`/`\"nodenext\"` (TS ≥ 4.7) is recommended so the\npackage's `exports` map resolves correctly. If you're on an older `moduleResolution`\nsetting and see \"cannot find module\" errors, upgrading `moduleResolution` is the fix —\nthis is a TypeScript project-config issue, not a missing dependency.\n\n## Error handling\n\nBanxa UI surfaces problems in two different ways depending on whether they're part of\nyour app's normal control flow or a mistake in how a component is used:\n\n- **Validation / user-facing errors** are just props — there's no exceptions to catch.\n  Pass an `error` message (or boolean, depending on the component) and the component\n  renders its error styling and, where applicable, wires up `aria-describedby` /\n  `role=\"alert\"` for screen readers:\n\n  ```vue\n  <BxInput v-model=\"email\" label=\"Email\" :error=\"emailError\" />\n  <BxButton variant=\"outlined\" error>Delete account</BxButton>\n  ```\n\n- **Developer-facing warnings** (deprecated props/slots, unknown icon names, etc.) are\n  logged via `console.warn` and are automatically stripped out of production builds\n  (`import.meta.env.DEV` guarded), so they never ship to end users:\n\n  ```\n  [BxInput] \"hint\" is deprecated. Use \"description\" instead.\n  [BxIcon] Unknown icon name: \"not-a-real-icon\". Register it in registry.ts.\n  ```\n\n  Treat these as build-time linting signals — fix them before shipping, not something\n  to handle at runtime.\n\nComponents do not throw during normal rendering; malformed input (e.g. an unrecognised\nicon name) degrades gracefully (renders nothing / falls back) rather than crashing your app.\n\n## Storybook\n\nEvery component includes a Storybook entry with variants, a dark/light theme toggle, and\naccessibility checks.\n\n```bash\nnpm install\nnpm run storybook\n```\n\n## Development\n\n```bash\nnpm run dev              # Vite dev server\nnpm run build             # Build the library (dist/)\nnpm run typecheck         # vue-tsc\nnpm run lint               # ESLint with --fix\nnpm run lint:check        # ESLint, no autofix (CI)\nnpm run test:visual        # Playwright visual regression tests against Storybook\n```\n\n## Browser support\n\nTargets evergreen browsers (Chrome, Firefox, Safari, Edge — last 2 versions). No IE11 support.\n\n## Contributing\n\nIssues and merge requests are welcome. Please run `npm run lint:check`, `npm run typecheck`,\nand `npm run test:visual` before opening a merge request.\n\n## License\n\n[MIT](./LICENSE)\n","readmeFilename":"README.md"}