@referralgps/selectra 1.0.3 → 1.0.5

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.
package/README.md CHANGED
@@ -151,6 +151,7 @@ Enhance a standard `<select>` element — options are read automatically:
151
151
  | `load` | `function \| null` | `null` | Remote data loader |
152
152
  | `loadThrottle` | `number` | `300` | Load debounce delay (ms) |
153
153
  | `plugins` | `Array` | `[]` | Plugins to activate |
154
+ | `dropdownPlaceholder` | `string` | `''` | Pre-search placeholder
154
155
 
155
156
  ### Custom Rendering
156
157
 
@@ -1,4 +1,4 @@
1
- /*! Selectra v1.0.3 | Apache-2.0 License */
1
+ /*! Selectra v1.0.5 | Apache-2.0 License */
2
2
  const DIACRITICS = {
3
3
  a: "[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]",
4
4
  b: "[b␢βΒB฿𐌁ᛒ]",
@@ -330,6 +330,7 @@ const DEFAULTS = {
330
330
  loadThrottle: 300,
331
331
  loadingClass: "loading",
332
332
  placeholder: "",
333
+ dropdownPlaceholder: "",
333
334
  mode: null,
334
335
  // 'single' | 'multi' — auto-detected
335
336
  search: true,
@@ -353,6 +354,7 @@ const DEFAULTS = {
353
354
  optionCreate: null,
354
355
  optgroupHeader: null,
355
356
  noResults: null,
357
+ dropdownPlaceholder: null,
356
358
  loading: null
357
359
  },
358
360
  // Callbacks
@@ -978,6 +980,14 @@ function createSelectizeComponent(userConfig = {}) {
978
980
  }
979
981
  return "No results found";
980
982
  },
983
+ renderDropdownPlaceholder() {
984
+ var _a;
985
+ const config = this._config;
986
+ if ((_a = config.render) == null ? void 0 : _a.dropdownPlaceholder) {
987
+ return config.render.dropdownPlaceholder({}, escapeHtml);
988
+ }
989
+ return escapeHtml(config.dropdownPlaceholder || "");
990
+ },
981
991
  renderLoading() {
982
992
  var _a;
983
993
  const config = this._config;
@@ -1381,10 +1391,14 @@ const SELECTRA_TEMPLATE = `
1381
1391
  class="selectra-option-create"
1382
1392
  x-html="renderOptionCreate()">
1383
1393
  </div>
1384
- <div x-show="filteredOptions.length === 0 && !isLoading && !canCreate"
1394
+ <div x-show="filteredOptions.length === 0 && !isLoading && !canCreate && query.length > 0"
1385
1395
  class="selectra-no-results"
1386
1396
  x-html="renderNoResults()">
1387
1397
  </div>
1398
+ <div x-show="filteredOptions.length === 0 && !isLoading && !canCreate && query.length === 0 && _config.dropdownPlaceholder"
1399
+ class="selectra-no-results"
1400
+ x-html="renderDropdownPlaceholder()">
1401
+ </div>
1388
1402
  <div x-show="isLoading" class="selectra-loading">
1389
1403
  <div class="selectra-spinner"></div>
1390
1404
  <span x-html="renderLoading()"></span>
@@ -1404,7 +1418,7 @@ function SelectraPlugin(Alpine) {
1404
1418
  }
1405
1419
  });
1406
1420
  }
1407
- SelectraPlugin.version = "1.0.3";
1421
+ SelectraPlugin.version = "1.0.5";
1408
1422
  SelectraPlugin.template = SELECTRA_TEMPLATE;
1409
1423
  export {
1410
1424
  DEFAULTS,
@@ -1 +1 @@
1
- {"version":3,"file":"selectra.es.js","sources":["../src-alpine/sifter.js","../src-alpine/utils.js","../src-alpine/selectize.js","../src-alpine/plugins/index.js","../src-alpine/index.js"],"sourcesContent":["/**\n * Sifter - A library for textually searching arrays and hashes of objects.\n * Designed specifically for autocomplete. Supports diacritics, smart scoring,\n * multi-field sorting, and nested properties.\n *\n * Originally by Brian Reavis, modernized as ES module.\n */\n\nconst DIACRITICS = {\n a: '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]',\n b: '[b␢βΒB฿𐌁ᛒ]',\n c: '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄCc]',\n d: '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅDdð]',\n e: '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇEeɘǝƏƐε]',\n f: '[fƑƒḞḟ]',\n g: '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]',\n h: '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]',\n i: '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪIi]',\n j: '[jȷĴĵɈɉʝɟʲ]',\n k: '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]',\n l: '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟLl]',\n n: '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴNnŊŋ]',\n o: '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]',\n p: '[pṔṕṖṗⱣᵽƤƥᵱ]',\n q: '[qꝖꝗʠɊɋꝘꝙq̃]',\n r: '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]',\n s: '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]',\n t: '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]',\n u: '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]',\n v: '[vṼṽṾṿƲʋꝞꝟⱱʋ]',\n w: '[wẂẃẀẁŴŵẄẅẆẇẈẉ]',\n x: '[xẌẍẊẋχ]',\n y: '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]',\n z: '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]',\n};\n\nconst asciifold = (() => {\n const lookup = {};\n let i18nChars = '';\n for (const k in DIACRITICS) {\n const chunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1);\n i18nChars += chunk;\n for (let i = 0; i < chunk.length; i++) {\n lookup[chunk.charAt(i)] = k;\n }\n }\n const regexp = new RegExp('[' + i18nChars + ']', 'g');\n return (str) =>\n str\n .replace(regexp, (ch) => lookup[ch] || '')\n .toLowerCase();\n})();\n\nfunction escapeRegex(str) {\n return (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n}\n\nfunction getAttr(obj, name, nesting) {\n if (!obj || !name) return undefined;\n if (!nesting) return obj[name];\n const names = name.split('.');\n let current = obj;\n while (names.length && current) {\n current = current[names.shift()];\n }\n return current;\n}\n\nfunction cmp(a, b) {\n if (typeof a === 'number' && typeof b === 'number') {\n return a > b ? 1 : a < b ? -1 : 0;\n }\n a = asciifold(String(a || ''));\n b = asciifold(String(b || ''));\n if (a > b) return 1;\n if (b > a) return -1;\n return 0;\n}\n\nexport default class Sifter {\n constructor(items, settings = {}) {\n this.items = items;\n this.settings = { diacritics: true, ...settings };\n }\n\n tokenize(query, respectWordBoundaries) {\n query = String(query || '').toLowerCase().trim();\n if (!query.length) return [];\n\n const tokens = [];\n const words = query.split(/\\s+/);\n\n for (const word of words) {\n let regex = escapeRegex(word);\n if (this.settings.diacritics) {\n for (const letter in DIACRITICS) {\n regex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]);\n }\n }\n if (respectWordBoundaries) regex = '\\\\b' + regex;\n tokens.push({ string: word, regex: new RegExp(regex, 'i') });\n }\n\n return tokens;\n }\n\n getScoreFunction(search, options) {\n search = this.prepareSearch(search, options);\n const { tokens } = search;\n const { fields } = search.options;\n const tokenCount = tokens.length;\n const { nesting } = search.options;\n\n const scoreValue = (value, token) => {\n if (!value) return 0;\n value = String(value || '');\n const pos = value.search(token.regex);\n if (pos === -1) return 0;\n let score = token.string.length / value.length;\n if (pos === 0) score += 0.5;\n return score;\n };\n\n const fieldCount = fields.length;\n const scoreObject =\n fieldCount === 0\n ? () => 0\n : fieldCount === 1\n ? (token, data) => scoreValue(getAttr(data, fields[0], nesting), token)\n : (token, data) => {\n let sum = 0;\n for (let i = 0; i < fieldCount; i++) {\n sum += scoreValue(getAttr(data, fields[i], nesting), token);\n }\n return sum / fieldCount;\n };\n\n if (!tokenCount) return () => 0;\n if (tokenCount === 1) return (data) => scoreObject(tokens[0], data);\n\n if (search.options.conjunction === 'and') {\n return (data) => {\n let sum = 0;\n for (let i = 0; i < tokenCount; i++) {\n const score = scoreObject(tokens[i], data);\n if (score <= 0) return 0;\n sum += score;\n }\n return sum / tokenCount;\n };\n }\n\n return (data) => {\n let sum = 0;\n for (let i = 0; i < tokenCount; i++) {\n sum += scoreObject(tokens[i], data);\n }\n return sum / tokenCount;\n };\n }\n\n getSortFunction(search, options) {\n search = this.prepareSearch(search, options);\n const sort = (!search.query && options.sort_empty) || options.sort;\n\n const getField = (name, result) => {\n if (name === '$score') return result.score;\n return getAttr(this.items[result.id], name, options.nesting);\n };\n\n const fields = [];\n if (sort) {\n for (const s of sort) {\n if (search.query || s.field !== '$score') {\n fields.push(s);\n }\n }\n }\n\n if (search.query) {\n let implicitScore = true;\n for (const f of fields) {\n if (f.field === '$score') {\n implicitScore = false;\n break;\n }\n }\n if (implicitScore) fields.unshift({ field: '$score', direction: 'desc' });\n } else {\n const idx = fields.findIndex((f) => f.field === '$score');\n if (idx !== -1) fields.splice(idx, 1);\n }\n\n const multipliers = fields.map((f) => (f.direction === 'desc' ? -1 : 1));\n const fieldCount = fields.length;\n\n if (!fieldCount) return null;\n if (fieldCount === 1) {\n const field = fields[0].field;\n const mult = multipliers[0];\n return (a, b) => mult * cmp(getField(field, a), getField(field, b));\n }\n\n return (a, b) => {\n for (let i = 0; i < fieldCount; i++) {\n const result = multipliers[i] * cmp(getField(fields[i].field, a), getField(fields[i].field, b));\n if (result) return result;\n }\n return 0;\n };\n }\n\n prepareSearch(query, options) {\n if (typeof query === 'object') return query;\n options = { ...options };\n\n if (options.fields && !Array.isArray(options.fields)) options.fields = [options.fields];\n if (options.sort && !Array.isArray(options.sort)) options.sort = [options.sort];\n if (options.sort_empty && !Array.isArray(options.sort_empty))\n options.sort_empty = [options.sort_empty];\n\n return {\n options,\n query: String(query || '').toLowerCase(),\n tokens: this.tokenize(query, options.respect_word_boundaries),\n total: 0,\n items: [],\n };\n }\n\n search(query, options) {\n const search = this.prepareSearch(query, options);\n const opts = search.options;\n const q = search.query;\n\n const fnScore = opts.score || this.getScoreFunction(search);\n\n const items = this.items;\n if (q.length) {\n const iterate = Array.isArray(items)\n ? (cb) => items.forEach((item, i) => cb(item, i))\n : (cb) => Object.keys(items).forEach((key) => cb(items[key], key));\n\n iterate((item, id) => {\n const score = fnScore(item);\n if (opts.filter === false || score > 0) {\n search.items.push({ score, id });\n }\n });\n } else {\n const iterate = Array.isArray(items)\n ? (cb) => items.forEach((item, i) => cb(item, i))\n : (cb) => Object.keys(items).forEach((key) => cb(items[key], key));\n\n iterate((item, id) => {\n search.items.push({ score: 1, id });\n });\n }\n\n const fnSort = this.getSortFunction(search, opts);\n if (fnSort) search.items.sort(fnSort);\n\n search.total = search.items.length;\n if (typeof opts.limit === 'number') {\n search.items = search.items.slice(0, opts.limit);\n }\n\n return search;\n }\n}\n","/**\n * Utility functions for Selectize Alpine.js\n */\n\n/**\n * Escape HTML entities to prevent XSS\n */\nexport function escapeHtml(str) {\n if (typeof str !== 'string') return '';\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\n/**\n * Debounce a function call\n */\nexport function debounce(fn, delay) {\n let timer;\n return function (...args) {\n clearTimeout(timer);\n timer = setTimeout(() => fn.apply(this, args), delay);\n };\n}\n\n/**\n * Generate a unique ID\n */\nlet idCounter = 0;\nexport function uid(prefix = 'selectize') {\n return `${prefix}-${++idCounter}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Hash a value to a string key\n */\nexport function hashKey(value) {\n if (typeof value === 'undefined' || value === null) return null;\n return typeof value === 'boolean'\n ? value ? '1' : '0'\n : String(value);\n}\n\n/**\n * Highlight matching text in a string\n */\nexport function highlight(text, search) {\n if (!search || !search.length) return escapeHtml(text);\n const escaped = escapeHtml(text);\n const regex = new RegExp(\n '(' + search.replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1') + ')',\n 'ig'\n );\n return escaped.replace(regex, '<span class=\"font-semibold text-inherit\">$1</span>');\n}\n\n/**\n * Measure the width of a string in pixels\n */\nlet measureCanvas;\nexport function measureString(str, el) {\n if (!measureCanvas) {\n measureCanvas = document.createElement('canvas');\n }\n const ctx = measureCanvas.getContext('2d');\n if (el) {\n const style = window.getComputedStyle(el);\n ctx.font = `${style.fontStyle} ${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n }\n return ctx.measureText(str).width;\n}\n\n/**\n * Auto-grow an input element to fit its content\n */\nexport function autoGrow(input, extraWidth = 10) {\n const val = input.value || input.placeholder || '';\n const width = measureString(val, input) + extraWidth;\n input.style.width = Math.max(width, 60) + 'px';\n}\n\n/**\n * Deep merge objects (simple version)\n */\nexport function deepMerge(target, ...sources) {\n for (const source of sources) {\n if (!source) continue;\n for (const key of Object.keys(source)) {\n if (\n source[key] &&\n typeof source[key] === 'object' &&\n !Array.isArray(source[key])\n ) {\n target[key] = deepMerge(target[key] || {}, source[key]);\n } else {\n target[key] = source[key];\n }\n }\n }\n return target;\n}\n\n/**\n * Determine if the given element is a <select> tag\n */\nexport function isSelectElement(el) {\n return el.tagName && el.tagName.toLowerCase() === 'select';\n}\n\n/**\n * Determine if the given element is an <input> tag\n */\nexport function isInputElement(el) {\n return el.tagName && el.tagName.toLowerCase() === 'input';\n}\n\n/**\n * Read options from a native <select> element\n */\nexport function readSelectOptions(selectEl) {\n const options = [];\n const optgroups = [];\n const selectedValues = [];\n\n const processOption = (optionEl, optgroup = null) => {\n const value = optionEl.value;\n const text = optionEl.textContent.trim();\n const disabled = optionEl.disabled;\n\n if (!value && !text) return;\n\n const data = { value, text, disabled };\n\n // Read data-* attributes\n if (optionEl.dataset.data) {\n try {\n Object.assign(data, JSON.parse(optionEl.dataset.data));\n } catch (_) {\n // ignore\n }\n }\n\n if (optgroup !== null) {\n data.optgroup = optgroup;\n }\n\n if (optionEl.selected) {\n selectedValues.push(value);\n }\n\n options.push(data);\n };\n\n for (const child of selectEl.children) {\n if (child.tagName.toLowerCase() === 'optgroup') {\n const groupId = child.getAttribute('label') || '';\n optgroups.push({\n value: groupId,\n label: groupId,\n disabled: child.disabled,\n });\n for (const opt of child.children) {\n processOption(opt, groupId);\n }\n } else if (child.tagName.toLowerCase() === 'option') {\n processOption(child);\n }\n }\n\n return { options, optgroups, selectedValues };\n}\n\n/**\n * Check if element is RTL\n */\nexport function isRtl(el) {\n const style = window.getComputedStyle(el);\n return style.direction === 'rtl';\n}\n","/**\n * Selectra Alpine.js Component\n *\n * A powerful, extensible select/tagging component built with Alpine.js and Tailwind CSS.\n * Drop-in replacement for selectize.js without jQuery dependency.\n */\n\nimport Sifter from './sifter.js';\nimport {\n escapeHtml,\n debounce,\n uid,\n hashKey,\n highlight,\n autoGrow,\n readSelectOptions,\n isSelectElement,\n isRtl,\n} from './utils.js';\n\n/** Default configuration */\nconst DEFAULTS = {\n delimiter: ',',\n splitOn: null,\n persist: true,\n diacritics: true,\n create: false,\n showAddOptionOnCreate: true,\n createOnBlur: false,\n createFilter: null,\n highlight: true,\n openOnFocus: true,\n maxOptions: 1000,\n maxItems: null,\n hideSelected: null,\n selectOnTab: true,\n preload: false,\n allowEmptyOption: false,\n closeAfterSelect: false,\n loadThrottle: 300,\n loadingClass: 'loading',\n placeholder: '',\n mode: null, // 'single' | 'multi' — auto-detected\n search: true,\n showArrow: true,\n valueField: 'value',\n labelField: 'text',\n disabledField: 'disabled',\n optgroupField: 'optgroup',\n optgroupLabelField: 'label',\n optgroupValueField: 'value',\n sortField: '$order',\n searchField: ['text'],\n searchConjunction: 'and',\n respectWordBoundaries: false,\n normalize: true,\n plugins: [],\n\n // Render functions — return HTML strings\n render: {\n option: null,\n item: null,\n optionCreate: null,\n optgroupHeader: null,\n noResults: null,\n loading: null,\n },\n\n // Callbacks\n load: null,\n score: null,\n onChange: null,\n onItemAdd: null,\n onItemRemove: null,\n onClear: null,\n onOptionAdd: null,\n onOptionRemove: null,\n onDropdownOpen: null,\n onDropdownClose: null,\n onType: null,\n onFocus: null,\n onBlur: null,\n onInitialize: null,\n};\n\n/** Registered plugins */\nconst pluginRegistry = {};\n\n/**\n * Create the selectize Alpine.js component\n */\nexport function createSelectizeComponent(userConfig = {}) {\n return () => ({\n // ── Reactive state ──────────────────────────────────────\n isOpen: false,\n isFocused: false,\n isDisabled: false,\n isLocked: false,\n isLoading: false,\n isInvalid: false,\n\n query: '',\n activeIndex: -1,\n caretPos: 0,\n\n items: [], // selected values (strings)\n options: {}, // { [value]: { value, text, ... } }\n optgroups: {}, // { [id]: { value, label, ... } }\n userOptions: {}, // user-created option values\n optionOrder: [], // maintains insertion order\n\n loadedSearches: {},\n lastQuery: '',\n\n // Internal\n _config: {},\n _sifter: null,\n _sourceEl: null,\n _id: '',\n _rtl: false,\n _plugins: [],\n _renderCache: {},\n\n // ── Computed properties ─────────────────────────────────\n get config() {\n return this._config;\n },\n\n get isMultiple() {\n return this._config.mode === 'multi';\n },\n\n get isSingle() {\n return this._config.mode === 'single';\n },\n\n get isFull() {\n return this._config.maxItems !== null && this.items.length >= this._config.maxItems;\n },\n\n get hasOptions() {\n return Object.keys(this.options).length > 0;\n },\n\n get canCreate() {\n if (!this._config.create) return false;\n if (!this.query.trim()) return false;\n if (this.isFull) return false;\n if (this._config.createFilter) {\n const filter = this._config.createFilter;\n if (typeof filter === 'function') return filter(this.query);\n if (filter instanceof RegExp) return filter.test(this.query);\n if (typeof filter === 'string') return new RegExp(filter).test(this.query);\n }\n // Check if already exists\n const existing = Object.values(this.options).find(\n (o) => o[this._config.labelField]?.toLowerCase() === this.query.toLowerCase()\n );\n return !existing;\n },\n\n get selectedItems() {\n return this.items\n .map((val) => this.options[hashKey(val)])\n .filter(Boolean);\n },\n\n get filteredOptions() {\n return this._getFilteredOptions();\n },\n\n get placeholderText() {\n if (this.items.length > 0 && this.isSingle) return '';\n return this._config.placeholder || '';\n },\n\n get currentValueText() {\n if (!this.isSingle || !this.items.length) return '';\n const opt = this.options[hashKey(this.items[0])];\n return opt ? opt[this._config.labelField] : '';\n },\n\n // ── Lifecycle ───────────────────────────────────────────\n init() {\n this._id = uid();\n this._config = { ...DEFAULTS, ...userConfig };\n\n // Detect source element\n this._sourceEl = this.$el.querySelector('select, input[type=\"text\"], input[type=\"hidden\"]');\n\n // Read options from <select> if present\n if (this._sourceEl && isSelectElement(this._sourceEl)) {\n const parsed = readSelectOptions(this._sourceEl);\n\n // Merge parsed options with config options\n const configOptions = this._config.options || [];\n const allOptions = [...parsed.options, ...configOptions];\n this._registerOptions(allOptions);\n\n // Register optgroups\n for (const og of parsed.optgroups) {\n this.optgroups[og.value] = og;\n }\n\n // Set initial value\n if (parsed.selectedValues.length) {\n this.items = [...parsed.selectedValues];\n }\n\n // Detect mode from select element\n if (!userConfig.mode) {\n this._config.mode = this._sourceEl.multiple ? 'multi' : 'single';\n }\n\n // Read attributes\n if (this._sourceEl.hasAttribute('required')) this.isInvalid = !this.items.length;\n if (this._sourceEl.disabled) this.isDisabled = true;\n if (this._sourceEl.placeholder) this._config.placeholder = this._sourceEl.placeholder;\n\n // Hide source element\n this._sourceEl.style.display = 'none';\n this._sourceEl.setAttribute('tabindex', '-1');\n\n // RTL detection\n this._rtl = isRtl(this._sourceEl);\n } else {\n // Config-only mode\n const configOptions = this._config.options || [];\n this._registerOptions(configOptions);\n\n // Register optgroups from config\n if (this._config.optgroups) {\n for (const og of this._config.optgroups) {\n this.optgroups[og[this._config.optgroupValueField]] = og;\n }\n }\n\n // Set initial items\n if (this._config.items) {\n this.items = [...this._config.items];\n }\n }\n\n // Mode detection\n if (!this._config.mode) {\n this._config.mode = this._config.maxItems === 1 ? 'single' : 'multi';\n }\n\n // Set maxItems=1 for single mode\n if (this._config.mode === 'single') {\n this._config.maxItems = 1;\n }\n\n // Default hideSelected\n if (this._config.hideSelected === null) {\n this._config.hideSelected = this._config.mode === 'multi';\n }\n\n // Initialize search engine\n this._sifter = new Sifter(this.options, { diacritics: this._config.diacritics });\n\n // Initialize plugins\n this._initPlugins();\n\n // Set up the load function debouncing\n if (this._config.load && this._config.loadThrottle) {\n this._debouncedLoad = debounce(this._performLoad.bind(this), this._config.loadThrottle);\n }\n\n // Preload if configured\n if (this._config.preload) {\n this.$nextTick(() => {\n if (this._config.preload === 'focus') {\n // Will load on focus\n } else {\n this._performLoad('');\n }\n });\n }\n\n // Trigger onInitialize\n this._trigger('onInitialize');\n\n // Watch for outside clicks\n this._onClickOutside = (e) => {\n if (!this.$el.contains(e.target)) {\n this.close();\n this.blur();\n }\n };\n document.addEventListener('mousedown', this._onClickOutside);\n },\n\n destroy() {\n document.removeEventListener('mousedown', this._onClickOutside);\n if (this._sourceEl) {\n this._sourceEl.style.display = '';\n this._sourceEl.removeAttribute('tabindex');\n }\n },\n\n // ── Plugin System ───────────────────────────────────────\n _initPlugins() {\n const plugins = this._config.plugins || [];\n for (const plugin of plugins) {\n const name = typeof plugin === 'string' ? plugin : plugin.name;\n const opts = typeof plugin === 'string' ? {} : (plugin.options || {});\n if (pluginRegistry[name]) {\n pluginRegistry[name].call(this, opts);\n this._plugins.push(name);\n } else {\n console.warn(`[selectize] Plugin \"${name}\" not found.`);\n }\n }\n },\n\n // ── Option Management ───────────────────────────────────\n _registerOptions(optionsList) {\n for (const opt of optionsList) {\n this.addOption(opt, true);\n }\n },\n\n addOption(data, silent = false) {\n if (Array.isArray(data)) {\n for (const item of data) this.addOption(item, silent);\n return;\n }\n const key = hashKey(data[this._config.valueField]);\n if (key === null || this.options[key]) return;\n\n data.$order = data.$order || ++this._orderCounter || (this._orderCounter = 1);\n this.options[key] = data;\n this.optionOrder.push(key);\n\n // Update sifter\n if (this._sifter) this._sifter.items = this.options;\n this._clearRenderCache();\n if (!silent) this._trigger('onOptionAdd', key, data);\n },\n\n updateOption(value, data) {\n const key = hashKey(value);\n if (!key || !this.options[key]) return;\n\n const newKey = hashKey(data[this._config.valueField]);\n data.$order = this.options[key].$order;\n this.options[newKey] = data;\n\n if (key !== newKey) {\n delete this.options[key];\n const idx = this.optionOrder.indexOf(key);\n if (idx !== -1) this.optionOrder[idx] = newKey;\n\n // Update items\n const itemIdx = this.items.indexOf(key);\n if (itemIdx !== -1) this.items[itemIdx] = newKey;\n }\n\n if (this._sifter) this._sifter.items = this.options;\n this._clearRenderCache();\n },\n\n removeOption(value) {\n const key = hashKey(value);\n if (!key) return;\n delete this.options[key];\n delete this.userOptions[key];\n const idx = this.optionOrder.indexOf(key);\n if (idx !== -1) this.optionOrder.splice(idx, 1);\n\n this.items = this.items.filter((v) => v !== key);\n if (this._sifter) this._sifter.items = this.options;\n this._clearRenderCache();\n this._trigger('onOptionRemove', key);\n },\n\n clearOptions() {\n // Keep selected items' options\n const keep = {};\n for (const val of this.items) {\n if (this.options[val]) keep[val] = this.options[val];\n }\n this.options = keep;\n this.optionOrder = Object.keys(keep);\n this.userOptions = {};\n if (this._sifter) this._sifter.items = this.options;\n this._clearRenderCache();\n },\n\n getOption(value) {\n return this.options[hashKey(value)] || null;\n },\n\n // ── Item (Selection) Management ─────────────────────────\n addItem(value, silent = false) {\n const key = hashKey(value);\n if (!key || !this.options[key]) return;\n if (this.items.includes(key)) return;\n\n // For single select, replace the current item instead of blocking\n if (this.isSingle && this.items.length) {\n this.removeItem(this.items[0], true);\n }\n\n // For multi select, respect the maxItems limit\n if (this.isFull) return;\n\n this.items.push(key);\n this.caretPos = this.items.length;\n\n this._syncSourceElement();\n this._clearRenderCache();\n this.query = '';\n\n if (this._config.closeAfterSelect || this.isSingle) {\n this.close();\n }\n\n if (this.isFull) {\n this.close();\n }\n\n if (!silent) {\n this._trigger('onItemAdd', key, this.options[key]);\n this._trigger('onChange', this.getValue());\n }\n },\n\n removeItem(value, silent = false) {\n const key = hashKey(value);\n const idx = this.items.indexOf(key);\n if (idx === -1) return;\n\n this.items.splice(idx, 1);\n if (this.caretPos > this.items.length) {\n this.caretPos = this.items.length;\n }\n\n this._syncSourceElement();\n this._clearRenderCache();\n\n if (!silent) {\n this._trigger('onItemRemove', key);\n this._trigger('onChange', this.getValue());\n }\n },\n\n clear(silent = false) {\n if (!this.items.length) return;\n this.items = [];\n this.caretPos = 0;\n this._syncSourceElement();\n this._clearRenderCache();\n\n if (!silent) {\n this._trigger('onClear');\n this._trigger('onChange', this.getValue());\n }\n },\n\n getValue() {\n if (this.isSingle) {\n return this.items.length ? this.items[0] : '';\n }\n return [...this.items];\n },\n\n setValue(value, silent = false) {\n this.clear(true);\n const values = Array.isArray(value) ? value : [value];\n for (const v of values) {\n if (v !== '' && v !== null && v !== undefined) {\n this.addItem(v, true);\n }\n }\n if (!silent) {\n this._trigger('onChange', this.getValue());\n }\n },\n\n // ── Create Item ─────────────────────────────────────────\n createItem(input = null) {\n const val = input !== null ? input : this.query;\n if (!val.trim()) return;\n if (!this._config.create) return;\n\n const createFn = this._config.create;\n let data;\n\n if (typeof createFn === 'function') {\n data = createFn(val, (result) => {\n if (result) {\n this.addOption(result);\n this.addItem(result[this._config.valueField]);\n }\n });\n // If create returns data synchronously, use it\n if (data && typeof data === 'object') {\n this.addOption(data);\n this.addItem(data[this._config.valueField]);\n }\n } else {\n // Default creation: use input as both value and label\n data = {};\n data[this._config.valueField] = val;\n data[this._config.labelField] = val;\n this.addOption(data);\n this.addItem(val);\n }\n\n this.query = '';\n this._clearRenderCache();\n },\n\n // ── Search ──────────────────────────────────────────────\n _getFilteredOptions() {\n const config = this._config;\n if (!this._sifter) return [];\n\n // Prepare search fields\n const searchFields = Array.isArray(config.searchField)\n ? config.searchField\n : [config.searchField];\n\n // Prepare sort\n let sort;\n if (config.sortField) {\n if (typeof config.sortField === 'string') {\n sort = [{ field: config.sortField, direction: 'asc' }];\n } else if (Array.isArray(config.sortField)) {\n sort = config.sortField;\n } else {\n sort = [config.sortField];\n }\n } else {\n sort = [{ field: '$order', direction: 'asc' }];\n }\n\n let q = this.query;\n if (config.normalize && q) {\n q = q.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n }\n\n const searchOptions = {\n fields: searchFields,\n conjunction: config.searchConjunction,\n sort,\n nesting: searchFields.some((f) => f.includes('.')),\n respect_word_boundaries: config.respectWordBoundaries,\n limit: config.maxOptions,\n };\n\n if (config.score) {\n searchOptions.score = config.score;\n }\n\n const results = this._sifter.search(q, searchOptions);\n\n let filtered = results.items\n .map((item) => {\n const opt = this.options[item.id];\n return opt ? { ...opt, _score: item.score } : null;\n })\n .filter(Boolean);\n\n // Hide selected\n if (config.hideSelected) {\n filtered = filtered.filter(\n (opt) => !this.items.includes(hashKey(opt[config.valueField]))\n );\n }\n\n // Filter disabled\n filtered = filtered.filter((opt) => !opt[config.disabledField]);\n\n return filtered;\n },\n\n // ── Dropdown Control ────────────────────────────────────\n open() {\n if (this.isOpen || this.isDisabled || this.isLocked) return;\n this.isOpen = true;\n this.activeIndex = this._config.setFirstOptionActive ? 0 : -1;\n this._trigger('onDropdownOpen');\n\n this.$nextTick(() => {\n this._scrollToActive();\n });\n },\n\n close() {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.activeIndex = -1;\n this._trigger('onDropdownClose');\n },\n\n toggle() {\n this.isOpen ? this.close() : this.open();\n },\n\n // ── Focus / Blur ────────────────────────────────────────\n focus() {\n if (this.isDisabled) return;\n this.isFocused = true;\n\n const input = this.$refs.searchInput;\n if (input) {\n this.$nextTick(() => input.focus());\n }\n\n if (this._config.openOnFocus) {\n this.open();\n }\n\n if (this._config.preload === 'focus' && !this.loadedSearches['']) {\n this._performLoad('');\n }\n\n this._trigger('onFocus');\n },\n\n blur() {\n if (!this.isFocused) return;\n this.isFocused = false;\n\n if (this._config.createOnBlur && this.query.trim() && this.canCreate) {\n this.createItem();\n }\n\n this.close();\n this._trigger('onBlur');\n },\n\n // ── Keyboard Navigation ─────────────────────────────────\n onKeyDown(e) {\n if (this.isDisabled || this.isLocked) return;\n\n const opts = this.filteredOptions;\n const canCreateNow = this.canCreate;\n const totalItems = opts.length + (canCreateNow ? 1 : 0);\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!this.isOpen) {\n this.open();\n } else {\n this.activeIndex = Math.min(this.activeIndex + 1, totalItems - 1);\n this._scrollToActive();\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (this.isOpen) {\n this.activeIndex = Math.max(this.activeIndex - 1, 0);\n this._scrollToActive();\n }\n break;\n\n case 'Enter':\n e.preventDefault();\n if (this.isOpen && this.activeIndex >= 0) {\n if (this.activeIndex < opts.length) {\n this.selectOption(opts[this.activeIndex]);\n } else if (canCreateNow) {\n this.createItem();\n }\n } else if (!this.isOpen) {\n this.open();\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n this.close();\n break;\n\n case 'Tab':\n if (this.isOpen && this._config.selectOnTab && this.activeIndex >= 0) {\n e.preventDefault();\n if (this.activeIndex < opts.length) {\n this.selectOption(opts[this.activeIndex]);\n } else if (canCreateNow) {\n this.createItem();\n }\n }\n break;\n\n case 'Backspace':\n if (!this.query && this.items.length && this.isMultiple) {\n e.preventDefault();\n const lastItem = this.items[this.items.length - 1];\n this.removeItem(lastItem);\n }\n break;\n\n case 'Delete':\n if (!this.query && this.items.length && this.isMultiple) {\n e.preventDefault();\n const lastItem = this.items[this.items.length - 1];\n this.removeItem(lastItem);\n }\n break;\n\n case 'a':\n case 'A':\n if ((e.ctrlKey || e.metaKey) && this.isMultiple) {\n e.preventDefault();\n // Select all - no-op in terms of selection, could be used for copy\n }\n break;\n }\n },\n\n // ── Input Handling ──────────────────────────────────────\n onInput() {\n this._trigger('onType', this.query);\n\n if (!this.isOpen) {\n this.open();\n }\n\n // Active first option\n this.activeIndex = this._config.setFirstOptionActive || this.query ? 0 : -1;\n\n // Remote load\n if (this._config.load && this.query) {\n const q = this.query;\n if (!this.loadedSearches[q]) {\n if (this._debouncedLoad) {\n this._debouncedLoad(q);\n } else {\n this._performLoad(q);\n }\n }\n }\n\n // Auto-grow input\n if (this.$refs.searchInput && this.isMultiple) {\n autoGrow(this.$refs.searchInput);\n }\n },\n\n onPaste(e) {\n if (!this.isMultiple) return;\n const paste = (e.clipboardData || window.clipboardData).getData('text');\n if (!paste) return;\n\n const splitOn = this._config.splitOn || this._config.delimiter;\n if (!splitOn) return;\n\n e.preventDefault();\n const regex = splitOn instanceof RegExp ? splitOn : new RegExp('[' + splitOn.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&') + ']');\n const parts = paste.split(regex).map((s) => s.trim()).filter(Boolean);\n\n for (const part of parts) {\n // Try to find matching option\n const match = Object.values(this.options).find(\n (o) => o[this._config.labelField]?.toLowerCase() === part.toLowerCase() ||\n o[this._config.valueField]?.toLowerCase() === part.toLowerCase()\n );\n if (match) {\n this.addItem(match[this._config.valueField]);\n } else if (this._config.create) {\n this.createItem(part);\n }\n }\n },\n\n // ── Option Selection ────────────────────────────────────\n selectOption(option) {\n if (!option) return;\n if (option[this._config.disabledField]) return;\n\n const value = option[this._config.valueField];\n this.addItem(value);\n this.query = '';\n\n if (this.isSingle) {\n // In single mode, blur so isFocused becomes false and the\n // selected value text is displayed instead of the search input.\n // addItem() already called close(), so we must NOT refocus\n // (that would trigger openOnFocus and reopen the dropdown).\n this.isFocused = false;\n // Clear the search cache so the user can re-search when they\n // reopen the dropdown to change the selection.\n this.loadedSearches = {};\n if (this.$refs.searchInput) {\n this.$refs.searchInput.blur();\n }\n } else if (this.$refs.searchInput) {\n // In multi mode, keep focus so the user can continue selecting.\n this.$refs.searchInput.focus();\n autoGrow(this.$refs.searchInput);\n }\n },\n\n // ── Remote Loading ──────────────────────────────────────\n _performLoad(query) {\n if (!this._config.load) return;\n if (this.loadedSearches[query]) return;\n\n this.isLoading = true;\n this.loadedSearches[query] = true;\n\n this._config.load(query, (results) => {\n this.isLoading = false;\n if (results && Array.isArray(results)) {\n for (const item of results) {\n this.addOption(item, true);\n }\n this._clearRenderCache();\n }\n });\n },\n\n // ── Rendering Helpers ───────────────────────────────────\n renderOption(option) {\n const config = this._config;\n const label = option[config.labelField] || '';\n\n if (config.render?.option) {\n return config.render.option(option, escapeHtml);\n }\n\n if (config.highlight && this.query) {\n return highlight(label, this.query);\n }\n\n return escapeHtml(label);\n },\n\n renderItem(option) {\n if (!option) return '';\n const config = this._config;\n const label = option[config.labelField] || '';\n\n if (config.render?.item) {\n return config.render.item(option, escapeHtml);\n }\n\n return escapeHtml(label);\n },\n\n renderOptionCreate() {\n const config = this._config;\n if (config.render?.optionCreate) {\n return config.render.optionCreate({ input: this.query }, escapeHtml);\n }\n return `Add <span class=\"font-medium\">${escapeHtml(this.query)}</span>...`;\n },\n\n renderNoResults() {\n const config = this._config;\n if (config.render?.noResults) {\n return config.render.noResults({ query: this.query }, escapeHtml);\n }\n return 'No results found';\n },\n\n renderLoading() {\n const config = this._config;\n if (config.render?.loading) {\n return config.render.loading({ query: this.query }, escapeHtml);\n }\n return 'Loading...';\n },\n\n // ── Optgroup Support ────────────────────────────────────\n addOptionGroup(id, data) {\n this.optgroups[id] = data;\n this._clearRenderCache();\n },\n\n removeOptionGroup(id) {\n delete this.optgroups[id];\n this._clearRenderCache();\n },\n\n getGroupedOptions() {\n const options = this.filteredOptions;\n const config = this._config;\n const groups = {};\n const ungrouped = [];\n\n for (const opt of options) {\n const groupId = opt[config.optgroupField];\n if (groupId && this.optgroups[groupId]) {\n if (!groups[groupId]) groups[groupId] = [];\n groups[groupId].push(opt);\n } else {\n ungrouped.push(opt);\n }\n }\n\n const result = [];\n // Add grouped options\n for (const [id, items] of Object.entries(groups)) {\n const group = this.optgroups[id];\n result.push({\n id,\n label: group[config.optgroupLabelField] || id,\n options: items,\n });\n }\n // Add ungrouped\n if (ungrouped.length) {\n result.push({ id: null, label: null, options: ungrouped });\n }\n\n return result;\n },\n\n /**\n * Get grouped options with precomputed offsets for template binding.\n * Works for both grouped and flat option lists.\n */\n _getGroupedView() {\n const groups = this.getGroupedOptions();\n let offset = 0;\n return groups.map((g, i) => {\n const view = {\n key: g.id || '__ungrouped_' + i,\n label: g.label,\n options: g.options,\n offset,\n };\n offset += g.options.length;\n return view;\n });\n },\n\n get hasOptgroups() {\n return Object.keys(this.optgroups).length > 0;\n },\n\n // ── State Control ───────────────────────────────────────\n lock() {\n this.isLocked = true;\n this.close();\n },\n\n unlock() {\n this.isLocked = false;\n },\n\n disable() {\n this.isDisabled = true;\n this.close();\n },\n\n enable() {\n this.isDisabled = false;\n },\n\n setMaxItems(max) {\n this._config.maxItems = max;\n if (this.isFull) this.close();\n },\n\n // ── Source Element Sync ─────────────────────────────────\n _syncSourceElement() {\n if (!this._sourceEl) return;\n\n if (isSelectElement(this._sourceEl)) {\n // Update selected options in the native select\n for (const opt of this._sourceEl.options) {\n opt.selected = this.items.includes(opt.value);\n }\n\n // Add any missing options (user-created)\n for (const val of this.items) {\n const exists = Array.from(this._sourceEl.options).some((o) => o.value === val);\n if (!exists) {\n const optEl = document.createElement('option');\n optEl.value = val;\n optEl.textContent = this.options[val]?.[this._config.labelField] || val;\n optEl.selected = true;\n this._sourceEl.appendChild(optEl);\n }\n }\n\n // Dispatch native change event\n this._sourceEl.dispatchEvent(new Event('change', { bubbles: true }));\n } else {\n // Input element\n this._sourceEl.value = this.isSingle\n ? (this.items[0] || '')\n : this.items.join(this._config.delimiter);\n this._sourceEl.dispatchEvent(new Event('input', { bubbles: true }));\n this._sourceEl.dispatchEvent(new Event('change', { bubbles: true }));\n }\n },\n\n // ── Scroll Management ───────────────────────────────────\n _scrollToActive() {\n this.$nextTick(() => {\n const dropdown = this.$refs.dropdown;\n if (!dropdown) return;\n const active = dropdown.querySelector('[data-active=\"true\"]');\n if (active) {\n active.scrollIntoView({ block: 'nearest' });\n }\n });\n },\n\n // ── Event Triggering ────────────────────────────────────\n _trigger(callbackName, ...args) {\n const cb = this._config[callbackName];\n if (typeof cb === 'function') {\n cb.apply(this, args);\n }\n // Also dispatch a custom DOM event\n const eventName = callbackName.replace(/^on/, '').toLowerCase();\n this.$el.dispatchEvent(\n new CustomEvent(`selectra:${eventName}`, {\n detail: args,\n bubbles: true,\n })\n );\n },\n\n // ── Cache ───────────────────────────────────────────────\n _clearRenderCache() {\n this._renderCache = {};\n },\n\n // ── Helper: Check if an option is selected ──────────────\n isSelected(option) {\n return this.items.includes(hashKey(option[this._config.valueField]));\n },\n\n // ── Helper: Option key for x-for ────────────────────────\n optionKey(option) {\n return hashKey(option[this._config.valueField]);\n },\n });\n}\n\n/**\n * Register a plugin globally\n */\nexport function registerPlugin(name, fn) {\n pluginRegistry[name] = fn;\n}\n\n/**\n * Get the default configuration\n */\nexport function getDefaults() {\n return { ...DEFAULTS };\n}\n\nexport { DEFAULTS, escapeHtml, hashKey };\n","/**\n * Selectra Plugins\n *\n * Each plugin is a function that receives options and is called with\n * `this` bound to the selectra component instance. Plugins can modify\n * component behavior by wrapping methods or adding new properties.\n */\n\nimport { registerPlugin } from '../selectize.js';\n\n// ─── Remove Button Plugin ───────────────────────────────────\nregisterPlugin('remove_button', function (options = {}) {\n const {\n label = '&times;',\n title = 'Remove',\n className = '',\n } = options;\n\n // Store original renderItem\n const originalRenderItem = this._config.render?.item;\n\n // Override item rendering to include remove button\n if (!this._config.render) this._config.render = {};\n\n const self = this;\n this._config.render.item = function (data, escape) {\n const labelField = self._config.labelField;\n const valueField = self._config.valueField;\n const text = originalRenderItem\n ? originalRenderItem(data, escape)\n : escape(data[labelField] || '');\n\n return `<span class=\"inline-flex items-center\">${text}</span>`;\n };\n\n // The remove button is rendered directly in the template via the\n // showRemoveButton flag\n this._showRemoveButton = true;\n this._removeButtonLabel = label;\n this._removeButtonTitle = title;\n this._removeButtonClass = className;\n});\n\n// ─── Clear Button Plugin ────────────────────────────────────\nregisterPlugin('clear_button', function (options = {}) {\n const {\n title = 'Clear All',\n className = '',\n label = '&times;',\n } = options;\n\n this._showClearButton = true;\n this._clearButtonTitle = title;\n this._clearButtonLabel = label;\n this._clearButtonClass = className;\n});\n\n// ─── Restore on Backspace Plugin ────────────────────────────\nregisterPlugin('restore_on_backspace', function (options = {}) {\n const textFn = options.text || ((opt) => opt[this._config.labelField] || '');\n const originalOnKeyDown = this.onKeyDown.bind(this);\n\n this.onKeyDown = (e) => {\n if (e.key === 'Backspace' && !this.query && this.items.length && this.isMultiple) {\n e.preventDefault();\n const lastValue = this.items[this.items.length - 1];\n const lastOption = this.options[lastValue];\n this.removeItem(lastValue);\n if (lastOption) {\n this.query = textFn(lastOption);\n if (this.$refs.searchInput) {\n this.$refs.searchInput.value = this.query;\n }\n }\n return;\n }\n originalOnKeyDown(e);\n };\n});\n\n// ─── Dropdown Header Plugin ─────────────────────────────────\nregisterPlugin('dropdown_header', function (options = {}) {\n const {\n title = '',\n showClose = true,\n headerClass = '',\n } = options;\n\n this._dropdownHeader = true;\n this._dropdownHeaderTitle = title;\n this._dropdownHeaderShowClose = showClose;\n this._dropdownHeaderClass = headerClass;\n});\n\n// ─── Tag Limit Plugin ───────────────────────────────────────\nregisterPlugin('tag_limit', function (options = {}) {\n const { tagLimit = 3 } = options;\n\n this._tagLimit = tagLimit;\n this._showAllTags = false;\n\n // Override selectedItems to respect tag limit\n Object.defineProperty(this, 'visibleItems', {\n get() {\n const all = this.selectedItems;\n if (this.isFocused || this._showAllTags || !this._tagLimit) return all;\n return all.slice(0, this._tagLimit);\n },\n });\n\n Object.defineProperty(this, 'hiddenItemCount', {\n get() {\n const all = this.selectedItems;\n if (this.isFocused || this._showAllTags || !this._tagLimit) return 0;\n return Math.max(0, all.length - this._tagLimit);\n },\n });\n});\n\n// ─── Auto Select on Type Plugin ─────────────────────────────\nregisterPlugin('auto_select_on_type', function () {\n const originalBlur = this.blur.bind(this);\n\n this.blur = () => {\n if (this.query.trim() && this.filteredOptions.length) {\n const first = this.filteredOptions[0];\n this.selectOption(first);\n }\n this.query = '';\n originalBlur();\n };\n});\n\n// ─── Select on Focus Plugin ─────────────────────────────────\nregisterPlugin('select_on_focus', function () {\n const originalFocus = this.focus.bind(this);\n\n this.focus = () => {\n originalFocus();\n if (this.isSingle && this.items.length) {\n const current = this.options[this.items[0]];\n if (current) {\n this.query = current[this._config.labelField] || '';\n if (this.$refs.searchInput) {\n this.$nextTick(() => this.$refs.searchInput.select());\n }\n }\n }\n };\n});\n\n// ─── Read-Only Plugin ───────────────────────────────────────\nregisterPlugin('read_only', function (options = {}) {\n const { readOnly = true } = options;\n this._isReadOnly = readOnly;\n\n this.readonly = (value) => {\n this._isReadOnly = value !== undefined ? value : !this._isReadOnly;\n if (this._isReadOnly) {\n this.close();\n }\n };\n\n // Override to prevent modifications in read-only mode\n const originalAddItem = this.addItem.bind(this);\n const originalRemoveItem = this.removeItem.bind(this);\n const originalCreateItem = this.createItem.bind(this);\n const originalClear = this.clear.bind(this);\n\n this.addItem = (value, silent) => {\n if (this._isReadOnly) return;\n originalAddItem(value, silent);\n };\n\n this.removeItem = (value, silent) => {\n if (this._isReadOnly) return;\n originalRemoveItem(value, silent);\n };\n\n this.createItem = (input) => {\n if (this._isReadOnly) return;\n originalCreateItem(input);\n };\n\n this.clear = (silent) => {\n if (this._isReadOnly) return;\n originalClear(silent);\n };\n});\n\n// ─── Auto Position Plugin ───────────────────────────────────\nregisterPlugin('auto_position', function () {\n this._autoPosition = true;\n\n const originalOpen = this.open.bind(this);\n this.open = () => {\n originalOpen();\n this.$nextTick(() => {\n const dropdown = this.$refs.dropdown;\n const wrapper = this.$el;\n if (!dropdown || !wrapper) return;\n\n const wrapperRect = wrapper.getBoundingClientRect();\n const spaceBelow = window.innerHeight - wrapperRect.bottom;\n const spaceAbove = wrapperRect.top;\n const dropdownHeight = dropdown.offsetHeight || 250;\n\n if (spaceBelow < dropdownHeight && spaceAbove > spaceBelow) {\n this._dropdownPosition = 'top';\n } else {\n this._dropdownPosition = 'bottom';\n }\n });\n };\n\n this._dropdownPosition = 'bottom';\n});\n\nexport default {};\n","/**\n * Selectra - Alpine.js Plugin\n *\n * A powerful, extensible <select> UI control for tagging, contact lists,\n * country selectors, and autocomplete. Built with Alpine.js and Tailwind CSS.\n *\n * @license Apache-2.0\n *\n * Usage:\n *\n * // 1. Register the plugin\n * import Alpine from 'alpinejs';\n * import Selectra from 'selectra';\n * Alpine.plugin(Selectra);\n * Alpine.start();\n *\n * // 2. Use it — that's it!\n * <div x-data=\"selectra({ options: [...], placeholder: 'Pick...' })\" x-selectra></div>\n *\n * // Or with a native <select> for progressive enhancement:\n * <div x-data=\"selectra()\" x-selectra>\n * <select>\n * <option value=\"1\">One</option>\n * <option value=\"2\">Two</option>\n * </select>\n * </div>\n */\n\nimport { createSelectizeComponent, registerPlugin, getDefaults, DEFAULTS } from './selectize.js';\nimport { escapeHtml, hashKey, autoGrow } from './utils.js';\nimport Sifter from './sifter.js';\n\n// Import Tailwind CSS styles\nimport './styles/selectra.css';\n\n// Load built-in plugins\nimport './plugins/index.js';\n\n/**\n * The auto-rendered template injected by the x-selectra directive.\n * Uses .selectra-* CSS classes from selectra.css.\n * Supports single select, multi select (tags), optgroups, create, and remote loading.\n */\nconst SELECTRA_TEMPLATE = `\n<div class=\"selectra-control\" :class=\"{'is-disabled': isDisabled}\">\n <div @click=\"focus()\" class=\"selectra-input\"\n :class=\"{'is-focused': isFocused, 'is-invalid': isInvalid, 'is-locked': isLocked, 'is-single': isSingle, 'has-items': items.length > 0}\">\n <span x-show=\"isSingle && items.length && !isFocused\"\n x-text=\"currentValueText\"\n class=\"selectra-single-value\"></span>\n <template x-for=\"val in items\" :key=\"val\">\n <span x-show=\"isMultiple\" class=\"selectra-item\">\n <span x-html=\"options[val] ? renderItem(options[val]) : val\"></span>\n <span @click.stop=\"removeItem(val)\" class=\"selectra-item-remove\">&times;</span>\n </span>\n </template>\n <input x-ref=\"searchInput\"\n x-model=\"query\"\n @input=\"onInput()\"\n @focus=\"focus()\"\n @blur.debounce.150ms=\"blur()\"\n @keydown=\"onKeyDown($event)\"\n @paste=\"onPaste($event)\"\n :placeholder=\"placeholderText\"\n x-show=\"(isSingle || !isFull) && (isMultiple || isFocused || !items.length)\"\n class=\"selectra-search\">\n <span x-show=\"isFull && isMultiple\" class=\"selectra-max-badge\">Max reached</span>\n <div x-show=\"isLoading && !isOpen\" class=\"selectra-spinner\"></div>\n <svg x-show=\"isSingle\"\n class=\"selectra-arrow\" :class=\"{'is-open': isOpen}\"\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M19 9l-7 7-7-7\"/>\n </svg>\n </div>\n <div x-show=\"isOpen\" x-ref=\"dropdown\" x-cloak class=\"selectra-dropdown\"\n x-transition:enter=\"transition ease-out duration-150\"\n x-transition:enter-start=\"opacity-0 -translate-y-1\"\n x-transition:enter-end=\"opacity-100 translate-y-0\"\n x-transition:leave=\"transition ease-in duration-100\"\n x-transition:leave-start=\"opacity-100 translate-y-0\"\n x-transition:leave-end=\"opacity-0 -translate-y-1\">\n <div class=\"selectra-dropdown-content\">\n <template x-for=\"group in _getGroupedView()\" :key=\"group.key\">\n <div>\n <div x-show=\"group.label\" x-text=\"group.label\" class=\"selectra-optgroup-header\"></div>\n <template x-for=\"(option, idx) in group.options\" :key=\"optionKey(option)\">\n <div @click=\"selectOption(option)\"\n @mouseenter=\"activeIndex = group.offset + idx\"\n :data-active=\"activeIndex === group.offset + idx\"\n :class=\"{'is-active': activeIndex === group.offset + idx}\"\n class=\"selectra-option\"\n x-html=\"renderOption(option)\">\n </div>\n </template>\n </div>\n </template>\n <div x-show=\"canCreate\"\n @click=\"createItem()\"\n @mouseenter=\"activeIndex = filteredOptions.length\"\n :data-active=\"activeIndex === filteredOptions.length\"\n :class=\"{'is-active': activeIndex === filteredOptions.length}\"\n class=\"selectra-option-create\"\n x-html=\"renderOptionCreate()\">\n </div>\n <div x-show=\"filteredOptions.length === 0 && !isLoading && !canCreate\"\n class=\"selectra-no-results\"\n x-html=\"renderNoResults()\">\n </div>\n <div x-show=\"isLoading\" class=\"selectra-loading\">\n <div class=\"selectra-spinner\"></div>\n <span x-html=\"renderLoading()\"></span>\n </div>\n </div>\n </div>\n</div>\n`.trim();\n\n/**\n * Alpine.js plugin installer\n */\nfunction SelectraPlugin(Alpine) {\n // Register the selectra data component\n Alpine.data('selectra', (config = {}) => {\n const componentFactory = createSelectizeComponent(config);\n return componentFactory();\n });\n\n // Register the x-selectra directive for auto-rendering.\n // When Alpine encounters x-selectra on an element, it injects the full\n // component template. This runs after x-data (which creates the reactive\n // scope) but before Alpine walks children, so all injected Alpine\n // directives (x-for, x-model, etc.) are processed automatically.\n Alpine.directive('selectra', (el, { expression }, { evaluate, cleanup }) => {\n if (!el.querySelector('.selectra-control')) {\n el.insertAdjacentHTML('beforeend', SELECTRA_TEMPLATE);\n }\n });\n}\n\nSelectraPlugin.version = __PKG_VERSION__;\nSelectraPlugin.template = SELECTRA_TEMPLATE;\n\n// Named exports\nexport {\n SelectraPlugin as default,\n SELECTRA_TEMPLATE,\n createSelectizeComponent,\n registerPlugin,\n getDefaults,\n DEFAULTS,\n Sifter,\n escapeHtml,\n hashKey,\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"selectra.es.js","sources":["../src-alpine/sifter.js","../src-alpine/utils.js","../src-alpine/selectize.js","../src-alpine/plugins/index.js","../src-alpine/index.js"],"sourcesContent":["/**\n * Sifter - A library for textually searching arrays and hashes of objects.\n * Designed specifically for autocomplete. Supports diacritics, smart scoring,\n * multi-field sorting, and nested properties.\n *\n * Originally by Brian Reavis, modernized as ES module.\n */\n\nconst DIACRITICS = {\n a: '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]',\n b: '[b␢βΒB฿𐌁ᛒ]',\n c: '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄCc]',\n d: '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅDdð]',\n e: '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇEeɘǝƏƐε]',\n f: '[fƑƒḞḟ]',\n g: '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]',\n h: '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]',\n i: '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪIi]',\n j: '[jȷĴĵɈɉʝɟʲ]',\n k: '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]',\n l: '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟLl]',\n n: '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴNnŊŋ]',\n o: '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]',\n p: '[pṔṕṖṗⱣᵽƤƥᵱ]',\n q: '[qꝖꝗʠɊɋꝘꝙq̃]',\n r: '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]',\n s: '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]',\n t: '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]',\n u: '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]',\n v: '[vṼṽṾṿƲʋꝞꝟⱱʋ]',\n w: '[wẂẃẀẁŴŵẄẅẆẇẈẉ]',\n x: '[xẌẍẊẋχ]',\n y: '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]',\n z: '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]',\n};\n\nconst asciifold = (() => {\n const lookup = {};\n let i18nChars = '';\n for (const k in DIACRITICS) {\n const chunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1);\n i18nChars += chunk;\n for (let i = 0; i < chunk.length; i++) {\n lookup[chunk.charAt(i)] = k;\n }\n }\n const regexp = new RegExp('[' + i18nChars + ']', 'g');\n return (str) =>\n str\n .replace(regexp, (ch) => lookup[ch] || '')\n .toLowerCase();\n})();\n\nfunction escapeRegex(str) {\n return (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n}\n\nfunction getAttr(obj, name, nesting) {\n if (!obj || !name) return undefined;\n if (!nesting) return obj[name];\n const names = name.split('.');\n let current = obj;\n while (names.length && current) {\n current = current[names.shift()];\n }\n return current;\n}\n\nfunction cmp(a, b) {\n if (typeof a === 'number' && typeof b === 'number') {\n return a > b ? 1 : a < b ? -1 : 0;\n }\n a = asciifold(String(a || ''));\n b = asciifold(String(b || ''));\n if (a > b) return 1;\n if (b > a) return -1;\n return 0;\n}\n\nexport default class Sifter {\n constructor(items, settings = {}) {\n this.items = items;\n this.settings = { diacritics: true, ...settings };\n }\n\n tokenize(query, respectWordBoundaries) {\n query = String(query || '').toLowerCase().trim();\n if (!query.length) return [];\n\n const tokens = [];\n const words = query.split(/\\s+/);\n\n for (const word of words) {\n let regex = escapeRegex(word);\n if (this.settings.diacritics) {\n for (const letter in DIACRITICS) {\n regex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]);\n }\n }\n if (respectWordBoundaries) regex = '\\\\b' + regex;\n tokens.push({ string: word, regex: new RegExp(regex, 'i') });\n }\n\n return tokens;\n }\n\n getScoreFunction(search, options) {\n search = this.prepareSearch(search, options);\n const { tokens } = search;\n const { fields } = search.options;\n const tokenCount = tokens.length;\n const { nesting } = search.options;\n\n const scoreValue = (value, token) => {\n if (!value) return 0;\n value = String(value || '');\n const pos = value.search(token.regex);\n if (pos === -1) return 0;\n let score = token.string.length / value.length;\n if (pos === 0) score += 0.5;\n return score;\n };\n\n const fieldCount = fields.length;\n const scoreObject =\n fieldCount === 0\n ? () => 0\n : fieldCount === 1\n ? (token, data) => scoreValue(getAttr(data, fields[0], nesting), token)\n : (token, data) => {\n let sum = 0;\n for (let i = 0; i < fieldCount; i++) {\n sum += scoreValue(getAttr(data, fields[i], nesting), token);\n }\n return sum / fieldCount;\n };\n\n if (!tokenCount) return () => 0;\n if (tokenCount === 1) return (data) => scoreObject(tokens[0], data);\n\n if (search.options.conjunction === 'and') {\n return (data) => {\n let sum = 0;\n for (let i = 0; i < tokenCount; i++) {\n const score = scoreObject(tokens[i], data);\n if (score <= 0) return 0;\n sum += score;\n }\n return sum / tokenCount;\n };\n }\n\n return (data) => {\n let sum = 0;\n for (let i = 0; i < tokenCount; i++) {\n sum += scoreObject(tokens[i], data);\n }\n return sum / tokenCount;\n };\n }\n\n getSortFunction(search, options) {\n search = this.prepareSearch(search, options);\n const sort = (!search.query && options.sort_empty) || options.sort;\n\n const getField = (name, result) => {\n if (name === '$score') return result.score;\n return getAttr(this.items[result.id], name, options.nesting);\n };\n\n const fields = [];\n if (sort) {\n for (const s of sort) {\n if (search.query || s.field !== '$score') {\n fields.push(s);\n }\n }\n }\n\n if (search.query) {\n let implicitScore = true;\n for (const f of fields) {\n if (f.field === '$score') {\n implicitScore = false;\n break;\n }\n }\n if (implicitScore) fields.unshift({ field: '$score', direction: 'desc' });\n } else {\n const idx = fields.findIndex((f) => f.field === '$score');\n if (idx !== -1) fields.splice(idx, 1);\n }\n\n const multipliers = fields.map((f) => (f.direction === 'desc' ? -1 : 1));\n const fieldCount = fields.length;\n\n if (!fieldCount) return null;\n if (fieldCount === 1) {\n const field = fields[0].field;\n const mult = multipliers[0];\n return (a, b) => mult * cmp(getField(field, a), getField(field, b));\n }\n\n return (a, b) => {\n for (let i = 0; i < fieldCount; i++) {\n const result = multipliers[i] * cmp(getField(fields[i].field, a), getField(fields[i].field, b));\n if (result) return result;\n }\n return 0;\n };\n }\n\n prepareSearch(query, options) {\n if (typeof query === 'object') return query;\n options = { ...options };\n\n if (options.fields && !Array.isArray(options.fields)) options.fields = [options.fields];\n if (options.sort && !Array.isArray(options.sort)) options.sort = [options.sort];\n if (options.sort_empty && !Array.isArray(options.sort_empty))\n options.sort_empty = [options.sort_empty];\n\n return {\n options,\n query: String(query || '').toLowerCase(),\n tokens: this.tokenize(query, options.respect_word_boundaries),\n total: 0,\n items: [],\n };\n }\n\n search(query, options) {\n const search = this.prepareSearch(query, options);\n const opts = search.options;\n const q = search.query;\n\n const fnScore = opts.score || this.getScoreFunction(search);\n\n const items = this.items;\n if (q.length) {\n const iterate = Array.isArray(items)\n ? (cb) => items.forEach((item, i) => cb(item, i))\n : (cb) => Object.keys(items).forEach((key) => cb(items[key], key));\n\n iterate((item, id) => {\n const score = fnScore(item);\n if (opts.filter === false || score > 0) {\n search.items.push({ score, id });\n }\n });\n } else {\n const iterate = Array.isArray(items)\n ? (cb) => items.forEach((item, i) => cb(item, i))\n : (cb) => Object.keys(items).forEach((key) => cb(items[key], key));\n\n iterate((item, id) => {\n search.items.push({ score: 1, id });\n });\n }\n\n const fnSort = this.getSortFunction(search, opts);\n if (fnSort) search.items.sort(fnSort);\n\n search.total = search.items.length;\n if (typeof opts.limit === 'number') {\n search.items = search.items.slice(0, opts.limit);\n }\n\n return search;\n }\n}\n","/**\n * Utility functions for Selectize Alpine.js\n */\n\n/**\n * Escape HTML entities to prevent XSS\n */\nexport function escapeHtml(str) {\n if (typeof str !== 'string') return '';\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\n/**\n * Debounce a function call\n */\nexport function debounce(fn, delay) {\n let timer;\n return function (...args) {\n clearTimeout(timer);\n timer = setTimeout(() => fn.apply(this, args), delay);\n };\n}\n\n/**\n * Generate a unique ID\n */\nlet idCounter = 0;\nexport function uid(prefix = 'selectize') {\n return `${prefix}-${++idCounter}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Hash a value to a string key\n */\nexport function hashKey(value) {\n if (typeof value === 'undefined' || value === null) return null;\n return typeof value === 'boolean'\n ? value ? '1' : '0'\n : String(value);\n}\n\n/**\n * Highlight matching text in a string\n */\nexport function highlight(text, search) {\n if (!search || !search.length) return escapeHtml(text);\n const escaped = escapeHtml(text);\n const regex = new RegExp(\n '(' + search.replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1') + ')',\n 'ig'\n );\n return escaped.replace(regex, '<span class=\"font-semibold text-inherit\">$1</span>');\n}\n\n/**\n * Measure the width of a string in pixels\n */\nlet measureCanvas;\nexport function measureString(str, el) {\n if (!measureCanvas) {\n measureCanvas = document.createElement('canvas');\n }\n const ctx = measureCanvas.getContext('2d');\n if (el) {\n const style = window.getComputedStyle(el);\n ctx.font = `${style.fontStyle} ${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n }\n return ctx.measureText(str).width;\n}\n\n/**\n * Auto-grow an input element to fit its content\n */\nexport function autoGrow(input, extraWidth = 10) {\n const val = input.value || input.placeholder || '';\n const width = measureString(val, input) + extraWidth;\n input.style.width = Math.max(width, 60) + 'px';\n}\n\n/**\n * Deep merge objects (simple version)\n */\nexport function deepMerge(target, ...sources) {\n for (const source of sources) {\n if (!source) continue;\n for (const key of Object.keys(source)) {\n if (\n source[key] &&\n typeof source[key] === 'object' &&\n !Array.isArray(source[key])\n ) {\n target[key] = deepMerge(target[key] || {}, source[key]);\n } else {\n target[key] = source[key];\n }\n }\n }\n return target;\n}\n\n/**\n * Determine if the given element is a <select> tag\n */\nexport function isSelectElement(el) {\n return el.tagName && el.tagName.toLowerCase() === 'select';\n}\n\n/**\n * Determine if the given element is an <input> tag\n */\nexport function isInputElement(el) {\n return el.tagName && el.tagName.toLowerCase() === 'input';\n}\n\n/**\n * Read options from a native <select> element\n */\nexport function readSelectOptions(selectEl) {\n const options = [];\n const optgroups = [];\n const selectedValues = [];\n\n const processOption = (optionEl, optgroup = null) => {\n const value = optionEl.value;\n const text = optionEl.textContent.trim();\n const disabled = optionEl.disabled;\n\n if (!value && !text) return;\n\n const data = { value, text, disabled };\n\n // Read data-* attributes\n if (optionEl.dataset.data) {\n try {\n Object.assign(data, JSON.parse(optionEl.dataset.data));\n } catch (_) {\n // ignore\n }\n }\n\n if (optgroup !== null) {\n data.optgroup = optgroup;\n }\n\n if (optionEl.selected) {\n selectedValues.push(value);\n }\n\n options.push(data);\n };\n\n for (const child of selectEl.children) {\n if (child.tagName.toLowerCase() === 'optgroup') {\n const groupId = child.getAttribute('label') || '';\n optgroups.push({\n value: groupId,\n label: groupId,\n disabled: child.disabled,\n });\n for (const opt of child.children) {\n processOption(opt, groupId);\n }\n } else if (child.tagName.toLowerCase() === 'option') {\n processOption(child);\n }\n }\n\n return { options, optgroups, selectedValues };\n}\n\n/**\n * Check if element is RTL\n */\nexport function isRtl(el) {\n const style = window.getComputedStyle(el);\n return style.direction === 'rtl';\n}\n","/**\n * Selectra Alpine.js Component\n *\n * A powerful, extensible select/tagging component built with Alpine.js and Tailwind CSS.\n * Drop-in replacement for selectize.js without jQuery dependency.\n */\n\nimport Sifter from './sifter.js';\nimport {\n escapeHtml,\n debounce,\n uid,\n hashKey,\n highlight,\n autoGrow,\n readSelectOptions,\n isSelectElement,\n isRtl,\n} from './utils.js';\n\n/** Default configuration */\nconst DEFAULTS = {\n delimiter: ',',\n splitOn: null,\n persist: true,\n diacritics: true,\n create: false,\n showAddOptionOnCreate: true,\n createOnBlur: false,\n createFilter: null,\n highlight: true,\n openOnFocus: true,\n maxOptions: 1000,\n maxItems: null,\n hideSelected: null,\n selectOnTab: true,\n preload: false,\n allowEmptyOption: false,\n closeAfterSelect: false,\n loadThrottle: 300,\n loadingClass: 'loading',\n placeholder: '',\n dropdownPlaceholder: '',\n mode: null, // 'single' | 'multi' — auto-detected\n search: true,\n showArrow: true,\n valueField: 'value',\n labelField: 'text',\n disabledField: 'disabled',\n optgroupField: 'optgroup',\n optgroupLabelField: 'label',\n optgroupValueField: 'value',\n sortField: '$order',\n searchField: ['text'],\n searchConjunction: 'and',\n respectWordBoundaries: false,\n normalize: true,\n plugins: [],\n\n // Render functions — return HTML strings\n render: {\n option: null,\n item: null,\n optionCreate: null,\n optgroupHeader: null,\n noResults: null,\n dropdownPlaceholder: null,\n loading: null,\n },\n\n // Callbacks\n load: null,\n score: null,\n onChange: null,\n onItemAdd: null,\n onItemRemove: null,\n onClear: null,\n onOptionAdd: null,\n onOptionRemove: null,\n onDropdownOpen: null,\n onDropdownClose: null,\n onType: null,\n onFocus: null,\n onBlur: null,\n onInitialize: null,\n};\n\n/** Registered plugins */\nconst pluginRegistry = {};\n\n/**\n * Create the selectize Alpine.js component\n */\nexport function createSelectizeComponent(userConfig = {}) {\n return () => ({\n // ── Reactive state ──────────────────────────────────────\n isOpen: false,\n isFocused: false,\n isDisabled: false,\n isLocked: false,\n isLoading: false,\n isInvalid: false,\n\n query: '',\n activeIndex: -1,\n caretPos: 0,\n\n items: [], // selected values (strings)\n options: {}, // { [value]: { value, text, ... } }\n optgroups: {}, // { [id]: { value, label, ... } }\n userOptions: {}, // user-created option values\n optionOrder: [], // maintains insertion order\n\n loadedSearches: {},\n lastQuery: '',\n\n // Internal\n _config: {},\n _sifter: null,\n _sourceEl: null,\n _id: '',\n _rtl: false,\n _plugins: [],\n _renderCache: {},\n\n // ── Computed properties ─────────────────────────────────\n get config() {\n return this._config;\n },\n\n get isMultiple() {\n return this._config.mode === 'multi';\n },\n\n get isSingle() {\n return this._config.mode === 'single';\n },\n\n get isFull() {\n return this._config.maxItems !== null && this.items.length >= this._config.maxItems;\n },\n\n get hasOptions() {\n return Object.keys(this.options).length > 0;\n },\n\n get canCreate() {\n if (!this._config.create) return false;\n if (!this.query.trim()) return false;\n if (this.isFull) return false;\n if (this._config.createFilter) {\n const filter = this._config.createFilter;\n if (typeof filter === 'function') return filter(this.query);\n if (filter instanceof RegExp) return filter.test(this.query);\n if (typeof filter === 'string') return new RegExp(filter).test(this.query);\n }\n // Check if already exists\n const existing = Object.values(this.options).find(\n (o) => o[this._config.labelField]?.toLowerCase() === this.query.toLowerCase()\n );\n return !existing;\n },\n\n get selectedItems() {\n return this.items\n .map((val) => this.options[hashKey(val)])\n .filter(Boolean);\n },\n\n get filteredOptions() {\n return this._getFilteredOptions();\n },\n\n get placeholderText() {\n if (this.items.length > 0 && this.isSingle) return '';\n return this._config.placeholder || '';\n },\n\n get currentValueText() {\n if (!this.isSingle || !this.items.length) return '';\n const opt = this.options[hashKey(this.items[0])];\n return opt ? opt[this._config.labelField] : '';\n },\n\n // ── Lifecycle ───────────────────────────────────────────\n init() {\n this._id = uid();\n this._config = { ...DEFAULTS, ...userConfig };\n\n // Detect source element\n this._sourceEl = this.$el.querySelector('select, input[type=\"text\"], input[type=\"hidden\"]');\n\n // Read options from <select> if present\n if (this._sourceEl && isSelectElement(this._sourceEl)) {\n const parsed = readSelectOptions(this._sourceEl);\n\n // Merge parsed options with config options\n const configOptions = this._config.options || [];\n const allOptions = [...parsed.options, ...configOptions];\n this._registerOptions(allOptions);\n\n // Register optgroups\n for (const og of parsed.optgroups) {\n this.optgroups[og.value] = og;\n }\n\n // Set initial value\n if (parsed.selectedValues.length) {\n this.items = [...parsed.selectedValues];\n }\n\n // Detect mode from select element\n if (!userConfig.mode) {\n this._config.mode = this._sourceEl.multiple ? 'multi' : 'single';\n }\n\n // Read attributes\n if (this._sourceEl.hasAttribute('required')) this.isInvalid = !this.items.length;\n if (this._sourceEl.disabled) this.isDisabled = true;\n if (this._sourceEl.placeholder) this._config.placeholder = this._sourceEl.placeholder;\n\n // Hide source element\n this._sourceEl.style.display = 'none';\n this._sourceEl.setAttribute('tabindex', '-1');\n\n // RTL detection\n this._rtl = isRtl(this._sourceEl);\n } else {\n // Config-only mode\n const configOptions = this._config.options || [];\n this._registerOptions(configOptions);\n\n // Register optgroups from config\n if (this._config.optgroups) {\n for (const og of this._config.optgroups) {\n this.optgroups[og[this._config.optgroupValueField]] = og;\n }\n }\n\n // Set initial items\n if (this._config.items) {\n this.items = [...this._config.items];\n }\n }\n\n // Mode detection\n if (!this._config.mode) {\n this._config.mode = this._config.maxItems === 1 ? 'single' : 'multi';\n }\n\n // Set maxItems=1 for single mode\n if (this._config.mode === 'single') {\n this._config.maxItems = 1;\n }\n\n // Default hideSelected\n if (this._config.hideSelected === null) {\n this._config.hideSelected = this._config.mode === 'multi';\n }\n\n // Initialize search engine\n this._sifter = new Sifter(this.options, { diacritics: this._config.diacritics });\n\n // Initialize plugins\n this._initPlugins();\n\n // Set up the load function debouncing\n if (this._config.load && this._config.loadThrottle) {\n this._debouncedLoad = debounce(this._performLoad.bind(this), this._config.loadThrottle);\n }\n\n // Preload if configured\n if (this._config.preload) {\n this.$nextTick(() => {\n if (this._config.preload === 'focus') {\n // Will load on focus\n } else {\n this._performLoad('');\n }\n });\n }\n\n // Trigger onInitialize\n this._trigger('onInitialize');\n\n // Watch for outside clicks\n this._onClickOutside = (e) => {\n if (!this.$el.contains(e.target)) {\n this.close();\n this.blur();\n }\n };\n document.addEventListener('mousedown', this._onClickOutside);\n },\n\n destroy() {\n document.removeEventListener('mousedown', this._onClickOutside);\n if (this._sourceEl) {\n this._sourceEl.style.display = '';\n this._sourceEl.removeAttribute('tabindex');\n }\n },\n\n // ── Plugin System ───────────────────────────────────────\n _initPlugins() {\n const plugins = this._config.plugins || [];\n for (const plugin of plugins) {\n const name = typeof plugin === 'string' ? plugin : plugin.name;\n const opts = typeof plugin === 'string' ? {} : (plugin.options || {});\n if (pluginRegistry[name]) {\n pluginRegistry[name].call(this, opts);\n this._plugins.push(name);\n } else {\n console.warn(`[selectize] Plugin \"${name}\" not found.`);\n }\n }\n },\n\n // ── Option Management ───────────────────────────────────\n _registerOptions(optionsList) {\n for (const opt of optionsList) {\n this.addOption(opt, true);\n }\n },\n\n addOption(data, silent = false) {\n if (Array.isArray(data)) {\n for (const item of data) this.addOption(item, silent);\n return;\n }\n const key = hashKey(data[this._config.valueField]);\n if (key === null || this.options[key]) return;\n\n data.$order = data.$order || ++this._orderCounter || (this._orderCounter = 1);\n this.options[key] = data;\n this.optionOrder.push(key);\n\n // Update sifter\n if (this._sifter) this._sifter.items = this.options;\n this._clearRenderCache();\n if (!silent) this._trigger('onOptionAdd', key, data);\n },\n\n updateOption(value, data) {\n const key = hashKey(value);\n if (!key || !this.options[key]) return;\n\n const newKey = hashKey(data[this._config.valueField]);\n data.$order = this.options[key].$order;\n this.options[newKey] = data;\n\n if (key !== newKey) {\n delete this.options[key];\n const idx = this.optionOrder.indexOf(key);\n if (idx !== -1) this.optionOrder[idx] = newKey;\n\n // Update items\n const itemIdx = this.items.indexOf(key);\n if (itemIdx !== -1) this.items[itemIdx] = newKey;\n }\n\n if (this._sifter) this._sifter.items = this.options;\n this._clearRenderCache();\n },\n\n removeOption(value) {\n const key = hashKey(value);\n if (!key) return;\n delete this.options[key];\n delete this.userOptions[key];\n const idx = this.optionOrder.indexOf(key);\n if (idx !== -1) this.optionOrder.splice(idx, 1);\n\n this.items = this.items.filter((v) => v !== key);\n if (this._sifter) this._sifter.items = this.options;\n this._clearRenderCache();\n this._trigger('onOptionRemove', key);\n },\n\n clearOptions() {\n // Keep selected items' options\n const keep = {};\n for (const val of this.items) {\n if (this.options[val]) keep[val] = this.options[val];\n }\n this.options = keep;\n this.optionOrder = Object.keys(keep);\n this.userOptions = {};\n if (this._sifter) this._sifter.items = this.options;\n this._clearRenderCache();\n },\n\n getOption(value) {\n return this.options[hashKey(value)] || null;\n },\n\n // ── Item (Selection) Management ─────────────────────────\n addItem(value, silent = false) {\n const key = hashKey(value);\n if (!key || !this.options[key]) return;\n if (this.items.includes(key)) return;\n\n // For single select, replace the current item instead of blocking\n if (this.isSingle && this.items.length) {\n this.removeItem(this.items[0], true);\n }\n\n // For multi select, respect the maxItems limit\n if (this.isFull) return;\n\n this.items.push(key);\n this.caretPos = this.items.length;\n\n this._syncSourceElement();\n this._clearRenderCache();\n this.query = '';\n\n if (this._config.closeAfterSelect || this.isSingle) {\n this.close();\n }\n\n if (this.isFull) {\n this.close();\n }\n\n if (!silent) {\n this._trigger('onItemAdd', key, this.options[key]);\n this._trigger('onChange', this.getValue());\n }\n },\n\n removeItem(value, silent = false) {\n const key = hashKey(value);\n const idx = this.items.indexOf(key);\n if (idx === -1) return;\n\n this.items.splice(idx, 1);\n if (this.caretPos > this.items.length) {\n this.caretPos = this.items.length;\n }\n\n this._syncSourceElement();\n this._clearRenderCache();\n\n if (!silent) {\n this._trigger('onItemRemove', key);\n this._trigger('onChange', this.getValue());\n }\n },\n\n clear(silent = false) {\n if (!this.items.length) return;\n this.items = [];\n this.caretPos = 0;\n this._syncSourceElement();\n this._clearRenderCache();\n\n if (!silent) {\n this._trigger('onClear');\n this._trigger('onChange', this.getValue());\n }\n },\n\n getValue() {\n if (this.isSingle) {\n return this.items.length ? this.items[0] : '';\n }\n return [...this.items];\n },\n\n setValue(value, silent = false) {\n this.clear(true);\n const values = Array.isArray(value) ? value : [value];\n for (const v of values) {\n if (v !== '' && v !== null && v !== undefined) {\n this.addItem(v, true);\n }\n }\n if (!silent) {\n this._trigger('onChange', this.getValue());\n }\n },\n\n // ── Create Item ─────────────────────────────────────────\n createItem(input = null) {\n const val = input !== null ? input : this.query;\n if (!val.trim()) return;\n if (!this._config.create) return;\n\n const createFn = this._config.create;\n let data;\n\n if (typeof createFn === 'function') {\n data = createFn(val, (result) => {\n if (result) {\n this.addOption(result);\n this.addItem(result[this._config.valueField]);\n }\n });\n // If create returns data synchronously, use it\n if (data && typeof data === 'object') {\n this.addOption(data);\n this.addItem(data[this._config.valueField]);\n }\n } else {\n // Default creation: use input as both value and label\n data = {};\n data[this._config.valueField] = val;\n data[this._config.labelField] = val;\n this.addOption(data);\n this.addItem(val);\n }\n\n this.query = '';\n this._clearRenderCache();\n },\n\n // ── Search ──────────────────────────────────────────────\n _getFilteredOptions() {\n const config = this._config;\n if (!this._sifter) return [];\n\n // Prepare search fields\n const searchFields = Array.isArray(config.searchField)\n ? config.searchField\n : [config.searchField];\n\n // Prepare sort\n let sort;\n if (config.sortField) {\n if (typeof config.sortField === 'string') {\n sort = [{ field: config.sortField, direction: 'asc' }];\n } else if (Array.isArray(config.sortField)) {\n sort = config.sortField;\n } else {\n sort = [config.sortField];\n }\n } else {\n sort = [{ field: '$order', direction: 'asc' }];\n }\n\n let q = this.query;\n if (config.normalize && q) {\n q = q.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n }\n\n const searchOptions = {\n fields: searchFields,\n conjunction: config.searchConjunction,\n sort,\n nesting: searchFields.some((f) => f.includes('.')),\n respect_word_boundaries: config.respectWordBoundaries,\n limit: config.maxOptions,\n };\n\n if (config.score) {\n searchOptions.score = config.score;\n }\n\n const results = this._sifter.search(q, searchOptions);\n\n let filtered = results.items\n .map((item) => {\n const opt = this.options[item.id];\n return opt ? { ...opt, _score: item.score } : null;\n })\n .filter(Boolean);\n\n // Hide selected\n if (config.hideSelected) {\n filtered = filtered.filter(\n (opt) => !this.items.includes(hashKey(opt[config.valueField]))\n );\n }\n\n // Filter disabled\n filtered = filtered.filter((opt) => !opt[config.disabledField]);\n\n return filtered;\n },\n\n // ── Dropdown Control ────────────────────────────────────\n open() {\n if (this.isOpen || this.isDisabled || this.isLocked) return;\n this.isOpen = true;\n this.activeIndex = this._config.setFirstOptionActive ? 0 : -1;\n this._trigger('onDropdownOpen');\n\n this.$nextTick(() => {\n this._scrollToActive();\n });\n },\n\n close() {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.activeIndex = -1;\n this._trigger('onDropdownClose');\n },\n\n toggle() {\n this.isOpen ? this.close() : this.open();\n },\n\n // ── Focus / Blur ────────────────────────────────────────\n focus() {\n if (this.isDisabled) return;\n this.isFocused = true;\n\n const input = this.$refs.searchInput;\n if (input) {\n this.$nextTick(() => input.focus());\n }\n\n if (this._config.openOnFocus) {\n this.open();\n }\n\n if (this._config.preload === 'focus' && !this.loadedSearches['']) {\n this._performLoad('');\n }\n\n this._trigger('onFocus');\n },\n\n blur() {\n if (!this.isFocused) return;\n this.isFocused = false;\n\n if (this._config.createOnBlur && this.query.trim() && this.canCreate) {\n this.createItem();\n }\n\n this.close();\n this._trigger('onBlur');\n },\n\n // ── Keyboard Navigation ─────────────────────────────────\n onKeyDown(e) {\n if (this.isDisabled || this.isLocked) return;\n\n const opts = this.filteredOptions;\n const canCreateNow = this.canCreate;\n const totalItems = opts.length + (canCreateNow ? 1 : 0);\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!this.isOpen) {\n this.open();\n } else {\n this.activeIndex = Math.min(this.activeIndex + 1, totalItems - 1);\n this._scrollToActive();\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (this.isOpen) {\n this.activeIndex = Math.max(this.activeIndex - 1, 0);\n this._scrollToActive();\n }\n break;\n\n case 'Enter':\n e.preventDefault();\n if (this.isOpen && this.activeIndex >= 0) {\n if (this.activeIndex < opts.length) {\n this.selectOption(opts[this.activeIndex]);\n } else if (canCreateNow) {\n this.createItem();\n }\n } else if (!this.isOpen) {\n this.open();\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n this.close();\n break;\n\n case 'Tab':\n if (this.isOpen && this._config.selectOnTab && this.activeIndex >= 0) {\n e.preventDefault();\n if (this.activeIndex < opts.length) {\n this.selectOption(opts[this.activeIndex]);\n } else if (canCreateNow) {\n this.createItem();\n }\n }\n break;\n\n case 'Backspace':\n if (!this.query && this.items.length && this.isMultiple) {\n e.preventDefault();\n const lastItem = this.items[this.items.length - 1];\n this.removeItem(lastItem);\n }\n break;\n\n case 'Delete':\n if (!this.query && this.items.length && this.isMultiple) {\n e.preventDefault();\n const lastItem = this.items[this.items.length - 1];\n this.removeItem(lastItem);\n }\n break;\n\n case 'a':\n case 'A':\n if ((e.ctrlKey || e.metaKey) && this.isMultiple) {\n e.preventDefault();\n // Select all - no-op in terms of selection, could be used for copy\n }\n break;\n }\n },\n\n // ── Input Handling ──────────────────────────────────────\n onInput() {\n this._trigger('onType', this.query);\n\n if (!this.isOpen) {\n this.open();\n }\n\n // Active first option\n this.activeIndex = this._config.setFirstOptionActive || this.query ? 0 : -1;\n\n // Remote load\n if (this._config.load && this.query) {\n const q = this.query;\n if (!this.loadedSearches[q]) {\n if (this._debouncedLoad) {\n this._debouncedLoad(q);\n } else {\n this._performLoad(q);\n }\n }\n }\n\n // Auto-grow input\n if (this.$refs.searchInput && this.isMultiple) {\n autoGrow(this.$refs.searchInput);\n }\n },\n\n onPaste(e) {\n if (!this.isMultiple) return;\n const paste = (e.clipboardData || window.clipboardData).getData('text');\n if (!paste) return;\n\n const splitOn = this._config.splitOn || this._config.delimiter;\n if (!splitOn) return;\n\n e.preventDefault();\n const regex = splitOn instanceof RegExp ? splitOn : new RegExp('[' + splitOn.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&') + ']');\n const parts = paste.split(regex).map((s) => s.trim()).filter(Boolean);\n\n for (const part of parts) {\n // Try to find matching option\n const match = Object.values(this.options).find(\n (o) => o[this._config.labelField]?.toLowerCase() === part.toLowerCase() ||\n o[this._config.valueField]?.toLowerCase() === part.toLowerCase()\n );\n if (match) {\n this.addItem(match[this._config.valueField]);\n } else if (this._config.create) {\n this.createItem(part);\n }\n }\n },\n\n // ── Option Selection ────────────────────────────────────\n selectOption(option) {\n if (!option) return;\n if (option[this._config.disabledField]) return;\n\n const value = option[this._config.valueField];\n this.addItem(value);\n this.query = '';\n\n if (this.isSingle) {\n // In single mode, blur so isFocused becomes false and the\n // selected value text is displayed instead of the search input.\n // addItem() already called close(), so we must NOT refocus\n // (that would trigger openOnFocus and reopen the dropdown).\n this.isFocused = false;\n // Clear the search cache so the user can re-search when they\n // reopen the dropdown to change the selection.\n this.loadedSearches = {};\n if (this.$refs.searchInput) {\n this.$refs.searchInput.blur();\n }\n } else if (this.$refs.searchInput) {\n // In multi mode, keep focus so the user can continue selecting.\n this.$refs.searchInput.focus();\n autoGrow(this.$refs.searchInput);\n }\n },\n\n // ── Remote Loading ──────────────────────────────────────\n _performLoad(query) {\n if (!this._config.load) return;\n if (this.loadedSearches[query]) return;\n\n this.isLoading = true;\n this.loadedSearches[query] = true;\n\n this._config.load(query, (results) => {\n this.isLoading = false;\n if (results && Array.isArray(results)) {\n for (const item of results) {\n this.addOption(item, true);\n }\n this._clearRenderCache();\n }\n });\n },\n\n // ── Rendering Helpers ───────────────────────────────────\n renderOption(option) {\n const config = this._config;\n const label = option[config.labelField] || '';\n\n if (config.render?.option) {\n return config.render.option(option, escapeHtml);\n }\n\n if (config.highlight && this.query) {\n return highlight(label, this.query);\n }\n\n return escapeHtml(label);\n },\n\n renderItem(option) {\n if (!option) return '';\n const config = this._config;\n const label = option[config.labelField] || '';\n\n if (config.render?.item) {\n return config.render.item(option, escapeHtml);\n }\n\n return escapeHtml(label);\n },\n\n renderOptionCreate() {\n const config = this._config;\n if (config.render?.optionCreate) {\n return config.render.optionCreate({ input: this.query }, escapeHtml);\n }\n return `Add <span class=\"font-medium\">${escapeHtml(this.query)}</span>...`;\n },\n\n renderNoResults() {\n const config = this._config;\n if (config.render?.noResults) {\n return config.render.noResults({ query: this.query }, escapeHtml);\n }\n return 'No results found';\n },\n\n renderDropdownPlaceholder() {\n const config = this._config;\n if (config.render?.dropdownPlaceholder) {\n return config.render.dropdownPlaceholder({}, escapeHtml);\n }\n return escapeHtml(config.dropdownPlaceholder || '');\n },\n\n renderLoading() {\n const config = this._config;\n if (config.render?.loading) {\n return config.render.loading({ query: this.query }, escapeHtml);\n }\n return 'Loading...';\n },\n\n // ── Optgroup Support ────────────────────────────────────\n addOptionGroup(id, data) {\n this.optgroups[id] = data;\n this._clearRenderCache();\n },\n\n removeOptionGroup(id) {\n delete this.optgroups[id];\n this._clearRenderCache();\n },\n\n getGroupedOptions() {\n const options = this.filteredOptions;\n const config = this._config;\n const groups = {};\n const ungrouped = [];\n\n for (const opt of options) {\n const groupId = opt[config.optgroupField];\n if (groupId && this.optgroups[groupId]) {\n if (!groups[groupId]) groups[groupId] = [];\n groups[groupId].push(opt);\n } else {\n ungrouped.push(opt);\n }\n }\n\n const result = [];\n // Add grouped options\n for (const [id, items] of Object.entries(groups)) {\n const group = this.optgroups[id];\n result.push({\n id,\n label: group[config.optgroupLabelField] || id,\n options: items,\n });\n }\n // Add ungrouped\n if (ungrouped.length) {\n result.push({ id: null, label: null, options: ungrouped });\n }\n\n return result;\n },\n\n /**\n * Get grouped options with precomputed offsets for template binding.\n * Works for both grouped and flat option lists.\n */\n _getGroupedView() {\n const groups = this.getGroupedOptions();\n let offset = 0;\n return groups.map((g, i) => {\n const view = {\n key: g.id || '__ungrouped_' + i,\n label: g.label,\n options: g.options,\n offset,\n };\n offset += g.options.length;\n return view;\n });\n },\n\n get hasOptgroups() {\n return Object.keys(this.optgroups).length > 0;\n },\n\n // ── State Control ───────────────────────────────────────\n lock() {\n this.isLocked = true;\n this.close();\n },\n\n unlock() {\n this.isLocked = false;\n },\n\n disable() {\n this.isDisabled = true;\n this.close();\n },\n\n enable() {\n this.isDisabled = false;\n },\n\n setMaxItems(max) {\n this._config.maxItems = max;\n if (this.isFull) this.close();\n },\n\n // ── Source Element Sync ─────────────────────────────────\n _syncSourceElement() {\n if (!this._sourceEl) return;\n\n if (isSelectElement(this._sourceEl)) {\n // Update selected options in the native select\n for (const opt of this._sourceEl.options) {\n opt.selected = this.items.includes(opt.value);\n }\n\n // Add any missing options (user-created)\n for (const val of this.items) {\n const exists = Array.from(this._sourceEl.options).some((o) => o.value === val);\n if (!exists) {\n const optEl = document.createElement('option');\n optEl.value = val;\n optEl.textContent = this.options[val]?.[this._config.labelField] || val;\n optEl.selected = true;\n this._sourceEl.appendChild(optEl);\n }\n }\n\n // Dispatch native change event\n this._sourceEl.dispatchEvent(new Event('change', { bubbles: true }));\n } else {\n // Input element\n this._sourceEl.value = this.isSingle\n ? (this.items[0] || '')\n : this.items.join(this._config.delimiter);\n this._sourceEl.dispatchEvent(new Event('input', { bubbles: true }));\n this._sourceEl.dispatchEvent(new Event('change', { bubbles: true }));\n }\n },\n\n // ── Scroll Management ───────────────────────────────────\n _scrollToActive() {\n this.$nextTick(() => {\n const dropdown = this.$refs.dropdown;\n if (!dropdown) return;\n const active = dropdown.querySelector('[data-active=\"true\"]');\n if (active) {\n active.scrollIntoView({ block: 'nearest' });\n }\n });\n },\n\n // ── Event Triggering ────────────────────────────────────\n _trigger(callbackName, ...args) {\n const cb = this._config[callbackName];\n if (typeof cb === 'function') {\n cb.apply(this, args);\n }\n // Also dispatch a custom DOM event\n const eventName = callbackName.replace(/^on/, '').toLowerCase();\n this.$el.dispatchEvent(\n new CustomEvent(`selectra:${eventName}`, {\n detail: args,\n bubbles: true,\n })\n );\n },\n\n // ── Cache ───────────────────────────────────────────────\n _clearRenderCache() {\n this._renderCache = {};\n },\n\n // ── Helper: Check if an option is selected ──────────────\n isSelected(option) {\n return this.items.includes(hashKey(option[this._config.valueField]));\n },\n\n // ── Helper: Option key for x-for ────────────────────────\n optionKey(option) {\n return hashKey(option[this._config.valueField]);\n },\n });\n}\n\n/**\n * Register a plugin globally\n */\nexport function registerPlugin(name, fn) {\n pluginRegistry[name] = fn;\n}\n\n/**\n * Get the default configuration\n */\nexport function getDefaults() {\n return { ...DEFAULTS };\n}\n\nexport { DEFAULTS, escapeHtml, hashKey };\n","/**\n * Selectra Plugins\n *\n * Each plugin is a function that receives options and is called with\n * `this` bound to the selectra component instance. Plugins can modify\n * component behavior by wrapping methods or adding new properties.\n */\n\nimport { registerPlugin } from '../selectize.js';\n\n// ─── Remove Button Plugin ───────────────────────────────────\nregisterPlugin('remove_button', function (options = {}) {\n const {\n label = '&times;',\n title = 'Remove',\n className = '',\n } = options;\n\n // Store original renderItem\n const originalRenderItem = this._config.render?.item;\n\n // Override item rendering to include remove button\n if (!this._config.render) this._config.render = {};\n\n const self = this;\n this._config.render.item = function (data, escape) {\n const labelField = self._config.labelField;\n const valueField = self._config.valueField;\n const text = originalRenderItem\n ? originalRenderItem(data, escape)\n : escape(data[labelField] || '');\n\n return `<span class=\"inline-flex items-center\">${text}</span>`;\n };\n\n // The remove button is rendered directly in the template via the\n // showRemoveButton flag\n this._showRemoveButton = true;\n this._removeButtonLabel = label;\n this._removeButtonTitle = title;\n this._removeButtonClass = className;\n});\n\n// ─── Clear Button Plugin ────────────────────────────────────\nregisterPlugin('clear_button', function (options = {}) {\n const {\n title = 'Clear All',\n className = '',\n label = '&times;',\n } = options;\n\n this._showClearButton = true;\n this._clearButtonTitle = title;\n this._clearButtonLabel = label;\n this._clearButtonClass = className;\n});\n\n// ─── Restore on Backspace Plugin ────────────────────────────\nregisterPlugin('restore_on_backspace', function (options = {}) {\n const textFn = options.text || ((opt) => opt[this._config.labelField] || '');\n const originalOnKeyDown = this.onKeyDown.bind(this);\n\n this.onKeyDown = (e) => {\n if (e.key === 'Backspace' && !this.query && this.items.length && this.isMultiple) {\n e.preventDefault();\n const lastValue = this.items[this.items.length - 1];\n const lastOption = this.options[lastValue];\n this.removeItem(lastValue);\n if (lastOption) {\n this.query = textFn(lastOption);\n if (this.$refs.searchInput) {\n this.$refs.searchInput.value = this.query;\n }\n }\n return;\n }\n originalOnKeyDown(e);\n };\n});\n\n// ─── Dropdown Header Plugin ─────────────────────────────────\nregisterPlugin('dropdown_header', function (options = {}) {\n const {\n title = '',\n showClose = true,\n headerClass = '',\n } = options;\n\n this._dropdownHeader = true;\n this._dropdownHeaderTitle = title;\n this._dropdownHeaderShowClose = showClose;\n this._dropdownHeaderClass = headerClass;\n});\n\n// ─── Tag Limit Plugin ───────────────────────────────────────\nregisterPlugin('tag_limit', function (options = {}) {\n const { tagLimit = 3 } = options;\n\n this._tagLimit = tagLimit;\n this._showAllTags = false;\n\n // Override selectedItems to respect tag limit\n Object.defineProperty(this, 'visibleItems', {\n get() {\n const all = this.selectedItems;\n if (this.isFocused || this._showAllTags || !this._tagLimit) return all;\n return all.slice(0, this._tagLimit);\n },\n });\n\n Object.defineProperty(this, 'hiddenItemCount', {\n get() {\n const all = this.selectedItems;\n if (this.isFocused || this._showAllTags || !this._tagLimit) return 0;\n return Math.max(0, all.length - this._tagLimit);\n },\n });\n});\n\n// ─── Auto Select on Type Plugin ─────────────────────────────\nregisterPlugin('auto_select_on_type', function () {\n const originalBlur = this.blur.bind(this);\n\n this.blur = () => {\n if (this.query.trim() && this.filteredOptions.length) {\n const first = this.filteredOptions[0];\n this.selectOption(first);\n }\n this.query = '';\n originalBlur();\n };\n});\n\n// ─── Select on Focus Plugin ─────────────────────────────────\nregisterPlugin('select_on_focus', function () {\n const originalFocus = this.focus.bind(this);\n\n this.focus = () => {\n originalFocus();\n if (this.isSingle && this.items.length) {\n const current = this.options[this.items[0]];\n if (current) {\n this.query = current[this._config.labelField] || '';\n if (this.$refs.searchInput) {\n this.$nextTick(() => this.$refs.searchInput.select());\n }\n }\n }\n };\n});\n\n// ─── Read-Only Plugin ───────────────────────────────────────\nregisterPlugin('read_only', function (options = {}) {\n const { readOnly = true } = options;\n this._isReadOnly = readOnly;\n\n this.readonly = (value) => {\n this._isReadOnly = value !== undefined ? value : !this._isReadOnly;\n if (this._isReadOnly) {\n this.close();\n }\n };\n\n // Override to prevent modifications in read-only mode\n const originalAddItem = this.addItem.bind(this);\n const originalRemoveItem = this.removeItem.bind(this);\n const originalCreateItem = this.createItem.bind(this);\n const originalClear = this.clear.bind(this);\n\n this.addItem = (value, silent) => {\n if (this._isReadOnly) return;\n originalAddItem(value, silent);\n };\n\n this.removeItem = (value, silent) => {\n if (this._isReadOnly) return;\n originalRemoveItem(value, silent);\n };\n\n this.createItem = (input) => {\n if (this._isReadOnly) return;\n originalCreateItem(input);\n };\n\n this.clear = (silent) => {\n if (this._isReadOnly) return;\n originalClear(silent);\n };\n});\n\n// ─── Auto Position Plugin ───────────────────────────────────\nregisterPlugin('auto_position', function () {\n this._autoPosition = true;\n\n const originalOpen = this.open.bind(this);\n this.open = () => {\n originalOpen();\n this.$nextTick(() => {\n const dropdown = this.$refs.dropdown;\n const wrapper = this.$el;\n if (!dropdown || !wrapper) return;\n\n const wrapperRect = wrapper.getBoundingClientRect();\n const spaceBelow = window.innerHeight - wrapperRect.bottom;\n const spaceAbove = wrapperRect.top;\n const dropdownHeight = dropdown.offsetHeight || 250;\n\n if (spaceBelow < dropdownHeight && spaceAbove > spaceBelow) {\n this._dropdownPosition = 'top';\n } else {\n this._dropdownPosition = 'bottom';\n }\n });\n };\n\n this._dropdownPosition = 'bottom';\n});\n\nexport default {};\n","/**\n * Selectra - Alpine.js Plugin\n *\n * A powerful, extensible <select> UI control for tagging, contact lists,\n * country selectors, and autocomplete. Built with Alpine.js and Tailwind CSS.\n *\n * @license Apache-2.0\n *\n * Usage:\n *\n * // 1. Register the plugin\n * import Alpine from 'alpinejs';\n * import Selectra from 'selectra';\n * Alpine.plugin(Selectra);\n * Alpine.start();\n *\n * // 2. Use it — that's it!\n * <div x-data=\"selectra({ options: [...], placeholder: 'Pick...' })\" x-selectra></div>\n *\n * // Or with a native <select> for progressive enhancement:\n * <div x-data=\"selectra()\" x-selectra>\n * <select>\n * <option value=\"1\">One</option>\n * <option value=\"2\">Two</option>\n * </select>\n * </div>\n */\n\nimport { createSelectizeComponent, registerPlugin, getDefaults, DEFAULTS } from './selectize.js';\nimport { escapeHtml, hashKey, autoGrow } from './utils.js';\nimport Sifter from './sifter.js';\n\n// Import Tailwind CSS styles\nimport './styles/selectra.css';\n\n// Load built-in plugins\nimport './plugins/index.js';\n\n/**\n * The auto-rendered template injected by the x-selectra directive.\n * Uses .selectra-* CSS classes from selectra.css.\n * Supports single select, multi select (tags), optgroups, create, and remote loading.\n */\nconst SELECTRA_TEMPLATE = `\n<div class=\"selectra-control\" :class=\"{'is-disabled': isDisabled}\">\n <div @click=\"focus()\" class=\"selectra-input\"\n :class=\"{'is-focused': isFocused, 'is-invalid': isInvalid, 'is-locked': isLocked, 'is-single': isSingle, 'has-items': items.length > 0}\">\n <span x-show=\"isSingle && items.length && !isFocused\"\n x-text=\"currentValueText\"\n class=\"selectra-single-value\"></span>\n <template x-for=\"val in items\" :key=\"val\">\n <span x-show=\"isMultiple\" class=\"selectra-item\">\n <span x-html=\"options[val] ? renderItem(options[val]) : val\"></span>\n <span @click.stop=\"removeItem(val)\" class=\"selectra-item-remove\">&times;</span>\n </span>\n </template>\n <input x-ref=\"searchInput\"\n x-model=\"query\"\n @input=\"onInput()\"\n @focus=\"focus()\"\n @blur.debounce.150ms=\"blur()\"\n @keydown=\"onKeyDown($event)\"\n @paste=\"onPaste($event)\"\n :placeholder=\"placeholderText\"\n x-show=\"(isSingle || !isFull) && (isMultiple || isFocused || !items.length)\"\n class=\"selectra-search\">\n <span x-show=\"isFull && isMultiple\" class=\"selectra-max-badge\">Max reached</span>\n <div x-show=\"isLoading && !isOpen\" class=\"selectra-spinner\"></div>\n <svg x-show=\"isSingle\"\n class=\"selectra-arrow\" :class=\"{'is-open': isOpen}\"\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M19 9l-7 7-7-7\"/>\n </svg>\n </div>\n <div x-show=\"isOpen\" x-ref=\"dropdown\" x-cloak class=\"selectra-dropdown\"\n x-transition:enter=\"transition ease-out duration-150\"\n x-transition:enter-start=\"opacity-0 -translate-y-1\"\n x-transition:enter-end=\"opacity-100 translate-y-0\"\n x-transition:leave=\"transition ease-in duration-100\"\n x-transition:leave-start=\"opacity-100 translate-y-0\"\n x-transition:leave-end=\"opacity-0 -translate-y-1\">\n <div class=\"selectra-dropdown-content\">\n <template x-for=\"group in _getGroupedView()\" :key=\"group.key\">\n <div>\n <div x-show=\"group.label\" x-text=\"group.label\" class=\"selectra-optgroup-header\"></div>\n <template x-for=\"(option, idx) in group.options\" :key=\"optionKey(option)\">\n <div @click=\"selectOption(option)\"\n @mouseenter=\"activeIndex = group.offset + idx\"\n :data-active=\"activeIndex === group.offset + idx\"\n :class=\"{'is-active': activeIndex === group.offset + idx}\"\n class=\"selectra-option\"\n x-html=\"renderOption(option)\">\n </div>\n </template>\n </div>\n </template>\n <div x-show=\"canCreate\"\n @click=\"createItem()\"\n @mouseenter=\"activeIndex = filteredOptions.length\"\n :data-active=\"activeIndex === filteredOptions.length\"\n :class=\"{'is-active': activeIndex === filteredOptions.length}\"\n class=\"selectra-option-create\"\n x-html=\"renderOptionCreate()\">\n </div>\n <div x-show=\"filteredOptions.length === 0 && !isLoading && !canCreate && query.length > 0\"\n class=\"selectra-no-results\"\n x-html=\"renderNoResults()\">\n </div>\n <div x-show=\"filteredOptions.length === 0 && !isLoading && !canCreate && query.length === 0 && _config.dropdownPlaceholder\"\n class=\"selectra-no-results\"\n x-html=\"renderDropdownPlaceholder()\">\n </div>\n <div x-show=\"isLoading\" class=\"selectra-loading\">\n <div class=\"selectra-spinner\"></div>\n <span x-html=\"renderLoading()\"></span>\n </div>\n </div>\n </div>\n</div>\n`.trim();\n\n/**\n * Alpine.js plugin installer\n */\nfunction SelectraPlugin(Alpine) {\n // Register the selectra data component\n Alpine.data('selectra', (config = {}) => {\n const componentFactory = createSelectizeComponent(config);\n return componentFactory();\n });\n\n // Register the x-selectra directive for auto-rendering.\n // When Alpine encounters x-selectra on an element, it injects the full\n // component template. This runs after x-data (which creates the reactive\n // scope) but before Alpine walks children, so all injected Alpine\n // directives (x-for, x-model, etc.) are processed automatically.\n Alpine.directive('selectra', (el, { expression }, { evaluate, cleanup }) => {\n if (!el.querySelector('.selectra-control')) {\n el.insertAdjacentHTML('beforeend', SELECTRA_TEMPLATE);\n }\n });\n}\n\nSelectraPlugin.version = __PKG_VERSION__;\nSelectraPlugin.template = SELECTRA_TEMPLATE;\n\n// Named exports\nexport {\n SelectraPlugin as default,\n SELECTRA_TEMPLATE,\n createSelectizeComponent,\n registerPlugin,\n getDefaults,\n DEFAULTS,\n Sifter,\n escapeHtml,\n hashKey,\n};\n"],"names":[],"mappings":"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"}