@topvisor/ui 1.0.35 → 1.0.36

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 (197) hide show
  1. package/.chunks/{core-DipMf5fL.es.js → core-CO5q-OhH.es.js} +13 -12
  2. package/.chunks/core-CO5q-OhH.es.js.map +1 -0
  3. package/.chunks/core-D-ONEIDC.amd.js +2 -0
  4. package/.chunks/{core-DipMf5fL.es.js.map → core-D-ONEIDC.amd.js.map} +1 -1
  5. package/.chunks/{datepicker-CkmL14DR.amd.js → datepicker-BKWD8N4r.amd.js} +2 -2
  6. package/.chunks/{datepicker-CkmL14DR.amd.js.map → datepicker-BKWD8N4r.amd.js.map} +1 -1
  7. package/.chunks/{datepicker-CSXTkKbz.es.js → datepicker-BfPUBUE1.es.js} +2 -2
  8. package/.chunks/{datepicker-CSXTkKbz.es.js.map → datepicker-BfPUBUE1.es.js.map} +1 -1
  9. package/.chunks/{dialog_selectorRegions-DrwLBBcE.es.js → dialog_selectorRegions-D3CnPt4V.es.js} +4 -4
  10. package/.chunks/{dialog_selectorRegions-DrwLBBcE.es.js.map → dialog_selectorRegions-D3CnPt4V.es.js.map} +1 -1
  11. package/.chunks/{dialog_selectorRegions-UF09pD6-.amd.js → dialog_selectorRegions-DYPTw--e.amd.js} +2 -2
  12. package/.chunks/{dialog_selectorRegions-UF09pD6-.amd.js.map → dialog_selectorRegions-DYPTw--e.amd.js.map} +1 -1
  13. package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-Dvauzr0y.amd.js → dialogs.vue_vue_type_script_setup_true_lang-C5vfO9ia.amd.js} +2 -2
  14. package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-Dvauzr0y.amd.js.map → dialogs.vue_vue_type_script_setup_true_lang-C5vfO9ia.amd.js.map} +1 -1
  15. package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-jCRcr8b0.es.js → dialogs.vue_vue_type_script_setup_true_lang-CEkc3TYu.es.js} +2 -2
  16. package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-jCRcr8b0.es.js.map → dialogs.vue_vue_type_script_setup_true_lang-CEkc3TYu.es.js.map} +1 -1
  17. package/.chunks/{forms-DvEX_A0C.amd.js → forms-DPIu5wcK.amd.js} +3 -3
  18. package/.chunks/{forms-DvEX_A0C.amd.js.map → forms-DPIu5wcK.amd.js.map} +1 -1
  19. package/.chunks/{forms-gknXHfMr.es.js → forms-YZl4XC4S.es.js} +300 -280
  20. package/.chunks/{forms-gknXHfMr.es.js.map → forms-YZl4XC4S.es.js.map} +1 -1
  21. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-CFOaqhEN.es.js → listItem.vue_vue_type_script_setup_true_lang-CDrG3onO.es.js} +2 -2
  22. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-CFOaqhEN.es.js.map → listItem.vue_vue_type_script_setup_true_lang-CDrG3onO.es.js.map} +1 -1
  23. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-DzidIHjH.amd.js → listItem.vue_vue_type_script_setup_true_lang-CTbTjIda.amd.js} +2 -2
  24. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-DzidIHjH.amd.js.map → listItem.vue_vue_type_script_setup_true_lang-CTbTjIda.amd.js.map} +1 -1
  25. package/.chunks/{menu.vue_vue_type_style_index_0_lang-Di2dBh6s.es.js → menu.vue_vue_type_style_index_0_lang-2vtQvU8o.es.js} +2 -2
  26. package/.chunks/{menu.vue_vue_type_style_index_0_lang-BTEBvb7v.amd.js.map → menu.vue_vue_type_style_index_0_lang-2vtQvU8o.es.js.map} +1 -1
  27. package/.chunks/{menu.vue_vue_type_style_index_0_lang-BTEBvb7v.amd.js → menu.vue_vue_type_style_index_0_lang-QsJS5sEm.amd.js} +2 -2
  28. package/.chunks/menu.vue_vue_type_style_index_0_lang-QsJS5sEm.amd.js.map +1 -0
  29. package/.chunks/{notice-CNEYYEEf.amd.js → notice-CwPCnQ9k.amd.js} +2 -2
  30. package/.chunks/{notice-CNEYYEEf.amd.js.map → notice-CwPCnQ9k.amd.js.map} +1 -1
  31. package/.chunks/{notice-B1bqWjOr.es.js → notice-CysocnDZ.es.js} +2 -2
  32. package/.chunks/{notice-B1bqWjOr.es.js.map → notice-CysocnDZ.es.js.map} +1 -1
  33. package/.chunks/{page.vue_vue_type_script_setup_true_lang-rQWGIFXD.es.js → page.vue_vue_type_script_setup_true_lang-DOTfcVUC.es.js} +4 -4
  34. package/.chunks/{page.vue_vue_type_script_setup_true_lang-rQWGIFXD.es.js.map → page.vue_vue_type_script_setup_true_lang-DOTfcVUC.es.js.map} +1 -1
  35. package/.chunks/{page.vue_vue_type_script_setup_true_lang-Z_tJYuPX.amd.js → page.vue_vue_type_script_setup_true_lang-vzWb9Ehr.amd.js} +2 -2
  36. package/.chunks/{page.vue_vue_type_script_setup_true_lang-Z_tJYuPX.amd.js.map → page.vue_vue_type_script_setup_true_lang-vzWb9Ehr.amd.js.map} +1 -1
  37. package/.chunks/{popup-B62kTGwH.es.js → popup-Cbr1ckCd.es.js} +2 -2
  38. package/.chunks/{popup-B62kTGwH.es.js.map → popup-Cbr1ckCd.es.js.map} +1 -1
  39. package/.chunks/{popup-sy_pGJeq.amd.js → popup-DdvupIju.amd.js} +2 -2
  40. package/.chunks/{popup-sy_pGJeq.amd.js.map → popup-DdvupIju.amd.js.map} +1 -1
  41. package/.chunks/{utils-CIbDLh5d.es.js → utils-ASIXzycS.es.js} +3 -3
  42. package/.chunks/{utils-CIbDLh5d.es.js.map → utils-ASIXzycS.es.js.map} +1 -1
  43. package/.chunks/{utils-DnAJ2MaK.es.js → utils-Bjl0RkKM.es.js} +2 -2
  44. package/.chunks/{utils-DnAJ2MaK.es.js.map → utils-Bjl0RkKM.es.js.map} +1 -1
  45. package/.chunks/{utils-abiX7BcR.amd.js → utils-CkpzFGzD.amd.js} +2 -2
  46. package/.chunks/{utils-abiX7BcR.amd.js.map → utils-CkpzFGzD.amd.js.map} +1 -1
  47. package/.chunks/{utils-CtUqTcmN.amd.js → utils-D_OVY7zV.amd.js} +2 -2
  48. package/.chunks/{utils-CtUqTcmN.amd.js.map → utils-D_OVY7zV.amd.js.map} +1 -1
  49. package/assets/forms.css +1 -1
  50. package/charts/charts.amd.js +1 -1
  51. package/charts/charts.amd.js.map +1 -1
  52. package/charts/charts.js +1 -1
  53. package/charts/charts.js.map +1 -1
  54. package/components/charts/miniChart/miniChart.vue.d.ts +1 -1
  55. package/components/charts/miniCharts/miniCharts.d.ts +1 -1
  56. package/components/charts/miniCharts/miniCharts.vue.d.ts +1 -1
  57. package/components/charts/miniCharts/stories/dummy.d.ts +1 -1
  58. package/components/forms/avatar/avatar.vue.d.ts +1 -1
  59. package/components/forms/caption/caption.vue.d.ts +17 -0
  60. package/components/forms/caption/types.d.ts +9 -0
  61. package/components/forms/checkbox/checkbox.vue.d.ts +1 -1
  62. package/components/forms/controlLabel/controlLabel.vue.d.ts +1 -1
  63. package/components/forms/forms.d.ts +2 -0
  64. package/components/forms/hint/hint.vue.d.ts +1 -1
  65. package/components/forms/input/input.vue.d.ts +1 -1
  66. package/components/forms/inputDate/inputDate.vue.d.ts +1 -1
  67. package/components/forms/inputDate/types.d.ts +1 -0
  68. package/components/forms/radio/radio.vue.d.ts +1 -1
  69. package/components/forms/select/select.vue.d.ts +1 -1
  70. package/components/forms/select/stories/exampleOptions.d.ts +1 -1
  71. package/components/forms/switcher/switcher.vue.d.ts +1 -1
  72. package/components/forms/textarea/textarea.vue.d.ts +1 -1
  73. package/components/forms/textarea/{textarea.d.ts → types.d.ts} +4 -0
  74. package/components/formsExt/checkboxGroup/checkboxGroup.vue.d.ts +1 -1
  75. package/components/formsExt/editArea/editArea.vue.d.ts +1 -1
  76. package/components/formsExt/editArea/{editArea.d.ts → types.d.ts} +1 -1
  77. package/components/formsExt/editInput/editInput.vue.d.ts +1 -1
  78. package/components/formsExt/editInput/{editInput.d.ts → types.d.ts} +1 -1
  79. package/components/formsExt/menu/menu.vue.d.ts +1 -1
  80. package/components/formsExt/menu/stories/items.d.ts +1 -1
  81. package/components/formsExt/radioGroup/radioGroup.vue.d.ts +1 -1
  82. package/components/formsExt/selector2/{api.d.ts → composables/useAPI.d.ts} +15 -1
  83. package/components/formsExt/selector2/composables/useMenu.d.ts +12 -0
  84. package/components/formsExt/selector2/itemMulti.vue.d.ts +1 -1
  85. package/components/formsExt/selector2/selector2.vue.d.ts +3 -3
  86. package/components/formsExt/selector2/utils.d.ts +6 -0
  87. package/components/popup/alert/alert.vue.d.ts +2 -2
  88. package/components/popup/alert/{alert.d.ts → types.d.ts} +1 -1
  89. package/components/popup/confirm/confirm.vue.d.ts +2 -2
  90. package/components/popup/confirm/{confirm.d.ts → types.d.ts} +1 -1
  91. package/components/popup/lib/worker.d.ts +2 -2
  92. package/components/popup/popup/listItem.vue.d.ts +1 -1
  93. package/components/popup/popup/opener.vue.d.ts +1 -1
  94. package/components/popup/popup/popup.vue.d.ts +1 -1
  95. package/components/popup/popup/widgetInput.vue.d.ts +1 -1
  96. package/components/popup/prompt/prompt.vue.d.ts +2 -2
  97. package/components/popup/prompt/{prompt.d.ts → types.d.ts} +1 -1
  98. package/components/project/selectorCompetitors/composables.d.ts +1 -2
  99. package/components/project/selectorCompetitors/selectorCompetitors.vue.d.ts +1 -1
  100. package/components/project/selectorCompetitors/stories/items.d.ts +1 -1
  101. package/components/project/selectorCompetitors/{selectorCompetitors.d.ts → types.d.ts} +7 -0
  102. package/components/project/selectorRegion/composables/compare.d.ts +1 -1
  103. package/components/project/selectorRegion/composables/selectRegion.d.ts +2 -2
  104. package/components/project/selectorRegion/composables/selectSearcher.d.ts +2 -2
  105. package/components/project/selectorRegion/composables/selectorRegion.d.ts +2 -2
  106. package/components/project/selectorRegion/dialog_selectorRegions/types.d.ts +1 -1
  107. package/components/project/selectorRegion/selectorRegion.vue.d.ts +1 -1
  108. package/components/project/selectorRegion/stories/searchers.d.ts +1 -1
  109. package/components/project/selectorRegion/utils/consts.d.ts +1 -1
  110. package/components/project/selectorRegion/utils/utils.d.ts +1 -1
  111. package/components/project/tagSelector/popupOpener/types.d.ts +2 -0
  112. package/components/project/tagSelector/types.d.ts +2 -0
  113. package/components/project/tagSelector/utils/el.d.ts +1 -1
  114. package/components/tabs/tabs/content.vue.d.ts +1 -1
  115. package/components/tabs/tabs/tab.vue.d.ts +1 -1
  116. package/components/tabs/tabs/tabs.vue.d.ts +1 -1
  117. package/components/tabsView/tabsView/menu.vue.d.ts +1 -1
  118. package/components/tabsView/tabsView/menuItem.vue.d.ts +1 -1
  119. package/components/tabsView/tabsView/menuTitle.vue.d.ts +1 -1
  120. package/components/tabsView/tabsView/store.d.ts +12 -0
  121. package/components/tabsView/tabsView/tabsView.vue.d.ts +1 -1
  122. package/core/app.amd.js +1 -1
  123. package/core/app.js +5 -5
  124. package/core/utils/store.d.ts +1 -1
  125. package/dialog/dialog.amd.js +1 -1
  126. package/dialog/dialog.js +2 -2
  127. package/forms/forms.amd.js +1 -1
  128. package/forms/forms.js +8 -7
  129. package/formsExt/formsExt.amd.js +1 -1
  130. package/formsExt/formsExt.amd.js.map +1 -1
  131. package/formsExt/formsExt.js +310 -309
  132. package/formsExt/formsExt.js.map +1 -1
  133. package/icomoon/Topvisor icons.json +82 -36
  134. package/icomoon/demo.html +29 -1
  135. package/icomoon/fonts/Topvisor-2.eot +0 -0
  136. package/icomoon/fonts/Topvisor-2.svg +2 -0
  137. package/icomoon/fonts/Topvisor-2.ttf +0 -0
  138. package/icomoon/fonts/Topvisor-2.woff +0 -0
  139. package/icomoon/selection.json +1 -1
  140. package/icomoon/style.css +11 -5
  141. package/layout/layout.amd.js +1 -1
  142. package/layout/layout.js +1 -1
  143. package/package.json +1 -1
  144. package/popup/popup.amd.js +1 -1
  145. package/popup/popup.amd.js.map +1 -1
  146. package/popup/popup.js +2 -2
  147. package/popup/popup.js.map +1 -1
  148. package/popup/worker.amd.js +1 -1
  149. package/popup/worker.amd.js.map +1 -1
  150. package/popup/worker.js +3 -3
  151. package/popup/worker.js.map +1 -1
  152. package/project/project.amd.js +1 -1
  153. package/project/project.amd.js.map +1 -1
  154. package/project/project.js +244 -241
  155. package/project/project.js.map +1 -1
  156. package/tabsView/tabsView.amd.js +1 -1
  157. package/tabsView/tabsView.amd.js.map +1 -1
  158. package/tabsView/tabsView.js +1 -1
  159. package/tabsView/tabsView.js.map +1 -1
  160. package/utils/clipboard.amd.js +1 -1
  161. package/utils/clipboard.js +1 -1
  162. package/utils/date.amd.js +1 -1
  163. package/utils/date.js +1 -1
  164. package/utils/device.amd.js +1 -1
  165. package/utils/device.js +1 -1
  166. package/utils/lodash.amd.js +1 -1
  167. package/utils/lodash.js +1 -1
  168. package/utils/price.amd.js +1 -1
  169. package/utils/price.js +1 -1
  170. package/utils/searchers.amd.js +1 -1
  171. package/utils/searchers.js +3 -3
  172. package/utils/string.amd.js +1 -1
  173. package/utils/string.amd.js.map +1 -1
  174. package/utils/string.js +1 -1
  175. package/utils/string.js.map +1 -1
  176. package/.chunks/core-MEpuX1uJ.amd.js +0 -2
  177. package/.chunks/core-MEpuX1uJ.amd.js.map +0 -1
  178. package/.chunks/menu.vue_vue_type_style_index_0_lang-Di2dBh6s.es.js.map +0 -1
  179. package/components/forms/inputDate/inputDate.d.ts +0 -3
  180. package/components/project/selectorCompetitors/types/competitor.d.ts +0 -7
  181. /package/components/charts/miniChart/{miniChart.d.ts → types.d.ts} +0 -0
  182. /package/components/forms/avatar/{avatar.d.ts → types.d.ts} +0 -0
  183. /package/components/forms/checkbox/{checkbox.d.ts → types.d.ts} +0 -0
  184. /package/components/forms/controlLabel/{controlLabel.d.ts → types.d.ts} +0 -0
  185. /package/components/forms/hint/{hint.d.ts → types.d.ts} +0 -0
  186. /package/components/forms/input/{input.d.ts → types.d.ts} +0 -0
  187. /package/components/forms/inputRange/{inputRange.d.ts → types.d.ts} +0 -0
  188. /package/components/forms/radio/{radio.d.ts → types.d.ts} +0 -0
  189. /package/components/forms/select/{select.d.ts → types.d.ts} +0 -0
  190. /package/components/forms/switcher/{switcher.d.ts → types.d.ts} +0 -0
  191. /package/components/formsExt/menu/{menu.d.ts → types.d.ts} +0 -0
  192. /package/components/formsExt/radioGroup/{radioGroup.d.ts → types.d.ts} +0 -0
  193. /package/components/formsExt/selector2/{selector2.d.ts → types.d.ts} +0 -0
  194. /package/components/popup/popup/{popup.d.ts → types.d.ts} +0 -0
  195. /package/components/project/selectorRegion/{selectorRegion.d.ts → types.d.ts} +0 -0
  196. /package/components/tabs/tabs/{tabs.d.ts → types.d.ts} +0 -0
  197. /package/components/tabsView/tabsView/{tabsView.d.ts → types.d.ts} +0 -0
