@platforma-sdk/ui-vue 1.42.10 → 1.42.14

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.
Files changed (26) hide show
  1. package/.turbo/turbo-build.log +18 -18
  2. package/.turbo/turbo-test.log +565 -0
  3. package/.turbo/turbo-type-check.log +1 -1
  4. package/CHANGELOG.md +8 -0
  5. package/dist/components/PlAnnotations/components/DynamicForm.vue2.js +12 -12
  6. package/dist/lib/ui/uikit/dist/components/DataTable/TableComponent.vue.js +1 -1
  7. package/dist/lib/ui/uikit/dist/components/PlAccordion/ExpandTransition.vue.js +27 -0
  8. package/dist/lib/ui/uikit/dist/components/PlAccordion/ExpandTransition.vue.js.map +1 -0
  9. package/dist/lib/ui/uikit/dist/components/PlAccordion/PlAccordionSection.vue2.js +1 -1
  10. package/dist/lib/ui/uikit/dist/components/PlAutocomplete/PlAutocomplete.vue.js +22 -22
  11. package/dist/lib/ui/uikit/dist/components/PlAutocomplete/PlAutocomplete.vue.js.map +1 -1
  12. package/dist/lib/ui/uikit/dist/components/PlDropdown/OptionList.vue.js +2 -2
  13. package/dist/lib/ui/uikit/dist/components/PlDropdown/PlDropdown.vue.js +106 -103
  14. package/dist/lib/ui/uikit/dist/components/PlDropdown/PlDropdown.vue.js.map +1 -1
  15. package/dist/lib/ui/uikit/dist/components/PlDropdownLine/PlDropdownLine.vue.js +81 -77
  16. package/dist/lib/ui/uikit/dist/components/PlDropdownLine/PlDropdownLine.vue.js.map +1 -1
  17. package/dist/lib/ui/uikit/dist/components/PlDropdownMulti/PlDropdownMulti.vue.js +21 -21
  18. package/dist/lib/ui/uikit/dist/components/PlDropdownMulti/PlDropdownMulti.vue.js.map +1 -1
  19. package/dist/lib/ui/uikit/dist/components/PlDropdownRef/PlDropdownRef.vue.js +24 -22
  20. package/dist/lib/ui/uikit/dist/components/PlDropdownRef/PlDropdownRef.vue.js.map +1 -1
  21. package/dist/lib/ui/uikit/dist/components/PlFileDialog/Remote.vue.js +8 -8
  22. package/dist/lib/ui/uikit/dist/components/PlSlideModal/PlPureSlideModal.vue.js +1 -1
  23. package/dist/lib/ui/uikit/dist/utils/DropdownOverlay/DropdownOverlay.vue.js +13 -11
  24. package/dist/lib/ui/uikit/dist/utils/DropdownOverlay/DropdownOverlay.vue.js.map +1 -1
  25. package/dist/plugins/Monetization/MonetizationSidebar.vue.js +4 -4
  26. package/package.json +5 -5
@@ -1,4 +1,4 @@
1
- import { defineComponent as Q, reactive as S, ref as g, computed as k, toRef as W, watch as h, nextTick as M, createElementBlock as p, openBlock as d, normalizeClass as X, createElementVNode as u, createVNode as z, createBlock as Y, createCommentVNode as _, toDisplayString as ee, withDirectives as F, vShow as Z, Teleport as oe, normalizeStyle as H, Fragment as I, renderList as j, unref as L, renderSlot as A, withModifiers as y } from "vue";
1
+ import { defineComponent as Q, reactive as $, ref as k, computed as _, toRef as W, watch as f, nextTick as M, createElementBlock as p, openBlock as d, normalizeClass as X, createElementVNode as u, createVNode as z, createBlock as Y, createCommentVNode as L, toDisplayString as ee, withDirectives as F, vShow as Z, Teleport as oe, withModifiers as m, normalizeStyle as H, Fragment as I, renderList as j, unref as y, renderSlot as A } from "vue";
2
2
  import { deepEqual as B } from "../../helpers/objects.js";
3
3
  import { useClickOutside as te } from "../../composition/useClickOutside.js";
4
4
  import { useFilteredList as ie } from "../../composition/useFilteredList.js";
