@referralgps/selectra 1.0.0
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/LICENSE +203 -0
- package/README.md +346 -0
- package/dist/selectra.css +1 -0
- package/dist/selectra.es.js +1318 -0
- package/dist/selectra.es.js.map +1 -0
- package/dist/selectra.iife.js +32 -0
- package/dist/selectra.iife.js.map +1 -0
- package/dist/selectra.umd.js +32 -0
- package/dist/selectra.umd.js.map +1 -0
- package/package.json +64 -0
- package/src-alpine/README.md +346 -0
- package/src-alpine/index.d.ts +217 -0
- package/src-alpine/index.js +70 -0
- package/src-alpine/plugins/index.js +219 -0
- package/src-alpine/selectize.js +1022 -0
- package/src-alpine/sifter.js +270 -0
- package/src-alpine/styles/selectra.css +277 -0
- package/src-alpine/utils.js +181 -0
|
@@ -0,0 +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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\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 if (this.isFull) return;\n\n // For single select, replace current\n if (this.isSingle && this.items.length) {\n this.removeItem(this.items[0], true);\n }\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.$refs.searchInput) {\n this.$refs.searchInput.focus();\n if (this.isMultiple) 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 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 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 = '×',\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 = '×',\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 * // Register the plugin\n * import Alpine from 'alpinejs';\n * import Selectra from 'selectra';\n * Alpine.plugin(Selectra);\n * Alpine.start();\n *\n * // In HTML (directive approach):\n * <div x-data=\"selectra({ options: [...], create: true })\">\n * <template x-selectra></template>\n * </div>\n *\n * // Or initialize on existing <select>:\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 * 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 Alpine.directive('selectra', (el, { expression }, { evaluate, cleanup }) => {\n // The directive is mainly a marker — the template is in the component.\n // It can be used with x-data=\"selectra({...})\" for auto-init.\n });\n}\n\nSelectraPlugin.version = '1.0.0';\n\n// Named exports\nexport {\n SelectraPlugin as default,\n createSelectizeComponent,\n registerPlugin,\n getDefaults,\n DEFAULTS,\n Sifter,\n escapeHtml,\n hashKey,\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
var Selectra=function(t){"use strict";const e={a:"[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]",b:"[b␢βΒB฿𐌁ᛒ]",c:"[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄCc]",d:"[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅDdð]",e:"[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇEeɘǝƏƐε]",f:"[fƑƒḞḟ]",g:"[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]",h:"[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]",i:"[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪIi]",j:"[jȷĴĵɈɉʝɟʲ]",k:"[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]",l:"[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟLl]",n:"[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴNnŊŋ]",o:"[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]",p:"[pṔṕṖṗⱣᵽƤƥᵱ]",q:"[qꝖꝗʠɊɋꝘꝙq̃]",r:"[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]",s:"[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]",t:"[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]",u:"[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]",v:"[vṼṽṾṿƲʋꝞꝟⱱʋ]",w:"[wẂẃẀẁŴŵẄẅẆẇẈẉ]",x:"[xẌẍẊẋχ]",y:"[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]",z:"[zŹźẐẑŽžŻżẒẓẔẕƵƶ]"},i=(()=>{const t={};let i="";for(const n in e){const s=e[n].substring(2,e[n].length-1);i+=s;for(let e=0;e<s.length;e++)t[s.charAt(e)]=n}const s=new RegExp("["+i+"]","g");return e=>e.replace(s,e=>t[e]||"").toLowerCase()})();function s(t){return(t+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function n(t,e,i){if(!t||!e)return;if(!i)return t[e];const s=e.split(".");let n=t;for(;s.length&&n;)n=n[s.shift()];return n}function o(t,e){return"number"==typeof t&&"number"==typeof e?t>e?1:t<e?-1:0:(t=i(String(t||"")))>(e=i(String(e||"")))?1:e>t?-1:0}class r{constructor(t,e={}){this.items=t,this.settings={diacritics:!0,...e}}tokenize(t,i){if(!(t=String(t||"").toLowerCase().trim()).length)return[];const n=[],o=t.split(/\s+/);for(const r of o){let t=s(r);if(this.settings.diacritics)for(const i in e)t=t.replace(new RegExp(i,"g"),e[i]);i&&(t="\\b"+t),n.push({string:r,regex:new RegExp(t,"i")})}return n}getScoreFunction(t,e){t=this.prepareSearch(t,e);const{tokens:i}=t,{fields:s}=t.options,o=i.length,{nesting:r}=t.options,l=(t,e)=>{if(!t)return 0;const i=(t=String(t||"")).search(e.regex);if(-1===i)return 0;let s=e.string.length/t.length;return 0===i&&(s+=.5),s},h=s.length,c=0===h?()=>0:1===h?(t,e)=>l(n(e,s[0],r),t):(t,e)=>{let i=0;for(let o=0;o<h;o++)i+=l(n(e,s[o],r),t);return i/h};return o?1===o?t=>c(i[0],t):"and"===t.options.conjunction?t=>{let e=0;for(let s=0;s<o;s++){const n=c(i[s],t);if(n<=0)return 0;e+=n}return e/o}:t=>{let e=0;for(let s=0;s<o;s++)e+=c(i[s],t);return e/o}:()=>0}getSortFunction(t,e){const i=!(t=this.prepareSearch(t,e)).query&&e.sort_empty||e.sort,s=(t,i)=>"$score"===t?i.score:n(this.items[i.id],t,e.nesting),r=[];if(i)for(const n of i)(t.query||"$score"!==n.field)&&r.push(n);if(t.query){let t=!0;for(const e of r)if("$score"===e.field){t=!1;break}t&&r.unshift({field:"$score",direction:"desc"})}else{const t=r.findIndex(t=>"$score"===t.field);-1!==t&&r.splice(t,1)}const l=r.map(t=>"desc"===t.direction?-1:1),h=r.length;if(!h)return null;if(1===h){const t=r[0].field,e=l[0];return(i,n)=>e*o(s(t,i),s(t,n))}return(t,e)=>{for(let i=0;i<h;i++){const n=l[i]*o(s(r[i].field,t),s(r[i].field,e));if(n)return n}return 0}}prepareSearch(t,e){return"object"==typeof t?t:((e={...e}).fields&&!Array.isArray(e.fields)&&(e.fields=[e.fields]),e.sort&&!Array.isArray(e.sort)&&(e.sort=[e.sort]),e.sort_empty&&!Array.isArray(e.sort_empty)&&(e.sort_empty=[e.sort_empty]),{options:e,query:String(t||"").toLowerCase(),tokens:this.tokenize(t,e.respect_word_boundaries),total:0,items:[]})}search(t,e){const i=this.prepareSearch(t,e),s=i.options,n=i.query,o=s.score||this.getScoreFunction(i),r=this.items;if(n.length){(Array.isArray(r)?t=>r.forEach((e,i)=>t(e,i)):t=>Object.keys(r).forEach(e=>t(r[e],e)))((t,e)=>{const n=o(t);(!1===s.filter||n>0)&&i.items.push({score:n,id:e})})}else{(Array.isArray(r)?t=>r.forEach((e,i)=>t(e,i)):t=>Object.keys(r).forEach(e=>t(r[e],e)))((t,e)=>{i.items.push({score:1,id:e})})}const l=this.getSortFunction(i,s);return l&&i.items.sort(l),i.total=i.items.length,"number"==typeof s.limit&&(i.items=i.items.slice(0,s.limit)),i}}function l(t){return"string"!=typeof t?"":t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}let h,c=0;function a(t){return null==t?null:"boolean"==typeof t?t?"1":"0":String(t)}function u(t,e=10){const i=function(t,e){h||(h=document.createElement("canvas"));const i=h.getContext("2d");if(e){const t=window.getComputedStyle(e);i.font=`${t.fontStyle} ${t.fontWeight} ${t.fontSize} ${t.fontFamily}`}return i.measureText(t).width}(t.value||t.placeholder||"",t)+e;t.style.width=Math.max(i,60)+"px"}function d(t){return t.tagName&&"select"===t.tagName.toLowerCase()}const p={delimiter:",",splitOn:null,persist:!0,diacritics:!0,create:!1,showAddOptionOnCreate:!0,createOnBlur:!1,createFilter:null,highlight:!0,openOnFocus:!0,maxOptions:1e3,maxItems:null,hideSelected:null,selectOnTab:!0,preload:!1,allowEmptyOption:!1,closeAfterSelect:!1,loadThrottle:300,loadingClass:"loading",placeholder:"",mode:null,search:!0,showArrow:!0,valueField:"value",labelField:"text",disabledField:"disabled",optgroupField:"optgroup",optgroupLabelField:"label",optgroupValueField:"value",sortField:"$order",searchField:["text"],searchConjunction:"and",respectWordBoundaries:!1,normalize:!0,plugins:[],render:{option:null,item:null,optionCreate:null,optgroupHeader:null,noResults:null,loading:null},load:null,score:null,onChange:null,onItemAdd:null,onItemRemove:null,onClear:null,onOptionAdd:null,onOptionRemove:null,onDropdownOpen:null,onDropdownClose:null,onType:null,onFocus:null,onBlur:null,onInitialize:null},f={};function g(t={}){return()=>({isOpen:!1,isFocused:!1,isDisabled:!1,isLocked:!1,isLoading:!1,isInvalid:!1,query:"",activeIndex:-1,caretPos:0,items:[],options:{},optgroups:{},userOptions:{},optionOrder:[],loadedSearches:{},lastQuery:"",_config:{},_sifter:null,_sourceEl:null,_id:"",_rtl:!1,_plugins:[],_renderCache:{},get config(){return this._config},get isMultiple(){return"multi"===this._config.mode},get isSingle(){return"single"===this._config.mode},get isFull(){return null!==this._config.maxItems&&this.items.length>=this._config.maxItems},get hasOptions(){return Object.keys(this.options).length>0},get canCreate(){if(!this._config.create)return!1;if(!this.query.trim())return!1;if(this.isFull)return!1;if(this._config.createFilter){const t=this._config.createFilter;if("function"==typeof t)return t(this.query);if(t instanceof RegExp)return t.test(this.query);if("string"==typeof t)return new RegExp(t).test(this.query)}return!Object.values(this.options).find(t=>{var e;return(null==(e=t[this._config.labelField])?void 0:e.toLowerCase())===this.query.toLowerCase()})},get selectedItems(){return this.items.map(t=>this.options[a(t)]).filter(Boolean)},get filteredOptions(){return this._getFilteredOptions()},get placeholderText(){return this.items.length>0&&this.isSingle?"":this._config.placeholder||""},get currentValueText(){if(!this.isSingle||!this.items.length)return"";const t=this.options[a(this.items[0])];return t?t[this._config.labelField]:""},init(){if(this._id=function(t="selectize"){return`${t}-${++c}-${Math.random().toString(36).slice(2,8)}`}(),this._config={...p,...t},this._sourceEl=this.$el.querySelector('select, input[type="text"], input[type="hidden"]'),this._sourceEl&&d(this._sourceEl)){const i=function(t){const e=[],i=[],s=[],n=(t,i=null)=>{const n=t.value,o=t.textContent.trim(),r=t.disabled;if(!n&&!o)return;const l={value:n,text:o,disabled:r};if(t.dataset.data)try{Object.assign(l,JSON.parse(t.dataset.data))}catch(h){}null!==i&&(l.optgroup=i),t.selected&&s.push(n),e.push(l)};for(const o of t.children)if("optgroup"===o.tagName.toLowerCase()){const t=o.getAttribute("label")||"";i.push({value:t,label:t,disabled:o.disabled});for(const e of o.children)n(e,t)}else"option"===o.tagName.toLowerCase()&&n(o);return{options:e,optgroups:i,selectedValues:s}}(this._sourceEl),s=this._config.options||[],n=[...i.options,...s];this._registerOptions(n);for(const t of i.optgroups)this.optgroups[t.value]=t;i.selectedValues.length&&(this.items=[...i.selectedValues]),t.mode||(this._config.mode=this._sourceEl.multiple?"multi":"single"),this._sourceEl.hasAttribute("required")&&(this.isInvalid=!this.items.length),this._sourceEl.disabled&&(this.isDisabled=!0),this._sourceEl.placeholder&&(this._config.placeholder=this._sourceEl.placeholder),this._sourceEl.style.display="none",this._sourceEl.setAttribute("tabindex","-1"),this._rtl=(e=this._sourceEl,"rtl"===window.getComputedStyle(e).direction)}else{const t=this._config.options||[];if(this._registerOptions(t),this._config.optgroups)for(const e of this._config.optgroups)this.optgroups[e[this._config.optgroupValueField]]=e;this._config.items&&(this.items=[...this._config.items])}var e;this._config.mode||(this._config.mode=1===this._config.maxItems?"single":"multi"),"single"===this._config.mode&&(this._config.maxItems=1),null===this._config.hideSelected&&(this._config.hideSelected="multi"===this._config.mode),this._sifter=new r(this.options,{diacritics:this._config.diacritics}),this._initPlugins(),this._config.load&&this._config.loadThrottle&&(this._debouncedLoad=function(t,e){let i;return function(...s){clearTimeout(i),i=setTimeout(()=>t.apply(this,s),e)}}(this._performLoad.bind(this),this._config.loadThrottle)),this._config.preload&&this.$nextTick(()=>{"focus"===this._config.preload||this._performLoad("")}),this._trigger("onInitialize"),this._onClickOutside=t=>{this.$el.contains(t.target)||(this.close(),this.blur())},document.addEventListener("mousedown",this._onClickOutside)},destroy(){document.removeEventListener("mousedown",this._onClickOutside),this._sourceEl&&(this._sourceEl.style.display="",this._sourceEl.removeAttribute("tabindex"))},_initPlugins(){const t=this._config.plugins||[];for(const e of t){const t="string"==typeof e?e:e.name,i="string"==typeof e?{}:e.options||{};f[t]?(f[t].call(this,i),this._plugins.push(t)):console.warn(`[selectize] Plugin "${t}" not found.`)}},_registerOptions(t){for(const e of t)this.addOption(e,!0)},addOption(t,e=!1){if(Array.isArray(t)){for(const i of t)this.addOption(i,e);return}const i=a(t[this._config.valueField]);null===i||this.options[i]||(t.$order=t.$order||++this._orderCounter||(this._orderCounter=1),this.options[i]=t,this.optionOrder.push(i),this._sifter&&(this._sifter.items=this.options),this._clearRenderCache(),e||this._trigger("onOptionAdd",i,t))},updateOption(t,e){const i=a(t);if(!i||!this.options[i])return;const s=a(e[this._config.valueField]);if(e.$order=this.options[i].$order,this.options[s]=e,i!==s){delete this.options[i];const t=this.optionOrder.indexOf(i);-1!==t&&(this.optionOrder[t]=s);const e=this.items.indexOf(i);-1!==e&&(this.items[e]=s)}this._sifter&&(this._sifter.items=this.options),this._clearRenderCache()},removeOption(t){const e=a(t);if(!e)return;delete this.options[e],delete this.userOptions[e];const i=this.optionOrder.indexOf(e);-1!==i&&this.optionOrder.splice(i,1),this.items=this.items.filter(t=>t!==e),this._sifter&&(this._sifter.items=this.options),this._clearRenderCache(),this._trigger("onOptionRemove",e)},clearOptions(){const t={};for(const e of this.items)this.options[e]&&(t[e]=this.options[e]);this.options=t,this.optionOrder=Object.keys(t),this.userOptions={},this._sifter&&(this._sifter.items=this.options),this._clearRenderCache()},getOption(t){return this.options[a(t)]||null},addItem(t,e=!1){const i=a(t);i&&this.options[i]&&(this.items.includes(i)||this.isFull||(this.isSingle&&this.items.length&&this.removeItem(this.items[0],!0),this.items.push(i),this.caretPos=this.items.length,this._syncSourceElement(),this._clearRenderCache(),this.query="",(this._config.closeAfterSelect||this.isSingle)&&this.close(),this.isFull&&this.close(),e||(this._trigger("onItemAdd",i,this.options[i]),this._trigger("onChange",this.getValue()))))},removeItem(t,e=!1){const i=a(t),s=this.items.indexOf(i);-1!==s&&(this.items.splice(s,1),this.caretPos>this.items.length&&(this.caretPos=this.items.length),this._syncSourceElement(),this._clearRenderCache(),e||(this._trigger("onItemRemove",i),this._trigger("onChange",this.getValue())))},clear(t=!1){this.items.length&&(this.items=[],this.caretPos=0,this._syncSourceElement(),this._clearRenderCache(),t||(this._trigger("onClear"),this._trigger("onChange",this.getValue())))},getValue(){return this.isSingle?this.items.length?this.items[0]:"":[...this.items]},setValue(t,e=!1){this.clear(!0);const i=Array.isArray(t)?t:[t];for(const s of i)""!==s&&null!=s&&this.addItem(s,!0);e||this._trigger("onChange",this.getValue())},createItem(t=null){const e=null!==t?t:this.query;if(!e.trim())return;if(!this._config.create)return;const i=this._config.create;let s;"function"==typeof i?(s=i(e,t=>{t&&(this.addOption(t),this.addItem(t[this._config.valueField]))}),s&&"object"==typeof s&&(this.addOption(s),this.addItem(s[this._config.valueField]))):(s={},s[this._config.valueField]=e,s[this._config.labelField]=e,this.addOption(s),this.addItem(e)),this.query="",this._clearRenderCache()},_getFilteredOptions(){const t=this._config;if(!this._sifter)return[];const e=Array.isArray(t.searchField)?t.searchField:[t.searchField];let i;i=t.sortField?"string"==typeof t.sortField?[{field:t.sortField,direction:"asc"}]:Array.isArray(t.sortField)?t.sortField:[t.sortField]:[{field:"$order",direction:"asc"}];let s=this.query;t.normalize&&s&&(s=s.normalize("NFD").replace(/[\u0300-\u036f]/g,""));const n={fields:e,conjunction:t.searchConjunction,sort:i,nesting:e.some(t=>t.includes(".")),respect_word_boundaries:t.respectWordBoundaries,limit:t.maxOptions};t.score&&(n.score=t.score);let o=this._sifter.search(s,n).items.map(t=>{const e=this.options[t.id];return e?{...e,_score:t.score}:null}).filter(Boolean);return t.hideSelected&&(o=o.filter(e=>!this.items.includes(a(e[t.valueField])))),o=o.filter(e=>!e[t.disabledField]),o},open(){this.isOpen||this.isDisabled||this.isLocked||(this.isOpen=!0,this.activeIndex=this._config.setFirstOptionActive?0:-1,this._trigger("onDropdownOpen"),this.$nextTick(()=>{this._scrollToActive()}))},close(){this.isOpen&&(this.isOpen=!1,this.activeIndex=-1,this._trigger("onDropdownClose"))},toggle(){this.isOpen?this.close():this.open()},focus(){if(this.isDisabled)return;this.isFocused=!0;const t=this.$refs.searchInput;t&&this.$nextTick(()=>t.focus()),this._config.openOnFocus&&this.open(),"focus"!==this._config.preload||this.loadedSearches[""]||this._performLoad(""),this._trigger("onFocus")},blur(){this.isFocused&&(this.isFocused=!1,this._config.createOnBlur&&this.query.trim()&&this.canCreate&&this.createItem(),this.close(),this._trigger("onBlur"))},onKeyDown(t){if(this.isDisabled||this.isLocked)return;const e=this.filteredOptions,i=this.canCreate,s=e.length+(i?1:0);switch(t.key){case"ArrowDown":t.preventDefault(),this.isOpen?(this.activeIndex=Math.min(this.activeIndex+1,s-1),this._scrollToActive()):this.open();break;case"ArrowUp":t.preventDefault(),this.isOpen&&(this.activeIndex=Math.max(this.activeIndex-1,0),this._scrollToActive());break;case"Enter":t.preventDefault(),this.isOpen&&this.activeIndex>=0?this.activeIndex<e.length?this.selectOption(e[this.activeIndex]):i&&this.createItem():this.isOpen||this.open();break;case"Escape":t.preventDefault(),this.close();break;case"Tab":this.isOpen&&this._config.selectOnTab&&this.activeIndex>=0&&(t.preventDefault(),this.activeIndex<e.length?this.selectOption(e[this.activeIndex]):i&&this.createItem());break;case"Backspace":if(!this.query&&this.items.length&&this.isMultiple){t.preventDefault();const e=this.items[this.items.length-1];this.removeItem(e)}break;case"Delete":if(!this.query&&this.items.length&&this.isMultiple){t.preventDefault();const e=this.items[this.items.length-1];this.removeItem(e)}break;case"a":case"A":(t.ctrlKey||t.metaKey)&&this.isMultiple&&t.preventDefault()}},onInput(){if(this._trigger("onType",this.query),this.isOpen||this.open(),this.activeIndex=this._config.setFirstOptionActive||this.query?0:-1,this._config.load&&this.query){const t=this.query;this.loadedSearches[t]||(this._debouncedLoad?this._debouncedLoad(t):this._performLoad(t))}this.$refs.searchInput&&this.isMultiple&&u(this.$refs.searchInput)},onPaste(t){if(!this.isMultiple)return;const e=(t.clipboardData||window.clipboardData).getData("text");if(!e)return;const i=this._config.splitOn||this._config.delimiter;if(!i)return;t.preventDefault();const s=i instanceof RegExp?i:new RegExp("["+i.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")+"]"),n=e.split(s).map(t=>t.trim()).filter(Boolean);for(const o of n){const t=Object.values(this.options).find(t=>{var e,i;return(null==(e=t[this._config.labelField])?void 0:e.toLowerCase())===o.toLowerCase()||(null==(i=t[this._config.valueField])?void 0:i.toLowerCase())===o.toLowerCase()});t?this.addItem(t[this._config.valueField]):this._config.create&&this.createItem(o)}},selectOption(t){if(!t)return;if(t[this._config.disabledField])return;const e=t[this._config.valueField];this.addItem(e),this.query="",this.$refs.searchInput&&(this.$refs.searchInput.focus(),this.isMultiple&&u(this.$refs.searchInput))},_performLoad(t){this._config.load&&(this.loadedSearches[t]||(this.isLoading=!0,this.loadedSearches[t]=!0,this._config.load(t,t=>{if(this.isLoading=!1,t&&Array.isArray(t)){for(const e of t)this.addOption(e,!0);this._clearRenderCache()}})))},renderOption(t){var e;const i=this._config,s=t[i.labelField]||"";return(null==(e=i.render)?void 0:e.option)?i.render.option(t,l):i.highlight&&this.query?function(t,e){if(!e||!e.length)return l(t);const i=l(t),s=new RegExp("("+e.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")+")","ig");return i.replace(s,'<span class="font-semibold text-inherit">$1</span>')}(s,this.query):l(s)},renderItem(t){var e;const i=this._config,s=t[i.labelField]||"";return(null==(e=i.render)?void 0:e.item)?i.render.item(t,l):l(s)},renderOptionCreate(){var t;const e=this._config;return(null==(t=e.render)?void 0:t.optionCreate)?e.render.optionCreate({input:this.query},l):`Add <span class="font-medium">${l(this.query)}</span>...`},renderNoResults(){var t;const e=this._config;return(null==(t=e.render)?void 0:t.noResults)?e.render.noResults({query:this.query},l):"No results found"},renderLoading(){var t;const e=this._config;return(null==(t=e.render)?void 0:t.loading)?e.render.loading({query:this.query},l):"Loading..."},addOptionGroup(t,e){this.optgroups[t]=e,this._clearRenderCache()},removeOptionGroup(t){delete this.optgroups[t],this._clearRenderCache()},getGroupedOptions(){const t=this.filteredOptions,e=this._config,i={},s=[];for(const o of t){const t=o[e.optgroupField];t&&this.optgroups[t]?(i[t]||(i[t]=[]),i[t].push(o)):s.push(o)}const n=[];for(const[o,r]of Object.entries(i)){const t=this.optgroups[o];n.push({id:o,label:t[e.optgroupLabelField]||o,options:r})}return s.length&&n.push({id:null,label:null,options:s}),n},get hasOptgroups(){return Object.keys(this.optgroups).length>0},lock(){this.isLocked=!0,this.close()},unlock(){this.isLocked=!1},disable(){this.isDisabled=!0,this.close()},enable(){this.isDisabled=!1},setMaxItems(t){this._config.maxItems=t,this.isFull&&this.close()},_syncSourceElement(){var t;if(this._sourceEl)if(d(this._sourceEl)){for(const t of this._sourceEl.options)t.selected=this.items.includes(t.value);for(const e of this.items){if(!Array.from(this._sourceEl.options).some(t=>t.value===e)){const i=document.createElement("option");i.value=e,i.textContent=(null==(t=this.options[e])?void 0:t[this._config.labelField])||e,i.selected=!0,this._sourceEl.appendChild(i)}}this._sourceEl.dispatchEvent(new Event("change",{bubbles:!0}))}else this._sourceEl.value=this.isSingle?this.items[0]||"":this.items.join(this._config.delimiter),this._sourceEl.dispatchEvent(new Event("input",{bubbles:!0})),this._sourceEl.dispatchEvent(new Event("change",{bubbles:!0}))},_scrollToActive(){this.$nextTick(()=>{const t=this.$refs.dropdown;if(!t)return;const e=t.querySelector('[data-active="true"]');e&&e.scrollIntoView({block:"nearest"})})},_trigger(t,...e){const i=this._config[t];"function"==typeof i&&i.apply(this,e);const s=t.replace(/^on/,"").toLowerCase();this.$el.dispatchEvent(new CustomEvent(`selectra:${s}`,{detail:e,bubbles:!0}))},_clearRenderCache(){this._renderCache={}},isSelected(t){return this.items.includes(a(t[this._config.valueField]))},optionKey(t){return a(t[this._config.valueField])}})}function _(t,e){f[t]=e}
|
|
2
|
+
/**
|
|
3
|
+
* Selectra - Alpine.js Plugin
|
|
4
|
+
*
|
|
5
|
+
* A powerful, extensible <select> UI control for tagging, contact lists,
|
|
6
|
+
* country selectors, and autocomplete. Built with Alpine.js and Tailwind CSS.
|
|
7
|
+
*
|
|
8
|
+
* @license Apache-2.0
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
*
|
|
12
|
+
* // Register the plugin
|
|
13
|
+
* import Alpine from 'alpinejs';
|
|
14
|
+
* import Selectra from 'selectra';
|
|
15
|
+
* Alpine.plugin(Selectra);
|
|
16
|
+
* Alpine.start();
|
|
17
|
+
*
|
|
18
|
+
* // In HTML (directive approach):
|
|
19
|
+
* <div x-data="selectra({ options: [...], create: true })">
|
|
20
|
+
* <template x-selectra></template>
|
|
21
|
+
* </div>
|
|
22
|
+
*
|
|
23
|
+
* // Or initialize on existing <select>:
|
|
24
|
+
* <div x-data="selectra()" x-selectra>
|
|
25
|
+
* <select>
|
|
26
|
+
* <option value="1">One</option>
|
|
27
|
+
* <option value="2">Two</option>
|
|
28
|
+
* </select>
|
|
29
|
+
* </div>
|
|
30
|
+
*/
|
|
31
|
+
function m(t){t.data("selectra",(t={})=>g(t)()),t.directive("selectra",(t,{expression:e},{evaluate:i,cleanup:s})=>{})}return _("remove_button",function(t={}){var e;const{label:i="×",title:s="Remove",className:n=""}=t,o=null==(e=this._config.render)?void 0:e.item;this._config.render||(this._config.render={});const r=this;this._config.render.item=function(t,e){const i=r._config.labelField;r._config.valueField;return`<span class="inline-flex items-center">${o?o(t,e):e(t[i]||"")}</span>`},this._showRemoveButton=!0,this._removeButtonLabel=i,this._removeButtonTitle=s,this._removeButtonClass=n}),_("clear_button",function(t={}){const{title:e="Clear All",className:i="",label:s="×"}=t;this._showClearButton=!0,this._clearButtonTitle=e,this._clearButtonLabel=s,this._clearButtonClass=i}),_("restore_on_backspace",function(t={}){const e=t.text||(t=>t[this._config.labelField]||""),i=this.onKeyDown.bind(this);this.onKeyDown=t=>{if("Backspace"===t.key&&!this.query&&this.items.length&&this.isMultiple){t.preventDefault();const i=this.items[this.items.length-1],s=this.options[i];return this.removeItem(i),void(s&&(this.query=e(s),this.$refs.searchInput&&(this.$refs.searchInput.value=this.query)))}i(t)}}),_("dropdown_header",function(t={}){const{title:e="",showClose:i=!0,headerClass:s=""}=t;this._dropdownHeader=!0,this._dropdownHeaderTitle=e,this._dropdownHeaderShowClose=i,this._dropdownHeaderClass=s}),_("tag_limit",function(t={}){const{tagLimit:e=3}=t;this._tagLimit=e,this._showAllTags=!1,Object.defineProperty(this,"visibleItems",{get(){const t=this.selectedItems;return this.isFocused||this._showAllTags||!this._tagLimit?t:t.slice(0,this._tagLimit)}}),Object.defineProperty(this,"hiddenItemCount",{get(){const t=this.selectedItems;return this.isFocused||this._showAllTags||!this._tagLimit?0:Math.max(0,t.length-this._tagLimit)}})}),_("auto_select_on_type",function(){const t=this.blur.bind(this);this.blur=()=>{if(this.query.trim()&&this.filteredOptions.length){const t=this.filteredOptions[0];this.selectOption(t)}this.query="",t()}}),_("select_on_focus",function(){const t=this.focus.bind(this);this.focus=()=>{if(t(),this.isSingle&&this.items.length){const t=this.options[this.items[0]];t&&(this.query=t[this._config.labelField]||"",this.$refs.searchInput&&this.$nextTick(()=>this.$refs.searchInput.select()))}}}),_("read_only",function(t={}){const{readOnly:e=!0}=t;this._isReadOnly=e,this.readonly=t=>{this._isReadOnly=void 0!==t?t:!this._isReadOnly,this._isReadOnly&&this.close()};const i=this.addItem.bind(this),s=this.removeItem.bind(this),n=this.createItem.bind(this),o=this.clear.bind(this);this.addItem=(t,e)=>{this._isReadOnly||i(t,e)},this.removeItem=(t,e)=>{this._isReadOnly||s(t,e)},this.createItem=t=>{this._isReadOnly||n(t)},this.clear=t=>{this._isReadOnly||o(t)}}),_("auto_position",function(){this._autoPosition=!0;const t=this.open.bind(this);this.open=()=>{t(),this.$nextTick(()=>{const t=this.$refs.dropdown,e=this.$el;if(!t||!e)return;const i=e.getBoundingClientRect(),s=window.innerHeight-i.bottom,n=i.top,o=t.offsetHeight||250;this._dropdownPosition=s<o&&n>s?"top":"bottom"})},this._dropdownPosition="bottom"}),m.version="1.0.0",t.DEFAULTS=p,t.Sifter=r,t.createSelectizeComponent=g,t.default=m,t.escapeHtml=l,t.getDefaults=function(){return{...p}},t.hashKey=a,t.registerPlugin=_,Object.defineProperties(t,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),t}({});
|
|
32
|
+
//# sourceMappingURL=selectra.iife.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectra.iife.js","sources":["../src-alpine/sifter.js","../src-alpine/utils.js","../src-alpine/selectize.js","../src-alpine/index.js","../src-alpine/plugins/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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\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 if (this.isFull) return;\n\n // For single select, replace current\n if (this.isSingle && this.items.length) {\n this.removeItem(this.items[0], true);\n }\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.$refs.searchInput) {\n this.$refs.searchInput.focus();\n if (this.isMultiple) 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 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 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 - 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 * // Register the plugin\n * import Alpine from 'alpinejs';\n * import Selectra from 'selectra';\n * Alpine.plugin(Selectra);\n * Alpine.start();\n *\n * // In HTML (directive approach):\n * <div x-data=\"selectra({ options: [...], create: true })\">\n * <template x-selectra></template>\n * </div>\n *\n * // Or initialize on existing <select>:\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 * 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 Alpine.directive('selectra', (el, { expression }, { evaluate, cleanup }) => {\n // The directive is mainly a marker — the template is in the component.\n // It can be used with x-data=\"selectra({...})\" for auto-init.\n });\n}\n\nSelectraPlugin.version = '1.0.0';\n\n// Named exports\nexport {\n SelectraPlugin as default,\n createSelectizeComponent,\n registerPlugin,\n getDefaults,\n DEFAULTS,\n Sifter,\n escapeHtml,\n hashKey,\n};\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 = '×',\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 = '×',\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"],"names":["DIACRITICS","a","b","c","d","e","f","g","h","i","j","k","l","n","o","p","q","r","s","t","u","v","w","x","y","z","asciifold","lookup","i18nChars","chunk","substring","length","charAt","regexp","RegExp","str","replace","ch","toLowerCase","escapeRegex","getAttr","obj","name","nesting","names","split","current","shift","cmp","String","Sifter","constructor","items","settings","this","diacritics","tokenize","query","respectWordBoundaries","trim","tokens","words","word","regex","letter","push","string","getScoreFunction","search","options","prepareSearch","fields","tokenCount","scoreValue","value","token","pos","score","fieldCount","scoreObject","data","sum","conjunction","getSortFunction","sort","sort_empty","getField","result","id","field","implicitScore","unshift","direction","idx","findIndex","splice","multipliers","map","mult","Array","isArray","respect_word_boundaries","total","opts","fnScore","cb","forEach","item","Object","keys","key","filter","fnSort","limit","slice","escapeHtml","measureCanvas","idCounter","hashKey","autoGrow","input","extraWidth","width","el","document","createElement","ctx","getContext","style","window","getComputedStyle","font","fontStyle","fontWeight","fontSize","fontFamily","measureText","measureString","placeholder","Math","max","isSelectElement","tagName","DEFAULTS","delimiter","splitOn","persist","create","showAddOptionOnCreate","createOnBlur","createFilter","highlight","openOnFocus","maxOptions","maxItems","hideSelected","selectOnTab","preload","allowEmptyOption","closeAfterSelect","loadThrottle","loadingClass","mode","showArrow","valueField","labelField","disabledField","optgroupField","optgroupLabelField","optgroupValueField","sortField","searchField","searchConjunction","normalize","plugins","render","option","optionCreate","optgroupHeader","noResults","loading","load","onChange","onItemAdd","onItemRemove","onClear","onOptionAdd","onOptionRemove","onDropdownOpen","onDropdownClose","onType","onFocus","onBlur","onInitialize","pluginRegistry","createSelectizeComponent","userConfig","isOpen","isFocused","isDisabled","isLocked","isLoading","isInvalid","activeIndex","caretPos","optgroups","userOptions","optionOrder","loadedSearches","lastQuery","_config","_sifter","_sourceEl","_id","_rtl","_plugins","_renderCache","config","isMultiple","isSingle","isFull","hasOptions","canCreate","test","values","find","_a","selectedItems","val","Boolean","filteredOptions","_getFilteredOptions","placeholderText","currentValueText","opt","init","prefix","random","toString","uid","$el","querySelector","parsed","selectEl","selectedValues","processOption","optionEl","optgroup","text","textContent","disabled","dataset","assign","JSON","parse","_","selected","child","children","groupId","getAttribute","label","readSelectOptions","configOptions","allOptions","_registerOptions","og","multiple","hasAttribute","display","setAttribute","_initPlugins","_debouncedLoad","fn","delay","timer","args","clearTimeout","setTimeout","apply","debounce","_performLoad","bind","$nextTick","_trigger","_onClickOutside","contains","target","close","blur","addEventListener","destroy","removeEventListener","removeAttribute","plugin","call","console","warn","optionsList","addOption","silent","$order","_orderCounter","_clearRenderCache","updateOption","newKey","indexOf","itemIdx","removeOption","clearOptions","keep","getOption","addItem","includes","removeItem","_syncSourceElement","getValue","clear","setValue","createItem","createFn","searchFields","searchOptions","some","filtered","_score","open","setFirstOptionActive","_scrollToActive","toggle","focus","$refs","searchInput","onKeyDown","canCreateNow","totalItems","preventDefault","min","selectOption","lastItem","ctrlKey","metaKey","onInput","onPaste","paste","clipboardData","getData","parts","part","match","_b","results","renderOption","escaped","renderItem","renderOptionCreate","renderNoResults","renderLoading","addOptionGroup","removeOptionGroup","getGroupedOptions","groups","ungrouped","entries","group","hasOptgroups","lock","unlock","disable","enable","setMaxItems","from","optEl","appendChild","dispatchEvent","Event","bubbles","join","dropdown","active","scrollIntoView","block","callbackName","eventName","CustomEvent","detail","isSelected","optionKey","registerPlugin","SelectraPlugin","Alpine","componentFactory","directive","expression","evaluate","cleanup","title","className","originalRenderItem","self","escape","_showRemoveButton","_removeButtonLabel","_removeButtonTitle","_removeButtonClass","_showClearButton","_clearButtonTitle","_clearButtonLabel","_clearButtonClass","textFn","originalOnKeyDown","lastValue","lastOption","showClose","headerClass","_dropdownHeader","_dropdownHeaderTitle","_dropdownHeaderShowClose","_dropdownHeaderClass","tagLimit","_tagLimit","_showAllTags","defineProperty","get","all","originalBlur","first","originalFocus","select","readOnly","_isReadOnly","readonly","originalAddItem","originalRemoveItem","originalCreateItem","originalClear","_autoPosition","originalOpen","wrapper","wrapperRect","getBoundingClientRect","spaceBelow","innerHeight","bottom","spaceAbove","top","dropdownHeight","offsetHeight","_dropdownPosition","version"],"mappings":"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"}
|