@@ -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/checkboxGroup/checkboxGroup.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\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 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-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\t:icon=\"$core.state.isMobile ? '': ''\"\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@click=\"cancel\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ cancelText }}\n\t\t\t\t\t</template>\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=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ submitText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.top-editArea {\n\t--top-editArea-bottom: env(keyboard-inset-height, 0px);\n\t--top-editArea-offset-bottom: 0px;\n\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\toutline: none;\n}\n\n.top-editArea_form:not(.top-error):hover,\n.top-editArea_form:not(.top-error).top-focus {\n\tborder-color: var(--top-forms-border-color-hover);\n}\n\n/* textarea в EditArea */\n.top-textarea {\n\twidth: 100%;\n}\n\n.top-editArea_element.top-textarea_textarea {\n\t--top-forms-border-width: 0px;\n\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\talign-self: flex-end;\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\tposition: fixed;\n\tbottom: calc(var(--top-editArea-offset-bottom) + var(--top-editArea-bottom));\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\n\ttransition: bottom var(--transition-fast);\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@media screen and (max-width: 900px) {\n\t.top-editArea_form{\n\t\tflex-direction: row;\n\t}\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>\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 } from './radioGroup';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\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>\n.top-radioGroup {\n\tuser-select: none;\n\tbox-sizing: border-box;\n\tborder-radius: 8px;\n\tbackground-color: var(--color-layout-middle);\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-layout-front-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/* selected */\n.top-radioGroup_item-selected {\n\tcolor: var(--color-text-1);\n\tpointer-events: none;\n\tbackground-color: var(--color-bg-lightning-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-1);\n}\n\n/* top-error */\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\n\tborder-color: var(--color-line-negative-1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nwithDefaults(defineProps<Props>(), {\n\tsize: 's',\n\tstyling: 'outline',\n});\n\nconst onChange = (id: Props['modelValue'][number]) => {\n\tconst newModel = [...model.value];\n\tconst index = newModel.indexOf(id);\n\n\tif (index === -1) {\n\t\tnewModel.push(id);\n\t} else {\n\t\tnewModel.splice(index, 1);\n\t}\n\n\tmodel.value = newModel;\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n \t\t['top-checkboxGroup']: true,\n \t\t['top-checkboxGroup-' + styling]: true,\n \t\t['top-scrollBarXHidding']: true,\n \t\t['top-size_' + size]: !!size,\n \t\t['top-error']: isError,\n \t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item in items\"\n\t\t\t:key=\"item.id\"\n\t\t\t:class=\"{\n\t\t\t\t['top-checkboxGroup_item']: true,\n\t\t\t\t['top-checkboxGroup_item-selected']: model.includes(item.id),\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>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"top-unvisible\"\n\t\t\t\t:value=\"item.id\"\n\t\t\t\t:checked=\"model.includes(item.id)\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t\t@change=\"onChange(item.id)\"\n\t\t\t/>\n\n\t\t\t{{ item.title }}\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-checkboxGroup {\n\tuser-select: none;\n\tborder-radius: 8px;\n\theight: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tdisplay: flex;\n}\n\n.top-checkboxGroup_item {\n\tbox-sizing: border-box;\n\tpadding: 1px var(--top-padding-4);\n\tcursor: pointer;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tjustify-content: center;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n/* outline */\n.top-checkboxGroup-outline {\n\tborder: 1px solid var(--color-line-1);\n\tbackground: var(--color-layout-front-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item {\n\theight: calc(var(--top-forms-base-height) - 2px);\n\tmin-height: 100%;\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-primary-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n\n/* borderless */\n.top-checkboxGroup-borderless {\n\tpadding: 2px;\n\tbackground: var(--color-bg-shading-2);\n\tgap: 2px;\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item {\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item:hover {\n\tbox-shadow: var(--top-shadow-s);\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n</style>\n","import { 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<Item[]>([]);\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: 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\tvoid loadDebounce();\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 { ComputedRef, ModelRef, ComponentInstance } from 'vue';\nimport { computed, ref, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport { TopPreloader } from '@/components/forms/forms';\nimport type { TopLibPopup } 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\tshowSearch: true,\n});\n\nconst model = defineModel<Props['modelValue']>() as ModelRef<Props['modelValue']>;\n\ndefineSlots<Slots>();\n\n/**\n * Текст поиска по результатам\n */\nconst searchText = ref('');\n\n/**\n * Сброс поиска\n */\nconst resetSearch = () => {\n\tsearchText.value = '';\n\tAPI.items.value = [];\n};\n\nconst itemAll = {\n\tid: 0,\n\tname: useI18n().Common.All!,\n};\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<ComponentInstance<typeof TopPopup> | null>(null);\n\n/**\n * Основной элемент селектора\n */\nconst elRef = ref<HTMLElement | null>(null);\n\n/**\n * Получить доступ к объекту popup\n */\nconst getPopup = (): TopLibPopup | 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\tsetTimeout(() => {\n\t\t\t\tgetPopup()?.recalcPosition();\n\t\t\t\tgetPopup()?.elPopupWidget?.querySelector('input')?.focus();\n\n\t\t\t\tif (searchText.value) resetSearch();\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif (JSON.stringify(item) !== JSON.stringify(model.value)) {\n\t\t\tmodel.value = { ...item };\n\t\t}\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\nconst onClose = () => {\n\tisOpened.value = false;\n\n\telRef.value?.focus();\n\n\tif (searchText.value) resetSearch();\n};\n</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"isOpened = true\"\n\t\t@close=\"onClose()\"\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\tref=\"elRef\"\n\t\t\t\tv-top-focus.onupdate=\"isError\"\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\t@keydown.up.down.enter.space.stop.prevent=\"($event.currentTarget as HTMLElement).click()\"\n\t\t\t\t@keydown.delete=\"model = []\"\n\t\t\t\ttabindex=\"0\"\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 v-if=\"showSearch\">\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 && !apiRequest?.params.offset\"\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.id === item.id && model.name === item.name,\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t:closeByClick=\"!multiselect || Core.state.isMobile\"\n\t\t\t\t@click=\"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=\"!API.isLoading.value && !itemsForShow.length\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.No_results }}\n\t\t\t</TopPopupListItem>\n\n\t\t\t<!-- Индикатор загрузки, первичная дозагрузка отображается в поле поиска, если оно отображено -->\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"API.isLoading.value && (!showSearch || apiRequest?.params.offset)\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t<TopPreloader type=\"circles\"/>\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\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}\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 CheckboxGroup from './checkboxGroup/checkboxGroup.vue';\nimport Selector2 from './selector2/selector2.vue';\nimport Menu from './menu/menu.vue';\nimport Info from './info/info.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 TopCheckboxGroup = CheckboxGroup as typeof CheckboxGroup & ComponentCustomProps;\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\n"],"names":["props","__props","emit","__emit","localValue","ref","isFocused","isChanged","computed","submit","value","cancel","clickOnTitle","intermediateValue","watch","toRef","model","useModel","elRef","_a","item","_c","_b","_e","_d","uid","onChange","id","newModel","index","useAPI","apiRequest","minLength","useCache","items","isLoading","_searchText","_nextOffset","callAPIRequest","res","cacheKey","indexWithError","load","loadAppend","loadDebounce","debounce","searchText","useDebounce","resetSearch","API","itemAll","useI18n","popupRef","getPopup","localItems","isSelected","checkNameForNullId","itemSelected","itemsForShow","searchString","searchStringInvertKeyboard","invertKeyboardLayout","itemName","selectItem","Core","selectNextItem","nextIndex","deleteItemById","isOpened","onScrollContentList","el","onClose","TopEditArea","_sfc_main$6","TopEditInput","_sfc_main$5","TopRadioGroup","_sfc_main$4","TopCheckboxGroup","_sfc_main$3","TopSelector2","_sfc_main$1","TopMenu","_sfc_main$a","TopInfo","_sfc_main"],"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/checkboxGroup/checkboxGroup.vue","../../src/components/formsExt/selector2/composables/useAPI.ts","../../src/components/formsExt/selector2/utils.ts","../../src/components/formsExt/selector2/composables/useMenu.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 './types';\nimport Textarea from '@/components/forms/textarea/textarea.vue';\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 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-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\t:icon=\"$core.state.isMobile ? '': ''\"\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@click=\"cancel\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ cancelText }}\n\t\t\t\t\t</template>\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=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ submitText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.top-editArea {\n\t--top-editArea-bottom: env(keyboard-inset-height, 0px);\n\t--top-editArea-offset-bottom: 0px;\n\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\toutline: none;\n}\n\n.top-editArea_form:not(.top-error):hover,\n.top-editArea_form:not(.top-error).top-focus {\n\tborder-color: var(--top-forms-border-color-hover);\n}\n\n/* textarea в EditArea */\n.top-textarea {\n\twidth: 100%;\n}\n\n.top-editArea_element.top-textarea_textarea {\n\t--top-forms-border-width: 0px;\n\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\talign-self: flex-end;\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\tposition: fixed;\n\tbottom: calc(var(--top-editArea-offset-bottom) + var(--top-editArea-bottom));\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\n\ttransition: bottom var(--transition-fast);\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@media screen and (max-width: 900px) {\n\t.top-editArea_form{\n\t\tflex-direction: row;\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './types';\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>\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 } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\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>\n.top-radioGroup {\n\tuser-select: none;\n\tbox-sizing: border-box;\n\tborder-radius: 8px;\n\tbackground-color: var(--color-layout-middle);\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-layout-front-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/* selected */\n.top-radioGroup_item-selected {\n\tcolor: var(--color-text-1);\n\tpointer-events: none;\n\tbackground-color: var(--color-bg-lightning-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-1);\n}\n\n/* top-error */\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\n\tborder-color: var(--color-line-negative-1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nwithDefaults(defineProps<Props>(), {\n\tsize: 's',\n\tstyling: 'outline',\n});\n\nconst onChange = (id: Props['modelValue'][number]) => {\n\tconst newModel = [...model.value];\n\tconst index = newModel.indexOf(id);\n\n\tif (index === -1) {\n\t\tnewModel.push(id);\n\t} else {\n\t\tnewModel.splice(index, 1);\n\t}\n\n\tmodel.value = newModel;\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n \t\t['top-checkboxGroup']: true,\n \t\t['top-checkboxGroup-' + styling]: true,\n \t\t['top-scrollBarXHidding']: true,\n \t\t['top-size_' + size]: !!size,\n \t\t['top-error']: isError,\n \t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item in items\"\n\t\t\t:key=\"item.id\"\n\t\t\t:class=\"{\n\t\t\t\t['top-checkboxGroup_item']: true,\n\t\t\t\t['top-checkboxGroup_item-selected']: model.includes(item.id),\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>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"top-unvisible\"\n\t\t\t\t:value=\"item.id\"\n\t\t\t\t:checked=\"model.includes(item.id)\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t\t@change=\"onChange(item.id)\"\n\t\t\t/>\n\n\t\t\t{{ item.title }}\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-checkboxGroup {\n\tuser-select: none;\n\tborder-radius: 8px;\n\theight: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tdisplay: flex;\n}\n\n.top-checkboxGroup_item {\n\tbox-sizing: border-box;\n\tpadding: 1px var(--top-padding-4);\n\tcursor: pointer;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tjustify-content: center;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n/* outline */\n.top-checkboxGroup-outline {\n\tborder: 1px solid var(--color-line-1);\n\tbackground: var(--color-layout-front-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item {\n\theight: calc(var(--top-forms-base-height) - 2px);\n\tmin-height: 100%;\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-primary-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n\n/* borderless */\n.top-checkboxGroup-borderless {\n\tpadding: 2px;\n\tbackground: var(--color-bg-shading-2);\n\tgap: 2px;\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item {\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item:hover {\n\tbox-shadow: var(--top-shadow-s);\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n</style>\n","import { ref } from 'vue';\nimport { debounce } from '../../../../core/utils/lodash';\nimport type { Item, Props } from '../types';\n\nexport type API = ReturnType<typeof useAPI>;\n\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items = ref<Item[]>([]);\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: 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\tvoid loadDebounce();\n\t\t} else {\n\t\t\tvoid load();\n\t\t}\n\t};\n\n\treturn {\n\t\tapiRequest,\n\t\titems,\n\t\tisLoading,\n\t\tloadAppend,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","import type { Item, Props } from './types';\n\nexport const ITEM_ID_ALL = 0;\n\n/**\n * Выбран ли элемент\n */\nexport const isSelected = (modelValue: Props['modelValue'], item: Item, checkNameForNullId = true) => {\n\tif (checkNameForNullId && item.id === null) {\n\t\tif (Array.isArray(modelValue)) {\n\t\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\n\t\t} else {\n\t\t\treturn item.name === modelValue.name;\n\t\t}\n\t}\n\n\tif (Array.isArray(modelValue)) {\n\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id);\n\t} else {\n\t\treturn item.id === modelValue.id;\n\t}\n};\n","import { computed, ref, type ComputedRef, type Ref } from 'vue';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport type { Item, Props } from '../types';\nimport { type API } from './useAPI';\nimport { isSelected, ITEM_ID_ALL } from '../utils';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Функционал поиска\n */\nexport const useMenu = (\n\tmodel: Ref<Props['modelValue']>,\n\titems: Ref<Props['items']>,\n\tmultiselect: Props['multiselect'],\n\tappendAllValue: Ref<Props['appendAllValue']>,\n\tappendSearchToResult: Ref<Props['appendSearchToResult']>,\n\tapi: API,\n) => {\n\t/**\n\t * Текст поиска по результатам\n\t */\n\tconst searchText = ref('');\n\n\t/**\n\t * Объект, представляющий опцию \"Все\"\n\t */\n\tconst itemAll = {\n\t\tid: ITEM_ID_ALL,\n\t\tname: useI18n().Common.All,\n\t};\n\n\t/**\n\t * Сброс поиска\n\t */\n\tconst resetSearch = () => {\n\t\tsearchText.value = '';\n\t\tapi.items.value = [];\n\t};\n\n\t/**\n\t * Варианты выбора: props.items + \"Выбрать все\"\n\t */\n\tconst localItems: ComputedRef<Item[]> = computed(() => {\n\t\tconst localItems: Item[] = [];\n\n\t\tif (!multiselect && appendAllValue.value) {\n\t\t\tlocalItems.push(itemAll);\n\t\t}\n\n\t\titems.value?.forEach(item => localItems.push({ ...item }));\n\n\t\treturn localItems;\n\t});\n\n\t/**\n\t * Подготовленный список меню, который содержит в сумме:\n\t * - prop.items: указанный список с учетом фильтра и опций компонента\n\t * - api.items: результаты api запроса, если используется api\n\t *\n\t * @returns Отфильтрованный массив элементов для отображения\n\t */\n\tconst itemsForShow = computed(() => {\n\t\tconst searchString = searchText.value.toLowerCase();\n\t\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\n\n\t\tlet items: NonNullable<Props['items']> = [];\n\n\t\tlocalItems.value.forEach((item) => {\n\t\t\tconst itemName = item.name.toLowerCase();\n\n\t\t\tif (\n\t\t\t\titem.id === Number(searchString) ||\n\t\t\t\titemName.includes(searchString) ||\n\t\t\t\titemName.includes(searchStringInvertKeyboard)\n\t\t\t) {\n\t\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\n\t\t\t\t\titems.unshift(item);\n\t\t\t\t} else {\n\t\t\t\t\titems.push(item);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titems.push(...api.items.value);\n\n\t\t// ввод произвольного значения\n\t\tif (\n\t\t\tappendSearchToResult.value &&\n\t\t\t!!searchText.value &&\n\t\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\n\t\t) {\n\t\t\titems.push({\n\t\t\t\tid: null,\n\t\t\t\tname: searchText.value,\n\t\t\t});\n\t\t}\n\n\t\tif (multiselect) {\n\t\t\titems = items.filter(item => !isSelected(model.value, item));\n\t\t}\n\n\t\treturn items;\n\t});\n\n\treturn {\n\t\tsearchText,\n\t\tresetSearch,\n\t\titems: localItems,\n\t\titemsForShow,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport { TopPreloader } from '@/components/forms/forms';\nimport type { Item, Props, Slots } from './types';\nimport Selector2ItemMulti from './itemMulti.vue';\nimport { useAPI } from './composables/useAPI';\nimport { useMenu } from './composables/useMenu';\nimport type { TopLibPopup } from '../../popup/lib/popup';\nimport { isSelected } from './utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\titems: () => [] as Array<Item>,\n\tsize: 's',\n\tminLength: 0,\n\tshowSelectedInInput: true,\n\tshowSearch: true,\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\n\ndefineSlots<Slots>();\n\n/**\n * Основной элемент селектора\n */\nconst elRef = ref<HTMLElement | null>(null);\n\n/**\n * Объект для работы с API\n */\nconst api = useAPI(props.apiRequest, props.minLength || 0, props.useCache);\n\n/**\n * Объект для работы с меню\n */\nconst menu = useMenu(model, toRef(props, 'items'), props.multiselect, toRef(props, 'appendAllValue'), toRef(props, 'appendSearchToResult'), api);\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<any>(null);\n\n/**\n * Получить доступ к объекту popup\n *\n * @returns Объект popup или undefined, если popup не инициализирован\n */\nconst getPopup = (): TopLibPopup | undefined => {\n\treturn popupRef.value?.popup;\n};\n\n/**\n * Выбрать следующее значение\n */\nconst selectNextItem = () => {\n\tif (!Array.isArray(model.value)) {\n\t\tconst currentIndex = menu.itemsForShow.value.findIndex(item => item.id === (model.value as Item).id);\n\t\tconst nextIndex = (currentIndex + 1) % menu.itemsForShow.value.length;\n\t\tmodel.value = { ...menu.itemsForShow.value[nextIndex] };\n\t}\n};\n\n/**\n * Удалить выбранное значение по id\n *\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\n/**\n * Флаг, указывающий, открыт ли попап\n */\nconst isOpened = ref(false);\n\nif (api.apiRequest) {\n\twatch(isOpened, () => {\n\t\tif (isOpened.value) {\n\t\t\t// при открытии сразу выполнить поиск\n\t\t\tapi.setSearchTextAndLoad(menu.searchText.value, false);\n\t\t}\n\t});\n\n\t// отложенный поиск при вводе текста\n\twatch(menu.searchText, () => api.setSearchTextAndLoad(menu.searchText.value));\n}\n\n/**\n * Выбрать элемент\n *\n * @param item Элемент для выбора\n */\nconst selectItem = (item: Item) => {\n\tif (props.multiselect && Array.isArray(model.value)) {\n\t\tif (!isSelected(model.value, item)) {\n\t\t\tmodel.value = [...model.value, item];\n\t\t}\n\t} else {\n\t\tmodel.value = item;\n\t}\n};\n\n/**\n * Обработчик закрытия попапа\n */\nconst onClose = () => {\n\tisOpened.value = false;\n\n\telRef.value?.focus();\n\n\tif (menu.searchText.value) menu.resetSearch();\n};\n\n/**\n * Обработчик прокрутки списка контента\n *\n * Для дозагрузки элеменов через api\n *\n * @param {Event} e - Событие прокрутки\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\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</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"isOpened = true\"\n\t\t@close=\"onClose()\"\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\tref=\"elRef\"\n\t\t\t\tv-top-focus.onupdate=\"isError\"\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\t@keydown.up.down.enter.space.stop.prevent=\"($event.currentTarget as HTMLElement).click()\"\n\t\t\t\t@keydown.delete=\"model = []\"\n\t\t\t\ttabindex=\"0\"\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 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 && menu.items.value.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector\"\n\t\t\t\t\tdata-top-popup-disabled=\"true\"\n\t\t\t\t\t@click=\"selectNextItem\"\n\t\t\t\t></span>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #widget v-if=\"showSearch\">\n\t\t\t<TopPopupWidgetInput\n\t\t\t\ttitle=\"Поиск\"\n\t\t\t\ticon=\"\"\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t:isLoading=\"api.isLoading.value && !apiRequest?.params.offset\"\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 menu.itemsForShow.value\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.id === item.id && model.name === item.name,\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t:closeByClick=\"!multiselect || Core.state.isMobile\"\n\t\t\t\t@click=\"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\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=\"!api.isLoading.value && !menu.itemsForShow.value.length\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.No_results }}\n\t\t\t</TopPopupListItem>\n\n\t\t\t<!-- Индикатор загрузки, первичная дозагрузка отображается в поле поиска, если оно отображено -->\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"api.isLoading.value && (!showSearch || apiRequest?.params.offset)\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t<TopPreloader type=\"circles\"/>\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\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}\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 CheckboxGroup from './checkboxGroup/checkboxGroup.vue';\nimport Selector2 from './selector2/selector2.vue';\nimport Menu from './menu/menu.vue';\nimport Info from './info/info.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 TopCheckboxGroup = CheckboxGroup as typeof CheckboxGroup & ComponentCustomProps;\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\n"],"names":["props","__props","emit","__emit","localValue","ref","isFocused","isChanged","computed","submit","value","cancel","clickOnTitle","intermediateValue","watch","toRef","model","useModel","elRef","_a","item","_c","_b","_e","_d","uid","onChange","id","newModel","index","useAPI","apiRequest","minLength","useCache","items","isLoading","_searchText","_nextOffset","callAPIRequest","res","cacheKey","indexWithError","load","loadAppend","loadDebounce","debounce","searchText","useDebounce","ITEM_ID_ALL","isSelected","modelValue","checkNameForNullId","itemSelected","useMenu","multiselect","appendAllValue","appendSearchToResult","api","itemAll","useI18n","resetSearch","localItems","localItems2","itemsForShow","searchString","searchStringInvertKeyboard","invertKeyboardLayout","items2","itemName","menu","popupRef","getPopup","selectNextItem","nextIndex","deleteItemById","isOpened","selectItem","onClose","onScrollContentList","e","el","TopEditArea","_sfc_main$6","TopEditInput","_sfc_main$5","TopRadioGroup","_sfc_main$4","TopCheckboxGroup","_sfc_main$3","TopSelector2","_sfc_main$1","TopMenu","_sfc_main$a","TopInfo","_sfc_main"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  "metadata": {
3
3
  "name": "Topvisor icons",
4
4
  "lastOpened": 0,
5
- "created": 1747123737337
5
+ "created": 1750777396319
6
6
  },
7
7
  "iconSets": [
8
8
  {
@@ -264,7 +264,7 @@
264
264
  "name": "caret-up-14",
265
265
  "prevSize": 14,
266
266
  "code": 59844,
267
- "tempChar": ""
267
+ "tempChar": ""
268
268
  },
269
269
  {
270
270
  "order": 475,
@@ -272,7 +272,7 @@
272
272
  "name": "caret-down-14",
273
273
  "prevSize": 14,
274
274
  "code": 59888,
275
- "tempChar": ""
275
+ "tempChar": ""
276
276
  },
277
277
  {
278
278
  "order": 632,
@@ -280,7 +280,7 @@
280
280
  "name": "switcher-circle-16-2",
281
281
  "prevSize": 14,
282
282
  "code": 59833,
283
- "tempChar": ""
283
+ "tempChar": ""
284
284
  }
285
285
  ],
286
286
  "id": 13,
@@ -4277,6 +4277,22 @@
4277
4277
  "prevSize": 32,
4278
4278
  "code": 59906,
4279
4279
  "tempChar": ""
4280
+ },
4281
+ {
4282
+ "order": 737,
4283
+ "id": 87,
4284
+ "name": "star",
4285
+ "prevSize": 32,
4286
+ "code": 59911,
4287
+ "tempChar": ""
4288
+ },
4289
+ {
4290
+ "order": 736,
4291
+ "id": 86,
4292
+ "name": "copy",
4293
+ "prevSize": 32,
4294
+ "code": 59912,
4295
+ "tempChar": ""
4280
4296
  }
