selectamelo 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -52,11 +52,11 @@ npm run build
52
52
 
53
53
  ### JavaScript (ESM)
54
54
  ```js
55
- import { ZSelectCore } from "selectamelo";
55
+ import { Selectamelo } from "selectamelo";
56
56
 
57
57
  const select = document.querySelector("#role");
58
58
 
59
- ZSelectCore.create(select, {
59
+ Selectamelo.create(select, {
60
60
  placeholder: "Select a role"
61
61
  });
62
62
  ```
@@ -66,7 +66,7 @@ ZSelectCore.create(select, {
66
66
  ## Options
67
67
 
68
68
  ```ts
69
- type ZSelectCoreOptions = {
69
+ type SelectameloOptions = {
70
70
  searchable?: boolean; // default true
71
71
  placeholder?: string; // default ""
72
72
  allowClear?: boolean; // default true
@@ -100,8 +100,8 @@ HTML-driven options are also supported:
100
100
 
101
101
  ### Create / Get
102
102
  ```js
103
- const inst = ZSelectCore.create(select);
104
- const same = ZSelectCore.get(select);
103
+ const inst = Selectamelo.create(select);
104
+ const same = Selectamelo.get(select);
105
105
  ```
106
106
 
107
107
  ---
package/dist/index.cjs CHANGED
@@ -20,7 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
- ZSelectCore: () => ZSelectCore
23
+ Selectamelo: () => Selectamelo
24
24
  });
25
25
  module.exports = __toCommonJS(index_exports);
26
26
 
@@ -31,6 +31,8 @@ function uid(prefix = "zs-") {
31
31
 
32
32
  // src/core.ts
33
33
  var instances = /* @__PURE__ */ new WeakMap();
34
+ var ICON_ANGLE_DOWN = '<svg class="zselect__icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M6 9l6 6 6-6" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>';
35
+ var ICON_X = '<svg class="zselect__icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M6 6l12 12M18 6l-12 12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>';
34
36
  function dispatch(select, name, detail) {
35
37
  select.dispatchEvent(new CustomEvent(name, { bubbles: true, detail }));
36
38
  }
@@ -47,7 +49,7 @@ function setSelected(select, value) {
47
49
  }
48
50
  select.dispatchEvent(new Event("change", { bubbles: true }));
49
51
  }
50
- var ZSelectCore = {
52
+ var Selectamelo = {
51
53
  create(select, options = {}) {
52
54
  const existing = instances.get(select);
53
55
  if (existing) return existing;
@@ -72,27 +74,27 @@ var ZSelectCore = {
72
74
  if (aSearchable != null) opts.searchable = aSearchable;
73
75
  const root = document.createElement("div");
74
76
  root.className = "zselect";
75
- root.setAttribute("data-zselect-core", "1");
77
+ root.setAttribute("data-selectamelo-core", "1");
76
78
  const control = document.createElement("button");
77
79
  control.type = "button";
78
80
  control.className = "zselect__control";
79
81
  control.setAttribute("aria-haspopup", "listbox");
80
82
  control.setAttribute("aria-expanded", "false");
81
83
  const ds = {
82
- placeholder: select.getAttribute("data-zselect-placeholder"),
83
- searchPlaceholder: select.getAttribute("data-zselect-search-placeholder"),
84
- clearTitle: select.getAttribute("data-zselect-clear-title"),
85
- clearAriaLabel: select.getAttribute("data-zselect-clear-aria-label"),
86
- removeChipAriaLabel: select.getAttribute("data-zselect-remove-chip-aria-label"),
87
- noResults: select.getAttribute("data-zselect-no-results")
84
+ placeholder: select.getAttribute("data-selectamelo-placeholder"),
85
+ searchPlaceholder: select.getAttribute("data-selectamelo-search-placeholder"),
86
+ clearTitle: select.getAttribute("data-selectamelo-clear-title"),
87
+ clearAriaLabel: select.getAttribute("data-selectamelo-clear-aria-label"),
88
+ removeChipAriaLabel: select.getAttribute("data-selectamelo-remove-chip-aria-label"),
89
+ noResults: select.getAttribute("data-selectamelo-no-results")
88
90
  };
89
91
  const t = {
90
92
  placeholder: options.i18n?.placeholder ?? ds.placeholder ?? options.placeholder ?? "",
91
- searchPlaceholder: options.i18n?.searchPlaceholder ?? ds.searchPlaceholder ?? "Cerca...",
92
- clearTitle: options.i18n?.clearTitle ?? ds.clearTitle ?? "Pulisci",
93
- clearAriaLabel: options.i18n?.clearAriaLabel ?? ds.clearAriaLabel ?? "Pulisci selezione",
94
- removeChipAriaLabel: options.i18n?.removeChipAriaLabel ?? ds.removeChipAriaLabel ?? "Rimuovi",
95
- noResults: options.i18n?.noResults ?? ds.noResults ?? "Nessun risultato"
93
+ searchPlaceholder: options.i18n?.searchPlaceholder ?? ds.searchPlaceholder ?? "Search...",
94
+ clearTitle: options.i18n?.clearTitle ?? ds.clearTitle ?? "Clear",
95
+ clearAriaLabel: options.i18n?.clearAriaLabel ?? ds.clearAriaLabel ?? "Clear selection",
96
+ removeChipAriaLabel: options.i18n?.removeChipAriaLabel ?? ds.removeChipAriaLabel ?? "Remove",
97
+ noResults: options.i18n?.noResults ?? ds.noResults ?? "No results"
96
98
  };
97
99
  const valueWrap = document.createElement("span");
98
100
  valueWrap.className = "zselect__valuewrap";
@@ -106,14 +108,14 @@ var ZSelectCore = {
106
108
  actions.className = "zselect__actions";
107
109
  const clearEl = document.createElement("span");
108
110
  clearEl.className = "zselect__clear";
109
- clearEl.textContent = "\xD7";
111
+ clearEl.innerHTML = ICON_X;
110
112
  clearEl.title = t.clearTitle;
111
113
  clearEl.setAttribute("aria-hidden", "true");
112
114
  clearEl.setAttribute("aria-label", t.clearAriaLabel);
113
115
  clearEl.style.display = "none";
114
116
  const arrow = document.createElement("span");
115
117
  arrow.className = "zselect__arrow";
116
- arrow.textContent = "\u25BE";
118
+ arrow.innerHTML = ICON_ANGLE_DOWN;
117
119
  actions.append(clearEl, arrow);
118
120
  control.append(valueWrap, actions);
119
121
  const dropdown = document.createElement("div");
@@ -230,8 +232,8 @@ var ZSelectCore = {
230
232
  const x = document.createElement("button");
231
233
  x.type = "button";
232
234
  x.className = "zselect__chip-remove";
233
- x.textContent = "\xD7";
234
- x.title = "Rimuovi";
235
+ x.innerHTML = ICON_X;
236
+ x.title = "Remove";
235
237
  x.setAttribute("aria-label", t.removeChipAriaLabel);
236
238
  x.addEventListener("mousedown", (e) => {
237
239
  e.preventDefault();
@@ -249,12 +251,12 @@ var ZSelectCore = {
249
251
  const isPlaceholder = selected.length === 0 || selected.length === 1 && (selected[0]?.value ?? "") === "" || select.multiple && selectedNonEmpty().length === 0;
250
252
  if (select.multiple) {
251
253
  renderChips();
252
- valueEl.textContent = isPlaceholder ? t.placeholder || "Seleziona..." : "";
254
+ valueEl.textContent = isPlaceholder ? t.placeholder || "Select..." : "";
253
255
  valueEl.classList.toggle("is-placeholder", isPlaceholder);
254
256
  return;
255
257
  }
256
258
  if (isPlaceholder) {
257
- valueEl.textContent = t.placeholder || "Seleziona...";
259
+ valueEl.textContent = t.placeholder || "Select...";
258
260
  valueEl.classList.add("is-placeholder");
259
261
  return;
260
262
  }
@@ -487,14 +489,14 @@ var ZSelectCore = {
487
489
  if (keepPlaceholder) {
488
490
  const opt = document.createElement("option");
489
491
  opt.value = "";
490
- opt.textContent = placeholderOpt?.textContent ?? opts.placeholder ?? "Seleziona...";
492
+ opt.textContent = placeholderOpt?.textContent ?? opts.placeholder ?? "Select...";
491
493
  select.append(opt);
492
494
  }
493
495
  select.value = "";
494
496
  emitChange();
495
497
  }
496
498
  function setOptions(optionsArr, keepPlaceholder = true) {
497
- const placeholderText = select.querySelector('option[value=""]')?.textContent ?? opts.placeholder ?? "Seleziona...";
499
+ const placeholderText = select.querySelector('option[value=""]')?.textContent ?? opts.placeholder ?? "Select...";
498
500
  select.innerHTML = "";
499
501
  if (keepPlaceholder) {
500
502
  const ph = document.createElement("option");
@@ -631,6 +633,6 @@ var ZSelectCore = {
631
633
  };
632
634
  // Annotate the CommonJS export names for ESM import in node:
633
635
  0 && (module.exports = {
634
- ZSelectCore
636
+ Selectamelo
635
637
  });
636
638
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/dom.ts","../src/core.ts"],"sourcesContent":["export { ZSelectCore } from \"./core\";\nexport type { ZSelectCoreOptions, ZSelectInstance } from \"./core\";","export function isTruthyAttr(v: unknown): boolean {\n if (v === true) return true;\n if (v === false || v == null) return false;\n const s = String(v).toLowerCase().trim();\n return s === \"1\" || s === \"true\" || s === \"yes\" || s === \"on\";\n}\n\nexport function uid(prefix = \"zs-\"): string {\n return prefix + Math.random().toString(36).slice(2);\n}","import { uid } from \"./dom\";\n\nexport type ZSelectI18n = {\n placeholder?: string;\n searchPlaceholder?: string;\n clearTitle?: string;\n clearAriaLabel?: string;\n removeChipAriaLabel?: string;\n noResults?: string;\n};\n\nexport type ZSelectCoreOptions = {\n searchable?: boolean;\n placeholder?: string;\n allowClear?: boolean;\n hideSearch?: boolean;\n\n /** Forces the underlying <select> disabled state (HTML native disabled). */\n disabled?: boolean;\n\n /**\n * Prevents user interaction but does NOT disable the underlying <select>,\n * so its value is still submitted in forms.\n */\n readonly?: boolean;\n\n i18n?: ZSelectI18n;\n};\n\nexport type ZSelectInstance = {\n select: HTMLSelectElement;\n\n destroy(): void;\n open(): void;\n close(): void;\n\n setValue(value: string | string[] | null): void;\n getValue(): string | string[];\n\n clearOptions(keepPlaceholder?: boolean): void;\n setOptions(\n options: Array<{ value: string; label: string; disabled?: boolean }>,\n keepPlaceholder?: boolean\n ): void;\n\n addOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt?: boolean\n ): void;\n removeOption(value: string): void;\n updateOption(value: string, patch: { label?: string; disabled?: boolean }): void;\n upsertOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt?: boolean\n ): void;\n\n refresh(): void;\n setLoading(isLoading: boolean): void;\n\n setDisabled(isDisabled: boolean): void;\n setReadonly(isReadonly: boolean): void;\n isDisabled(): boolean;\n isReadonly(): boolean;\n};\n\nconst instances = new WeakMap<HTMLSelectElement, ZSelectInstance>();\n\nfunction dispatch(select: HTMLSelectElement, name: string, detail?: any) {\n select.dispatchEvent(new CustomEvent(name, { bubbles: true, detail }));\n}\n\nfunction getSelected(select: HTMLSelectElement): string | string[] {\n if (select.multiple) return Array.from(select.selectedOptions).map(o => o.value);\n return select.value;\n}\n\nfunction setSelected(select: HTMLSelectElement, value: string | string[] | null) {\n if (select.multiple) {\n const arr = Array.isArray(value)\n ? value.map(String)\n : value == null\n ? []\n : [String(value)];\n\n Array.from(select.options).forEach(o => (o.selected = arr.includes(o.value)));\n } else {\n select.value = value == null ? \"\" : String(value);\n }\n\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n}\n\nexport const ZSelectCore = {\n create(select: HTMLSelectElement, options: ZSelectCoreOptions = {}): ZSelectInstance {\n const existing = instances.get(select);\n if (existing) return existing;\n\n const opts: {\n searchable: boolean;\n placeholder: string;\n allowClear: boolean;\n hideSearch: boolean;\n } = {\n searchable: options.searchable ?? true,\n placeholder: options.placeholder ?? \"\",\n allowClear: options.allowClear ?? true,\n hideSearch: options.hideSearch ?? false,\n };\n\n function readBoolAttr(name: string): boolean | null {\n const v = select.getAttribute(name);\n if (v == null) return null;\n if (v === \"\" || v === \"true\" || v === \"1\") return true;\n if (v === \"false\" || v === \"0\") return false;\n return null;\n }\n\n const aAllowClear = readBoolAttr(\"data-allow-clear\");\n if (aAllowClear != null) opts.allowClear = aAllowClear;\n\n const aHideSearch = readBoolAttr(\"data-hide-search\");\n if (aHideSearch != null) opts.hideSearch = aHideSearch;\n\n const aSearchable = readBoolAttr(\"data-searchable\");\n if (aSearchable != null) opts.searchable = aSearchable;\n\n // --- UI scaffold\n const root = document.createElement(\"div\");\n root.className = \"zselect\";\n root.setAttribute(\"data-zselect-core\", \"1\");\n\n const control = document.createElement(\"button\");\n control.type = \"button\";\n control.className = \"zselect__control\";\n control.setAttribute(\"aria-haspopup\", \"listbox\");\n control.setAttribute(\"aria-expanded\", \"false\");\n\n const ds = {\n placeholder: select.getAttribute(\"data-zselect-placeholder\"),\n searchPlaceholder: select.getAttribute(\"data-zselect-search-placeholder\"),\n clearTitle: select.getAttribute(\"data-zselect-clear-title\"),\n clearAriaLabel: select.getAttribute(\"data-zselect-clear-aria-label\"),\n removeChipAriaLabel: select.getAttribute(\"data-zselect-remove-chip-aria-label\"),\n noResults: select.getAttribute(\"data-zselect-no-results\"),\n };\n\n const t = {\n placeholder:\n options.i18n?.placeholder ??\n ds.placeholder ??\n options.placeholder ??\n \"\",\n\n searchPlaceholder:\n options.i18n?.searchPlaceholder ??\n ds.searchPlaceholder ??\n \"Cerca...\",\n\n clearTitle:\n options.i18n?.clearTitle ??\n ds.clearTitle ??\n \"Pulisci\",\n\n clearAriaLabel:\n options.i18n?.clearAriaLabel ??\n ds.clearAriaLabel ??\n \"Pulisci selezione\",\n\n removeChipAriaLabel:\n options.i18n?.removeChipAriaLabel ??\n ds.removeChipAriaLabel ??\n \"Rimuovi\",\n\n noResults:\n options.i18n?.noResults ??\n ds.noResults ??\n \"Nessun risultato\",\n };\n\n const valueWrap = document.createElement(\"span\");\n valueWrap.className = \"zselect__valuewrap\";\n\n const chipsEl = document.createElement(\"span\");\n chipsEl.className = \"zselect__chips\";\n chipsEl.hidden = !select.multiple;\n\n const valueEl = document.createElement(\"span\");\n valueEl.className = \"zselect__value\";\n\n valueWrap.append(chipsEl, valueEl);\n\n const actions = document.createElement(\"span\");\n actions.className = \"zselect__actions\";\n\n const clearEl = document.createElement(\"span\");\n clearEl.className = \"zselect__clear\";\n clearEl.textContent = \"×\";\n clearEl.title = t.clearTitle;\n clearEl.setAttribute(\"aria-hidden\", \"true\");\n clearEl.setAttribute(\"aria-label\", t.clearAriaLabel);\n clearEl.style.display = \"none\";\n\n const arrow = document.createElement(\"span\");\n arrow.className = \"zselect__arrow\";\n arrow.textContent = \"▾\";\n\n actions.append(clearEl, arrow);\n control.append(valueWrap, actions);\n\n const dropdown = document.createElement(\"div\");\n dropdown.className = \"zselect__dropdown\";\n dropdown.hidden = true;\n\n const searchEl = document.createElement(\"input\");\n searchEl.className = \"zselect__search\";\n searchEl.type = \"text\";\n searchEl.autocomplete = \"off\";\n searchEl.placeholder = t.searchPlaceholder;\n searchEl.hidden = opts.hideSearch || !opts.searchable;\n\n const list = document.createElement(\"ul\");\n list.className = \"zselect__list\";\n list.setAttribute(\"role\", \"listbox\");\n\n // accessibility ids\n const listId = `zselect-list-${uid()}`;\n list.id = listId;\n control.setAttribute(\"aria-controls\", listId);\n\n dropdown.append(searchEl, list);\n root.append(control, dropdown);\n\n // hide original select (keep it in DOM for forms)\n const prevStyle = {\n position: select.style.position,\n left: select.style.left,\n width: select.style.width,\n height: select.style.height,\n };\n\n select.style.position = \"absolute\";\n select.style.left = \"-9999px\";\n select.style.width = \"1px\";\n select.style.height = \"1px\";\n\n select.insertAdjacentElement(\"afterend\", root);\n\n let open = false;\n let readonly = !!options.readonly || select.getAttribute(\"data-readonly\") === \"true\";\n const aDisabled = readBoolAttr(\"data-disabled\");\n if (aDisabled != null) select.disabled = !!aDisabled;\n let activeIndex = -1;\n let filterQuery = \"\";\n let hoverArmed = false;\n\n function isDisabled() {\n return select.disabled || select.hasAttribute(\"disabled\");\n }\n\n function isReadonly() {\n return readonly;\n }\n\n function applyStateToUI() {\n const disabledNow = isDisabled();\n const readonlyNow = isReadonly();\n\n root.classList.toggle(\"is-disabled\", disabledNow);\n root.classList.toggle(\"is-readonly\", readonlyNow);\n\n control.disabled = disabledNow || readonlyNow;\n searchEl.disabled = disabledNow || readonlyNow;\n\n control.setAttribute(\"aria-disabled\", disabledNow || readonlyNow ? \"true\" : \"false\");\n\n if ((disabledNow || readonlyNow) && open) close();\n }\n\n function hasValue(): boolean {\n if (select.multiple) return Array.from(select.selectedOptions).some(o => (o.value ?? \"\") !== \"\");\n return (select.value ?? \"\") !== \"\";\n }\n\n function updateClearVisibility() {\n if (!opts.allowClear || isDisabled() || isReadonly()) {\n clearEl.style.display = \"none\";\n return;\n }\n clearEl.style.display = hasValue() ? \"\" : \"none\";\n }\n\n function normalize(s: string) {\n return s.toLowerCase();\n }\n\n function getOptionLabel(opt: HTMLOptionElement) {\n return (opt.textContent ?? \"\").trim();\n }\n\n function allOptions() {\n return Array.from(select.options);\n }\n\n function selectedOptions() {\n return Array.from(select.selectedOptions);\n }\n\n function selectedNonEmpty() {\n return selectedOptions().filter(o => (o.value ?? \"\") !== \"\");\n }\n\n function emitChange() {\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n\n function getFilteredOptions(): HTMLOptionElement[] {\n const q = normalize(filterQuery.trim());\n const all = allOptions();\n if (!q) return all;\n return all.filter(o => normalize(getOptionLabel(o)).includes(q));\n }\n\n function clearValue() {\n if (!opts.allowClear) return;\n if (isReadonly()) return;\n\n if (select.multiple) {\n allOptions().forEach(o => (o.selected = false));\n select.value = \"\";\n } else {\n const hasEmpty = !!select.querySelector('option[value=\"\"]');\n select.value = hasEmpty ? \"\" : (select.options[0]?.value ?? \"\");\n }\n\n emitChange();\n dispatch(select, \"zselect:clear\");\n }\n\n function renderChips() {\n chipsEl.innerHTML = \"\";\n if (!select.multiple) return;\n\n const selected = selectedNonEmpty();\n if (!selected.length) return;\n\n selected.forEach(opt => {\n const chip = document.createElement(\"span\");\n chip.className = \"zselect__chip\";\n chip.dataset.value = opt.value;\n\n const label = document.createElement(\"span\");\n label.className = \"zselect__chip-label\";\n label.textContent = getOptionLabel(opt);\n\n const x = document.createElement(\"button\");\n x.type = \"button\";\n x.className = \"zselect__chip-remove\";\n x.textContent = \"×\";\n x.title = \"Rimuovi\";\n x.setAttribute(\"aria-label\", t.removeChipAriaLabel);\n\n x.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n e.stopPropagation();\n if (isReadonly()) return;\n\n opt.selected = false;\n emitChange();\n });\n\n chip.append(label, x);\n chipsEl.append(chip);\n });\n }\n\n function renderLabel() {\n const selected = selectedOptions();\n\n const isPlaceholder =\n selected.length === 0 ||\n (selected.length === 1 && (selected[0]?.value ?? \"\") === \"\") ||\n (select.multiple && selectedNonEmpty().length === 0);\n\n if (select.multiple) {\n renderChips();\n valueEl.textContent = isPlaceholder ? (t.placeholder || \"Seleziona...\") : \"\";\n valueEl.classList.toggle(\"is-placeholder\", isPlaceholder);\n return;\n }\n\n if (isPlaceholder) {\n valueEl.textContent = t.placeholder || \"Seleziona...\";\n valueEl.classList.add(\"is-placeholder\");\n return;\n }\n\n const first = selected[0];\n valueEl.textContent = (first?.textContent ?? \"\").trim();\n valueEl.classList.remove(\"is-placeholder\");\n }\n\n function getOptionItems(includeDisabled = true) {\n const selector = includeDisabled\n ? \".zselect__option\"\n : \".zselect__option:not(.is-disabled)\";\n return Array.from(list.querySelectorAll<HTMLLIElement>(selector));\n }\n\n function setActiveIndex(items: HTMLLIElement[], idx: number, scroll = true) {\n activeIndex = idx;\n items.forEach((li, i) => li.classList.toggle(\"is-active\", i === activeIndex));\n if (scroll && activeIndex >= 0) items[activeIndex]?.scrollIntoView({ block: \"nearest\" });\n }\n\n function clearActive(items?: HTMLLIElement[]) {\n const all = items ?? getOptionItems();\n activeIndex = -1;\n all.forEach(li => li.classList.remove(\"is-active\"));\n }\n\n function setActiveByValue(val: string) {\n const items = getOptionItems();\n const idx = items.findIndex(li => (li.dataset.value ?? \"\") === val);\n setActiveIndex(items, idx, true);\n }\n\n function renderList() {\n const filtered = getFilteredOptions().filter(opt => (opt.value ?? \"\") !== \"\");\n\n list.innerHTML = \"\";\n\n const selectedValues = new Set(selectedOptions().map(o => o.value));\n\n if (!filtered.length) {\n const empty = document.createElement(\"li\");\n empty.className = \"zselect__empty\";\n empty.textContent = t.noResults;\n list.append(empty);\n activeIndex = -1;\n return;\n }\n\n filtered.forEach((opt, idx) => {\n const li = document.createElement(\"li\");\n li.className = \"zselect__option\";\n li.setAttribute(\"role\", \"option\");\n li.dataset.value = opt.value;\n\n const labelText = getOptionLabel(opt);\n const labelEl = document.createElement(\"span\");\n labelEl.className = \"zselect__option-label\";\n labelEl.textContent = labelText;\n\n const checkEl = document.createElement(\"span\");\n checkEl.className = \"zselect__option-check\";\n checkEl.setAttribute(\"aria-hidden\", \"true\");\n checkEl.textContent = \"✓\";\n\n // Only show the check indicator when the option is selected.\n const isSelected = selectedValues.has(opt.value);\n checkEl.hidden = !isSelected;\n\n li.append(labelEl, checkEl);\n\n if (opt.disabled) li.classList.add(\"is-disabled\");\n\n if (isSelected) {\n li.classList.add(\"is-selected\");\n li.setAttribute(\"aria-selected\", \"true\");\n } else {\n li.setAttribute(\"aria-selected\", \"false\");\n }\n\n li.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n if (opt.disabled) return;\n if (isReadonly()) return;\n\n if (select.multiple) {\n opt.selected = !opt.selected;\n emitChange();\n renderList();\n if (!searchEl.hidden) searchEl.focus();\n } else {\n select.value = opt.value;\n emitChange();\n close();\n control.focus();\n }\n });\n\n li.addEventListener(\"mouseenter\", () => {\n if (!hoverArmed) return;\n if (opt.disabled) return;\n const all = getOptionItems();\n setActiveIndex(all, idx, false);\n });\n\n list.append(li);\n });\n\n // Never auto-activate on open. Only allow hover or keyboard to set active.\n clearActive();\n }\n\n function refresh() {\n renderLabel();\n updateClearVisibility();\n if (open) renderList();\n }\n\n function openDropdown() {\n if (open || isDisabled() || isReadonly()) return;\n\n open = true;\n dropdown.hidden = false;\n control.setAttribute(\"aria-expanded\", \"true\");\n root.classList.add(\"is-open\");\n\n filterQuery = \"\";\n // Prevent immediate activation of the first option just because the dropdown\n // appears under the current mouse cursor position. We only activate on real\n // pointer movement inside the dropdown.\n hoverArmed = false;\n dropdown.addEventListener(\n \"mousemove\",\n () => {\n hoverArmed = true;\n },\n { once: true }\n );\n if (!searchEl.hidden) {\n searchEl.value = \"\";\n renderList();\n queueMicrotask(() => searchEl.focus());\n } else {\n renderList();\n }\n\n dispatch(select, \"zselect:open\");\n }\n\n function close() {\n if (!open) return;\n\n open = false;\n hoverArmed = false;\n dropdown.hidden = true;\n control.setAttribute(\"aria-expanded\", \"false\");\n root.classList.remove(\"is-open\");\n dispatch(select, \"zselect:close\");\n }\n\n function toggle() {\n open ? close() : openDropdown();\n }\n\n function moveActive(delta: number) {\n const items = getOptionItems(false);\n if (!items.length) return;\n\n let i = activeIndex;\n if (i < 0) i = -1;\n i = Math.min(Math.max(i + delta, 0), items.length - 1);\n setActiveIndex(items, i, true);\n }\n\n function selectActive() {\n if (isReadonly()) return;\n\n const items = getOptionItems(false);\n if (!items.length) return;\n\n const li = items[Math.max(0, Math.min(activeIndex, items.length - 1))];\n if (!li) return;\n\n const val = li.dataset.value ?? \"\";\n const opt = Array.from(select.options).find(o => o.value === val);\n if (!opt || opt.disabled) return;\n\n if (select.multiple) {\n opt.selected = !opt.selected;\n emitChange();\n renderList();\n if (!searchEl.hidden) searchEl.focus();\n } else {\n select.value = opt.value;\n emitChange();\n close();\n control.focus();\n }\n }\n\n function onKeydown(e: KeyboardEvent) {\n if (isDisabled() || isReadonly()) return;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) openDropdown();\n moveActive(+1);\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!open) openDropdown();\n moveActive(-1);\n return;\n }\n if (e.key === \"Enter\") {\n if (!open) return;\n e.preventDefault();\n selectActive();\n return;\n }\n if (e.key === \"Escape\") {\n if (!open) return;\n e.preventDefault();\n close();\n control.focus();\n return;\n }\n if (e.key === \"Tab\") {\n if (open) close();\n return;\n }\n\n if (select.multiple && e.key === \"Backspace\") {\n const searchEmpty = searchEl.hidden || searchEl.value.trim() === \"\";\n if (searchEmpty) {\n const selected = selectedNonEmpty();\n const last = selected[selected.length - 1];\n if (last) {\n last.selected = false;\n emitChange();\n renderList();\n }\n }\n }\n }\n\n const onDocDown = (e: MouseEvent) => {\n if (!root.contains(e.target as Node)) close();\n };\n\n document.addEventListener(\"mousedown\", onDocDown);\n\n control.addEventListener(\"click\", () => toggle());\n control.addEventListener(\"keydown\", onKeydown);\n searchEl.addEventListener(\"keydown\", onKeydown);\n\n searchEl.addEventListener(\"input\", () => {\n filterQuery = searchEl.value ?? \"\";\n renderList();\n dispatch(select, \"zselect:search\", { q: filterQuery });\n });\n\n clearEl.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n e.stopPropagation();\n clearValue();\n if (open) renderList();\n if (!searchEl.hidden) searchEl.focus();\n });\n\n select.addEventListener(\"change\", () => {\n renderLabel();\n updateClearVisibility();\n if (open) renderList();\n dispatch(select, \"zselect:change\", { value: getSelected(select) });\n });\n\n function clearOptions(keepPlaceholder = true) {\n const placeholderOpt = select.querySelector('option[value=\"\"]') as HTMLOptionElement | null;\n\n select.innerHTML = \"\";\n\n if (keepPlaceholder) {\n const opt = document.createElement(\"option\");\n opt.value = \"\";\n opt.textContent = placeholderOpt?.textContent ?? opts.placeholder ?? \"Seleziona...\";\n select.append(opt);\n }\n\n select.value = \"\";\n emitChange();\n }\n\n function setOptions(\n optionsArr: Array<{ value: string; label: string; disabled?: boolean }>,\n keepPlaceholder = true\n ) {\n const placeholderText =\n (select.querySelector('option[value=\"\"]') as HTMLOptionElement | null)?.textContent ??\n opts.placeholder ??\n \"Seleziona...\";\n\n select.innerHTML = \"\";\n\n if (keepPlaceholder) {\n const ph = document.createElement(\"option\");\n ph.value = \"\";\n ph.textContent = placeholderText;\n select.append(ph);\n }\n\n optionsArr.forEach(o => {\n const opt = document.createElement(\"option\");\n opt.value = String(o.value);\n opt.textContent = o.label;\n if (o.disabled) opt.disabled = true;\n select.append(opt);\n });\n\n select.value = \"\";\n emitChange();\n }\n\n function setLoading(isLoading: boolean) {\n root.classList.toggle(\"is-loading\", !!isLoading);\n\n if (isLoading) {\n control.disabled = true;\n searchEl.disabled = true;\n return;\n }\n\n applyStateToUI();\n }\n\n function findOptionEl(value: string) {\n const v = String(value);\n return Array.from(select.options).find(o => o.value === v) ?? null;\n }\n\n function addOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt = false\n ) {\n const value = String(option.value);\n if (findOptionEl(value)) return;\n\n const opt = document.createElement(\"option\");\n opt.value = value;\n opt.textContent = option.label;\n if (option.disabled) opt.disabled = true;\n\n select.append(opt);\n\n if (selectIt) {\n if (select.multiple) opt.selected = true;\n else select.value = value;\n emitChange();\n } else {\n refresh();\n }\n }\n\n function removeOption(value: string) {\n const opt = findOptionEl(value);\n if (!opt) return;\n\n const wasSelected = opt.selected;\n opt.remove();\n\n if (wasSelected) {\n emitChange();\n } else {\n refresh();\n }\n }\n\n function updateOption(value: string, patch: { label?: string; disabled?: boolean }) {\n const opt = findOptionEl(value);\n if (!opt) return;\n\n if (patch.label !== undefined) opt.textContent = patch.label;\n if (patch.disabled !== undefined) opt.disabled = !!patch.disabled;\n\n refresh();\n }\n\n function upsertOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt = false\n ) {\n const value = String(option.value);\n const opt = findOptionEl(value);\n\n if (!opt) {\n addOption(option, selectIt);\n return;\n }\n\n opt.textContent = option.label;\n opt.disabled = !!option.disabled;\n\n if (selectIt) {\n if (select.multiple) opt.selected = true;\n else select.value = value;\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n } else {\n refresh();\n }\n }\n\n // initial render\n renderLabel();\n updateClearVisibility();\n\n // apply initial disabled if provided\n if (options.disabled != null) select.disabled = !!options.disabled;\n\n applyStateToUI();\n\n const inst: ZSelectInstance = {\n select,\n\n destroy() {\n document.removeEventListener(\"mousedown\", onDocDown);\n root.remove();\n\n // restore select styles\n select.style.position = prevStyle.position;\n select.style.left = prevStyle.left;\n select.style.width = prevStyle.width;\n select.style.height = prevStyle.height;\n\n instances.delete(select);\n },\n\n open: openDropdown,\n close,\n\n setValue(value: string | string[] | null) {\n setSelected(select, value);\n },\n getValue() {\n return getSelected(select);\n },\n\n clearOptions,\n setOptions,\n addOption,\n removeOption,\n updateOption,\n upsertOption,\n\n refresh,\n setLoading,\n\n setDisabled(v: boolean) {\n select.disabled = !!v;\n applyStateToUI();\n },\n setReadonly(v: boolean) {\n readonly = !!v;\n applyStateToUI();\n },\n isDisabled,\n isReadonly,\n };\n\n instances.set(select, inst);\n return inst;\n },\n\n get(select: HTMLSelectElement): ZSelectInstance | null {\n return instances.get(select) ?? null;\n },\n\n destroy(select: HTMLSelectElement): void {\n const inst = instances.get(select);\n if (inst) inst.destroy();\n },\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/dom.ts","../src/core.ts"],"sourcesContent":["export { Selectamelo } from \"./core\";\nexport type { SelectameloOptions, SelectameloInstance } from \"./core\";\n","export function isTruthyAttr(v: unknown): boolean {\n if (v === true) return true;\n if (v === false || v == null) return false;\n const s = String(v).toLowerCase().trim();\n return s === \"1\" || s === \"true\" || s === \"yes\" || s === \"on\";\n}\n\nexport function uid(prefix = \"zs-\"): string {\n return prefix + Math.random().toString(36).slice(2);\n}","import { uid } from \"./dom\";\n\nexport type SelectameloI18n = {\n placeholder?: string;\n searchPlaceholder?: string;\n clearTitle?: string;\n clearAriaLabel?: string;\n removeChipAriaLabel?: string;\n noResults?: string;\n};\n\nexport type SelectameloOptions = {\n searchable?: boolean;\n placeholder?: string;\n allowClear?: boolean;\n hideSearch?: boolean;\n\n /** Forces the underlying <select> disabled state (HTML native disabled). */\n disabled?: boolean;\n\n /**\n * Prevents user interaction but does NOT disable the underlying <select>,\n * so its value is still submitted in forms.\n */\n readonly?: boolean;\n\n i18n?: SelectameloI18n;\n};\n\nexport type SelectameloInstance = {\n select: HTMLSelectElement;\n\n destroy(): void;\n open(): void;\n close(): void;\n\n setValue(value: string | string[] | null): void;\n getValue(): string | string[];\n\n clearOptions(keepPlaceholder?: boolean): void;\n setOptions(\n options: Array<{ value: string; label: string; disabled?: boolean }>,\n keepPlaceholder?: boolean\n ): void;\n\n addOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt?: boolean\n ): void;\n removeOption(value: string): void;\n updateOption(value: string, patch: { label?: string; disabled?: boolean }): void;\n upsertOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt?: boolean\n ): void;\n\n refresh(): void;\n setLoading(isLoading: boolean): void;\n\n setDisabled(isDisabled: boolean): void;\n setReadonly(isReadonly: boolean): void;\n isDisabled(): boolean;\n isReadonly(): boolean;\n};\n\nconst instances = new WeakMap<HTMLSelectElement, SelectameloInstance>();\nconst ICON_ANGLE_DOWN =\n '<svg class=\"zselect__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M6 9l6 6 6-6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\nconst ICON_X =\n '<svg class=\"zselect__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M6 6l12 12M18 6l-12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>';\n\nfunction dispatch(select: HTMLSelectElement, name: string, detail?: any) {\n select.dispatchEvent(new CustomEvent(name, { bubbles: true, detail }));\n}\n\nfunction getSelected(select: HTMLSelectElement): string | string[] {\n if (select.multiple) return Array.from(select.selectedOptions).map(o => o.value);\n return select.value;\n}\n\nfunction setSelected(select: HTMLSelectElement, value: string | string[] | null) {\n if (select.multiple) {\n const arr = Array.isArray(value)\n ? value.map(String)\n : value == null\n ? []\n : [String(value)];\n\n Array.from(select.options).forEach(o => (o.selected = arr.includes(o.value)));\n } else {\n select.value = value == null ? \"\" : String(value);\n }\n\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n}\n\nexport const Selectamelo = {\n create(select: HTMLSelectElement, options: SelectameloOptions = {}): SelectameloInstance {\n const existing = instances.get(select);\n if (existing) return existing;\n\n const opts: {\n searchable: boolean;\n placeholder: string;\n allowClear: boolean;\n hideSearch: boolean;\n } = {\n searchable: options.searchable ?? true,\n placeholder: options.placeholder ?? \"\",\n allowClear: options.allowClear ?? true,\n hideSearch: options.hideSearch ?? false,\n };\n\n function readBoolAttr(name: string): boolean | null {\n const v = select.getAttribute(name);\n if (v == null) return null;\n if (v === \"\" || v === \"true\" || v === \"1\") return true;\n if (v === \"false\" || v === \"0\") return false;\n return null;\n }\n\n const aAllowClear = readBoolAttr(\"data-allow-clear\");\n if (aAllowClear != null) opts.allowClear = aAllowClear;\n\n const aHideSearch = readBoolAttr(\"data-hide-search\");\n if (aHideSearch != null) opts.hideSearch = aHideSearch;\n\n const aSearchable = readBoolAttr(\"data-searchable\");\n if (aSearchable != null) opts.searchable = aSearchable;\n\n // --- UI scaffold\n const root = document.createElement(\"div\");\n root.className = \"zselect\";\n root.setAttribute(\"data-selectamelo-core\", \"1\");\n\n const control = document.createElement(\"button\");\n control.type = \"button\";\n control.className = \"zselect__control\";\n control.setAttribute(\"aria-haspopup\", \"listbox\");\n control.setAttribute(\"aria-expanded\", \"false\");\n\n const ds = {\n placeholder: select.getAttribute(\"data-selectamelo-placeholder\"),\n searchPlaceholder: select.getAttribute(\"data-selectamelo-search-placeholder\"),\n clearTitle: select.getAttribute(\"data-selectamelo-clear-title\"),\n clearAriaLabel: select.getAttribute(\"data-selectamelo-clear-aria-label\"),\n removeChipAriaLabel: select.getAttribute(\"data-selectamelo-remove-chip-aria-label\"),\n noResults: select.getAttribute(\"data-selectamelo-no-results\"),\n };\n\n const t = {\n placeholder:\n options.i18n?.placeholder ??\n ds.placeholder ??\n options.placeholder ??\n \"\",\n\n searchPlaceholder:\n options.i18n?.searchPlaceholder ??\n ds.searchPlaceholder ??\n \"Search...\",\n\n clearTitle:\n options.i18n?.clearTitle ??\n ds.clearTitle ??\n \"Clear\",\n\n clearAriaLabel:\n options.i18n?.clearAriaLabel ??\n ds.clearAriaLabel ??\n \"Clear selection\",\n\n removeChipAriaLabel:\n options.i18n?.removeChipAriaLabel ??\n ds.removeChipAriaLabel ??\n \"Remove\",\n\n noResults:\n options.i18n?.noResults ??\n ds.noResults ??\n \"No results\",\n };\n\n const valueWrap = document.createElement(\"span\");\n valueWrap.className = \"zselect__valuewrap\";\n\n const chipsEl = document.createElement(\"span\");\n chipsEl.className = \"zselect__chips\";\n chipsEl.hidden = !select.multiple;\n\n const valueEl = document.createElement(\"span\");\n valueEl.className = \"zselect__value\";\n\n valueWrap.append(chipsEl, valueEl);\n\n const actions = document.createElement(\"span\");\n actions.className = \"zselect__actions\";\n\n const clearEl = document.createElement(\"span\");\n clearEl.className = \"zselect__clear\";\n clearEl.innerHTML = ICON_X;\n clearEl.title = t.clearTitle;\n clearEl.setAttribute(\"aria-hidden\", \"true\");\n clearEl.setAttribute(\"aria-label\", t.clearAriaLabel);\n clearEl.style.display = \"none\";\n\n const arrow = document.createElement(\"span\");\n arrow.className = \"zselect__arrow\";\n arrow.innerHTML = ICON_ANGLE_DOWN;\n\n actions.append(clearEl, arrow);\n control.append(valueWrap, actions);\n\n const dropdown = document.createElement(\"div\");\n dropdown.className = \"zselect__dropdown\";\n dropdown.hidden = true;\n\n const searchEl = document.createElement(\"input\");\n searchEl.className = \"zselect__search\";\n searchEl.type = \"text\";\n searchEl.autocomplete = \"off\";\n searchEl.placeholder = t.searchPlaceholder;\n searchEl.hidden = opts.hideSearch || !opts.searchable;\n\n const list = document.createElement(\"ul\");\n list.className = \"zselect__list\";\n list.setAttribute(\"role\", \"listbox\");\n\n // accessibility ids\n const listId = `zselect-list-${uid()}`;\n list.id = listId;\n control.setAttribute(\"aria-controls\", listId);\n\n dropdown.append(searchEl, list);\n root.append(control, dropdown);\n\n // hide original select (keep it in DOM for forms)\n const prevStyle = {\n position: select.style.position,\n left: select.style.left,\n width: select.style.width,\n height: select.style.height,\n };\n\n select.style.position = \"absolute\";\n select.style.left = \"-9999px\";\n select.style.width = \"1px\";\n select.style.height = \"1px\";\n\n select.insertAdjacentElement(\"afterend\", root);\n\n let open = false;\n let readonly = !!options.readonly || select.getAttribute(\"data-readonly\") === \"true\";\n const aDisabled = readBoolAttr(\"data-disabled\");\n if (aDisabled != null) select.disabled = !!aDisabled;\n let activeIndex = -1;\n let filterQuery = \"\";\n let hoverArmed = false;\n\n function isDisabled() {\n return select.disabled || select.hasAttribute(\"disabled\");\n }\n\n function isReadonly() {\n return readonly;\n }\n\n function applyStateToUI() {\n const disabledNow = isDisabled();\n const readonlyNow = isReadonly();\n\n root.classList.toggle(\"is-disabled\", disabledNow);\n root.classList.toggle(\"is-readonly\", readonlyNow);\n\n control.disabled = disabledNow || readonlyNow;\n searchEl.disabled = disabledNow || readonlyNow;\n\n control.setAttribute(\"aria-disabled\", disabledNow || readonlyNow ? \"true\" : \"false\");\n\n if ((disabledNow || readonlyNow) && open) close();\n }\n\n function hasValue(): boolean {\n if (select.multiple) return Array.from(select.selectedOptions).some(o => (o.value ?? \"\") !== \"\");\n return (select.value ?? \"\") !== \"\";\n }\n\n function updateClearVisibility() {\n if (!opts.allowClear || isDisabled() || isReadonly()) {\n clearEl.style.display = \"none\";\n return;\n }\n clearEl.style.display = hasValue() ? \"\" : \"none\";\n }\n\n function normalize(s: string) {\n return s.toLowerCase();\n }\n\n function getOptionLabel(opt: HTMLOptionElement) {\n return (opt.textContent ?? \"\").trim();\n }\n\n function allOptions() {\n return Array.from(select.options);\n }\n\n function selectedOptions() {\n return Array.from(select.selectedOptions);\n }\n\n function selectedNonEmpty() {\n return selectedOptions().filter(o => (o.value ?? \"\") !== \"\");\n }\n\n function emitChange() {\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n\n function getFilteredOptions(): HTMLOptionElement[] {\n const q = normalize(filterQuery.trim());\n const all = allOptions();\n if (!q) return all;\n return all.filter(o => normalize(getOptionLabel(o)).includes(q));\n }\n\n function clearValue() {\n if (!opts.allowClear) return;\n if (isReadonly()) return;\n\n if (select.multiple) {\n allOptions().forEach(o => (o.selected = false));\n select.value = \"\";\n } else {\n const hasEmpty = !!select.querySelector('option[value=\"\"]');\n select.value = hasEmpty ? \"\" : (select.options[0]?.value ?? \"\");\n }\n\n emitChange();\n dispatch(select, \"zselect:clear\");\n }\n\n function renderChips() {\n chipsEl.innerHTML = \"\";\n if (!select.multiple) return;\n\n const selected = selectedNonEmpty();\n if (!selected.length) return;\n\n selected.forEach(opt => {\n const chip = document.createElement(\"span\");\n chip.className = \"zselect__chip\";\n chip.dataset.value = opt.value;\n\n const label = document.createElement(\"span\");\n label.className = \"zselect__chip-label\";\n label.textContent = getOptionLabel(opt);\n\n const x = document.createElement(\"button\");\n x.type = \"button\";\n x.className = \"zselect__chip-remove\";\n x.innerHTML = ICON_X;\n x.title = \"Remove\";\n x.setAttribute(\"aria-label\", t.removeChipAriaLabel);\n\n x.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n e.stopPropagation();\n if (isReadonly()) return;\n\n opt.selected = false;\n emitChange();\n });\n\n chip.append(label, x);\n chipsEl.append(chip);\n });\n }\n\n function renderLabel() {\n const selected = selectedOptions();\n\n const isPlaceholder =\n selected.length === 0 ||\n (selected.length === 1 && (selected[0]?.value ?? \"\") === \"\") ||\n (select.multiple && selectedNonEmpty().length === 0);\n\n if (select.multiple) {\n renderChips();\n valueEl.textContent = isPlaceholder ? (t.placeholder || \"Select...\") : \"\";\n valueEl.classList.toggle(\"is-placeholder\", isPlaceholder);\n return;\n }\n\n if (isPlaceholder) {\n valueEl.textContent = t.placeholder || \"Select...\";\n valueEl.classList.add(\"is-placeholder\");\n return;\n }\n\n const first = selected[0];\n valueEl.textContent = (first?.textContent ?? \"\").trim();\n valueEl.classList.remove(\"is-placeholder\");\n }\n\n function getOptionItems(includeDisabled = true) {\n const selector = includeDisabled\n ? \".zselect__option\"\n : \".zselect__option:not(.is-disabled)\";\n return Array.from(list.querySelectorAll<HTMLLIElement>(selector));\n }\n\n function setActiveIndex(items: HTMLLIElement[], idx: number, scroll = true) {\n activeIndex = idx;\n items.forEach((li, i) => li.classList.toggle(\"is-active\", i === activeIndex));\n if (scroll && activeIndex >= 0) items[activeIndex]?.scrollIntoView({ block: \"nearest\" });\n }\n\n function clearActive(items?: HTMLLIElement[]) {\n const all = items ?? getOptionItems();\n activeIndex = -1;\n all.forEach(li => li.classList.remove(\"is-active\"));\n }\n\n function setActiveByValue(val: string) {\n const items = getOptionItems();\n const idx = items.findIndex(li => (li.dataset.value ?? \"\") === val);\n setActiveIndex(items, idx, true);\n }\n\n function renderList() {\n const filtered = getFilteredOptions().filter(opt => (opt.value ?? \"\") !== \"\");\n\n list.innerHTML = \"\";\n\n const selectedValues = new Set(selectedOptions().map(o => o.value));\n\n if (!filtered.length) {\n const empty = document.createElement(\"li\");\n empty.className = \"zselect__empty\";\n empty.textContent = t.noResults;\n list.append(empty);\n activeIndex = -1;\n return;\n }\n\n filtered.forEach((opt, idx) => {\n const li = document.createElement(\"li\");\n li.className = \"zselect__option\";\n li.setAttribute(\"role\", \"option\");\n li.dataset.value = opt.value;\n\n const labelText = getOptionLabel(opt);\n const labelEl = document.createElement(\"span\");\n labelEl.className = \"zselect__option-label\";\n labelEl.textContent = labelText;\n\n const checkEl = document.createElement(\"span\");\n checkEl.className = \"zselect__option-check\";\n checkEl.setAttribute(\"aria-hidden\", \"true\");\n checkEl.textContent = \"✓\";\n\n // Only show the check indicator when the option is selected.\n const isSelected = selectedValues.has(opt.value);\n checkEl.hidden = !isSelected;\n\n li.append(labelEl, checkEl);\n\n if (opt.disabled) li.classList.add(\"is-disabled\");\n\n if (isSelected) {\n li.classList.add(\"is-selected\");\n li.setAttribute(\"aria-selected\", \"true\");\n } else {\n li.setAttribute(\"aria-selected\", \"false\");\n }\n\n li.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n if (opt.disabled) return;\n if (isReadonly()) return;\n\n if (select.multiple) {\n opt.selected = !opt.selected;\n emitChange();\n renderList();\n if (!searchEl.hidden) searchEl.focus();\n } else {\n select.value = opt.value;\n emitChange();\n close();\n control.focus();\n }\n });\n\n li.addEventListener(\"mouseenter\", () => {\n if (!hoverArmed) return;\n if (opt.disabled) return;\n const all = getOptionItems();\n setActiveIndex(all, idx, false);\n });\n\n list.append(li);\n });\n\n // Never auto-activate on open. Only allow hover or keyboard to set active.\n clearActive();\n }\n\n function refresh() {\n renderLabel();\n updateClearVisibility();\n if (open) renderList();\n }\n\n function openDropdown() {\n if (open || isDisabled() || isReadonly()) return;\n\n open = true;\n dropdown.hidden = false;\n control.setAttribute(\"aria-expanded\", \"true\");\n root.classList.add(\"is-open\");\n\n filterQuery = \"\";\n // Prevent immediate activation of the first option just because the dropdown\n // appears under the current mouse cursor position. We only activate on real\n // pointer movement inside the dropdown.\n hoverArmed = false;\n dropdown.addEventListener(\n \"mousemove\",\n () => {\n hoverArmed = true;\n },\n { once: true }\n );\n if (!searchEl.hidden) {\n searchEl.value = \"\";\n renderList();\n queueMicrotask(() => searchEl.focus());\n } else {\n renderList();\n }\n\n dispatch(select, \"zselect:open\");\n }\n\n function close() {\n if (!open) return;\n\n open = false;\n hoverArmed = false;\n dropdown.hidden = true;\n control.setAttribute(\"aria-expanded\", \"false\");\n root.classList.remove(\"is-open\");\n dispatch(select, \"zselect:close\");\n }\n\n function toggle() {\n open ? close() : openDropdown();\n }\n\n function moveActive(delta: number) {\n const items = getOptionItems(false);\n if (!items.length) return;\n\n let i = activeIndex;\n if (i < 0) i = -1;\n i = Math.min(Math.max(i + delta, 0), items.length - 1);\n setActiveIndex(items, i, true);\n }\n\n function selectActive() {\n if (isReadonly()) return;\n\n const items = getOptionItems(false);\n if (!items.length) return;\n\n const li = items[Math.max(0, Math.min(activeIndex, items.length - 1))];\n if (!li) return;\n\n const val = li.dataset.value ?? \"\";\n const opt = Array.from(select.options).find(o => o.value === val);\n if (!opt || opt.disabled) return;\n\n if (select.multiple) {\n opt.selected = !opt.selected;\n emitChange();\n renderList();\n if (!searchEl.hidden) searchEl.focus();\n } else {\n select.value = opt.value;\n emitChange();\n close();\n control.focus();\n }\n }\n\n function onKeydown(e: KeyboardEvent) {\n if (isDisabled() || isReadonly()) return;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) openDropdown();\n moveActive(+1);\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!open) openDropdown();\n moveActive(-1);\n return;\n }\n if (e.key === \"Enter\") {\n if (!open) return;\n e.preventDefault();\n selectActive();\n return;\n }\n if (e.key === \"Escape\") {\n if (!open) return;\n e.preventDefault();\n close();\n control.focus();\n return;\n }\n if (e.key === \"Tab\") {\n if (open) close();\n return;\n }\n\n if (select.multiple && e.key === \"Backspace\") {\n const searchEmpty = searchEl.hidden || searchEl.value.trim() === \"\";\n if (searchEmpty) {\n const selected = selectedNonEmpty();\n const last = selected[selected.length - 1];\n if (last) {\n last.selected = false;\n emitChange();\n renderList();\n }\n }\n }\n }\n\n const onDocDown = (e: MouseEvent) => {\n if (!root.contains(e.target as Node)) close();\n };\n\n document.addEventListener(\"mousedown\", onDocDown);\n\n control.addEventListener(\"click\", () => toggle());\n control.addEventListener(\"keydown\", onKeydown);\n searchEl.addEventListener(\"keydown\", onKeydown);\n\n searchEl.addEventListener(\"input\", () => {\n filterQuery = searchEl.value ?? \"\";\n renderList();\n dispatch(select, \"zselect:search\", { q: filterQuery });\n });\n\n clearEl.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n e.stopPropagation();\n clearValue();\n if (open) renderList();\n if (!searchEl.hidden) searchEl.focus();\n });\n\n select.addEventListener(\"change\", () => {\n renderLabel();\n updateClearVisibility();\n if (open) renderList();\n dispatch(select, \"zselect:change\", { value: getSelected(select) });\n });\n\n function clearOptions(keepPlaceholder = true) {\n const placeholderOpt = select.querySelector('option[value=\"\"]') as HTMLOptionElement | null;\n\n select.innerHTML = \"\";\n\n if (keepPlaceholder) {\n const opt = document.createElement(\"option\");\n opt.value = \"\";\n opt.textContent = placeholderOpt?.textContent ?? opts.placeholder ?? \"Select...\";\n select.append(opt);\n }\n\n select.value = \"\";\n emitChange();\n }\n\n function setOptions(\n optionsArr: Array<{ value: string; label: string; disabled?: boolean }>,\n keepPlaceholder = true\n ) {\n const placeholderText =\n (select.querySelector('option[value=\"\"]') as HTMLOptionElement | null)?.textContent ??\n opts.placeholder ??\n \"Select...\";\n\n select.innerHTML = \"\";\n\n if (keepPlaceholder) {\n const ph = document.createElement(\"option\");\n ph.value = \"\";\n ph.textContent = placeholderText;\n select.append(ph);\n }\n\n optionsArr.forEach(o => {\n const opt = document.createElement(\"option\");\n opt.value = String(o.value);\n opt.textContent = o.label;\n if (o.disabled) opt.disabled = true;\n select.append(opt);\n });\n\n select.value = \"\";\n emitChange();\n }\n\n function setLoading(isLoading: boolean) {\n root.classList.toggle(\"is-loading\", !!isLoading);\n\n if (isLoading) {\n control.disabled = true;\n searchEl.disabled = true;\n return;\n }\n\n applyStateToUI();\n }\n\n function findOptionEl(value: string) {\n const v = String(value);\n return Array.from(select.options).find(o => o.value === v) ?? null;\n }\n\n function addOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt = false\n ) {\n const value = String(option.value);\n if (findOptionEl(value)) return;\n\n const opt = document.createElement(\"option\");\n opt.value = value;\n opt.textContent = option.label;\n if (option.disabled) opt.disabled = true;\n\n select.append(opt);\n\n if (selectIt) {\n if (select.multiple) opt.selected = true;\n else select.value = value;\n emitChange();\n } else {\n refresh();\n }\n }\n\n function removeOption(value: string) {\n const opt = findOptionEl(value);\n if (!opt) return;\n\n const wasSelected = opt.selected;\n opt.remove();\n\n if (wasSelected) {\n emitChange();\n } else {\n refresh();\n }\n }\n\n function updateOption(value: string, patch: { label?: string; disabled?: boolean }) {\n const opt = findOptionEl(value);\n if (!opt) return;\n\n if (patch.label !== undefined) opt.textContent = patch.label;\n if (patch.disabled !== undefined) opt.disabled = !!patch.disabled;\n\n refresh();\n }\n\n function upsertOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt = false\n ) {\n const value = String(option.value);\n const opt = findOptionEl(value);\n\n if (!opt) {\n addOption(option, selectIt);\n return;\n }\n\n opt.textContent = option.label;\n opt.disabled = !!option.disabled;\n\n if (selectIt) {\n if (select.multiple) opt.selected = true;\n else select.value = value;\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n } else {\n refresh();\n }\n }\n\n // initial render\n renderLabel();\n updateClearVisibility();\n\n // apply initial disabled if provided\n if (options.disabled != null) select.disabled = !!options.disabled;\n\n applyStateToUI();\n\n const inst: SelectameloInstance = {\n select,\n\n destroy() {\n document.removeEventListener(\"mousedown\", onDocDown);\n root.remove();\n\n // restore select styles\n select.style.position = prevStyle.position;\n select.style.left = prevStyle.left;\n select.style.width = prevStyle.width;\n select.style.height = prevStyle.height;\n\n instances.delete(select);\n },\n\n open: openDropdown,\n close,\n\n setValue(value: string | string[] | null) {\n setSelected(select, value);\n },\n getValue() {\n return getSelected(select);\n },\n\n clearOptions,\n setOptions,\n addOption,\n removeOption,\n updateOption,\n upsertOption,\n\n refresh,\n setLoading,\n\n setDisabled(v: boolean) {\n select.disabled = !!v;\n applyStateToUI();\n },\n setReadonly(v: boolean) {\n readonly = !!v;\n applyStateToUI();\n },\n isDisabled,\n isReadonly,\n };\n\n instances.set(select, inst);\n return inst;\n },\n\n get(select: HTMLSelectElement): SelectameloInstance | null {\n return instances.get(select) ?? null;\n },\n\n destroy(select: HTMLSelectElement): void {\n const inst = instances.get(select);\n if (inst) inst.destroy();\n },\n};\n"],"mappings":"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","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- type ZSelectI18n = {
1
+ type SelectameloI18n = {
2
2
  placeholder?: string;
3
3
  searchPlaceholder?: string;
4
4
  clearTitle?: string;
@@ -6,7 +6,7 @@ type ZSelectI18n = {
6
6
  removeChipAriaLabel?: string;
7
7
  noResults?: string;
8
8
  };
9
- type ZSelectCoreOptions = {
9
+ type SelectameloOptions = {
10
10
  searchable?: boolean;
11
11
  placeholder?: string;
12
12
  allowClear?: boolean;
@@ -18,9 +18,9 @@ type ZSelectCoreOptions = {
18
18
  * so its value is still submitted in forms.
19
19
  */
20
20
  readonly?: boolean;
21
- i18n?: ZSelectI18n;
21
+ i18n?: SelectameloI18n;
22
22
  };
23
- type ZSelectInstance = {
23
+ type SelectameloInstance = {
24
24
  select: HTMLSelectElement;
25
25
  destroy(): void;
26
26
  open(): void;
@@ -55,10 +55,10 @@ type ZSelectInstance = {
55
55
  isDisabled(): boolean;
56
56
  isReadonly(): boolean;
57
57
  };
58
- declare const ZSelectCore: {
59
- create(select: HTMLSelectElement, options?: ZSelectCoreOptions): ZSelectInstance;
60
- get(select: HTMLSelectElement): ZSelectInstance | null;
58
+ declare const Selectamelo: {
59
+ create(select: HTMLSelectElement, options?: SelectameloOptions): SelectameloInstance;
60
+ get(select: HTMLSelectElement): SelectameloInstance | null;
61
61
  destroy(select: HTMLSelectElement): void;
62
62
  };
63
63
 
64
- export { ZSelectCore, type ZSelectCoreOptions, type ZSelectInstance };
64
+ export { Selectamelo, type SelectameloInstance, type SelectameloOptions };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- type ZSelectI18n = {
1
+ type SelectameloI18n = {
2
2
  placeholder?: string;
3
3
  searchPlaceholder?: string;
4
4
  clearTitle?: string;
@@ -6,7 +6,7 @@ type ZSelectI18n = {
6
6
  removeChipAriaLabel?: string;
7
7
  noResults?: string;
8
8
  };
9
- type ZSelectCoreOptions = {
9
+ type SelectameloOptions = {
10
10
  searchable?: boolean;
11
11
  placeholder?: string;
12
12
  allowClear?: boolean;
@@ -18,9 +18,9 @@ type ZSelectCoreOptions = {
18
18
  * so its value is still submitted in forms.
19
19
  */
20
20
  readonly?: boolean;
21
- i18n?: ZSelectI18n;
21
+ i18n?: SelectameloI18n;
22
22
  };
23
- type ZSelectInstance = {
23
+ type SelectameloInstance = {
24
24
  select: HTMLSelectElement;
25
25
  destroy(): void;
26
26
  open(): void;
@@ -55,10 +55,10 @@ type ZSelectInstance = {
55
55
  isDisabled(): boolean;
56
56
  isReadonly(): boolean;
57
57
  };
58
- declare const ZSelectCore: {
59
- create(select: HTMLSelectElement, options?: ZSelectCoreOptions): ZSelectInstance;
60
- get(select: HTMLSelectElement): ZSelectInstance | null;
58
+ declare const Selectamelo: {
59
+ create(select: HTMLSelectElement, options?: SelectameloOptions): SelectameloInstance;
60
+ get(select: HTMLSelectElement): SelectameloInstance | null;
61
61
  destroy(select: HTMLSelectElement): void;
62
62
  };
63
63
 
64
- export { ZSelectCore, type ZSelectCoreOptions, type ZSelectInstance };
64
+ export { Selectamelo, type SelectameloInstance, type SelectameloOptions };
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- var ZSelectCore = (() => {
2
+ var Selectamelo = (() => {
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
@@ -21,7 +21,7 @@ var ZSelectCore = (() => {
21
21
  // src/index.ts
22
22
  var index_exports = {};
23
23
  __export(index_exports, {
24
- ZSelectCore: () => ZSelectCore
24
+ Selectamelo: () => Selectamelo
25
25
  });
26
26
 
27
27
  // src/dom.ts
@@ -31,6 +31,8 @@ var ZSelectCore = (() => {
31
31
 
32
32
  // src/core.ts
33
33
  var instances = /* @__PURE__ */ new WeakMap();
34
+ var ICON_ANGLE_DOWN = '<svg class="zselect__icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M6 9l6 6 6-6" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>';
35
+ var ICON_X = '<svg class="zselect__icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M6 6l12 12M18 6l-12 12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>';
34
36
  function dispatch(select, name, detail) {
35
37
  select.dispatchEvent(new CustomEvent(name, { bubbles: true, detail }));
36
38
  }
@@ -47,7 +49,7 @@ var ZSelectCore = (() => {
47
49
  }
48
50
  select.dispatchEvent(new Event("change", { bubbles: true }));
49
51
  }
50
- var ZSelectCore = {
52
+ var Selectamelo = {
51
53
  create(select, options = {}) {
52
54
  const existing = instances.get(select);
53
55
  if (existing) return existing;
@@ -72,27 +74,27 @@ var ZSelectCore = (() => {
72
74
  if (aSearchable != null) opts.searchable = aSearchable;
73
75
  const root = document.createElement("div");
74
76
  root.className = "zselect";
75
- root.setAttribute("data-zselect-core", "1");
77
+ root.setAttribute("data-selectamelo-core", "1");
76
78
  const control = document.createElement("button");
77
79
  control.type = "button";
78
80
  control.className = "zselect__control";
79
81
  control.setAttribute("aria-haspopup", "listbox");
80
82
  control.setAttribute("aria-expanded", "false");
81
83
  const ds = {
82
- placeholder: select.getAttribute("data-zselect-placeholder"),
83
- searchPlaceholder: select.getAttribute("data-zselect-search-placeholder"),
84
- clearTitle: select.getAttribute("data-zselect-clear-title"),
85
- clearAriaLabel: select.getAttribute("data-zselect-clear-aria-label"),
86
- removeChipAriaLabel: select.getAttribute("data-zselect-remove-chip-aria-label"),
87
- noResults: select.getAttribute("data-zselect-no-results")
84
+ placeholder: select.getAttribute("data-selectamelo-placeholder"),
85
+ searchPlaceholder: select.getAttribute("data-selectamelo-search-placeholder"),
86
+ clearTitle: select.getAttribute("data-selectamelo-clear-title"),
87
+ clearAriaLabel: select.getAttribute("data-selectamelo-clear-aria-label"),
88
+ removeChipAriaLabel: select.getAttribute("data-selectamelo-remove-chip-aria-label"),
89
+ noResults: select.getAttribute("data-selectamelo-no-results")
88
90
  };
89
91
  const t = {
90
92
  placeholder: options.i18n?.placeholder ?? ds.placeholder ?? options.placeholder ?? "",
91
- searchPlaceholder: options.i18n?.searchPlaceholder ?? ds.searchPlaceholder ?? "Cerca...",
92
- clearTitle: options.i18n?.clearTitle ?? ds.clearTitle ?? "Pulisci",
93
- clearAriaLabel: options.i18n?.clearAriaLabel ?? ds.clearAriaLabel ?? "Pulisci selezione",
94
- removeChipAriaLabel: options.i18n?.removeChipAriaLabel ?? ds.removeChipAriaLabel ?? "Rimuovi",
95
- noResults: options.i18n?.noResults ?? ds.noResults ?? "Nessun risultato"
93
+ searchPlaceholder: options.i18n?.searchPlaceholder ?? ds.searchPlaceholder ?? "Search...",
94
+ clearTitle: options.i18n?.clearTitle ?? ds.clearTitle ?? "Clear",
95
+ clearAriaLabel: options.i18n?.clearAriaLabel ?? ds.clearAriaLabel ?? "Clear selection",
96
+ removeChipAriaLabel: options.i18n?.removeChipAriaLabel ?? ds.removeChipAriaLabel ?? "Remove",
97
+ noResults: options.i18n?.noResults ?? ds.noResults ?? "No results"
96
98
  };
97
99
  const valueWrap = document.createElement("span");
98
100
  valueWrap.className = "zselect__valuewrap";
@@ -106,14 +108,14 @@ var ZSelectCore = (() => {
106
108
  actions.className = "zselect__actions";
107
109
  const clearEl = document.createElement("span");
108
110
  clearEl.className = "zselect__clear";
109
- clearEl.textContent = "\xD7";
111
+ clearEl.innerHTML = ICON_X;
110
112
  clearEl.title = t.clearTitle;
111
113
  clearEl.setAttribute("aria-hidden", "true");
112
114
  clearEl.setAttribute("aria-label", t.clearAriaLabel);
113
115
  clearEl.style.display = "none";
114
116
  const arrow = document.createElement("span");
115
117
  arrow.className = "zselect__arrow";
116
- arrow.textContent = "\u25BE";
118
+ arrow.innerHTML = ICON_ANGLE_DOWN;
117
119
  actions.append(clearEl, arrow);
118
120
  control.append(valueWrap, actions);
119
121
  const dropdown = document.createElement("div");
@@ -230,8 +232,8 @@ var ZSelectCore = (() => {
230
232
  const x = document.createElement("button");
231
233
  x.type = "button";
232
234
  x.className = "zselect__chip-remove";
233
- x.textContent = "\xD7";
234
- x.title = "Rimuovi";
235
+ x.innerHTML = ICON_X;
236
+ x.title = "Remove";
235
237
  x.setAttribute("aria-label", t.removeChipAriaLabel);
236
238
  x.addEventListener("mousedown", (e) => {
237
239
  e.preventDefault();
@@ -249,12 +251,12 @@ var ZSelectCore = (() => {
249
251
  const isPlaceholder = selected.length === 0 || selected.length === 1 && (selected[0]?.value ?? "") === "" || select.multiple && selectedNonEmpty().length === 0;
250
252
  if (select.multiple) {
251
253
  renderChips();
252
- valueEl.textContent = isPlaceholder ? t.placeholder || "Seleziona..." : "";
254
+ valueEl.textContent = isPlaceholder ? t.placeholder || "Select..." : "";
253
255
  valueEl.classList.toggle("is-placeholder", isPlaceholder);
254
256
  return;
255
257
  }
256
258
  if (isPlaceholder) {
257
- valueEl.textContent = t.placeholder || "Seleziona...";
259
+ valueEl.textContent = t.placeholder || "Select...";
258
260
  valueEl.classList.add("is-placeholder");
259
261
  return;
260
262
  }
@@ -487,14 +489,14 @@ var ZSelectCore = (() => {
487
489
  if (keepPlaceholder) {
488
490
  const opt = document.createElement("option");
489
491
  opt.value = "";
490
- opt.textContent = placeholderOpt?.textContent ?? opts.placeholder ?? "Seleziona...";
492
+ opt.textContent = placeholderOpt?.textContent ?? opts.placeholder ?? "Select...";
491
493
  select.append(opt);
492
494
  }
493
495
  select.value = "";
494
496
  emitChange();
495
497
  }
496
498
  function setOptions(optionsArr, keepPlaceholder = true) {
497
- const placeholderText = select.querySelector('option[value=""]')?.textContent ?? opts.placeholder ?? "Seleziona...";
499
+ const placeholderText = select.querySelector('option[value=""]')?.textContent ?? opts.placeholder ?? "Select...";
498
500
  select.innerHTML = "";
499
501
  if (keepPlaceholder) {
500
502
  const ph = document.createElement("option");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/dom.ts","../src/core.ts"],"sourcesContent":["export { ZSelectCore } from \"./core\";\nexport type { ZSelectCoreOptions, ZSelectInstance } from \"./core\";","export function isTruthyAttr(v: unknown): boolean {\n if (v === true) return true;\n if (v === false || v == null) return false;\n const s = String(v).toLowerCase().trim();\n return s === \"1\" || s === \"true\" || s === \"yes\" || s === \"on\";\n}\n\nexport function uid(prefix = \"zs-\"): string {\n return prefix + Math.random().toString(36).slice(2);\n}","import { uid } from \"./dom\";\n\nexport type ZSelectI18n = {\n placeholder?: string;\n searchPlaceholder?: string;\n clearTitle?: string;\n clearAriaLabel?: string;\n removeChipAriaLabel?: string;\n noResults?: string;\n};\n\nexport type ZSelectCoreOptions = {\n searchable?: boolean;\n placeholder?: string;\n allowClear?: boolean;\n hideSearch?: boolean;\n\n /** Forces the underlying <select> disabled state (HTML native disabled). */\n disabled?: boolean;\n\n /**\n * Prevents user interaction but does NOT disable the underlying <select>,\n * so its value is still submitted in forms.\n */\n readonly?: boolean;\n\n i18n?: ZSelectI18n;\n};\n\nexport type ZSelectInstance = {\n select: HTMLSelectElement;\n\n destroy(): void;\n open(): void;\n close(): void;\n\n setValue(value: string | string[] | null): void;\n getValue(): string | string[];\n\n clearOptions(keepPlaceholder?: boolean): void;\n setOptions(\n options: Array<{ value: string; label: string; disabled?: boolean }>,\n keepPlaceholder?: boolean\n ): void;\n\n addOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt?: boolean\n ): void;\n removeOption(value: string): void;\n updateOption(value: string, patch: { label?: string; disabled?: boolean }): void;\n upsertOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt?: boolean\n ): void;\n\n refresh(): void;\n setLoading(isLoading: boolean): void;\n\n setDisabled(isDisabled: boolean): void;\n setReadonly(isReadonly: boolean): void;\n isDisabled(): boolean;\n isReadonly(): boolean;\n};\n\nconst instances = new WeakMap<HTMLSelectElement, ZSelectInstance>();\n\nfunction dispatch(select: HTMLSelectElement, name: string, detail?: any) {\n select.dispatchEvent(new CustomEvent(name, { bubbles: true, detail }));\n}\n\nfunction getSelected(select: HTMLSelectElement): string | string[] {\n if (select.multiple) return Array.from(select.selectedOptions).map(o => o.value);\n return select.value;\n}\n\nfunction setSelected(select: HTMLSelectElement, value: string | string[] | null) {\n if (select.multiple) {\n const arr = Array.isArray(value)\n ? value.map(String)\n : value == null\n ? []\n : [String(value)];\n\n Array.from(select.options).forEach(o => (o.selected = arr.includes(o.value)));\n } else {\n select.value = value == null ? \"\" : String(value);\n }\n\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n}\n\nexport const ZSelectCore = {\n create(select: HTMLSelectElement, options: ZSelectCoreOptions = {}): ZSelectInstance {\n const existing = instances.get(select);\n if (existing) return existing;\n\n const opts: {\n searchable: boolean;\n placeholder: string;\n allowClear: boolean;\n hideSearch: boolean;\n } = {\n searchable: options.searchable ?? true,\n placeholder: options.placeholder ?? \"\",\n allowClear: options.allowClear ?? true,\n hideSearch: options.hideSearch ?? false,\n };\n\n function readBoolAttr(name: string): boolean | null {\n const v = select.getAttribute(name);\n if (v == null) return null;\n if (v === \"\" || v === \"true\" || v === \"1\") return true;\n if (v === \"false\" || v === \"0\") return false;\n return null;\n }\n\n const aAllowClear = readBoolAttr(\"data-allow-clear\");\n if (aAllowClear != null) opts.allowClear = aAllowClear;\n\n const aHideSearch = readBoolAttr(\"data-hide-search\");\n if (aHideSearch != null) opts.hideSearch = aHideSearch;\n\n const aSearchable = readBoolAttr(\"data-searchable\");\n if (aSearchable != null) opts.searchable = aSearchable;\n\n // --- UI scaffold\n const root = document.createElement(\"div\");\n root.className = \"zselect\";\n root.setAttribute(\"data-zselect-core\", \"1\");\n\n const control = document.createElement(\"button\");\n control.type = \"button\";\n control.className = \"zselect__control\";\n control.setAttribute(\"aria-haspopup\", \"listbox\");\n control.setAttribute(\"aria-expanded\", \"false\");\n\n const ds = {\n placeholder: select.getAttribute(\"data-zselect-placeholder\"),\n searchPlaceholder: select.getAttribute(\"data-zselect-search-placeholder\"),\n clearTitle: select.getAttribute(\"data-zselect-clear-title\"),\n clearAriaLabel: select.getAttribute(\"data-zselect-clear-aria-label\"),\n removeChipAriaLabel: select.getAttribute(\"data-zselect-remove-chip-aria-label\"),\n noResults: select.getAttribute(\"data-zselect-no-results\"),\n };\n\n const t = {\n placeholder:\n options.i18n?.placeholder ??\n ds.placeholder ??\n options.placeholder ??\n \"\",\n\n searchPlaceholder:\n options.i18n?.searchPlaceholder ??\n ds.searchPlaceholder ??\n \"Cerca...\",\n\n clearTitle:\n options.i18n?.clearTitle ??\n ds.clearTitle ??\n \"Pulisci\",\n\n clearAriaLabel:\n options.i18n?.clearAriaLabel ??\n ds.clearAriaLabel ??\n \"Pulisci selezione\",\n\n removeChipAriaLabel:\n options.i18n?.removeChipAriaLabel ??\n ds.removeChipAriaLabel ??\n \"Rimuovi\",\n\n noResults:\n options.i18n?.noResults ??\n ds.noResults ??\n \"Nessun risultato\",\n };\n\n const valueWrap = document.createElement(\"span\");\n valueWrap.className = \"zselect__valuewrap\";\n\n const chipsEl = document.createElement(\"span\");\n chipsEl.className = \"zselect__chips\";\n chipsEl.hidden = !select.multiple;\n\n const valueEl = document.createElement(\"span\");\n valueEl.className = \"zselect__value\";\n\n valueWrap.append(chipsEl, valueEl);\n\n const actions = document.createElement(\"span\");\n actions.className = \"zselect__actions\";\n\n const clearEl = document.createElement(\"span\");\n clearEl.className = \"zselect__clear\";\n clearEl.textContent = \"×\";\n clearEl.title = t.clearTitle;\n clearEl.setAttribute(\"aria-hidden\", \"true\");\n clearEl.setAttribute(\"aria-label\", t.clearAriaLabel);\n clearEl.style.display = \"none\";\n\n const arrow = document.createElement(\"span\");\n arrow.className = \"zselect__arrow\";\n arrow.textContent = \"▾\";\n\n actions.append(clearEl, arrow);\n control.append(valueWrap, actions);\n\n const dropdown = document.createElement(\"div\");\n dropdown.className = \"zselect__dropdown\";\n dropdown.hidden = true;\n\n const searchEl = document.createElement(\"input\");\n searchEl.className = \"zselect__search\";\n searchEl.type = \"text\";\n searchEl.autocomplete = \"off\";\n searchEl.placeholder = t.searchPlaceholder;\n searchEl.hidden = opts.hideSearch || !opts.searchable;\n\n const list = document.createElement(\"ul\");\n list.className = \"zselect__list\";\n list.setAttribute(\"role\", \"listbox\");\n\n // accessibility ids\n const listId = `zselect-list-${uid()}`;\n list.id = listId;\n control.setAttribute(\"aria-controls\", listId);\n\n dropdown.append(searchEl, list);\n root.append(control, dropdown);\n\n // hide original select (keep it in DOM for forms)\n const prevStyle = {\n position: select.style.position,\n left: select.style.left,\n width: select.style.width,\n height: select.style.height,\n };\n\n select.style.position = \"absolute\";\n select.style.left = \"-9999px\";\n select.style.width = \"1px\";\n select.style.height = \"1px\";\n\n select.insertAdjacentElement(\"afterend\", root);\n\n let open = false;\n let readonly = !!options.readonly || select.getAttribute(\"data-readonly\") === \"true\";\n const aDisabled = readBoolAttr(\"data-disabled\");\n if (aDisabled != null) select.disabled = !!aDisabled;\n let activeIndex = -1;\n let filterQuery = \"\";\n let hoverArmed = false;\n\n function isDisabled() {\n return select.disabled || select.hasAttribute(\"disabled\");\n }\n\n function isReadonly() {\n return readonly;\n }\n\n function applyStateToUI() {\n const disabledNow = isDisabled();\n const readonlyNow = isReadonly();\n\n root.classList.toggle(\"is-disabled\", disabledNow);\n root.classList.toggle(\"is-readonly\", readonlyNow);\n\n control.disabled = disabledNow || readonlyNow;\n searchEl.disabled = disabledNow || readonlyNow;\n\n control.setAttribute(\"aria-disabled\", disabledNow || readonlyNow ? \"true\" : \"false\");\n\n if ((disabledNow || readonlyNow) && open) close();\n }\n\n function hasValue(): boolean {\n if (select.multiple) return Array.from(select.selectedOptions).some(o => (o.value ?? \"\") !== \"\");\n return (select.value ?? \"\") !== \"\";\n }\n\n function updateClearVisibility() {\n if (!opts.allowClear || isDisabled() || isReadonly()) {\n clearEl.style.display = \"none\";\n return;\n }\n clearEl.style.display = hasValue() ? \"\" : \"none\";\n }\n\n function normalize(s: string) {\n return s.toLowerCase();\n }\n\n function getOptionLabel(opt: HTMLOptionElement) {\n return (opt.textContent ?? \"\").trim();\n }\n\n function allOptions() {\n return Array.from(select.options);\n }\n\n function selectedOptions() {\n return Array.from(select.selectedOptions);\n }\n\n function selectedNonEmpty() {\n return selectedOptions().filter(o => (o.value ?? \"\") !== \"\");\n }\n\n function emitChange() {\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n\n function getFilteredOptions(): HTMLOptionElement[] {\n const q = normalize(filterQuery.trim());\n const all = allOptions();\n if (!q) return all;\n return all.filter(o => normalize(getOptionLabel(o)).includes(q));\n }\n\n function clearValue() {\n if (!opts.allowClear) return;\n if (isReadonly()) return;\n\n if (select.multiple) {\n allOptions().forEach(o => (o.selected = false));\n select.value = \"\";\n } else {\n const hasEmpty = !!select.querySelector('option[value=\"\"]');\n select.value = hasEmpty ? \"\" : (select.options[0]?.value ?? \"\");\n }\n\n emitChange();\n dispatch(select, \"zselect:clear\");\n }\n\n function renderChips() {\n chipsEl.innerHTML = \"\";\n if (!select.multiple) return;\n\n const selected = selectedNonEmpty();\n if (!selected.length) return;\n\n selected.forEach(opt => {\n const chip = document.createElement(\"span\");\n chip.className = \"zselect__chip\";\n chip.dataset.value = opt.value;\n\n const label = document.createElement(\"span\");\n label.className = \"zselect__chip-label\";\n label.textContent = getOptionLabel(opt);\n\n const x = document.createElement(\"button\");\n x.type = \"button\";\n x.className = \"zselect__chip-remove\";\n x.textContent = \"×\";\n x.title = \"Rimuovi\";\n x.setAttribute(\"aria-label\", t.removeChipAriaLabel);\n\n x.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n e.stopPropagation();\n if (isReadonly()) return;\n\n opt.selected = false;\n emitChange();\n });\n\n chip.append(label, x);\n chipsEl.append(chip);\n });\n }\n\n function renderLabel() {\n const selected = selectedOptions();\n\n const isPlaceholder =\n selected.length === 0 ||\n (selected.length === 1 && (selected[0]?.value ?? \"\") === \"\") ||\n (select.multiple && selectedNonEmpty().length === 0);\n\n if (select.multiple) {\n renderChips();\n valueEl.textContent = isPlaceholder ? (t.placeholder || \"Seleziona...\") : \"\";\n valueEl.classList.toggle(\"is-placeholder\", isPlaceholder);\n return;\n }\n\n if (isPlaceholder) {\n valueEl.textContent = t.placeholder || \"Seleziona...\";\n valueEl.classList.add(\"is-placeholder\");\n return;\n }\n\n const first = selected[0];\n valueEl.textContent = (first?.textContent ?? \"\").trim();\n valueEl.classList.remove(\"is-placeholder\");\n }\n\n function getOptionItems(includeDisabled = true) {\n const selector = includeDisabled\n ? \".zselect__option\"\n : \".zselect__option:not(.is-disabled)\";\n return Array.from(list.querySelectorAll<HTMLLIElement>(selector));\n }\n\n function setActiveIndex(items: HTMLLIElement[], idx: number, scroll = true) {\n activeIndex = idx;\n items.forEach((li, i) => li.classList.toggle(\"is-active\", i === activeIndex));\n if (scroll && activeIndex >= 0) items[activeIndex]?.scrollIntoView({ block: \"nearest\" });\n }\n\n function clearActive(items?: HTMLLIElement[]) {\n const all = items ?? getOptionItems();\n activeIndex = -1;\n all.forEach(li => li.classList.remove(\"is-active\"));\n }\n\n function setActiveByValue(val: string) {\n const items = getOptionItems();\n const idx = items.findIndex(li => (li.dataset.value ?? \"\") === val);\n setActiveIndex(items, idx, true);\n }\n\n function renderList() {\n const filtered = getFilteredOptions().filter(opt => (opt.value ?? \"\") !== \"\");\n\n list.innerHTML = \"\";\n\n const selectedValues = new Set(selectedOptions().map(o => o.value));\n\n if (!filtered.length) {\n const empty = document.createElement(\"li\");\n empty.className = \"zselect__empty\";\n empty.textContent = t.noResults;\n list.append(empty);\n activeIndex = -1;\n return;\n }\n\n filtered.forEach((opt, idx) => {\n const li = document.createElement(\"li\");\n li.className = \"zselect__option\";\n li.setAttribute(\"role\", \"option\");\n li.dataset.value = opt.value;\n\n const labelText = getOptionLabel(opt);\n const labelEl = document.createElement(\"span\");\n labelEl.className = \"zselect__option-label\";\n labelEl.textContent = labelText;\n\n const checkEl = document.createElement(\"span\");\n checkEl.className = \"zselect__option-check\";\n checkEl.setAttribute(\"aria-hidden\", \"true\");\n checkEl.textContent = \"✓\";\n\n // Only show the check indicator when the option is selected.\n const isSelected = selectedValues.has(opt.value);\n checkEl.hidden = !isSelected;\n\n li.append(labelEl, checkEl);\n\n if (opt.disabled) li.classList.add(\"is-disabled\");\n\n if (isSelected) {\n li.classList.add(\"is-selected\");\n li.setAttribute(\"aria-selected\", \"true\");\n } else {\n li.setAttribute(\"aria-selected\", \"false\");\n }\n\n li.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n if (opt.disabled) return;\n if (isReadonly()) return;\n\n if (select.multiple) {\n opt.selected = !opt.selected;\n emitChange();\n renderList();\n if (!searchEl.hidden) searchEl.focus();\n } else {\n select.value = opt.value;\n emitChange();\n close();\n control.focus();\n }\n });\n\n li.addEventListener(\"mouseenter\", () => {\n if (!hoverArmed) return;\n if (opt.disabled) return;\n const all = getOptionItems();\n setActiveIndex(all, idx, false);\n });\n\n list.append(li);\n });\n\n // Never auto-activate on open. Only allow hover or keyboard to set active.\n clearActive();\n }\n\n function refresh() {\n renderLabel();\n updateClearVisibility();\n if (open) renderList();\n }\n\n function openDropdown() {\n if (open || isDisabled() || isReadonly()) return;\n\n open = true;\n dropdown.hidden = false;\n control.setAttribute(\"aria-expanded\", \"true\");\n root.classList.add(\"is-open\");\n\n filterQuery = \"\";\n // Prevent immediate activation of the first option just because the dropdown\n // appears under the current mouse cursor position. We only activate on real\n // pointer movement inside the dropdown.\n hoverArmed = false;\n dropdown.addEventListener(\n \"mousemove\",\n () => {\n hoverArmed = true;\n },\n { once: true }\n );\n if (!searchEl.hidden) {\n searchEl.value = \"\";\n renderList();\n queueMicrotask(() => searchEl.focus());\n } else {\n renderList();\n }\n\n dispatch(select, \"zselect:open\");\n }\n\n function close() {\n if (!open) return;\n\n open = false;\n hoverArmed = false;\n dropdown.hidden = true;\n control.setAttribute(\"aria-expanded\", \"false\");\n root.classList.remove(\"is-open\");\n dispatch(select, \"zselect:close\");\n }\n\n function toggle() {\n open ? close() : openDropdown();\n }\n\n function moveActive(delta: number) {\n const items = getOptionItems(false);\n if (!items.length) return;\n\n let i = activeIndex;\n if (i < 0) i = -1;\n i = Math.min(Math.max(i + delta, 0), items.length - 1);\n setActiveIndex(items, i, true);\n }\n\n function selectActive() {\n if (isReadonly()) return;\n\n const items = getOptionItems(false);\n if (!items.length) return;\n\n const li = items[Math.max(0, Math.min(activeIndex, items.length - 1))];\n if (!li) return;\n\n const val = li.dataset.value ?? \"\";\n const opt = Array.from(select.options).find(o => o.value === val);\n if (!opt || opt.disabled) return;\n\n if (select.multiple) {\n opt.selected = !opt.selected;\n emitChange();\n renderList();\n if (!searchEl.hidden) searchEl.focus();\n } else {\n select.value = opt.value;\n emitChange();\n close();\n control.focus();\n }\n }\n\n function onKeydown(e: KeyboardEvent) {\n if (isDisabled() || isReadonly()) return;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) openDropdown();\n moveActive(+1);\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!open) openDropdown();\n moveActive(-1);\n return;\n }\n if (e.key === \"Enter\") {\n if (!open) return;\n e.preventDefault();\n selectActive();\n return;\n }\n if (e.key === \"Escape\") {\n if (!open) return;\n e.preventDefault();\n close();\n control.focus();\n return;\n }\n if (e.key === \"Tab\") {\n if (open) close();\n return;\n }\n\n if (select.multiple && e.key === \"Backspace\") {\n const searchEmpty = searchEl.hidden || searchEl.value.trim() === \"\";\n if (searchEmpty) {\n const selected = selectedNonEmpty();\n const last = selected[selected.length - 1];\n if (last) {\n last.selected = false;\n emitChange();\n renderList();\n }\n }\n }\n }\n\n const onDocDown = (e: MouseEvent) => {\n if (!root.contains(e.target as Node)) close();\n };\n\n document.addEventListener(\"mousedown\", onDocDown);\n\n control.addEventListener(\"click\", () => toggle());\n control.addEventListener(\"keydown\", onKeydown);\n searchEl.addEventListener(\"keydown\", onKeydown);\n\n searchEl.addEventListener(\"input\", () => {\n filterQuery = searchEl.value ?? \"\";\n renderList();\n dispatch(select, \"zselect:search\", { q: filterQuery });\n });\n\n clearEl.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n e.stopPropagation();\n clearValue();\n if (open) renderList();\n if (!searchEl.hidden) searchEl.focus();\n });\n\n select.addEventListener(\"change\", () => {\n renderLabel();\n updateClearVisibility();\n if (open) renderList();\n dispatch(select, \"zselect:change\", { value: getSelected(select) });\n });\n\n function clearOptions(keepPlaceholder = true) {\n const placeholderOpt = select.querySelector('option[value=\"\"]') as HTMLOptionElement | null;\n\n select.innerHTML = \"\";\n\n if (keepPlaceholder) {\n const opt = document.createElement(\"option\");\n opt.value = \"\";\n opt.textContent = placeholderOpt?.textContent ?? opts.placeholder ?? \"Seleziona...\";\n select.append(opt);\n }\n\n select.value = \"\";\n emitChange();\n }\n\n function setOptions(\n optionsArr: Array<{ value: string; label: string; disabled?: boolean }>,\n keepPlaceholder = true\n ) {\n const placeholderText =\n (select.querySelector('option[value=\"\"]') as HTMLOptionElement | null)?.textContent ??\n opts.placeholder ??\n \"Seleziona...\";\n\n select.innerHTML = \"\";\n\n if (keepPlaceholder) {\n const ph = document.createElement(\"option\");\n ph.value = \"\";\n ph.textContent = placeholderText;\n select.append(ph);\n }\n\n optionsArr.forEach(o => {\n const opt = document.createElement(\"option\");\n opt.value = String(o.value);\n opt.textContent = o.label;\n if (o.disabled) opt.disabled = true;\n select.append(opt);\n });\n\n select.value = \"\";\n emitChange();\n }\n\n function setLoading(isLoading: boolean) {\n root.classList.toggle(\"is-loading\", !!isLoading);\n\n if (isLoading) {\n control.disabled = true;\n searchEl.disabled = true;\n return;\n }\n\n applyStateToUI();\n }\n\n function findOptionEl(value: string) {\n const v = String(value);\n return Array.from(select.options).find(o => o.value === v) ?? null;\n }\n\n function addOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt = false\n ) {\n const value = String(option.value);\n if (findOptionEl(value)) return;\n\n const opt = document.createElement(\"option\");\n opt.value = value;\n opt.textContent = option.label;\n if (option.disabled) opt.disabled = true;\n\n select.append(opt);\n\n if (selectIt) {\n if (select.multiple) opt.selected = true;\n else select.value = value;\n emitChange();\n } else {\n refresh();\n }\n }\n\n function removeOption(value: string) {\n const opt = findOptionEl(value);\n if (!opt) return;\n\n const wasSelected = opt.selected;\n opt.remove();\n\n if (wasSelected) {\n emitChange();\n } else {\n refresh();\n }\n }\n\n function updateOption(value: string, patch: { label?: string; disabled?: boolean }) {\n const opt = findOptionEl(value);\n if (!opt) return;\n\n if (patch.label !== undefined) opt.textContent = patch.label;\n if (patch.disabled !== undefined) opt.disabled = !!patch.disabled;\n\n refresh();\n }\n\n function upsertOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt = false\n ) {\n const value = String(option.value);\n const opt = findOptionEl(value);\n\n if (!opt) {\n addOption(option, selectIt);\n return;\n }\n\n opt.textContent = option.label;\n opt.disabled = !!option.disabled;\n\n if (selectIt) {\n if (select.multiple) opt.selected = true;\n else select.value = value;\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n } else {\n refresh();\n }\n }\n\n // initial render\n renderLabel();\n updateClearVisibility();\n\n // apply initial disabled if provided\n if (options.disabled != null) select.disabled = !!options.disabled;\n\n applyStateToUI();\n\n const inst: ZSelectInstance = {\n select,\n\n destroy() {\n document.removeEventListener(\"mousedown\", onDocDown);\n root.remove();\n\n // restore select styles\n select.style.position = prevStyle.position;\n select.style.left = prevStyle.left;\n select.style.width = prevStyle.width;\n select.style.height = prevStyle.height;\n\n instances.delete(select);\n },\n\n open: openDropdown,\n close,\n\n setValue(value: string | string[] | null) {\n setSelected(select, value);\n },\n getValue() {\n return getSelected(select);\n },\n\n clearOptions,\n setOptions,\n addOption,\n removeOption,\n updateOption,\n upsertOption,\n\n refresh,\n setLoading,\n\n setDisabled(v: boolean) {\n select.disabled = !!v;\n applyStateToUI();\n },\n setReadonly(v: boolean) {\n readonly = !!v;\n applyStateToUI();\n },\n isDisabled,\n isReadonly,\n };\n\n instances.set(select, inst);\n return inst;\n },\n\n get(select: HTMLSelectElement): ZSelectInstance | null {\n return instances.get(select) ?? null;\n },\n\n destroy(select: HTMLSelectElement): void {\n const inst = instances.get(select);\n if (inst) inst.destroy();\n },\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/dom.ts","../src/core.ts"],"sourcesContent":["export { Selectamelo } from \"./core\";\nexport type { SelectameloOptions, SelectameloInstance } from \"./core\";\n","export function isTruthyAttr(v: unknown): boolean {\n if (v === true) return true;\n if (v === false || v == null) return false;\n const s = String(v).toLowerCase().trim();\n return s === \"1\" || s === \"true\" || s === \"yes\" || s === \"on\";\n}\n\nexport function uid(prefix = \"zs-\"): string {\n return prefix + Math.random().toString(36).slice(2);\n}","import { uid } from \"./dom\";\n\nexport type SelectameloI18n = {\n placeholder?: string;\n searchPlaceholder?: string;\n clearTitle?: string;\n clearAriaLabel?: string;\n removeChipAriaLabel?: string;\n noResults?: string;\n};\n\nexport type SelectameloOptions = {\n searchable?: boolean;\n placeholder?: string;\n allowClear?: boolean;\n hideSearch?: boolean;\n\n /** Forces the underlying <select> disabled state (HTML native disabled). */\n disabled?: boolean;\n\n /**\n * Prevents user interaction but does NOT disable the underlying <select>,\n * so its value is still submitted in forms.\n */\n readonly?: boolean;\n\n i18n?: SelectameloI18n;\n};\n\nexport type SelectameloInstance = {\n select: HTMLSelectElement;\n\n destroy(): void;\n open(): void;\n close(): void;\n\n setValue(value: string | string[] | null): void;\n getValue(): string | string[];\n\n clearOptions(keepPlaceholder?: boolean): void;\n setOptions(\n options: Array<{ value: string; label: string; disabled?: boolean }>,\n keepPlaceholder?: boolean\n ): void;\n\n addOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt?: boolean\n ): void;\n removeOption(value: string): void;\n updateOption(value: string, patch: { label?: string; disabled?: boolean }): void;\n upsertOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt?: boolean\n ): void;\n\n refresh(): void;\n setLoading(isLoading: boolean): void;\n\n setDisabled(isDisabled: boolean): void;\n setReadonly(isReadonly: boolean): void;\n isDisabled(): boolean;\n isReadonly(): boolean;\n};\n\nconst instances = new WeakMap<HTMLSelectElement, SelectameloInstance>();\nconst ICON_ANGLE_DOWN =\n '<svg class=\"zselect__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M6 9l6 6 6-6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\nconst ICON_X =\n '<svg class=\"zselect__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M6 6l12 12M18 6l-12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>';\n\nfunction dispatch(select: HTMLSelectElement, name: string, detail?: any) {\n select.dispatchEvent(new CustomEvent(name, { bubbles: true, detail }));\n}\n\nfunction getSelected(select: HTMLSelectElement): string | string[] {\n if (select.multiple) return Array.from(select.selectedOptions).map(o => o.value);\n return select.value;\n}\n\nfunction setSelected(select: HTMLSelectElement, value: string | string[] | null) {\n if (select.multiple) {\n const arr = Array.isArray(value)\n ? value.map(String)\n : value == null\n ? []\n : [String(value)];\n\n Array.from(select.options).forEach(o => (o.selected = arr.includes(o.value)));\n } else {\n select.value = value == null ? \"\" : String(value);\n }\n\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n}\n\nexport const Selectamelo = {\n create(select: HTMLSelectElement, options: SelectameloOptions = {}): SelectameloInstance {\n const existing = instances.get(select);\n if (existing) return existing;\n\n const opts: {\n searchable: boolean;\n placeholder: string;\n allowClear: boolean;\n hideSearch: boolean;\n } = {\n searchable: options.searchable ?? true,\n placeholder: options.placeholder ?? \"\",\n allowClear: options.allowClear ?? true,\n hideSearch: options.hideSearch ?? false,\n };\n\n function readBoolAttr(name: string): boolean | null {\n const v = select.getAttribute(name);\n if (v == null) return null;\n if (v === \"\" || v === \"true\" || v === \"1\") return true;\n if (v === \"false\" || v === \"0\") return false;\n return null;\n }\n\n const aAllowClear = readBoolAttr(\"data-allow-clear\");\n if (aAllowClear != null) opts.allowClear = aAllowClear;\n\n const aHideSearch = readBoolAttr(\"data-hide-search\");\n if (aHideSearch != null) opts.hideSearch = aHideSearch;\n\n const aSearchable = readBoolAttr(\"data-searchable\");\n if (aSearchable != null) opts.searchable = aSearchable;\n\n // --- UI scaffold\n const root = document.createElement(\"div\");\n root.className = \"zselect\";\n root.setAttribute(\"data-selectamelo-core\", \"1\");\n\n const control = document.createElement(\"button\");\n control.type = \"button\";\n control.className = \"zselect__control\";\n control.setAttribute(\"aria-haspopup\", \"listbox\");\n control.setAttribute(\"aria-expanded\", \"false\");\n\n const ds = {\n placeholder: select.getAttribute(\"data-selectamelo-placeholder\"),\n searchPlaceholder: select.getAttribute(\"data-selectamelo-search-placeholder\"),\n clearTitle: select.getAttribute(\"data-selectamelo-clear-title\"),\n clearAriaLabel: select.getAttribute(\"data-selectamelo-clear-aria-label\"),\n removeChipAriaLabel: select.getAttribute(\"data-selectamelo-remove-chip-aria-label\"),\n noResults: select.getAttribute(\"data-selectamelo-no-results\"),\n };\n\n const t = {\n placeholder:\n options.i18n?.placeholder ??\n ds.placeholder ??\n options.placeholder ??\n \"\",\n\n searchPlaceholder:\n options.i18n?.searchPlaceholder ??\n ds.searchPlaceholder ??\n \"Search...\",\n\n clearTitle:\n options.i18n?.clearTitle ??\n ds.clearTitle ??\n \"Clear\",\n\n clearAriaLabel:\n options.i18n?.clearAriaLabel ??\n ds.clearAriaLabel ??\n \"Clear selection\",\n\n removeChipAriaLabel:\n options.i18n?.removeChipAriaLabel ??\n ds.removeChipAriaLabel ??\n \"Remove\",\n\n noResults:\n options.i18n?.noResults ??\n ds.noResults ??\n \"No results\",\n };\n\n const valueWrap = document.createElement(\"span\");\n valueWrap.className = \"zselect__valuewrap\";\n\n const chipsEl = document.createElement(\"span\");\n chipsEl.className = \"zselect__chips\";\n chipsEl.hidden = !select.multiple;\n\n const valueEl = document.createElement(\"span\");\n valueEl.className = \"zselect__value\";\n\n valueWrap.append(chipsEl, valueEl);\n\n const actions = document.createElement(\"span\");\n actions.className = \"zselect__actions\";\n\n const clearEl = document.createElement(\"span\");\n clearEl.className = \"zselect__clear\";\n clearEl.innerHTML = ICON_X;\n clearEl.title = t.clearTitle;\n clearEl.setAttribute(\"aria-hidden\", \"true\");\n clearEl.setAttribute(\"aria-label\", t.clearAriaLabel);\n clearEl.style.display = \"none\";\n\n const arrow = document.createElement(\"span\");\n arrow.className = \"zselect__arrow\";\n arrow.innerHTML = ICON_ANGLE_DOWN;\n\n actions.append(clearEl, arrow);\n control.append(valueWrap, actions);\n\n const dropdown = document.createElement(\"div\");\n dropdown.className = \"zselect__dropdown\";\n dropdown.hidden = true;\n\n const searchEl = document.createElement(\"input\");\n searchEl.className = \"zselect__search\";\n searchEl.type = \"text\";\n searchEl.autocomplete = \"off\";\n searchEl.placeholder = t.searchPlaceholder;\n searchEl.hidden = opts.hideSearch || !opts.searchable;\n\n const list = document.createElement(\"ul\");\n list.className = \"zselect__list\";\n list.setAttribute(\"role\", \"listbox\");\n\n // accessibility ids\n const listId = `zselect-list-${uid()}`;\n list.id = listId;\n control.setAttribute(\"aria-controls\", listId);\n\n dropdown.append(searchEl, list);\n root.append(control, dropdown);\n\n // hide original select (keep it in DOM for forms)\n const prevStyle = {\n position: select.style.position,\n left: select.style.left,\n width: select.style.width,\n height: select.style.height,\n };\n\n select.style.position = \"absolute\";\n select.style.left = \"-9999px\";\n select.style.width = \"1px\";\n select.style.height = \"1px\";\n\n select.insertAdjacentElement(\"afterend\", root);\n\n let open = false;\n let readonly = !!options.readonly || select.getAttribute(\"data-readonly\") === \"true\";\n const aDisabled = readBoolAttr(\"data-disabled\");\n if (aDisabled != null) select.disabled = !!aDisabled;\n let activeIndex = -1;\n let filterQuery = \"\";\n let hoverArmed = false;\n\n function isDisabled() {\n return select.disabled || select.hasAttribute(\"disabled\");\n }\n\n function isReadonly() {\n return readonly;\n }\n\n function applyStateToUI() {\n const disabledNow = isDisabled();\n const readonlyNow = isReadonly();\n\n root.classList.toggle(\"is-disabled\", disabledNow);\n root.classList.toggle(\"is-readonly\", readonlyNow);\n\n control.disabled = disabledNow || readonlyNow;\n searchEl.disabled = disabledNow || readonlyNow;\n\n control.setAttribute(\"aria-disabled\", disabledNow || readonlyNow ? \"true\" : \"false\");\n\n if ((disabledNow || readonlyNow) && open) close();\n }\n\n function hasValue(): boolean {\n if (select.multiple) return Array.from(select.selectedOptions).some(o => (o.value ?? \"\") !== \"\");\n return (select.value ?? \"\") !== \"\";\n }\n\n function updateClearVisibility() {\n if (!opts.allowClear || isDisabled() || isReadonly()) {\n clearEl.style.display = \"none\";\n return;\n }\n clearEl.style.display = hasValue() ? \"\" : \"none\";\n }\n\n function normalize(s: string) {\n return s.toLowerCase();\n }\n\n function getOptionLabel(opt: HTMLOptionElement) {\n return (opt.textContent ?? \"\").trim();\n }\n\n function allOptions() {\n return Array.from(select.options);\n }\n\n function selectedOptions() {\n return Array.from(select.selectedOptions);\n }\n\n function selectedNonEmpty() {\n return selectedOptions().filter(o => (o.value ?? \"\") !== \"\");\n }\n\n function emitChange() {\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n\n function getFilteredOptions(): HTMLOptionElement[] {\n const q = normalize(filterQuery.trim());\n const all = allOptions();\n if (!q) return all;\n return all.filter(o => normalize(getOptionLabel(o)).includes(q));\n }\n\n function clearValue() {\n if (!opts.allowClear) return;\n if (isReadonly()) return;\n\n if (select.multiple) {\n allOptions().forEach(o => (o.selected = false));\n select.value = \"\";\n } else {\n const hasEmpty = !!select.querySelector('option[value=\"\"]');\n select.value = hasEmpty ? \"\" : (select.options[0]?.value ?? \"\");\n }\n\n emitChange();\n dispatch(select, \"zselect:clear\");\n }\n\n function renderChips() {\n chipsEl.innerHTML = \"\";\n if (!select.multiple) return;\n\n const selected = selectedNonEmpty();\n if (!selected.length) return;\n\n selected.forEach(opt => {\n const chip = document.createElement(\"span\");\n chip.className = \"zselect__chip\";\n chip.dataset.value = opt.value;\n\n const label = document.createElement(\"span\");\n label.className = \"zselect__chip-label\";\n label.textContent = getOptionLabel(opt);\n\n const x = document.createElement(\"button\");\n x.type = \"button\";\n x.className = \"zselect__chip-remove\";\n x.innerHTML = ICON_X;\n x.title = \"Remove\";\n x.setAttribute(\"aria-label\", t.removeChipAriaLabel);\n\n x.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n e.stopPropagation();\n if (isReadonly()) return;\n\n opt.selected = false;\n emitChange();\n });\n\n chip.append(label, x);\n chipsEl.append(chip);\n });\n }\n\n function renderLabel() {\n const selected = selectedOptions();\n\n const isPlaceholder =\n selected.length === 0 ||\n (selected.length === 1 && (selected[0]?.value ?? \"\") === \"\") ||\n (select.multiple && selectedNonEmpty().length === 0);\n\n if (select.multiple) {\n renderChips();\n valueEl.textContent = isPlaceholder ? (t.placeholder || \"Select...\") : \"\";\n valueEl.classList.toggle(\"is-placeholder\", isPlaceholder);\n return;\n }\n\n if (isPlaceholder) {\n valueEl.textContent = t.placeholder || \"Select...\";\n valueEl.classList.add(\"is-placeholder\");\n return;\n }\n\n const first = selected[0];\n valueEl.textContent = (first?.textContent ?? \"\").trim();\n valueEl.classList.remove(\"is-placeholder\");\n }\n\n function getOptionItems(includeDisabled = true) {\n const selector = includeDisabled\n ? \".zselect__option\"\n : \".zselect__option:not(.is-disabled)\";\n return Array.from(list.querySelectorAll<HTMLLIElement>(selector));\n }\n\n function setActiveIndex(items: HTMLLIElement[], idx: number, scroll = true) {\n activeIndex = idx;\n items.forEach((li, i) => li.classList.toggle(\"is-active\", i === activeIndex));\n if (scroll && activeIndex >= 0) items[activeIndex]?.scrollIntoView({ block: \"nearest\" });\n }\n\n function clearActive(items?: HTMLLIElement[]) {\n const all = items ?? getOptionItems();\n activeIndex = -1;\n all.forEach(li => li.classList.remove(\"is-active\"));\n }\n\n function setActiveByValue(val: string) {\n const items = getOptionItems();\n const idx = items.findIndex(li => (li.dataset.value ?? \"\") === val);\n setActiveIndex(items, idx, true);\n }\n\n function renderList() {\n const filtered = getFilteredOptions().filter(opt => (opt.value ?? \"\") !== \"\");\n\n list.innerHTML = \"\";\n\n const selectedValues = new Set(selectedOptions().map(o => o.value));\n\n if (!filtered.length) {\n const empty = document.createElement(\"li\");\n empty.className = \"zselect__empty\";\n empty.textContent = t.noResults;\n list.append(empty);\n activeIndex = -1;\n return;\n }\n\n filtered.forEach((opt, idx) => {\n const li = document.createElement(\"li\");\n li.className = \"zselect__option\";\n li.setAttribute(\"role\", \"option\");\n li.dataset.value = opt.value;\n\n const labelText = getOptionLabel(opt);\n const labelEl = document.createElement(\"span\");\n labelEl.className = \"zselect__option-label\";\n labelEl.textContent = labelText;\n\n const checkEl = document.createElement(\"span\");\n checkEl.className = \"zselect__option-check\";\n checkEl.setAttribute(\"aria-hidden\", \"true\");\n checkEl.textContent = \"✓\";\n\n // Only show the check indicator when the option is selected.\n const isSelected = selectedValues.has(opt.value);\n checkEl.hidden = !isSelected;\n\n li.append(labelEl, checkEl);\n\n if (opt.disabled) li.classList.add(\"is-disabled\");\n\n if (isSelected) {\n li.classList.add(\"is-selected\");\n li.setAttribute(\"aria-selected\", \"true\");\n } else {\n li.setAttribute(\"aria-selected\", \"false\");\n }\n\n li.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n if (opt.disabled) return;\n if (isReadonly()) return;\n\n if (select.multiple) {\n opt.selected = !opt.selected;\n emitChange();\n renderList();\n if (!searchEl.hidden) searchEl.focus();\n } else {\n select.value = opt.value;\n emitChange();\n close();\n control.focus();\n }\n });\n\n li.addEventListener(\"mouseenter\", () => {\n if (!hoverArmed) return;\n if (opt.disabled) return;\n const all = getOptionItems();\n setActiveIndex(all, idx, false);\n });\n\n list.append(li);\n });\n\n // Never auto-activate on open. Only allow hover or keyboard to set active.\n clearActive();\n }\n\n function refresh() {\n renderLabel();\n updateClearVisibility();\n if (open) renderList();\n }\n\n function openDropdown() {\n if (open || isDisabled() || isReadonly()) return;\n\n open = true;\n dropdown.hidden = false;\n control.setAttribute(\"aria-expanded\", \"true\");\n root.classList.add(\"is-open\");\n\n filterQuery = \"\";\n // Prevent immediate activation of the first option just because the dropdown\n // appears under the current mouse cursor position. We only activate on real\n // pointer movement inside the dropdown.\n hoverArmed = false;\n dropdown.addEventListener(\n \"mousemove\",\n () => {\n hoverArmed = true;\n },\n { once: true }\n );\n if (!searchEl.hidden) {\n searchEl.value = \"\";\n renderList();\n queueMicrotask(() => searchEl.focus());\n } else {\n renderList();\n }\n\n dispatch(select, \"zselect:open\");\n }\n\n function close() {\n if (!open) return;\n\n open = false;\n hoverArmed = false;\n dropdown.hidden = true;\n control.setAttribute(\"aria-expanded\", \"false\");\n root.classList.remove(\"is-open\");\n dispatch(select, \"zselect:close\");\n }\n\n function toggle() {\n open ? close() : openDropdown();\n }\n\n function moveActive(delta: number) {\n const items = getOptionItems(false);\n if (!items.length) return;\n\n let i = activeIndex;\n if (i < 0) i = -1;\n i = Math.min(Math.max(i + delta, 0), items.length - 1);\n setActiveIndex(items, i, true);\n }\n\n function selectActive() {\n if (isReadonly()) return;\n\n const items = getOptionItems(false);\n if (!items.length) return;\n\n const li = items[Math.max(0, Math.min(activeIndex, items.length - 1))];\n if (!li) return;\n\n const val = li.dataset.value ?? \"\";\n const opt = Array.from(select.options).find(o => o.value === val);\n if (!opt || opt.disabled) return;\n\n if (select.multiple) {\n opt.selected = !opt.selected;\n emitChange();\n renderList();\n if (!searchEl.hidden) searchEl.focus();\n } else {\n select.value = opt.value;\n emitChange();\n close();\n control.focus();\n }\n }\n\n function onKeydown(e: KeyboardEvent) {\n if (isDisabled() || isReadonly()) return;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) openDropdown();\n moveActive(+1);\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!open) openDropdown();\n moveActive(-1);\n return;\n }\n if (e.key === \"Enter\") {\n if (!open) return;\n e.preventDefault();\n selectActive();\n return;\n }\n if (e.key === \"Escape\") {\n if (!open) return;\n e.preventDefault();\n close();\n control.focus();\n return;\n }\n if (e.key === \"Tab\") {\n if (open) close();\n return;\n }\n\n if (select.multiple && e.key === \"Backspace\") {\n const searchEmpty = searchEl.hidden || searchEl.value.trim() === \"\";\n if (searchEmpty) {\n const selected = selectedNonEmpty();\n const last = selected[selected.length - 1];\n if (last) {\n last.selected = false;\n emitChange();\n renderList();\n }\n }\n }\n }\n\n const onDocDown = (e: MouseEvent) => {\n if (!root.contains(e.target as Node)) close();\n };\n\n document.addEventListener(\"mousedown\", onDocDown);\n\n control.addEventListener(\"click\", () => toggle());\n control.addEventListener(\"keydown\", onKeydown);\n searchEl.addEventListener(\"keydown\", onKeydown);\n\n searchEl.addEventListener(\"input\", () => {\n filterQuery = searchEl.value ?? \"\";\n renderList();\n dispatch(select, \"zselect:search\", { q: filterQuery });\n });\n\n clearEl.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n e.stopPropagation();\n clearValue();\n if (open) renderList();\n if (!searchEl.hidden) searchEl.focus();\n });\n\n select.addEventListener(\"change\", () => {\n renderLabel();\n updateClearVisibility();\n if (open) renderList();\n dispatch(select, \"zselect:change\", { value: getSelected(select) });\n });\n\n function clearOptions(keepPlaceholder = true) {\n const placeholderOpt = select.querySelector('option[value=\"\"]') as HTMLOptionElement | null;\n\n select.innerHTML = \"\";\n\n if (keepPlaceholder) {\n const opt = document.createElement(\"option\");\n opt.value = \"\";\n opt.textContent = placeholderOpt?.textContent ?? opts.placeholder ?? \"Select...\";\n select.append(opt);\n }\n\n select.value = \"\";\n emitChange();\n }\n\n function setOptions(\n optionsArr: Array<{ value: string; label: string; disabled?: boolean }>,\n keepPlaceholder = true\n ) {\n const placeholderText =\n (select.querySelector('option[value=\"\"]') as HTMLOptionElement | null)?.textContent ??\n opts.placeholder ??\n \"Select...\";\n\n select.innerHTML = \"\";\n\n if (keepPlaceholder) {\n const ph = document.createElement(\"option\");\n ph.value = \"\";\n ph.textContent = placeholderText;\n select.append(ph);\n }\n\n optionsArr.forEach(o => {\n const opt = document.createElement(\"option\");\n opt.value = String(o.value);\n opt.textContent = o.label;\n if (o.disabled) opt.disabled = true;\n select.append(opt);\n });\n\n select.value = \"\";\n emitChange();\n }\n\n function setLoading(isLoading: boolean) {\n root.classList.toggle(\"is-loading\", !!isLoading);\n\n if (isLoading) {\n control.disabled = true;\n searchEl.disabled = true;\n return;\n }\n\n applyStateToUI();\n }\n\n function findOptionEl(value: string) {\n const v = String(value);\n return Array.from(select.options).find(o => o.value === v) ?? null;\n }\n\n function addOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt = false\n ) {\n const value = String(option.value);\n if (findOptionEl(value)) return;\n\n const opt = document.createElement(\"option\");\n opt.value = value;\n opt.textContent = option.label;\n if (option.disabled) opt.disabled = true;\n\n select.append(opt);\n\n if (selectIt) {\n if (select.multiple) opt.selected = true;\n else select.value = value;\n emitChange();\n } else {\n refresh();\n }\n }\n\n function removeOption(value: string) {\n const opt = findOptionEl(value);\n if (!opt) return;\n\n const wasSelected = opt.selected;\n opt.remove();\n\n if (wasSelected) {\n emitChange();\n } else {\n refresh();\n }\n }\n\n function updateOption(value: string, patch: { label?: string; disabled?: boolean }) {\n const opt = findOptionEl(value);\n if (!opt) return;\n\n if (patch.label !== undefined) opt.textContent = patch.label;\n if (patch.disabled !== undefined) opt.disabled = !!patch.disabled;\n\n refresh();\n }\n\n function upsertOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt = false\n ) {\n const value = String(option.value);\n const opt = findOptionEl(value);\n\n if (!opt) {\n addOption(option, selectIt);\n return;\n }\n\n opt.textContent = option.label;\n opt.disabled = !!option.disabled;\n\n if (selectIt) {\n if (select.multiple) opt.selected = true;\n else select.value = value;\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n } else {\n refresh();\n }\n }\n\n // initial render\n renderLabel();\n updateClearVisibility();\n\n // apply initial disabled if provided\n if (options.disabled != null) select.disabled = !!options.disabled;\n\n applyStateToUI();\n\n const inst: SelectameloInstance = {\n select,\n\n destroy() {\n document.removeEventListener(\"mousedown\", onDocDown);\n root.remove();\n\n // restore select styles\n select.style.position = prevStyle.position;\n select.style.left = prevStyle.left;\n select.style.width = prevStyle.width;\n select.style.height = prevStyle.height;\n\n instances.delete(select);\n },\n\n open: openDropdown,\n close,\n\n setValue(value: string | string[] | null) {\n setSelected(select, value);\n },\n getValue() {\n return getSelected(select);\n },\n\n clearOptions,\n setOptions,\n addOption,\n removeOption,\n updateOption,\n upsertOption,\n\n refresh,\n setLoading,\n\n setDisabled(v: boolean) {\n select.disabled = !!v;\n applyStateToUI();\n },\n setReadonly(v: boolean) {\n readonly = !!v;\n applyStateToUI();\n },\n isDisabled,\n isReadonly,\n };\n\n instances.set(select, inst);\n return inst;\n },\n\n get(select: HTMLSelectElement): SelectameloInstance | null {\n return instances.get(select) ?? null;\n },\n\n destroy(select: HTMLSelectElement): void {\n const inst = instances.get(select);\n if (inst) inst.destroy();\n },\n};\n"],"mappings":"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","names":[]}
package/dist/index.js CHANGED
@@ -5,6 +5,8 @@ function uid(prefix = "zs-") {
5
5
 
6
6
  // src/core.ts
7
7
  var instances = /* @__PURE__ */ new WeakMap();
8
+ var ICON_ANGLE_DOWN = '<svg class="zselect__icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M6 9l6 6 6-6" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>';
9
+ var ICON_X = '<svg class="zselect__icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M6 6l12 12M18 6l-12 12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>';
8
10
  function dispatch(select, name, detail) {
9
11
  select.dispatchEvent(new CustomEvent(name, { bubbles: true, detail }));
10
12
  }
@@ -21,7 +23,7 @@ function setSelected(select, value) {
21
23
  }
22
24
  select.dispatchEvent(new Event("change", { bubbles: true }));
23
25
  }
24
- var ZSelectCore = {
26
+ var Selectamelo = {
25
27
  create(select, options = {}) {
26
28
  const existing = instances.get(select);
27
29
  if (existing) return existing;
@@ -46,27 +48,27 @@ var ZSelectCore = {
46
48
  if (aSearchable != null) opts.searchable = aSearchable;
47
49
  const root = document.createElement("div");
48
50
  root.className = "zselect";
49
- root.setAttribute("data-zselect-core", "1");
51
+ root.setAttribute("data-selectamelo-core", "1");
50
52
  const control = document.createElement("button");
51
53
  control.type = "button";
52
54
  control.className = "zselect__control";
53
55
  control.setAttribute("aria-haspopup", "listbox");
54
56
  control.setAttribute("aria-expanded", "false");
55
57
  const ds = {
56
- placeholder: select.getAttribute("data-zselect-placeholder"),
57
- searchPlaceholder: select.getAttribute("data-zselect-search-placeholder"),
58
- clearTitle: select.getAttribute("data-zselect-clear-title"),
59
- clearAriaLabel: select.getAttribute("data-zselect-clear-aria-label"),
60
- removeChipAriaLabel: select.getAttribute("data-zselect-remove-chip-aria-label"),
61
- noResults: select.getAttribute("data-zselect-no-results")
58
+ placeholder: select.getAttribute("data-selectamelo-placeholder"),
59
+ searchPlaceholder: select.getAttribute("data-selectamelo-search-placeholder"),
60
+ clearTitle: select.getAttribute("data-selectamelo-clear-title"),
61
+ clearAriaLabel: select.getAttribute("data-selectamelo-clear-aria-label"),
62
+ removeChipAriaLabel: select.getAttribute("data-selectamelo-remove-chip-aria-label"),
63
+ noResults: select.getAttribute("data-selectamelo-no-results")
62
64
  };
63
65
  const t = {
64
66
  placeholder: options.i18n?.placeholder ?? ds.placeholder ?? options.placeholder ?? "",
65
- searchPlaceholder: options.i18n?.searchPlaceholder ?? ds.searchPlaceholder ?? "Cerca...",
66
- clearTitle: options.i18n?.clearTitle ?? ds.clearTitle ?? "Pulisci",
67
- clearAriaLabel: options.i18n?.clearAriaLabel ?? ds.clearAriaLabel ?? "Pulisci selezione",
68
- removeChipAriaLabel: options.i18n?.removeChipAriaLabel ?? ds.removeChipAriaLabel ?? "Rimuovi",
69
- noResults: options.i18n?.noResults ?? ds.noResults ?? "Nessun risultato"
67
+ searchPlaceholder: options.i18n?.searchPlaceholder ?? ds.searchPlaceholder ?? "Search...",
68
+ clearTitle: options.i18n?.clearTitle ?? ds.clearTitle ?? "Clear",
69
+ clearAriaLabel: options.i18n?.clearAriaLabel ?? ds.clearAriaLabel ?? "Clear selection",
70
+ removeChipAriaLabel: options.i18n?.removeChipAriaLabel ?? ds.removeChipAriaLabel ?? "Remove",
71
+ noResults: options.i18n?.noResults ?? ds.noResults ?? "No results"
70
72
  };
71
73
  const valueWrap = document.createElement("span");
72
74
  valueWrap.className = "zselect__valuewrap";
@@ -80,14 +82,14 @@ var ZSelectCore = {
80
82
  actions.className = "zselect__actions";
81
83
  const clearEl = document.createElement("span");
82
84
  clearEl.className = "zselect__clear";
83
- clearEl.textContent = "\xD7";
85
+ clearEl.innerHTML = ICON_X;
84
86
  clearEl.title = t.clearTitle;
85
87
  clearEl.setAttribute("aria-hidden", "true");
86
88
  clearEl.setAttribute("aria-label", t.clearAriaLabel);
87
89
  clearEl.style.display = "none";
88
90
  const arrow = document.createElement("span");
89
91
  arrow.className = "zselect__arrow";
90
- arrow.textContent = "\u25BE";
92
+ arrow.innerHTML = ICON_ANGLE_DOWN;
91
93
  actions.append(clearEl, arrow);
92
94
  control.append(valueWrap, actions);
93
95
  const dropdown = document.createElement("div");
@@ -204,8 +206,8 @@ var ZSelectCore = {
204
206
  const x = document.createElement("button");
205
207
  x.type = "button";
206
208
  x.className = "zselect__chip-remove";
207
- x.textContent = "\xD7";
208
- x.title = "Rimuovi";
209
+ x.innerHTML = ICON_X;
210
+ x.title = "Remove";
209
211
  x.setAttribute("aria-label", t.removeChipAriaLabel);
210
212
  x.addEventListener("mousedown", (e) => {
211
213
  e.preventDefault();
@@ -223,12 +225,12 @@ var ZSelectCore = {
223
225
  const isPlaceholder = selected.length === 0 || selected.length === 1 && (selected[0]?.value ?? "") === "" || select.multiple && selectedNonEmpty().length === 0;
224
226
  if (select.multiple) {
225
227
  renderChips();
226
- valueEl.textContent = isPlaceholder ? t.placeholder || "Seleziona..." : "";
228
+ valueEl.textContent = isPlaceholder ? t.placeholder || "Select..." : "";
227
229
  valueEl.classList.toggle("is-placeholder", isPlaceholder);
228
230
  return;
229
231
  }
230
232
  if (isPlaceholder) {
231
- valueEl.textContent = t.placeholder || "Seleziona...";
233
+ valueEl.textContent = t.placeholder || "Select...";
232
234
  valueEl.classList.add("is-placeholder");
233
235
  return;
234
236
  }
@@ -461,14 +463,14 @@ var ZSelectCore = {
461
463
  if (keepPlaceholder) {
462
464
  const opt = document.createElement("option");
463
465
  opt.value = "";
464
- opt.textContent = placeholderOpt?.textContent ?? opts.placeholder ?? "Seleziona...";
466
+ opt.textContent = placeholderOpt?.textContent ?? opts.placeholder ?? "Select...";
465
467
  select.append(opt);
466
468
  }
467
469
  select.value = "";
468
470
  emitChange();
469
471
  }
470
472
  function setOptions(optionsArr, keepPlaceholder = true) {
471
- const placeholderText = select.querySelector('option[value=""]')?.textContent ?? opts.placeholder ?? "Seleziona...";
473
+ const placeholderText = select.querySelector('option[value=""]')?.textContent ?? opts.placeholder ?? "Select...";
472
474
  select.innerHTML = "";
473
475
  if (keepPlaceholder) {
474
476
  const ph = document.createElement("option");
@@ -604,6 +606,6 @@ var ZSelectCore = {
604
606
  }
605
607
  };
606
608
  export {
607
- ZSelectCore
609
+ Selectamelo
608
610
  };
609
611
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dom.ts","../src/core.ts"],"sourcesContent":["export function isTruthyAttr(v: unknown): boolean {\n if (v === true) return true;\n if (v === false || v == null) return false;\n const s = String(v).toLowerCase().trim();\n return s === \"1\" || s === \"true\" || s === \"yes\" || s === \"on\";\n}\n\nexport function uid(prefix = \"zs-\"): string {\n return prefix + Math.random().toString(36).slice(2);\n}","import { uid } from \"./dom\";\n\nexport type ZSelectI18n = {\n placeholder?: string;\n searchPlaceholder?: string;\n clearTitle?: string;\n clearAriaLabel?: string;\n removeChipAriaLabel?: string;\n noResults?: string;\n};\n\nexport type ZSelectCoreOptions = {\n searchable?: boolean;\n placeholder?: string;\n allowClear?: boolean;\n hideSearch?: boolean;\n\n /** Forces the underlying <select> disabled state (HTML native disabled). */\n disabled?: boolean;\n\n /**\n * Prevents user interaction but does NOT disable the underlying <select>,\n * so its value is still submitted in forms.\n */\n readonly?: boolean;\n\n i18n?: ZSelectI18n;\n};\n\nexport type ZSelectInstance = {\n select: HTMLSelectElement;\n\n destroy(): void;\n open(): void;\n close(): void;\n\n setValue(value: string | string[] | null): void;\n getValue(): string | string[];\n\n clearOptions(keepPlaceholder?: boolean): void;\n setOptions(\n options: Array<{ value: string; label: string; disabled?: boolean }>,\n keepPlaceholder?: boolean\n ): void;\n\n addOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt?: boolean\n ): void;\n removeOption(value: string): void;\n updateOption(value: string, patch: { label?: string; disabled?: boolean }): void;\n upsertOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt?: boolean\n ): void;\n\n refresh(): void;\n setLoading(isLoading: boolean): void;\n\n setDisabled(isDisabled: boolean): void;\n setReadonly(isReadonly: boolean): void;\n isDisabled(): boolean;\n isReadonly(): boolean;\n};\n\nconst instances = new WeakMap<HTMLSelectElement, ZSelectInstance>();\n\nfunction dispatch(select: HTMLSelectElement, name: string, detail?: any) {\n select.dispatchEvent(new CustomEvent(name, { bubbles: true, detail }));\n}\n\nfunction getSelected(select: HTMLSelectElement): string | string[] {\n if (select.multiple) return Array.from(select.selectedOptions).map(o => o.value);\n return select.value;\n}\n\nfunction setSelected(select: HTMLSelectElement, value: string | string[] | null) {\n if (select.multiple) {\n const arr = Array.isArray(value)\n ? value.map(String)\n : value == null\n ? []\n : [String(value)];\n\n Array.from(select.options).forEach(o => (o.selected = arr.includes(o.value)));\n } else {\n select.value = value == null ? \"\" : String(value);\n }\n\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n}\n\nexport const ZSelectCore = {\n create(select: HTMLSelectElement, options: ZSelectCoreOptions = {}): ZSelectInstance {\n const existing = instances.get(select);\n if (existing) return existing;\n\n const opts: {\n searchable: boolean;\n placeholder: string;\n allowClear: boolean;\n hideSearch: boolean;\n } = {\n searchable: options.searchable ?? true,\n placeholder: options.placeholder ?? \"\",\n allowClear: options.allowClear ?? true,\n hideSearch: options.hideSearch ?? false,\n };\n\n function readBoolAttr(name: string): boolean | null {\n const v = select.getAttribute(name);\n if (v == null) return null;\n if (v === \"\" || v === \"true\" || v === \"1\") return true;\n if (v === \"false\" || v === \"0\") return false;\n return null;\n }\n\n const aAllowClear = readBoolAttr(\"data-allow-clear\");\n if (aAllowClear != null) opts.allowClear = aAllowClear;\n\n const aHideSearch = readBoolAttr(\"data-hide-search\");\n if (aHideSearch != null) opts.hideSearch = aHideSearch;\n\n const aSearchable = readBoolAttr(\"data-searchable\");\n if (aSearchable != null) opts.searchable = aSearchable;\n\n // --- UI scaffold\n const root = document.createElement(\"div\");\n root.className = \"zselect\";\n root.setAttribute(\"data-zselect-core\", \"1\");\n\n const control = document.createElement(\"button\");\n control.type = \"button\";\n control.className = \"zselect__control\";\n control.setAttribute(\"aria-haspopup\", \"listbox\");\n control.setAttribute(\"aria-expanded\", \"false\");\n\n const ds = {\n placeholder: select.getAttribute(\"data-zselect-placeholder\"),\n searchPlaceholder: select.getAttribute(\"data-zselect-search-placeholder\"),\n clearTitle: select.getAttribute(\"data-zselect-clear-title\"),\n clearAriaLabel: select.getAttribute(\"data-zselect-clear-aria-label\"),\n removeChipAriaLabel: select.getAttribute(\"data-zselect-remove-chip-aria-label\"),\n noResults: select.getAttribute(\"data-zselect-no-results\"),\n };\n\n const t = {\n placeholder:\n options.i18n?.placeholder ??\n ds.placeholder ??\n options.placeholder ??\n \"\",\n\n searchPlaceholder:\n options.i18n?.searchPlaceholder ??\n ds.searchPlaceholder ??\n \"Cerca...\",\n\n clearTitle:\n options.i18n?.clearTitle ??\n ds.clearTitle ??\n \"Pulisci\",\n\n clearAriaLabel:\n options.i18n?.clearAriaLabel ??\n ds.clearAriaLabel ??\n \"Pulisci selezione\",\n\n removeChipAriaLabel:\n options.i18n?.removeChipAriaLabel ??\n ds.removeChipAriaLabel ??\n \"Rimuovi\",\n\n noResults:\n options.i18n?.noResults ??\n ds.noResults ??\n \"Nessun risultato\",\n };\n\n const valueWrap = document.createElement(\"span\");\n valueWrap.className = \"zselect__valuewrap\";\n\n const chipsEl = document.createElement(\"span\");\n chipsEl.className = \"zselect__chips\";\n chipsEl.hidden = !select.multiple;\n\n const valueEl = document.createElement(\"span\");\n valueEl.className = \"zselect__value\";\n\n valueWrap.append(chipsEl, valueEl);\n\n const actions = document.createElement(\"span\");\n actions.className = \"zselect__actions\";\n\n const clearEl = document.createElement(\"span\");\n clearEl.className = \"zselect__clear\";\n clearEl.textContent = \"×\";\n clearEl.title = t.clearTitle;\n clearEl.setAttribute(\"aria-hidden\", \"true\");\n clearEl.setAttribute(\"aria-label\", t.clearAriaLabel);\n clearEl.style.display = \"none\";\n\n const arrow = document.createElement(\"span\");\n arrow.className = \"zselect__arrow\";\n arrow.textContent = \"▾\";\n\n actions.append(clearEl, arrow);\n control.append(valueWrap, actions);\n\n const dropdown = document.createElement(\"div\");\n dropdown.className = \"zselect__dropdown\";\n dropdown.hidden = true;\n\n const searchEl = document.createElement(\"input\");\n searchEl.className = \"zselect__search\";\n searchEl.type = \"text\";\n searchEl.autocomplete = \"off\";\n searchEl.placeholder = t.searchPlaceholder;\n searchEl.hidden = opts.hideSearch || !opts.searchable;\n\n const list = document.createElement(\"ul\");\n list.className = \"zselect__list\";\n list.setAttribute(\"role\", \"listbox\");\n\n // accessibility ids\n const listId = `zselect-list-${uid()}`;\n list.id = listId;\n control.setAttribute(\"aria-controls\", listId);\n\n dropdown.append(searchEl, list);\n root.append(control, dropdown);\n\n // hide original select (keep it in DOM for forms)\n const prevStyle = {\n position: select.style.position,\n left: select.style.left,\n width: select.style.width,\n height: select.style.height,\n };\n\n select.style.position = \"absolute\";\n select.style.left = \"-9999px\";\n select.style.width = \"1px\";\n select.style.height = \"1px\";\n\n select.insertAdjacentElement(\"afterend\", root);\n\n let open = false;\n let readonly = !!options.readonly || select.getAttribute(\"data-readonly\") === \"true\";\n const aDisabled = readBoolAttr(\"data-disabled\");\n if (aDisabled != null) select.disabled = !!aDisabled;\n let activeIndex = -1;\n let filterQuery = \"\";\n let hoverArmed = false;\n\n function isDisabled() {\n return select.disabled || select.hasAttribute(\"disabled\");\n }\n\n function isReadonly() {\n return readonly;\n }\n\n function applyStateToUI() {\n const disabledNow = isDisabled();\n const readonlyNow = isReadonly();\n\n root.classList.toggle(\"is-disabled\", disabledNow);\n root.classList.toggle(\"is-readonly\", readonlyNow);\n\n control.disabled = disabledNow || readonlyNow;\n searchEl.disabled = disabledNow || readonlyNow;\n\n control.setAttribute(\"aria-disabled\", disabledNow || readonlyNow ? \"true\" : \"false\");\n\n if ((disabledNow || readonlyNow) && open) close();\n }\n\n function hasValue(): boolean {\n if (select.multiple) return Array.from(select.selectedOptions).some(o => (o.value ?? \"\") !== \"\");\n return (select.value ?? \"\") !== \"\";\n }\n\n function updateClearVisibility() {\n if (!opts.allowClear || isDisabled() || isReadonly()) {\n clearEl.style.display = \"none\";\n return;\n }\n clearEl.style.display = hasValue() ? \"\" : \"none\";\n }\n\n function normalize(s: string) {\n return s.toLowerCase();\n }\n\n function getOptionLabel(opt: HTMLOptionElement) {\n return (opt.textContent ?? \"\").trim();\n }\n\n function allOptions() {\n return Array.from(select.options);\n }\n\n function selectedOptions() {\n return Array.from(select.selectedOptions);\n }\n\n function selectedNonEmpty() {\n return selectedOptions().filter(o => (o.value ?? \"\") !== \"\");\n }\n\n function emitChange() {\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n\n function getFilteredOptions(): HTMLOptionElement[] {\n const q = normalize(filterQuery.trim());\n const all = allOptions();\n if (!q) return all;\n return all.filter(o => normalize(getOptionLabel(o)).includes(q));\n }\n\n function clearValue() {\n if (!opts.allowClear) return;\n if (isReadonly()) return;\n\n if (select.multiple) {\n allOptions().forEach(o => (o.selected = false));\n select.value = \"\";\n } else {\n const hasEmpty = !!select.querySelector('option[value=\"\"]');\n select.value = hasEmpty ? \"\" : (select.options[0]?.value ?? \"\");\n }\n\n emitChange();\n dispatch(select, \"zselect:clear\");\n }\n\n function renderChips() {\n chipsEl.innerHTML = \"\";\n if (!select.multiple) return;\n\n const selected = selectedNonEmpty();\n if (!selected.length) return;\n\n selected.forEach(opt => {\n const chip = document.createElement(\"span\");\n chip.className = \"zselect__chip\";\n chip.dataset.value = opt.value;\n\n const label = document.createElement(\"span\");\n label.className = \"zselect__chip-label\";\n label.textContent = getOptionLabel(opt);\n\n const x = document.createElement(\"button\");\n x.type = \"button\";\n x.className = \"zselect__chip-remove\";\n x.textContent = \"×\";\n x.title = \"Rimuovi\";\n x.setAttribute(\"aria-label\", t.removeChipAriaLabel);\n\n x.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n e.stopPropagation();\n if (isReadonly()) return;\n\n opt.selected = false;\n emitChange();\n });\n\n chip.append(label, x);\n chipsEl.append(chip);\n });\n }\n\n function renderLabel() {\n const selected = selectedOptions();\n\n const isPlaceholder =\n selected.length === 0 ||\n (selected.length === 1 && (selected[0]?.value ?? \"\") === \"\") ||\n (select.multiple && selectedNonEmpty().length === 0);\n\n if (select.multiple) {\n renderChips();\n valueEl.textContent = isPlaceholder ? (t.placeholder || \"Seleziona...\") : \"\";\n valueEl.classList.toggle(\"is-placeholder\", isPlaceholder);\n return;\n }\n\n if (isPlaceholder) {\n valueEl.textContent = t.placeholder || \"Seleziona...\";\n valueEl.classList.add(\"is-placeholder\");\n return;\n }\n\n const first = selected[0];\n valueEl.textContent = (first?.textContent ?? \"\").trim();\n valueEl.classList.remove(\"is-placeholder\");\n }\n\n function getOptionItems(includeDisabled = true) {\n const selector = includeDisabled\n ? \".zselect__option\"\n : \".zselect__option:not(.is-disabled)\";\n return Array.from(list.querySelectorAll<HTMLLIElement>(selector));\n }\n\n function setActiveIndex(items: HTMLLIElement[], idx: number, scroll = true) {\n activeIndex = idx;\n items.forEach((li, i) => li.classList.toggle(\"is-active\", i === activeIndex));\n if (scroll && activeIndex >= 0) items[activeIndex]?.scrollIntoView({ block: \"nearest\" });\n }\n\n function clearActive(items?: HTMLLIElement[]) {\n const all = items ?? getOptionItems();\n activeIndex = -1;\n all.forEach(li => li.classList.remove(\"is-active\"));\n }\n\n function setActiveByValue(val: string) {\n const items = getOptionItems();\n const idx = items.findIndex(li => (li.dataset.value ?? \"\") === val);\n setActiveIndex(items, idx, true);\n }\n\n function renderList() {\n const filtered = getFilteredOptions().filter(opt => (opt.value ?? \"\") !== \"\");\n\n list.innerHTML = \"\";\n\n const selectedValues = new Set(selectedOptions().map(o => o.value));\n\n if (!filtered.length) {\n const empty = document.createElement(\"li\");\n empty.className = \"zselect__empty\";\n empty.textContent = t.noResults;\n list.append(empty);\n activeIndex = -1;\n return;\n }\n\n filtered.forEach((opt, idx) => {\n const li = document.createElement(\"li\");\n li.className = \"zselect__option\";\n li.setAttribute(\"role\", \"option\");\n li.dataset.value = opt.value;\n\n const labelText = getOptionLabel(opt);\n const labelEl = document.createElement(\"span\");\n labelEl.className = \"zselect__option-label\";\n labelEl.textContent = labelText;\n\n const checkEl = document.createElement(\"span\");\n checkEl.className = \"zselect__option-check\";\n checkEl.setAttribute(\"aria-hidden\", \"true\");\n checkEl.textContent = \"✓\";\n\n // Only show the check indicator when the option is selected.\n const isSelected = selectedValues.has(opt.value);\n checkEl.hidden = !isSelected;\n\n li.append(labelEl, checkEl);\n\n if (opt.disabled) li.classList.add(\"is-disabled\");\n\n if (isSelected) {\n li.classList.add(\"is-selected\");\n li.setAttribute(\"aria-selected\", \"true\");\n } else {\n li.setAttribute(\"aria-selected\", \"false\");\n }\n\n li.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n if (opt.disabled) return;\n if (isReadonly()) return;\n\n if (select.multiple) {\n opt.selected = !opt.selected;\n emitChange();\n renderList();\n if (!searchEl.hidden) searchEl.focus();\n } else {\n select.value = opt.value;\n emitChange();\n close();\n control.focus();\n }\n });\n\n li.addEventListener(\"mouseenter\", () => {\n if (!hoverArmed) return;\n if (opt.disabled) return;\n const all = getOptionItems();\n setActiveIndex(all, idx, false);\n });\n\n list.append(li);\n });\n\n // Never auto-activate on open. Only allow hover or keyboard to set active.\n clearActive();\n }\n\n function refresh() {\n renderLabel();\n updateClearVisibility();\n if (open) renderList();\n }\n\n function openDropdown() {\n if (open || isDisabled() || isReadonly()) return;\n\n open = true;\n dropdown.hidden = false;\n control.setAttribute(\"aria-expanded\", \"true\");\n root.classList.add(\"is-open\");\n\n filterQuery = \"\";\n // Prevent immediate activation of the first option just because the dropdown\n // appears under the current mouse cursor position. We only activate on real\n // pointer movement inside the dropdown.\n hoverArmed = false;\n dropdown.addEventListener(\n \"mousemove\",\n () => {\n hoverArmed = true;\n },\n { once: true }\n );\n if (!searchEl.hidden) {\n searchEl.value = \"\";\n renderList();\n queueMicrotask(() => searchEl.focus());\n } else {\n renderList();\n }\n\n dispatch(select, \"zselect:open\");\n }\n\n function close() {\n if (!open) return;\n\n open = false;\n hoverArmed = false;\n dropdown.hidden = true;\n control.setAttribute(\"aria-expanded\", \"false\");\n root.classList.remove(\"is-open\");\n dispatch(select, \"zselect:close\");\n }\n\n function toggle() {\n open ? close() : openDropdown();\n }\n\n function moveActive(delta: number) {\n const items = getOptionItems(false);\n if (!items.length) return;\n\n let i = activeIndex;\n if (i < 0) i = -1;\n i = Math.min(Math.max(i + delta, 0), items.length - 1);\n setActiveIndex(items, i, true);\n }\n\n function selectActive() {\n if (isReadonly()) return;\n\n const items = getOptionItems(false);\n if (!items.length) return;\n\n const li = items[Math.max(0, Math.min(activeIndex, items.length - 1))];\n if (!li) return;\n\n const val = li.dataset.value ?? \"\";\n const opt = Array.from(select.options).find(o => o.value === val);\n if (!opt || opt.disabled) return;\n\n if (select.multiple) {\n opt.selected = !opt.selected;\n emitChange();\n renderList();\n if (!searchEl.hidden) searchEl.focus();\n } else {\n select.value = opt.value;\n emitChange();\n close();\n control.focus();\n }\n }\n\n function onKeydown(e: KeyboardEvent) {\n if (isDisabled() || isReadonly()) return;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) openDropdown();\n moveActive(+1);\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!open) openDropdown();\n moveActive(-1);\n return;\n }\n if (e.key === \"Enter\") {\n if (!open) return;\n e.preventDefault();\n selectActive();\n return;\n }\n if (e.key === \"Escape\") {\n if (!open) return;\n e.preventDefault();\n close();\n control.focus();\n return;\n }\n if (e.key === \"Tab\") {\n if (open) close();\n return;\n }\n\n if (select.multiple && e.key === \"Backspace\") {\n const searchEmpty = searchEl.hidden || searchEl.value.trim() === \"\";\n if (searchEmpty) {\n const selected = selectedNonEmpty();\n const last = selected[selected.length - 1];\n if (last) {\n last.selected = false;\n emitChange();\n renderList();\n }\n }\n }\n }\n\n const onDocDown = (e: MouseEvent) => {\n if (!root.contains(e.target as Node)) close();\n };\n\n document.addEventListener(\"mousedown\", onDocDown);\n\n control.addEventListener(\"click\", () => toggle());\n control.addEventListener(\"keydown\", onKeydown);\n searchEl.addEventListener(\"keydown\", onKeydown);\n\n searchEl.addEventListener(\"input\", () => {\n filterQuery = searchEl.value ?? \"\";\n renderList();\n dispatch(select, \"zselect:search\", { q: filterQuery });\n });\n\n clearEl.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n e.stopPropagation();\n clearValue();\n if (open) renderList();\n if (!searchEl.hidden) searchEl.focus();\n });\n\n select.addEventListener(\"change\", () => {\n renderLabel();\n updateClearVisibility();\n if (open) renderList();\n dispatch(select, \"zselect:change\", { value: getSelected(select) });\n });\n\n function clearOptions(keepPlaceholder = true) {\n const placeholderOpt = select.querySelector('option[value=\"\"]') as HTMLOptionElement | null;\n\n select.innerHTML = \"\";\n\n if (keepPlaceholder) {\n const opt = document.createElement(\"option\");\n opt.value = \"\";\n opt.textContent = placeholderOpt?.textContent ?? opts.placeholder ?? \"Seleziona...\";\n select.append(opt);\n }\n\n select.value = \"\";\n emitChange();\n }\n\n function setOptions(\n optionsArr: Array<{ value: string; label: string; disabled?: boolean }>,\n keepPlaceholder = true\n ) {\n const placeholderText =\n (select.querySelector('option[value=\"\"]') as HTMLOptionElement | null)?.textContent ??\n opts.placeholder ??\n \"Seleziona...\";\n\n select.innerHTML = \"\";\n\n if (keepPlaceholder) {\n const ph = document.createElement(\"option\");\n ph.value = \"\";\n ph.textContent = placeholderText;\n select.append(ph);\n }\n\n optionsArr.forEach(o => {\n const opt = document.createElement(\"option\");\n opt.value = String(o.value);\n opt.textContent = o.label;\n if (o.disabled) opt.disabled = true;\n select.append(opt);\n });\n\n select.value = \"\";\n emitChange();\n }\n\n function setLoading(isLoading: boolean) {\n root.classList.toggle(\"is-loading\", !!isLoading);\n\n if (isLoading) {\n control.disabled = true;\n searchEl.disabled = true;\n return;\n }\n\n applyStateToUI();\n }\n\n function findOptionEl(value: string) {\n const v = String(value);\n return Array.from(select.options).find(o => o.value === v) ?? null;\n }\n\n function addOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt = false\n ) {\n const value = String(option.value);\n if (findOptionEl(value)) return;\n\n const opt = document.createElement(\"option\");\n opt.value = value;\n opt.textContent = option.label;\n if (option.disabled) opt.disabled = true;\n\n select.append(opt);\n\n if (selectIt) {\n if (select.multiple) opt.selected = true;\n else select.value = value;\n emitChange();\n } else {\n refresh();\n }\n }\n\n function removeOption(value: string) {\n const opt = findOptionEl(value);\n if (!opt) return;\n\n const wasSelected = opt.selected;\n opt.remove();\n\n if (wasSelected) {\n emitChange();\n } else {\n refresh();\n }\n }\n\n function updateOption(value: string, patch: { label?: string; disabled?: boolean }) {\n const opt = findOptionEl(value);\n if (!opt) return;\n\n if (patch.label !== undefined) opt.textContent = patch.label;\n if (patch.disabled !== undefined) opt.disabled = !!patch.disabled;\n\n refresh();\n }\n\n function upsertOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt = false\n ) {\n const value = String(option.value);\n const opt = findOptionEl(value);\n\n if (!opt) {\n addOption(option, selectIt);\n return;\n }\n\n opt.textContent = option.label;\n opt.disabled = !!option.disabled;\n\n if (selectIt) {\n if (select.multiple) opt.selected = true;\n else select.value = value;\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n } else {\n refresh();\n }\n }\n\n // initial render\n renderLabel();\n updateClearVisibility();\n\n // apply initial disabled if provided\n if (options.disabled != null) select.disabled = !!options.disabled;\n\n applyStateToUI();\n\n const inst: ZSelectInstance = {\n select,\n\n destroy() {\n document.removeEventListener(\"mousedown\", onDocDown);\n root.remove();\n\n // restore select styles\n select.style.position = prevStyle.position;\n select.style.left = prevStyle.left;\n select.style.width = prevStyle.width;\n select.style.height = prevStyle.height;\n\n instances.delete(select);\n },\n\n open: openDropdown,\n close,\n\n setValue(value: string | string[] | null) {\n setSelected(select, value);\n },\n getValue() {\n return getSelected(select);\n },\n\n clearOptions,\n setOptions,\n addOption,\n removeOption,\n updateOption,\n upsertOption,\n\n refresh,\n setLoading,\n\n setDisabled(v: boolean) {\n select.disabled = !!v;\n applyStateToUI();\n },\n setReadonly(v: boolean) {\n readonly = !!v;\n applyStateToUI();\n },\n isDisabled,\n isReadonly,\n };\n\n instances.set(select, inst);\n return inst;\n },\n\n get(select: HTMLSelectElement): ZSelectInstance | null {\n return instances.get(select) ?? null;\n },\n\n destroy(select: HTMLSelectElement): void {\n const inst = instances.get(select);\n if (inst) inst.destroy();\n },\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/dom.ts","../src/core.ts"],"sourcesContent":["export function isTruthyAttr(v: unknown): boolean {\n if (v === true) return true;\n if (v === false || v == null) return false;\n const s = String(v).toLowerCase().trim();\n return s === \"1\" || s === \"true\" || s === \"yes\" || s === \"on\";\n}\n\nexport function uid(prefix = \"zs-\"): string {\n return prefix + Math.random().toString(36).slice(2);\n}","import { uid } from \"./dom\";\n\nexport type SelectameloI18n = {\n placeholder?: string;\n searchPlaceholder?: string;\n clearTitle?: string;\n clearAriaLabel?: string;\n removeChipAriaLabel?: string;\n noResults?: string;\n};\n\nexport type SelectameloOptions = {\n searchable?: boolean;\n placeholder?: string;\n allowClear?: boolean;\n hideSearch?: boolean;\n\n /** Forces the underlying <select> disabled state (HTML native disabled). */\n disabled?: boolean;\n\n /**\n * Prevents user interaction but does NOT disable the underlying <select>,\n * so its value is still submitted in forms.\n */\n readonly?: boolean;\n\n i18n?: SelectameloI18n;\n};\n\nexport type SelectameloInstance = {\n select: HTMLSelectElement;\n\n destroy(): void;\n open(): void;\n close(): void;\n\n setValue(value: string | string[] | null): void;\n getValue(): string | string[];\n\n clearOptions(keepPlaceholder?: boolean): void;\n setOptions(\n options: Array<{ value: string; label: string; disabled?: boolean }>,\n keepPlaceholder?: boolean\n ): void;\n\n addOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt?: boolean\n ): void;\n removeOption(value: string): void;\n updateOption(value: string, patch: { label?: string; disabled?: boolean }): void;\n upsertOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt?: boolean\n ): void;\n\n refresh(): void;\n setLoading(isLoading: boolean): void;\n\n setDisabled(isDisabled: boolean): void;\n setReadonly(isReadonly: boolean): void;\n isDisabled(): boolean;\n isReadonly(): boolean;\n};\n\nconst instances = new WeakMap<HTMLSelectElement, SelectameloInstance>();\nconst ICON_ANGLE_DOWN =\n '<svg class=\"zselect__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M6 9l6 6 6-6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\nconst ICON_X =\n '<svg class=\"zselect__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M6 6l12 12M18 6l-12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>';\n\nfunction dispatch(select: HTMLSelectElement, name: string, detail?: any) {\n select.dispatchEvent(new CustomEvent(name, { bubbles: true, detail }));\n}\n\nfunction getSelected(select: HTMLSelectElement): string | string[] {\n if (select.multiple) return Array.from(select.selectedOptions).map(o => o.value);\n return select.value;\n}\n\nfunction setSelected(select: HTMLSelectElement, value: string | string[] | null) {\n if (select.multiple) {\n const arr = Array.isArray(value)\n ? value.map(String)\n : value == null\n ? []\n : [String(value)];\n\n Array.from(select.options).forEach(o => (o.selected = arr.includes(o.value)));\n } else {\n select.value = value == null ? \"\" : String(value);\n }\n\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n}\n\nexport const Selectamelo = {\n create(select: HTMLSelectElement, options: SelectameloOptions = {}): SelectameloInstance {\n const existing = instances.get(select);\n if (existing) return existing;\n\n const opts: {\n searchable: boolean;\n placeholder: string;\n allowClear: boolean;\n hideSearch: boolean;\n } = {\n searchable: options.searchable ?? true,\n placeholder: options.placeholder ?? \"\",\n allowClear: options.allowClear ?? true,\n hideSearch: options.hideSearch ?? false,\n };\n\n function readBoolAttr(name: string): boolean | null {\n const v = select.getAttribute(name);\n if (v == null) return null;\n if (v === \"\" || v === \"true\" || v === \"1\") return true;\n if (v === \"false\" || v === \"0\") return false;\n return null;\n }\n\n const aAllowClear = readBoolAttr(\"data-allow-clear\");\n if (aAllowClear != null) opts.allowClear = aAllowClear;\n\n const aHideSearch = readBoolAttr(\"data-hide-search\");\n if (aHideSearch != null) opts.hideSearch = aHideSearch;\n\n const aSearchable = readBoolAttr(\"data-searchable\");\n if (aSearchable != null) opts.searchable = aSearchable;\n\n // --- UI scaffold\n const root = document.createElement(\"div\");\n root.className = \"zselect\";\n root.setAttribute(\"data-selectamelo-core\", \"1\");\n\n const control = document.createElement(\"button\");\n control.type = \"button\";\n control.className = \"zselect__control\";\n control.setAttribute(\"aria-haspopup\", \"listbox\");\n control.setAttribute(\"aria-expanded\", \"false\");\n\n const ds = {\n placeholder: select.getAttribute(\"data-selectamelo-placeholder\"),\n searchPlaceholder: select.getAttribute(\"data-selectamelo-search-placeholder\"),\n clearTitle: select.getAttribute(\"data-selectamelo-clear-title\"),\n clearAriaLabel: select.getAttribute(\"data-selectamelo-clear-aria-label\"),\n removeChipAriaLabel: select.getAttribute(\"data-selectamelo-remove-chip-aria-label\"),\n noResults: select.getAttribute(\"data-selectamelo-no-results\"),\n };\n\n const t = {\n placeholder:\n options.i18n?.placeholder ??\n ds.placeholder ??\n options.placeholder ??\n \"\",\n\n searchPlaceholder:\n options.i18n?.searchPlaceholder ??\n ds.searchPlaceholder ??\n \"Search...\",\n\n clearTitle:\n options.i18n?.clearTitle ??\n ds.clearTitle ??\n \"Clear\",\n\n clearAriaLabel:\n options.i18n?.clearAriaLabel ??\n ds.clearAriaLabel ??\n \"Clear selection\",\n\n removeChipAriaLabel:\n options.i18n?.removeChipAriaLabel ??\n ds.removeChipAriaLabel ??\n \"Remove\",\n\n noResults:\n options.i18n?.noResults ??\n ds.noResults ??\n \"No results\",\n };\n\n const valueWrap = document.createElement(\"span\");\n valueWrap.className = \"zselect__valuewrap\";\n\n const chipsEl = document.createElement(\"span\");\n chipsEl.className = \"zselect__chips\";\n chipsEl.hidden = !select.multiple;\n\n const valueEl = document.createElement(\"span\");\n valueEl.className = \"zselect__value\";\n\n valueWrap.append(chipsEl, valueEl);\n\n const actions = document.createElement(\"span\");\n actions.className = \"zselect__actions\";\n\n const clearEl = document.createElement(\"span\");\n clearEl.className = \"zselect__clear\";\n clearEl.innerHTML = ICON_X;\n clearEl.title = t.clearTitle;\n clearEl.setAttribute(\"aria-hidden\", \"true\");\n clearEl.setAttribute(\"aria-label\", t.clearAriaLabel);\n clearEl.style.display = \"none\";\n\n const arrow = document.createElement(\"span\");\n arrow.className = \"zselect__arrow\";\n arrow.innerHTML = ICON_ANGLE_DOWN;\n\n actions.append(clearEl, arrow);\n control.append(valueWrap, actions);\n\n const dropdown = document.createElement(\"div\");\n dropdown.className = \"zselect__dropdown\";\n dropdown.hidden = true;\n\n const searchEl = document.createElement(\"input\");\n searchEl.className = \"zselect__search\";\n searchEl.type = \"text\";\n searchEl.autocomplete = \"off\";\n searchEl.placeholder = t.searchPlaceholder;\n searchEl.hidden = opts.hideSearch || !opts.searchable;\n\n const list = document.createElement(\"ul\");\n list.className = \"zselect__list\";\n list.setAttribute(\"role\", \"listbox\");\n\n // accessibility ids\n const listId = `zselect-list-${uid()}`;\n list.id = listId;\n control.setAttribute(\"aria-controls\", listId);\n\n dropdown.append(searchEl, list);\n root.append(control, dropdown);\n\n // hide original select (keep it in DOM for forms)\n const prevStyle = {\n position: select.style.position,\n left: select.style.left,\n width: select.style.width,\n height: select.style.height,\n };\n\n select.style.position = \"absolute\";\n select.style.left = \"-9999px\";\n select.style.width = \"1px\";\n select.style.height = \"1px\";\n\n select.insertAdjacentElement(\"afterend\", root);\n\n let open = false;\n let readonly = !!options.readonly || select.getAttribute(\"data-readonly\") === \"true\";\n const aDisabled = readBoolAttr(\"data-disabled\");\n if (aDisabled != null) select.disabled = !!aDisabled;\n let activeIndex = -1;\n let filterQuery = \"\";\n let hoverArmed = false;\n\n function isDisabled() {\n return select.disabled || select.hasAttribute(\"disabled\");\n }\n\n function isReadonly() {\n return readonly;\n }\n\n function applyStateToUI() {\n const disabledNow = isDisabled();\n const readonlyNow = isReadonly();\n\n root.classList.toggle(\"is-disabled\", disabledNow);\n root.classList.toggle(\"is-readonly\", readonlyNow);\n\n control.disabled = disabledNow || readonlyNow;\n searchEl.disabled = disabledNow || readonlyNow;\n\n control.setAttribute(\"aria-disabled\", disabledNow || readonlyNow ? \"true\" : \"false\");\n\n if ((disabledNow || readonlyNow) && open) close();\n }\n\n function hasValue(): boolean {\n if (select.multiple) return Array.from(select.selectedOptions).some(o => (o.value ?? \"\") !== \"\");\n return (select.value ?? \"\") !== \"\";\n }\n\n function updateClearVisibility() {\n if (!opts.allowClear || isDisabled() || isReadonly()) {\n clearEl.style.display = \"none\";\n return;\n }\n clearEl.style.display = hasValue() ? \"\" : \"none\";\n }\n\n function normalize(s: string) {\n return s.toLowerCase();\n }\n\n function getOptionLabel(opt: HTMLOptionElement) {\n return (opt.textContent ?? \"\").trim();\n }\n\n function allOptions() {\n return Array.from(select.options);\n }\n\n function selectedOptions() {\n return Array.from(select.selectedOptions);\n }\n\n function selectedNonEmpty() {\n return selectedOptions().filter(o => (o.value ?? \"\") !== \"\");\n }\n\n function emitChange() {\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n\n function getFilteredOptions(): HTMLOptionElement[] {\n const q = normalize(filterQuery.trim());\n const all = allOptions();\n if (!q) return all;\n return all.filter(o => normalize(getOptionLabel(o)).includes(q));\n }\n\n function clearValue() {\n if (!opts.allowClear) return;\n if (isReadonly()) return;\n\n if (select.multiple) {\n allOptions().forEach(o => (o.selected = false));\n select.value = \"\";\n } else {\n const hasEmpty = !!select.querySelector('option[value=\"\"]');\n select.value = hasEmpty ? \"\" : (select.options[0]?.value ?? \"\");\n }\n\n emitChange();\n dispatch(select, \"zselect:clear\");\n }\n\n function renderChips() {\n chipsEl.innerHTML = \"\";\n if (!select.multiple) return;\n\n const selected = selectedNonEmpty();\n if (!selected.length) return;\n\n selected.forEach(opt => {\n const chip = document.createElement(\"span\");\n chip.className = \"zselect__chip\";\n chip.dataset.value = opt.value;\n\n const label = document.createElement(\"span\");\n label.className = \"zselect__chip-label\";\n label.textContent = getOptionLabel(opt);\n\n const x = document.createElement(\"button\");\n x.type = \"button\";\n x.className = \"zselect__chip-remove\";\n x.innerHTML = ICON_X;\n x.title = \"Remove\";\n x.setAttribute(\"aria-label\", t.removeChipAriaLabel);\n\n x.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n e.stopPropagation();\n if (isReadonly()) return;\n\n opt.selected = false;\n emitChange();\n });\n\n chip.append(label, x);\n chipsEl.append(chip);\n });\n }\n\n function renderLabel() {\n const selected = selectedOptions();\n\n const isPlaceholder =\n selected.length === 0 ||\n (selected.length === 1 && (selected[0]?.value ?? \"\") === \"\") ||\n (select.multiple && selectedNonEmpty().length === 0);\n\n if (select.multiple) {\n renderChips();\n valueEl.textContent = isPlaceholder ? (t.placeholder || \"Select...\") : \"\";\n valueEl.classList.toggle(\"is-placeholder\", isPlaceholder);\n return;\n }\n\n if (isPlaceholder) {\n valueEl.textContent = t.placeholder || \"Select...\";\n valueEl.classList.add(\"is-placeholder\");\n return;\n }\n\n const first = selected[0];\n valueEl.textContent = (first?.textContent ?? \"\").trim();\n valueEl.classList.remove(\"is-placeholder\");\n }\n\n function getOptionItems(includeDisabled = true) {\n const selector = includeDisabled\n ? \".zselect__option\"\n : \".zselect__option:not(.is-disabled)\";\n return Array.from(list.querySelectorAll<HTMLLIElement>(selector));\n }\n\n function setActiveIndex(items: HTMLLIElement[], idx: number, scroll = true) {\n activeIndex = idx;\n items.forEach((li, i) => li.classList.toggle(\"is-active\", i === activeIndex));\n if (scroll && activeIndex >= 0) items[activeIndex]?.scrollIntoView({ block: \"nearest\" });\n }\n\n function clearActive(items?: HTMLLIElement[]) {\n const all = items ?? getOptionItems();\n activeIndex = -1;\n all.forEach(li => li.classList.remove(\"is-active\"));\n }\n\n function setActiveByValue(val: string) {\n const items = getOptionItems();\n const idx = items.findIndex(li => (li.dataset.value ?? \"\") === val);\n setActiveIndex(items, idx, true);\n }\n\n function renderList() {\n const filtered = getFilteredOptions().filter(opt => (opt.value ?? \"\") !== \"\");\n\n list.innerHTML = \"\";\n\n const selectedValues = new Set(selectedOptions().map(o => o.value));\n\n if (!filtered.length) {\n const empty = document.createElement(\"li\");\n empty.className = \"zselect__empty\";\n empty.textContent = t.noResults;\n list.append(empty);\n activeIndex = -1;\n return;\n }\n\n filtered.forEach((opt, idx) => {\n const li = document.createElement(\"li\");\n li.className = \"zselect__option\";\n li.setAttribute(\"role\", \"option\");\n li.dataset.value = opt.value;\n\n const labelText = getOptionLabel(opt);\n const labelEl = document.createElement(\"span\");\n labelEl.className = \"zselect__option-label\";\n labelEl.textContent = labelText;\n\n const checkEl = document.createElement(\"span\");\n checkEl.className = \"zselect__option-check\";\n checkEl.setAttribute(\"aria-hidden\", \"true\");\n checkEl.textContent = \"✓\";\n\n // Only show the check indicator when the option is selected.\n const isSelected = selectedValues.has(opt.value);\n checkEl.hidden = !isSelected;\n\n li.append(labelEl, checkEl);\n\n if (opt.disabled) li.classList.add(\"is-disabled\");\n\n if (isSelected) {\n li.classList.add(\"is-selected\");\n li.setAttribute(\"aria-selected\", \"true\");\n } else {\n li.setAttribute(\"aria-selected\", \"false\");\n }\n\n li.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n if (opt.disabled) return;\n if (isReadonly()) return;\n\n if (select.multiple) {\n opt.selected = !opt.selected;\n emitChange();\n renderList();\n if (!searchEl.hidden) searchEl.focus();\n } else {\n select.value = opt.value;\n emitChange();\n close();\n control.focus();\n }\n });\n\n li.addEventListener(\"mouseenter\", () => {\n if (!hoverArmed) return;\n if (opt.disabled) return;\n const all = getOptionItems();\n setActiveIndex(all, idx, false);\n });\n\n list.append(li);\n });\n\n // Never auto-activate on open. Only allow hover or keyboard to set active.\n clearActive();\n }\n\n function refresh() {\n renderLabel();\n updateClearVisibility();\n if (open) renderList();\n }\n\n function openDropdown() {\n if (open || isDisabled() || isReadonly()) return;\n\n open = true;\n dropdown.hidden = false;\n control.setAttribute(\"aria-expanded\", \"true\");\n root.classList.add(\"is-open\");\n\n filterQuery = \"\";\n // Prevent immediate activation of the first option just because the dropdown\n // appears under the current mouse cursor position. We only activate on real\n // pointer movement inside the dropdown.\n hoverArmed = false;\n dropdown.addEventListener(\n \"mousemove\",\n () => {\n hoverArmed = true;\n },\n { once: true }\n );\n if (!searchEl.hidden) {\n searchEl.value = \"\";\n renderList();\n queueMicrotask(() => searchEl.focus());\n } else {\n renderList();\n }\n\n dispatch(select, \"zselect:open\");\n }\n\n function close() {\n if (!open) return;\n\n open = false;\n hoverArmed = false;\n dropdown.hidden = true;\n control.setAttribute(\"aria-expanded\", \"false\");\n root.classList.remove(\"is-open\");\n dispatch(select, \"zselect:close\");\n }\n\n function toggle() {\n open ? close() : openDropdown();\n }\n\n function moveActive(delta: number) {\n const items = getOptionItems(false);\n if (!items.length) return;\n\n let i = activeIndex;\n if (i < 0) i = -1;\n i = Math.min(Math.max(i + delta, 0), items.length - 1);\n setActiveIndex(items, i, true);\n }\n\n function selectActive() {\n if (isReadonly()) return;\n\n const items = getOptionItems(false);\n if (!items.length) return;\n\n const li = items[Math.max(0, Math.min(activeIndex, items.length - 1))];\n if (!li) return;\n\n const val = li.dataset.value ?? \"\";\n const opt = Array.from(select.options).find(o => o.value === val);\n if (!opt || opt.disabled) return;\n\n if (select.multiple) {\n opt.selected = !opt.selected;\n emitChange();\n renderList();\n if (!searchEl.hidden) searchEl.focus();\n } else {\n select.value = opt.value;\n emitChange();\n close();\n control.focus();\n }\n }\n\n function onKeydown(e: KeyboardEvent) {\n if (isDisabled() || isReadonly()) return;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) openDropdown();\n moveActive(+1);\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!open) openDropdown();\n moveActive(-1);\n return;\n }\n if (e.key === \"Enter\") {\n if (!open) return;\n e.preventDefault();\n selectActive();\n return;\n }\n if (e.key === \"Escape\") {\n if (!open) return;\n e.preventDefault();\n close();\n control.focus();\n return;\n }\n if (e.key === \"Tab\") {\n if (open) close();\n return;\n }\n\n if (select.multiple && e.key === \"Backspace\") {\n const searchEmpty = searchEl.hidden || searchEl.value.trim() === \"\";\n if (searchEmpty) {\n const selected = selectedNonEmpty();\n const last = selected[selected.length - 1];\n if (last) {\n last.selected = false;\n emitChange();\n renderList();\n }\n }\n }\n }\n\n const onDocDown = (e: MouseEvent) => {\n if (!root.contains(e.target as Node)) close();\n };\n\n document.addEventListener(\"mousedown\", onDocDown);\n\n control.addEventListener(\"click\", () => toggle());\n control.addEventListener(\"keydown\", onKeydown);\n searchEl.addEventListener(\"keydown\", onKeydown);\n\n searchEl.addEventListener(\"input\", () => {\n filterQuery = searchEl.value ?? \"\";\n renderList();\n dispatch(select, \"zselect:search\", { q: filterQuery });\n });\n\n clearEl.addEventListener(\"mousedown\", e => {\n e.preventDefault();\n e.stopPropagation();\n clearValue();\n if (open) renderList();\n if (!searchEl.hidden) searchEl.focus();\n });\n\n select.addEventListener(\"change\", () => {\n renderLabel();\n updateClearVisibility();\n if (open) renderList();\n dispatch(select, \"zselect:change\", { value: getSelected(select) });\n });\n\n function clearOptions(keepPlaceholder = true) {\n const placeholderOpt = select.querySelector('option[value=\"\"]') as HTMLOptionElement | null;\n\n select.innerHTML = \"\";\n\n if (keepPlaceholder) {\n const opt = document.createElement(\"option\");\n opt.value = \"\";\n opt.textContent = placeholderOpt?.textContent ?? opts.placeholder ?? \"Select...\";\n select.append(opt);\n }\n\n select.value = \"\";\n emitChange();\n }\n\n function setOptions(\n optionsArr: Array<{ value: string; label: string; disabled?: boolean }>,\n keepPlaceholder = true\n ) {\n const placeholderText =\n (select.querySelector('option[value=\"\"]') as HTMLOptionElement | null)?.textContent ??\n opts.placeholder ??\n \"Select...\";\n\n select.innerHTML = \"\";\n\n if (keepPlaceholder) {\n const ph = document.createElement(\"option\");\n ph.value = \"\";\n ph.textContent = placeholderText;\n select.append(ph);\n }\n\n optionsArr.forEach(o => {\n const opt = document.createElement(\"option\");\n opt.value = String(o.value);\n opt.textContent = o.label;\n if (o.disabled) opt.disabled = true;\n select.append(opt);\n });\n\n select.value = \"\";\n emitChange();\n }\n\n function setLoading(isLoading: boolean) {\n root.classList.toggle(\"is-loading\", !!isLoading);\n\n if (isLoading) {\n control.disabled = true;\n searchEl.disabled = true;\n return;\n }\n\n applyStateToUI();\n }\n\n function findOptionEl(value: string) {\n const v = String(value);\n return Array.from(select.options).find(o => o.value === v) ?? null;\n }\n\n function addOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt = false\n ) {\n const value = String(option.value);\n if (findOptionEl(value)) return;\n\n const opt = document.createElement(\"option\");\n opt.value = value;\n opt.textContent = option.label;\n if (option.disabled) opt.disabled = true;\n\n select.append(opt);\n\n if (selectIt) {\n if (select.multiple) opt.selected = true;\n else select.value = value;\n emitChange();\n } else {\n refresh();\n }\n }\n\n function removeOption(value: string) {\n const opt = findOptionEl(value);\n if (!opt) return;\n\n const wasSelected = opt.selected;\n opt.remove();\n\n if (wasSelected) {\n emitChange();\n } else {\n refresh();\n }\n }\n\n function updateOption(value: string, patch: { label?: string; disabled?: boolean }) {\n const opt = findOptionEl(value);\n if (!opt) return;\n\n if (patch.label !== undefined) opt.textContent = patch.label;\n if (patch.disabled !== undefined) opt.disabled = !!patch.disabled;\n\n refresh();\n }\n\n function upsertOption(\n option: { value: string; label: string; disabled?: boolean },\n selectIt = false\n ) {\n const value = String(option.value);\n const opt = findOptionEl(value);\n\n if (!opt) {\n addOption(option, selectIt);\n return;\n }\n\n opt.textContent = option.label;\n opt.disabled = !!option.disabled;\n\n if (selectIt) {\n if (select.multiple) opt.selected = true;\n else select.value = value;\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n } else {\n refresh();\n }\n }\n\n // initial render\n renderLabel();\n updateClearVisibility();\n\n // apply initial disabled if provided\n if (options.disabled != null) select.disabled = !!options.disabled;\n\n applyStateToUI();\n\n const inst: SelectameloInstance = {\n select,\n\n destroy() {\n document.removeEventListener(\"mousedown\", onDocDown);\n root.remove();\n\n // restore select styles\n select.style.position = prevStyle.position;\n select.style.left = prevStyle.left;\n select.style.width = prevStyle.width;\n select.style.height = prevStyle.height;\n\n instances.delete(select);\n },\n\n open: openDropdown,\n close,\n\n setValue(value: string | string[] | null) {\n setSelected(select, value);\n },\n getValue() {\n return getSelected(select);\n },\n\n clearOptions,\n setOptions,\n addOption,\n removeOption,\n updateOption,\n upsertOption,\n\n refresh,\n setLoading,\n\n setDisabled(v: boolean) {\n select.disabled = !!v;\n applyStateToUI();\n },\n setReadonly(v: boolean) {\n readonly = !!v;\n applyStateToUI();\n },\n isDisabled,\n isReadonly,\n };\n\n instances.set(select, inst);\n return inst;\n },\n\n get(select: HTMLSelectElement): SelectameloInstance | null {\n return instances.get(select) ?? null;\n },\n\n destroy(select: HTMLSelectElement): void {\n const inst = instances.get(select);\n if (inst) inst.destroy();\n },\n};\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "selectamelo",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Vanilla JS select enhancer core (no framework integration)",
5
5
  "keywords": [
6
6
  "select",
@@ -14,15 +14,15 @@
14
14
  "no-jquery"
15
15
  ],
16
16
  "license": "MIT",
17
- "author": "Zycon",
17
+ "author": "Zyc0n",
18
18
  "repository": {
19
19
  "type": "git",
20
- "url": "https://github.com/zycon/zselect-core"
20
+ "url": "https://github.com/zyc0n/selectamelo"
21
21
  },
22
22
  "bugs": {
23
- "url": "https://github.com/zycon/zselect-core/issues"
23
+ "url": "https://github.com/zyc0n/selectamelo/issues"
24
24
  },
25
- "homepage": "https://github.com/zycon/zselect-core",
25
+ "homepage": "https://zyc0n.github.io/selectamelo/",
26
26
  "type": "module",
27
27
  "main": "./dist/index.cjs",
28
28
  "module": "./dist/index.js",
@@ -43,8 +43,8 @@
43
43
  "access": "public"
44
44
  },
45
45
  "scripts": {
46
- "build": "tsup src/index.ts --format esm,cjs,iife --global-name ZSelectCore --dts --sourcemap --clean",
47
- "dev": "tsup src/index.ts --format esm,cjs,iife --global-name ZSelectCore --dts --sourcemap --watch",
46
+ "build": "tsup src/index.ts --format esm,cjs,iife --global-name Selectamelo --dts --sourcemap --clean",
47
+ "dev": "tsup src/index.ts --format esm,cjs,iife --global-name Selectamelo --dts --sourcemap --watch",
48
48
  "typecheck": "tsc --noEmit",
49
49
  "prepublishOnly": "npm run build"
50
50
  },