@topvisor/ui 1.0.1 → 1.0.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.
Files changed (156) hide show
  1. package/.chunks/datepicker-CWual081.es.js +290 -0
  2. package/.chunks/datepicker-CWual081.es.js.map +1 -0
  3. package/.chunks/datepicker-bFjXj_3j.amd.js +248 -0
  4. package/.chunks/datepicker-bFjXj_3j.amd.js.map +1 -0
  5. package/.chunks/forms-856ctwwh.amd.js +3 -0
  6. package/.chunks/forms-856ctwwh.amd.js.map +1 -0
  7. package/.chunks/forms-uLDC7Bui.es.js +1963 -0
  8. package/.chunks/forms-uLDC7Bui.es.js.map +1 -0
  9. package/.chunks/i18n-C_OH9IT3.amd.js.map +1 -1
  10. package/.chunks/i18n-DuTvft1T.es.js.map +1 -1
  11. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-B3E-SDdg.es.js → listItem.vue_vue_type_script_setup_true_lang-CNRoF_6f.es.js} +2 -2
  12. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-CNRoF_6f.es.js.map +1 -0
  13. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-uKhci19t.amd.js → listItem.vue_vue_type_script_setup_true_lang-DbaCM0v_.amd.js} +2 -2
  14. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-DbaCM0v_.amd.js.map +1 -0
  15. package/.chunks/{menu-CcyqVSfg.es.js → menu-ByHMHZAv.es.js} +2 -2
  16. package/.chunks/menu-ByHMHZAv.es.js.map +1 -0
  17. package/.chunks/{menu-DTbsTDGK.amd.js → menu-C_PVuMIc.amd.js} +2 -2
  18. package/.chunks/menu-C_PVuMIc.amd.js.map +1 -0
  19. package/.chunks/{popup-C5yk4q8p.es.js → popup-9IIJ1BzB.es.js} +495 -495
  20. package/.chunks/popup-9IIJ1BzB.es.js.map +1 -0
  21. package/.chunks/{popup-DAruCfQv.amd.js → popup-CUkj5veJ.amd.js} +447 -447
  22. package/.chunks/popup-CUkj5veJ.amd.js.map +1 -0
  23. package/.chunks/store-CX_6ZXhO.es.js.map +1 -1
  24. package/.chunks/store-esTid5oI.amd.js.map +1 -1
  25. package/README.md +86 -86
  26. package/assets/core.css +1 -1
  27. package/assets/forms.css +1 -1
  28. package/assets/formsExt.css +1 -1
  29. package/assets/menu.css +1 -1
  30. package/assets/popup.css +1 -1
  31. package/assets/tabs.css +1 -1
  32. package/assets/tabsView.css +1 -1
  33. package/assets/themes/dark.css +1 -0
  34. package/assets/themes/light.css +1 -0
  35. package/components/forms/select/select.d.ts +1 -2
  36. package/components/tabsView/tabsView/store.d.ts +1 -1
  37. package/core/app.amd.js +1 -1
  38. package/core/app.amd.js.map +1 -1
  39. package/core/app.js +14 -15
  40. package/core/app.js.map +1 -1
  41. package/core/core/core.d.ts +4 -4
  42. package/core/core/events/resize.d.ts +16 -0
  43. package/core/core/events.d.ts +12 -17
  44. package/core/core.amd.js +1 -1
  45. package/core/core.js +1 -1
  46. package/forms/forms.amd.js +1 -1
  47. package/forms/forms.js +1 -1
  48. package/forms/helpers.amd.js.map +1 -1
  49. package/forms/helpers.js.map +1 -1
  50. package/formsExt/formsExt.amd.js +1 -1
  51. package/formsExt/formsExt.amd.js.map +1 -1
  52. package/formsExt/formsExt.js +17 -18
  53. package/formsExt/formsExt.js.map +1 -1
  54. package/icomoon/Read Me.txt +7 -7
  55. package/icomoon/demo-files/demo.css +161 -161
  56. package/icomoon/demo-files/demo.js +30 -30
  57. package/icomoon/demo.html +3379 -3379
  58. package/icomoon/fonts/Topvisor-2.svg +263 -263
  59. package/icomoon/style.css +740 -740
  60. package/package.json +37 -36
  61. package/popup/popup.amd.js +1 -1
  62. package/popup/popup.amd.js.map +1 -1
  63. package/popup/popup.js +18 -18
  64. package/popup/popup.js.map +1 -1
  65. package/popup/worker.amd.js +1 -1
  66. package/popup/worker.amd.js.map +1 -1
  67. package/popup/worker.js +2 -2
  68. package/popup/worker.js.map +1 -1
  69. package/project/project.amd.js +1 -1
  70. package/project/project.amd.js.map +1 -1
  71. package/project/project.js +3 -3
  72. package/project/project.js.map +1 -1
  73. package/require/css.amd.js +12 -12
  74. package/tabs/tabs.amd.js +1 -1
  75. package/tabs/tabs.amd.js.map +1 -1
  76. package/tabs/tabs.js +7 -8
  77. package/tabs/tabs.js.map +1 -1
  78. package/tabsView/tabsView.amd.js +1 -1
  79. package/tabsView/tabsView.amd.js.map +1 -1
  80. package/tabsView/tabsView.js +101 -91
  81. package/tabsView/tabsView.js.map +1 -1
  82. package/test/themes/themes/dark-positions.amd.js +2 -0
  83. package/test/themes/themes/dark-positions.amd.js.map +1 -0
  84. package/test/themes/themes/dark-positions.d.ts +1 -0
  85. package/test/themes/themes/dark-positions.js +2 -0
  86. package/test/themes/themes/dark-positions.js.map +1 -0
  87. package/test/themes/themes/dark.amd.js +2 -0
  88. package/test/themes/themes/dark.amd.js.map +1 -0
  89. package/test/themes/themes/dark.d.ts +1 -0
  90. package/test/themes/themes/dark.js +4 -0
  91. package/test/themes/themes/dark.js.map +1 -0
  92. package/test/themes/themes/light-positions.amd.js +2 -0
  93. package/test/themes/themes/light-positions.amd.js.map +1 -0
  94. package/test/themes/themes/light-positions.d.ts +1 -0
  95. package/test/themes/themes/light-positions.js +2 -0
  96. package/test/themes/themes/light-positions.js.map +1 -0
  97. package/test/themes/themes/light.amd.js +2 -0
  98. package/test/themes/themes/light.amd.js.map +1 -0
  99. package/test/themes/themes/light.d.ts +1 -0
  100. package/test/themes/themes/light.js +4 -0
  101. package/test/themes/themes/light.js.map +1 -0
  102. package/utils/check.amd.js.map +1 -1
  103. package/utils/check.js.map +1 -1
  104. package/utils/clipboard.amd.js.map +1 -1
  105. package/utils/clipboard.js.map +1 -1
  106. package/utils/date.amd.js +1 -1
  107. package/utils/date.js +1 -1
  108. package/utils/device.amd.js +1 -1
  109. package/utils/device.js +3 -3
  110. package/utils/dom.amd.js.map +1 -1
  111. package/utils/dom.js.map +1 -1
  112. package/utils/image.amd.js.map +1 -1
  113. package/utils/image.js.map +1 -1
  114. package/utils/keyboard.amd.js.map +1 -1
  115. package/utils/keyboard.js.map +1 -1
  116. package/utils/lodash.amd.js +1 -1
  117. package/utils/lodash.amd.js.map +1 -1
  118. package/utils/lodash.js +6 -703
  119. package/utils/lodash.js.map +1 -1
  120. package/utils/number.amd.js.map +1 -1
  121. package/utils/number.js.map +1 -1
  122. package/utils/price.amd.js +1 -1
  123. package/utils/price.amd.js.map +1 -1
  124. package/utils/price.js +1 -1
  125. package/utils/price.js.map +1 -1
  126. package/utils/route.amd.js.map +1 -1
  127. package/utils/route.js.map +1 -1
  128. package/utils/scroll.amd.js.map +1 -1
  129. package/utils/scroll.js.map +1 -1
  130. package/utils/string.amd.js.map +1 -1
  131. package/utils/string.js.map +1 -1
  132. package/utils/system.amd.js.map +1 -1
  133. package/utils/system.js.map +1 -1
  134. package/utils/url.amd.js.map +1 -1
  135. package/utils/url.js.map +1 -1
  136. package/web-types.json +72 -72
  137. package/.chunks/datepicker-CS24dmLk.es.js +0 -290
  138. package/.chunks/datepicker-CS24dmLk.es.js.map +0 -1
  139. package/.chunks/datepicker-DsMs2YKL.amd.js +0 -248
  140. package/.chunks/datepicker-DsMs2YKL.amd.js.map +0 -1
  141. package/.chunks/debounce-4ipCj607.amd.js +0 -2
  142. package/.chunks/debounce-4ipCj607.amd.js.map +0 -1
  143. package/.chunks/debounce-BISRz08p.es.js +0 -116
  144. package/.chunks/debounce-BISRz08p.es.js.map +0 -1
  145. package/.chunks/forms-DKL0e9tp.amd.js +0 -3
  146. package/.chunks/forms-DKL0e9tp.amd.js.map +0 -1
  147. package/.chunks/forms-DT_fsN6V.es.js +0 -1161
  148. package/.chunks/forms-DT_fsN6V.es.js.map +0 -1
  149. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-B3E-SDdg.es.js.map +0 -1
  150. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-uKhci19t.amd.js.map +0 -1
  151. package/.chunks/menu-CcyqVSfg.es.js.map +0 -1
  152. package/.chunks/menu-DTbsTDGK.amd.js.map +0 -1
  153. package/.chunks/popup-C5yk4q8p.es.js.map +0 -1
  154. package/.chunks/popup-DAruCfQv.amd.js.map +0 -1
  155. package/assets/dark.css +0 -1
  156. package/assets/light.css +0 -1
@@ -1,10 +1,9 @@
1
1
  import Q from "../core/core.js";
2
2
  import { defineComponent as L, ref as V, computed as N, resolveDirective as x, openBlock as c, createElementBlock as v, normalizeClass as I, toDisplayString as $, createCommentVNode as T, createElementVNode as E, withDirectives as Y, createVNode as F, withKeys as O, withModifiers as S, createBlock as C, withCtx as w, createTextVNode as B, watch as k, toRef as q, mergeProps as X, mergeModels as D, useModel as j, Fragment as P, renderList as H, vModelRadio as ee, unref as M, renderSlot as te } from "vue";