4281
4297
  ],
4282
4298
  "id": 7,
@@ -5624,6 +5640,36 @@
5624
5640
  "tags": [
5625
5641
  "folder-cloud"
5626
5642
  ]
5643
+ },
5644
+ {
5645
+ "id": 87,
5646
+ "paths": [
5647
+ "M472.619 222.716c14.575-35.042 64.213-35.042 78.788 0l63.454 152.556c6.144 14.772 20.036 24.866 35.985 26.145l164.698 13.204c37.828 3.033 53.171 50.245 24.346 74.932l-125.483 107.49c-12.147 10.411-17.455 26.739-13.743 42.304l38.336 160.717c8.806 36.915-31.356 66.095-63.744 46.31l-141.001-86.123c-13.658-8.341-30.827-8.341-44.48 0l-141.006 86.123c-32.388 19.785-72.548-9.395-63.742-46.31l38.337-160.717c3.712-15.565-1.594-31.893-13.745-42.304l-125.482-107.49c-28.823-24.687-13.483-71.899 24.348-74.932l164.697-13.204c15.948-1.279 29.841-11.372 35.985-26.145l63.452-152.556z"
5648
+ ],
5649
+ "attrs": [
5650
+ {}
5651
+ ],
5652
+ "isMulticolor": false,
5653
+ "isMulticolor2": false,
5654
+ "grid": 24,
5655
+ "tags": [
5656
+ "star"
5657
+ ]
5658
+ },
5659
+ {
5660
+ "id": 86,
5661
+ "paths": [
5662
+ "M597.333 298.667c70.694 0 128 57.308 128 128v384c0 68.484-53.786 124.407-121.417 127.834l-6.583 0.166-390.583-0.166c-65.452-3.315-117.934-55.799-121.25-121.25l-0.167-6.583v-384c0-70.692 57.308-128 128-128h384zM213.333 384c-23.564 0-42.667 19.103-42.667 42.667v384c0 23.565 19.103 42.667 42.667 42.667h384c23.565 0 42.667-19.102 42.667-42.667v-384c0-23.564-19.102-42.667-42.667-42.667h-384zM810.667 85.333c70.694 0 128 57.308 128 128v384c0 68.484-53.786 124.407-121.417 127.834l-6.583 0.166h-42.667v-85.333h42.667c23.565 0 42.667-19.102 42.667-42.667v-384c0-23.564-19.102-42.667-42.667-42.667h-384c-23.564 0-42.667 19.103-42.667 42.667v42.667h-85.333v-42.667c0-70.692 57.308-128 128-128h384z"
5663
+ ],
5664
+ "attrs": [
5665
+ {}
5666
+ ],
5667
+ "isMulticolor": false,
5668
+ "isMulticolor2": false,
5669
+ "grid": 24,
5670
+ "tags": [
5671
+ "copy"
5672
+ ]
5627
5673
  }