@@ -12,8 +12,8 @@ import { useElementPosition as ce } from "../../composition/usePosition.js";
12
12
  (function() {
13
13
  try {
14
14
  if (typeof document < "u") {
15
- var f = document.createElement("style");
16
- f.appendChild(document.createTextNode(`.pl-line-dropdown{display:flex;align-items:center;width:fit-content;padding:8px 0;box-sizing:border-box;position:relative;outline:none;max-width:256px}.pl-line-dropdown:focus-within:after{border-bottom:2px solid var(--border-color-focus)}.pl-line-dropdown__prefix,.pl-line-dropdown__input{text-transform:uppercase}.pl-line-dropdown:hover:after{border-bottom:2px solid var(--border-color-focus)}.pl-line-dropdown:after{content:"";position:absolute;bottom:0;border-bottom:2px solid var(--color-div-grey);width:100%}.pl-line-dropdown *{color:var(--txt-01);font-family:var(--font-family-base);font-size:13px;font-style:normal;font-weight:600;line-height:14px;letter-spacing:.52px}.pl-line-dropdown__input::placeholder{color:var(--txt-mask)}.pl-line-dropdown__icon{display:flex;align-items:center;min-width:16px;background-color:var(--control-mask-fill);mask-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M2.46967%206.53033L3.53033%205.46967L8%209.93934L12.4697%205.46967L13.5303%206.53033L8%2012.0607L2.46967%206.53033Z'%20fill='%23110529'/%3e%3c/svg%3e");-webkit-mask-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M2.46967%206.53033L3.53033%205.46967L8%209.93934L12.4697%205.46967L13.5303%206.53033L8%2012.0607L2.46967%206.53033Z'%20fill='%23110529'/%3e%3c/svg%3e");mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-position:center;-webkit-mask-position:center;mask-size:16px;-webkit-mask-size:16px;width:16px;height:16px}.pl-line-dropdown__icon-clear{mask-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_586_7851)'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M8%2016C12.4183%2016%2016%2012.4183%2016%208C16%203.58172%2012.4183%200%208%200C3.58172%200%200%203.58172%200%208C0%2012.4183%203.58172%2016%208%2016ZM4.46967%205.53033L6.93934%208L4.46967%2010.4697L5.53033%2011.5303L8%209.06066L10.4697%2011.5303L11.5303%2010.4697L9.06066%208L11.5303%205.53033L10.4697%204.46967L8%206.93934L5.53033%204.46967L4.46967%205.53033Z'%20fill='%23CFD1DB'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_586_7851'%3e%3crect%20width='16'%20height='16'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");-webkit-mask-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_586_7851)'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M8%2016C12.4183%2016%2016%2012.4183%2016%208C16%203.58172%2012.4183%200%208%200C3.58172%200%200%203.58172%200%208C0%2012.4183%203.58172%2016%208%2016ZM4.46967%205.53033L6.93934%208L4.46967%2010.4697L5.53033%2011.5303L8%209.06066L10.4697%2011.5303L11.5303%2010.4697L9.06066%208L11.5303%205.53033L10.4697%204.46967L8%206.93934L5.53033%204.46967L4.46967%205.53033Z'%20fill='%23CFD1DB'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_586_7851'%3e%3crect%20width='16'%20height='16'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-position:center;-webkit-mask-position:center;mask-size:16px;-webkit-mask-size:16px;width:16px;height:16px;background-color:var(--color-ic-02)}.pl-line-dropdown.open .pl-line-dropdown__icon{mask-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M8%204.93933L13.5303%2010.4697L12.4697%2011.5303L8%207.06065L3.53033%2011.5303L2.46967%2010.4697L8%204.93933Z'%20fill='%23110529'/%3e%3c/svg%3e");-webkit-mask-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M8%204.93933L13.5303%2010.4697L12.4697%2011.5303L8%207.06065L3.53033%2011.5303L2.46967%2010.4697L8%204.93933Z'%20fill='%23110529'/%3e%3c/svg%3e");mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-position:center;-webkit-mask-position:center;mask-size:16px;-webkit-mask-size:16px;width:16px;height:16px}.pl-line-dropdown.open:after{border-bottom:2px solid var(--border-color-focus)}.pl-line-dropdown__icon-wrapper{padding:4px 2px 4px 0}.pl-line-dropdown.disabled *{color:var(--txt-mask);cursor:not-allowed}.pl-line-dropdown.disabled .pl-line-dropdown__icon{background-color:var(--color-div-grey)!important}.pl-line-dropdown.disabled:after{border-bottom:2px solid var(--color-div-grey)!important}.pl-line-dropdown.disabled:hover:after{border-bottom:2px solid var(--color-div-grey)!important}.pl-line-dropdown__no-item{padding:8px 12px}.pl-line-dropdown__no-item-title{color:var(--txt-03)!important;text-wrap:nowrap;text-overflow:ellipsis;overflow:hidden}.pl-line-dropdown__items{position:absolute;top:0;z-index:var(--z-dropdown-options);border-radius:6px;padding:12px 0;border:1px solid var(--color-div-grey);width:256px;box-sizing:border-box;max-height:320px;background-color:var(--bg-elevated-01);box-shadow:var(--shadow-m);--thumb-color: var(--ic-02);overflow-y:auto}.pl-line-dropdown__items::-webkit-scrollbar{width:var(--scrollbar-width, 6px);height:5px;background-color:transparent;display:block}.pl-line-dropdown__items::-webkit-scrollbar-thumb{background:var(--thumb-color);border-radius:5px}.pl-line-dropdown__items::-webkit-scrollbar-thumb:hover{--thumb-color: var(--border-color-focus)}.pl-line-dropdown__items-tabs{display:flex;position:absolute;top:0;z-index:var(--z-dropdown-options);background-color:var(--color-div-bw);overflow-x:scroll;max-width:400px;padding:6px 12px 12px;border:1px solid var(--color-div-grey);border-radius:6px;box-shadow:var(--shadow-m);--thumb-color: var(--ic-02);overflow-x:auto}.pl-line-dropdown__items-tabs::-webkit-scrollbar{width:var(--scrollbar-width, 6px);height:5px;background-color:transparent;display:block}.pl-line-dropdown__items-tabs::-webkit-scrollbar-thumb{background:var(--thumb-color);border-radius:5px}.pl-line-dropdown__items-tabs::-webkit-scrollbar-thumb:hover{--thumb-color: var(--border-color-focus)}`)), document.head.appendChild(f);
15
+ var b = document.createElement("style");
16
+ b.appendChild(document.createTextNode(`.pl-line-dropdown{display:flex;align-items:center;width:fit-content;padding:8px 0;box-sizing:border-box;position:relative;outline:none;max-width:256px}.pl-line-dropdown:focus-within:after{border-bottom:2px solid var(--border-color-focus)}.pl-line-dropdown__prefix,.pl-line-dropdown__input{text-transform:uppercase}.pl-line-dropdown:hover:after{border-bottom:2px solid var(--border-color-focus)}.pl-line-dropdown:after{content:"";position:absolute;bottom:0;border-bottom:2px solid var(--color-div-grey);width:100%}.pl-line-dropdown *{color:var(--txt-01);font-family:var(--font-family-base);font-size:13px;font-style:normal;font-weight:600;line-height:14px;letter-spacing:.52px}.pl-line-dropdown__input::placeholder{color:var(--txt-mask)}.pl-line-dropdown__icon{display:flex;align-items:center;min-width:16px;background-color:var(--control-mask-fill);mask-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M2.46967%206.53033L3.53033%205.46967L8%209.93934L12.4697%205.46967L13.5303%206.53033L8%2012.0607L2.46967%206.53033Z'%20fill='%23110529'/%3e%3c/svg%3e");-webkit-mask-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M2.46967%206.53033L3.53033%205.46967L8%209.93934L12.4697%205.46967L13.5303%206.53033L8%2012.0607L2.46967%206.53033Z'%20fill='%23110529'/%3e%3c/svg%3e");mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-position:center;-webkit-mask-position:center;mask-size:16px;-webkit-mask-size:16px;width:16px;height:16px}.pl-line-dropdown__icon-clear{mask-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_586_7851)'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M8%2016C12.4183%2016%2016%2012.4183%2016%208C16%203.58172%2012.4183%200%208%200C3.58172%200%200%203.58172%200%208C0%2012.4183%203.58172%2016%208%2016ZM4.46967%205.53033L6.93934%208L4.46967%2010.4697L5.53033%2011.5303L8%209.06066L10.4697%2011.5303L11.5303%2010.4697L9.06066%208L11.5303%205.53033L10.4697%204.46967L8%206.93934L5.53033%204.46967L4.46967%205.53033Z'%20fill='%23CFD1DB'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_586_7851'%3e%3crect%20width='16'%20height='16'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");-webkit-mask-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_586_7851)'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M8%2016C12.4183%2016%2016%2012.4183%2016%208C16%203.58172%2012.4183%200%208%200C3.58172%200%200%203.58172%200%208C0%2012.4183%203.58172%2016%208%2016ZM4.46967%205.53033L6.93934%208L4.46967%2010.4697L5.53033%2011.5303L8%209.06066L10.4697%2011.5303L11.5303%2010.4697L9.06066%208L11.5303%205.53033L10.4697%204.46967L8%206.93934L5.53033%204.46967L4.46967%205.53033Z'%20fill='%23CFD1DB'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_586_7851'%3e%3crect%20width='16'%20height='16'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-position:center;-webkit-mask-position:center;mask-size:16px;-webkit-mask-size:16px;width:16px;height:16px;background-color:var(--color-ic-02)}.pl-line-dropdown.open .pl-line-dropdown__icon{mask-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M8%204.93933L13.5303%2010.4697L12.4697%2011.5303L8%207.06065L3.53033%2011.5303L2.46967%2010.4697L8%204.93933Z'%20fill='%23110529'/%3e%3c/svg%3e");-webkit-mask-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M8%204.93933L13.5303%2010.4697L12.4697%2011.5303L8%207.06065L3.53033%2011.5303L2.46967%2010.4697L8%204.93933Z'%20fill='%23110529'/%3e%3c/svg%3e");mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-position:center;-webkit-mask-position:center;mask-size:16px;-webkit-mask-size:16px;width:16px;height:16px}.pl-line-dropdown.open:after{border-bottom:2px solid var(--border-color-focus)}.pl-line-dropdown__icon-wrapper{padding:4px 2px 4px 0}.pl-line-dropdown.disabled *{color:var(--txt-mask);cursor:not-allowed}.pl-line-dropdown.disabled .pl-line-dropdown__icon{background-color:var(--color-div-grey)!important}.pl-line-dropdown.disabled:after{border-bottom:2px solid var(--color-div-grey)!important}.pl-line-dropdown.disabled:hover:after{border-bottom:2px solid var(--color-div-grey)!important}.pl-line-dropdown__no-item{padding:8px 12px}.pl-line-dropdown__no-item-title{color:var(--txt-03)!important;text-wrap:nowrap;text-overflow:ellipsis;overflow:hidden}.pl-line-dropdown__items{position:absolute;top:0;z-index:var(--z-dropdown-options);border-radius:6px;padding:12px 0;border:1px solid var(--color-div-grey);width:256px;box-sizing:border-box;max-height:320px;background-color:var(--bg-elevated-01);box-shadow:var(--shadow-m);--thumb-color: var(--ic-02);overflow-y:auto}.pl-line-dropdown__items::-webkit-scrollbar{width:var(--scrollbar-width, 6px);height:5px;background-color:transparent;display:block}.pl-line-dropdown__items::-webkit-scrollbar-thumb{background:var(--thumb-color);border-radius:5px}.pl-line-dropdown__items::-webkit-scrollbar-thumb:hover{--thumb-color: var(--border-color-focus)}.pl-line-dropdown__items-tabs{display:flex;position:absolute;top:0;z-index:var(--z-dropdown-options);background-color:var(--color-div-bw);overflow-x:scroll;max-width:400px;padding:6px 12px 12px;border:1px solid var(--color-div-grey);border-radius:6px;box-shadow:var(--shadow-m);--thumb-color: var(--ic-02);overflow-x:auto}.pl-line-dropdown__items-tabs::-webkit-scrollbar{width:var(--scrollbar-width, 6px);height:5px;background-color:transparent;display:block}.pl-line-dropdown__items-tabs::-webkit-scrollbar-thumb{background:var(--thumb-color);border-radius:5px}.pl-line-dropdown__items-tabs::-webkit-scrollbar-thumb:hover{--thumb-color: var(--border-color-focus)}`)), document.head.appendChild(b);
17
17
  }
18
18
  } catch (C) {
19
19
  console.error("vite-plugin-css-injected-by-js", C);
@@ -38,40 +38,40 @@ const ue = { class: "pl-line-dropdown__prefix" }, me = { class: "pl-line-dropdow
38
38
  clearable: { type: Boolean, default: !1 }
39
39
  },
40
40
  emits: ["update:modelValue"],
41
- setup(f, { emit: C }) {
42
- const $ = C, l = f, o = S({
41
+ setup(b, { emit: C }) {
42
+ const D = C, l = b, t = $({
43
43
  isOpen: !1,
44
44
  activeOption: -1,
45
45
  optionsHeight: 0
46
- }), s = g(), m = g(), P = k(() => {
46
+ }), s = k(), v = k(), P = _(() => {
47
47
  const e = [];
48
- return o.isOpen && e.push("open"), l.disabled && e.push("disabled"), e.join(" ");
49
- }), r = g(""), a = ie(W(l, "options"), r), D = k(() => !!(l.clearable && o.isOpen && l.modelValue && c.value)), c = k(() => {
48
+ return t.isOpen && e.push("open"), l.disabled && e.push("disabled"), e.join(" ");
49
+ }), r = k(""), a = ie(W(l, "options"), r), E = _(() => !!(l.clearable && t.isOpen && l.modelValue && c.value)), c = _(() => {
50
50
  if (l.modelValue !== void 0) {
51
51
  const e = q();
52
52
  if (e !== -1)
53
53
  return se(l.options)[e].label;
54
54
  }
55
55
  return "";
56
- }), b = g(c.value);
57
- h(c, (e) => {
58
- b.value = e;
56
+ }), x = k(c.value);
57
+ f(c, (e) => {
58
+ x.value = e;
59
59
  });
60
- const N = k(() => o.isOpen && r.value && r.value.length >= c.value.length - 1 ? r.value : c.value || "...");
60
+ const N = _(() => t.isOpen && r.value && r.value.length >= c.value.length - 1 ? r.value : c.value || "...");
61
61
  te(s, () => {
62
- l.mode === "list" && (o.isOpen = !1);
63
- }), h(
64
- () => b.value,
62
+ l.mode === "list" && (t.isOpen = !1);
63
+ }), f(
64
+ () => x.value,
65
65
  (e) => {
66
66
  c.value !== e ? r.value = e : r.value = "";
67
67
  }
68
- ), h(
69
- () => o.isOpen,
68
+ ), f(
69
+ () => t.isOpen,
70
70
  (e) => {
71
- var t;
72
- e && s.value && ((t = s.value.querySelector("input")) == null || t.focus(), M(() => E()));
71
+ var o;
72
+ e && s.value && ((o = s.value.querySelector("input")) == null || o.focus(), M(() => S()));
73
73
  }
74
- ), h(
74
+ ), f(
75
75
  () => l.modelValue,
76
76
  () => T(),
77
77
  { immediate: !0 }
@@ -80,7 +80,7 @@ const ue = { class: "pl-line-dropdown__prefix" }, me = { class: "pl-line-dropdow
80
80
  return l.options.findIndex((e) => B(e.value, l.modelValue));
81
81
  }
82
82
  function T() {
83
- o.activeOption = ne(
83
+ t.activeOption = ne(
84
84
  a.value.findIndex((e) => B(e.value, l.modelValue)),
85
85
  (e) => e < 0 ? 0 : e
86
86
  );
@@ -89,59 +89,59 @@ const ue = { class: "pl-line-dropdown__prefix" }, me = { class: "pl-line-dropdow
89
89
  r.value = "";
90
90
  }
91
91
  function R() {
92
- l.disabled ? o.isOpen = !1 : M(() => {
93
- o.isOpen = !o.isOpen;
92
+ l.disabled ? t.isOpen = !1 : M(() => {
93
+ t.isOpen = !t.isOpen;
94
94
  });
95
95
  }
96
96
  function K() {
97
- l.mode === "list" && (o.isOpen = !1);
97
+ l.mode === "list" && (t.isOpen = !1);
98
98
  }
99
- function v(e) {
100
- e && ($("update:modelValue", e.value), K(), U());
99
+ function w(e) {
100
+ e && (D("update:modelValue", e.value), K(), U());
101
101
  }
102
- function x(e) {
102
+ function g(e) {
103
103
  return B(e.value, l.modelValue);
104
104
  }
105
105
  const O = (e) => {
106
- var t, i;
106
+ var o, i;
107
107
  const n = e.relatedTarget;
108
- !((t = s.value) != null && t.contains(n)) && !((i = m.value) != null && i.contains(n)) && (r.value = "", o.isOpen = !1);
108
+ !((o = s.value) != null && o.contains(n)) && !((i = v.value) != null && i.contains(n)) && (r.value = "", t.isOpen = !1);
109
109
  };
110
110
  function G(e) {
111
- const { activeOption: t } = o;
112
- if (!o.isOpen && e.code === "Enter") {
113
- o.isOpen = !0;
111
+ const { activeOption: o } = t;
112
+ if (!t.isOpen && e.code === "Enter") {
113
+ t.isOpen = !0;
114
114
  return;
115
115
  }
116
116
  const { length: i } = a.value;
117
117
  if (!i)
118
118
  return;
119
- ["ArrowDown", "ArrowUp", "Enter"].includes(e.code) && e.preventDefault(), e.code === "Enter" && v(a.value[t]);
119
+ ["ArrowDown", "ArrowUp", "Enter"].includes(e.code) && e.preventDefault(), e.code === "Enter" && w(a.value[o]);
120
120
  const n = e.code === "ArrowDown" ? 1 : e.code === "ArrowUp" ? -1 : 0;
121
- o.activeOption = Math.abs(t + n + i) % i, requestAnimationFrame(E);
121
+ t.activeOption = Math.abs(o + n + i) % i, requestAnimationFrame(S);
122
122
  }
123
- function E() {
124
- const e = m.value;
125
- e && re(e.querySelector(".hovered-item"), (t) => {
126
- l.mode === "list" ? de(e, t) : t.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "center" });
123
+ function S() {
124
+ const e = v.value;
125
+ e && re(e.querySelector(".hovered-item"), (o) => {
126
+ l.mode === "list" ? de(e, o) : o.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "center" });
127
127
  });
128
128
  }
129
129
  function J() {
130
- $("update:modelValue", void 0);
130
+ D("update:modelValue", void 0);
131
131
  }
132
- const w = S({
132
+ const h = $({
133
133
  top: "0px",
134
134
  left: "0px"
135
135
  });
136
- return h(m, (e) => {
136
+ return f(v, (e) => {
137
137
  if (e) {
138
- const t = e.getBoundingClientRect();
139
- o.optionsHeight = t.height, window.dispatchEvent(new CustomEvent("adjust"));
138
+ const o = e.getBoundingClientRect();
139
+ t.optionsHeight = o.height, window.dispatchEvent(new CustomEvent("adjust"));
140
140
  }
141
141
  }), ce(s, (e) => {
142
- const t = e.top + e.height + 2;
143
- t + o.optionsHeight > e.clientHeight ? w.top = e.top - o.optionsHeight - 2 + "px" : w.top = t + "px", w.left = e.left + "px";
144
- }), (e, t) => (d(), p("div", {
142
+ const o = e.top + e.height + 2;
143
+ o + t.optionsHeight > e.clientHeight ? h.top = e.top - t.optionsHeight - 2 + "px" : h.top = o + "px", h.left = e.left + "px";
144
+ }), (e, o) => (d(), p("div", {
145
145
  ref_key: "container",
146
146
  ref: s,
147
147
  tabindex: "0",
@@ -152,84 +152,88 @@ const ue = { class: "pl-line-dropdown__prefix" }, me = { class: "pl-line-dropdow
152
152
  }, [
153
153
  u("div", ue, ee(l == null ? void 0 : l.prefix), 1),
154
154
  z(le, {
155
- modelValue: b.value,
156
- "onUpdate:modelValue": t[0] || (t[0] = (i) => b.value = i),
155
+ modelValue: x.value,
156
+ "onUpdate:modelValue": o[0] || (o[0] = (i) => x.value = i),
157
157
  placeholder: N.value,
158
158
  disabled: l.disabled,
159
159
  class: "pl-line-dropdown__input"
160
160
  }, null, 8, ["modelValue", "placeholder", "disabled"]),
161
161
  u("div", me, [
162
162
  F(u("div", ve, null, 512), [
163
- [Z, !D.value]
163
+ [Z, !E.value]
164
164
  ]),
165
165
  F(u("div", {
166
166
  class: "pl-line-dropdown__icon-clear",
167
167
  onClick: J
168
168
  }, null, 512), [
169
- [Z, D.value]
169
+ [Z, E.value]
170
170
  ])
171
171
  ]),
172
- o.isOpen ? (d(), Y(oe, {
172
+ t.isOpen ? (d(), Y(oe, {
173
173
  key: 0,
174
174
  to: "body"
175
175
  }, [
176
176
  l.mode === "list" ? (d(), p("div", {
177
177
  key: 0,
178
178
  ref_key: "list",
179
- ref: m,
180
- style: H(w),
179
+ ref: v,
180
+ style: H(h),
181
181
  tabindex: "-1",
182
182
  class: "pl-line-dropdown__items",
183
- onFocusout: O
183
+ onFocusout: O,
184
+ onClick: o[1] || (o[1] = m(() => {
185
+ }, ["stop"]))
184
186
  }, [
185
- (d(!0), p(I, null, j(L(a), (i, n) => A(e.$slots, "item", {
187
+ (d(!0), p(I, null, j(y(a), (i, n) => A(e.$slots, "item", {
186
188
  key: n,
187
189
  item: i,
188
190
  textItem: "text",
189
- isSelected: x(i),
190
- isHovered: o.activeOption == n,
191
- onClick: y((V) => v(i), ["stop"])
191
+ isSelected: g(i),
192
+ isHovered: t.activeOption == n,
193
+ onClick: m((V) => w(i), ["stop"])
192
194
  }, () => [
193
195
  z(ae, {
194
196
  option: i,
195
197
  "text-item": "text",
196
- "is-selected": x(i),
197
- "is-hovered": o.activeOption == n,
198
+ "is-selected": g(i),
199
+ "is-hovered": t.activeOption == n,
198
200
  size: "medium",
199
- onClick: y((V) => v(i), ["stop"])
201
+ onClick: m((V) => w(i), ["stop"])
200
202
  }, null, 8, ["option", "is-selected", "is-hovered", "onClick"])
201
203
  ])), 128)),
202
- L(a).length === 0 ? (d(), p("div", we, t[1] || (t[1] = [
204
+ y(a).length === 0 ? (d(), p("div", we, o[3] || (o[3] = [
203
205
  u("div", { class: "pl-line-dropdown__no-item-title text-s" }, "Didn't find anything that matched", -1)
204
- ]))) : _("", !0)
206
+ ]))) : L("", !0)
205
207
  ], 36)) : l.mode === "tabs" ? (d(), p("div", {
206
208
  key: 1,
207
209
  ref_key: "list",
208
- ref: m,
209
- style: H(w),
210
+ ref: v,
211
+ style: H(h),
210
212
  tabindex: "-1",
211
213
  class: "pl-line-dropdown__items-tabs",
212
- onFocusout: O
214
+ onFocusout: O,
215
+ onClick: o[2] || (o[2] = m(() => {
216
+ }, ["stop"]))
213
217
  }, [
214
- (d(!0), p(I, null, j(L(a), (i, n) => A(e.$slots, "item", {
218
+ (d(!0), p(I, null, j(y(a), (i, n) => A(e.$slots, "item", {
215
219
  key: n,
216
220
  item: i,
217
- isSelected: x(i),
218
- isHovered: o.activeOption == n,
219
- onClick: y((V) => v(i), ["stop"])
221
+ isSelected: g(i),
222
+ isHovered: t.activeOption == n,
223
+ onClick: m((V) => w(i), ["stop"])
220
224
  }, () => [
221
225
  z(pe, {
222
226
  option: i,
223
- "is-selected": x(i),
224
- "is-hovered": o.activeOption == n,
225
- onClick: y((V) => v(i), ["stop"])
227
+ "is-selected": g(i),
228
+ "is-hovered": t.activeOption == n,
229
+ onClick: m((V) => w(i), ["stop"])
226
230
  }, null, 8, ["option", "is-selected", "is-hovered", "onClick"])
227
231
  ])), 128)),
228
- L(a).length === 0 ? (d(), p("div", he, t[2] || (t[2] = [
232
+ y(a).length === 0 ? (d(), p("div", he, o[4] || (o[4] = [
229
233
  u("div", { class: "pl-line-dropdown__no-item-title text-s" }, "Didn't find anything that matched", -1)
230
- ]))) : _("", !0)
231
- ], 36)) : _("", !0)
232
- ])) : _("", !0)
234
+ ]))) : L("", !0)
235
+ ], 36)) : L("", !0)
236
+ ])) : L("", !0)
233
237
  ], 34));
234
238
  }
235
239
  });
@@ -1 +1 @@
1
- {"version":3,"file":"PlDropdownLine.vue.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlDropdownLine/PlDropdownLine.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport './pl-dropdown-line.scss';\nimport type { StyleValue } from 'vue';\nimport { computed, nextTick, reactive, ref, toRef, watch } from 'vue';\nimport { deepEqual } from '../../helpers/objects';\nimport { useClickOutside } from '../../composition/useClickOutside';\nimport { useFilteredList } from '../../composition/useFilteredList';\nimport ResizableInput from './ResizableInput.vue';\nimport { tapIf, tap } from '../../helpers/functions';\nimport { scrollIntoView } from '../../helpers/dom';\nimport DropdownListItem from '../DropdownListItem.vue';\nimport TabItem from '../TabItem.vue';\nimport type { ListOption } from '../../types';\nimport { normalizeListOptions } from '../../helpers/utils';\nimport { useElementPosition } from '../../composition/usePosition';\n\nconst emit = defineEmits(['update:modelValue']); // at the top always\n\nconst props = withDefaults(\n defineProps<{\n modelValue: unknown;\n disabled?: boolean;\n prefix?: string;\n options: ListOption[]; // @todo extend with size field\n placeholder?: string;\n mode?: 'list' | 'tabs';\n tabsContainerStyles?: StyleValue;\n clearable?: boolean;\n }>(),\n {\n mode: 'list',\n placeholder: 'Select..',\n prefix: '',\n tabsContainerStyles: undefined,\n clearable: false,\n },\n);\n\nconst data = reactive({\n isOpen: false,\n activeOption: -1,\n optionsHeight: 0,\n});\n\nconst container = ref<HTMLElement>();\n\nconst list = ref<HTMLElement>();\n\nconst classes = computed(() => {\n const classesResult = [];\n if (data.isOpen) {\n classesResult.push('open');\n }\n if (props.disabled) {\n classesResult.push('disabled');\n }\n return classesResult.join(' ');\n});\n\nconst searchPhrase = ref<string>('');\n\nconst options = useFilteredList(toRef(props, 'options'), searchPhrase);\n\nconst canShowClearBtn = computed<boolean>(() => !!(props.clearable && data.isOpen && props.modelValue && modelText.value));\n\nconst modelText = computed<string>(() => {\n if (props.modelValue !== undefined) {\n const index = getIndexForModelInItems();\n if (index !== -1) {\n const item = normalizeListOptions(props.options)[index];\n return item.label;\n }\n }\n return '';\n});\n\nconst inputModel = ref(modelText.value);\n\nwatch(modelText, (v) => {\n inputModel.value = v;\n});\n\nconst placeholderVal = computed(() => {\n if (data.isOpen) {\n if (searchPhrase.value && searchPhrase.value.length >= modelText.value.length - 1) {\n return searchPhrase.value;\n }\n }\n\n return modelText.value || '...';\n});\n\nuseClickOutside(container, () => {\n if (props.mode === 'list') {\n data.isOpen = false;\n }\n});\n\nwatch(\n () => inputModel.value,\n (val) => {\n if (modelText.value !== val) {\n searchPhrase.value = val;\n } else {\n searchPhrase.value = '';\n }\n },\n);\n\nwatch(\n () => data.isOpen,\n (value: boolean) => {\n if (value && container.value) {\n container.value.querySelector('input')?.focus();\n nextTick(() => scrollIntoActive());\n }\n },\n);\n\nwatch(\n () => props.modelValue,\n () => updateSelected(),\n { immediate: true },\n);\n\nfunction getIndexForModelInItems(): number | -1 {\n return props.options.findIndex((o: ListOption) => {\n return deepEqual(o.value, props.modelValue);\n });\n}\n\nfunction updateSelected() {\n data.activeOption = tap(\n options.value.findIndex((o: ListOption) => {\n return deepEqual(o.value, props.modelValue);\n }),\n (v) => (v < 0 ? 0 : v),\n );\n}\n\nfunction resetSearchPhrase() {\n searchPhrase.value = '';\n}\n\nfunction toggleList(): void {\n if (props.disabled) {\n data.isOpen = false;\n } else {\n nextTick(() => {\n data.isOpen = !data.isOpen;\n });\n }\n}\n\nfunction closePopupIfNeeded() {\n if (props.mode === 'list') {\n data.isOpen = false;\n }\n}\n\nfunction selectItem(item?: ListOption): void {\n if (item) {\n emit('update:modelValue', item.value);\n closePopupIfNeeded();\n resetSearchPhrase();\n }\n}\n\nfunction isItemSelected(item: ListOption): boolean {\n return deepEqual(item.value, props.modelValue);\n}\n\nconst onFocusOut = (event: FocusEvent) => {\n const relatedTarget = event.relatedTarget as Node | null;\n\n if (!container.value?.contains(relatedTarget) && !list.value?.contains(relatedTarget)) {\n searchPhrase.value = '';\n data.isOpen = false;\n }\n};\n\nfunction handleKeydown(e: { code: string; preventDefault(): void }) {\n const { activeOption } = data;\n\n if (!data.isOpen && e.code === 'Enter') {\n data.isOpen = true;\n return;\n }\n\n const { length } = options.value;\n\n if (!length) {\n return;\n }\n\n if (['ArrowDown', 'ArrowUp', 'Enter'].includes(e.code)) {\n e.preventDefault();\n }\n\n if (e.code === 'Enter') {\n selectItem(options.value[activeOption]);\n }\n\n const d = e.code === 'ArrowDown' ? 1 : e.code === 'ArrowUp' ? -1 : 0;\n\n data.activeOption = Math.abs(activeOption + d + length) % length;\n\n requestAnimationFrame(scrollIntoActive);\n}\n\nfunction scrollIntoActive() {\n const $list = list.value;\n if (!$list) {\n return;\n }\n tapIf($list.querySelector('.hovered-item'), (el: Element) => {\n if (props.mode === 'list') {\n scrollIntoView($list, el as HTMLElement);\n } else {\n el.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n }\n });\n}\n\nfunction clearModel() {\n emit('update:modelValue', undefined);\n}\n\nconst optionsStyle = reactive({\n top: '0px',\n left: '0px',\n});\n\nwatch(list, (el) => {\n if (el) {\n const rect = el.getBoundingClientRect();\n data.optionsHeight = rect.height;\n window.dispatchEvent(new CustomEvent('adjust'));\n }\n});\n\nuseElementPosition(container, (pos) => {\n const gap = 2;\n\n const downTopOffset = pos.top + pos.height + gap;\n\n if (downTopOffset + data.optionsHeight > pos.clientHeight) {\n optionsStyle.top = pos.top - data.optionsHeight - gap + 'px';\n } else {\n optionsStyle.top = downTopOffset + 'px';\n }\n\n optionsStyle.left = pos.left + 'px';\n});\n</script>\n\n<template>\n <div\n ref=\"container\"\n tabindex=\"0\"\n :class=\"classes\"\n class=\"pl-line-dropdown uc-pointer\"\n @keydown=\"handleKeydown\"\n @focusout=\"onFocusOut\"\n @click=\"toggleList\"\n >\n <div class=\"pl-line-dropdown__prefix\">{{ props?.prefix }}</div>\n\n <ResizableInput v-model=\"inputModel\" :placeholder=\"placeholderVal\" :disabled=\"props.disabled\" class=\"pl-line-dropdown__input\" />\n\n <div class=\"pl-line-dropdown__icon-wrapper\">\n <div v-show=\"!canShowClearBtn\" class=\"pl-line-dropdown__icon\" />\n <div v-show=\"canShowClearBtn\" class=\"pl-line-dropdown__icon-clear\" @click=\"clearModel\" />\n </div>\n <Teleport v-if=\"data.isOpen\" to=\"body\">\n <div v-if=\"props.mode === 'list'\" ref=\"list\" :style=\"optionsStyle\" tabindex=\"-1\" class=\"pl-line-dropdown__items\" @focusout=\"onFocusOut\">\n <template v-for=\"(item, index) in options\" :key=\"index\">\n <slot\n name=\"item\"\n :item=\"item\"\n :text-item=\"'text'\"\n :is-selected=\"isItemSelected(item)\"\n :is-hovered=\"data.activeOption == index\"\n @click.stop=\"selectItem(item)\"\n >\n <DropdownListItem\n :option=\"item\"\n :text-item=\"'text'\"\n :is-selected=\"isItemSelected(item)\"\n :is-hovered=\"data.activeOption == index\"\n size=\"medium\"\n @click.stop=\"selectItem(item)\"\n />\n </slot>\n </template>\n\n <div v-if=\"options.length === 0\" class=\"pl-line-dropdown__no-item\">\n <div class=\"pl-line-dropdown__no-item-title text-s\">Didn't find anything that matched</div>\n </div>\n </div>\n <div\n v-else-if=\"props.mode === 'tabs'\"\n ref=\"list\"\n :style=\"optionsStyle\"\n tabindex=\"-1\"\n class=\"pl-line-dropdown__items-tabs\"\n @focusout=\"onFocusOut\"\n >\n <template v-for=\"(item, index) in options\" :key=\"index\">\n <slot name=\"item\" :item=\"item\" :is-selected=\"isItemSelected(item)\" :is-hovered=\"data.activeOption == index\" @click.stop=\"selectItem(item)\">\n <TabItem :option=\"item\" :is-selected=\"isItemSelected(item)\" :is-hovered=\"data.activeOption == index\" @click.stop=\"selectItem(item)\" />\n </slot>\n </template>\n <div v-if=\"options.length === 0\" class=\"pl-line-dropdown__no-item\">\n <div class=\"pl-line-dropdown__no-item-title text-s\">Didn't find anything that matched</div>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n"],"names":["P","__emit","__props","data","I","q","i","B","container","ref","c","classesResult","f","g","z","y","useFilteredList","props","searchPhrase","s","$","u","j","ce","watch","_","h","inputModel","v","useClickOutside","oe","val","value","n","D","updateSelected","S","tap","options","le","r","G","item","deepEqual","l","J","length","t","d","m","$list","se","scrollIntoView","ae","emit","rect","ue","pos","downTopOffset"],"mappings":"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"}
1
+ {"version":3,"file":"PlDropdownLine.vue.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlDropdownLine/PlDropdownLine.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport './pl-dropdown-line.scss';\nimport type { StyleValue } from 'vue';\nimport { computed, nextTick, reactive, ref, toRef, watch } from 'vue';\nimport { deepEqual } from '../../helpers/objects';\nimport { useClickOutside } from '../../composition/useClickOutside';\nimport { useFilteredList } from '../../composition/useFilteredList';\nimport ResizableInput from './ResizableInput.vue';\nimport { tapIf, tap } from '../../helpers/functions';\nimport { scrollIntoView } from '../../helpers/dom';\nimport DropdownListItem from '../DropdownListItem.vue';\nimport TabItem from '../TabItem.vue';\nimport type { ListOption } from '../../types';\nimport { normalizeListOptions } from '../../helpers/utils';\nimport { useElementPosition } from '../../composition/usePosition';\n\nconst emit = defineEmits(['update:modelValue']); // at the top always\n\nconst props = withDefaults(\n defineProps<{\n modelValue: unknown;\n disabled?: boolean;\n prefix?: string;\n options: ListOption[]; // @todo extend with size field\n placeholder?: string;\n mode?: 'list' | 'tabs';\n tabsContainerStyles?: StyleValue;\n clearable?: boolean;\n }>(),\n {\n mode: 'list',\n placeholder: 'Select..',\n prefix: '',\n tabsContainerStyles: undefined,\n clearable: false,\n },\n);\n\nconst data = reactive({\n isOpen: false,\n activeOption: -1,\n optionsHeight: 0,\n});\n\nconst container = ref<HTMLElement>();\n\nconst list = ref<HTMLElement>();\n\nconst classes = computed(() => {\n const classesResult = [];\n if (data.isOpen) {\n classesResult.push('open');\n }\n if (props.disabled) {\n classesResult.push('disabled');\n }\n return classesResult.join(' ');\n});\n\nconst searchPhrase = ref<string>('');\n\nconst options = useFilteredList(toRef(props, 'options'), searchPhrase);\n\nconst canShowClearBtn = computed<boolean>(() => !!(props.clearable && data.isOpen && props.modelValue && modelText.value));\n\nconst modelText = computed<string>(() => {\n if (props.modelValue !== undefined) {\n const index = getIndexForModelInItems();\n if (index !== -1) {\n const item = normalizeListOptions(props.options)[index];\n return item.label;\n }\n }\n return '';\n});\n\nconst inputModel = ref(modelText.value);\n\nwatch(modelText, (v) => {\n inputModel.value = v;\n});\n\nconst placeholderVal = computed(() => {\n if (data.isOpen) {\n if (searchPhrase.value && searchPhrase.value.length >= modelText.value.length - 1) {\n return searchPhrase.value;\n }\n }\n\n return modelText.value || '...';\n});\n\nuseClickOutside(container, () => {\n if (props.mode === 'list') {\n data.isOpen = false;\n }\n});\n\nwatch(\n () => inputModel.value,\n (val) => {\n if (modelText.value !== val) {\n searchPhrase.value = val;\n } else {\n searchPhrase.value = '';\n }\n },\n);\n\nwatch(\n () => data.isOpen,\n (value: boolean) => {\n if (value && container.value) {\n container.value.querySelector('input')?.focus();\n nextTick(() => scrollIntoActive());\n }\n },\n);\n\nwatch(\n () => props.modelValue,\n () => updateSelected(),\n { immediate: true },\n);\n\nfunction getIndexForModelInItems(): number | -1 {\n return props.options.findIndex((o: ListOption) => {\n return deepEqual(o.value, props.modelValue);\n });\n}\n\nfunction updateSelected() {\n data.activeOption = tap(\n options.value.findIndex((o: ListOption) => {\n return deepEqual(o.value, props.modelValue);\n }),\n (v) => (v < 0 ? 0 : v),\n );\n}\n\nfunction resetSearchPhrase() {\n searchPhrase.value = '';\n}\n\nfunction toggleList(): void {\n if (props.disabled) {\n data.isOpen = false;\n } else {\n nextTick(() => {\n data.isOpen = !data.isOpen;\n });\n }\n}\n\nfunction closePopupIfNeeded() {\n if (props.mode === 'list') {\n data.isOpen = false;\n }\n}\n\nfunction selectItem(item?: ListOption): void {\n if (item) {\n emit('update:modelValue', item.value);\n closePopupIfNeeded();\n resetSearchPhrase();\n }\n}\n\nfunction isItemSelected(item: ListOption): boolean {\n return deepEqual(item.value, props.modelValue);\n}\n\nconst onFocusOut = (event: FocusEvent) => {\n const relatedTarget = event.relatedTarget as Node | null;\n\n if (!container.value?.contains(relatedTarget) && !list.value?.contains(relatedTarget)) {\n searchPhrase.value = '';\n data.isOpen = false;\n }\n};\n\nfunction handleKeydown(e: { code: string; preventDefault(): void }) {\n const { activeOption } = data;\n\n if (!data.isOpen && e.code === 'Enter') {\n data.isOpen = true;\n return;\n }\n\n const { length } = options.value;\n\n if (!length) {\n return;\n }\n\n if (['ArrowDown', 'ArrowUp', 'Enter'].includes(e.code)) {\n e.preventDefault();\n }\n\n if (e.code === 'Enter') {\n selectItem(options.value[activeOption]);\n }\n\n const d = e.code === 'ArrowDown' ? 1 : e.code === 'ArrowUp' ? -1 : 0;\n\n data.activeOption = Math.abs(activeOption + d + length) % length;\n\n requestAnimationFrame(scrollIntoActive);\n}\n\nfunction scrollIntoActive() {\n const $list = list.value;\n if (!$list) {\n return;\n }\n tapIf($list.querySelector('.hovered-item'), (el: Element) => {\n if (props.mode === 'list') {\n scrollIntoView($list, el as HTMLElement);\n } else {\n el.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n }\n });\n}\n\nfunction clearModel() {\n emit('update:modelValue', undefined);\n}\n\nconst optionsStyle = reactive({\n top: '0px',\n left: '0px',\n});\n\nwatch(list, (el) => {\n if (el) {\n const rect = el.getBoundingClientRect();\n data.optionsHeight = rect.height;\n window.dispatchEvent(new CustomEvent('adjust'));\n }\n});\n\nuseElementPosition(container, (pos) => {\n const gap = 2;\n\n const downTopOffset = pos.top + pos.height + gap;\n\n if (downTopOffset + data.optionsHeight > pos.clientHeight) {\n optionsStyle.top = pos.top - data.optionsHeight - gap + 'px';\n } else {\n optionsStyle.top = downTopOffset + 'px';\n }\n\n optionsStyle.left = pos.left + 'px';\n});\n</script>\n\n<template>\n <div\n ref=\"container\"\n tabindex=\"0\"\n :class=\"classes\"\n class=\"pl-line-dropdown uc-pointer\"\n @keydown=\"handleKeydown\"\n @focusout=\"onFocusOut\"\n @click=\"toggleList\"\n >\n <div class=\"pl-line-dropdown__prefix\">{{ props?.prefix }}</div>\n\n <ResizableInput v-model=\"inputModel\" :placeholder=\"placeholderVal\" :disabled=\"props.disabled\" class=\"pl-line-dropdown__input\" />\n\n <div class=\"pl-line-dropdown__icon-wrapper\">\n <div v-show=\"!canShowClearBtn\" class=\"pl-line-dropdown__icon\" />\n <div v-show=\"canShowClearBtn\" class=\"pl-line-dropdown__icon-clear\" @click=\"clearModel\" />\n </div>\n <Teleport v-if=\"data.isOpen\" to=\"body\">\n <div\n v-if=\"props.mode === 'list'\"\n ref=\"list\"\n :style=\"optionsStyle\"\n tabindex=\"-1\"\n class=\"pl-line-dropdown__items\"\n @focusout=\"onFocusOut\"\n @click.stop\n >\n <template v-for=\"(item, index) in options\" :key=\"index\">\n <slot\n name=\"item\"\n :item=\"item\"\n :text-item=\"'text'\"\n :is-selected=\"isItemSelected(item)\"\n :is-hovered=\"data.activeOption == index\"\n @click.stop=\"selectItem(item)\"\n >\n <DropdownListItem\n :option=\"item\"\n :text-item=\"'text'\"\n :is-selected=\"isItemSelected(item)\"\n :is-hovered=\"data.activeOption == index\"\n size=\"medium\"\n @click.stop=\"selectItem(item)\"\n />\n </slot>\n </template>\n\n <div v-if=\"options.length === 0\" class=\"pl-line-dropdown__no-item\">\n <div class=\"pl-line-dropdown__no-item-title text-s\">Didn't find anything that matched</div>\n </div>\n </div>\n <div\n v-else-if=\"props.mode === 'tabs'\"\n ref=\"list\"\n :style=\"optionsStyle\"\n tabindex=\"-1\"\n class=\"pl-line-dropdown__items-tabs\"\n @focusout=\"onFocusOut\"\n @click.stop\n >\n <template v-for=\"(item, index) in options\" :key=\"index\">\n <slot name=\"item\" :item=\"item\" :is-selected=\"isItemSelected(item)\" :is-hovered=\"data.activeOption == index\" @click.stop=\"selectItem(item)\">\n <TabItem :option=\"item\" :is-selected=\"isItemSelected(item)\" :is-hovered=\"data.activeOption == index\" @click.stop=\"selectItem(item)\" />\n </slot>\n </template>\n <div v-if=\"options.length === 0\" class=\"pl-line-dropdown__no-item\">\n <div class=\"pl-line-dropdown__no-item-title text-s\">Didn't find anything that matched</div>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n"],"names":["P","__emit","__props","data","I","q","i","n","B","container","ref","u","classesResult","m","y","z","O","useFilteredList","props","searchPhrase","s","$","p","j","ue","watch","w","_","inputModel","v","useClickOutside","oe","val","value","t","D","E","updateSelected","S","tap","options","le","G","item","deepEqual","l","J","length","o","d","$list","se","scrollIntoView","re","emit","rect","pe","pos","downTopOffset"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBA,MAAAA,GAAaC,EAAAA,MAECC,EAAAA,GAoBRC;AAAgB,UACZC,IAAAC,GAAAC,IAAAN,GAAAO,IAAAC,EAAA;AAAA,MACR,QAAc;AAAA,MACd,cAAe;AAAA,MAGXC,eAEOC;AAAAA,IAGX,CAAA,GAAAC,IAAMC,KAAiBC,IAAAC,KAAAC,IAAAC,EAAA,MAAA;AACvB,YAAA,IAAS,CAAA;AAOV,aAEoBN,EAAc,UAEnBO,EAAsBC,KAAgB,MAAA,GAAAZ,EAAGa,YAEf,EAAA,KAASD,UAAM,GAAA,EAAaf,KAAK,GAAA;AAAA,IAGrEe,CAAAA,GAAAA,IAAMJ,gBAA0BR,GAAA,SAAA,GAAAc,CAAA,GAAAC,IAAAL,EAAA,MAAA,CAAA,EAAAV,EAAA,aAAAC,EAAA,UAAAD,EAAA,cAAAgB,EAAA,MAAA,GAAAA,IAAAN,EAAA,MAAA;AAClC,UAAAV,EAAA,eAAsC,QAAA;AACtC,cAAc,IAAAiB,EAAA;AAEZ,YAAA,MADkCL;AAEpC,iBAAAM,GAAAlB,EAAA,OAAA,EAAA,CAAA,EAAA;AAAA,MAEK;AACR,aAEkBI;AAAAA,IAEbe,CAAAA,GAAWC,IAAOZ,EAAAQ,EAAA,KAAA;AACtBK,IAAAA,EAAAC,GAAmBC,CAAAA,MAAAA;AACpBH,MAAAA,EAAA,QAAA;AAAA,IAEK,CAAA;AAUNI,UAA2B,IAAMd,EAAA,MAAAT,EAAA,UAAAa,EAAA,SAAAA,EAAA,MAAA,UAAAE,EAAA,MAAA,SAAA,IAAAF,EAAA,QAAAE,EAAA,SAAA,KAAA;AAC3BS,IAAAA,GAAMpB,GAAA,MAAA;AAKZc,MAAAA,EAAAA,SAAAA,WAAAA,EAAAA,SAAAA;AAAAA,IAAA,CAAA;MAEE,MAASC,EAAA;AAAA,MACH,CAAA,MAAoBM;AAIxB,QAAAV,EAAA,UAAA,IAAAF,EAAA,QAAA,IAAAA,EAAA,QAAA;AAAA,MAAA;AAAA,IAIJ;MAEE,MAAoBb,EAAA;AAAA;AACd0B,YAASxB;AAGb,aAAAE,EAAA,WAAAuB,IAAAvB,EAAA,MAAA,cAAA,OAAA,MAAA,QAAAuB,EAAA,MAAA,GAAAC,EAAA,MAAAC,EAAA,CAAA;AAAA,MAAA;AAAA,IAIJ;MAEE,MAAMC,EAAe;AAAA,MACrB;MACF,EAAA,WAAA,GAAA;AAAA,IAEA;AACSnB,aAAAA,IAAc;AAEpB,aAAAZ,EAAA,QAAA,UAAA,CAAA,MAAAgC,EAAA,EAAA,OAAAhC,EAAA,UAAA,CAAA;AAAA,IAGH;AACE,aAAoBiC,IAAAA;AAClBC,MAAAA,EAAAA,eAAcC;AAAAA,QAGd,EAACZ,MAAW,UAAQA,CAAAA,MAAAA,EAAAA,EAAAA,OAAAA,EAAAA,UAAAA,CAAAA;AAAAA,QACtB,CAAA,MAAA,IAAA,IAAA,IAAA;AAAA,MAAA;AAAA,IAGF;AACE,aAAqB,IAAA;AAAAT,MAAAA,EAAA,QAAA;AAAA,IAGvB;AACE,aACEjB,IAAAA;AAGOA,MAAAA,EAAAA,WAASI,EAAM,SAAA,KAAA4B,EAAA,MAAA;AACrB,QAAA5B,EAAA,SAAA,CAAAA,EAAA;AAAA,MAAA,CACH;AAAA,IAGF;AACM,aAAMmC,IAAS;AAEnB,MAAApC,EAAA,SAAA,WAAAC,EAAA,SAAA;AAAA,IAGF;AACMoC,eACwBA,GAAAA;AAG5B,YAAAvC,EAAA,qBAAA,EAAA,KAAA,GAAAsC,EAAA,GAAA;IAGF;AACE,aAAOE,EAAUD,GAAYzB;AAAgB,aAAAoB,EAAA,EAAA,OAAAhC,EAAA,UAAA;AAAA,IAGzC;;AACJ,UAAA;AAEI,gBAAW,EAAA;AAIjB,SAAA,IAAAK,EAAA,UAAA,QAAA,EAAA,SAAAuB,CAAA,MAAA,GAAAW,IAAAhC,EAAA,UAAA,QAAAgC,EAAA,SAAAX,CAAA,OAAAd,EAAA,QAAA,IAAAb,EAAA,SAAA;AAAA,IAEA;AACQ,aAAAuC;AAEN,YAAK3C,EAAe,oBAAWI;AAC7B,UAAK,CAASA,EAAA,UAAA,EAAA,SAAA,SAAA;AACd,QAAAA,EAAA,SAAA;AAAA;AAAA,MAGI;AAEN,YAAKwC,EAAAA,QAAAA,EAAAA,IAAAA,EAAAA;AACH,UAAA,CAAAC;AAGgB;AAQZC,OAAAA,aAAe,WAAA,OAAA,EAAA,SAAoB,EAAA,IAAA,sBAA0B,GAAA,EAAA,SAAA,WAAApB,EAAA,EAAA,MAAAK,CAAA,CAAA;AAEnE/B,YAAoB0C,IAAA,EAAA,SAAA,cAAkC,IAAIE,EAE1D,SAAA,YAAA,KAAsC;AAAA,MAAAxC,EAAA,eAAA,KAAA,IAAA2B,IAAAW,IAAAG,CAAA,IAAAA,GAAA,sBAAAZ,CAAA;AAAA,IAGxC;AACE,iBAAmB;AACdc,YAGCA,IAAMrC;AACN,WAAMsC,GAAA,EAAA,cACRC,eAEG,GAAA,CAAAlB,MAAA;AAEN,QAAA5B,EAAA,SAAA,SAAA+C,GAAA,GAAAnB,CAAA,IAAAA,EAAA,eAAA,EAAA,UAAA,UAAA,OAAA,WAAA,QAAA,UAAA;AAAA,MAAA,CAAA;AAAA,IAGH;AACEoB;AAAmC,MAAAlD,EAAA,qBAAA,MAAA;AAAA,IAGrC;AAA8B,UACvB,IAAAI,EAAA;AAAA,MACL,KAAM;AAAA,MACP,MAAA;AAAA,IAEK,CAAAiB;AACJ,WAAQE,EAAAd,GAAA,CAAA,MAAA;AACA0C,UAAAA,GAAAA;AACNpD,0CACO;AAAuC,QAAAI,EAAA,gBAAA2B,EAAA,QAAA,OAAA,cAAA,IAAA,YAAA,QAAA,CAAA;AAAA,MAAA;AAAA,IAOhD,CAAA,GAAAsB,GAAA7C,GAAsB8C,CAAAA,MAAUA;AAE5BC,YAAqB,IAAgBD,EAAAA,MAAAA,EAAAA;AAO1C,UAAAlD,EAAA,gBAAA,EAAA,eAAA,EAAA,MAAA,EAAA,MAAAA,EAAA,gBAAA,IAAA,OAAA,EAAA,MAAA,IAAA,MAAA,EAAA,OAAA,EAAA,OAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,11 +1,11 @@
1
- import { defineComponent as Q, useSlots as W, ref as N, useTemplateRef as X, reactive as oo, computed as c, unref as a, createElementBlock as d, watch as eo, watchPostEffect as lo, openBlock as i, createElementVNode as s, createCommentVNode as u, normalizeClass as ro, createBlock as m, createVNode as to, withDirectives as io, vModelText as no, Fragment as C, renderList as V, withModifiers as z, withCtx as b, createTextVNode as O, toDisplayString as v, renderSlot as I } from "vue";
1
+ import { defineComponent as Q, useSlots as W, ref as N, useTemplateRef as X, reactive as oo, computed as c, unref as a, createElementBlock as d, watch as eo, watchPostEffect as lo, openBlock as i, createElementVNode as s, createCommentVNode as u, normalizeClass as ro, createBlock as m, createVNode as to, withDirectives as io, vModelText as no, Fragment as C, renderList as V, withModifiers as z, withCtx as b, createTextVNode as O, toDisplayString as v, renderSlot as q } from "vue";
2
2
  import { tap as ao } from "../../helpers/functions.js";
3
3
  import po from "../PlTooltip/PlTooltip.vue.js";
4
- import P from "../PlChip/PlChip.vue.js";
4
+ import I from "../PlChip/PlChip.vue.js";
5
5
  import so from "../../utils/DoubleContour.vue.js";
6
6
  import { useLabelNotch as co } from "../../utils/useLabelNotch.js";
7
7
  import uo from "../DropdownListItem.vue.js";
8
- import { deepEqual as _, deepIncludes as T } from "../../helpers/objects.js";
8
+ import { deepEqual as _, deepIncludes as P } from "../../helpers/objects.js";
9
9
  import { normalizeListOptions as ho } from "../../helpers/utils.js";
10
10
  import mo from "../../utils/DropdownOverlay/DropdownOverlay.vue.js";
11
11
  import vo from "../PlIcon24/PlIcon24.vue.js";
@@ -35,7 +35,7 @@ const go = ["tabindex"], xo = { class: "pl-dropdown-multi__container" }, bo = {
35
35
  class: "pl-dropdown-multi__helper"
36
36
  }, Mo = {
37
37
  name: "PlDropdownMulti"
38
- }, qo = /* @__PURE__ */ Q({
38
+ }, Uo = /* @__PURE__ */ Q({
39
39
  ...Mo,
40
40
  props: {
41
41
  modelValue: { default: () => [] },
@@ -49,7 +49,7 @@ const go = ["tabindex"], xo = { class: "pl-dropdown-multi__container" }, bo = {
49
49
  },
50
50
  emits: ["update:modelValue"],
51
51
  setup(w, { emit: k }) {
52
- const U = k, B = (o) => U("update:modelValue", o), q = W(), n = w, h = N(), M = N(), f = X("overlay"), l = oo({
52
+ const T = k, B = (o) => T("update:modelValue", o), U = W(), n = w, h = N(), M = N(), f = X("overlay"), l = oo({
53
53
  search: "",
54
54
  activeOption: -1,
55
55
  open: !1,
@@ -61,18 +61,18 @@ const go = ["tabindex"], xo = { class: "pl-dropdown-multi__container" }, bo = {
61
61
  return e.label.toLowerCase().includes(t) ? !0 : typeof e.value == "string" ? e.value.toLowerCase().includes(t) : e.value === l.search;
62
62
  }) : [...r]).map((e) => ({
63
63
  ...e,
64
- selected: T(o, e.value)
64
+ selected: P(o, e.value)
65
65
  }));
66
- }), $ = c(() => n.options === void 0), L = c(() => $.value ? !0 : n.disabled), j = c(() => L.value ? void 0 : "0"), S = () => {
66
+ }), A = c(() => n.options === void 0), L = c(() => A.value ? !0 : n.disabled), j = c(() => L.value ? void 0 : "0"), S = () => {
67
67
  l.activeOption = ao(
68
68
  x.value.findIndex((o) => _(o.value, n.modelValue)),
69
69
  (o) => o < 0 ? 0 : o
70
70
  );
71
- }, A = (o) => {
71
+ }, H = (o) => {
72
72
  var r;
73
73
  const e = a(g);
74
- B(T(e, o) ? e.filter((t) => !_(t, o)) : [...e, o]), l.search = "", (r = h == null ? void 0 : h.value) == null || r.focus();
75
- }, H = (o) => B(a(g).filter((r) => !_(r, o))), K = () => {
74
+ B(P(e, o) ? e.filter((t) => !_(t, o)) : [...e, o]), l.search = "", (r = h == null ? void 0 : h.value) == null || r.focus();
75
+ }, $ = (o) => B(a(g).filter((r) => !_(r, o))), K = () => {
76
76
  var o;
77
77
  return (o = M.value) == null ? void 0 : o.focus();
78
78
  }, Y = () => {
@@ -92,7 +92,7 @@ const go = ["tabindex"], xo = { class: "pl-dropdown-multi__container" }, bo = {
92
92
  const p = a(x), { length: y } = p;
93
93
  if (!y)
94
94
  return;
95
- ["ArrowDown", "ArrowUp", "Enter"].includes(o.code) && o.preventDefault(), o.code === "Enter" && A(p[t].value);
95
+ ["ArrowDown", "ArrowUp", "Enter"].includes(o.code) && o.preventDefault(), o.code === "Enter" && H(p[t].value);
96
96
  const J = o.code === "ArrowDown" ? 1 : o.code === "ArrowUp" ? -1 : 0;
97
97
  l.activeOption = Math.abs(t + J + y) % y, requestAnimationFrame(() => {
98
98
  var F;
@@ -135,12 +135,12 @@ const go = ["tabindex"], xo = { class: "pl-dropdown-multi__container" }, bo = {
135
135
  [no, l.search]
136
136
  ]),
137
137
  l.open ? u("", !0) : (i(), d("div", ko, [
138
- (i(!0), d(C, null, V(Z.value, (e, t) => (i(), m(a(P), {
138
+ (i(!0), d(C, null, V(Z.value, (e, t) => (i(), m(a(I), {
139
139
  key: t,
140
140
  closeable: "",
141
141
  small: "",
142
142
  onClick: r[2] || (r[2] = z((p) => l.open = !0, ["stop"])),
143
- onClose: (p) => H(e.value)
143
+ onClose: (p) => $(e.value)
144
144
  }, {
145
145
  default: b(() => [
146
146
  O(v(e.label || e.value), 1)
@@ -149,11 +149,11 @@ const go = ["tabindex"], xo = { class: "pl-dropdown-multi__container" }, bo = {
149
149
  }, 1032, ["onClose"]))), 128))
150
150
  ])),
151
151
  s("div", Lo, [
152
- $.value ? (i(), m(a(vo), {
152
+ A.value ? (i(), m(a(vo), {
153
153
  key: 0,
154
154
  name: "loading"
155
155
  })) : u("", !0),
156
- I(o.$slots, "append"),
156
+ q(o.$slots, "append"),
157
157
  s("div", {
158
158
  class: "pl-dropdown-multi__arrow-wrapper",
159
159
  onClick: z(Y, ["stop"])
@@ -165,13 +165,13 @@ const go = ["tabindex"], xo = { class: "pl-dropdown-multi__container" }, bo = {
165
165
  o.label ? (i(), d("label", yo, [
166
166
  o.required ? (i(), m(wo, { key: 0 })) : u("", !0),
167
167
  s("span", null, v(o.label), 1),
168
- a(q).tooltip ? (i(), m(a(po), {
168
+ a(U).tooltip ? (i(), m(a(po), {
169
169
  key: 1,
170
170
  class: "info",
171
171
  position: "top"
172
172
  }, {
173
173
  tooltip: b(() => [
174
- I(o.$slots, "tooltip")
174
+ q(o.$slots, "tooltip")
175
175
  ]),
176
176
  _: 3
177
177
  })) : u("", !0)
@@ -188,11 +188,11 @@ const go = ["tabindex"], xo = { class: "pl-dropdown-multi__container" }, bo = {
188
188
  }, {
189
189
  default: b(() => [
190
190
  s("div", Co, [
191
- (i(!0), d(C, null, V(Z.value, (e, t) => (i(), m(a(P), {
191
+ (i(!0), d(C, null, V(Z.value, (e, t) => (i(), m(a(I), {
192
192
  key: t,
193
193
  closeable: "",
194
194
  small: "",
195
- onClose: (p) => H(e.value)
195
+ onClose: (p) => $(e.value)
196
196
  }, {
197
197
  default: b(() => [
198
198
  O(v(e.label || e.value), 1)
@@ -208,7 +208,7 @@ const go = ["tabindex"], xo = { class: "pl-dropdown-multi__container" }, bo = {
208
208
  "is-hovered": l.activeOption == t,
209
209
  size: "medium",
210
210
  "use-checkbox": "",
211
- onClick: z((p) => A(e.value), ["stop"])
211
+ onClick: z((p) => H(e.value), ["stop"])
212
212
  }, null, 8, ["option", "is-selected", "is-hovered", "onClick"]))), 128)),
213
213
  x.value.length ? u("", !0) : (i(), d("div", Vo, "Nothing found"))
214
214
  ]),
@@ -222,6 +222,6 @@ const go = ["tabindex"], xo = { class: "pl-dropdown-multi__container" }, bo = {
222
222
  }
223
223
  });
224
224
  export {
225
- qo as default
225
+ Uo as default
226
226
  };
227
227
  //# sourceMappingURL=PlDropdownMulti.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlDropdownMulti.vue.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlDropdownMulti/PlDropdownMulti.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * A component for selecting multiple values from a list of options\n */\nexport default {\n name: 'PlDropdownMulti',\n};\n</script>\n\n<script lang=\"ts\" setup generic=\"M = unknown\">\nimport './pl-dropdown-multi.scss';\nimport { computed, reactive, ref, unref, useSlots, useTemplateRef, watch, watchPostEffect } from 'vue';\nimport { tap } from '../../helpers/functions';\nimport { PlTooltip } from '../PlTooltip';\nimport { PlChip } from '../PlChip';\nimport DoubleContour from '../../utils/DoubleContour.vue';\nimport { useLabelNotch } from '../../utils/useLabelNotch';\nimport type { ListOption } from '../../types';\nimport DropdownListItem from '../DropdownListItem.vue';\nimport { deepEqual, deepIncludes } from '../../helpers/objects';\nimport { normalizeListOptions } from '../../helpers/utils';\nimport DropdownOverlay from '../../utils/DropdownOverlay/DropdownOverlay.vue';\nimport { PlMaskIcon24 } from '../PlMaskIcon24';\nimport SvgRequired from '../../generated/components/svg/images/SvgRequired.vue';\nimport { getErrorMessage } from '../../helpers/error.ts';\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: M[]): void;\n}>();\n\nconst emitModel = (v: M[]) => emit('update:modelValue', v);\n\nconst slots = useSlots();\n\nconst props = withDefaults(\n defineProps<{\n /**\n * The current selected values.\n */\n modelValue: M[];\n /**\n * The label text for the dropdown field (optional)\n */\n label?: string;\n /**\n * List of available options for the dropdown\n */\n options?: Readonly<ListOption<M>[]>;\n /**\n * A helper text displayed below the dropdown when there are no errors (optional).\n */\n helper?: string;\n /**\n * Error message displayed below the dropdown (optional)\n */\n error?: unknown;\n /**\n * Placeholder text shown when no value is selected.\n */\n placeholder?: string;\n /**\n * If `true`, the dropdown component is marked as required.\n */\n required?: boolean;\n /**\n * If `true`, the dropdown component is disabled and cannot be interacted with.\n */\n disabled?: boolean;\n }>(),\n {\n modelValue: () => [],\n label: undefined,\n helper: undefined,\n error: undefined,\n placeholder: '...',\n required: false,\n disabled: false,\n options: undefined,\n },\n);\n\nconst rootRef = ref<HTMLElement | undefined>();\nconst input = ref<HTMLInputElement | undefined>();\n\nconst overlay = useTemplateRef('overlay');\n\nconst data = reactive({\n search: '',\n activeOption: -1,\n open: false,\n optionsHeight: 0,\n});\n\nconst selectedValuesRef = computed(() => (Array.isArray(props.modelValue) ? props.modelValue : []));\n\nconst placeholderRef = computed(() => {\n if (data.open && props.modelValue.length > 0) {\n return props.placeholder;\n }\n\n return props.modelValue.length > 0 ? '' : props.placeholder;\n});\n\nconst normalizedOptionsRef = computed(() => normalizeListOptions(props.options ?? []));\n\nconst selectedOptionsRef = computed(() => {\n return selectedValuesRef.value.map((v) => normalizedOptionsRef.value.find((opt) => deepEqual(opt.value, v))).filter((v) => v !== undefined);\n});\n\nconst filteredOptionsRef = computed(() => {\n const selectedValues = unref(selectedValuesRef);\n\n const options = unref(normalizedOptionsRef);\n\n return (\n data.search\n ? options.filter((opt) => {\n const search = data.search.toLowerCase();\n\n if (opt.label.toLowerCase().includes(search)) {\n return true;\n }\n\n if (typeof opt.value === 'string') {\n return opt.value.toLowerCase().includes(search);\n }\n\n return opt.value === data.search;\n })\n : [...options]\n ).map((opt) => ({\n ...opt,\n selected: deepIncludes(selectedValues, opt.value),\n }));\n});\n\nconst isLoadingOptions = computed(() => {\n return props.options === undefined;\n});\n\nconst isDisabled = computed(() => {\n if (isLoadingOptions.value) {\n return true;\n }\n\n return props.disabled;\n});\n\nconst tabindex = computed(() => (isDisabled.value ? undefined : '0'));\n\nconst updateActiveOption = () => {\n data.activeOption = tap(\n filteredOptionsRef.value.findIndex((o) => deepEqual(o.value, props.modelValue)),\n (v) => (v < 0 ? 0 : v),\n );\n};\n\nconst selectOption = (v: M) => {\n const values = unref(selectedValuesRef);\n emitModel(deepIncludes(values, v) ? values.filter((it) => !deepEqual(it, v)) : [...values, v]);\n data.search = '';\n rootRef?.value?.focus();\n};\n\nconst unselectOption = (d: M) => emitModel(unref(selectedValuesRef).filter((v) => !deepEqual(v, d)));\n\nconst setFocusOnInput = () => input.value?.focus();\n\nconst toggleModel = () => {\n data.open = !data.open;\n if (!data.open) {\n data.search = '';\n }\n};\n\nconst onFocusOut = (event: FocusEvent) => {\n const relatedTarget = event.relatedTarget as Node | null;\n\n if (!rootRef.value?.contains(relatedTarget) && !overlay.value?.listRef?.contains(relatedTarget)) {\n data.search = '';\n data.open = false;\n }\n};\n\nconst handleKeydown = (e: { code: string; preventDefault(): void }) => {\n const { open, activeOption } = data;\n\n if (!open) {\n if (e.code === 'Enter') {\n data.open = true;\n }\n return;\n }\n\n if (e.code === 'Escape') {\n data.open = false;\n rootRef.value?.focus();\n }\n\n const filteredOptions = unref(filteredOptionsRef);\n\n const { length } = filteredOptions;\n\n if (!length) {\n return;\n }\n\n if (['ArrowDown', 'ArrowUp', 'Enter'].includes(e.code)) {\n e.preventDefault();\n }\n\n if (e.code === 'Enter') {\n selectOption(filteredOptions[activeOption].value);\n }\n\n const d = e.code === 'ArrowDown' ? 1 : e.code === 'ArrowUp' ? -1 : 0;\n\n data.activeOption = Math.abs(activeOption + d + length) % length;\n\n requestAnimationFrame(() => overlay.value?.scrollIntoActive());\n};\n\nuseLabelNotch(rootRef);\n\nwatch(\n () => props.modelValue,\n () => updateActiveOption(),\n { immediate: true },\n);\n\nwatchPostEffect(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n data.search;\n\n if (data.open) {\n overlay.value?.scrollIntoActive();\n }\n});\n</script>\n\n<template>\n <div class=\"pl-dropdown-multi__envelope\" @click=\"setFocusOnInput\">\n <div\n ref=\"rootRef\"\n :tabindex=\"tabindex\"\n class=\"pl-dropdown-multi\"\n :class=\"{ open: data.open, error, disabled: isDisabled }\"\n @keydown=\"handleKeydown\"\n @focusout=\"onFocusOut\"\n >\n <div class=\"pl-dropdown-multi__container\">\n <div class=\"pl-dropdown-multi__field\">\n <input\n ref=\"input\"\n v-model=\"data.search\"\n type=\"text\"\n tabindex=\"-1\"\n :disabled=\"isDisabled\"\n :placeholder=\"placeholderRef\"\n spellcheck=\"false\"\n autocomplete=\"chrome-off\"\n @focus=\"data.open = true\"\n />\n <div v-if=\"!data.open\" class=\"chips-container\">\n <PlChip v-for=\"(opt, i) in selectedOptionsRef\" :key=\"i\" closeable small @click.stop=\"data.open = true\" @close=\"unselectOption(opt.value)\">\n {{ opt.label || opt.value }}\n </PlChip>\n </div>\n\n <div class=\"pl-dropdown-multi__controls\">\n <PlMaskIcon24 v-if=\"isLoadingOptions\" name=\"loading\" />\n <slot name=\"append\" />\n <div class=\"pl-dropdown-multi__arrow-wrapper\" @click.stop=\"toggleModel\">\n <div class=\"arrow-icon arrow-icon-default\" />\n </div>\n </div>\n </div>\n <label v-if=\"label\">\n <SvgRequired v-if=\"required\" />\n <span>{{ label }}</span>\n <PlTooltip v-if=\"slots.tooltip\" class=\"info\" position=\"top\">\n <template #tooltip>\n <slot name=\"tooltip\" />\n </template>\n </PlTooltip>\n </label>\n <DropdownOverlay\n v-if=\"data.open\"\n ref=\"overlay\"\n :root=\"rootRef\"\n class=\"pl-dropdown-multi__options\"\n :gap=\"5\"\n tabindex=\"-1\"\n @focusout=\"onFocusOut\"\n >\n <div class=\"pl-dropdown-multi__open-chips-container\">\n <PlChip v-for=\"(opt, i) in selectedOptionsRef\" :key=\"i\" closeable small @close=\"unselectOption(opt.value)\">\n {{ opt.label || opt.value }}\n </PlChip>\n </div>\n <DropdownListItem\n v-for=\"(item, index) in filteredOptionsRef\"\n :key=\"index\"\n :option=\"item\"\n :text-item=\"'text'\"\n :is-selected=\"item.selected\"\n :is-hovered=\"data.activeOption == index\"\n size=\"medium\"\n use-checkbox\n @click.stop=\"selectOption(item.value)\"\n />\n <div v-if=\"!filteredOptionsRef.length\" class=\"nothing-found\">Nothing found</div>\n </DropdownOverlay>\n <DoubleContour class=\"pl-dropdown-multi__contour\" />\n </div>\n </div>\n <div v-if=\"error\" class=\"pl-dropdown-multi__error\">{{ getErrorMessage(error) }}</div>\n <div v-else-if=\"helper\" class=\"pl-dropdown-multi__helper\">{{ helper }}</div>\n </div>\n</template>\n"],"names":["Ee","emit","emitModel","v","P","S","V","e","U","Y","s","z","c","N","$","h","Z","t","ee","_","selectedValues","options","unref","K","p","A","pe","E","l","k","w","a","search","o","opt","n","deepIncludes","x","isLoadingOptions","D","tap","filteredOptionsRef","ae","selectOption","values","deepEqual","data","event","rootRef","i","L","length","filteredOptions","d","M","W","I","useLabelNotch","oe","updateActiveOption"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAIe;AAAA,GACPA,KAAA;AAAA,EACR,MAAA;;;;;;;;;;;;;;EAoBMC,MAAAA,GAAAA,EAAAA,MAIAC,EAAAA,GAAaC;AAwDG,UACZC,IAAAC,GAAAC,IAAA,CAAAC,MAAAH,EAAA,qBAAAG,CAAA,GAAAC,IAAAC,EAAA,GAAAC,IAAAC,GAAAC,IAAAC,KAAAC,IAAAD,EAAA,GAAAE,IAAAC,EAAA,SAAA,GAAAC,IAAAC,GAAA;AAAA,MACR,QAAc;AAAA,MACd,cAAM;AAAA,MACN,MAAe;AAAA,MAChB,eAE+C;AAAA,IAiBxC,CAAA,GAAAC,IAAAC,QAEAC,MAAUC,QAA0BZ,EAAA,UAAA,IAAAA,EAAA,aAAA,CAAA,CAAA,GAAAa,IAAAC,EAAA,MAAAP,EAAA,QAAAP,EAAA,WAAA,SAAA,IAAAA,EAAA,cAAAA,EAAA,WAAA,SAAA,IAAA,KAAAA,EAAA,WAAA,GAAAe,IAAAD,EAAA,MAAAE,GAAAhB,EAAA,WAAA,CAAA,CAAA,CAAA,GAAAiB,IAAAH,EAAA,MAAAL,EAAA,MAAA,IAAA,CAAAZ,MAAAkB,EAAA,MAAA,KAAA,CAAAG,MAAAC,EAAAD,EAAA,OAAArB,CAAA,CAAA,CAAA,EAAA,OAAA,CAAAA,MAAAA,MAAA,MAAA,CAAA,GAAAuB,IAAAN,EAAA,MAAA;AAE1C,YAAAjB,IACOwB,EAAAZ,CAAA,GAAAS,IACOG,EAAAN,CAAA;AACFO,cAAAA,EAAAA,SAAcJ,EAAO,OAAY,CAAAK,MAAA;AAEnCC,cAAAA,aAAwB;eAUxBb,EACR,MAAI,cAAU,SAAAc,CAAA,IAAA,KAAA,OAAAF,EAAA,SAAA,WAAAA,EAAA,MAAA,YAAA,EAAA,SAAAE,CAAA,IAAAF,EAAA,UAAAhB,EAAA;AAAA,MAAA,CAAA,IACXiB,CAAAA,GAAAA,CAAAA,GAAAA,IAAAA,CAAAA,OAAAA;AAAAA,QACH,GAAUE;AAAAA,QACV,UAAAC,EAAA9B,GAAA0B,EAAA,KAAA;AAAA,MAAA,EAGEK;AAAAA,IAeJ,CAAA,GAAKC,IAAeC,EAAAA,MAAAA,EAAAA,YAAAA,MAAAA,GAAAA,IAAAA,EAAAA,MAAAA,EAAAA,QAAAA,KAAAA,EAAAA,QAAAA,GAAAA,IAAAA,EAAAA,MAAAA,EAAAA,QAAAA,SAAAA,GAAAA,GAAAA,IAAAA,MAAAA;AAClBC,MAAAA,EAAAA,eAAyBC;AAAAA,QACzBZ,EAAC3B,MAAW,UAAQA,CAAAA,MAAAA,EAAAA,EAAAA,OAAAA,EAAAA,UAAAA,CAAAA;AAAAA,QACtB,CAAAI,MAAAA,IAAA,IAAA,IAAAA;AAAA,MAGIoC;AAAAA;AACEC,UAAAA;AACN1C,YAA+BC,IAAKyC,EAAAA,CAAAA;QAKfP,EAAAT,QAAU1B,EAAUoB,OAAyB,CAAAa,MAAc,CAAAN,EAAAM,GAACU,EAAU1C,IAAI,CAAC,GAACyB,KAE3E,GAAAX,EAAA,SAAA,KAAAgB,IAAArB,KAAA,OAAA,SAAAA,EAAA,UAAA,QAAAqB,EAAA,MAAA;AAAA;AAAM,UAAA1B;AAAa,cAEjBA,IAAAO,EAAA,UAAA,OAAA,SAAAP,EAAA,MAAA;AAAA,IACnBuC,GAAAA,UAAQA;AAIf,MAAA7B,EAEmB,OAAuB,CAAAA,EAAA,MAAAA,EAAA,SAAAA,EAAA,SAAA;AAAA;AACxC,UAAAgB,MAAsBc;AAElB,YAACC,IAAAzC,EAAA;AAIP,SAEsB0B,IAAiDrB,EAAA,UAAA,QAAAqB,EAAA,SAAAL,CAAA,MAAA,GAAAqB,KAAAd,IAAApB,EAAA,UAAA,OAAA,SAAAoB,EAAA,YAAA,QAAAc,EAAA,SAAArB,CAAA,OAAAX,EAAA,SAAA,IAAAA,EAAA,OAAA;AAAA;AAC/D,UAAAiC;AAEN,YAAW,EAAA,MAAAtB,GAAA,cAAAK,EAAA,IAAAhB;AACL,UAAE,CAAAW,GAAA;AAGN,QAAArB,EAAA,SAAA,YAAAU,EAAA,OAAA;AAAA;AAAA,MAGE;AAKE,MAAAV,EAAA,SAAwBkC,eAEtBU,OAAWC,KAAAA,IAAAA,EAAAA,UAAAA,QAAAA,EAAAA,MAAAA;AAEnB,YAAKD,IAAAA,EAAAA,CAAAA,GAAAA,EAAAA,QAAAA,EAAAA,IAAAA;AACH,UAAA,CAAAF;AAGgB;AAQZI,OAAAA,aAAe,WAAA,OAAA,EAAA,SAAoB9C,EAAA,IAAA,sBAA0B,GAAAA,EAAA,SAAA,WAAA+C,EAAAnB,EAAAF,CAAA,EAAA,KAAA;AAEnEa,YAAoBS,IAAAhD,EAAA,SAAA,cAAkC,IAAI4C,EAE1D,SAAA,YAAA,KAA4B;;AAAA,YAAAK;AAAiC,gBAAAA,IAAAzC,EAAA,UAAA,OAAA,SAAAyC,EAAA,iBAAA;AAAA,MAAA,CAC/D;AAAA,IAEAC;AAEA,cACc7C,CAAA,GAAA8C;AAAAA,MACZ,MAAMC,EAAmB;AAAA,MACzB;MACF,aAEsB,GAAA;AAAA;AAEfb;AAKN,MAAA7B,EAAA,QAAAA,EAAA,UAAAV,IAAAQ,EAAA,UAAA,QAAAR,EAAA,iBAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"PlDropdownMulti.vue.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlDropdownMulti/PlDropdownMulti.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * A component for selecting multiple values from a list of options\n */\nexport default {\n name: 'PlDropdownMulti',\n};\n</script>\n\n<script lang=\"ts\" setup generic=\"M = unknown\">\nimport './pl-dropdown-multi.scss';\nimport { computed, reactive, ref, unref, useSlots, useTemplateRef, watch, watchPostEffect } from 'vue';\nimport { tap } from '../../helpers/functions';\nimport { PlTooltip } from '../PlTooltip';\nimport { PlChip } from '../PlChip';\nimport DoubleContour from '../../utils/DoubleContour.vue';\nimport { useLabelNotch } from '../../utils/useLabelNotch';\nimport type { ListOption } from '../../types';\nimport DropdownListItem from '../DropdownListItem.vue';\nimport { deepEqual, deepIncludes } from '../../helpers/objects';\nimport { normalizeListOptions } from '../../helpers/utils';\nimport DropdownOverlay from '../../utils/DropdownOverlay/DropdownOverlay.vue';\nimport { PlMaskIcon24 } from '../PlMaskIcon24';\nimport SvgRequired from '../../generated/components/svg/images/SvgRequired.vue';\nimport { getErrorMessage } from '../../helpers/error.ts';\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: M[]): void;\n}>();\n\nconst emitModel = (v: M[]) => emit('update:modelValue', v);\n\nconst slots = useSlots();\n\nconst props = withDefaults(\n defineProps<{\n /**\n * The current selected values.\n */\n modelValue: M[];\n /**\n * The label text for the dropdown field (optional)\n */\n label?: string;\n /**\n * List of available options for the dropdown\n */\n options?: Readonly<ListOption<M>[]>;\n /**\n * A helper text displayed below the dropdown when there are no errors (optional).\n */\n helper?: string;\n /**\n * Error message displayed below the dropdown (optional)\n */\n error?: unknown;\n /**\n * Placeholder text shown when no value is selected.\n */\n placeholder?: string;\n /**\n * If `true`, the dropdown component is marked as required.\n */\n required?: boolean;\n /**\n * If `true`, the dropdown component is disabled and cannot be interacted with.\n */\n disabled?: boolean;\n }>(),\n {\n modelValue: () => [],\n label: undefined,\n helper: undefined,\n error: undefined,\n placeholder: '...',\n required: false,\n disabled: false,\n options: undefined,\n },\n);\n\nconst rootRef = ref<HTMLElement | undefined>();\nconst input = ref<HTMLInputElement | undefined>();\n\nconst overlay = useTemplateRef('overlay');\n\nconst data = reactive({\n search: '',\n activeOption: -1,\n open: false,\n optionsHeight: 0,\n});\n\nconst selectedValuesRef = computed(() => (Array.isArray(props.modelValue) ? props.modelValue : []));\n\nconst placeholderRef = computed(() => {\n if (data.open && props.modelValue.length > 0) {\n return props.placeholder;\n }\n\n return props.modelValue.length > 0 ? '' : props.placeholder;\n});\n\nconst normalizedOptionsRef = computed(() => normalizeListOptions(props.options ?? []));\n\nconst selectedOptionsRef = computed(() => {\n return selectedValuesRef.value.map((v) => normalizedOptionsRef.value.find((opt) => deepEqual(opt.value, v))).filter((v) => v !== undefined);\n});\n\nconst filteredOptionsRef = computed(() => {\n const selectedValues = unref(selectedValuesRef);\n\n const options = unref(normalizedOptionsRef);\n\n return (\n data.search\n ? options.filter((opt) => {\n const search = data.search.toLowerCase();\n\n if (opt.label.toLowerCase().includes(search)) {\n return true;\n }\n\n if (typeof opt.value === 'string') {\n return opt.value.toLowerCase().includes(search);\n }\n\n return opt.value === data.search;\n })\n : [...options]\n ).map((opt) => ({\n ...opt,\n selected: deepIncludes(selectedValues, opt.value),\n }));\n});\n\nconst isLoadingOptions = computed(() => {\n return props.options === undefined;\n});\n\nconst isDisabled = computed(() => {\n if (isLoadingOptions.value) {\n return true;\n }\n\n return props.disabled;\n});\n\nconst tabindex = computed(() => (isDisabled.value ? undefined : '0'));\n\nconst updateActiveOption = () => {\n data.activeOption = tap(\n filteredOptionsRef.value.findIndex((o) => deepEqual(o.value, props.modelValue)),\n (v) => (v < 0 ? 0 : v),\n );\n};\n\nconst selectOption = (v: M) => {\n const values = unref(selectedValuesRef);\n emitModel(deepIncludes(values, v) ? values.filter((it) => !deepEqual(it, v)) : [...values, v]);\n data.search = '';\n rootRef?.value?.focus();\n};\n\nconst unselectOption = (d: M) => emitModel(unref(selectedValuesRef).filter((v) => !deepEqual(v, d)));\n\nconst setFocusOnInput = () => input.value?.focus();\n\nconst toggleModel = () => {\n data.open = !data.open;\n if (!data.open) {\n data.search = '';\n }\n};\n\nconst onFocusOut = (event: FocusEvent) => {\n const relatedTarget = event.relatedTarget as Node | null;\n\n if (!rootRef.value?.contains(relatedTarget) && !overlay.value?.listRef?.contains(relatedTarget)) {\n data.search = '';\n data.open = false;\n }\n};\n\nconst handleKeydown = (e: { code: string; preventDefault(): void }) => {\n const { open, activeOption } = data;\n\n if (!open) {\n if (e.code === 'Enter') {\n data.open = true;\n }\n return;\n }\n\n if (e.code === 'Escape') {\n data.open = false;\n rootRef.value?.focus();\n }\n\n const filteredOptions = unref(filteredOptionsRef);\n\n const { length } = filteredOptions;\n\n if (!length) {\n return;\n }\n\n if (['ArrowDown', 'ArrowUp', 'Enter'].includes(e.code)) {\n e.preventDefault();\n }\n\n if (e.code === 'Enter') {\n selectOption(filteredOptions[activeOption].value);\n }\n\n const d = e.code === 'ArrowDown' ? 1 : e.code === 'ArrowUp' ? -1 : 0;\n\n data.activeOption = Math.abs(activeOption + d + length) % length;\n\n requestAnimationFrame(() => overlay.value?.scrollIntoActive());\n};\n\nuseLabelNotch(rootRef);\n\nwatch(\n () => props.modelValue,\n () => updateActiveOption(),\n { immediate: true },\n);\n\nwatchPostEffect(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n data.search;\n\n if (data.open) {\n overlay.value?.scrollIntoActive();\n }\n});\n</script>\n\n<template>\n <div class=\"pl-dropdown-multi__envelope\" @click=\"setFocusOnInput\">\n <div\n ref=\"rootRef\"\n :tabindex=\"tabindex\"\n class=\"pl-dropdown-multi\"\n :class=\"{ open: data.open, error, disabled: isDisabled }\"\n @keydown=\"handleKeydown\"\n @focusout=\"onFocusOut\"\n >\n <div class=\"pl-dropdown-multi__container\">\n <div class=\"pl-dropdown-multi__field\">\n <input\n ref=\"input\"\n v-model=\"data.search\"\n type=\"text\"\n tabindex=\"-1\"\n :disabled=\"isDisabled\"\n :placeholder=\"placeholderRef\"\n spellcheck=\"false\"\n autocomplete=\"chrome-off\"\n @focus=\"data.open = true\"\n />\n <div v-if=\"!data.open\" class=\"chips-container\">\n <PlChip v-for=\"(opt, i) in selectedOptionsRef\" :key=\"i\" closeable small @click.stop=\"data.open = true\" @close=\"unselectOption(opt.value)\">\n {{ opt.label || opt.value }}\n </PlChip>\n </div>\n\n <div class=\"pl-dropdown-multi__controls\">\n <PlMaskIcon24 v-if=\"isLoadingOptions\" name=\"loading\" />\n <slot name=\"append\" />\n <div class=\"pl-dropdown-multi__arrow-wrapper\" @click.stop=\"toggleModel\">\n <div class=\"arrow-icon arrow-icon-default\" />\n </div>\n </div>\n </div>\n <label v-if=\"label\">\n <SvgRequired v-if=\"required\" />\n <span>{{ label }}</span>\n <PlTooltip v-if=\"slots.tooltip\" class=\"info\" position=\"top\">\n <template #tooltip>\n <slot name=\"tooltip\" />\n </template>\n </PlTooltip>\n </label>\n <DropdownOverlay\n v-if=\"data.open\"\n ref=\"overlay\"\n :root=\"rootRef\"\n class=\"pl-dropdown-multi__options\"\n :gap=\"5\"\n tabindex=\"-1\"\n @focusout=\"onFocusOut\"\n >\n <div class=\"pl-dropdown-multi__open-chips-container\">\n <PlChip v-for=\"(opt, i) in selectedOptionsRef\" :key=\"i\" closeable small @close=\"unselectOption(opt.value)\">\n {{ opt.label || opt.value }}\n </PlChip>\n </div>\n <DropdownListItem\n v-for=\"(item, index) in filteredOptionsRef\"\n :key=\"index\"\n :option=\"item\"\n :text-item=\"'text'\"\n :is-selected=\"item.selected\"\n :is-hovered=\"data.activeOption == index\"\n size=\"medium\"\n use-checkbox\n @click.stop=\"selectOption(item.value)\"\n />\n <div v-if=\"!filteredOptionsRef.length\" class=\"nothing-found\">Nothing found</div>\n </DropdownOverlay>\n <DoubleContour class=\"pl-dropdown-multi__contour\" />\n </div>\n </div>\n <div v-if=\"error\" class=\"pl-dropdown-multi__error\">{{ getErrorMessage(error) }}</div>\n <div v-else-if=\"helper\" class=\"pl-dropdown-multi__helper\">{{ helper }}</div>\n </div>\n</template>\n"],"names":["Ee","emit","emitModel","v","P","S","V","e","Y","s","z","c","N","$","h","Z","t","ee","_","selectedValues","options","unref","K","p","A","pe","E","l","k","w","a","search","o","opt","n","deepIncludes","x","isLoadingOptions","D","tap","filteredOptionsRef","ae","selectOption","values","deepEqual","data","event","rootRef","i","L","length","filteredOptions","d","M","W","I","useLabelNotch","oe","updateActiveOption"],"mappings":"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"}