{"_id":"@alizharb/bootstrap-multiselect","_rev":"4-c50c104ad3332f5495421a13a18701f4","name":"@alizharb/bootstrap-multiselect","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"@alizharb/bootstrap-multiselect","version":"1.0.0","keywords":["bootstrap","multiselect","dropdown","select","plugin","tags","remote","custom-select"],"author":{"name":"Ali Harb"},"license":"MIT","_id":"@alizharb/bootstrap-multiselect@1.0.0","maintainers":[{"name":"alizharb","email":"harbzali@gmail.com"}],"homepage":"https://github.com/alizharb/bootstrap-multiselect#readme","bugs":{"url":"https://github.com/alizharb/bootstrap-multiselect/issues"},"dist":{"shasum":"908d5298665cb7b161aed0cd0e0fd051aaf444a4","tarball":"https://registry.npmjs.org/@alizharb/bootstrap-multiselect/-/bootstrap-multiselect-1.0.0.tgz","fileCount":12,"integrity":"sha512-AQsCUL5wVb3g3HpjgNUEHCWJk852ejEaQx1/KBhkb4vre2sI99T/mQikSkZErOrJoC8OcKPsPp3Qfn+Hrc0j4w==","signatures":[{"sig":"MEQCIHFK2hAdhbXbrqykjXLI5gVAivmAA6SbfADuzLBRw86xAiAX2XK3Khic+0AWG4Xjap0B+/w/NDR893nZljZMGJwUaw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":174357},"main":"dist/js/azh-select.min.js","style":"dist/css/azh-select.min.css","types":"types/index.d.ts","gitHead":"847acb5cd5c5d3c239e6390a4fb450dd6d2bbe5f","scripts":{"build":"npm run build:less && npm run build:scss && npm run build:css && npm run build:js","build:js":"uglify-js src/js/azh-select.js -o dist/js/azh-select.min.js --compress --mangle && cp src/js/azh-select.js dist/js/azh-select.js","build:css":"cleancss -o dist/css/azh-select.min.css dist/css/azh-select.css","build:less":"lessc src/less/azh-select.less dist/css/azh-select.css && cp src/less/azh-select.less dist/less/azh-select.less","build:scss":"sass src/scss/azh-select.scss dist/css/azh-select.css --no-source-map && cp src/scss/azh-select.scss dist/scss/azh-select.scss"},"_npmUser":{"name":"alizharb","email":"harbzali@gmail.com"},"repository":{"url":"git+https://github.com/alizharb/bootstrap-multiselect.git","type":"git"},"_npmVersion":"10.9.3","description":"Bootstrap-styled multiselect dropdown with search, tags, remote data and themes.","directories":{},"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"less":"^4.2.0","sass":"^1.77.0","uglify-js":"^3.17.4","clean-css-cli":"^5.6.2"},"peerDependencies":{"bootstrap":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/bootstrap-multiselect_1.0.0_1757023978108_0.6698576113541614","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@alizharb/bootstrap-multiselect","version":"1.0.1","keywords":["bootstrap","multiselect","dropdown","select","plugin","tags","remote","custom-select"],"author":{"name":"Ali Harb"},"license":"MIT","_id":"@alizharb/bootstrap-multiselect@1.0.1","maintainers":[{"name":"alizharb","email":"harbzali@gmail.com"}],"homepage":"https://github.com/alizharb/bootstrap-multiselect#readme","bugs":{"url":"https://github.com/alizharb/bootstrap-multiselect/issues"},"dist":{"shasum":"4526d77330a6acd30d03aa459a5059959dcbb4f4","tarball":"https://registry.npmjs.org/@alizharb/bootstrap-multiselect/-/bootstrap-multiselect-1.0.1.tgz","fileCount":12,"integrity":"sha512-jjUnn0o754fVKO9lpcl0xJ3nuFMKf/cdKKvT8FNXVKF9wPZpBRN2OZL9W4Z9wl3RThYPqeCoegYc3+heGQdqNg==","signatures":[{"sig":"MEYCIQCWKXKLYvRPX1GrcI6GYMKxyiOR+mMqyhis9mq/Ad61jAIhAN14N5uX7E9E3/VRrUjR7RQf++s+x/anIWKvKQhhClOe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175121},"main":"dist/js/azh-select.min.js","style":"dist/css/azh-select.min.css","types":"types/index.d.ts","gitHead":"8db353a8a57f2e00f0021c2979ea99d876644c63","scripts":{"build":"npm run build:less && npm run build:scss && npm run build:css && npm run build:js","build:js":"uglify-js src/js/azh-select.js -o dist/js/azh-select.min.js --compress --mangle && cp src/js/azh-select.js dist/js/azh-select.js","build:css":"cleancss -o dist/css/azh-select.min.css dist/css/azh-select.css","build:less":"lessc src/less/azh-select.less dist/css/azh-select.css && cp src/less/azh-select.less dist/less/azh-select.less","build:scss":"sass src/scss/azh-select.scss dist/css/azh-select.css --no-source-map && cp src/scss/azh-select.scss dist/scss/azh-select.scss"},"_npmUser":{"name":"alizharb","email":"harbzali@gmail.com"},"repository":{"url":"git+https://github.com/alizharb/bootstrap-multiselect.git","type":"git"},"_npmVersion":"10.9.3","description":"Bootstrap-styled multiselect dropdown with search, tags, remote data and themes.","directories":{},"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"less":"^4.2.0","sass":"^1.77.0","uglify-js":"^3.17.4","clean-css-cli":"^5.6.2"},"peerDependencies":{"bootstrap":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/bootstrap-multiselect_1.0.1_1757024452802_0.8382056078093019","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@alizharb/bootstrap-multiselect","version":"1.0.2","keywords":["bootstrap","multiselect","dropdown","select","plugin","tags","remote","custom-select"],"author":{"name":"Ali Harb"},"license":"MIT","_id":"@alizharb/bootstrap-multiselect@1.0.2","maintainers":[{"name":"alizharb","email":"harbzali@gmail.com"}],"homepage":"https://github.com/alizharb/bootstrap-multiselect#readme","bugs":{"url":"https://github.com/alizharb/bootstrap-multiselect/issues"},"dist":{"shasum":"3c616e71d76c998ddade7597e387838a0b9bf9dc","tarball":"https://registry.npmjs.org/@alizharb/bootstrap-multiselect/-/bootstrap-multiselect-1.0.2.tgz","fileCount":12,"integrity":"sha512-Naoe/wTwsGdRxnrK3hlgKPuQJLpa9PiNiUQxMva7MbztqJLLtwevcujsQ0Qq9KAz6ibQFkiax0DbGmf1HAAsEg==","signatures":[{"sig":"MEQCIF4PY7tEhiRysd1cT9YUxrn5yrWLD1sU2skMZTqJxO/jAiAljH0U+e2laTf5SGOrw596CMEc7RF68XUtAYN/ZZe4xA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175568},"main":"dist/js/azh-select.min.js","style":"dist/css/azh-select.min.css","types":"types/index.d.ts","gitHead":"1b357bd238eeb6e79313f4953dcdc982fb8744d6","scripts":{"build":"npm run build:less && npm run build:scss && npm run build:css && npm run build:js","build:js":"uglify-js src/js/azh-select.js -o dist/js/azh-select.min.js --compress --mangle && cp src/js/azh-select.js dist/js/azh-select.js","build:css":"cleancss -o dist/css/azh-select.min.css dist/css/azh-select.css","build:less":"lessc src/less/azh-select.less dist/css/azh-select.css && cp src/less/azh-select.less dist/less/azh-select.less","build:scss":"sass src/scss/azh-select.scss dist/css/azh-select.css --no-source-map && cp src/scss/azh-select.scss dist/scss/azh-select.scss"},"_npmUser":{"name":"alizharb","email":"harbzali@gmail.com"},"repository":{"url":"git+https://github.com/alizharb/bootstrap-multiselect.git","type":"git"},"_npmVersion":"10.9.3","description":"Bootstrap-styled multiselect dropdown with search, tags, remote data and themes.","directories":{},"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"less":"^4.2.0","sass":"^1.77.0","uglify-js":"^3.17.4","clean-css-cli":"^5.6.2"},"peerDependencies":{"bootstrap":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/bootstrap-multiselect_1.0.2_1757025817541_0.2895009553693857","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@alizharb/bootstrap-multiselect","version":"1.0.3","description":"Bootstrap-styled multiselect dropdown with search, tags, remote data and themes.","main":"dist/js/azh-select.min.js","types":"types/index.d.ts","style":"dist/css/azh-select.min.css","repository":{"type":"git","url":"git+https://github.com/alizharb/bootstrap-multiselect.git"},"keywords":["bootstrap","multiselect","dropdown","select","plugin","tags","remote","custom-select"],"author":{"name":"Ali Harb"},"license":"MIT","scripts":{"build":"npm run build:less && npm run build:scss && npm run build:css && npm run build:js","build:js":"uglify-js src/js/azh-select.js -o dist/js/azh-select.min.js --compress --mangle && cp src/js/azh-select.js dist/js/azh-select.js","build:css":"cleancss -o dist/css/azh-select.min.css dist/css/azh-select.css","build:less":"lessc src/less/azh-select.less dist/css/azh-select.css && cp src/less/azh-select.less dist/less/azh-select.less","build:scss":"sass src/scss/azh-select.scss dist/css/azh-select.css --no-source-map && cp src/scss/azh-select.scss dist/scss/azh-select.scss"},"devDependencies":{"uglify-js":"^3.17.4","clean-css-cli":"^5.6.2","less":"^4.2.0","sass":"^1.77.0"},"peerDependencies":{"bootstrap":">=5.0.0"},"_id":"@alizharb/bootstrap-multiselect@1.0.3","gitHead":"cb512247bb80827f688bbe8b736bdc1ae4308658","bugs":{"url":"https://github.com/alizharb/bootstrap-multiselect/issues"},"homepage":"https://github.com/alizharb/bootstrap-multiselect#readme","_nodeVersion":"22.18.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-qrYWrcG0X1K1ZEQeHWBGbazFKcs3cxXoVDPgDmGUZQCGTcW+9K+cs0eUuGkKpKJ5oANbUlT2UltPn1e22T213g==","shasum":"e48a3759b387daf4ced98622c8f85dde284dbf40","tarball":"https://registry.npmjs.org/@alizharb/bootstrap-multiselect/-/bootstrap-multiselect-1.0.3.tgz","fileCount":12,"unpackedSize":177783,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDUqTfG1nXlrM/aekTW5uzVzW8DafHZXvDLXnP1gCA/GwIgWHQUJbjcNIu13daoGzeZZfRgXcLIQLz6O/x4J3DAm7k="}]},"_npmUser":{"name":"alizharb","email":"harbzali@gmail.com"},"directories":{},"maintainers":[{"name":"alizharb","email":"harbzali@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/bootstrap-multiselect_1.0.3_1757026409501_0.8423096664181666"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-04T22:12:58.058Z","modified":"2025-09-04T22:53:29.860Z","1.0.0":"2025-09-04T22:12:58.292Z","1.0.1":"2025-09-04T22:20:53.014Z","1.0.2":"2025-09-04T22:43:37.766Z","1.0.3":"2025-09-04T22:53:29.683Z"},"bugs":{"url":"https://github.com/alizharb/bootstrap-multiselect/issues"},"author":{"name":"Ali Harb"},"license":"MIT","homepage":"https://github.com/alizharb/bootstrap-multiselect#readme","keywords":["bootstrap","multiselect","dropdown","select","plugin","tags","remote","custom-select"],"repository":{"type":"git","url":"git+https://github.com/alizharb/bootstrap-multiselect.git"},"description":"Bootstrap-styled multiselect dropdown with search, tags, remote data and themes.","maintainers":[{"name":"alizharb","email":"harbzali@gmail.com"}],"readme":"# azh-select\r\n\r\n<div align=\"center\">\r\n\r\n![azh-select logo](https://banners.beyondco.de/Advanced%20Select%20Component.png?theme=light&packageManager=&packageName=npm%20install%20@alizharb/bootstrap-multiselect&pattern=circuitBoard&style=flat&description=Advanced%20Select%20Component%20for%20Bootstrap%205&md=1&showWatermark=0&fontSize=100px&images=selector)\r\n**Advanced Select Component for Bootstrap 5**\r\n\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\r\n[![Latest Version](https://img.shields.io/npm/v/@alizharb/bootstrap-multiselect.svg)](https://www.npmjs.com/package/@alizharb/bootstrap-multiselect)\r\n[![Total Downloads](https://img.shields.io/npm/dm/@alizharb/bootstrap-multiselect.svg)](https://www.npmjs.com/package/@alizharb/bootstrap-multiselect)\r\n[![Bootstrap](https://img.shields.io/badge/Bootstrap-5.3+-7952B3.svg)](https://getbootstrap.com/)\r\n[![JavaScript](https://img.shields.io/badge/JavaScript-ES6+-F7DF1E.svg)](https://developer.mozilla.org/en-US/docs/Web/JavaScript)\r\n[![File Size](https://img.shields.io/badge/Size-~15KB-green.svg)](#installation)\r\n[![No Dependencies](https://img.shields.io/badge/Dependencies-Bootstrap%20Only-blue.svg)](#requirements)\r\n\r\n_Powerful, lightweight, and highly customizable select component with search, tags, remote API loading, custom templates, and full dark mode support._\r\n\r\n[📖 Documentation](#documentation) • [🚀 Quick Start](#quick-start) • [💡 Examples](#examples) • [🎨 Themes](#theming) • [🔧 API Reference](#api-reference)\r\n\r\n</div>\r\n\r\n## 📚 Demo & Full Documentation\r\n\r\n🔗 [Live Demo & Complete Documentation](https://alizharb.github.io/bootstrap-multiselect/)\r\n\r\n---\r\n\r\n## ✨ Features\r\n\r\n<table>\r\n<tr>\r\n<td width=\"50%\">\r\n\r\n### 🎯 **Core Features**\r\n\r\n- **Single & Multiple Selection** - Standard and multi-select modes\r\n- **Real-time Search** - Filter options as you type\r\n- **Tag Creation** - Users can create new options dynamically\r\n- **Clear Button** - Easy reset functionality\r\n- **Keyboard Navigation** - Full accessibility support\r\n- **Form Integration** - Works seamlessly with HTML forms\r\n\r\n</td>\r\n<td width=\"50%\">\r\n\r\n### 🚀 **Advanced Features**\r\n\r\n- **Remote API Loading** - Load data from REST endpoints\r\n- **Custom Templates** - Rich HTML templates for options\r\n- **Dark/Light Themes** - Bootstrap 5 theme integration\r\n- **Event System** - Comprehensive event callbacks\r\n- **Responsive Design** - Mobile-first responsive layout\r\n- **Performance Optimized** - Efficient rendering for large datasets\r\n\r\n</td>\r\n</tr>\r\n</table>\r\n\r\n---\r\n\r\n## 🎯 Quick Start\r\n\r\n### Installation\r\n\r\n#### Option 1: Direct Download\r\n\r\n```html\r\n<!-- CSS -->\r\n<link rel=\"stylesheet\" href=\"path/to/dist/css/azh-select.min.css\" />\r\n<!-- JavaScript -->\r\n<script src=\"path/to/dist/js/azh-select.min.js\"></script>\r\n```\r\n\r\n#### Option 2: CDN\r\n\r\n```html\r\n<!-- CSS -->\r\n<link\r\n  rel=\"stylesheet\"\r\n  href=\"https://cdn.jsdelivr.net/npm/@alizharb/bootstrap-multiselect@1.0.3/dist/css/azh-select.min.css\"\r\n/>\r\n<!-- JavaScript -->\r\n<script src=\"https://cdn.jsdelivr.net/npm/@alizharb/bootstrap-multiselect@1.0.3/dist/js/azh-select.min.js\"></script>\r\n```\r\n\r\n#### Option 3: NPM\r\n\r\n```bash\r\nnpm install @alizharb/bootstrap-multiselect\r\n```\r\n\r\n### Requirements\r\n\r\n- **Bootstrap 5.0+** (Required for styling)\r\n- **Modern Browser** with ES6+ support\r\n\r\n### Basic Usage\r\n\r\n```html\r\n<!-- Include Bootstrap 5 -->\r\n<link\r\n  href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css\"\r\n  rel=\"stylesheet\"\r\n/>\r\n\r\n<!-- Include azh-select -->\r\n<link rel=\"stylesheet\" href=\"azh-select.min.css\" />\r\n<script src=\"azh-select.min.js\"></script>\r\n\r\n<!-- Create your select -->\r\n<select class=\"form-select azh-select\" data-placeholder=\"Choose an option\">\r\n  <option value=\"1\">Option 1</option>\r\n  <option value=\"2\">Option 2</option>\r\n  <option value=\"3\">Option 3</option>\r\n</select>\r\n\r\n<!-- Initialize -->\r\n<script>\r\n  document.addEventListener(\"DOMContentLoaded\", () => {\r\n    azhSelect.init(\".azh-select\");\r\n  });\r\n</script>\r\n```\r\n\r\n---\r\n\r\n## 💡 Examples\r\n\r\n### Basic Select\r\n\r\n```html\r\n<select class=\"form-select azh-select\" data-placeholder=\"Select an option\">\r\n  <option value=\"apple\">🍎 Apple</option>\r\n  <option value=\"banana\">🍌 Banana</option>\r\n  <option value=\"cherry\">🍒 Cherry</option>\r\n</select>\r\n```\r\n\r\n### Searchable Multi-Select\r\n\r\n```html\r\n<select\r\n  class=\"form-select azh-select\"\r\n  multiple\r\n  data-search=\"true\"\r\n  data-placeholder=\"Search and select multiple\"\r\n>\r\n  <option value=\"html\">HTML</option>\r\n  <option value=\"css\">CSS</option>\r\n  <option value=\"js\">JavaScript</option>\r\n  <option value=\"php\">PHP</option>\r\n</select>\r\n```\r\n\r\n### Tags (Creatable Options)\r\n\r\n```html\r\n<select\r\n  class=\"form-select azh-select\"\r\n  multiple\r\n  data-search=\"true\"\r\n  data-tags=\"true\"\r\n  data-placeholder=\"Type to create new tags\"\r\n>\r\n  <option value=\"frontend\">Frontend</option>\r\n  <option value=\"backend\">Backend</option>\r\n  <option value=\"fullstack\">Full Stack</option>\r\n</select>\r\n```\r\n\r\n### Remote API Integration\r\n\r\n```html\r\n<select\r\n  class=\"form-select azh-select\"\r\n  data-remote=\"true\"\r\n  data-endpoint=\"https://api.example.com/users\"\r\n  data-search=\"true\"\r\n  data-value-field=\"id\"\r\n  data-label-field=\"name\"\r\n  data-placeholder=\"Search users...\"\r\n></select>\r\n```\r\n\r\n### Custom Templates\r\n\r\n```javascript\r\nazhSelect.init(\"#customSelect\", {\r\n  templateOption: (opt) => {\r\n    return `<i class=\"bi bi-star text-warning me-2\"></i>${opt.label}`;\r\n  },\r\n  templateValue: (opt) => {\r\n    return `<span class=\"badge bg-primary\">${opt.label}</span>`;\r\n  },\r\n});\r\n```\r\n\r\n---\r\n\r\n## ⚙️ Configuration\r\n\r\n### Data Attributes\r\n\r\n| Attribute          | Type    | Default       | Description                       |\r\n| ------------------ | ------- | ------------- | --------------------------------- |\r\n| `data-search`      | Boolean | `false`       | Enable search functionality       |\r\n| `data-clear`       | Boolean | `false`       | Show clear button                 |\r\n| `data-tags`        | Boolean | `false`       | Allow tag creation                |\r\n| `data-remote`      | Boolean | `false`       | Enable remote data loading        |\r\n| `data-endpoint`    | String  | `null`        | API endpoint URL                  |\r\n| `data-placeholder` | String  | `\"Select...\"` | Placeholder text                  |\r\n| `data-max`         | Number  | `null`        | Maximum selections (multi-select) |\r\n| `data-value-field` | String  | `\"id\"`        | API response value field          |\r\n| `data-label-field` | String  | `\"name\"`      | API response label field          |\r\n| `data-min-query`   | Number  | `1`           | Minimum chars for remote search   |\r\n| `data-delay`       | Number  | `300`         | Remote search delay (ms)          |\r\n| `data-preload`     | Boolean | `false`       | Preload remote data               |\r\n| `data-bs-theme`    | String  | `\"light\"`     | Bootstrap theme                   |\r\n\r\n### JavaScript Options\r\n\r\n```javascript\r\nazhSelect.init(\".azh-select\", {\r\n  // Template functions\r\n  templateOption: (opt) => opt.label,\r\n  templateValue: (opt) => opt.label,\r\n\r\n  // Internationalization\r\n  i18n: {\r\n    placeholder: \"Select...\",\r\n    clear: \"Clear\",\r\n    noResults: \"No results found\",\r\n  },\r\n});\r\n```\r\n\r\n---\r\n\r\n## 🎨 Theming\r\n\r\nazh-select fully supports Bootstrap 5's theme system with automatic dark/light mode detection.\r\n\r\n### Theme Integration\r\n\r\n```html\r\n<!-- Global theme -->\r\n<html data-bs-theme=\"dark\">\r\n  <!-- Individual select theme -->\r\n  <select class=\"form-select azh-select\" data-bs-theme=\"dark\">\r\n    <option value=\"1\">Dark themed option</option>\r\n  </select>\r\n</html>\r\n```\r\n\r\n### Custom Styling\r\n\r\n```css\r\n.my-custom-select {\r\n  --azh-bg: #f0f8ff;\r\n  --azh-border: #4682b4;\r\n  --azh-text: #1e3a8a;\r\n  --azh-hover-bg: rgba(70, 130, 180, 0.1);\r\n  --azh-selected-bg: rgba(70, 130, 180, 0.2);\r\n}\r\n```\r\n\r\n### Dynamic Theme Switching\r\n\r\n```javascript\r\nfunction toggleTheme() {\r\n  const html = document.documentElement;\r\n  const currentTheme = html.getAttribute(\"data-bs-theme\");\r\n  const newTheme = currentTheme === \"dark\" ? \"light\" : \"dark\";\r\n  html.setAttribute(\"data-bs-theme\", newTheme);\r\n}\r\n```\r\n\r\n---\r\n\r\n## 🔧 API Reference\r\n\r\n### Global Methods\r\n\r\n| Method                   | Parameters          | Description                |\r\n| ------------------------ | ------------------- | -------------------------- |\r\n| `azhSelect.init()`       | `selector, options` | Initialize select elements |\r\n| `azhSelect.get()`        | `selector`          | Get instance by selector   |\r\n| `azhSelect.destroy()`    | `selector`          | Destroy specific instance  |\r\n| `azhSelect.destroyAll()` | -                   | Destroy all instances      |\r\n\r\n### Instance Methods\r\n\r\n| Method      | Description           |\r\n| ----------- | --------------------- |\r\n| `clear()`   | Clear all selections  |\r\n| `open()`    | Open dropdown         |\r\n| `close()`   | Close dropdown        |\r\n| `toggle()`  | Toggle dropdown state |\r\n| `destroy()` | Destroy instance      |\r\n\r\n### Events\r\n\r\n| Event               | Trigger              | Detail                       |\r\n| ------------------- | -------------------- | ---------------------------- |\r\n| `azh:change`        | Selection changes    | `{instance}`                 |\r\n| `azh:clear`         | Clear button clicked | `{instance}`                 |\r\n| `azh:open`          | Dropdown opens       | `{instance}`                 |\r\n| `azh:close`         | Dropdown closes      | `{instance}`                 |\r\n| `azh:optionCreated` | New tag created      | `{instance, value}`          |\r\n| `azh:remoteLoaded`  | Remote data loaded   | `{instance, query, options}` |\r\n| `azh:error`         | Remote API error     | `{instance, error}`          |\r\n\r\n### Event Usage\r\n\r\n```javascript\r\ndocument\r\n  .querySelector(\"#mySelect\")\r\n  .addEventListener(\"azh:change\", function (e) {\r\n    console.log(\"Selection changed:\", e.target.value);\r\n  });\r\n\r\ndocument\r\n  .querySelector(\"#mySelect\")\r\n  .addEventListener(\"azh:optionCreated\", function (e) {\r\n    console.log(\"New tag created:\", e.detail.value);\r\n  });\r\n```\r\n\r\n---\r\n\r\n## 🌐 Remote API Integration\r\n\r\n### Server Requirements\r\n\r\nYour API should return JSON arrays:\r\n\r\n```json\r\n[\r\n  { \"id\": 1, \"name\": \"John Doe\", \"email\": \"john@example.com\" },\r\n  { \"id\": 2, \"name\": \"Jane Smith\", \"email\": \"jane@example.com\" }\r\n]\r\n```\r\n\r\n### Search Implementation\r\n\r\nWhen search is enabled, queries are sent as URL parameters:\r\n\r\n```\r\nGET /api/users?q=john\r\n```\r\n\r\n### Server Examples\r\n\r\n<details>\r\n<summary><strong>PHP (Laravel)</strong></summary>\r\n\r\n```php\r\nRoute::get('/api/users', function (Request $request) {\r\n    $query = $request->get('q');\r\n\r\n    return User::when($query, function ($q) use ($query) {\r\n        return $q->where('name', 'LIKE', \"%{$query}%\")\r\n                ->orWhere('email', 'LIKE', \"%{$query}%\");\r\n    })\r\n    ->select('id', 'name', 'email')\r\n    ->limit(50)\r\n    ->get();\r\n});\r\n```\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><strong>Node.js (Express)</strong></summary>\r\n\r\n```javascript\r\napp.get(\"/api/users\", (req, res) => {\r\n  const query = req.query.q;\r\n  let sql = \"SELECT id, name, email FROM users\";\r\n  let params = [];\r\n\r\n  if (query) {\r\n    sql += \" WHERE name LIKE ? OR email LIKE ?\";\r\n    params = [`%${query}%`, `%${query}%`];\r\n  }\r\n\r\n  db.query(sql + \" LIMIT 50\", params, (err, results) => {\r\n    if (err) return res.status(500).json({ error: err.message });\r\n    res.json(results);\r\n  });\r\n});\r\n```\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><strong>Python (Django)</strong></summary>\r\n\r\n```python\r\nfrom django.http import JsonResponse\r\nfrom django.db.models import Q\r\n\r\ndef users_api(request):\r\n    query = request.GET.get('q', '')\r\n    users = User.objects.all()\r\n\r\n    if query:\r\n        users = users.filter(\r\n            Q(name__icontains=query) | Q(email__icontains=query)\r\n        )\r\n\r\n    return JsonResponse(\r\n        list(users.values('id', 'name', 'email')[:50]),\r\n        safe=False\r\n    )\r\n```\r\n\r\n</details>\r\n\r\n---\r\n\r\n## 🔧 Advanced Usage\r\n\r\n### Form Integration\r\n\r\n```html\r\n<form class=\"needs-validation\" novalidate>\r\n  <div class=\"mb-3\">\r\n    <label class=\"form-label\">Required Field</label>\r\n    <select class=\"form-select azh-select\" name=\"category\" required>\r\n      <option value=\"\">Select...</option>\r\n      <option value=\"tech\">Technology</option>\r\n      <option value=\"design\">Design</option>\r\n    </select>\r\n    <div class=\"invalid-feedback\">Please select a category.</div>\r\n  </div>\r\n  <button type=\"submit\" class=\"btn btn-primary\">Submit</button>\r\n</form>\r\n```\r\n\r\n### Framework Integration\r\n\r\n<details>\r\n<summary><strong>React</strong></summary>\r\n\r\n```jsx\r\nimport React, { useEffect, useRef } from \"react\";\r\nimport azhSelect from \"azh-select\";\r\n\r\nfunction AzhSelectComponent({ options, value, onChange }) {\r\n  const selectRef = useRef();\r\n\r\n  useEffect(() => {\r\n    azhSelect.init(selectRef.current);\r\n    selectRef.current.addEventListener(\"azh:change\", onChange);\r\n\r\n    return () => azhSelect.destroy(selectRef.current);\r\n  }, []);\r\n\r\n  return (\r\n    <select ref={selectRef} className=\"form-select azh-select\">\r\n      {options.map((opt) => (\r\n        <option key={opt.value} value={opt.value}>\r\n          {opt.label}\r\n        </option>\r\n      ))}\r\n    </select>\r\n  );\r\n}\r\n```\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><strong>Vue.js</strong></summary>\r\n\r\n```vue\r\n<template>\r\n  <select ref=\"select\" class=\"form-select azh-select\" v-model=\"value\">\r\n    <option v-for=\"option in options\" :key=\"option.value\" :value=\"option.value\">\r\n      {{ option.label }}\r\n    </option>\r\n  </select>\r\n</template>\r\n\r\n<script>\r\nimport azhSelect from \"azh-select\";\r\n\r\nexport default {\r\n  props: [\"options\", \"value\"],\r\n  mounted() {\r\n    azhSelect.init(this.$refs.select);\r\n    this.$refs.select.addEventListener(\"azh:change\", () => {\r\n      this.$emit(\"input\", this.$refs.select.value);\r\n    });\r\n  },\r\n  beforeDestroy() {\r\n    azhSelect.destroy(this.$refs.select);\r\n  },\r\n};\r\n</script>\r\n```\r\n\r\n</details>\r\n\r\n---\r\n\r\n## 🛠️ Development\r\n\r\n### Building from Source\r\n\r\n```bash\r\n# Clone the repository\r\ngit clone https://github.com/alizharb/azh-select.git\r\ncd azh-select\r\n\r\n# Install dependencies\r\nnpm install\r\n\r\n# Build for production\r\nnpm run build\r\n\r\n# Development with live reload\r\nnpm run dev\r\n\r\n# Run tests\r\nnpm test\r\n```\r\n\r\n### Project Structure\r\n\r\n```\r\nazh-select/\r\n├── dist/\r\n│   ├── js/\r\n│   │   ├── azh-select.js\r\n│   │   └── azh-select.min.js\r\n│   ├── css/\r\n│   │   ├── azh-select.css\r\n│   │   └── azh-select.min.css\r\n│   ├── scss/\r\n│   │   └── azh-select.scss\r\n│   └── less/\r\n│       └── azh-select.less\r\n├── types/       # TypeScript typings\r\n```\r\n\r\n---\r\n\r\n## 🧪 Browser Support\r\n\r\n| Browser | Version | Notes           |\r\n| ------- | ------- | --------------- |\r\n| Chrome  | 60+     | ✅ Full support |\r\n| Firefox | 55+     | ✅ Full support |\r\n| Safari  | 12+     | ✅ Full support |\r\n| Edge    | 79+     | ✅ Full support |\r\n| IE      | ❌      | Not supported   |\r\n\r\n### Feature Support\r\n\r\n- **CSS Custom Properties**: All supported browsers\r\n- **Fetch API**: All supported browsers\r\n- **Custom Events**: All supported browsers\r\n- **ES6 Classes**: All supported browsers\r\n\r\n---\r\n\r\n## 🤝 Contributing\r\n\r\nWe welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.\r\n\r\n### Ways to Contribute\r\n\r\n- 🐛 **Bug Reports** - Found an issue? Let us know!\r\n- 💡 **Feature Requests** - Have an idea? Share it!\r\n- 📝 **Documentation** - Help improve our docs\r\n- 🔧 **Code** - Submit pull requests\r\n- 🧪 **Testing** - Help test new features\r\n\r\n### Development Setup\r\n\r\n1. Fork the repository\r\n2. Create a feature branch: `git checkout -b feature-name`\r\n3. Make your changes and test thoroughly\r\n4. Submit a pull request with a clear description\r\n\r\n---\r\n\r\n## 📄 License\r\n\r\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\r\n\r\n---\r\n\r\n## 🙏 Acknowledgments\r\n\r\n- **Bootstrap Team** - For the amazing CSS framework\r\n- **Contributors** - Everyone who has contributed to this project\r\n- **Community** - For feedback, bug reports, and feature suggestions\r\n\r\n---\r\n\r\n## 📞 Support\r\n\r\n- 📖 **Documentation**: [Full Documentation](https://alizharb.github.io/azh-select)\r\n- 🐛 **Bug Reports**: [GitHub Issues](https://github.com/alizharb/azh-select/issues)\r\n- 💬 **Discussions**: [GitHub Discussions](https://github.com/alizharb/azh-select/discussions)\r\n- 📧 **Email**: harbzali@gmail.com\r\n\r\n---\r\n\r\n<div align=\"center\">\r\n\r\n**⭐ Star this repo if you find it useful!**\r\n\r\nMade with ❤️ by [Ali Harb](https://github.com/alizharb)\r\n\r\n</div>\r\n","readmeFilename":"README.md"}