5628
5674
  ],
5629
5675
  "colorThemes": [],
@@ -5638,7 +5684,7 @@
5638
5684
  "name": "desktop-16",
5639
5685
  "prevSize": 14,
5640
5686
  "code": 59732,
5641
- "tempChar": ""
5687
+ "tempChar": ""
5642
5688
  },
5643
5689
  {
5644
5690
  "order": 468,
@@ -5646,7 +5692,7 @@
5646
5692
  "name": "phone-16",
5647
5693
  "prevSize": 14,
5648
5694
  "code": 59735,
5649
- "tempChar": ""
5695
+ "tempChar": ""
5650
5696
  },
5651
5697
  {
5652
5698
  "order": 467,
@@ -5654,7 +5700,7 @@
5654
5700
  "name": "tablet-16",
5655
5701
  "prevSize": 14,
5656
5702
  "code": 59736,
5657
- "tempChar": ""
5703
+ "tempChar": ""
5658
5704
  }
5659
5705
  ],
5660
5706
  "id": 6,
@@ -5730,7 +5776,7 @@
5730
5776
  "name": "more-horizontal-16",
5731
5777
  "prevSize": 14,
5732
5778
  "code": 59889,
5733
- "tempChar": ""
5779
+ "tempChar": ""
5734
5780
  },
