{"_id":"@akinozgen17/selectablejs","_rev":"5-4d00fba39f9064065dfacd6e2fb04251","name":"@akinozgen17/selectablejs","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"@akinozgen17/selectablejs","version":"0.1.0","keywords":["select","dropdown","combobox","multiselect","vanilla","framework-agnostic"],"author":{"name":"Akın Özgen","email":"akinozgen17@outlook.com"},"license":"MIT","_id":"@akinozgen17/selectablejs@0.1.0","maintainers":[{"name":"akinozgen17","email":"akin.ozgen17@gmail.com"}],"homepage":"https://github.com/akinozgen/selectable#readme","bugs":{"url":"https://github.com/akinozgen/selectable/issues"},"dist":{"shasum":"46b7697ceab7300900d331b063604f8876f06074","tarball":"https://registry.npmjs.org/@akinozgen17/selectablejs/-/selectablejs-0.1.0.tgz","fileCount":25,"integrity":"sha512-fn1IndxRGgGklPE1KJVON4/1vN/b022NNGdpKdHGth45PfsHsq7nksHRBjRbUalDVPbedGWV9AtxYjnQFGq1Zg==","signatures":[{"sig":"MEYCIQCkeMTu3fVvBUt0B03UeUgQxHksdfdVQv1jUfV6i7gl+gIhAIjK19XRK0tA7Z0i/KfA7CGISvu1KxiDALnk5oUIs52D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166934},"main":"./dist/selectable.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/selectable.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/selectable.js","require":"./dist/selectable.cjs"},"./css":"./dist/selectable.css","./css/tokens":"./dist/tokens.css"},"gitHead":"b646ec68155cf0984270e1c2cf21e584d2dc9d66","scripts":{"dev":"vite","test":"vitest run","build":"vite build && tsc && node scripts/build-css.mjs","test:e2e":"playwright test","test:watch":"vitest"},"_npmUser":{"name":"akinozgen17","email":"akin.ozgen17@gmail.com"},"repository":{"url":"git+https://github.com/akinozgen/selectable.git","type":"git"},"_npmVersion":"11.12.1","description":"Framework-agnostic, zero-dependency, premium select component. Flexible like select2, featureful like bootstrap-select, unbreakable design.","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","vitest":"^2.1.0","playwright":"^1.62.1","typescript":"^5.6.0","@playwright/test":"^1.62.1","@axe-core/playwright":"^4.13.0"},"_npmOperationalInternal":{"tmp":"tmp/selectablejs_0.1.0_1786623217119_0.5623197684501611","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@akinozgen17/selectablejs","version":"0.1.1","keywords":["select","dropdown","combobox","multiselect","vanilla","framework-agnostic"],"author":{"name":"Akın Özgen","email":"akinozgen17@outlook.com"},"license":"MIT","_id":"@akinozgen17/selectablejs@0.1.1","maintainers":[{"name":"akinozgen17","email":"akin.ozgen17@gmail.com"}],"homepage":"https://github.com/akinozgen/selectable#readme","bugs":{"url":"https://github.com/akinozgen/selectable/issues"},"dist":{"shasum":"f8fa7191547601d9bb5934cc8a834881e938399d","tarball":"https://registry.npmjs.org/@akinozgen17/selectablejs/-/selectablejs-0.1.1.tgz","fileCount":25,"integrity":"sha512-3jmktSsUka2zSj5dB2jMXx0bbCJwGP0vZNYjchuG2N6mZKiySCKhd5ang6/MhfUI063+n+Vi+eVSoivM5gFYCQ==","signatures":[{"sig":"MEUCIGM+CtUhZR02Ahu1Q9+nP080kTq+mklBVzMYtc6ALqqPAiEA1TguwtxHFjDhdZQftlEYUf08Ba3Lcvz2/ReKnEJob/U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":167551},"main":"./dist/selectable.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/selectable.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/selectable.js","require":"./dist/selectable.cjs"},"./css":"./dist/selectable.css","./css/tokens":"./dist/tokens.css"},"gitHead":"39dc261e3661e8f319359ad89ee8b3005ff0d513","scripts":{"dev":"vite","test":"vitest run","build":"vite build && tsc && node scripts/build-css.mjs","test:e2e":"playwright test","test:watch":"vitest"},"_npmUser":{"name":"akinozgen17","email":"akin.ozgen17@gmail.com"},"repository":{"url":"git+https://github.com/akinozgen/selectable.git","type":"git"},"_npmVersion":"11.12.1","description":"Framework-agnostic, zero-dependency, premium select component. Flexible like select2, featureful like bootstrap-select, unbreakable design.","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","vitest":"^2.1.0","playwright":"^1.62.1","typescript":"^5.6.0","@playwright/test":"^1.62.1","@axe-core/playwright":"^4.13.0"},"_npmOperationalInternal":{"tmp":"tmp/selectablejs_0.1.1_1786623873732_0.07745374913373171","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@akinozgen17/selectablejs","version":"0.2.0","keywords":["select","dropdown","combobox","multiselect","vanilla","framework-agnostic"],"author":{"name":"Akın Özgen","email":"akinozgen17@outlook.com"},"license":"MIT","_id":"@akinozgen17/selectablejs@0.2.0","maintainers":[{"name":"akinozgen17","email":"akin.ozgen17@gmail.com"}],"homepage":"https://github.com/akinozgen/selectable#readme","bugs":{"url":"https://github.com/akinozgen/selectable/issues"},"dist":{"shasum":"17685bca66f9925386849cbe6006b877edfbfe74","tarball":"https://registry.npmjs.org/@akinozgen17/selectablejs/-/selectablejs-0.2.0.tgz","fileCount":25,"integrity":"sha512-HelP0+Y4esIFc6BHQ6hxyIaDWHSSytn9D5viE1mA1wgZGIlihCnQXPjWUoAti6InW3sQmAXoE2ykMFntl+j5TQ==","signatures":[{"sig":"MEYCIQDDga95VeQHxrKiRF8/Px0/KCQGQ++vE1oHRO+/WVzwegIhANNE0lZpgaU05Oc9t1EsNOqx4PGGi8swlQnHdFK9MJ0R","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":170022},"main":"./dist/selectable.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/selectable.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/selectable.js","require":"./dist/selectable.cjs"},"./css":"./dist/selectable.css","./css/tokens":"./dist/tokens.css"},"gitHead":"1388a3c98ccce842a548335fcc64b9fe5afa6471","scripts":{"dev":"vite","test":"vitest run","build":"vite build && tsc && node scripts/build-css.mjs","test:e2e":"playwright test","test:watch":"vitest"},"_npmUser":{"name":"akinozgen17","email":"akin.ozgen17@gmail.com"},"repository":{"url":"git+https://github.com/akinozgen/selectable.git","type":"git"},"_npmVersion":"11.12.1","description":"Framework-agnostic, zero-dependency, premium select component. Flexible like select2, featureful like bootstrap-select, unbreakable design.","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","vitest":"^2.1.0","playwright":"^1.62.1","typescript":"^5.6.0","@playwright/test":"^1.62.1","@axe-core/playwright":"^4.13.0"},"_npmOperationalInternal":{"tmp":"tmp/selectablejs_0.2.0_1786631181110_0.9124025540480136","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@akinozgen17/selectablejs","version":"0.3.0","keywords":["select","dropdown","combobox","multiselect","vanilla","framework-agnostic"],"author":{"name":"Akın Özgen","email":"akinozgen17@outlook.com"},"license":"MIT","_id":"@akinozgen17/selectablejs@0.3.0","maintainers":[{"name":"akinozgen17","email":"akin.ozgen17@gmail.com"}],"homepage":"https://github.com/akinozgen/selectable#readme","bugs":{"url":"https://github.com/akinozgen/selectable/issues"},"dist":{"shasum":"88b97269631a7d69e5aee211c07ef595677f66c3","tarball":"https://registry.npmjs.org/@akinozgen17/selectablejs/-/selectablejs-0.3.0.tgz","fileCount":25,"integrity":"sha512-MvfioqXPDkExL+NZ7zkRzKPWwCZB9DzZHl8uD3Q6cR1LHCWUQUhCRLBqQU75uBohmRI/5bgBlANgweqZGpRPMw==","signatures":[{"sig":"MEUCIBOD7a+jf1uhBM/9oBrrl7rqqOC+7gETIRs5tAQwE/eEAiEAw/c0fQOtGTWkZYGcj84pBZspVDKqRWfB1rfgmUsNr08=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220721},"main":"./dist/selectable.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/selectable.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/selectable.js","require":"./dist/selectable.cjs"},"./css":"./dist/selectable.css","./css/tokens":"./dist/tokens.css"},"gitHead":"a26426c484bd80547f290d708144c2e65ecb234d","scripts":{"dev":"vite","test":"vitest run","build":"vite build && tsc && node scripts/build-css.mjs","docs:dev":"vitepress dev docs --port 4173","test:e2e":"playwright test","docs:build":"vitepress build docs","test:watch":"vitest","docs:preview":"vitepress preview docs --port 4173"},"_npmUser":{"name":"akinozgen17","email":"akin.ozgen17@gmail.com"},"repository":{"url":"git+https://github.com/akinozgen/selectable.git","type":"git"},"_npmVersion":"11.12.1","description":"Framework-agnostic, zero-dependency, premium select component. Flexible like select2, featureful like bootstrap-select, unbreakable design.","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","vitest":"^2.1.0","vitepress":"^1.6.4","codemirror":"^6.0.2","playwright":"^1.62.1","typescript":"^5.6.0","@playwright/test":"^1.62.1","@axe-core/playwright":"^4.13.0","@codemirror/lang-html":"^6.4.12","@codemirror/theme-one-dark":"^6.1.3","@codemirror/lang-javascript":"^6.2.5"},"_npmOperationalInternal":{"tmp":"tmp/selectablejs_0.3.0_1786642232217_0.15975350838413482","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@akinozgen17/selectablejs","publishConfig":{"access":"public"},"version":"0.3.1","description":"Framework-agnostic, zero-dependency, premium select component. Flexible like select2, featureful like bootstrap-select, unbreakable design.","type":"module","repository":{"type":"git","url":"git+https://github.com/akinozgen/selectable.git"},"author":{"name":"Akın Özgen","email":"akinozgen17@outlook.com"},"main":"./dist/selectable.cjs","module":"./dist/selectable.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/selectable.js","require":"./dist/selectable.cjs"},"./css":"./dist/selectable.css","./css/tokens":"./dist/tokens.css"},"scripts":{"dev":"vite","build":"vite build && tsc && node scripts/build-css.mjs","test":"vitest run","test:watch":"vitest","test:e2e":"playwright test","docs:dev":"vitepress dev docs --port 4173","docs:build":"vitepress build docs","docs:preview":"vitepress preview docs --port 4173"},"keywords":["select","dropdown","combobox","multiselect","vanilla","framework-agnostic"],"license":"MIT","devDependencies":{"@axe-core/playwright":"^4.13.0","@codemirror/lang-html":"^6.4.12","@codemirror/lang-javascript":"^6.2.5","@codemirror/theme-one-dark":"^6.1.3","@playwright/test":"^1.62.1","codemirror":"^6.0.2","jsdom":"^25.0.0","playwright":"^1.62.1","typescript":"^5.6.0","vite":"^6.0.0","vitepress":"^1.6.4","vitest":"^2.1.0"},"gitHead":"ee008d40aaf1fd775c0b8641ad020a32b530ba38","_id":"@akinozgen17/selectablejs@0.3.1","bugs":{"url":"https://github.com/akinozgen/selectable/issues"},"homepage":"https://github.com/akinozgen/selectable#readme","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-sJ7rCR26YPnSiHZQnS8aFU9b2XrZuuuQboOkk+Xuu7dngPNXBS8Q6FoY1YaPoa1TINXsrSm5NZgmApbEIgB0LA==","shasum":"9315b2ff9d280ea4a2e13df0b002332d20caa1ef","tarball":"https://registry.npmjs.org/@akinozgen17/selectablejs/-/selectablejs-0.3.1.tgz","fileCount":25,"unpackedSize":228386,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDx7Fb+aHiTcRiZHkw+0yy6JviWhZzgVydNtBGiUi4RkAIgd/qC2Qc6b8i1M+Zy6WvXMEcOjgVJQXvrYTwkijim/bg="}]},"_npmUser":{"name":"akinozgen17","email":"akin.ozgen17@gmail.com"},"directories":{},"maintainers":[{"name":"akinozgen17","email":"akin.ozgen17@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/selectablejs_0.3.1_1787068839443_0.837153702351942"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-13T12:13:36.939Z","modified":"2026-08-18T16:00:39.768Z","0.1.0":"2026-08-13T12:13:37.279Z","0.1.1":"2026-08-13T12:24:33.873Z","0.2.0":"2026-08-13T14:26:21.287Z","0.3.0":"2026-08-13T17:30:32.387Z","0.3.1":"2026-08-18T16:00:39.589Z"},"bugs":{"url":"https://github.com/akinozgen/selectable/issues"},"author":{"name":"Akın Özgen","email":"akinozgen17@outlook.com"},"license":"MIT","homepage":"https://github.com/akinozgen/selectable#readme","keywords":["select","dropdown","combobox","multiselect","vanilla","framework-agnostic"],"repository":{"type":"git","url":"git+https://github.com/akinozgen/selectable.git"},"description":"Framework-agnostic, zero-dependency, premium select component. Flexible like select2, featureful like bootstrap-select, unbreakable design.","maintainers":[{"name":"akinozgen17","email":"akin.ozgen17@gmail.com"}],"readme":"# selectablejs\r\n\r\nA framework-agnostic, zero-dependency select component. As flexible as select2, as featureful as bootstrap-select — without jQuery, without Bootstrap, and with a design that doesn't break no matter what CSS the host page ships.\r\n\r\n[![npm](https://img.shields.io/npm/v/%40akinozgen17%2Fselectablejs)](https://www.npmjs.com/package/@akinozgen17/selectablejs)\r\n[![license](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\r\n\r\n**Docs & live demos:** https://akinozgen.github.io/selectable/\r\n\r\n## Why\r\n\r\n- **Zero dependencies.** Vanilla TypeScript. ESM + CJS + IIFE builds, one CSS file, ~10 KB gzip.\r\n- **Progressive enhancement.** Enhances your existing native `<select>` in place. The select stays in the DOM and remains the form source of truth: form submits, `FormData`, `form.reset()` and framework bindings keep working with no bridge code.\r\n- **Unbreakable rendering.** The dropdown opens in the browser's top layer (Popover API), so it is never clipped by `overflow: hidden`, tables, or modals — and never loses a z-index war. There is no `dropdownParent` or `zIndex` option, because none is needed.\r\n- **Unbreakable styling.** All styles are isolated under prefixed classes and component-scoped `--sl-*` tokens (no `:root` pollution). Aggressive host CSS — global resets, `line-height` inheritance, element selectors — can't deform it. Rebrand the whole component by overriding a single `--sl-accent` token.\r\n- **Accessible.** WAI-ARIA combobox pattern, full keyboard map, screen-reader announcements via a polite live region, `prefers-reduced-motion` and forced-colors support.\r\n- **Fast at scale.** Automatic list virtualization above 50 options; 10,000+ options scroll at full frame rate with ~20 nodes in the DOM.\r\n\r\n## Install\r\n\r\n```bash\r\nnpm install @akinozgen17/selectablejs\r\n```\r\n\r\n```js\r\nimport { Selectable } from \"@akinozgen17/selectablejs\";\r\nimport \"@akinozgen17/selectablejs/css\"; // required — tokens + component styles\r\n```\r\n\r\nOr from a CDN, with no build step (global namespace `window.Selectable`):\r\n\r\n```html\r\n<link rel=\"stylesheet\" href=\"https://unpkg.com/@akinozgen17/selectablejs/dist/selectable.css\">\r\n<script src=\"https://unpkg.com/@akinozgen17/selectablejs/dist/selectable.global.js\"></script>\r\n<script>\r\n  new Selectable.Selectable(\"#site\"); // namespace + class\r\n</script>\r\n```\r\n\r\n## Quick start\r\n\r\nYour existing markup:\r\n\r\n```html\r\n<select id=\"site\" multiple>\r\n  <option value=\"\">Choose a location…</option>\r\n  <option value=\"rpd\" selected>R.P.D. Station</option>\r\n  <option value=\"clock-tower\">Clock Tower</option>\r\n  <option value=\"spencer\">Spencer Mansion</option>\r\n</select>\r\n```\r\n\r\nOne line of JavaScript:\r\n\r\n```js\r\nnew Selectable(\"#site\", { clearable: true });\r\n```\r\n\r\nOptions, groups, `multiple`, `disabled`, and the current selection are read from the native select. When the user picks a value, native `change`/`input` events fire on the original element.\r\n\r\n## Usage\r\n\r\n### Search\r\n\r\n```js\r\nnew Selectable(\"#country\", { search: true });\r\n// or fine-tuned:\r\nnew Selectable(\"#country\", {\r\n  search: { minQueryLength: 2, filter: (opt, q) => opt.label.startsWith(q) },\r\n});\r\n```\r\n\r\nSearch is locale-aware and diacritic-tolerant out of the box, and turns on automatically for lists with more than 8 options.\r\n\r\n### Remote data\r\n\r\n```js\r\nimport { Selectable, asyncSource } from \"@akinozgen17/selectablejs\";\r\n\r\nnew Selectable(\"#user\", {\r\n  source: asyncSource(async (query, { signal }) => {\r\n    const res = await fetch(`/api/users?q=${encodeURIComponent(query)}`, { signal });\r\n    return (await res.json()).map((u) => ({ value: u.id, label: u.name }));\r\n  }),\r\n});\r\n```\r\n\r\nDebouncing, request cancellation (`AbortController`) and an LRU query cache are built in. Selected values are written back to the native select as real `<option>` elements, so forms submit them.\r\n\r\n### Tagging\r\n\r\n```js\r\nnew Selectable(\"#labels\", { tags: true });\r\n// custom option factory:\r\nnew Selectable(\"#labels\", { tags: { create: (label) => ({ value: slug(label), label }) } });\r\n```\r\n\r\n### Multiple selection\r\n\r\n```js\r\nnew Selectable(\"#tags\", {\r\n  maxSelections: 5,\r\n  overflow: \"counter\",   // single-line chips with a \"+N\" counter; default \"wrap\"\r\n  clearable: true,\r\n});\r\n```\r\n\r\n### Panel size\r\n\r\n```js\r\nnew Selectable(\"#per-page\", { visibleOptions: 6 }); // scroll after 6 rows\r\n```\r\n\r\nA CSS selector target enhances every match in one call:\r\n\r\n```js\r\nnew Selectable(\"select.enhance\", { search: true });\r\n```\r\n\r\n### Events and methods\r\n\r\n```js\r\nconst sel = new Selectable(\"#site\");\r\n\r\nsel.on(\"change\", ({ value, options }) => console.log(value));\r\nsel.setValue([\"rpd\", \"spencer\"]);\r\nsel.open(); sel.close();\r\nsel.destroy(); // restores the native select exactly as it was\r\n```\r\n\r\nEvents: `change`, `open`, `close`, `search`, `load`, `error`, `create`, `clear`, `destroy`.\r\nMembers: `value`, `setValue()`, `getSelectedOptions()`, `open()/close()/toggle()`, `isOpen`, `search()`, `clear()`, `setOptions()`, `refresh()`, `enable()/disable()`, `destroy()`, `on()/off()`.\r\n\r\n### Declarative init\r\n\r\n```html\r\n<select data-selectable name=\"site\">…</select>\r\n<script>Selectable.Selectable.upgrade();</script>\r\n```\r\n\r\n`upgrade()` is idempotent — safe to call again after DOM morphs (Livewire, Turbo, htmx).\r\n\r\n## Theming\r\n\r\nEverything is driven by component-scoped custom properties. Rebranding is one line:\r\n\r\n```css\r\n.sl { --sl-accent: #16a34a; }\r\n```\r\n\r\n- **Dark mode:** follows `prefers-color-scheme` automatically; force with `data-sl-theme=\"dark\"` (or `\"light\"`) on the component or any ancestor.\r\n- **Sizes:** `size: \"sm\" | \"md\" | \"lg\"`, density: `\"compact\" | \"normal\" | \"comfortable\"`.\r\n- Full token reference: [docs/guide/theming.md](docs/guide/theming.md).\r\n\r\n## Framework integration\r\n\r\nSelection changes dispatch native bubbling `change`/`input` events on the original `<select>`, so React (`onChange`), Vue (`v-model`), Alpine, and Livewire (`wire:model`) pick them up without adapters. For DOM-morphing frameworks, mark the wrapper as ignored (`wire:ignore`, `data-turbo-permanent`) or re-run `Selectable.upgrade()` after a morph.\r\n\r\n## Accessibility\r\n\r\n- APG combobox + listbox pattern; `aria-activedescendant` navigation (virtualization-safe).\r\n- Full keyboard map: arrows, Home/End, PageUp/PageDown, type-ahead, Enter/Space, Escape, Tab-dismisses (no accidental select-on-tab), Backspace removes the last chip.\r\n- Selections and async results are announced through a polite live region.\r\n- No search-input autofocus on touch devices — the virtual keyboard stays down until the user asks for it.\r\n\r\n## Browser support\r\n\r\nBaseline is the Popover API (Chrome/Edge 114+, Firefox 125+, Safari 17+). Older evergreen browsers fall back automatically to a body-portal strategy with the same feature set. Derived colors via `color-mix()` carry static fallbacks.\r\n\r\n## Documentation\r\n\r\n| Topic | |\r\n|---|---|\r\n| Getting started | [docs/guide/getting-started.md](docs/guide/getting-started.md) |\r\n| All options | [docs/guide/configuration.md](docs/guide/configuration.md) |\r\n| Theming & tokens | [docs/guide/theming.md](docs/guide/theming.md) |\r\n| Migrating from select2 | [docs/guide/migrating-from-select2.md](docs/guide/migrating-from-select2.md) |\r\n| Migrating from bootstrap-select | [docs/guide/migrating-from-bootstrap-select.md](docs/guide/migrating-from-bootstrap-select.md) |\r\n| DOM anatomy (classes & attributes) | [docs/guide/anatomy.md](docs/guide/anatomy.md) |\r\n| LLM / AI-agent cheat sheet | [docs/llm.md](docs/llm.md) — ships in the npm package; see also [llms.txt](llms.txt) |\r\n\r\n## Development\r\n\r\n```bash\r\nnpm install\r\nnpm run dev        # demo playground\r\nnpm test           # unit tests (Vitest)\r\nnpm run test:e2e   # browser tests (Playwright)\r\nnpm run build      # dist/ — ESM + CJS + IIFE + CSS, minified\r\n```\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md"}