3
- import { r as oe, T as z, _ as K, q as le, C as ae } from "../.chunks/forms-DT_fsN6V.es.js";
4
- import { invertKeyboardLayout as se } from "../utils/keyboard.js";
5
- import { TopPopup as re, TopPopupWidgetInput as ne, TopPopupListItem as R } from "../popup/popup.js";
6
- import { d as ie } from "../.chunks/debounce-BISRz08p.es.js";
7
- import { M as ue } from "../.chunks/menu-CcyqVSfg.es.js";
3
+ import { s as oe, T as z, _ as K, r as le, q as ae, C as se } from "../.chunks/forms-uLDC7Bui.es.js";
4
+ import { invertKeyboardLayout as re } from "../utils/keyboard.js";
5
+ import { TopPopup as ne, TopPopupWidgetInput as ie, TopPopupListItem as R } from "../popup/popup.js";
6
+ import { M as ue } from "../.chunks/menu-ByHMHZAv.es.js";
8
7
  const Z = ["../assets/formsExt.css"].map((s) => import.meta.resolve(s));
9
8
  Q.insertCSSLinkToPage(Z, !0);
10
9
  const de = { class: "top-editArea_footer" }, pe = /* @__PURE__ */ L({
@@ -231,8 +230,8 @@ const de = { class: "top-editArea_footer" }, pe = /* @__PURE__ */ L({
231
230
  "top-radioGroup_item": "top-radioGroup_item",
232
231
  "top-radioGroup_item-selected": "top-radioGroup_item-selected",
233
232
  "top-radioGroup_circle": "top-radioGroup_circle",
234
- "top-disabled": "top-disabled",
235
- "top-error": "top-error"
233
+ "top-error": "top-error",
234
+ "top-disabled": "top-disabled"
236
235
  }, Ce = {
237
236
  $style: we
238
237
  }, Ie = /* @__PURE__ */ K(_e, [["__cssModules", Ce]]), $e = (s, d, e) => {
@@ -265,7 +264,7 @@ const de = { class: "top-editArea_footer" }, pe = /* @__PURE__ */ L({
265
264
  s.params.offset = r, s.params.search = f;
266
265
  const o = await p();
267
266
  o && (r = o.nextOffset, a.value = a.value.concat(o.result));
268
- }, b = ie(() => i(), 200);
267
+ }, b = ae(() => i(), 200);
269
268
  return {
270
269
  items: a,
271
270
  isLoading: m,
@@ -347,7 +346,7 @@ const de = { class: "top-editArea_footer" }, pe = /* @__PURE__ */ L({
347
346
  const t = [];
348
347
  return !d.multiselect && d.appendAllValue && t.push(m), d.items.forEach((n) => t.push({ ...n })), t;
349
348
  }), y = (t, n = !0) => n && t.id === null ? Array.isArray(e.value) ? e.value.some((l) => l.id === t.id && l.name === t.name) : t.name === e.value.name : Array.isArray(e.value) ? e.value.some((l) => l.id === t.id) : t.id === e.value.id, b = N(() => {
350
- const t = a.value.toLowerCase(), n = se(t);
349
+ const t = a.value.toLowerCase(), n = re(t);
351
350
  let l = [];
352
351
  return i.value.forEach((A) => {
353
352
  const _ = A.name.toLowerCase();
@@ -362,7 +361,7 @@ const de = { class: "top-editArea_footer" }, pe = /* @__PURE__ */ L({
362
361
  if (!Array.isArray(e.value) || y(t))
363
362
  return;
364
363
  const A = [...e.value];
365
- A.push({ ...t }), e.value = A, ae.state.isMobile ? (n = r()) == null || n.close() : setTimeout(() => {
364
+ A.push({ ...t }), e.value = A, se.state.isMobile ? (n = r()) == null || n.close() : setTimeout(() => {
366
365
  var _, U, W, J;
367
366
  (_ = r()) == null || _.recalcPosition(), (J = (W = (U = r()) == null ? void 0 : U.elPopupWidget) == null ? void 0 : W.querySelector("input")) == null || J.focus(), a.value && (b.value.length || (a.value = "", p.items.value = []));
368
367
  });
@@ -386,7 +385,7 @@ const de = { class: "top-editArea_footer" }, pe = /* @__PURE__ */ L({
386
385
  const n = t.target;
387
386
  n.scrollTop / (n.scrollHeight - n.offsetHeight) > 0.8 && p.loadAppend();
388
387
  };
389
- return (t, n) => (c(), C(M(re), {
388
+ return (t, n) => (c(), C(M(ne), {
390
389
  ref_key: "popupRef",
391
390
  ref: f,
392
391
  onOpen: n[1] || (n[1] = (l) => h.value = !0),
@@ -422,7 +421,7 @@ const de = { class: "top-editArea_footer" }, pe = /* @__PURE__ */ L({
422
421
  ], 2)
423
422
  ]),
424
423
  widget: w(() => [
425
- F(M(ne), {
424
+ F(M(ie), {
426
425
  title: "Поиск",
427
426
  icon: "",
428
427
  modelValue: a.value,
@@ -471,12 +470,12 @@ const de = { class: "top-editArea_footer" }, pe = /* @__PURE__ */ L({
471
470
  "top-changer-selector": "top-changer-selector"
472
471
  }, Ne = {
473
472
  $style: Pe
474
- }, Oe = /* @__PURE__ */ K(Ge, [["__cssModules", Ne]]), Xe = fe, Re = Ae, Ye = Ie, je = Oe, Qe = ue;
473
+ }, Oe = /* @__PURE__ */ K(Ge, [["__cssModules", Ne]]), Je = fe, Xe = Ae, Re = Ie, Ye = Oe, je = ue;
475
474
  export {
476
- Xe as TopEditArea,
477
- Re as TopEditInput,
478
- Qe as TopMenu,
479
- Ye as TopRadioGroup,
480
- je as TopSelector2
475
+ Je as TopEditArea,
476
+ Xe as TopEditInput,
477
+ je as TopMenu,
478
+ Re as TopRadioGroup,
479
+ Ye as TopSelector2
481
480
  };
482
481
  //# sourceMappingURL=formsExt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formsExt.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/selector2/api.ts","../../src/components/formsExt/selector2/selector2.vue","../../src/components/formsExt/formsExt.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport Button from '@/components/forms/button/button.vue';\nimport type { Emits, Props } from './editArea';\nimport Textarea from '@/components/forms/textarea/textarea.vue';\n\n// TODO: добавить переменную top-forms-fixed-height и использовать ее при добавлении отступов у страницы\n\nconst props = withDefaults(defineProps<Props>(), {\n\tdefaultValue: '',\n\tcancelText: 'Cancel',\n\tsubmitText: 'Send',\n\tcloseText: 'Close',\n\texpandable: true,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst localValue = ref(props.defaultValue);\n\nconst isFocused = ref(props.isFocused);\n\nconst isChanged = computed(() => localValue.value !== props.defaultValue);\n\nconst cancelBtnText = computed(() => {\n\tif (props.attachToKeyboard) return '';\n\n\tif (props.forceShowCloseBtn && !isChanged.value) return props.closeText;\n\n\treturn props.cancelText;\n});\n\nconst submit = (value: string) => {\n\temit('submit', value);\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst cancel = () => {\n\tif (props.forceShowCloseBtn && !isChanged.value) {\n\t\temit('close');\n\n\t\treturn;\n\t}\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst clickOnTitle = () => {\n\tif (props.attachToKeyboard) emit('clickOnTitle');\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-editArea': true,\n\t\t\t'top-editArea-attachedToKeyboard': attachToKeyboard,\n\t\t}\"\n\t>\n\t\t<div\n\t\t\tv-if=\"title\"\n\t\t\tclass=\"top-editArea_title\"\n\t\t\t@click=\"clickOnTitle()\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-editArea_form': true,\n\t\t\t\t'top-error': isError,\n\t\t\t\t'top-focus': isFocused,\n\t\t\t}\"\n\t\t>\n\t\t\t<Textarea\n\t\t\t\tv-top-focus=\"{ disabled: !isFocused }\"\n\t\t\t\tv-model=\"localValue\"\n\t\t\t\t:name=\"name\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:rows=\"rows\"\n\t\t\t\t:minHeight=\"minHeight\"\n\t\t\t\t:expandable=\"expandable\"\n\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t:readonly=\"readonly\"\n\t\t\t\t:isError=\"isError\"\n\t\t\t\t:hint=\"hint\"\n\t\t\t\tclass=\"top-editArea_element\"\n\t\t\t\t@focus=\"() => isFocused = true\"\n\t\t\t\t@blur=\"() => isFocused = false\"\n\t\t\t\t@keyup.esc=\"cancel\"\n\t\t\t\t@keyup.ctrl.enter=\"submit(localValue)\"\n\t\t\t/>\n\n\t\t\t<div class=\"top-editArea_footer\">\n\t\t\t\t<Button\n\t\t\t\t\tv-if=\"isChanged || forceShowCloseBtn\"\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\tstyling=\"soft\"\n\t\t\t\t\t:icon=\"attachToKeyboard ? '': ''\"\n\t\t\t\t\t@click=\"cancel\"\n\t\t\t\t>\n\t\t\t\t\t{{ cancelBtnText }}\n\t\t\t\t</Button>\n\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tv-if=\"isChanged\"\n\t\t\t\t\t:icon=\"attachToKeyboard ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t{{ attachToKeyboard ? '' : submitText }}\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style module>\n.top-editArea {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.top-editArea_title {\n\tfont-size: 12px;\n}\n\n.top-editArea_form {\n\tflex-direction: column;\n}\n\n.top-editArea_form:hover {\n\tborder-color: var(--top-forms-border-color-hover);\n}\n\n.top-editArea_form.top-focus {\n\tborder-color: var(--color-line-primary-1);\n\toutline: none;\n}\n\n/* textarea в EditArea */\n.top-textarea {\n\twidth: 100%;\n}\n\n.top-editArea_element.top-textarea_textarea {\n\tborder: none;\n\toutline: none;\n\tanimation: none;\n}\n\n/* footer */\n.top-editArea_footer {\n\tpadding: var(--top-forms-padding);\n\tdisplay: flex;\n\tmin-height: 32px;\n\tjustify-content: flex-end;\n\tgap: var(--top-forms-padding);\n}\n\n/* attachedToKeyboard */\n.top-editArea-attachedToKeyboard {\n\tbackground: var(--top-forms-background-color);\n\tmargin-bottom: env(keyboard-inset-height, 0);\n\tposition: fixed;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_form {\n\tborder-radius: 0;\n\tborder: none;\n\tborder-top: 1px solid var(--top-forms-border-color);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_title {\n\tcursor: pointer;\n\tborder-top: 1px solid var(--color-line-2-opacity);\n\tpadding: var(--top-forms-padding);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_footer > [data-top-icon] {\n\tborder-radius: 100%;\n}\n\n.top-editArea-attachedToKeyboard .top-button.top-editArea_button {\n\tmin-width: auto;\n\tpadding: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './editInput';\nimport TopInput from '@/components/forms/input/input.vue';\nimport TopButton from '@/components/forms/button/button.vue';\n\nconst props = defineProps<Props>();\n\nconst intermediateValue = ref(props.modelValue);\n\nwatch(toRef(props.modelValue), () => {\n\tintermediateValue.value = props.modelValue;\n});\n\nconst emit = defineEmits<Emits>();\n\nconst submit = () => {\n\temit('update:modelValue', intermediateValue.value);\n};\n</script>\n\n<template>\n\t<div class=\"top-editInput\">\n\t\t<TopInput\n\t\t\t:=\"input\"\n\t\t\t@keydown.esc.capture.stop=\"intermediateValue = modelValue\"\n\t\t\t@keydown.enter.stop=\"submit\"\n\t\t\tv-model=\"intermediateValue\"\n\t\t/>\n\n\t\t<TopButton\n\t\t\tv-if=\"intermediateValue !== modelValue\"\n\t\t\ticon=\"\"\n\t\t\tstyling=\"soft\"\n\t\t\t:=\"button\"\n\t\t\t@click=\"submit\"\n\t\t/>\n\t</div>\n</template>\n\n<style module>\n.top-editInput {\n\twidth: 220px;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: var(--top-gap-1);\n}\n\n.top-editInput .top-input {\n\twidth: unset;\n\tflex-grow: 1;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Ref } from '@vue/reactivity';\nimport { ref, watch } from 'vue';\nimport type { Props, Emits } from './radioGroup';\n\nconst model = defineModel<string>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\n\nconst emit = defineEmits<Emits>();\n\nconst elRef: Ref<HTMLElement | null> = ref(null);\n\nwatch(model, () => {\n\tif (!props.radiosProps?.some(item => item.value === model.value)) {\n\t\tmodel.value = props.radiosProps?.[0]?.value ?? '';\n\t}\n\n\telRef.value?.querySelector('.radioGroup_item-selected')?.scrollIntoView();\n}, { immediate: true });\n\nconst uid = 'radioGroup-' + Math.random();\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t['top-radioGroup']: true,\n\t\t\t['top-scrollBarXHidding']: true,\n\t\t\t['top-size_' + size]: !!size,\n\t\t\t['top-error']: isError,\n\t\t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item of radiosProps\"\n\t\t\t:class=\"{\n\t\t\t\t['top-radioGroup_item-selected']: item.value === model,\n\t\t\t\t['top-radioGroup_item']: true,\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t@click=\"model = item.value\"\n\t\t>\n\t\t\t{{ item.title }}\n\n\t\t\t<span\n\t\t\t\tv-if=\"showIndicator\"\n\t\t\t\tclass=\"top-radioGroup_circle\"\n\t\t\t></span>\n\n\t\t\t<!-- Для нативной навигации -->\n\t\t\t<input\n\t\t\t\tv-model=\"model\"\n\t\t\t\t:name=\"uid\"\n\t\t\t\ttype=\"radio\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t['top-unvisible']: true,\n\t\t\t\t}\"\n\t\t\t\t:value=\"item.value\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t/>\n\t\t</label>\n\t</div>\n</template>\n\n<style module>\n@import \"./styles/top-scrollBar.css\";\n\n.top-radioGroup {\n\tuser-select: none;\n\tbox-sizing: border-box;\n\tborder-radius: 8px;\n\tbackground-color: var(--color-bg-2);\n\theight: var(--top-forms-base-height);\n\tpadding: 2px;\n\tgap: 2px;\n\tdisplay: flex;\n\talign-items: flex-start;\n}\n\n.top-radioGroup_item {\n\tcolor: var(--color-text-2);\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n\tpadding: 0 16px;\n\tfont-weight: 400;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-grow: 1;\n\tgap: 4px;\n}\n\n.top-radioGroup_item:hover {\n\tbackground-color: var(--color-bg-3);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* selected */\n.top-radioGroup_item-selected {\n\tcolor: var(--color-text-1);\n\tpointer-events: none;\n\tbackground-color: var(--color-bg-secondary-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* circle */\n.top-radioGroup_circle {\n\tcontent: \"\";\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--color-line-3-opacity);\n\tborder-radius: 50%;\n\tpadding: 3px;\n\tmargin-left: auto;\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\n}\n\n.top-radioGroup_item:hover .top-radioGroup_circle:before {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* circle selected */\n.top-radioGroup_item-selected .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n\tborder-width: 5px;\n}\n\n.top-radioGroup_item-selected:hover .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-2);\n}\n\n/* top-disabled */\n.top-radioGroup_item.top-disabled {\n\t--top-icon-color: var(--color-text-3);\n\n\tcolor: var(--color-text-3);\n}\n\n.top-radioGroup_item.top-disabled .top-radioGroup_circle {\n\tborder-color: var(--color-theme-400);\n\tbackground-color: var(--color-theme-100);\n}\n\n/* top-error */\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\n\tborder-color: var(--color-negative);\n}\n</style>\n","import type { Ref } from 'vue';\nimport { ref } from 'vue';\nimport { debounce } from '@/core/utils/lodash';\nimport type { Item, Props } from './selector2';\n\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items: Ref<Array<Item>> = ref([]);\n\n\t/**\n\t * Флаг - идет загрузка\n\t */\n\tconst isLoading = ref(false);\n\n\tlet _searchText = '';\n\tlet _nextOffset: number | undefined;\n\n\tif (apiRequest && !apiRequest.params.limit) {\n\t\tapiRequest.params.limit = 100;\n\t}\n\n\t/**\n\t * Выполнить обращение к API\n\t *\n\t * При ошибке вернет undefined\n\t */\n\tconst callAPIRequest = async (): Promise<{ nextOffset?: number, result: Array<Item> } | undefined> => {\n\t\tif (!apiRequest) return;\n\n\t\tlet res;\n\t\tlet cacheKey;\n\n\t\tif (useCache) {\n\t\t\t// кэш для полученных ответов через apiRequest\n\t\t\t// общий для всех компонентов, использующих apiRequest\n\t\t\tapiRequest.cache ??= new Map();\n\n\t\t\tcacheKey = JSON.stringify(apiRequest.params);\n\t\t\tres = apiRequest.cache.get(cacheKey);\n\n\t\t\tif (res) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t}\n\n\t\tisLoading.value = true;\n\t\tres = await apiRequest.call();\n\t\tisLoading.value = false;\n\n\t\tif (res.errors) return;\n\n\t\tif (!Array.isArray(res.result)) {\n\t\t\tconsole.warn(`В result ожидался массив`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst indexWithError = (res.result as Array<Item | any>).findIndex(item => item.id === undefined || item.name === undefined);\n\t\tif (indexWithError !== -1) {\n\t\t\tconsole.warn(`В result[${indexWithError}] нет id или name`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (useCache) {\n\t\t\tapiRequest.cache.set(cacheKey as string, res);\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Загрузить items\n\t */\n\tconst load = async () => {\n\t\tif (!apiRequest) return;\n\n\t\tapiRequest.params.offset = 0;\n\t\tapiRequest.params.search = _searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\t_nextOffset = res.nextOffset;\n\n\t\titems.value = res.result;\n\t};\n\n\t/**\n\t * Загрузить следующую страницу items\n\t */\n\tconst loadAppend = async () => {\n\t\tif (!apiRequest) return;\n\n\t\t// данных о следующих страницах не обнаружено\n\t\tif (!_nextOffset) return;\n\n\t\t// дозагружать нельзя, если не завершена предыдущшая загрузка\n\t\tif (isLoading.value) return;\n\n\t\tapiRequest.params.offset = _nextOffset;\n\t\tapiRequest.params.search = _searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\t_nextOffset = res.nextOffset;\n\n\t\titems.value = items.value.concat(res.result);\n\t};\n\n\tconst loadDebounce = debounce(() => load(), 200);\n\n\t/**\n\t * Выполнить поиск по указанному тексту\n\t *\n\t * Если длина текста меньше minLength, поиск не будет проивзеден\n\t *\n\t * Если текст не изменился, поиск не будет проивзеден\n\t * @param searchText - текст поиска\n\t * @param useDebounce - отложенное выполнение поиска\n\t */\n\tconst setSearchTextAndLoad = (searchText: string, useDebounce = true) => {\n\t\tif (!apiRequest) return;\n\n\t\tif (searchText.length < minLength) return;\n\n\t\t// условия поиска не поменялись, данные загружены\n\t\tif (searchText === _searchText && items.value.length) return;\n\n\t\t_searchText = searchText;\n\n\t\tif (useDebounce) {\n\t\t\tloadDebounce();\n\t\t} else {\n\t\t\tvoid load();\n\t\t}\n\t};\n\n\treturn {\n\t\titems,\n\t\tisLoading,\n\t\tloadAppend,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","<script setup lang=\"ts\">\nimport type { Ref, ComputedRef, ModelRef, ComponentInstance } from 'vue';\nimport { computed, ref, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport type PopupClass from '@/components/popup/lib/popup';\nimport type { Item, Props, Slots } from './selector2';\nimport { useAPI } from './api';\nimport Selector2ItemMulti from './itemMulti.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\titems: () => [] as Array<Item>,\n\tsize: 's',\n\tminLength: 0,\n\tshowSelectedInInput: true,\n});\n\nconst model = defineModel<Props['modelValue']>() as ModelRef<Props['modelValue']>;\n\ndefineSlots<Slots>();\n\n/**\n * Текст поиска по результатам\n */\nconst searchText = ref('');\n\nconst itemAll = {\n\tid: 0,\n\tname: 'Все',\n};\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef: Ref<ComponentInstance<typeof TopPopup> | null> = ref(null);\n\n/**\n * Получить доступ к объекту popup\n */\nconst getPopup = (): PopupClass | undefined => {\n\treturn popupRef.value?.popup;\n};\n\n// для storybook\nif ((window as any).__STORYBOOK_PREVIEW__ && !props.modelValue) {\n\twatch(\n\t\t() => props.multiselect,\n\t\t() => {\n\t\t\tmodel.value = props.multiselect ? [] : { id: null, name: '' };\n\t\t},\n\t\t{ immediate: true },\n\t);\n}\n\nconst API = useAPI(props.apiRequest, props.minLength, props.useCache);\n\n/**\n * Варианты выбора: props.items + \"Выбрать все\"\n */\nconst localItems: ComputedRef<Array<Item>> = computed(() => {\n\tconst items: Array<Item> = [];\n\n\tif (!props.multiselect && props.appendAllValue) {\n\t\titems.push(itemAll);\n\t}\n\n\tprops.items.forEach(item => items.push({ ...item }));\n\n\treturn items;\n});\n\n/**\n * Проверить, что элемент выбран\n */\nconst isSelected = (item: Item, checkNameForNullId = true) => {\n\tif (checkNameForNullId && item.id === null) {\n\t\tif (Array.isArray(model.value)) {\n\t\t\treturn model.value.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\n\t\t} else {\n\t\t\treturn item.name === model.value.name;\n\t\t}\n\t}\n\n\tif (Array.isArray(model.value)) {\n\t\treturn model.value.some(itemSelected => itemSelected.id === item.id);\n\t} else {\n\t\treturn item.id === model.value.id;\n\t}\n};\n\n/**\n * Варианты выбора, которые выводятся\n */\nconst itemsForShow = computed(() => {\n\tconst searchString = searchText.value.toLowerCase();\n\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\n\n\tlet items: typeof localItems.value = [];\n\n\tlocalItems.value.forEach((item) => {\n\t\tconst itemName = item.name.toLowerCase();\n\n\t\tif (\n\t\t\titem.id === Number(searchString) ||\n\t\t\titemName.includes(searchString) ||\n\t\t\titemName.includes(searchStringInvertKeyboard)\n\t\t) {\n\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\n\t\t\t\titems.unshift(item);\n\t\t\t} else {\n\t\t\t\titems.push(item);\n\t\t\t}\n\t\t}\n\t});\n\n\titems.push(...API.items.value);\n\n\tif (\n\t\tprops.appendSearchToResult &&\n\t\t!!searchText.value &&\n\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\n\t) {\n\t\titems.push({\n\t\t\tid: null,\n\t\t\tname: searchText.value,\n\t\t});\n\t}\n\n\tif (props.multiselect) {\n\t\titems = items.filter(item => !isSelected(item));\n\t}\n\n\treturn items;\n});\n\n/**\n * Выбрать значение\n *\n * Управляет закрытием окна\n */\nconst selectItem = async (item: Item) => {\n\tif (props.multiselect) {\n\t\tif (!Array.isArray(model.value)) return;\n\n\t\tif (isSelected(item)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst newModel = [...model.value];\n\t\tnewModel.push({ ...item });\n\t\tmodel.value = newModel;\n\n\t\tif (Core.state.isMobile) {\n\t\t\tgetPopup()?.close();\n\t\t} else {\n\t\t\tsetTimeout(() => {\n\t\t\t\tgetPopup()?.recalcPosition();\n\t\t\t\tgetPopup()?.elPopupWidget?.querySelector('input')?.focus();\n\n\t\t\t\t// сбросить введенный текст, только если больше не найдено результатов\n\t\t\t\tif (searchText.value) {\n\t\t\t\t\tif (!itemsForShow.value.length) {\n\t\t\t\t\t\tsearchText.value = '';\n\t\t\t\t\t\tAPI.items.value = [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\t// сбросить введенный текст\n\t\tif (searchText.value) {\n\t\t\tsearchText.value = '';\n\t\t\tAPI.items.value = [];\n\t\t}\n\n\t\tif (JSON.stringify(item) !== JSON.stringify(model.value)) {\n\t\t\tmodel.value = { ...item };\n\t\t}\n\n\t\tgetPopup()?.close();\n\t}\n};\n\n/**\n * Выбрать следующее значение\n */\nconst selectNextItem = () => {\n\tif (!Array.isArray(model.value)) {\n\t\tconst currentIndex = localItems.value.findIndex(item => item.id === (model.value as Item).id);\n\t\tconst nextIndex = (currentIndex + 1) % localItems.value.length;\n\t\tmodel.value = { ...localItems.value[nextIndex] };\n\t}\n};\n\n/**\n * Удалить выбранное значение по id\n * @param id\n */\nconst deleteItemById = async (id: Item['id']) => {\n\tif (Array.isArray(model.value)) {\n\t\tmodel.value = model.value.filter(item => item.id !== id);\n\n\t\tsetTimeout(() => {\n\t\t\tgetPopup()?.recalcPosition();\n\t\t});\n\t}\n};\n\nconst isOpened = ref(false); // флаг попап открыт\n\nif (props.apiRequest) {\n\twatch(isOpened, () => {\n\t\tif (isOpened.value) {\n\t\t\t// при открытии сразу выполнить поиск\n\t\t\tAPI.setSearchTextAndLoad(searchText.value, false);\n\t\t}\n\t});\n\n\t// отложенный поиск при вводе текста\n\twatch(searchText, () => API.setSearchTextAndLoad(searchText.value));\n}\n\nconst onScrollContentList = (e: Event) => {\n\tconst el = e.target as HTMLElement;\n\n\tif (el.scrollTop / (el.scrollHeight - el.offsetHeight) > 0.8) {\n\t\tAPI.loadAppend();\n\t}\n};\n</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"isOpened = true\"\n\t\t@close=\"isOpened = false\"\n\t\t@scrollContentList=\"apiRequest ? onScrollContentList($event) : undefined\"\n\t\t:notch=\"false\"\n\t\t:transitionDuration=\"0\"\n\t>\n\t\t<template #opener>\n\t\t\t<div\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-selector2' : true,\n\t\t\t\t\t'top-selector2-multiselect': multiselect,\n\t\t\t\t\t['top-size_' + size]: true,\n\t\t\t\t\t['top-disabled']: disabled,\n\t\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t\t['top-error']: isError,\n\t\t\t\t}\"\n\t\t\t>\n\t\t\t\t<template v-if=\"multiselect\">\n\t\t\t\t\t<div class=\"top-selector2_activeItems\">\n\t\t\t\t\t\t<Selector2ItemMulti\n\t\t\t\t\t\t\tv-for=\"item of model as Array<Item>\"\n\t\t\t\t\t\t\t:id=\"item.id\"\n\t\t\t\t\t\t\t:name=\"item.name\"\n\t\t\t\t\t\t\t@delete=\"deleteItemById\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\n\t\t\t\t<span v-if=\"!multiselect\" class=\"top-selector2_activeName top-ellipsis\">\n\t\t\t\t\t{{ !Array.isArray(model) ? model.name : '' }}\n\t\t\t\t</span>\n\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"addChanger && !multiselect && localItems.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector\"\n\t\t\t\t\t@click.stop=\"selectNextItem\"\n\t\t\t\t></span>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #widget>\n\t\t\t<TopPopupWidgetInput\n\t\t\t\ttitle=\"Поиск\"\n\t\t\t\ticon=\"\"\n\t\t\t\tv-model=\"searchText\"\n\t\t\t\t:isLoading=\"API.isLoading.value\"\n\t\t\t\t:placeholder=\"!Array.isArray(model) && !multiselect && showSelectedInInput ? model.name : placeholder\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<TopPopupListItem\n\t\t\t\tv-for=\"item of itemsForShow\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.name === item.name\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t@click.stop=\"selectItem(item)\"\n\t\t\t>\n\t\t\t\t<slot\n\t\t\t\t\tv-if=\"$slots.item\"\n\t\t\t\t\tname=\"item\"\n\t\t\t\t\t:item=\"item\"\n\t\t\t\t></slot>\n\n\t\t\t\t<template\n\t\t\t\t\tv-else\n\t\t\t\t>\n\t\t\t\t\t{{ item.name }}\n\t\t\t\t</template>\n\t\t\t</TopPopupListItem>\n\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"!itemsForShow.length\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\tНет результатов\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style module>\n.top-selector2 {\n\twidth: 180px;\n\tmin-height: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tposition: relative;\n\tdisplay: flex;\n\toverflow: hidden;\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\n\tcolor: var(--top-forms-placeholder-color);\n\n\tborder-radius: var(--top-radius-2);\n\tborder: 1px solid var(--top-forms-border-color);\n\tbackground: var(--top-forms-background-color);\n}\n\n.top-selector2-multiselect {\n\twidth: unset;\n\tmin-width: 180px;\n\tpadding: var(--top-padding-1);\n}\n\n.top-selector2.top-active {\n\t--top-forms-border-color: var(--top-forms-border-color-hover);\n\t--top-forms-background-color: var(--top-forms-background-color-hover);\n}\n\n.top-selector2_activeItems {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--top-padding-1);\n\tmax-width: 100%;\n}\n\n.top-selector2_activeName {\n\twhite-space: nowrap;\n}\n\n.top-changer-selector {\n\ttransform: translateX(-16px);\n}\n</style>\n","import type { ComponentCustomProps } from 'vue';\n\nimport EditArea from './editArea/editArea.vue';\nimport EditInput from './editInput/editInput.vue';\nimport RadioGroup from './radioGroup/radioGroup.vue';\nimport Selector2 from './selector2/selector2.vue';\nimport Menu from './menu/menu.vue';\n\nexport const TopEditArea = EditArea as typeof EditArea & ComponentCustomProps;\nexport const TopEditInput = EditInput as typeof EditInput & ComponentCustomProps;\nexport const TopRadioGroup = RadioGroup as typeof RadioGroup & ComponentCustomProps;\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\n"],"names":["props","__props","emit","__emit","localValue","ref","isFocused","isChanged","computed","cancelBtnText","submit","value","cancel","clickOnTitle","intermediateValue","watch","toRef","model","useModel","elRef","_a","item","_c","_b","_e","_d","uid","useAPI","apiRequest","minLength","useCache","items","isLoading","_searchText","_nextOffset","callAPIRequest","res","cacheKey","indexWithError","load","loadAppend","loadDebounce","debounce","searchText","useDebounce","itemAll","popupRef","getPopup","API","localItems","isSelected","checkNameForNullId","itemSelected","itemsForShow","searchString","searchStringInvertKeyboard","invertKeyboardLayout","itemName","selectItem","newModel","Core","selectNextItem","nextIndex","deleteItemById","id","isOpened","onScrollContentList","e","el","TopEditArea","EditArea","TopEditInput","EditInput","TopRadioGroup","RadioGroup","TopSelector2","Selector2","TopMenu","Menu"],"mappings":"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"}
1
+ {"version":3,"file":"formsExt.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/selector2/api.ts","../../src/components/formsExt/selector2/selector2.vue","../../src/components/formsExt/formsExt.ts"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, ref } from 'vue';\r\nimport Button from '@/components/forms/button/button.vue';\r\nimport type { Emits, Props } from './editArea';\r\nimport Textarea from '@/components/forms/textarea/textarea.vue';\r\n\r\n// TODO: добавить переменную top-forms-fixed-height и использовать ее при добавлении отступов у страницы\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\tdefaultValue: '',\r\n\tcancelText: 'Cancel',\r\n\tsubmitText: 'Send',\r\n\tcloseText: 'Close',\r\n\texpandable: true,\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst localValue = ref(props.defaultValue);\r\n\r\nconst isFocused = ref(props.isFocused);\r\n\r\nconst isChanged = computed(() => localValue.value !== props.defaultValue);\r\n\r\nconst cancelBtnText = computed(() => {\r\n\tif (props.attachToKeyboard) return '';\r\n\r\n\tif (props.forceShowCloseBtn && !isChanged.value) return props.closeText;\r\n\r\n\treturn props.cancelText;\r\n});\r\n\r\nconst submit = (value: string) => {\r\n\temit('submit', value);\r\n\r\n\tlocalValue.value = props.defaultValue;\r\n};\r\n\r\nconst cancel = () => {\r\n\tif (props.forceShowCloseBtn && !isChanged.value) {\r\n\t\temit('close');\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n\tlocalValue.value = props.defaultValue;\r\n};\r\n\r\nconst clickOnTitle = () => {\r\n\tif (props.attachToKeyboard) emit('clickOnTitle');\r\n};\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\t:class=\"{\r\n\t\t\t'top-editArea': true,\r\n\t\t\t'top-editArea-attachedToKeyboard': attachToKeyboard,\r\n\t\t}\"\r\n\t>\r\n\t\t<div\r\n\t\t\tv-if=\"title\"\r\n\t\t\tclass=\"top-editArea_title\"\r\n\t\t\t@click=\"clickOnTitle()\"\r\n\t\t>\r\n\t\t\t{{ title }}\r\n\t\t</div>\r\n\r\n\t\t<div\r\n\t\t\t:class=\"{\r\n\t\t\t\t'top-editArea_form': true,\r\n\t\t\t\t'top-error': isError,\r\n\t\t\t\t'top-focus': isFocused,\r\n\t\t\t}\"\r\n\t\t>\r\n\t\t\t<Textarea\r\n\t\t\t\tv-top-focus=\"{ disabled: !isFocused }\"\r\n\t\t\t\tv-model=\"localValue\"\r\n\t\t\t\t:name=\"name\"\r\n\t\t\t\t:placeholder=\"placeholder\"\r\n\t\t\t\t:rows=\"rows\"\r\n\t\t\t\t:minHeight=\"minHeight\"\r\n\t\t\t\t:expandable=\"expandable\"\r\n\t\t\t\t:disabled=\"disabled\"\r\n\t\t\t\t:readonly=\"readonly\"\r\n\t\t\t\t:isError=\"isError\"\r\n\t\t\t\t:hint=\"hint\"\r\n\t\t\t\tclass=\"top-editArea_element\"\r\n\t\t\t\t@focus=\"() => isFocused = true\"\r\n\t\t\t\t@blur=\"() => isFocused = false\"\r\n\t\t\t\t@keyup.esc=\"cancel\"\r\n\t\t\t\t@keyup.ctrl.enter=\"submit(localValue)\"\r\n\t\t\t/>\r\n\r\n\t\t\t<div class=\"top-editArea_footer\">\r\n\t\t\t\t<Button\r\n\t\t\t\t\tv-if=\"isChanged || forceShowCloseBtn\"\r\n\t\t\t\t\tclass=\"top-editArea_button\"\r\n\t\t\t\t\tcolor=\"theme\"\r\n\t\t\t\t\tstyling=\"soft\"\r\n\t\t\t\t\t:icon=\"attachToKeyboard ? '': ''\"\r\n\t\t\t\t\t@click=\"cancel\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{{ cancelBtnText }}\r\n\t\t\t\t</Button>\r\n\r\n\t\t\t\t<Button\r\n\t\t\t\t\tclass=\"top-editArea_button\"\r\n\t\t\t\t\tv-if=\"isChanged\"\r\n\t\t\t\t\t:icon=\"attachToKeyboard ? '': ''\"\r\n\t\t\t\t\t@click=\"submit(localValue)\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{{ attachToKeyboard ? '' : submitText }}\r\n\t\t\t\t</Button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<style module>\r\n.top-editArea {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 6px;\r\n}\r\n\r\n.top-editArea_title {\r\n\tfont-size: 12px;\r\n}\r\n\r\n.top-editArea_form {\r\n\tflex-direction: column;\r\n}\r\n\r\n.top-editArea_form:hover {\r\n\tborder-color: var(--top-forms-border-color-hover);\r\n}\r\n\r\n.top-editArea_form.top-focus {\r\n\tborder-color: var(--color-line-primary-1);\r\n\toutline: none;\r\n}\r\n\r\n/* textarea в EditArea */\r\n.top-textarea {\r\n\twidth: 100%;\r\n}\r\n\r\n.top-editArea_element.top-textarea_textarea {\r\n\tborder: none;\r\n\toutline: none;\r\n\tanimation: none;\r\n}\r\n\r\n/* footer */\r\n.top-editArea_footer {\r\n\tpadding: var(--top-forms-padding);\r\n\tdisplay: flex;\r\n\tmin-height: 32px;\r\n\tjustify-content: flex-end;\r\n\tgap: var(--top-forms-padding);\r\n}\r\n\r\n/* attachedToKeyboard */\r\n.top-editArea-attachedToKeyboard {\r\n\tbackground: var(--top-forms-background-color);\r\n\tmargin-bottom: env(keyboard-inset-height, 0);\r\n\tposition: fixed;\r\n\tbottom: 0;\r\n\tright: 0;\r\n\tleft: 0;\r\n\tz-index: 2;\r\n\tgap: 0;\r\n}\r\n\r\n.top-editArea-attachedToKeyboard .top-editArea_form {\r\n\tborder-radius: 0;\r\n\tborder: none;\r\n\tborder-top: 1px solid var(--top-forms-border-color);\r\n}\r\n\r\n.top-editArea-attachedToKeyboard .top-editArea_title {\r\n\tcursor: pointer;\r\n\tborder-top: 1px solid var(--color-line-2-opacity);\r\n\tpadding: var(--top-forms-padding);\r\n}\r\n\r\n.top-editArea-attachedToKeyboard .top-editArea_footer > [data-top-icon] {\r\n\tborder-radius: 100%;\r\n}\r\n\r\n.top-editArea-attachedToKeyboard .top-button.top-editArea_button {\r\n\tmin-width: auto;\r\n\tpadding: 0;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { ref, toRef, watch } from 'vue';\r\nimport type { Emits, Props } from './editInput';\r\nimport TopInput from '@/components/forms/input/input.vue';\r\nimport TopButton from '@/components/forms/button/button.vue';\r\n\r\nconst props = defineProps<Props>();\r\n\r\nconst intermediateValue = ref(props.modelValue);\r\n\r\nwatch(toRef(props.modelValue), () => {\r\n\tintermediateValue.value = props.modelValue;\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst submit = () => {\r\n\temit('update:modelValue', intermediateValue.value);\r\n};\r\n</script>\r\n\r\n<template>\r\n\t<div class=\"top-editInput\">\r\n\t\t<TopInput\r\n\t\t\t:=\"input\"\r\n\t\t\t@keydown.esc.capture.stop=\"intermediateValue = modelValue\"\r\n\t\t\t@keydown.enter.stop=\"submit\"\r\n\t\t\tv-model=\"intermediateValue\"\r\n\t\t/>\r\n\r\n\t\t<TopButton\r\n\t\t\tv-if=\"intermediateValue !== modelValue\"\r\n\t\t\ticon=\"\"\r\n\t\t\tstyling=\"soft\"\r\n\t\t\t:=\"button\"\r\n\t\t\t@click=\"submit\"\r\n\t\t/>\r\n\t</div>\r\n</template>\r\n\r\n<style module>\r\n.top-editInput {\r\n\twidth: 220px;\r\n\tflex-grow: 1;\r\n\tdisplay: flex;\r\n\talign-items: flex-end;\r\n\tgap: var(--top-gap-1);\r\n}\r\n\r\n.top-editInput .top-input {\r\n\twidth: unset;\r\n\tflex-grow: 1;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport type { Ref } from '@vue/reactivity';\r\nimport { ref, watch } from 'vue';\r\nimport type { Props, Emits } from './radioGroup';\r\n\r\nconst model = defineModel<string>({\r\n\trequired: true,\r\n});\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\tsize: 's',\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst elRef: Ref<HTMLElement | null> = ref(null);\r\n\r\nwatch(model, () => {\r\n\tif (!props.radiosProps?.some(item => item.value === model.value)) {\r\n\t\tmodel.value = props.radiosProps?.[0]?.value ?? '';\r\n\t}\r\n\r\n\telRef.value?.querySelector('.radioGroup_item-selected')?.scrollIntoView();\r\n}, { immediate: true });\r\n\r\nconst uid = 'radioGroup-' + Math.random();\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\tref=\"elRef\"\r\n\t\t:class=\"{\r\n\t\t\t['top-radioGroup']: true,\r\n\t\t\t['top-scrollBarXHidding']: true,\r\n\t\t\t['top-size_' + size]: !!size,\r\n\t\t\t['top-error']: isError,\r\n\t\t}\"\r\n\t>\r\n\t\t<label\r\n\t\t\tv-for=\"item of radiosProps\"\r\n\t\t\t:class=\"{\r\n\t\t\t\t['top-radioGroup_item-selected']: item.value === model,\r\n\t\t\t\t['top-radioGroup_item']: true,\r\n\t\t\t\t['top-forms-focusable']: true,\r\n\t\t\t\t['top-disabled']: item.disabled,\r\n\t\t\t}\"\r\n\t\t\t:data-top-icon=\"item.icon\"\r\n\t\t\t@click=\"model = item.value\"\r\n\t\t>\r\n\t\t\t{{ item.title }}\r\n\r\n\t\t\t<span\r\n\t\t\t\tv-if=\"showIndicator\"\r\n\t\t\t\tclass=\"top-radioGroup_circle\"\r\n\t\t\t></span>\r\n\r\n\t\t\t<!-- Для нативной навигации -->\r\n\t\t\t<input\r\n\t\t\t\tv-model=\"model\"\r\n\t\t\t\t:name=\"uid\"\r\n\t\t\t\ttype=\"radio\"\r\n\t\t\t\t:class=\"{\r\n\t\t\t\t\t['top-unvisible']: true,\r\n\t\t\t\t}\"\r\n\t\t\t\t:value=\"item.value\"\r\n\t\t\t\t:disabled=\"item.disabled\"\r\n\t\t\t/>\r\n\t\t</label>\r\n\t</div>\r\n</template>\r\n\r\n<style module>\r\n@import \"./styles/top-scrollBar.css\";\r\n\r\n.top-radioGroup {\r\n\tuser-select: none;\r\n\tbox-sizing: border-box;\r\n\tborder-radius: 8px;\r\n\tbackground-color: var(--color-layout-middle);\r\n\theight: var(--top-forms-base-height);\r\n\tpadding: 2px;\r\n\tgap: 2px;\r\n\tdisplay: flex;\r\n\talign-items: flex-start;\r\n}\r\n\r\n.top-radioGroup_item {\r\n\tcolor: var(--color-text-2);\r\n\tcursor: pointer;\r\n\tbox-sizing: border-box;\r\n\tborder-radius: 6px;\r\n\theight: calc(var(--top-forms-base-height) - 4px);\r\n\tpadding: 0 16px;\r\n\tfont-weight: 400;\r\n\twhite-space: nowrap;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tflex-grow: 1;\r\n\tgap: 4px;\r\n}\r\n\r\n.top-radioGroup_item:hover {\r\n\tbackground-color: var(--color-layout-front-1);\r\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\r\n}\r\n\r\n/* selected */\r\n.top-radioGroup_item-selected {\r\n\tcolor: var(--color-text-1);\r\n\tpointer-events: none;\r\n\tbackground-color: var(--color-bg-shading-1);\r\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\r\n}\r\n\r\n/* circle */\r\n.top-radioGroup_circle {\r\n\tcontent: \"\";\r\n\tbox-sizing: border-box;\r\n\tborder: 1px solid var(--color-line-3-opacity);\r\n\tborder-radius: 50%;\r\n\tpadding: 3px;\r\n\tmargin-left: auto;\r\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\r\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\r\n}\r\n\r\n.top-radioGroup_item:hover .top-radioGroup_circle:before {\r\n\tborder-color: var(--color-line-primary-1);\r\n}\r\n\r\n/* circle selected */\r\n.top-radioGroup_item-selected .top-radioGroup_circle {\r\n\tborder-color: var(--color-line-primary-1);\r\n\tborder-width: 5px;\r\n}\r\n\r\n.top-radioGroup_item-selected:hover .top-radioGroup_circle {\r\n\tborder-color: var(--color-line-primary-1);\r\n}\r\n\r\n/* top-error */\r\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\r\n\tborder-color: var(--color-line-negative-1);\r\n}\r\n</style>\r\n","import type { Ref } from 'vue';\r\nimport { ref } from 'vue';\r\nimport { debounce } from '@/core/utils/lodash';\r\nimport type { Item, Props } from './selector2';\r\n\r\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\r\n\t/**\r\n\t * Список, полученный через API\r\n\t */\r\n\tconst items: Ref<Array<Item>> = ref([]);\r\n\r\n\t/**\r\n\t * Флаг - идет загрузка\r\n\t */\r\n\tconst isLoading = ref(false);\r\n\r\n\tlet _searchText = '';\r\n\tlet _nextOffset: number | undefined;\r\n\r\n\tif (apiRequest && !apiRequest.params.limit) {\r\n\t\tapiRequest.params.limit = 100;\r\n\t}\r\n\r\n\t/**\r\n\t * Выполнить обращение к API\r\n\t *\r\n\t * При ошибке вернет undefined\r\n\t */\r\n\tconst callAPIRequest = async (): Promise<{ nextOffset?: number, result: Array<Item> } | undefined> => {\r\n\t\tif (!apiRequest) return;\r\n\r\n\t\tlet res;\r\n\t\tlet cacheKey;\r\n\r\n\t\tif (useCache) {\r\n\t\t\t// кэш для полученных ответов через apiRequest\r\n\t\t\t// общий для всех компонентов, использующих apiRequest\r\n\t\t\tapiRequest.cache ??= new Map();\r\n\r\n\t\t\tcacheKey = JSON.stringify(apiRequest.params);\r\n\t\t\tres = apiRequest.cache.get(cacheKey);\r\n\r\n\t\t\tif (res) {\r\n\t\t\t\treturn res;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tisLoading.value = true;\r\n\t\tres = await apiRequest.call();\r\n\t\tisLoading.value = false;\r\n\r\n\t\tif (res.errors) return;\r\n\r\n\t\tif (!Array.isArray(res.result)) {\r\n\t\t\tconsole.warn(`В result ожидался массив`);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst indexWithError = (res.result as Array<Item | any>).findIndex(item => item.id === undefined || item.name === undefined);\r\n\t\tif (indexWithError !== -1) {\r\n\t\t\tconsole.warn(`В result[${indexWithError}] нет id или name`);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (useCache) {\r\n\t\t\tapiRequest.cache.set(cacheKey as string, res);\r\n\t\t}\r\n\r\n\t\treturn res;\r\n\t};\r\n\r\n\t/**\r\n\t * Загрузить items\r\n\t */\r\n\tconst load = async () => {\r\n\t\tif (!apiRequest) return;\r\n\r\n\t\tapiRequest.params.offset = 0;\r\n\t\tapiRequest.params.search = _searchText;\r\n\r\n\t\tconst res = await callAPIRequest();\r\n\t\tif (!res) return;\r\n\r\n\t\t_nextOffset = res.nextOffset;\r\n\r\n\t\titems.value = res.result;\r\n\t};\r\n\r\n\t/**\r\n\t * Загрузить следующую страницу items\r\n\t */\r\n\tconst loadAppend = async () => {\r\n\t\tif (!apiRequest) return;\r\n\r\n\t\t// данных о следующих страницах не обнаружено\r\n\t\tif (!_nextOffset) return;\r\n\r\n\t\t// дозагружать нельзя, если не завершена предыдущшая загрузка\r\n\t\tif (isLoading.value) return;\r\n\r\n\t\tapiRequest.params.offset = _nextOffset;\r\n\t\tapiRequest.params.search = _searchText;\r\n\r\n\t\tconst res = await callAPIRequest();\r\n\t\tif (!res) return;\r\n\r\n\t\t_nextOffset = res.nextOffset;\r\n\r\n\t\titems.value = items.value.concat(res.result);\r\n\t};\r\n\r\n\tconst loadDebounce = debounce(() => load(), 200);\r\n\r\n\t/**\r\n\t * Выполнить поиск по указанному тексту\r\n\t *\r\n\t * Если длина текста меньше minLength, поиск не будет проивзеден\r\n\t *\r\n\t * Если текст не изменился, поиск не будет проивзеден\r\n\t * @param searchText - текст поиска\r\n\t * @param useDebounce - отложенное выполнение поиска\r\n\t */\r\n\tconst setSearchTextAndLoad = (searchText: string, useDebounce = true) => {\r\n\t\tif (!apiRequest) return;\r\n\r\n\t\tif (searchText.length < minLength) return;\r\n\r\n\t\t// условия поиска не поменялись, данные загружены\r\n\t\tif (searchText === _searchText && items.value.length) return;\r\n\r\n\t\t_searchText = searchText;\r\n\r\n\t\tif (useDebounce) {\r\n\t\t\tloadDebounce();\r\n\t\t} else {\r\n\t\t\tvoid load();\r\n\t\t}\r\n\t};\r\n\r\n\treturn {\r\n\t\titems,\r\n\t\tisLoading,\r\n\t\tloadAppend,\r\n\t\tsetSearchTextAndLoad,\r\n\t};\r\n};\r\n","<script setup lang=\"ts\">\r\nimport type { Ref, ComputedRef, ModelRef, ComponentInstance } from 'vue';\r\nimport { computed, ref, watch } from 'vue';\r\nimport Core from '@/core/core/core';\r\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\r\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\r\nimport type PopupClass from '@/components/popup/lib/popup';\r\nimport type { Item, Props, Slots } from './selector2';\r\nimport { useAPI } from './api';\r\nimport Selector2ItemMulti from './itemMulti.vue';\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\titems: () => [] as Array<Item>,\r\n\tsize: 's',\r\n\tminLength: 0,\r\n\tshowSelectedInInput: true,\r\n});\r\n\r\nconst model = defineModel<Props['modelValue']>() as ModelRef<Props['modelValue']>;\r\n\r\ndefineSlots<Slots>();\r\n\r\n/**\r\n * Текст поиска по результатам\r\n */\r\nconst searchText = ref('');\r\n\r\nconst itemAll = {\r\n\tid: 0,\r\n\tname: 'Все',\r\n};\r\n\r\n/**\r\n * Экземпляр компонента Popup\r\n */\r\nconst popupRef: Ref<ComponentInstance<typeof TopPopup> | null> = ref(null);\r\n\r\n/**\r\n * Получить доступ к объекту popup\r\n */\r\nconst getPopup = (): PopupClass | undefined => {\r\n\treturn popupRef.value?.popup;\r\n};\r\n\r\n// для storybook\r\nif ((window as any).__STORYBOOK_PREVIEW__ && !props.modelValue) {\r\n\twatch(\r\n\t\t() => props.multiselect,\r\n\t\t() => {\r\n\t\t\tmodel.value = props.multiselect ? [] : { id: null, name: '' };\r\n\t\t},\r\n\t\t{ immediate: true },\r\n\t);\r\n}\r\n\r\nconst API = useAPI(props.apiRequest, props.minLength, props.useCache);\r\n\r\n/**\r\n * Варианты выбора: props.items + \"Выбрать все\"\r\n */\r\nconst localItems: ComputedRef<Array<Item>> = computed(() => {\r\n\tconst items: Array<Item> = [];\r\n\r\n\tif (!props.multiselect && props.appendAllValue) {\r\n\t\titems.push(itemAll);\r\n\t}\r\n\r\n\tprops.items.forEach(item => items.push({ ...item }));\r\n\r\n\treturn items;\r\n});\r\n\r\n/**\r\n * Проверить, что элемент выбран\r\n */\r\nconst isSelected = (item: Item, checkNameForNullId = true) => {\r\n\tif (checkNameForNullId && item.id === null) {\r\n\t\tif (Array.isArray(model.value)) {\r\n\t\t\treturn model.value.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\r\n\t\t} else {\r\n\t\t\treturn item.name === model.value.name;\r\n\t\t}\r\n\t}\r\n\r\n\tif (Array.isArray(model.value)) {\r\n\t\treturn model.value.some(itemSelected => itemSelected.id === item.id);\r\n\t} else {\r\n\t\treturn item.id === model.value.id;\r\n\t}\r\n};\r\n\r\n/**\r\n * Варианты выбора, которые выводятся\r\n */\r\nconst itemsForShow = computed(() => {\r\n\tconst searchString = searchText.value.toLowerCase();\r\n\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\r\n\r\n\tlet items: typeof localItems.value = [];\r\n\r\n\tlocalItems.value.forEach((item) => {\r\n\t\tconst itemName = item.name.toLowerCase();\r\n\r\n\t\tif (\r\n\t\t\titem.id === Number(searchString) ||\r\n\t\t\titemName.includes(searchString) ||\r\n\t\t\titemName.includes(searchStringInvertKeyboard)\r\n\t\t) {\r\n\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\r\n\t\t\t\titems.unshift(item);\r\n\t\t\t} else {\r\n\t\t\t\titems.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\titems.push(...API.items.value);\r\n\r\n\tif (\r\n\t\tprops.appendSearchToResult &&\r\n\t\t!!searchText.value &&\r\n\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\r\n\t) {\r\n\t\titems.push({\r\n\t\t\tid: null,\r\n\t\t\tname: searchText.value,\r\n\t\t});\r\n\t}\r\n\r\n\tif (props.multiselect) {\r\n\t\titems = items.filter(item => !isSelected(item));\r\n\t}\r\n\r\n\treturn items;\r\n});\r\n\r\n/**\r\n * Выбрать значение\r\n *\r\n * Управляет закрытием окна\r\n */\r\nconst selectItem = async (item: Item) => {\r\n\tif (props.multiselect) {\r\n\t\tif (!Array.isArray(model.value)) return;\r\n\r\n\t\tif (isSelected(item)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst newModel = [...model.value];\r\n\t\tnewModel.push({ ...item });\r\n\t\tmodel.value = newModel;\r\n\r\n\t\tif (Core.state.isMobile) {\r\n\t\t\tgetPopup()?.close();\r\n\t\t} else {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tgetPopup()?.recalcPosition();\r\n\t\t\t\tgetPopup()?.elPopupWidget?.querySelector('input')?.focus();\r\n\r\n\t\t\t\t// сбросить введенный текст, только если больше не найдено результатов\r\n\t\t\t\tif (searchText.value) {\r\n\t\t\t\t\tif (!itemsForShow.value.length) {\r\n\t\t\t\t\t\tsearchText.value = '';\r\n\t\t\t\t\t\tAPI.items.value = [];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t} else {\r\n\t\t// сбросить введенный текст\r\n\t\tif (searchText.value) {\r\n\t\t\tsearchText.value = '';\r\n\t\t\tAPI.items.value = [];\r\n\t\t}\r\n\r\n\t\tif (JSON.stringify(item) !== JSON.stringify(model.value)) {\r\n\t\t\tmodel.value = { ...item };\r\n\t\t}\r\n\r\n\t\tgetPopup()?.close();\r\n\t}\r\n};\r\n\r\n/**\r\n * Выбрать следующее значение\r\n */\r\nconst selectNextItem = () => {\r\n\tif (!Array.isArray(model.value)) {\r\n\t\tconst currentIndex = localItems.value.findIndex(item => item.id === (model.value as Item).id);\r\n\t\tconst nextIndex = (currentIndex + 1) % localItems.value.length;\r\n\t\tmodel.value = { ...localItems.value[nextIndex] };\r\n\t}\r\n};\r\n\r\n/**\r\n * Удалить выбранное значение по id\r\n * @param id\r\n */\r\nconst deleteItemById = async (id: Item['id']) => {\r\n\tif (Array.isArray(model.value)) {\r\n\t\tmodel.value = model.value.filter(item => item.id !== id);\r\n\r\n\t\tsetTimeout(() => {\r\n\t\t\tgetPopup()?.recalcPosition();\r\n\t\t});\r\n\t}\r\n};\r\n\r\nconst isOpened = ref(false); // флаг попап открыт\r\n\r\nif (props.apiRequest) {\r\n\twatch(isOpened, () => {\r\n\t\tif (isOpened.value) {\r\n\t\t\t// при открытии сразу выполнить поиск\r\n\t\t\tAPI.setSearchTextAndLoad(searchText.value, false);\r\n\t\t}\r\n\t});\r\n\r\n\t// отложенный поиск при вводе текста\r\n\twatch(searchText, () => API.setSearchTextAndLoad(searchText.value));\r\n}\r\n\r\nconst onScrollContentList = (e: Event) => {\r\n\tconst el = e.target as HTMLElement;\r\n\r\n\tif (el.scrollTop / (el.scrollHeight - el.offsetHeight) > 0.8) {\r\n\t\tAPI.loadAppend();\r\n\t}\r\n};\r\n</script>\r\n\r\n<template>\r\n\t<TopPopup\r\n\t\tref=\"popupRef\"\r\n\t\t@open=\"isOpened = true\"\r\n\t\t@close=\"isOpened = false\"\r\n\t\t@scrollContentList=\"apiRequest ? onScrollContentList($event) : undefined\"\r\n\t\t:notch=\"false\"\r\n\t\t:transitionDuration=\"0\"\r\n\t>\r\n\t\t<template #opener>\r\n\t\t\t<div\r\n\t\t\t\t:class=\"{\r\n\t\t\t\t\t'top-selector2' : true,\r\n\t\t\t\t\t'top-selector2-multiselect': multiselect,\r\n\t\t\t\t\t['top-size_' + size]: true,\r\n\t\t\t\t\t['top-disabled']: disabled,\r\n\t\t\t\t\t['top-forms-focusable']: !disabled,\r\n\t\t\t\t\t['top-error']: isError,\r\n\t\t\t\t}\"\r\n\t\t\t>\r\n\t\t\t\t<template v-if=\"multiselect\">\r\n\t\t\t\t\t<div class=\"top-selector2_activeItems\">\r\n\t\t\t\t\t\t<Selector2ItemMulti\r\n\t\t\t\t\t\t\tv-for=\"item of model as Array<Item>\"\r\n\t\t\t\t\t\t\t:id=\"item.id\"\r\n\t\t\t\t\t\t\t:name=\"item.name\"\r\n\t\t\t\t\t\t\t@delete=\"deleteItemById\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</template>\r\n\r\n\t\t\t\t<span v-if=\"!multiselect\" class=\"top-selector2_activeName top-ellipsis\">\r\n\t\t\t\t\t{{ !Array.isArray(model) ? model.name : '' }}\r\n\t\t\t\t</span>\r\n\r\n\t\t\t\t<span\r\n\t\t\t\t\tv-if=\"addChanger && !multiselect && localItems.length > 1 && !disabled\"\r\n\t\t\t\t\tclass=\"top-changer top-changer-selector\"\r\n\t\t\t\t\t@click.stop=\"selectNextItem\"\r\n\t\t\t\t></span>\r\n\t\t\t</div>\r\n\t\t</template>\r\n\r\n\t\t<template #widget>\r\n\t\t\t<TopPopupWidgetInput\r\n\t\t\t\ttitle=\"Поиск\"\r\n\t\t\t\ticon=\"\"\r\n\t\t\t\tv-model=\"searchText\"\r\n\t\t\t\t:isLoading=\"API.isLoading.value\"\r\n\t\t\t\t:placeholder=\"!Array.isArray(model) && !multiselect && showSelectedInInput ? model.name : placeholder\"\r\n\t\t\t/>\r\n\t\t</template>\r\n\r\n\t\t<template #contentList>\r\n\t\t\t<TopPopupListItem\r\n\t\t\t\tv-for=\"item of itemsForShow\"\r\n\t\t\t\t:class=\"{\r\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.name === item.name\r\n\t\t\t\t}\"\r\n\t\t\t\t:key=\"item.id ?? undefined\"\r\n\t\t\t\t@click.stop=\"selectItem(item)\"\r\n\t\t\t>\r\n\t\t\t\t<slot\r\n\t\t\t\t\tv-if=\"$slots.item\"\r\n\t\t\t\t\tname=\"item\"\r\n\t\t\t\t\t:item=\"item\"\r\n\t\t\t\t></slot>\r\n\r\n\t\t\t\t<template\r\n\t\t\t\t\tv-else\r\n\t\t\t\t>\r\n\t\t\t\t\t{{ item.name }}\r\n\t\t\t\t</template>\r\n\t\t\t</TopPopupListItem>\r\n\r\n\t\t\t<TopPopupListItem\r\n\t\t\t\tv-if=\"!itemsForShow.length\"\r\n\t\t\t\ttype=\"regular\"\r\n\t\t\t>\r\n\t\t\t\tНет результатов\r\n\t\t\t</TopPopupListItem>\r\n\t\t</template>\r\n\t</TopPopup>\r\n</template>\r\n\r\n<style module>\r\n.top-selector2 {\r\n\twidth: 180px;\r\n\tmin-height: var(--top-forms-base-height);\r\n\tbox-sizing: border-box;\r\n\tposition: relative;\r\n\tdisplay: flex;\r\n\toverflow: hidden;\r\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\r\n\tcolor: var(--top-forms-placeholder-color);\r\n\r\n\tborder-radius: var(--top-radius-2);\r\n\tborder: 1px solid var(--top-forms-border-color);\r\n\tbackground: var(--top-forms-background-color);\r\n}\r\n\r\n.top-selector2-multiselect {\r\n\twidth: unset;\r\n\tmin-width: 180px;\r\n\tpadding: var(--top-padding-1);\r\n}\r\n\r\n.top-selector2.top-active {\r\n\t--top-forms-border-color: var(--top-forms-border-color-hover);\r\n\t--top-forms-background-color: var(--top-forms-background-color-hover);\r\n}\r\n\r\n.top-selector2_activeItems {\r\n\tdisplay: flex;\r\n\tflex-wrap: wrap;\r\n\tgap: var(--top-padding-1);\r\n\tmax-width: 100%;\r\n}\r\n\r\n.top-selector2_activeName {\r\n\twhite-space: nowrap;\r\n}\r\n\r\n.top-changer-selector {\r\n\ttransform: translateX(-16px);\r\n}\r\n</style>\r\n","import type { ComponentCustomProps } from 'vue';\r\n\r\nimport EditArea from './editArea/editArea.vue';\r\nimport EditInput from './editInput/editInput.vue';\r\nimport RadioGroup from './radioGroup/radioGroup.vue';\r\nimport Selector2 from './selector2/selector2.vue';\r\nimport Menu from './menu/menu.vue';\r\n\r\nexport const TopEditArea = EditArea as typeof EditArea & ComponentCustomProps;\r\nexport const TopEditInput = EditInput as typeof EditInput & ComponentCustomProps;\r\nexport const TopRadioGroup = RadioGroup as typeof RadioGroup & ComponentCustomProps;\r\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\r\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\r\n"],"names":["props","__props","emit","__emit","localValue","ref","isFocused","isChanged","computed","cancelBtnText","submit","value","cancel","clickOnTitle","intermediateValue","watch","toRef","model","useModel","elRef","_a","item","_c","_b","_e","_d","uid","useAPI","apiRequest","minLength","useCache","items","isLoading","_searchText","_nextOffset","callAPIRequest","res","cacheKey","indexWithError","load","loadAppend","loadDebounce","debounce","searchText","useDebounce","itemAll","popupRef","getPopup","API","localItems","isSelected","checkNameForNullId","itemSelected","itemsForShow","searchString","searchStringInvertKeyboard","invertKeyboardLayout","itemName","selectItem","newModel","Core","selectNextItem","nextIndex","deleteItemById","id","isOpened","onScrollContentList","e","el","TopEditArea","EditArea","TopEditInput","EditInput","TopRadioGroup","RadioGroup","TopSelector2","Selector2","TopMenu","Menu"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- Open *demo.html* to see a list of all the glyphs in your font along with their codes/ligatures.
2
-
3
- To use the generated font in desktop programs, you can install the TTF font. In order to copy the character associated with each icon, refer to the text box at the bottom right corner of each glyph in demo.html. The character inside this text box may be invisible; but it can still be copied. See this guide for more info: https://icomoon.io/docs/#local-fonts
4
-
5
- You won't need any of the files located under the *demo-files* directory when including the generated font in your own projects.
6
-
7
- You can import *selection.json* back to the IcoMoon app using the *Import Icons* button (or via Main Menu → Manage Projects) to retrieve your icon selection.
1
+ Open *demo.html* to see a list of all the glyphs in your font along with their codes/ligatures.
2
+
3
+ To use the generated font in desktop programs, you can install the TTF font. In order to copy the character associated with each icon, refer to the text box at the bottom right corner of each glyph in demo.html. The character inside this text box may be invisible; but it can still be copied. See this guide for more info: https://icomoon.io/docs/#local-fonts
4
+
5
+ You won't need any of the files located under the *demo-files* directory when including the generated font in your own projects.
6
+
7
+ You can import *selection.json* back to the IcoMoon app using the *Import Icons* button (or via Main Menu → Manage Projects) to retrieve your icon selection.
@@ -1,161 +1,161 @@
1
- body {
2
- padding: 0;
3
- margin: 0;
4
- font-family: sans-serif;
5
- font-size: 1em;
6
- line-height: 1.5;
7
- color: #555;
8
- background: #fff;
9
- }
10
- h1 {
11
- font-size: 1.5em;
12
- font-weight: normal;
13
- }
14
- small {
15
- font-size: .66666667em;
16
- }
17
- a {
18
- color: #e74c3c;
19
- text-decoration: none;
20
- }
21
- a:hover, a:focus {
22
- box-shadow: 0 1px #e74c3c;
23
- }
24
- .bshadow0, input {
25
- box-shadow: inset 0 -2px #e7e7e7;
26
- }
27
- input:hover {
28
- box-shadow: inset 0 -2px #ccc;
29
- }
30
- input, fieldset {
31
- font-family: sans-serif;
32
- font-size: 1em;
33
- margin: 0;
34
- padding: 0;
35
- border: 0;
36
- }
37
- input {
38
- color: inherit;
39
- line-height: 1.5;
40
- height: 1.5em;
41
- padding: .25em 0;
42
- }
43
- input:focus {
44
- outline: none;
45
- box-shadow: inset 0 -2px #449fdb;
46
- }
47
- .glyph {
48
- font-size: 16px;
49
- width: 15em;
50
- padding-bottom: 1em;
51
- margin-right: 4em;
52
- margin-bottom: 1em;
53
- float: left;
54
- overflow: hidden;
55
- }
56
- .liga {
57
- width: 80%;
58
- width: calc(100% - 2.5em);
59
- }
60
- .talign-right {
61
- text-align: right;
62
- }
63
- .talign-center {
64
- text-align: center;
65
- }
66
- .bgc1 {
67
- background: #f1f1f1;
68
- }
69
- .fgc1 {
70
- color: #999;
71
- }
72
- .fgc0 {
73
- color: #000;
74
- }
75
- p {
76
- margin-top: 1em;
77
- margin-bottom: 1em;
78
- }
79
- .mvm {
80
- margin-top: .75em;
81
- margin-bottom: .75em;
82
- }
83
- .mtn {
84
- margin-top: 0;
85
- }
86
- .mtl, .mal {
87
- margin-top: 1.5em;
88
- }
89
- .mbl, .mal {
90
- margin-bottom: 1.5em;
91
- }
92
- .mal, .mhl {
93
- margin-left: 1.5em;
94
- margin-right: 1.5em;
95
- }
96
- .mhmm {
97
- margin-left: 1em;
98
- margin-right: 1em;
99
- }
100
- .mls {
101
- margin-left: .25em;
102
- }
103
- .ptl {
104
- padding-top: 1.5em;
105
- }
106
- .pbs, .pvs {
107
- padding-bottom: .25em;
108
- }
109
- .pvs, .pts {
110
- padding-top: .25em;
111
- }
112
- .unit {
113
- float: left;
114
- }
115
- .unitRight {
116
- float: right;
117
- }
118
- .size1of2 {
119
- width: 50%;
120
- }
121
- .size1of1 {
122
- width: 100%;
123
- }
124
- .clearfix:before, .clearfix:after {
125
- content: " ";
126
- display: table;
127
- }
128
- .clearfix:after {
129
- clear: both;
130
- }
131
- .hidden-true {
132
- display: none;
133
- }
134
- .textbox0 {
135
- width: 3em;
136
- background: #f1f1f1;
137
- padding: .25em .5em;
138
- line-height: 1.5;
139
- height: 1.5em;
140
- }
141
- #testDrive {
142
- display: block;
143
- padding-top: 24px;
144
- line-height: 1.5;
145
- }
146
- .fs0 {
147
- font-size: 16px;
148
- }
149
- .fs1 {
150
- font-size: 32px;
151
- }
152
- .fs2 {
153
- font-size: 14px;
154
- }
155
- .fs3 {
156
- font-size: 14px;
157
- }
158
- .fs4 {
159
- font-size: 8px;
160
- }
161
-
1
+ body {
2
+ padding: 0;
3
+ margin: 0;
4
+ font-family: sans-serif;
5
+ font-size: 1em;
6
+ line-height: 1.5;
7
+ color: #555;
8
+ background: #fff;
9
+ }
10
+ h1 {
11
+ font-size: 1.5em;
12
+ font-weight: normal;
13
+ }
14
+ small {
15
+ font-size: .66666667em;
16
+ }
17
+ a {
18
+ color: #e74c3c;
19
+ text-decoration: none;
20
+ }
21
+ a:hover, a:focus {
22
+ box-shadow: 0 1px #e74c3c;
23
+ }
24
+ .bshadow0, input {
25
+ box-shadow: inset 0 -2px #e7e7e7;
26
+ }
27
+ input:hover {
28
+ box-shadow: inset 0 -2px #ccc;
29
+ }
30
+ input, fieldset {
31
+ font-family: sans-serif;
32
+ font-size: 1em;
33
+ margin: 0;
34
+ padding: 0;
35
+ border: 0;
36
+ }
37
+ input {
38
+ color: inherit;
39
+ line-height: 1.5;
40
+ height: 1.5em;
41
+ padding: .25em 0;
42
+ }
43
+ input:focus {
44
+ outline: none;
45
+ box-shadow: inset 0 -2px #449fdb;
46
+ }
47
+ .glyph {
48
+ font-size: 16px;
49
+ width: 15em;
50
+ padding-bottom: 1em;
51
+ margin-right: 4em;
52
+ margin-bottom: 1em;
53
+ float: left;
54
+ overflow: hidden;
55
+ }
56
+ .liga {
57
+ width: 80%;
58
+ width: calc(100% - 2.5em);
59
+ }
60
+ .talign-right {
61
+ text-align: right;
62
+ }
63
+ .talign-center {
64
+ text-align: center;
65
+ }
66
+ .bgc1 {
67
+ background: #f1f1f1;
68
+ }
69
+ .fgc1 {
70
+ color: #999;
71
+ }
72
+ .fgc0 {
73
+ color: #000;
74
+ }
75
+ p {
76
+ margin-top: 1em;
77
+ margin-bottom: 1em;
78
+ }
79
+ .mvm {
80
+ margin-top: .75em;
81
+ margin-bottom: .75em;
82
+ }
83
+ .mtn {
84
+ margin-top: 0;
85
+ }
86
+ .mtl, .mal {
87
+ margin-top: 1.5em;
88
+ }
89
+ .mbl, .mal {
90
+ margin-bottom: 1.5em;
91
+ }
92
+ .mal, .mhl {
93
+ margin-left: 1.5em;
94
+ margin-right: 1.5em;
95
+ }
96
+ .mhmm {
97
+ margin-left: 1em;
98
+ margin-right: 1em;
99
+ }
100
+ .mls {
101
+ margin-left: .25em;
102
+ }
103
+ .ptl {
104
+ padding-top: 1.5em;
105
+ }
106
+ .pbs, .pvs {
107
+ padding-bottom: .25em;
108
+ }
109
+ .pvs, .pts {
110
+ padding-top: .25em;
111
+ }
112
+ .unit {
113
+ float: left;
114
+ }
115
+ .unitRight {
116
+ float: right;
117
+ }
118
+ .size1of2 {
119
+ width: 50%;
120
+ }
121
+ .size1of1 {
122
+ width: 100%;
123
+ }
124
+ .clearfix:before, .clearfix:after {
125
+ content: " ";
126
+ display: table;
127
+ }
128
+ .clearfix:after {
129
+ clear: both;
130
+ }
131
+ .hidden-true {
132
+ display: none;
133
+ }
134
+ .textbox0 {
135
+ width: 3em;
136
+ background: #f1f1f1;
137
+ padding: .25em .5em;
138
+ line-height: 1.5;
139
+ height: 1.5em;
140
+ }
141
+ #testDrive {
142
+ display: block;
143
+ padding-top: 24px;
144
+ line-height: 1.5;
145
+ }
146
+ .fs0 {
147
+ font-size: 16px;
148
+ }
149
+ .fs1 {
150
+ font-size: 32px;
151
+ }
152
+ .fs2 {
153
+ font-size: 14px;
154
+ }
155
+ .fs3 {
156
+ font-size: 14px;
157
+ }
158
+ .fs4 {
159
+ font-size: 8px;
160
+ }
161
+
@@ -1,30 +1,30 @@
1
- if (!('boxShadow' in document.body.style)) {
2
- document.body.setAttribute('class', 'noBoxShadow');
3
- }
4
-
5
- document.body.addEventListener("click", function(e) {
6
- var target = e.target;
7
- if (target.tagName === "INPUT" &&
8
- target.getAttribute('class').indexOf('liga') === -1) {
9
- target.select();
10
- }
11
- });
12
-
13
- (function() {
14
- var fontSize = document.getElementById('fontSize'),
15
- testDrive = document.getElementById('testDrive'),
16
- testText = document.getElementById('testText');
17
- function updateTest() {
18
- testDrive.innerHTML = testText.value || String.fromCharCode(160);
19
- if (window.icomoonLiga) {
20
- window.icomoonLiga(testDrive);
21
- }
22
- }
23
- function updateSize() {
24
- testDrive.style.fontSize = fontSize.value + 'px';
25
- }
26
- fontSize.addEventListener('change', updateSize, false);
27
- testText.addEventListener('input', updateTest, false);
28
- testText.addEventListener('change', updateTest, false);
29
- updateSize();
30
- }());
1
+ if (!('boxShadow' in document.body.style)) {
2
+ document.body.setAttribute('class', 'noBoxShadow');
3
+ }
4
+
5
+ document.body.addEventListener("click", function(e) {
6
+ var target = e.target;
7
+ if (target.tagName === "INPUT" &&
8
+ target.getAttribute('class').indexOf('liga') === -1) {
9
+ target.select();
10
+ }
11
+ });
12
+
13
+ (function() {
14
+ var fontSize = document.getElementById('fontSize'),
15
+ testDrive = document.getElementById('testDrive'),
16
+ testText = document.getElementById('testText');
17
+ function updateTest() {
18
+ testDrive.innerHTML = testText.value || String.fromCharCode(160);
19
+ if (window.icomoonLiga) {
20
+ window.icomoonLiga(testDrive);
21
+ }
22
+ }
23
+ function updateSize() {
24
+ testDrive.style.fontSize = fontSize.value + 'px';
25
+ }
26
+ fontSize.addEventListener('change', updateSize, false);
27
+ testText.addEventListener('input', updateTest, false);
28
+ testText.addEventListener('change', updateTest, false);
29
+ updateSize();
30
+ }());