5735
5781
  {
5736
5782
  "order": 625,
@@ -5738,7 +5784,7 @@
5738
5784
  "name": "user-plus-16",
5739
5785
  "prevSize": 14,
5740
5786
  "code": 59826,
5741
- "tempChar": ""
5787
+ "tempChar": ""
5742
5788
  },
5743
5789
  {
5744
5790
  "order": 466,
@@ -5746,7 +5792,7 @@
5746
5792
  "name": "bar_chart-fill-16",
5747
5793
  "prevSize": 14,
5748
5794
  "code": 59796,
5749
- "tempChar": ""
5795
+ "tempChar": ""
5750
5796
  },
5751
5797
  {
5752
5798
  "order": 465,
@@ -5754,7 +5800,7 @@
5754
5800
  "name": "flag-16",
5755
5801
  "prevSize": 14,
5756
5802
  "code": 59794,
5757
- "tempChar": ""
5803
+ "tempChar": ""
5758
5804
  },
5759
5805
  {
5760
5806
  "order": 464,
@@ -5762,7 +5808,7 @@
5762
5808
  "name": "user-checked-16",
5763
5809
  "prevSize": 14,
5764
5810
  "code": 59792,
5765
- "tempChar": ""
5811
+ "tempChar": ""
5766
5812
  },
