{"_id":"@einhasad-vue/form-builder-vue","_rev":"4-d7b86e49d81a63d2778f93f51e7ace4f","name":"@einhasad-vue/form-builder-vue","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@einhasad-vue/form-builder-vue","version":"0.1.0","keywords":["vue","vue3","form","form-builder","drag-and-drop","form-designer"],"author":{"name":"Dmytro Popov"},"license":"MIT","_id":"@einhasad-vue/form-builder-vue@0.1.0","maintainers":[{"name":"do-popov","email":"loss.of.loss@gmail.com"}],"homepage":"https://github.com/einhasad/form-builder-vue#readme","bugs":{"url":"https://github.com/einhasad/form-builder-vue/issues"},"dist":{"shasum":"324768ed893cb828370faef3b12f9a8811105f97","tarball":"https://registry.npmjs.org/@einhasad-vue/form-builder-vue/-/form-builder-vue-0.1.0.tgz","fileCount":7,"integrity":"sha512-IZzolewzyDFmvoUGd/BXgQ7ficz1JvX4cShSV/MLKzAlf7Yif5h8/ACvWuvEaoU5p4mdKbIi5YhJaD1c2P7Whw==","signatures":[{"sig":"MEUCIQC9/y+vbI5Az70wtqCavdsqdvwuWBX8ICHRS3A8Nvmx5wIgGiZtyFETspZLExyk+EGLkidSgIA/fgXwMJCVwsHtj+c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":162271},"main":"./dist/form-builder-vue.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/form-builder-vue.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/form-builder-vue.js","require":"./dist/form-builder-vue.umd.cjs"},"./style.css":"./dist/form-builder-vue.css"},"gitHead":"7b19b2b1dbcf8cfc9717366a822758c4d214fe1a","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","lint:fix":"eslint . --fix","test:e2e":"playwright test","typecheck":"vue-tsc --noEmit -p tsconfig.build.json","test:watch":"vitest","test:e2e:ui":"playwright test --ui","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","test:e2e:install":"playwright install --with-deps chromium","test:e2e:external":"playwright test --config=playwright.external.config.ts"},"_npmUser":{"name":"do-popov","email":"loss.of.loss@gmail.com"},"repository":{"url":"git+https://github.com/einhasad/form-builder-vue.git","type":"git"},"_npmVersion":"10.9.7","description":"Vue 3 form builder library — drag-and-drop form creation, no jQuery dependency","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","vite":"^6.3.2","jsdom":"^26.1.0","eslint":"^9.24.0","vitest":"^3.1.2","vue-tsc":"^2.2.8","typescript":"^5.8.3","@types/node":"^25.6.0","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.3","@playwright/test":"^1.59.1","eslint-plugin-vue":"^10.0.0","typescript-eslint":"^8.58.2","@vitejs/plugin-vue":"^5.2.3","@vitest/coverage-v8":"^3.1.2","@vue/eslint-config-typescript":"^14.5.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/form-builder-vue_0.1.0_1776843833775_0.2183992899241367","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@einhasad-vue/form-builder-vue","version":"0.2.0","keywords":["vue","vue3","vue-component","form","forms","form-builder","form-designer","form-generator","dynamic-form","schema-builder","json-schema-form","drag-and-drop","drag-drop","typescript","no-jquery"],"author":{"name":"Dmytro Popov"},"license":"MIT","_id":"@einhasad-vue/form-builder-vue@0.2.0","maintainers":[{"name":"do-popov","email":"loss.of.loss@gmail.com"}],"homepage":"https://github.com/einhasad/form-builder-vue#readme","bugs":{"url":"https://github.com/einhasad/form-builder-vue/issues"},"dist":{"shasum":"898a0ab5d192bf24c125db9c17450ff32c59b94e","tarball":"https://registry.npmjs.org/@einhasad-vue/form-builder-vue/-/form-builder-vue-0.2.0.tgz","fileCount":10,"integrity":"sha512-YsDKAjo3+0RDrQxvO3aRDFqaobsNPpWSiMSJQZNudoBJTfDZP54Nz3O5dww9Toc7irqslygwxqNooS+38SM79w==","signatures":[{"sig":"MEUCIQDIpW75LwpJEAsTMHUCrOzJxEozI55BrWdAX+Qze9wdCwIgfA+yGd6Kx9h6AbnRX+LEi3TGtveYyv8X/ZPrflMHpbc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173082},"main":"./dist/form-builder-vue.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/form-builder-vue.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/form-builder-vue.js","require":"./dist/form-builder-vue.umd.cjs"},"./style.css":"./dist/form-builder-vue.css"},"gitHead":"c25cbc165b69109c982e73cb3b7e3b0df800659d","scripts":{"dev":"vite --config vite.demo.config.ts","lint":"eslint .","test":"vitest run","build":"vite build","demo:dev":"vite --config vite.demo.config.ts","lint:fix":"eslint . --fix","test:e2e":"playwright test","typecheck":"vue-tsc --noEmit -p tsconfig.build.json","demo:build":"vite build --config vite.demo.config.ts","test:watch":"vitest","test:e2e:ui":"playwright test --ui","demo:preview":"vite preview --config vite.demo.config.ts","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","test:e2e:install":"playwright install --with-deps chromium","test:e2e:external":"playwright test --config=playwright.external.config.ts"},"_npmUser":{"name":"do-popov","email":"loss.of.loss@gmail.com"},"repository":{"url":"git+https://github.com/einhasad/form-builder-vue.git","type":"git"},"_npmVersion":"10.9.7","description":"Vue 3 form builder library — drag-and-drop form creation, no jQuery dependency","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","vite":"^6.3.2","jsdom":"^26.1.0","eslint":"^9.24.0","vitest":"^3.1.2","vue-tsc":"^2.2.8","typescript":"^5.8.3","@types/node":"^25.6.0","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.3","@playwright/test":"^1.59.1","eslint-plugin-vue":"^10.0.0","typescript-eslint":"^8.58.2","@vitejs/plugin-vue":"^5.2.3","@vitest/coverage-v8":"^3.1.2","@vue/eslint-config-typescript":"^14.5.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/form-builder-vue_0.2.0_1776895555136_0.6242348736728682","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@einhasad-vue/form-builder-vue","version":"0.2.1","keywords":["vue","vue3","vue-component","form","forms","form-builder","form-designer","form-generator","dynamic-form","schema-builder","json-schema-form","drag-and-drop","drag-drop","typescript","no-jquery"],"author":{"name":"Dmytro Popov"},"license":"MIT","_id":"@einhasad-vue/form-builder-vue@0.2.1","maintainers":[{"name":"do-popov","email":"loss.of.loss@gmail.com"}],"homepage":"https://github.com/einhasad/form-builder-vue#readme","bugs":{"url":"https://github.com/einhasad/form-builder-vue/issues"},"dist":{"shasum":"413a64fe8fdc76d1c3f6fd589c611d70ede0127c","tarball":"https://registry.npmjs.org/@einhasad-vue/form-builder-vue/-/form-builder-vue-0.2.1.tgz","fileCount":10,"integrity":"sha512-7igb7j5OdsH/eGmDClWlVB0LXKMy2aA062RMbmXrwstXFPSX4fnjHIbej1mZfW9sH9CX/wTNiUB24R0l1zInag==","signatures":[{"sig":"MEUCIQCOFzJyQcrYMdIKrjZeoJlTRNZrH9L2TvkOk+y4Py4doAIgJwXlEHcxAZ0CUmMeG59oA2eT/N8yY+DpmF+3i+crpAQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173381},"main":"./dist/form-builder-vue.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/form-builder-vue.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/form-builder-vue.js","require":"./dist/form-builder-vue.umd.cjs"},"./style.css":"./dist/form-builder-vue.css"},"gitHead":"c25cbc165b69109c982e73cb3b7e3b0df800659d","scripts":{"dev":"vite --config vite.demo.config.ts","lint":"eslint .","test":"vitest run","build":"vite build","demo:dev":"vite --config vite.demo.config.ts","lint:fix":"eslint . --fix","test:e2e":"playwright test","typecheck":"vue-tsc --noEmit -p tsconfig.build.json","demo:build":"vite build --config vite.demo.config.ts","test:watch":"vitest","test:e2e:ui":"playwright test --ui","demo:preview":"vite preview --config vite.demo.config.ts","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","test:e2e:install":"playwright install --with-deps chromium","test:e2e:external":"playwright test --config=playwright.external.config.ts"},"_npmUser":{"name":"do-popov","email":"loss.of.loss@gmail.com"},"repository":{"url":"git+https://github.com/einhasad/form-builder-vue.git","type":"git"},"_npmVersion":"10.9.7","description":"Vue 3 form builder library — drag-and-drop form creation, no jQuery dependency","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","vite":"^6.3.2","jsdom":"^26.1.0","eslint":"^9.24.0","vitest":"^3.1.2","vue-tsc":"^2.2.8","typescript":"^5.8.3","@types/node":"^25.6.0","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.3","@playwright/test":"^1.59.1","eslint-plugin-vue":"^10.0.0","typescript-eslint":"^8.58.2","@vitejs/plugin-vue":"^5.2.3","@vitest/coverage-v8":"^3.1.2","@vue/eslint-config-typescript":"^14.5.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/form-builder-vue_0.2.1_1776895888061_0.005329588917829531","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@einhasad-vue/form-builder-vue","version":"0.3.0","description":"Vue 3 form builder library — drag-and-drop form creation, no jQuery dependency","keywords":["vue","vue3","vue-component","form","forms","form-builder","form-designer","form-generator","dynamic-form","schema-builder","json-schema-form","drag-and-drop","drag-drop","typescript","no-jquery"],"homepage":"https://github.com/einhasad/form-builder-vue#readme","bugs":{"url":"https://github.com/einhasad/form-builder-vue/issues"},"license":"MIT","author":{"name":"Dmytro Popov"},"repository":{"type":"git","url":"git+https://github.com/einhasad/form-builder-vue.git"},"type":"module","main":"./dist/form-builder-vue.umd.cjs","module":"./dist/form-builder-vue.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/form-builder-vue.js","require":"./dist/form-builder-vue.umd.cjs"},"./style.css":"./dist/form-builder-vue.css"},"sideEffects":["**/*.css"],"publishConfig":{"access":"public"},"scripts":{"dev":"vite --config vite.demo.config.ts","build":"vite build","demo:dev":"vite --config vite.demo.config.ts","demo:build":"vite build --config vite.demo.config.ts","demo:preview":"vite preview --config vite.demo.config.ts","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","test:e2e":"playwright test","test:e2e:ui":"playwright test --ui","test:e2e:external":"playwright test --config=playwright.external.config.ts","test:e2e:install":"playwright install --with-deps chromium","typecheck":"vue-tsc --noEmit -p tsconfig.build.json","lint":"eslint .","lint:fix":"eslint . --fix","prepublishOnly":"npm run build"},"peerDependencies":{"vue":"^3.5.0"},"engines":{"node":">=18"},"devDependencies":{"@playwright/test":"^1.59.1","@types/node":"^25.6.0","@vitejs/plugin-vue":"^5.2.3","@vitest/coverage-v8":"^3.1.2","@vue/eslint-config-typescript":"^14.5.0","@vue/test-utils":"^2.4.6","eslint":"^9.24.0","eslint-plugin-vue":"^10.0.0","jsdom":"^26.1.0","typescript":"^5.8.3","typescript-eslint":"^8.58.2","vite":"^6.3.2","vite-plugin-dts":"^4.5.3","vitest":"^3.1.2","vue":"^3.5.13","vue-tsc":"^2.2.8"},"_id":"@einhasad-vue/form-builder-vue@0.3.0","gitHead":"a71fe8523b9f5ffa9f744e65ba94dcd6c154beb9","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-+nHi7DSBK8zlCLwfUXYy1euQUguC9LSXl1RZBWwoXIpp6+OhGub7iNNh753i9JGf6Whr6hTifoiiQ/zmFl41xQ==","shasum":"79cf83adff5fff1b11681ddf6efbb01dceef9e52","tarball":"https://registry.npmjs.org/@einhasad-vue/form-builder-vue/-/form-builder-vue-0.3.0.tgz","fileCount":10,"unpackedSize":178832,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDsSoMnaOXGxAEX4T78ilMUNqGYllKZ9Vz7ZVh2jiLHOAIhAItAnNfee33yzcGTBZ6kB1CHGwPEN8edc91tB2WYQQkP"}]},"_npmUser":{"name":"do-popov","email":"loss.of.loss@gmail.com"},"directories":{},"maintainers":[{"name":"do-popov","email":"loss.of.loss@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/form-builder-vue_0.3.0_1776899265081_0.28247299018930194"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-22T07:43:53.646Z","modified":"2026-04-22T23:07:45.366Z","0.1.0":"2026-04-22T07:43:53.932Z","0.2.0":"2026-04-22T22:05:55.275Z","0.2.1":"2026-04-22T22:11:28.216Z","0.3.0":"2026-04-22T23:07:45.236Z"},"bugs":{"url":"https://github.com/einhasad/form-builder-vue/issues"},"author":{"name":"Dmytro Popov"},"license":"MIT","homepage":"https://github.com/einhasad/form-builder-vue#readme","keywords":["vue","vue3","vue-component","form","forms","form-builder","form-designer","form-generator","dynamic-form","schema-builder","json-schema-form","drag-and-drop","drag-drop","typescript","no-jquery"],"repository":{"type":"git","url":"git+https://github.com/einhasad/form-builder-vue.git"},"description":"Vue 3 form builder library — drag-and-drop form creation, no jQuery dependency","maintainers":[{"name":"do-popov","email":"loss.of.loss@gmail.com"}],"readme":"# Vue 3 Form Builder\n\nDrag-and-drop form builder and renderer for Vue 3 — TypeScript-first, zero jQuery, zero runtime dependencies.\n\n[![npm version](https://img.shields.io/npm/v/@einhasad-vue/form-builder-vue.svg?logo=npm)](https://www.npmjs.com/package/@einhasad-vue/form-builder-vue)\n[![npm downloads](https://img.shields.io/npm/dm/@einhasad-vue/form-builder-vue.svg)](https://www.npmjs.com/package/@einhasad-vue/form-builder-vue)\n[![bundle size](https://img.shields.io/bundlephobia/minzip/@einhasad-vue/form-builder-vue?label=gzipped)](https://bundlephobia.com/package/@einhasad-vue/form-builder-vue)\n[![types](https://img.shields.io/npm/types/@einhasad-vue/form-builder-vue)](https://www.npmjs.com/package/@einhasad-vue/form-builder-vue)\n[![CI](https://github.com/einhasad/form-builder-vue/actions/workflows/ci.yml/badge.svg)](https://github.com/einhasad/form-builder-vue/actions/workflows/ci.yml)\n[![license](https://img.shields.io/npm/l/@einhasad-vue/form-builder-vue.svg)](./LICENSE)\n[![coverage](https://img.shields.io/badge/coverage-100%25-brightgreen)](./vite.config.ts)\n\n## Size\n\nMeasured against `@einhasad-vue/form-builder-vue@0.1.0` on a clean install. **`vue` is a peer dependency — the numbers below are the delta you pay on top of an existing Vue app**; Vue's own runtime (~11 KB gzip) is not counted because your app already has it. CSS is required for the builder's drag preview; the renderer works without it.\n\n### What actually reaches the browser\n\n| Import | Raw (min) | gzip | brotli |\n|---|---:|---:|---:|\n| `FormBuilder` + `FormRenderer` (everything) | 45 KB | **~12 KB** | ~11 KB |\n| `FormRenderer` only (tree-shaken) | 22 KB | **~6 KB** | ~5 KB |\n| `form-builder-vue.css` (required for builder UI) | 20 KB | **~3.5 KB** | ~3 KB |\n\nMeasured by bundling a consumer with `esbuild --bundle --minify` and `vue` marked external.\n\n### What npm puts on disk\n\n| | Size |\n|---|---:|\n| Tarball downloaded from the registry | **~38 KB** |\n| `node_modules/@einhasad-vue/form-builder-vue/` (ESM + UMD + CSS + `.d.ts`) | **~172 KB** |\n\nZero runtime dependencies — nothing transitive gets pulled in. Library is ESM, so modern bundlers tree-shake unused exports.\n\n## Features\n\n- Drag-and-drop form builder with live preview\n- 16 built-in field types (text, select, checkbox-group, radio-group, date, file, header, paragraph, etc.)\n- Form renderer for displaying saved forms and collecting user input\n- v-model support on both builder and renderer\n- Fully typed with TypeScript\n- Customizable via options (disable fields, custom attrs, i18n, action buttons)\n- Scoped styles, no global CSS pollution\n- Zero jQuery dependency\n\n## Installation\n\n```bash\nnpm install @einhasad-vue/form-builder-vue\n```\n\nRequires Vue 3.5+ as a peer dependency.\n\n## Usage\n\n### Form Builder\n\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { FormBuilder } from '@einhasad-vue/form-builder-vue'\nimport type { FormDataField } from '@einhasad-vue/form-builder-vue'\n\nconst formData = ref<FormDataField[]>([])\n</script>\n\n<template>\n  <FormBuilder v-model=\"formData\" />\n</template>\n```\n\n### Form Renderer\n\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { FormRenderer } from '@einhasad-vue/form-builder-vue'\nimport type { FormDataField, UserDataMap } from '@einhasad-vue/form-builder-vue'\n\nconst formData = ref<FormDataField[]>([/* saved form data */])\nconst userData = ref<UserDataMap>({})\n</script>\n\n<template>\n  <FormRenderer\n    :form-data=\"formData\"\n    v-model=\"userData\"\n  />\n</template>\n```\n\n## API\n\n### FormBuilder Props\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| `modelValue` | `FormDataField[]` | `[]` | Form fields (v-model) |\n| `options` | `Partial<BuilderOptions>` | `{}` | Configuration overrides |\n\n### FormBuilder Events\n\n| Event | Payload | Description |\n|-------|---------|-------------|\n| `update:modelValue` | `FormDataField[]` | Fields changed |\n| `field-added` | `{ fieldId, field }` | Field added |\n| `field-removed` | `{ fieldId, field }` | Field removed |\n| `field-updated` | `{ fieldId, field }` | Field updated |\n| `field-moved` | `{ fieldId, fromIndex, toIndex }` | Field reordered |\n| `field-selected` | `{ fieldId }` | Field selected for editing |\n| `save` | `{ formData }` | Save button clicked |\n| `clear` | — | Clear button clicked |\n| `loaded` | — | Builder mounted |\n\n### FormBuilder Exposed Methods\n\n| Method | Description |\n|--------|-------------|\n| `getData()` | Get current form data array |\n| `setData(fields)` | Set form data |\n| `addField(field)` | Add a new field |\n| `removeField(id)` | Remove field by id |\n| `clearFields()` | Remove all fields |\n| `save()` | Returns current form data |\n\n### FormRenderer Props\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| `formData` | `FormDataField[]` | `[]` | Field definitions to render |\n| `modelValue` | `UserDataMap` | `{}` | User answers (v-model) |\n| `options` | `Partial<RendererOptions>` | `{}` | Configuration overrides |\n| `disabled` | `boolean` | `false` | Disable all inputs |\n\n### BuilderOptions\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `controlPosition` | `'left' \\| 'right'` | `'left'` | Control panel side |\n| `disableFields` | `FieldType[]` | `[]` | Field types to hide |\n| `showActionButtons` | `boolean` | `true` | Show Save/Clear buttons |\n| `disabledAttrs` | `string[]` | `[]` | Attributes to disable in edit panel |\n| `editOnAdd` | `boolean` | `false` | Open edit panel on field add |\n| `fieldRemoveWarn` | `boolean` | `false` | Warn before removing fields |\n\n### Field Types\n\n`text`, `number`, `date`, `select`, `checkbox-group`, `radio-group`, `textarea`, `file`, `autocomplete`, `button`, `header`, `paragraph`, `hidden`, `checkbox`\n\n## Composables\n\nAll internal composables are exported for advanced usage:\n\n```ts\nimport {\n  useFormBuilder,\n  useFormRenderer,\n  useFieldRegistry,\n  useDragDrop,\n  useI18n,\n} from '@einhasad-vue/form-builder-vue'\n```\n\n## Provide / inject helpers\n\nThe library shares configuration, state, field registry, and i18n with\ndescendant components through `provide`/`inject`. The injection keys are\nmodule-private — consumers interact with them through paired helper\nfunctions. Use these when mounting child pieces (e.g. `BuilderStage`) inside\ncustom wrappers, or when reading context from your own composables:\n\n```ts\nimport {\n  provideBuilderOptions, useBuilderOptions,\n  provideBuilderState,   useBuilderState,\n  provideBuilderRegistry, useBuilderRegistry,\n  provideBuilderI18n,    useBuilderI18n,\n  type BuilderRegistryContext,\n  type BuilderI18nContext,\n} from '@einhasad-vue/form-builder-vue'\n```\n\nEach `use*()` returns `undefined` if nothing was provided upstream, so\nconsumers can fall back cleanly.\n\n## Theming\n\nScoped styles read their colors from CSS custom properties. Redefine them\non `.form-builder` (or any ancestor) to retheme without overriding\nindividual selectors. Key variables:\n\n| Variable | Purpose | Default |\n| --- | --- | --- |\n| `--accent` | Primary accent — action buttons, focus rings | `#ffc833` |\n| `--fb-control-accent` | `accent-color` for checkbox/radio inputs and `.toggle` `:checked` background | `var(--accent, #ffc833)` |\n| `--surface`, `--surface-sunk` | Panel / stage backgrounds | `#fff`, `#f3f0e8` |\n| `--ink`, `--ink-2`, `--ink-3` | Primary / secondary / muted text | `#111`, `#3a3a3a`, `#6e6a63` |\n| `--line`, `--line-2` | Subtle / medium borders | `#e8e4db`, `#d3cec1` |\n\n## Development\n\n```bash\nnpm run build          # Build library\nnpm run test           # Run tests\nnpm run test:coverage  # Run tests with 100% coverage thresholds\nnpm run typecheck      # TypeScript type checking\nnpm run lint           # ESLint\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}