5767
5813
  {
5768
5814
  "order": 463,
@@ -5770,7 +5816,7 @@
5770
5816
  "name": "user-16",
5771
5817
  "prevSize": 14,
5772
5818
  "code": 59793,
5773
- "tempChar": ""
5819
+ "tempChar": ""
5774
5820
  },
5775
5821
  {
5776
5822
  "order": 462,
@@ -5778,7 +5824,7 @@
5778
5824
  "name": "user-fill-16",
5779
5825
  "prevSize": 14,
5780
5826
  "code": 59739,
5781
- "tempChar": ""
5827
+ "tempChar": ""
5782
5828
  },
5783
5829
  {
5784
5830
  "order": 461,
@@ -5786,7 +5832,7 @@
5786
5832
  "name": "average-16",
5787
5833
  "prevSize": 14,
5788
5834
  "code": 59789,
5789
- "tempChar": ""
5835
+ "tempChar": ""
5790
5836
  },
5791
5837
  {
5792
5838
  "order": 460,
@@ -5794,7 +5840,7 @@
5794
5840
  "name": "median-16",
5795
5841
  "prevSize": 14,
5796
5842
  "code": 59790,
5797
- "tempChar": ""
5843
+ "tempChar": ""
5798
5844
  },
5799
5845
  {
5800
5846
  "order": 459,
@@ -5802,7 +5848,7 @@
5802
5848
  "name": "visibility-16",
5803
5849
  "prevSize": 14,
5804
5850
  "code": 59791,
5805
- "tempChar": ""
5851
+ "tempChar": ""
5806
5852
  },
5807
5853
  {
5808
5854
  "order": 458,
@@ -5810,7 +5856,7 @@
5810
5856
  "name": "checked-indicate-16",
5811
5857
  "prevSize": 14,
5812
5858
  "code": 59741,
5813
- "tempChar": ""
5859
+ "tempChar": ""
5814
5860
  },
5815
5861
  {
5816
5862
  "order": 457,
@@ -5818,7 +5864,7 @@
5818
5864
  "name": "cross-indicate-16",
5819
5865
  "prevSize": 14,
5820
5866
  "code": 59781,
5821
- "tempChar": ""
5867
+ "tempChar": ""
5822
5868
  },
5823
5869
  {
5824
5870
  "order": 456,
@@ -5826,7 +5872,7 @@
5826
5872
  "name": "minus-indicate-16",
5827
5873
  "prevSize": 14,
5828
5874
  "code": 59797,
5829
- "tempChar": ""
5875
+ "tempChar": ""
5830
5876
  },
5831
5877
  {
5832
5878
  "order": 454,
@@ -5834,7 +5880,7 @@
5834
5880
  "name": "external-16",
5835
5881
  "prevSize": 14,
5836
5882
  "code": 59727,
5837
- "tempChar": ""
5883
+ "tempChar": ""
5838
5884
  },
5839
5885
  {
5840
5886
  "order": 453,
@@ -5842,7 +5888,7 @@
5842
5888
  "name": "more-vertical-16",
5843
5889
  "prevSize": 14,
5844
5890
  "code": 59728,
5845
- "tempChar": ""
5891
+ "tempChar": ""
5846
5892
  },
5847
5893
  {
5848
5894
  "order": 452,
@@ -5850,7 +5896,7 @@
5850
5896
  "name": "crown-16",
5851
5897
  "prevSize": 14,
5852
5898
  "code": 59731,
5853
- "tempChar": ""
5899
+ "tempChar": ""
5854
5900
  },
5855
5901
  {
5856
5902
  "order": 451,
@@ -5858,7 +5904,7 @@
5858
5904
  "name": "turbo-16",
5859
5905
  "prevSize": 14,
5860
5906
  "code": 59737,
5861
- "tempChar": ""
5907
+ "tempChar": ""
5862
5908
  },
5863
5909
  {
5864
5910
  "order": 450,
@@ -5866,7 +5912,7 @@
5866
5912
  "name": "amp-16",
5867
5913
  "prevSize": 14,
5868
5914
  "code": 59729,
5869
- "tempChar": ""
5915
+ "tempChar": ""
5870
5916
  },
5871
5917
  {
5872
5918
  "order": 449,
@@ -5874,7 +5920,7 @@
5874
5920
  "name": "checked-circle-16",
5875
5921
  "prevSize": 14,
5876
5922
  "code": 59730,
5877
- "tempChar": ""
5923
+ "tempChar": ""
5878
5924
  },
5879
5925
  {
5880
5926
  "order": 610,
@@ -5882,7 +5928,7 @@
5882
5928
  "name": "warning-circle-16",
5883
5929
  "prevSize": 14,
5884
5930
  "code": 59814,
5885
- "tempChar": ""
5931
+ "tempChar": ""
5886
5932
  },
5887
5933
  {
5888
5934
  "order": 611,
@@ -5890,7 +5936,7 @@
5890
5936
  "name": "dangerous-circle-16",
5891
5937
  "prevSize": 14,
5892
5938
  "code": 59815,
5893
- "tempChar": ""
5939
+ "tempChar": ""
5894
5940
  },
5895
5941
  {
5896
5942
  "order": 612,
@@ -5898,7 +5944,7 @@
5898
5944
  "name": "question-circle-16",
5899
5945
  "prevSize": 14,
5900
5946
  "code": 59816,
5901
- "tempChar": ""
5947
+ "tempChar": ""
5902
5948
  },
5903
5949
  {
5904
5950
  "order": 448,
@@ -5906,7 +5952,7 @@
5906
5952
  "name": "up-circle-16",
5907
5953
  "prevSize": 14,
5908
5954
  "code": 59738,
5909
- "tempChar": ""
5955
+ "tempChar": ""
5910
5956
  },
5911
5957
  {
5912
5958
  "order": 447,
@@ -5914,7 +5960,7 @@
5914
5960
  "name": "down-circle-16",
5915
5961
  "prevSize": 14,
5916
5962
  "code": 59733,
5917
- "tempChar": ""
5963
+ "tempChar": ""
5918
5964
  },
5919
5965
  {
5920
5966
  "order": 446,
@@ -5922,7 +5968,7 @@
5922
5968
  "name": "equal-circle-16",
5923
5969
  "prevSize": 14,
5924
5970
  "code": 59734,
5925
- "tempChar": ""
5971
+ "tempChar": ""
5926
5972
  },
5927
5973
  {
5928
5974
  "order": 711,
@@ -5930,7 +5976,7 @@
5930
5976
  "name": "lightning-circle-16",
5931
5977
  "prevSize": 14,
5932
5978
  "code": 59898,
5933
- "tempChar": ""
5979
+ "tempChar": ""
5934
5980
  }
5935
5981
  ],
5936
5982
  "id": 5,
@@ -6331,7 +6377,7 @@
6331
6377
  "name": "triangle",
6332
6378
  "prevSize": 8,
6333
6379
  "code": 59726,
6334
- "tempChar": ""
6380
+ "tempChar": ""
6335
6381
  }
6336
6382
  ],
6337
6383
  "id": 4,
@@ -6369,7 +6415,7 @@
6369
6415
  "name": "anime",
6370
6416
  "prevSize": 32,
6371
6417
  "code": 59872,
6372
- "tempChar": ""
6418
+ "tempChar": ""
6373
6419
  }
6374
6420
  ],
6375
6421
  "id": 3,
@@ -6534,7 +6580,7 @@
6534
6580
  "showCodes": true,
6535
6581
  "gridSize": 16,
6536
6582
  "quickUsageToken": {
6537
- "Topvisoricons": "M2RjMmM4NWExOCMxNzQ3MTIzNzU3I3hDUU1CeHBYVytkdUV5QjcxVXU2RW5rTDhHZWw4UWRaU2xLV0d1NEFFOUQz"
6583
+ "Topvisoricons": "MmY3ZjUyNTAwZiMxNzUwNzc3NTI0I01wTHc3dlBCOHkzQmZLdC9kZm53elhneVBKRmI5SVp1eHlFSXVMN2pRVEl5"
6538
6584
  },
6539
6585
  "showLiga": true,
6540
6586
  "showGrid": true
package/icomoon/demo.html CHANGED
@@ -9,7 +9,7 @@
9
9
  <link rel="stylesheet" href="style.css"></head>
10
10
  <body>
11
11
  <div class="bgc1 clearfix">
12
- <h1 class="mhmm mvm"><span class="fgc1">Font Name:</span> Topvisor-2 <small class="fgc1">(Glyphs:&nbsp;263)</small></h1>
12
+ <h1 class="mhmm mvm"><span class="fgc1">Font Name:</span> Topvisor-2 <small class="fgc1">(Glyphs:&nbsp;265)</small></h1>
13
13
  </div>
14
14
  <div class="clearfix mhl ptl">
15
15
  <h1 class="mvm mtn fgc1">Grid Size: 24</h1>
@@ -3219,6 +3219,34 @@
3219
3219
  <input type="text" readonly value="" class="liga unitRight" />
3220
3220
  </div>
3221
3221
  </div>
3222
+ <div class="glyph fs1">
3223
+ <div class="clearfix bshadow0 pbs">
3224
+ <span class="icon2-star"></span>
3225
+ <span class="mls"> icon2-star</span>
3226
+ </div>
3227
+ <fieldset class="fs0 size1of1 clearfix hidden-false">
3228
+ <input type="text" readonly value="ea07" class="unit size1of2" />
3229
+ <input type="text" maxlength="1" readonly value="&#xea07;" class="unitRight size1of2 talign-right" />
3230
+ </fieldset>
3231
+ <div class="fs0 bshadow0 clearfix hidden-false">
3232
+ <span class="unit pvs fgc1">liga: </span>
3233
+ <input type="text" readonly value="" class="liga unitRight" />
3234
+ </div>
3235
+ </div>
3236
+ <div class="glyph fs1">
3237
+ <div class="clearfix bshadow0 pbs">
3238
+ <span class="icon2-copy"></span>
3239
+ <span class="mls"> icon2-copy</span>
3240
+ </div>
3241
+ <fieldset class="fs0 size1of1 clearfix hidden-false">
3242
+ <input type="text" readonly value="ea08" class="unit size1of2" />
3243
+ <input type="text" maxlength="1" readonly value="&#xea08;" class="unitRight size1of2 talign-right" />
3244
+ </fieldset>
3245
+ <div class="fs0 bshadow0 clearfix hidden-false">
3246
+ <span class="unit pvs fgc1">liga: </span>
3247
+ <input type="text" readonly value="" class="liga unitRight" />
3248
+ </div>
3249
+ </div>
3222
3250
  <div class="glyph fs1">
3223
3251
  <div class="clearfix bshadow0 pbs">
3224
3252
  <span class="icon2-anime"></span>
Binary file
@@ -286,4 +286,6 @@
286
286
  <glyph unicode="&#xea04;" glyph-name="expand-out" data-tags="expand-out" d="M341.134-170.667c11.991 0 21.983 4.331 29.976 12.988 8.66 7.996 12.99 17.988 12.99 29.978 0 11.994-4.33 22.319-12.99 30.976-7.994 7.996-17.986 11.994-29.976 11.994h-109.914l182.857 182.857c8.66 7.991 12.991 17.984 12.991 29.973 0 11.994-4.332 21.986-12.991 29.978-7.994 8.661-17.986 12.992-29.977 12.992s-21.983-4.331-29.976-12.992l-182.857-182.857v109.914c0 11.989-4.33 21.982-12.99 29.978-7.994 8.661-17.986 12.988-29.976 12.988s-22.316-4.326-30.976-12.988c-7.994-7.996-11.991-17.988-11.991-29.978v-212.834c0-11.989 3.997-21.982 11.991-29.978 8.66-8.657 18.985-12.988 30.976-12.988h212.834zM895.701 682.667c11.989 0 21.982-4.33 29.978-12.99 8.657-7.994 12.988-17.986 12.988-29.977v-212.834c0-11.991-4.331-22.316-12.988-30.976-7.996-7.994-17.988-11.991-29.978-11.991-11.994 0-22.319 3.997-30.976 11.991-7.996 8.66-11.994 18.985-11.994 30.976v109.914l-182.857-182.857c-7.991-8.66-17.984-12.991-29.973-12.991-11.994 0-21.986 4.332-29.978 12.991-8.661 7.994-12.992 17.986-12.992 29.977s4.331 21.983 12.992 29.976l182.857 182.857h-109.914c-11.989 0-22.315 3.997-30.976 11.991-7.996 8.66-11.989 18.985-11.989 30.976s3.994 21.983 11.989 29.977c8.661 8.66 18.987 12.99 30.976 12.99h212.834z" />
287
287
  <glyph unicode="&#xea05;" glyph-name="credit-card" data-tags="credit-card" d="M853.333 341.333h-682.667v-279.458c0-34.611 27.622-61.871 60.708-61.875h561.248c33.088 0.004 60.71 27.264 60.71 61.875v279.458zM384 213.333c23.564 0 42.667-19.102 42.667-42.667v-42.667c0-23.565-19.103-42.667-42.667-42.667h-85.333c-23.564 0-42.667 19.102-42.667 42.667v42.667c0 23.565 19.103 42.667 42.667 42.667h85.333zM853.333 450.125c0 34.611-27.622 61.87-60.71 61.875h-561.248c-33.086-0.005-60.708-27.264-60.708-61.875v-23.458h682.667v23.458zM938.667 61.875c0-80.849-64.943-147.204-146.044-147.209h-561.248c-81.101 0.004-146.042 66.359-146.042 147.209v388.25c0 80.848 64.941 147.203 146.042 147.209h561.248c81.101-0.005 146.044-66.361 146.044-147.209v-388.25z" />
288
288
  <glyph unicode="&#xea06;" glyph-name="threads" data-tags="threads" d="M701.875 287.168c-3.409 1.758-6.886 3.465-10.411 5.073-6.114 121.365-67.772 190.858-171.319 191.561-59.746 0.427-113.233-25.774-146.56-80.158l56.943-42.012c23.689 38.649 60.864 46.88 88.239 46.88h0.934c34.095-0.226 59.836-10.892 76.476-31.672 12.113-15.159 20.233-36.066 24.247-62.464-30.242 5.521-62.916 7.228-97.877 5.069-98.436-6.101-161.727-67.836-157.48-153.617 2.147-43.541 22.31-80.96 56.756-105.429 29.124-20.681 66.654-30.797 105.626-28.484 51.507 3.008 91.878 24.141 120.073 62.763 21.397 29.342 34.935 67.362 40.909 115.247 24.529-15.915 42.709-36.868 52.766-62.067 17.058-42.812 18.065-113.182-35.332-170.556-46.767-50.266-103.010-72-187.985-72.678-94.282 0.751-165.577 33.28-211.926 96.649-43.407 59.328-65.835 145.033-66.675 254.729 0.84 109.697 23.267 195.402 66.675 254.73 46.348 63.369 117.644 95.894 211.926 96.647 94.938-0.753 167.471-33.428 215.616-97.099 23.595-31.22 41.378-70.496 53.116-116.272l66.722 19.148c-14.212 56.342-36.57 104.904-67.025 145.184-61.705 81.639-151.927 123.45-268.194 124.329h-0.465c-116.035-0.879-205.277-42.865-265.208-124.805-53.35-72.905-80.864-174.371-81.775-301.559v-0.606c0.91-127.189 28.425-228.655 81.775-301.559 59.93-81.941 149.173-123.951 265.208-124.804h0.465c103.151 0.777 175.872 29.815 235.78 94.187 78.366 84.198 76.006 189.73 50.172 254.528-18.53 46.455-53.862 84.203-102.191 109.12zM523.763 107.076c-43.127-2.611-87.962 18.223-90.176 62.818-1.634 33.075 21.888 69.995 92.834 74.385 8.124 0.503 16.102 0.755 23.923 0.755 25.762 0 49.873-2.688 71.787-7.859-8.171-109.769-56.107-127.59-98.368-130.099z" />
289
+ <glyph unicode="&#xea07;" glyph-name="star" data-tags="star" d="M472.619 545.284c14.575 35.042 64.213 35.042 78.788 0l63.454-152.556c6.144-14.772 20.036-24.866 35.985-26.145l164.698-13.204c37.828-3.033 53.171-50.245 24.346-74.932l-125.483-107.49c-12.147-10.411-17.455-26.739-13.743-42.304l38.336-160.717c8.806-36.915-31.356-66.095-63.744-46.31l-141.001 86.123c-13.658 8.341-30.827 8.341-44.48 0l-141.006-86.123c-32.388-19.785-72.548 9.395-63.742 46.31l38.337 160.717c3.712 15.565-1.594 31.893-13.745 42.304l-125.482 107.49c-28.823 24.687-13.483 71.899 24.348 74.932l164.697 13.204c15.948 1.279 29.841 11.372 35.985 26.145l63.452 152.556z" />
290
+ <glyph unicode="&#xea08;" glyph-name="copy" data-tags="copy" d="M597.333 469.333c70.694 0 128-57.308 128-128v-384c0-68.484-53.786-124.407-121.417-127.834l-6.583-0.166-390.583 0.166c-65.452 3.315-117.934 55.799-121.25 121.25l-0.167 6.583v384c0 70.692 57.308 128 128 128h384zM213.333 384c-23.564 0-42.667-19.103-42.667-42.667v-384c0-23.565 19.103-42.667 42.667-42.667h384c23.565 0 42.667 19.102 42.667 42.667v384c0 23.564-19.102 42.667-42.667 42.667h-384zM810.667 682.667c70.694 0 128-57.308 128-128v-384c0-68.484-53.786-124.407-121.417-127.834l-6.583-0.166h-42.667v85.333h42.667c23.565 0 42.667 19.102 42.667 42.667v384c0 23.564-19.102 42.667-42.667 42.667h-384c-23.564 0-42.667-19.103-42.667-42.667v-42.667h-85.333v42.667c0 70.692 57.308 128 128 128h384z" />
289
291
  </font></defs></svg>
Binary file
Binary file