@topvisor/ui 0.9.33-dev → 0.9.34-utils-components-1

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 (221) hide show
  1. package/.chunks/datepicker-BGhDjLcn.es.js +289 -0
  2. package/.chunks/datepicker-BGhDjLcn.es.js.map +1 -0
  3. package/.chunks/datepicker-DM6aPyRB.amd.js +247 -0
  4. package/.chunks/datepicker-DM6aPyRB.amd.js.map +1 -0
  5. package/.chunks/forms-CRAV8PiZ.es.js +1186 -0
  6. package/.chunks/forms-CRAV8PiZ.es.js.map +1 -0
  7. package/.chunks/forms-Cksc7Rb7.amd.js +3 -0
  8. package/.chunks/forms-Cksc7Rb7.amd.js.map +1 -0
  9. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-BliXIrA8.es.js → listItem.vue_vue_type_script_setup_true_lang-C2XaxeNZ.es.js} +9 -9
  10. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-C2XaxeNZ.es.js.map +1 -0
  11. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-CpNwVBHY.amd.js +2 -0
  12. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-CpNwVBHY.amd.js.map +1 -0
  13. package/.chunks/{menu-CHczkYl6.es.js → menu-BWjYRHkQ.es.js} +8 -8
  14. package/.chunks/menu-BWjYRHkQ.es.js.map +1 -0
  15. package/.chunks/{menu-buQxcAhv.amd.js → menu-BX8GV8-v.amd.js} +2 -2
  16. package/.chunks/menu-BX8GV8-v.amd.js.map +1 -0
  17. package/.chunks/popup-3fVBIqu0.amd.js +440 -0
  18. package/.chunks/popup-3fVBIqu0.amd.js.map +1 -0
  19. package/.chunks/{popup-CJLGyBwQ.es.js → popup-BWTP6yaC.es.js} +486 -486
  20. package/.chunks/popup-BWTP6yaC.es.js.map +1 -0
  21. package/.chunks/punycode.es6-C2yitnNb.amd.js +2 -0
  22. package/.chunks/punycode.es6-C2yitnNb.amd.js.map +1 -0
  23. package/.chunks/punycode.es6-CNI-zL6U.es.js +134 -0
  24. package/.chunks/punycode.es6-CNI-zL6U.es.js.map +1 -0
  25. package/.chunks/store-Bl79G7T_.amd.js.map +1 -1
  26. package/.chunks/store-PoMCiuBr.es.js.map +1 -1
  27. package/README.md +86 -86
  28. package/assets/core.css +1 -1
  29. package/assets/forms.css +1 -1
  30. package/assets/formsExt.css +1 -1
  31. package/core/core.amd.js +1 -1
  32. package/core/core.js +1 -1
  33. package/core/directives/focus.amd.js +2 -0
  34. package/core/directives/focus.amd.js.map +1 -0
  35. package/core/directives/focus.d.ts +3 -0
  36. package/core/directives/focus.js +5 -0
  37. package/core/directives/focus.js.map +1 -0
  38. package/core/directives/sticky.amd.js +2 -0
  39. package/core/directives/sticky.amd.js.map +1 -0
  40. package/core/directives/sticky.d.ts +3 -0
  41. package/core/directives/sticky.js +5 -0
  42. package/core/directives/sticky.js.map +1 -0
  43. package/core/directives/swimUp.amd.js +2 -0
  44. package/core/directives/swimUp.amd.js.map +1 -0
  45. package/core/directives/swimUp.d.ts +3 -0
  46. package/core/directives/swimUp.js +5 -0
  47. package/core/directives/swimUp.js.map +1 -0
  48. package/core/directives/tooltip.amd.js +2 -0
  49. package/core/directives/tooltip.amd.js.map +1 -0
  50. package/core/directives/tooltip.d.ts +3 -0
  51. package/core/directives/tooltip.js +5 -0
  52. package/core/directives/tooltip.js.map +1 -0
  53. package/core/plugin/plugin.amd.js +2 -0
  54. package/core/plugin/plugin.amd.js.map +1 -0
  55. package/core/plugin/plugin.d.ts +3 -0
  56. package/core/plugin/plugin.js +23 -0
  57. package/core/plugin/plugin.js.map +1 -0
  58. package/forms/forms.amd.js +1 -1
  59. package/forms/forms.js +14 -15
  60. package/forms/forms.js.map +1 -1
  61. package/forms/helpers.amd.js.map +1 -1
  62. package/forms/helpers.js.map +1 -1
  63. package/formsExt/formsExt.amd.js +1 -1
  64. package/formsExt/formsExt.amd.js.map +1 -1
  65. package/formsExt/formsExt.js +121 -362
  66. package/formsExt/formsExt.js.map +1 -1
  67. package/icomoon/Read Me.txt +7 -7
  68. package/icomoon/demo-files/demo.css +161 -161
  69. package/icomoon/demo-files/demo.js +30 -30
  70. package/icomoon/demo.html +3379 -3379
  71. package/icomoon/fonts/Topvisor-2.svg +263 -263
  72. package/icomoon/style.css +740 -740
  73. package/package.json +33 -24
  74. package/popup/popup.amd.js +1 -1
  75. package/popup/popup.amd.js.map +1 -1
  76. package/popup/popup.js +47 -6
  77. package/popup/popup.js.map +1 -1
  78. package/popup/worker.amd.js +1 -1
  79. package/popup/worker.amd.js.map +1 -1
  80. package/popup/worker.js +3 -3
  81. package/popup/worker.js.map +1 -1
  82. package/project/project.amd.js +1 -1
  83. package/project/project.amd.js.map +1 -1
  84. package/project/project.js +15 -15
  85. package/project/project.js.map +1 -1
  86. package/require/css.amd.js +11 -11
  87. package/src/components/forms/button/button.stories.d.ts +3 -3
  88. package/src/components/forms/button/button.vue.d.ts +7 -5
  89. package/src/components/forms/checkbox/checkbox.stories.d.ts +8 -7
  90. package/src/components/forms/checkbox/checkbox.vue.d.ts +10 -6
  91. package/src/components/forms/controlLabel/controlLabel.stories.d.ts +3 -3
  92. package/src/components/forms/controlLabel/controlLabel.vue.d.ts +4 -2
  93. package/src/components/forms/forms.d.ts +30 -18
  94. package/src/components/forms/hint/hint.stories.d.ts +13 -77
  95. package/src/components/forms/input/input.stories.d.ts +3 -3
  96. package/src/components/forms/input/input.vue.d.ts +6 -4
  97. package/src/components/forms/inputDate/datepicker.d.ts +0 -2
  98. package/src/components/forms/inputRange/inputRange.stories.d.ts +17 -49
  99. package/src/components/forms/inputRange/inputRange.vue.d.ts +4 -2
  100. package/src/components/forms/radio/radio.stories.d.ts +3 -3
  101. package/src/components/forms/radio/radio.vue.d.ts +6 -4
  102. package/src/components/forms/select/select.stories.d.ts +2 -2
  103. package/src/components/forms/select/select.vue.d.ts +4 -3
  104. package/src/components/forms/switcher/switcher.stories.d.ts +3 -3
  105. package/src/components/forms/switcher/switcher.vue.d.ts +6 -4
  106. package/src/components/formsExt/editInput/editInput.stories.d.ts +3 -3
  107. package/src/components/formsExt/editInput/editInput.vue.d.ts +6 -4
  108. package/src/components/formsExt/formsExt.d.ts +10 -5
  109. package/src/components/formsExt/menu/menu.stories.d.ts +1 -1
  110. package/src/components/formsExt/menu/menu.vue.d.ts +2 -2
  111. package/src/components/formsExt/selector2/api.d.ts +1 -1
  112. package/src/components/formsExt/selector2/selector2.stories.d.ts +36 -35
  113. package/src/components/popup/popup/listItem.vue.d.ts +7 -5
  114. package/src/components/popup/popup/opener.vue.d.ts +6 -4
  115. package/src/components/popup/popup/popup.stories.d.ts +22 -86
  116. package/src/components/popup/popup/popup.vue.d.ts +11 -9
  117. package/src/components/popup/popup.d.ts +10 -4
  118. package/src/components/popup/worker.d.ts +4 -1
  119. package/src/components/project/project.d.ts +4 -1
  120. package/src/components/project/selectorCompetitors/composables.d.ts +1 -0
  121. package/src/components/project/selectorCompetitors/selectorCompetitors.stories.d.ts +2 -2
  122. package/src/components/project/selectorCompetitors/selectorCompetitors.vue.d.ts +4 -3
  123. package/src/components/tabs/tabs/content.vue.d.ts +4 -2
  124. package/src/components/tabs/tabs/tab.vue.d.ts +4 -2
  125. package/src/components/tabs/tabs/tabs.stories.d.ts +28 -92
  126. package/src/components/tabs/tabs/tabs.vue.d.ts +4 -2
  127. package/src/components/tabs/tabs.d.ts +8 -3
  128. package/src/components/tabsView/tabsView/menu.vue.d.ts +6 -4
  129. package/src/components/tabsView/tabsView/menuItem.vue.d.ts +6 -4
  130. package/src/components/tabsView/tabsView/menuTitle.vue.d.ts +4 -2
  131. package/src/components/tabsView/tabsView/store.d.ts +14 -14
  132. package/src/components/tabsView/tabsView/tabsView.stories.d.ts +12 -12
  133. package/src/components/tabsView/tabsView/tabsView.vue.d.ts +6 -4
  134. package/src/components/tabsView/tabsView//320/255/320/273/320/265/320/274/320/265/320/275/321/202/321/213/MenuItem.stories.d.ts +9 -9
  135. package/src/components/tabsView/tabsView//320/255/320/273/320/265/320/274/320/265/320/275/321/202/321/213/MenuTitle.stories.d.ts +9 -9
  136. package/src/components/tabsView/tabsView.d.ts +8 -3
  137. package/src/core/core/core.d.ts +1 -1
  138. package/src/core/directives/focus.d.ts +9 -0
  139. package/src/core/directives/sticky.d.ts +11 -0
  140. package/src/core/directives/swimUp.d.ts +10 -0
  141. package/src/core/directives/tooltip.d.ts +11 -0
  142. package/src/core/plugin/plugin.d.ts +48 -0
  143. package/src/core/utils/device.d.ts +0 -3
  144. package/src/core/utils/number.d.ts +1 -1
  145. package/src/core/utils/price.d.ts +1 -1
  146. package/src/core/utils/store/localStorage.d.ts +1 -1
  147. package/src/core/utils/store/store.d.ts +2 -2
  148. package/src/core/utils/string.d.ts +1 -1
  149. package/tabs/tabs.amd.js +1 -1
  150. package/tabs/tabs.amd.js.map +1 -1
  151. package/tabs/tabs.js +23 -23
  152. package/tabs/tabs.js.map +1 -1
  153. package/tabsView/tabsView.amd.js +1 -1
  154. package/tabsView/tabsView.amd.js.map +1 -1
  155. package/tabsView/tabsView.js +72 -73
  156. package/tabsView/tabsView.js.map +1 -1
  157. package/utils/check.amd.js +1 -1
  158. package/utils/check.amd.js.map +1 -1
  159. package/utils/check.js +22 -5
  160. package/utils/check.js.map +1 -1
  161. package/utils/css.amd.js.map +1 -1
  162. package/utils/css.js.map +1 -1
  163. package/utils/date.amd.js +1 -1
  164. package/utils/date.js +4 -4
  165. package/utils/device.amd.js +1 -1
  166. package/utils/device.js +6 -6
  167. package/utils/dom.amd.js.map +1 -1
  168. package/utils/dom.js.map +1 -1
  169. package/utils/image.amd.js +1 -1
  170. package/utils/image.amd.js.map +1 -1
  171. package/utils/image.js +1 -1
  172. package/utils/image.js.map +1 -1
  173. package/utils/keyboard.amd.js.map +1 -1
  174. package/utils/keyboard.js.map +1 -1
  175. package/utils/number.amd.js.map +1 -1
  176. package/utils/number.js.map +1 -1
  177. package/utils/price.amd.js.map +1 -1
  178. package/utils/price.js.map +1 -1
  179. package/utils/route.amd.js.map +1 -1
  180. package/utils/route.js.map +1 -1
  181. package/utils/scroll.amd.js +1 -1
  182. package/utils/scroll.amd.js.map +1 -1
  183. package/utils/scroll.js +1 -1
  184. package/utils/scroll.js.map +1 -1
  185. package/utils/string.amd.js +1 -1
  186. package/utils/string.amd.js.map +1 -1
  187. package/utils/string.js +134 -16
  188. package/utils/string.js.map +1 -1
  189. package/utils/system.amd.js.map +1 -1
  190. package/utils/system.js.map +1 -1
  191. package/utils/url.amd.js +2 -1
  192. package/utils/url.amd.js.map +1 -1
  193. package/utils/url.js +44 -7
  194. package/utils/url.js.map +1 -1
  195. package/utils/window.amd.js +1 -1
  196. package/utils/window.js +1 -1
  197. package/web-types.json +62 -0
  198. package/.chunks/datepicker-B2sjxM3R.amd.js +0 -247
  199. package/.chunks/datepicker-B2sjxM3R.amd.js.map +0 -1
  200. package/.chunks/datepicker-V4rjmE4P.es.js +0 -289
  201. package/.chunks/datepicker-V4rjmE4P.es.js.map +0 -1
  202. package/.chunks/forms-Dixfp052.amd.js +0 -4
  203. package/.chunks/forms-Dixfp052.amd.js.map +0 -1
  204. package/.chunks/forms-o7UeMJFf.es.js +0 -1507
  205. package/.chunks/forms-o7UeMJFf.es.js.map +0 -1
  206. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-BliXIrA8.es.js.map +0 -1
  207. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-C0tRJmSC.amd.js +0 -2
  208. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-C0tRJmSC.amd.js.map +0 -1
  209. package/.chunks/menu-CHczkYl6.es.js.map +0 -1
  210. package/.chunks/menu-buQxcAhv.amd.js.map +0 -1
  211. package/.chunks/popup-BMNS1F2G.amd.js +0 -440
  212. package/.chunks/popup-BMNS1F2G.amd.js.map +0 -1
  213. package/.chunks/popup-CJLGyBwQ.es.js.map +0 -1
  214. package/.chunks/widgetInput-ASxjfQpi.amd.js +0 -2
  215. package/.chunks/widgetInput-ASxjfQpi.amd.js.map +0 -1
  216. package/.chunks/widgetInput-p8fSQGk9.es.js +0 -46
  217. package/.chunks/widgetInput-p8fSQGk9.es.js.map +0 -1
  218. package/src/components/formsExt/selector2/itemMulti.vue.d.ts +0 -18
  219. package/src/components/formsExt/selector2/selector2.vue.d.ts +0 -130
  220. package/src/core/core/plugin.d.ts +0 -38
  221. /package/assets/{widgetInput.css → popup.css} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"forms-o7UeMJFf.es.js","sources":["../../src/core/utils/device.ts","../../src/core/core/page.ts","../../src/core/core/events.ts","../../src/core/core/options.ts","../../src/core/core/state.ts","../../src/core/directives/tooltip.ts","../../src/core/directives/focus.ts","../../src/core/directives/sticky.ts","../../src/core/directives/swimUp.ts","../../src/core/utils/window.ts","../../src/core/core/core.ts","../../node_modules/punycode/punycode.es6.js","../../src/core/utils/url.ts","../../src/core/utils/check.ts","../../src/core/utils/string.ts","../../src/core/utils/date.ts","../../src/components/forms/avatar/avatar.vue","../../src/components/forms/button/button.vue","../../src/components/forms/checkbox/checkbox.vue","../../src/components/forms/inputDate/inputDate.vue","../../src/components/forms/radio/radio.vue","../../src/components/forms/switcher/switcher.vue","../../src/components/forms/textarea/textarea.vue","../../src/components/forms/select/select.vue","../../src/components/forms/loadbar/loadbar.vue","../../src/components/forms/input/input.vue"],"sourcesContent":["/**\n * Определить, увеличинная ли плотность пикселей у экрана (DPR > 1)\n */\nexport function isRetina(): boolean {\n\treturn ('devicePixelRatio' in window && window.devicePixelRatio > 1);\n}\n\n/**\n * Определить, является ли устройство мобильным\n */\nexport function isMobile(): boolean {\n\treturn !!navigator.userAgent.match(/Android|BlackBerry|iPhone|iPad|iPod|IEMobile|Opera Mini/i);\n}\n\n/**\n * Определить, открыт ли сайт в приложении\n */\nexport function isApp(): boolean {\n\treturn (navigator.userAgent.indexOf('Topvisor_App') != -1);\n}\n\n/**\n * Определить, является ли OS пользователя macOS\n */\nexport function isMacOS(): boolean {\n\treturn navigator.userAgent.indexOf('Mac OS X') !== -1;\n}\n\n/**\n * Определить, является ли текущий браузер пользователя Safari\n */\nexport function isSafari(): boolean {\n\tconst isChrome = /Chrome|Android/.test(navigator.userAgent);\n\n\tlet isSafari = /Safari/.test(navigator.userAgent);\n\tif (isChrome && isSafari) {\n\t\tisSafari = false;\n\t}\n\n\treturn isSafari;\n};\n\n/**\n * Вернуть текст для обозначения клавиши Ctrl / Command в зависимости от OS\n */\nexport function getCommandKeyLabel(): 'Ctrl' | '⌘' {\n\tif (isMacOS()) {\n\t\treturn '⌘';\n\t} else {\n\t\treturn 'Ctrl';\n\t}\n}\n\n/**\n * Вернуть скролл с учетом устройства\n */\nexport const getScrollTop = (): number | undefined => {\n\treturn $(document).scrollTop();\n};\n\n/**\n * Вернуть контейнеры со скроллом (требует jquery)\n */\nexport const get$scroll = (): JQuery<Document> => {\n\treturn $(document);\n};\n\n/**\n * Вернуть контейнеры со скроллом (без jquery)\n */\nexport const getElsScroll = (): Document[] => {\n\treturn [document];\n};\n\n/**\n * Получить операционную систему пользователя\n *\n * Не определяет Windows 11, см. getOSAsync()\n */\nexport const getOS = (): string => {\n\tconst os: [string, RegExp][] = [\n\t\t['iOS', /(iPhone|iPad)/i],\n\t\t['Android', /(Android)/i],\n\t\t['Windows Phone', /(IEMobile)/i],\n\t\t['Windows 3.11', /Win16/i],\n\t\t['Windows 95', /(Windows 95)|(Win95)|(Windows_95)/i],\n\t\t['Windows 98', /(Windows 98)|(Win98)/i],\n\t\t['Windows 2000', /(Windows NT 5.0)|(Windows 2000)/i],\n\t\t['Windows XP', /(Windows NT 5.1)|(Windows XP)/i],\n\t\t['Windows Server 2003', /(Windows NT 5.2)/i],\n\t\t['Windows Vista', /(Windows NT 6.0)/i],\n\t\t['Windows 7', /(Windows NT 6.1)/i],\n\t\t['Windows 8', /(Windows NT 6.[23])|(Windows 8)/i],\n\t\t['Windows 10', /(Windows NT 10)/i],\n\t\t['Windows NT 4.0', /(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)/i],\n\t\t['Windows ME', /Windows ME/i],\n\t\t['Windows', /Windows/i],\n\t\t['Open BSD', /OpenBSD/i],\n\t\t['Sun OS', /SunOS/i],\n\t\t['Linux', /(Linux)|(X11)/i],\n\t\t['Macintosh', /(Mac_PowerPC)|(Macintosh)|(Mac OS X 10.4)|(Mac OS X 10.5)|(Mac OS X 10.6)/i],\n\t\t['QNX', /QNX/i],\n\t\t['BeOS', /BeOS/i],\n\t\t['OS/2', /OS\\/2/i],\n\t];\n\n\tlet res = '';\n\tfor (let i = 0; i < os.length; i++) {\n\t\tif (os[i][1].test(navigator.userAgent)) {\n\t\t\tres = os[i][0];\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn res;\n};\n\n/**\n * Получить операционную систему пользователя, в том числе Windows 11\n */\nexport const getOSAsync = async (): Promise<string> => {\n\tlet os = getOS();\n\n\tif (os === 'Windows 10') {\n\t\t// @ts-ignore - experimental technology\n\t\tconst platformVersion = await navigator?.userAgentData?.getHighEntropyValues(['platformVersion']);\n\t\tif (platformVersion && platformVersion.platformVersion >= '13') {\n\t\t\tos = 'Windows 11';\n\t\t}\n\t}\n\n\treturn os;\n};\n","class Page {\n\n\t/**\n\t * Проверить скрыта страница или нет\n\t */\n\tstatic isHidden = (): boolean => document.hidden;\n\n}\n\nexport default Page;","const onResizeDelay = 100;\n\nlet onResizeTimer: NodeJS.Timeout;\n\ntype TopEvent = Event & { topEvent: { widthDiff: number, hightDiff: number } }\n\n/**\n * Установленные обрабочики на событие изменения размеров окна\n */\nconst onResizeListeners: Map<(ev: TopEvent) => any, (ev: TopEvent) => any> = new Map();\n\n// зафиксированное состояние размеров окна\nconst windowSize = {\n\twidth: window.innerWidth,\n\theight: window.innerHeight,\n};\n\n/**\n * Добавить обработчик на событие изменения размеров экрана\n * вызов таких обработчиков будет опмизирован и объединен в одно событие\n */\nfunction addOnReize (listener: (this: Element, ev: TopEvent) => any) {\n\tonResizeListeners.set(listener, listener);\n}\n\n/**\n * Удаление обработчика на событие изменений размеров экрана\n */\nfunction removeOnResize (listener: (this: Element, ev: TopEvent) => any) {\n\tonResizeListeners.delete(listener);\n}\n\nfunction onResize (e: any) {\n\tclearTimeout(onResizeTimer);\n\n\tonResizeTimer = setTimeout(function () {\n\t\te.topEvent = {\n\t\t\twidthDiff: windowSize.width - window.innerWidth,\n\t\t\thightDiff: windowSize.height - window.innerHeight,\n\t\t};\n\n\t\twindowSize.width = window.innerWidth;\n\t\twindowSize.height = window.innerHeight;\n\n\t\tonResizeListeners.forEach((callback) => callback(e));\n\t}, onResizeDelay);\n}\n\nwindow.addEventListener('resize', onResize);\n\nexport default {\n\taddOnReize,\n\tremoveOnResize,\n};\n","/**\n * Конфигурация UI\n * Можно переопределить при подклчюении UI во Vue приложение через app.use(Core, options)\n */\nconst options = {\n\twidthForMobile: 900,\n\tdateFormat: 'Y-m-d',\n\n\t/**\n\t * Для Москвы: +0300\n\t */\n\tgmt: new Date().toString().match(/GMT(\\S+)/)?.[1],\n};\n\nexport default options;","/**\n * State UI для взаимодейсвтиями с приложениями Vue\n */\nconst state = {\n\t/**\n\t * Device by size\n\t * @see widthForMobile\n\t */\n\tisMobile: false,\n\n\t/**\n\t * Device by user agent\n\t */\n\tisMobileUA: false,\n\n\t/**\n\t * true, если плотность пикселей экрана больше 1\n\t */\n\tisRetina: false,\n\n\t/**\n\t * true, елси это приложение\n\t */\n\tisApp: false,\n\n\t/**\n\t * true при горизонтальном расположении устройства\n\t */\n\tisLandscape: true,\n\n\t/**\n\t * true при вертикальном расположении устройства\n\t */\n\tisPortrait: false,\n\tsize: 0,\n\n\t// См. core.options\n\tdateFormat: 'Y-m-d',\n\n\t// См. core.options\n\tgmt: new Date().toString().match(/GMT(\\S+)/)?.[1],\n\n\t/**\n\t * true, если страница скрыта\n\t */\n\tisHidden: false,\n};\n\nexport default state;","import type { DirectiveBinding, ObjectDirective, VNode } from 'vue';\nimport Core from '@/core/core/core';\n\nconst $ = (el: VNode) => {\n\tif (!Core.$?.ui?.tooltip) {\n\t\tconsole.info('Для работы v-top-tooltip требуется глобальная загрузка jQuery UI Tooltip');\n\n\t\treturn;\n\t}\n\n\treturn Core.$(el);\n};\n\nconst tvTooltipGenOptions = (binding: DirectiveBinding, vnode: VNode) => {\n\tconst options = binding.value ?? {};\n\n\toptions.content ??= vnode.props?.title;\n\toptions.content = String(options.content).replace(/\\r\\n|\\r|\\n/g, '<br>');\n\n\toptions.position ??= {\n\t\tmy: 'bottom-18px',\n\t\tat: 'top center',\n\t};\n\n\treturn options;\n};\n\n/**\n * Добавление всплывающей подсказки к элементу.\n */\nconst tooltip = {\n\tmounted(el: VNode, binding: DirectiveBinding, vnode: VNode) {\n\t\t$(el)?.tooltip(tvTooltipGenOptions(binding, vnode));\n\t},\n\n\tupdated(el: VNode, binding: DirectiveBinding, vnode: VNode, _prevVnode: VNode) {\n\t\t/**\n\t\t * В результате обновления может быть открыто несколько тултипов поэтому изменить опции, без перерисовки тултипа\n\t\t */\n\t\tconst options = tvTooltipGenOptions(binding, vnode);\n\t\tconst instance = $(el)?.tooltip('instance') as { options: JQueryUI.TooltipOptions } | undefined;\n\t\tif (!instance) {\n\t\t\treturn;\n\t\t}\n\n\t\tinstance.options = {\n\t\t\t...instance.options,\n\t\t\t...options,\n\t\t};\n\t},\n\n\tunmounted(el: VNode, _binding: DirectiveBinding, _vnode: VNode) {\n\t\t$(el)?.tooltip('destroy');\n\t},\n} satisfies ObjectDirective;\n\nexport default tooltip;","import type { DirectiveBinding, ObjectDirective } from 'vue';\n\n/**\n * Фокусировка на элементе сразу после его отображения\n */\nconst focus = {\n\tmounted: function (el: HTMLElement, binding: DirectiveBinding) {\n\t\tif (binding.value || binding.value === undefined) el.focus();\n\t}\n} satisfies ObjectDirective;\n\nexport default focus;","import type { DirectiveBinding, ObjectDirective, VNode } from 'vue';\n\nlet appStickyObserver: IntersectionObserver;\n\n/**\n * Добавление sticky\n * К элементу добляется класс переданный как значение диррективы либо **'top-sticky'** по умолчанию\n */\nconst sticky = {\n\tmounted(el: HTMLElement, binding: DirectiveBinding, _vnode: VNode){\n\t\tconst className = binding.value || 'top-sticky';\n\n\t\tappStickyObserver = new IntersectionObserver(entries => {\n\t\t\tlet condition = entries[0].intersectionRatio < 1;\n\t\t\tif(condition){\n\t\t\t\tif(binding.arg === 'bottom' && entries[0].intersectionRect.y === 0) condition = false;\n\t\t\t}\n\n\t\t\tel.classList.toggle(className, condition);\n\t\t}, {\n\t\t\tthreshold:[1]\n\t\t});\n\n\t\tappStickyObserver.observe(el);\n\t},\n\n\tunmounted(_el: HTMLElement, _binding: DirectiveBinding, _vnode: VNode){\n\t\tappStickyObserver?.disconnect();\n\t},\n} satisfies ObjectDirective;\n\nexport default sticky;","import type { DirectiveBinding, ObjectDirective, VNode } from 'vue';\nimport Core from '@/core/core/core';\n\ninterface SwipUpOptions {\n\tdistance: number,\n\tpercent: number,\n}\n\nlet appSwimUpInited = false;\nlet appSwimUpObserver: IntersectionObserver;\nlet directiveSwipUpOptions: SwipUpOptions;\nconst appSwimUpEls = new Map();\n\n\n/**\n * Отодвинуть блок в зависимости от скролла старинцы\n * @param el\n * @param windowHeight\n */\nconst swimUpElTransform = (el: HTMLElement, windowHeight: number): void => {\n\tconst { distance, percent } = directiveSwipUpOptions;\n\n\tconst elTop = el.getBoundingClientRect().top;\n\n\t// во столько раз triggerHeight должен быть меньше, чтобы закончить подплытие к нужной высоте экрана\n\tconst triggerHeightReducer = windowHeight * percent / 100 / distance;\n\tconst triggerHeight = (windowHeight - elTop) / triggerHeightReducer;\n\n\tif (triggerHeight <= distance) {\n\t\tel.style.transform = `translateY(${distance - triggerHeight}px)`;\n\t} else {\n\t\tel.style.transform = 'translateY(0px)';\n\t}\n}\n\nconst swimUpInit = (el: HTMLElement): void => {\n\tlet windowHeight = window.innerHeight;\n\n\twindow.addEventListener('scroll', () => {\n\t\tappSwimUpEls.forEach((el) => swimUpElTransform(el, windowHeight));\n\t}, { passive: true });\n\n\t// проверка того, что элемент в зоне видимости\n\tappSwimUpObserver = new IntersectionObserver(entries => {\n\t\twindowHeight = window.innerHeight;\n\n\t\tentries.forEach((entry) => {\n\t\t\tconst el = entry.target as HTMLElement;\n\n\t\t\tif (entry.intersectionRatio < 0.1) {\n\t\t\t\t// элемент за областью видимости\n\t\t\t\tappSwimUpEls.delete(el);\n\t\t\t} else {\n\t\t\t\t// элемент на экране\n\t\t\t\tappSwimUpEls.set(el, el);\n\t\t\t}\n\n\t\t\tif (entry.intersectionRatio === 0) {\n\t\t\t\tconst { distance, percent } = directiveSwipUpOptions;\n\t\t\t\tel.style.transform = `translateY(${distance}px)`;\n\t\t\t}\n\t\t});\n\t}, {\n\t\tthreshold: 0.1,\n\t});\n}\n\n/**\n * Добавление анимации подплытия вверх для блока\n */\nconst swimUp = {\n\tmounted(el: HTMLElement, binding: DirectiveBinding, _vnode: VNode): void {\n\t\tif (Core.state.isMobileUA) return;\n\n\t\tconst args = binding.arg?.split(':');\n\n\t\tlet distance = Number(args?.[0] ?? 100); // количество px на которые блок изначально смещен вниз\n\t\tlet percent = Number(args?.[1] ?? 30); // процент высоты экрана поднявшись на который блок закончит подплытие\n\n\t\tdirectiveSwipUpOptions = {\n\t\t\tdistance,\n\t\t\tpercent\n\t\t}\n\n\t\tif (!appSwimUpInited) {\n\t\t\tswimUpInit(el);\n\n\t\t\tappSwimUpInited = true;\n\t\t}\n\n\t\tappSwimUpObserver.observe(el);\n\t},\n\n\tunmounted(el: HTMLElement, _binding: DirectiveBinding, _vnode: VNode) {\n\t\tappSwimUpEls.delete(el);\n\t\tappSwimUpObserver?.unobserve(el);\n\t}\n} satisfies ObjectDirective;\n\nexport default swimUp;","/**\n * Генерация объекта window\n *\n * На backend объекта window не существует\n */\nconst genWindow = (): any => {\n\tif (typeof window === 'undefined') {\n\t\treturn {};\n\t}\n\n\treturn window;\n};\n\nexport const _window = genWindow();","import { reactive } from 'vue';\nimport { isMobile, isRetina, isApp } from '@/core/utils/device';\nimport Page from '@/core/core/page';\nimport Events from '@/core/core/events';\nimport options from '@/core/core/options';\nimport state from '@/core/core/state';\nimport directiveTooltip from '@/core/directives/tooltip';\nimport directiveFocus from '@/core/directives/focus';\nimport directiveSticky from '@/core/directives/sticky';\nimport directiveSwimUp from '@/core/directives/swimUp';\nimport { _window } from '@/core/utils/window';\n\nclass Core {\n\n\t/**\n\t * Настройки словаря\n\t */\n\tstatic L = reactive({\n\t\tNot_date: 'Not date',\n\t});\n\n\tstatic page = _window.page ?? {};\n\n\tstatic Page = Page;\n\n\tstatic options = options;\n\n\tstatic state = reactive({ ...state });\n\n\tstatic matchMediaIsMobile?: MediaQueryList;\n\n\tstatic $ = _window.$ as typeof $ | undefined;\n\n\t/**\n\t * Добавить на страницу стили, используется для загрузки стилей из js\n\t *\n\t * Условная загрузка стилей m и pc отключена в пользу производительсности, стили грузятся всегда, но применяются по условию\n\t * @param style - css стили в строке\n\t * @param type - если указать 'm' или 'pc', то стили будут применяться по условию в зависимости от настройки this.options.widthForMobile\n\t */\n\tstatic appendStyle(style: string, type: '' | 'm' | 'pc' = ''): void {\n\t\tlet media = 'all';\n\n\t\tif (type === 'm') {\n\t\t\tmedia = '(max-width: ' + this.options.widthForMobile + 'px)';\n\t\t}\n\n\t\tif (type === 'pc') {\n\t\t\tmedia = '(min-width: ' + this.options.widthForMobile + 'px)';\n\t\t}\n\n\t\tconst elStyle = document.createElement('style');\n\t\telStyle.innerHTML = style;\n\t\telStyle.media = media;\n\n\t\tdocument.head.append(elStyle);\n\t}\n\n\t/**\n\t * Установить как плагин в прилоежнии Vue\n\t * Core.state является общим для всех приложений Vue на странице\n\t * Core.options является общим для всех приложений Vue на странице\n\t * @param app - Vue App\n\t * @param {typeof options} options - параметры UI\n\t */\n\tstatic install(app: any, options: typeof this.options) {\n\t\tCore.defineOptions(options);\n\n\t\tapp.provide('top-core', Core);\n\n\t\tthis.installDirectives(app);\n\t}\n\n\tstatic installDirectives(app: any) {\n\t\tapp.directive('top-tooltip', directiveTooltip);\n\t\tapp.directive('top-focus', directiveFocus);\n\t\tapp.directive('top-sticky', directiveSticky);\n\t\tapp.directive('top-swim-up', directiveSwimUp);\n\t}\n\n\t/**\n\t * Установить конфигурацию UI\n\t * @param {typeof options} options\n\t */\n\tstatic defineOptions(options: typeof this.options) {\n\t\tif (options?.widthForMobile) {\n\t\t\tthis.options.widthForMobile = options.widthForMobile;\n\t\t}\n\n\t\tif (options?.dateFormat) {\n\t\t\tthis.options.dateFormat = options.dateFormat;\n\t\t}\n\n\t\tif (options?.gmt) {\n\t\t\tthis.options.gmt = options.gmt;\n\t\t}\n\n\t\tCore.setState();\n\t}\n\n\tstatic setState() {\n\t\tCore.matchMediaIsMobile = window.matchMedia(`(max-width: ${Core.options.widthForMobile}px)`);\n\n\t\tCore.state.isMobileUA = isMobile();\n\t\tCore.state.isRetina = isRetina();\n\t\tCore.state.isApp = isApp();\n\t\tCore.state.dateFormat = this.options.dateFormat;\n\t\tCore.state.gmt = this.options.gmt;\n\t\tCore.state.isHidden = Page.isHidden();\n\n\t\tCore.setStateByWindowSize();\n\n\t\t// пересчет значений, зависящих от рамзеров окна\n\t\tEvents.addOnReize(Core.onResize);\n\n\t\tCore.onResize();\n\n\t\tCore.saveToCookie();\n\t}\n\n\tstatic onResize() {\n\t\tCore.setStateByWindowSize();\n\n\t\t// честный vh\n\t\tdocument.documentElement.style.setProperty('--100vh', window.innerHeight + 'px');\n\t}\n\n\tstatic setStateByWindowSize() {\n\t\tCore.state.isMobile = !!Core.matchMediaIsMobile?.matches;\n\t\tCore.state.isLandscape = (window.innerWidth > window.innerHeight);\n\t\tCore.state.isPortrait = !Core.state.isLandscape;\n\t\tCore.state.size = (window.innerWidth > window.innerHeight) ? window.innerWidth : window.innerHeight;\n\n\t\tCore.saveToCookie();\n\t}\n\n\t/**\n\t * Сохранить информацию об устройстве в cookie\n\t */\n\tstatic saveToCookie() {\n\t\tconst device = [\n\t\t\t1,\n\t\t\twindow.innerWidth,\n\t\t\twindow.innerHeight,\n\t\t\twindow.devicePixelRatio,\n\t\t\tNumber(Core.state.isMobile),\n\t\t\tNumber(Core.state.isRetina),\n\t\t];\n\n\t\tdocument.cookie = 'device=' + device.join(',') + '; path=/;';\n\t}\n\n}\n\nexport default Core;\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7F]/; // Note: U+007F DEL is excluded too.\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, callback) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = callback(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {String} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(domain, callback) {\n\tconst parts = domain.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tdomain = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tdomain = domain.replace(regexSeparators, '\\x2E');\n\tconst labels = domain.split('.');\n\tconst encoded = map(labels, callback).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = codePoints => String.fromCodePoint(...codePoints);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint >= 0x30 && codePoint < 0x3A) {\n\t\treturn 26 + (codePoint - 0x30);\n\t}\n\tif (codePoint >= 0x41 && codePoint < 0x5B) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint >= 0x61 && codePoint < 0x7B) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t// 0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tconst oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\t\t\tif (digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tconst inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tconst basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue === n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.3.1',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport { ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode };\nexport default punycode;\n","import punycode from 'punycode';\n\n/**\n * Раскодировать все не ASCII символы в домене URL\n * @param url - домен в ASCII формате\n * @returns домен в Unicode формате\n */\nexport const fromPuny = (url: string = ''): string => {\n\turl = url.replace(/[\\r\\n]/g, ' ').trim();\n\n\tif (url.indexOf('xn--') === -1) return url;\n\tif (url.indexOf('/') === -1) return punycode.toUnicode(url);\n\n\tconst host = getHost(url);\n\n\tlet hostNormal = host.toLowerCase();\n\thostNormal = punycode.toUnicode(hostNormal);\n\n\tif (host !== hostNormal) url = url.replace(host, hostNormal);\n\n\treturn url;\n};\n\n/**\n * Закодировать все не ASCII символы в домене URL\n * @param url - домен в Unicode формате\n * @returns домен в ASCII формате\n */\nexport const toPuny = (url: string): string => {\n\turl = url.replace(/[\\r\\n]/g, ' ').trim();\n\n\tif (url.indexOf('/') === -1) return punycode.toASCII(url);\n\n\tconst host = getHost(url);\n\n\tlet hostNormal = host.toLowerCase();\n\thostNormal = punycode.toASCII(hostNormal);\n\n\tif (host !== hostNormal) url = url.replace(host, hostNormal);\n\n\treturn url;\n};\n\n/**\n * Получить имя хоста из URL\n */\nexport const getHost = (url: string): string => {\n\treturn url.replace(/(?:^\\w+:\\/\\/)?([^:/]+).*/i, '$1');\n};\n\n/**\n * Привести url к стандартному виду (не в пуникоде и хост в нижнем регистре)\n */\nexport const normalize = (url: string): string => {\n\turl = fromPuny(url);\n\turl = hostToLowerCase(url);\n\n\treturn url;\n};\n\n/**\n * Перевести в url имя хоста в нижний регистр\n */\nexport const hostToLowerCase = (url: string): string => {\n\tconst host = getHost(url);\n\tconst hostNormal = host.toLowerCase();\n\tif (host !== hostNormal) url = url.replace(host, hostNormal);\n\n\treturn url;\n};\n\n/**\n * Получить закодированную строку\n */\nexport const encode = (string: string): string => { return escape(utf8Encode(string)); };\n\n/**\n * Раскодировать строку, полученную функцией encode\n */\nexport const decode = (string: string): string => { return utf8Decode(unescape(string)); };\n\nconst utf8Encode = (string: string): string => {\n\tstring = string.replace(/\\r\\n/g, '\\n');\n\tlet utftext = '';\n\n\tfor (let n = 0; n < string.length; n++) {\n\t\tconst c = string.charCodeAt(n);\n\n\t\tif (c < 128) {\n\t\t\tutftext += String.fromCharCode(c);\n\t\t} else if ((c > 127) && (c < 2048)) {\n\t\t\tutftext += String.fromCharCode((c >> 6) | 192);\n\t\t\tutftext += String.fromCharCode((c & 63) | 128);\n\t\t} else {\n\t\t\tutftext += String.fromCharCode((c >> 12) | 224);\n\t\t\tutftext += String.fromCharCode(((c >> 6) & 63) | 128);\n\t\t\tutftext += String.fromCharCode((c & 63) | 128);\n\t\t}\n\t}\n\n\treturn utftext;\n};\n\n/**\n * private method for UTF-8 decoding\n */\nconst utf8Decode = (utftext: string): string => {\n\tlet string = '';\n\tlet i = 0;\n\tlet c = 0, c1 = 0, c2 = 0;\n\n\twhile (i < utftext.length) {\n\t\tc = utftext.charCodeAt(i);\n\n\t\tif (c < 128) {\n\t\t\tstring += String.fromCharCode(c);\n\t\t\ti++;\n\t\t} else if ((c > 191) && (c < 224)) {\n\t\t\tc2 = utftext.charCodeAt(i + 1);\n\t\t\tstring += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n\t\t\ti += 2;\n\t\t} else {\n\t\t\tc2 = utftext.charCodeAt(i + 1);\n\t\t\tlet c3 = utftext.charCodeAt(i + 2);\n\t\t\tstring += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n\t\t\ti += 3;\n\t\t}\n\t}\n\n\treturn string;\n};","import { toPuny } from '@/core/utils/url';\n\nconst domainEn: string = 'ru|com|abbott|ac|ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|as|asia|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|boo|br|bs|bt|bv|bw|by|bz|ca|cat|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|coop|cr|cs|gb|cu|cv|cx|cy|cyou|cz|dd|de|dj|dk|dm|do|dz|ec|eco|edu|ee|eg|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|icu|id|ie|il|im|in|int|info|io|iq|ir|is|it|je|jm|jo|jobs|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|live|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mh|mil|mg|mk|ml|mm|mn|mo|mobi|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|ng|ni|nl|no|np|nr|nu|nz|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|rs|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vn|vu|wf|ws|ye|yt|za|zm|zw|academy|agency|art|arte|audible|audio|band|bargains|bike|blog|boutique|builders|buzz|cab|camera|camp|cam|careers|center|cheap|clothing|club|codes|coffee|company|computer|condos|construction|contractors|cool|cruises|dance|dating|democrat|diamonds|directory|domains|education|email|enterprises|equipment|estate|events|expert|exposed|farm|flights|florist|foundation|futbol|gallery|gal|gift|glass|graphics|guitars|guru|holdings|holiday|house|immobilien|kitchen|land|lighting|limo|link|maison|management|marketing|menu|men|moe|ninja|partners|photo|photography|photos|pics|plumbing|plus|productions|properties|recipes|rentals|repair|review|reviews|sandvik|sexy|shoes|singles|social|solar|solutions|support|systems|tattoo|technology|tienda|tips|today|training|travel|vacations|ventures|viajes|villas|voyage|watch|works|zone|xxx|ads|associates|booking|business|ceo|ecom|forum|gives|global|gmbh|inc|institute|insure|lifeinsurance|llc|llp|ltd|ltda|mba|new|news|ngo|press|sarl|services|srl|studio|trade|trading|wiki|xin|auction|bid|blackfriday|buy|capital|charity|claims|compare|coupon|coupons|deal|dealer|deals|delivery|discount|exchange|flowers|free|furniture|gifts|gripe|grocery|jewelry|kaufen|lotto|parts|promo|qpon|racing|rsvp|sale|salon|save|seat|shop|shopping|silk|spa|store|supplies|supply|taxi|tickets|tires|tools|toys|watches|college|courses|degree|ged|phd|prof|scholarships|school|schule|science|shiksha|study|translations|university|beer|cafe|catering|cityeats|cooking|diet|food|organic|pet|pizza|pub|rest|restaurant|soy|wine|blue|circle|dot|duck|fast|final|finish|fire|fun|fyi|goo|got|green|here|horse|how|ieee|jot|joy|like|limited|makeup|meme|mint|moi|moto|now|nowruz|ong|onl|ooo|page|pars|pid|pink|play|plus|read|red|reise|reisen|rocks|safe|safety|seek|select|sky|smile|spot|sucks|talk|top|trust|uno|vin|vodka|web|wed|win|winners|wow|wtf|xyz|yamaxun|you|zero|abudhabi|africa|alsace|amsterdam|aquitaine|arab|barcelona|bayern|berlin|boston|broadway|brussels|budapest|bzh|capetown|cologne|corsica|country|cymru|desi|doha|dubai|durban|earth|eus|gent|hamburg|helsinki|international|irish|istanbul|joburg|kiwi|koeln|kyoto|london|madrid|market|melbourne|miami|monster|nagoya|nrw|nyc|okinawa|osaka|paris|persiangulf|place|quebec|rio|roma|ryukyu|saarland|scot|shia|show|stockholm|stream|swiss|sydney|taipei|tatar|thai|tirol|tokyo|vegas|vlaanderen|wales|wanggou|wien|world|yokohama|zuerich|clinic|dental|dentist|docs|doctor|health|healthcare|hiv|hospital|med|medical|pharmacy|physio|rehab|surgery|auto|autos|bio|boats|cars|cleaning|consulting|design|energy|industries|motorcycles|adult|baby|beauty|beknown|best|bet|bingo|bom|cards|community|contact|dad|diy|dog|express|family|fan|fans|fashion|garden|gay|giving|group|guide|hair|halal|hiphop|imamat|jetzt|kid|kids|kim|kinder|latino|lgbt|lifestyle|style|living|love|luxe|luxury|moda|mom|navy|pets|poker|porn|republican|vip|vision|vote|voting|voto|wedding|feedback|film|media|mov|movie|movistar|music|pictures|radio|show|song|theater|theatre|tunes|video|accountant|accountants|analytics|bank|banque|broker|cash|cashbackbonus|cfd|cpa|credit|creditcard|finance|financial|financialaid|fund|gold|gratis|investments|ira|loan|loans|markets|money|mortgage|mutual|mutualfunds|pay|reit|prime|security|yun|abogado|airforce|archi|architect|army|attorney|author|dds|engineer|engineering|esq|law|lawyer|legal|retirement|vet|apartments|casa|case|forsale|haus|homes|lease|property|realestate|realtor|realty|rent|room|baseball|basketball|coach|cricket|fish|fishing|fit|fitness|football|game|games|golf|hockey|juegos|mls|rodeo|rugby|run|ski|soccer|sport|sports|spreadbetting|surf|team|tennis|yoga|app|box|chat|click|cloud|comsec|bot|data|date|dev|digital|download|drive|call|fail|help|host|hosting|map|mobile|network|online|original-tor|phone|report|search|secure|site|software|space|storage|tube|webcam|webs|website|weibo|zip|active|casino|christmas|hangout|hoteis|hotel|hoteles|hotels|meet|party|tech|tour|tours|bible|church|catholic|faith|indians|islam|ismaili|memorial|moscow|actor|bar|black|build|care|city|direct|immo|ink|life|tax|town|work|one|insure|saxo|sex|shell|weber|yandex|rip|car|ist|lat|lol|bond|om|skin|day|quest|wang|sbs|dhl|ing';\nconst domainRu: string = 'рф|дети|онлайн|сайт|укр|католик|ком|москва|орг|рус|бел|бг';\nlet punyDomainRu = '';\n\n/**\n * Получить строку национализированных доменов верхнего уровня в ASCII формате\n */\nconst getPunyDomainRU = (): string => {\n\tif (punyDomainRu) return punyDomainRu;\n\n\tpunyDomainRu = domainRu.split('|').map(domain => toPuny(domain)).join('|');\n\n\treturn punyDomainRu;\n};\n\n/**\n * Получить строку с регулярным выражение для домена\n */\nexport const getDomainRegexp = (): string => {\n\tconst regexp_en = `(?:${domainEn})`;\n\tconst regexp_ru = `(?:${getPunyDomainRU()})`;\n\n\treturn `(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\\\.)+(?:${regexp_en}|${regexp_ru})\\\\/?`;\n};\n\n/**\n * Проверка валидности email\n * @param email\n * @param rus_allow - если true, русскоязычные адреса тоже будут валидны\n */\nexport const isEmail = (email: string, rus_allow: boolean = false): boolean => {\n\temail += '';\n\n\temail = email.toLowerCase();\n\n\tlet emailTest = '^[-0-9a-z_\\\\.\\\\+]+@([-0-9a-z_^\\\\.]+\\\\.)+[a-z]{2,20}$';\n\n\tif (rus_allow) {\n\t\temailTest = '^[-0-9a-zа-яё_\\\\.\\\\+]+@([-0-9a-zа-яё_^\\\\.]+\\\\.)+[a-zа-яё]{2,20}$';\n\t}\n\n\tconst regex = new RegExp(emailTest);\n\treturn regex.test(email);\n};\n\n/**\n * Проверка валидности URL-адреса\n */\nexport const validUrl = (url: string): boolean => {\n\turl = url.trim();\n\tif (url.includes(' ')) {\n\t\treturn false;\n\t}\n\n\tconst domain = url.replace(/^(https?:\\/\\/)?(www\\.)?([^/]+).*/, '$3');\n\n\treturn isDomain(domain);\n};\n\n/**\n * Проверка валидности домена\n */\nexport const isDomain = (domain: string): boolean => {\n\tdomain = toPuny(domain);\n\n\tconst regexp = new RegExp(`^${getDomainRegexp()}$`);\n\n\treturn regexp.test(domain);\n};\n\n/**\n * Проверка валидности ip\n */\nexport const isIp = (ip: string): boolean => {\n\tconst regexp = new RegExp(\n\t\t'((^\\\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\\\s*$)|(^\\\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:)(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:)))(%.+)?\\\\s*$))');\n\n\treturn regexp.test(ip);\n};\n","import { getDomainRegexp } from '@/core/utils/check';\n\n/**\n * TODO: mo.user.lang заменить на Core.state.lang\n */\nconst user = window['mo']?.user ?? {};\n\n/**\n * Сгенерировать числовой хэш от строки для идентификатора\n */\nexport const genIntHash = (string: string): number => {\n\tstring += '';\n\n\tlet hash = 0;\n\tif (!string.length) return hash;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst char = string.charCodeAt(i);\n\t\thash = ((hash << 5) - hash) + char;\n\t\thash = hash & hash;\n\t}\n\n\tif (hash < 0) hash *= -1;\n\n\treturn hash;\n};\n\n/**\n * Проверить что переданная строка является URL\n */\nexport const isUrl = (url: string): boolean => {\n\treturn /^\\w+:\\/\\/([\\w-]+\\.)+[\\w-]+(:\\d+)?(\\/|$)/.test(url);\n};\n\n/**\n * Добавляет пробелы между разрядами если требуется\n * @param nStr строка с числом\n */\nexport const addCommasWhite = (nStr: string): string => {\n\tnStr += '';\n\n\tnStr = nStr.replace('-', '–');\n\n\tlet x = nStr.split('.');\n\tlet x1 = x[0];\n\tlet x2 = (x.length > 1) ? ('.' + x[1]) : '';\n\n\tif (x1.replace(/[+–]/, '').length <= 4) return nStr;\n\n\tconst rgx = /(\\d+)(\\d{3})/;\n\twhile (rgx.test(x1)) {\n\t\tx1 = x1.replace(rgx, '$1' + ' ' + '$2');\n\t}\n\treturn x1 + x2;\n};\n\n/**\n * Вставляет HTML-код разрыва строки перед каждым переводом строки\n */\nexport const nl2br = (str: string): string => {\n\tif (str === undefined) return '';\n\n\treturn str.replace(/\\r\\n|\\r|\\n/g, '<br>');\n};\n\n/**\n * Перевести число без деситичной приставки в число с деситичной приставкой степеней тысячи (с параметрами по умолчанию 1255 -> '1.26 K')\n * @param number\n * @param precision - точность, количество знаков после запятой\n * @param dimension - размерность, по умолчанию 1000\n * @param suffix - суффикс к десятичной приставке (по умолчанию выводится латинская заглавная буква)\n */\nexport const numberWithWord = (number: number, precision = 2, dimension = 1000, suffix = ''): string => {\n\tconst k = Math.pow(10, precision);\n\n\tlet numberStr = String(number);\n\tif (Math.abs(number) > Math.pow(dimension, 3)) {\n\t\tnumberStr = Math.round(number / Math.pow(dimension, 3) * k) / k + ' <small>G' + suffix + '</small>';\n\t} else if (Math.abs(number) > Math.pow(dimension, 2)) {\n\t\tnumberStr = Math.round(number / Math.pow(dimension, 2) * k) / k + ' <small>M' + suffix + '</small>';\n\t} else if (Math.abs(number) > dimension) {\n\t\tnumberStr = Math.round(number / dimension * k) / k + ' <small>K' + suffix + '</small>';\n\t}\n\n\tnumberStr = numberStr.replace(/^(-?\\d+)(\\d{3})/, '$1 $2');\n\n\treturn numberStr;\n};\n\n/**\n * Обрезать текст под три точки\n * @param string\n * @param max_length - максимальное количество символов текста, остальное обрежеться\n * @param pos - область обрезки 0-начало | 1-середина | 2-конец строки\n */\nexport const ellipsis = (string: string, max_length: number, pos: 0 | 1 | 2 = 1): string => {\n\tif (string == undefined) return '';\n\n\tstring += '';\n\tif (max_length == undefined || string.length <= max_length) return string;\n\n\tif (pos === 0) {\n\t\tstring = string.substr(string.length - max_length, max_length);\n\t\tstring = '...' + string;\n\t} else if (pos === 1) {\n\t\tconst string1 = string.substr(0, max_length / 2);\n\t\tconst string2 = string.substr(string.length - max_length / 2, Math.ceil(max_length / 2));\n\t\tstring = string1 + '...' + string2;\n\t} else if (pos === 2) {\n\t\tstring = string.substr(0, max_length);\n\t\tstring = string + '...';\n\t}\n\n\treturn string;\n};\n\n/**\n * Сгенерировать строку текста для вывода количества в разном склонении\n * @param num\n * @param ending0 - родительный падеж, множ. число (10 модулей)\n * @param ending1 - именительный падеж, ед. число (1 модуль)\n * @param ending2 - винительный падеж, множ. число (3 модуля)\n */\nexport const numberEnding = (num: number, ending0: string, ending1: string, ending2: string): string => {\n\t// склонение по множественному числу\n\tif (user.lang === 'en') {\n\t\tif (num === 1) {\n\t\t\treturn ending1;\n\t\t} else {\n\t\t\treturn ending0;\n\t\t}\n\t}\n\n\tconst num100 = num % 100;\n\tconst num10 = num % 10;\n\n\tif (num100 >= 5 && num100 <= 20) {\n\t\treturn ending0;\n\t} else if (num10 === 0) {\n\t\treturn ending0;\n\t} else if (num10 === 1) {\n\t\treturn ending1;\n\t} else if (num10 >= 2 && num10 <= 4) {\n\t\treturn ending2;\n\t} else if (num10 >= 5 && num10 <= 9) {\n\t\treturn ending0;\n\t} else {\n\t\treturn ending2;\n\t}\n};\n\n/**\n * Перевести строку в родительный падеж\n */\nexport const toRoditPadej = (str: string): string => {\n\tif (user.lang != 'ru' || str == '') return str;\n\n\tconst str_array = str.split(' ');\n\n\t$.map(str_array, function (str, index) {\n\t\tstr = str + 'а';\n\t\tstr = str.replace('оа', 'о');\n\t\tstr = str.replace('аяа', 'ой');\n\t\tstr = str.replace('шийа', 'шого');\n\t\tstr = str.replace('ыйа', 'ого');\n\t\tstr = str.replace('йа', 'я');\n\t\tstr = str.replace('ьа', 'я');\n\t\tstr = str.replace('яа', 'и');\n\t\tstr = str.replace('оваа', 'овой');\n\t\tstr = str.replace('аа', 'ы');\n\t\tstr = str.replace('кия', 'кого');\n\t\tstr = str.replace('каи', 'кой');\n\n\t\tstr_array[index] = str;\n\t});\n\n\tstr = str_array.join(' ');\n\n\treturn str;\n};\n\n/**\n * Транслитерация текста\n */\nexport const rusToLatin = (str: string): string => {\n\tconst ru: { [index: string]: string } = {\n\t\t'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd',\n\t\t'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i',\n\t\t'й': 'i', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n',\n\t\t'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't',\n\t\t'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch',\n\t\t'ш': 'sh', 'щ': 'shch', 'ъ': '', 'ы': 'y', 'ь': '',\n\t\t'э': 'e', 'ю': 'u', 'я': 'ya',\n\t};\n\n\tconst str_array = str.split(' ');\n\n\t$.map(str_array, function (str, index) {\n\t\tconst newStr: string[] = [];\n\t\tfor (let i = 0; i < str.length; ++i) {\n\t\t\tnewStr.push(\n\t\t\t\tru[str[i]] || ru[str[i].toLowerCase()] == undefined && str[i] || ru[str[i].toLowerCase()].replace(/^(.)/, function (match) {\n\t\t\t\t\treturn match.toUpperCase();\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tstr_array[index] = newStr.join('');\n\t});\n\n\tstr = str_array.join(' ');\n\n\treturn str;\n};\n\n/**\n * Замена html-символов (&, <, >, \", ') на имена литер (& -> \\&amp;)\n */\nexport const htmlspecialchars = (str: string): string => {\n\tif (typeof (str) == 'string') {\n\t\tstr = str\n\t\t\t.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;')\n\t\t\t.replace(/'/g, '&#039;');\n\t}\n\treturn str;\n};\n\n/**\n * Выделить нужное в тексте желтым цветом\n * поиск происходит по строке fieldFilter.values[0]\n */\nexport const highlightHtml = (text: string, fieldFilter: { operator: 'CONTAINS' | 'REGEXP', values: string[] }): string => {\n\tlet regExp: RegExp | null = null;\n\n\tswitch (fieldFilter.operator) {\n\t\tcase 'CONTAINS':\n\t\tcase 'REGEXP':\n\t\t\ttry {\n\t\t\t\tlet regExpString = fieldFilter.values[0];\n\t\t\t\tif (fieldFilter.operator != 'REGEXP') regExpString = regExpString.replace(/([()\\[\\]])/g, '\\\\$1');\n\n\t\t\t\tregExp = new RegExp('(' + regExpString + ')', 'gi');\n\t\t\t} catch (exception) {\n\t\t\t\treturn text;\n\t\t\t}\n\n\t\t\tbreak;\n\t}\n\n\ttext = text.replace(regExp!, '<b class=\"found\">$1</b>');\n\n\treturn text;\n};\n\n/**\n * Пример: logHTTPCodesHundreds => log_http_codes_hundreds\n */\nexport const camelToSnakeCase = (str: string): string | undefined => {\n\treturn str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)?.map(token => token.toLowerCase()).join('_');\n};\n\n/**\n * Получить url изображения флага, по коду страны (RU, GB)\n */\nexport const genFlagLinkByCountryCode = (countryCode: string) => {\n\tconst urlImage = '/cloud/common/flags/' + countryCode.toUpperCase() + '.svg';\n\treturn `/controller/file/?src=${urlImage}`;\n};\n\n/**\n * Обернуть все ссылки и email в тексте в html-тег <a>. Для email ставиться префикс mailto:\n */\nexport const addLinkTags = (text: string): string => {\n\tconst domainRegexp = getDomainRegexp();\n\tconst afterDomainRegexp = '(([\\\\/?\\\\w&=%+#;:-]*(\\\\.\\\\w+)?))*';\n\n\tconst regexpMailto = new RegExp(`(^|[\\\\s>(),])([a-z0-9а-яё_.]+@${domainRegexp}${afterDomainRegexp})`, 'gui');\n\ttext = text.replace(regexpMailto, `$1<a href=\"mailto:$2\" target=\"_blank\" rel=\"noopener\">↑[$2]↓</a>`);\n\n\tconst regexpLink = new RegExp(`(^|[\\\\s>(),])(https?:\\/\\/)?(${domainRegexp}${afterDomainRegexp})`, 'gui');\n\ttext = text.replace(regexpLink, `$1<a href=\"√$2$3\" target=\"_blank\" rel=\"nofollow noopener\">$2$3</a>`);\n\n\ttext = text.replaceAll('√http', 'http');\n\ttext = text.replaceAll('√', 'http://');\n\ttext = text.replaceAll(/(↑\\[|]↓)/g, '');\n\n\treturn text;\n};\n\n/**\n * Перевести первую букву строки в верхний регистр\n */\nexport const toCapitalize = (str: string): string => {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Получить случайную строку\n */\nexport const getRandomHash = (length: number = 20): string => {\n\tconst l = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890';\n\n\tlet result = '';\n\tfor (let i = 0; i < length; i++) {\n\t\tresult += l[Math.floor(Math.random() * l.length)];\n\t}\n\n\treturn result;\n};","import Core from '@/core/core/core';\n\nconst L = (window as any).L ?? {};\n\n/**\n * Получить день недели\n */\nexport const getDayOfWeek = (y: number, m: number, d: number): string => {\n\tswitch ((new Date(y, m, d)).getDay()) {\n\t\tcase 0:\n\t\t\treturn L.Vs + '.';\n\t\tcase 1:\n\t\t\treturn L.Pn + '.';\n\t\tcase 2:\n\t\t\treturn L.Vt + '.';\n\t\tcase 3:\n\t\t\treturn L.Sr + '.';\n\t\tcase 4:\n\t\t\treturn L.Ct + '.';\n\t\tcase 5:\n\t\t\treturn L.Pt + '.';\n\t\tcase 6:\n\t\t\treturn L.Sb + '.';\n\t\tdefault:\n\t\t\treturn '';\n\t}\n};\n\n/**\n * Преобразовать дату в строку формата Y-m-d H:i:s\n * @param dateObject - объект Date\n * @param langFormat - если true, формат даты будет взят из Core.state.dateFormat\n * @param timeFormat - 0-только дата | 1-дата и часы | 2-дата и часы с минутами | 3-дата и часы с минутами и секундами\n */\nexport const dateToString = (dateObject: Date, langFormat: boolean = true, timeFormat: 0 | 1 | 2 | 3 = 2): string => {\n\tlet Y = String(dateObject.getFullYear());\n\tlet d = String(dateObject.getDate()).padStart(2, '0');\n\tlet m = String(dateObject.getMonth() + 1).padStart(2, '0');\n\tlet H = String(dateObject.getHours()).padStart(2, '0');\n\tlet i = String(dateObject.getMinutes()).padStart(2, '0');\n\tlet s = String(dateObject.getSeconds()).padStart(2, '0');\n\n\tlet date = Y + '-' + m + '-' + d;\n\tif (timeFormat >= 1) date += ' ' + H;\n\tif (timeFormat >= 2) date += ':' + i;\n\tif (timeFormat === 3) date += ':' + s;\n\tif (langFormat) date = dateFormat(date, timeFormat);\n\n\treturn date;\n};\n\n/**\n * Получить объект Date из строки\n * @param date - строка с датой\n */\nexport function stringToDate(date: string): Date {\n\tif (date.indexOf('T') === -1) {\n\t\tif (date.length == 10) {\n\t\t\tdate += ' 00:00:00';\n\t\t}\n\n\t\tdate = date.replace(' ', 'T') + Core.state.gmt;\n\t}\n\n\treturn new Date(date);\n}\n\n/**\n * Генерация даты-строки из миллисекунд (UTC), в формате Y-m-d H:i:s\n * @param timestamp - дата в мс, если не передана, берется дата на момент вызова функции\n * @param useFormat - если true, формат даты будет взят из Core.state.dateFormat\n * @param time - 0-только дата | 1-дата и часы | 2-дата и часы с минутами | 3-дата и часы с минутами и секундами\n */\nexport function genDate(timestamp: number | undefined, useFormat: boolean = true, time: 0 | 1 | 2 | 3 = 0): string {\n\tlet date;\n\tif (timestamp != undefined) {\n\t\tdate = new Date(timestamp);\n\t} else {\n\t\tdate = new Date();\n\t}\n\n\tconst Y = date.getFullYear();\n\tconst m = String(date.getMonth() + 1).padStart(2, '0');\n\tconst d = date.getDate().toString().padStart(2, '0');\n\n\tconst H = date.getHours().toString().padStart(2, '0');\n\tconst i = date.getMinutes().toString().padStart(2, '0');\n\tconst s = date.getSeconds().toString().padStart(2, '0');\n\n\tdate = Y + '-' + m + '-' + d;\n\n\tif (time) date += ' ';\n\tif (time >= 1) date += H;\n\tif (time >= 2) date += ':' + i;\n\tif (time >= 3) date += ':' + s;\n\n\tif (useFormat) {\n\t\tdate = dateFormat(date, time);\n\t}\n\n\treturn date;\n}\n\n/**\n * Генерация даты-строки (время московское) из миллисекунд (UTC), в формате Y-m-d H:i:s\n * @param ms - дата в мс, если не передана, берется дата на момент вызова функции\n * @param langFormat - если true, формат даты будет взят из Core.state.dateFormat\n */\nexport function genDateMoscow(ms: number | undefined, langFormat: boolean = true): string {\n\tconst time_zone = (new Date().getTimezoneOffset() / 60) * (-1);\n\tconst dateoffset = time_zone * 60 * 60 * 1000;\n\tconst moscow_dateoffset = 3 * 60 * 60 * 1000;\n\n\tlet date: Date;\n\tif (ms !== undefined) {\n\t\tdate = new Date(ms);\n\t} else {\n\t\tdate = new Date();\n\t}\n\n\tdate.setTime(date.getTime() - dateoffset + moscow_dateoffset);\n\n\tlet Y = String(date.getFullYear());\n\tlet d = String(date.getDate()).padStart(2, '0');\n\tlet m = String(date.getMonth() + 1).padStart(2, '0');\n\tlet H = String(date.getHours()).padStart(2, '0');\n\tlet i = String(date.getMinutes()).padStart(2, '0');\n\tlet s = String(date.getSeconds()).padStart(2, '0');\n\n\tlet dateStr = Y + '-' + m + '-' + d + ' ' + H + ':' + i + ':' + s;\n\tif (langFormat) {\n\t\tdateStr = dateFormat(dateStr);\n\t}\n\n\treturn dateStr;\n}\n\n/**\n * Перевод даты в формат пользователя\n * @param date - объект даты или строка в формате Y-m-d H:i:s\n * @param time - 0-только дата | 1-дата и часы | 2-дата и часы с минутами | 3-дата и часы с минутами и секундами\n * @param dateformat -\n * @param emptyValue - значение, которое надо вернуть, если дата не указана\n */\nexport function dateFormat(dateMixed: string | Date, time: 0 | 1 | 2 | 3 = 2, dateFormat?: string, emptyValue: string = Core.L.Not_date): string {\n\tif (typeof dateMixed === 'string') {\n\t\tif (!dateMixed || dateMixed.substring(0, 10) === '0000-00-00') {\n\t\t\tif (emptyValue && emptyValue !== '0000-00-00') {\n\t\t\t\treturn emptyValue;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!dateMixed) return emptyValue;\n\n\tif (!dateFormat) {\n\t\tdateFormat = Core.state.dateFormat.toLowerCase().toLowerCase().replace('m', 'mm').replace('y', 'yy').replace('d', 'dd');\n\t}\n\n\tlet date: Date;\n\tif (dateMixed instanceof Date) {\n\t\tdate = dateMixed;\n\t} else {\n\t\tlet dateForObj = dateMixed.substring(0, 10);\n\t\tif (dateForObj.length === 7) dateForObj += '-01';\n\t\tdateForObj += ' 00:00';\n\t\tdateForObj = dateForObj.replace(/-/g, '/'); // safari fix\n\n\t\tdate = new Date(dateForObj);\n\t\tif (isNaN(Number(date))) return emptyValue;\n\t}\n\n\tlet result = '';\n\n\tif (dateFormat && window['$']) {\n\t\tresult = $.datepicker.formatDate(dateFormat, date);\n\t}\n\n\tif (time && typeof dateMixed === 'string' && dateMixed.length > 10 || time && dateMixed instanceof Date) {\n\t\tlet timeStr: string = '';\n\t\tif (dateMixed instanceof Date) {\n\t\t\ttimeStr = new Date().toLocaleTimeString('en-US', {\n\t\t\t\thour12: false,\n\t\t\t\thour: 'numeric',\n\t\t\t\tminute: time >= 2 ? 'numeric' : undefined,\n\t\t\t\tsecond: time >= 3 ? 'numeric' : undefined,\n\t\t\t});\n\t\t} else {\n\t\t\tswitch (time) {\n\t\t\t\t// часы\n\t\t\t\tcase 1:\n\t\t\t\t\ttimeStr = dateMixed.substring(11, 13);\n\n\t\t\t\t\tbreak;\n\t\t\t\t// часы и минуты\n\t\t\t\tcase 2:\n\t\t\t\t\ttimeStr = dateMixed.substring(11, 16);\n\n\t\t\t\t\tbreak;\n\t\t\t\t// часы, минуты и секунды\n\t\t\t\tcase 3:\n\t\t\t\t\ttimeStr = dateMixed.substring(11, 19);\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tresult += ' ' + timeStr;\n\t}\n\n\tresult = result.trim();\n\n\treturn result;\n}\n\n/**\n * Перевод даты из формата пользователя в системный формат Y-m-d H:i:s\n * @param date - строка с датой\n * @param emptyValue - значение, которое надо вернуть, если дата не указана\n */\nexport function dateUnformat(date: string, emptyValue: string = Core.L.Not_date): string {\n\tif (!date) {\n\t\treturn emptyValue;\n\t}\n\n\tif (date.match(/\\d\\d\\d\\d-\\d\\d-\\d\\d/)) {\n\t\treturn date;\n\t}\n\n\tconst dateFormat = Core.state.dateFormat.toLowerCase();\n\n\tconst dateChunks = date.split(/\\W/);\n\tconst dateFormatChunks = dateFormat.split(/\\W/);\n\n\tlet d = '';\n\tlet m = '';\n\tlet y = '';\n\n\tdateFormatChunks.forEach((type, index) => {\n\t\tswitch (type) {\n\t\t\tcase 'd':\n\t\t\t\td = dateChunks[index];\n\n\t\t\t\tbreak;\n\t\t\tcase 'm':\n\t\t\t\tm = dateChunks[index];\n\n\t\t\t\tbreak;\n\t\t\tcase 'y':\n\t\t\t\ty = dateChunks[index];\n\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tlet result = y + '-' + m + '-' + d;\n\n\tif (!result.match(/\\d\\d\\d\\d-\\d\\d-\\d\\d/)) {\n\t\tconsole.info('Неверный формат даты, будет возращена текущая дата, ' + result);\n\n\t\tresult = genDate((new Date()).getTime(), false).substring(0, 10);\n\t}\n\n\treturn result;\n}\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\nimport type { Props } from './avatar';\nimport { dateFormat } from '@/core/utils/date';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 64,\n\ti18n: () => ({\n\t\tOnline: 'Online',\n\t\tLastSeen: 'Last seen',\n\t}),\n});\n\nconst titleStatus = computed(() => {\n\tif (props.isOnline) {\n\t\treturn props.i18n?.Online;\n\t}\n\n\tif (props.lastActiveTime) {\n\t\treturn props.i18n?.LastSeen + ': ' + dateFormat(props.lastActiveTime, 2);\n\t}\n});\n\nconst titleImage = computed(() => {\n\tif (!props.nickname) return titleStatus.value;\n\n\treturn props.nickname + (titleStatus.value ? `\\n${titleStatus.value}` : '');\n})\n</script>\n\n<template>\n\t<div class=\"top-avatar\">\n\t\t<img\n\t\t\tclass=\"top-avatar_image\"\n\t\t\t:src=\"image\"\n\t\t\t:title=\"titleImage\"\n\t\t\talt=\"\"\n\t\t>\n\n\t\t<div\n\t\t\tv-if=\"isOnline\"\n\t\t\tclass=\"top-avatar_status\"\n\t\t\t:title=\"titleStatus\"\n\t\t>\n\t\t</div>\n\t</div>\n</template>\n\n<style module>\n.top-avatar {\n\twidth: v-bind(size+ \"px\");\n\theight: v-bind(size+ \"px\");\n\tdisplay: flex;\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tposition: relative;\n\ttop: 0;\n\tleft: 0;\n}\n\n.top-avatar_image {\n\tborder-radius: 50%;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.top-avatar_status {\n\tborder-radius: 50%;\n\tborder: 2px solid var(--content-background-color);\n\tbackground-color: var(--color-bg-positive-2);\n\twidth: 25%;\n\theight: 25%;\n\tposition: absolute;\n\tright: 0;\n\tbottom: 0;\n}\n</style>","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Props } from './button';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tcolor: 'blue',\n\tstyling: '',\n\tsize: 's',\n});\n\nconst tagName = computed(() => props.href ? 'a' : 'button');\n\nconst type = computed(() => props.isSubmit ? 'submit' : undefined);\n</script>\n\n<template>\n\t<component\n\t\t:is=\"tagName\"\n\t\t:class=\"{\n\t\t\t['top-active']: isActive,\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t['top-button']: true,\n\t\t\t['top-button-progress']: isProgress,\n\t\t\t[`top-size_${size}`]: !!size,\n\t\t\t[`top-color_${color}`]: true,\n\t\t\t[`top-style_${styling}`]: !!styling,\n\t\t\t['top-button-withoutText']: !$slots.default,\n\t\t}\"\n\t\t:name=\"name\"\n\t\t:title=\"title\"\n\t\t:href=\"href\"\n\t\t:type=\"type\"\n\t\t:data-top-icon=\"icon || undefined\"\n\t\t:data-top-icon2=\"icon2 || undefined\"\n\t\t:disabled=\"disabled || undefined\"\n\t\t:inProgress=\"isProgress\"\n\t>\n\t\t<span\n\t\t\tv-if=\"$slots.default\"\n\t\t\tclass=\"top-ellipsis\"\n\t\t>\n\t\t\t<!-- @slot Текст в кнопке -->\n\t\t\t<slot>\n\t\t\t\t{{ !icon ? 'Button' : '' }}\n\t\t\t</slot>\n\t\t</span>\n\n\t\t<!-- @slot HTML в кнопке -->\n\t\t<slot name=\"html\"></slot>\n\t</component>\n</template>\n\n<style module>\n@import \"./style/button.css\";\n@import \"./style/style-outline.css\";\n@import \"./style/style-soft.css\";\n@import \"./style/style-transparent.css\";\n\n.top-button {\n\t--top-button-color: var(--color-white);\n\t--top-button-background-color: transparent;\n\t--top-button-background-color-hover: var(--top-button-background-color);\n\t--top-button-background-color-active: var(--top-button-background-color-hover);\n\t--top-button-background-color-selected: var(--top-button-background-color-hover);\n\t--top-button-box-shadow: none;\n\t--top-button-box-shadow-hover: var(--top-shadow-darken-2);\n\t--top-button-box-shadow-active: var(--top-shadow-darken-3);\n\t--top-button-box-shadow-selected: var(--top-shadow-darken-3);\n\t--top-forms-border-width: 0px;\n\t--top-icon-width: calc(var(--top-icon-size) + var(--top-forms-padding));\n\t--top-icon2-width: calc(var(--top-icon2-size) + var(--top-forms-padding));\n}\n\n.top-button.top-size_l {\n\t--top-forms-padding: var(--top-forms-padding_l);\n\t--top-forms-base-height: var(--top-forms-base-height_l);\n}\n\n.top-button.top-size_xl {\n\t--top-forms-padding: var(--top-forms-padding_xl);\n\t--top-forms-base-height: var(--top-forms-base-height_xl);\n}\n</style>","<script setup lang=\"ts\">\nimport type { Props } from './checkbox';\nimport ControlLabel from '../controlLabel/controlLabel.vue';\n\ndefineProps<Props>();\n\nconst model = defineModel<Props['modelValue']>();\n</script>\n\n<template>\n\t<label\n\t\t:class=\"{\n\t\t\t['top-forms-optionWrapper']: true,\n\t\t\t['top-checkbox']: true,\n\t\t\t['top-checkbox_' + name]: !!name,\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-error']: isError && !disabled,\n\t\t}\"\n\t>\n\t\t<input\n\t\t\ttype=\"checkbox\"\n\t\t\t:class=\"{\n\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t['top-forms-option']: true,\n\t\t\t\t['top-checkbox_input']: true,\n\t\t\t\t['top-error']: isError && !disabled,\n\t\t\t}\"\n\t\t\t:name=\"name\"\n\t\t\tv-model=\"model\"\n\t\t\t:value=\"value\"\n\t\t\t:indeterminate=\"indeterminate\"\n\t\t\t:disabled=\"disabled\"\n\t\t>\n\n\t\t<ControlLabel\n\t\t\tv-if=\"$slots.default\"\n\t\t\t:description=\"description\"\n\t\t\t:disabled=\"disabled\"\n\t\t>\n\t\t\t<!-- @slot Слот с заголовком -->\n\t\t\t<slot></slot>\n\t\t</ControlLabel>\n\t</label>\n</template>\n\n<style module>\n.top-checkbox {\n\tcursor: pointer;\n\tdisplay: inline-flex;\n}\n\n.top-checkbox_input {\n\tcursor: inherit;\n\tborder-radius: 4px;\n\tbackground: var(--content-background-color);\n\tborder: 1px solid var(--top-forms-border-color);\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\n}\n\n.top-checkbox_input:before {\n\tcontent: \" \";\n\tcolor: #FFF;\n\tfont-family: \"Topvisor-2\";\n\tfont-size: 16px;\n}\n\n.top-checkbox_input:hover {\n\tborder-color: var(--top-forms-border-color-hover);\n\tbackground: var(--color-theme-100);\n}\n\n/* checked / indeterminate */\n.top-checkbox_input:checked,\n.top-checkbox_input:indeterminate {\n\tborder-color: var(--color-bg-primary-2);\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkbox_input:checked:before {\n\tcontent: \"\";\n}\n\n.top-checkbox_input:indeterminate:before {\n\tcontent: \"\";\n}\n\n.top-checkbox_input:checked:hover,\n.top-checkbox_input:indeterminate:hover {\n\tborder-color: var(--color-bg-primary-1);\n\tbackground: var(--color-bg-primary-1);\n}\n\n/* disabled selected */\n.top-checkbox_input:disabled {\n\tborder-color: var(--color-line-1);\n\tbackground: var(--color-theme-100);\n}\n\n.top-checkbox_input:checked:disabled,\n.top-checkbox_input:indeterminate:disabled {\n\tborder-color: transparent;\n\tbackground: var(--color-theme-400);\n}\n\n/* isError */\n.top-checkbox_input.top-error {\n\tborder-color: var(--color-bg-negative-2);\n}\n\n.top-checkbox_input.top-error:hover {\n\tborder-color: var(--color-bg-negative-1);\n}\n\n/* isError selected */\n.top-checkbox_input:checked.top-error,\n.top-checkbox_input:indeterminate.top-error {\n\tbackground: var(--color-bg-negative-2);\n}\n\n.top-checkbox_input:checked.top-error:hover,\n.top-checkbox_input:indeterminate.top-error:hover {\n\tbackground: var(--color-bg-negative-1);\n}\n</style> ","<script lang=\"ts\">\nconst useNativeDatepicker = !!document.documentElement.ontouchstart && !!document.createElement('input').showPicker;\n\nlet onInputLazy = (_e: any) => { };\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onUnmounted } from 'vue';\nimport { dateFormat, dateUnformat } from '@/core/utils/date';\nimport type { Props, Emits } from './inputDate';\nimport { Input } from '@/components/forms/forms';\nimport Core from '@/core/core/core';\n\nconst props = withDefaults(defineProps<Props>(), {\n\ticon2: '',\n});\n\nconst emit = defineEmits<Emits>();\n\nonUnmounted(() => {\n\tif ($el) {\n\t\t$el.datepicker('destroy');\n\t}\n});\n\nconst el = ref();\nlet $el: any;\n\nconst localValue = computed({\n\tget() {\n\t\treturn dateFormat(props.modelValue, 2, undefined, '0000-00-00');\n\t},\n\n\tset(value) {\n\t\tvalue = dateUnformat(value, '0000-00-00');\n\n\t\temit('update:modelValue', value);\n\t},\n});\n\nlet oninput = (e: any) => {\n\tonInputLazy(e);\n};\n\nlet onchange = (e: any) => {\n\tconst date = dateUnformat(e.target.value);\n\tconst dateFormatted = dateFormat(date);\n\n\tif (!dateFormatted || dateFormatted === Core.L.Not_date || e.target.value !== dateFormatted) {\n\t\te.target.value = localValue.value;\n\n\t\treturn;\n\t}\n\n\tlocalValue.value = e.target.value;\n};\n\n/**\n * Инициализпация функций выбора дат\n *\n * Для не нативного datepicker\n */\nasync function init(e: any) {\n\tconst datepicker = await import('./datepicker');\n\n\t// формат ввода\n\tonInputLazy = datepicker.oninput;\n\n\t// datepicker\n\t$el = datepicker.connectDatepicker(e.target, {\n\t\tonSelect: () => onchange(e),\n\t});\n\n\tif ($el) {\n\t\t$el.datepicker('show');\n\t}\n}\n</script>\n\n<template>\n\t<Input\n\t\tv-if=\"useNativeDatepicker\"\n\t\t:=\"$props\"\n\t\t:modelValue=\"localValue\"\n\t\treadonly\n\t\t@click=\"el.showPicker()\"\n\t>\n\t\t<input\n\t\t\tref=\"el\"\n\t\t\ttype=\"date\"\n\t\t\tclass=\"top-input_input-date\"\n\t\t\t:modelValue=\"modelValue\"\n\t\t\t@change=\"(e: any) => localValue = e.target.value\"\n\t\t\ttabindex=\"-1\"\n\t\t/>\n\t</Input>\n\n\t<Input\n\t\tv-else\n\t\t:=\"$props\"\n\t\t:modelValue=\"localValue\"\n\t\t@update:modelValue=\"(newValue) => (newValue === '') ? localValue = '' : ''\"\n\t\t@input.date=\"oninput\"\n\t\t@focus.once.date=\"init\"\n\t\t@change.date=\"onchange\"\n\t\tmodificator=\"datepicker\"\n\t/>\n</template>\n\n<style module>\n.top-input-datepicker {\n\twidth: calc(105px + var(--top-icon-width) + var(--top-icon2-width));\n}\n\n.top-input_input-date {\n\topacity: 0;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: -1;\n}\n\n.top-input_input-date::-webkit-inner-spin-button {\n\tdisplay: none;\n}\n\n.top-input_input-date::-webkit-calendar-picker-indicator {\n\topacity: 0;\n}\n</style>","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Props, Emits } from './radio';\nimport ControlLabel from '../controlLabel/controlLabel.vue';\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst localValue = computed({\n\tget() {\n\t\treturn props.modelValue;\n\t},\n\tset(value) {\n\t\temit('update:modelValue', value);\n\t},\n});\n\n</script>\n\n<template>\n\t<label\n\t\t:class=\"{\n\t\t\t['top-forms-optionWrapper']: true,\n\t\t\t['top-radio']: true,\n\t\t\t['top-radio_' + name]: name !== '',\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-error']: isError && !disabled,\n\t\t}\"\n\t>\n\t\t<input\n\t\t\ttype=\"radio\"\n\t\t\t:class=\"{\n\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t['top-forms-option']: true,\n\t\t\t\t['top-radio_input']: true,\n\t\t\t\t['top-error']: isError && !disabled,\n\t\t\t}\"\n\t\t\tv-model=\"localValue\"\n\t\t\t:name=\"name\"\n\t\t\t:value=\"value\"\n\t\t\t:disabled=\"disabled\"\n\t\t>\n\n\t\t<ControlLabel\n\t\t\tv-if=\"$slots.default\"\n\t\t\t:description=\"description\"\n\t\t\t:disabled=\"disabled\"\n\t\t>\n\t\t\t<!-- @slot Слот с заголовком -->\n\t\t\t<slot></slot>\n\t\t</ControlLabel>\n\t</label>\n</template>\n\n<style module>\n:root {\n\t--top-radio-background-color: var(--content-background-color);\n\t--top-radio-background-color-hover: var(--top-radio-background-color);\n\t--top-radio-background-color-active: var(--top-radio-background-color);\n}\n\n.top-radio {\n\tcursor: pointer;\n}\n\n.top-radio_input {\n\tborder-radius: 50%;\n\tbackground: var(--content-background-color);\n\tborder: 1px solid var(--color-line-3);\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\n}\n\n.top-radio_input:hover {\n\tborder-color: var(--color-line-3);\n\tbackground: var(--color-layer-secondary-1);\n}\n\n.top-radio_input:checked {\n\tborder-color: var(--color-line-primary-1);\n\tborder-width: 5px;\n}\n\n.top-radio_input:checked:hover {\n\tborder-color: var(--color-line-primary-2);\n}\n\n/* disabled */\n.top-radio_input:disabled {\n\tborder-color: var(--color-line-1-opacity);\n\tbackground: var(--color-theme-100);\n}\n\n/* disabled selected */\n.top-radio_input:checked:disabled {\n\tborder-color: var(--color-theme-400);\n}\n\n/* isError */\n.top-radio_input.top-error {\n\tborder-color: var(--color-line-negative-1);\n}\n\n.top-radio_input.top-error:hover {\n\tborder-color: var(--color-line-negative-2);\n}\n</style>","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Props, Emits } from './switcher';\nimport ControlLabel from '../controlLabel/controlLabel.vue';\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst localValue = computed({\n\tget() {\n\t\treturn props.modelValue;\n\t},\n\tset(value) {\n\t\temit('update:modelValue', value);\n\t},\n});\n</script>\n\n<template>\n\t<label\n\t\t:class=\"{\n\t\t['top-forms-optionWrapper']: true,\n\t\t['top-checkboxSwitcher']: true,\n\t\t['top-disabled']: disabled,\n\t\t['top-error']: isError && !disabled,\n\t}\"\n\t>\n\t\t<input\n\t\t\ttype=\"checkbox\"\n\t\t\t:class=\"{\n\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t['top-forms-option']: true,\n\t\t\t\t['top-checkboxSwitcher_input']: true,\n\t\t\t\t['top-error']: isError && !disabled,\n\t\t\t}\"\n\t\t\tv-model=\"localValue\"\n\t\t\t:name=\"name\"\n\t\t\t:value=\"value\" \n\t\t\t:disabled=\"disabled\"\n\t\t>\n\n\t\t<ControlLabel\n\t\t\tv-if=\"$slots.default\"\n\t\t\t:description=\"description\"\n\t\t\t:disabled=\"disabled\"\n\t\t>\n\t\t\t<!-- @slot Слот с заголовком -->\n\t\t\t<slot></slot>\n\t\t</ControlLabel>\n\t</label>\n</template>\n\n<style module>\n.top-checkboxSwitcher {\n\tcursor: pointer;\n\tdisplay: inline-flex;\n\tgap: 4px;\n}\n\n.top-checkboxSwitcher_input {\n\tborder-radius: 9px;\n\tborder: none;\n\tbackground: var(--color-layer-secondary-2);\n\twidth: 36px;\n\theight: 18px;\n\tposition: relative;\n}\n\n.top-checkboxSwitcher_input:before {\n\tcontent: '';\n\tborder-radius: 50%;\n\tbackground: var(--color-white);\n\twidth: 12px;\n\theight: 12px;\n\tmargin: 3px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\n\ttransition: left 0.1s;\n}\n\n.top-checkboxSwitcher_input:hover {\n\tbackground: var(--color-layer-secondary-4);\n}\n\n/* checked */\n.top-checkboxSwitcher_input:checked {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxSwitcher_input:checked:hover {\n\tbackground: var(--color-bg-primary-1);\n}\n\n.top-checkboxSwitcher_input:checked:before {\n\tleft: 50%;\n}\n\n/* disabled */\n.top-checkboxSwitcher_input:disabled {\n\tbackground: var(--color-theme-400);\n}\n\n/* isError */\n.top-checkboxSwitcher_input.top-error {\n\tbackground: var(--color-layer-negative-3);\n}\n\n.top-checkboxSwitcher_input.top-error:hover {\n\tbackground: var(--color-layer-negative-4);\n}\n\n.top-checkboxSwitcher_input.top-error:checked {\n\tbackground: var(--color-bg-negative-2);\n}\n\n.top-checkboxSwitcher_input.top-error:checked:hover {\n\tbackground: var(--color-bg-negative-1);\n}\n\n</style>","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport Hint from '@/components/forms/hint/hint.vue';\nimport type { Props, Emits } from './textarea';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\trows: 5,\n\tminHeight: 120,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst value = computed({\n\tget () {\n\t\treturn props.modelValue;\n\t},\n\tset (value) {\n\t\temit('update:modelValue', value);\n\t},\n});\n</script>\n\n<template>\n\t<label\n\t\t:class=\"{\n\t\t\t['top-textarea']: true,\n\t\t\t['top-textarea-' + name]: name,\n\t\t\t['top-disabled']: disabled,\n\t\t}\"\n\t>\n\t\t<textarea\n\t\t\ttype=\"text\"\n\t\t\t:class=\"{\n\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t['top-textarea_textarea']: true,\n\t\t\t\t['top-textarea_textarea-expandable']: expandable,\n\t\t\t\t['top-error']: isError,\n\t\t\t}\"\n\t\t\tautocomplete=\"off_always\"\n\t\t\t:name=\"name\"\n\t\t\t:placeholder=\"placeholder\"\n\t\t\t:disabled=\"disabled\"\n\t\t\t:readonly=\"readonly\"\n\t\t\t:rows=\"!expandable ? rows : undefined\"\n\t\t\t:=\"$attrs\"\n\t\t\tv-model=\"value\"\n\t\t/>\n\n\t\t<div\n\t\t\tv-if=\"expandable\"\n\t\t\tclass=\"top-textarea_pseudoContent\"\n\t\t>\n\t\t\t{{ value + ' ' }}\n\t\t</div>\n\n\t\t<Hint\n\t\t\tv-if=\"hint\"\n\t\t\tclass=\"top-textarea_hint\"\n\t\t\t:hint=\"hint\"\n\t\t\tv-top-tooltip\n\t\t/>\n\t</label>\n</template>\n\n<style module>\n.top-textarea {\n\twidth: 180px;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tposition: relative;\n}\n\n.top-textarea_textarea {\n\tcolor: var(--color-text-1);\n\tbackground: var(--top-forms-background-color);\n\twidth: 100%;\n\tpadding: var(--top-forms-padding);\n\tresize: none;\n}\n\n.top-textarea_textarea:hover {\n\tbackground: var(--top-forms-background-color-hover);\n}\n\n.top-textarea_textarea:focus {\n\tborder-color: var(--color-line-primary-1);\n\toutline: none;\n}\n\n.top-textarea_textarea.top-textarea_textarea-expandable {\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n\n.top-textarea_pseudoContent {\n\tbox-sizing: border-box;\n\tmin-height: v-bind(minHeight + 'px');\n\tpadding: var(--top-forms-padding);\n\tfont-size: 14px;\n\twhite-space: pre-wrap;\n\toverflow-wrap: anywhere;\n\tpointer-events: none;\n\topacity: 0;\n\tz-index: -1;\n}\n\n.top-textarea_hint {\n\tposition: absolute;\n\ttop: 2px;\n\tright: 2px;\n}\n</style>","<script setup lang=\"ts\">\nimport { computed, watch } from 'vue';\nimport type { ComputedRef } from 'vue';\nimport type { Props, Emits, Option, LocalOptions } from './select';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst emit = defineEmits<Emits>();\n\n/**\n * Словарь с учетом вложенных Props['options']\n *\n * Этот словарь должен использовать в логике компонента, чтобы она не зависила от типа входных данных\n */\nconst optionByValue: ComputedRef<LocalOptions> = computed(() => {\n\t/**\n\t * Преобразование:\n\t * - Array => Map\n\t * - string => Option\n\t */\n\tconst res = new Map();\n\n\tprops.options.forEach((option, index) => {\n\t\t// базовый Options со строками\n\t\tif (typeof option === 'string') option = genOption(index, option);\n\n\t\tif (option.children) {\n\t\t\t// вложенные элементы Option для <optgroup>\n\t\t\tconst children = new Map();\n\n\t\t\toption.children.forEach((subOption, subIndex) => {\n\t\t\t\t// базовый Options со строками\n\t\t\t\tif (typeof subOption === 'string') subOption = genOption(subIndex, subOption);\n\n\t\t\t\tchildren.set(subOption.value, subOption);\n\t\t\t});\n\n\t\t\toption = { ...option };\n\t\t\toption.children = children;\n\n\t\t\tres.set(option.value, option);\n\t\t} else {\n\t\t\t// самостоятельный элемент Option\n\t\t\tres.set(option.value, option);\n\t\t}\n\t});\n\n\treturn res;\n});\n\n/**\n * Словарь со всеми не disabled значениями Props['options'] в порядке следования с учетом вложенных Props['options']\n */\nconst flatOptionByValue: ComputedRef<Map<Props['modelValue'], Option>> = computed(() => {\n\tconst res = new Map();\n\n\toptionByValue.value.forEach(option => {\n\t\tif (option.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// вложенные элементы Option для <optgroup>\n\t\tif (option.children) {\n\t\t\toption.children.forEach(subOption => {\n\t\t\t\tif (subOption.disabled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tres.set(subOption.value, subOption);\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tres.set(option.value, option);\n\t});\n\n\treturn res;\n});\n\n/**\n * Генерация Объекта option из строки\n *\n * Для базового способа указания props\n */\nconst genOption = (value: Props['modelValue'], title: string): Option => {\n\treturn {\n\t\tvalue,\n\t\ttitle,\n\t};\n};\n\n/**\n * Логика для обртаной своместимости:\n * - null - заменить на первое доступное значение\n * - undefined - заменить на первое доступное значение\n */\nwatch([\n\t() => props.modelValue,\n\tflatOptionByValue,\n], () => {\n\tif ((model.value === null || model.value === undefined) && flatOptionByValue.value.size) {\n\t\tconsole.warn('Пожалуйста, не передавайте в компонент Select значения null и undefined');\n\n\t\tmodel.value = flatOptionByValue.value.keys().next().value;\n\t}\n}, { immediate: true });\n\n/**\n * Иконка выбранного option\n */\nconst optionIcon = computed(() => {\n\treturn flatOptionByValue.value.get(model.value)?.icon;\n});\n\n/**\n * Выбрать следующее доступное значение\n */\nconst selectNextValue = () => {\n\tconst listEnabledValues = [...flatOptionByValue.value.keys()];\n\tconst currentIndex = listEnabledValues.indexOf(model.value);\n\tconst nextIndex = (currentIndex + 1) % listEnabledValues.length;\n\n\tmodel.value = listEnabledValues[nextIndex];\n};\n</script>\n\n<template>\n\t<label\n\t\t:class=\"{\n\t\t\t['top-select']:true,\n\t\t\t['top-select-' + name]:name,\n\t\t\t['top-size_' + size]: true,\n\t\t\t['top-formsCaptionWrapper']: !!title,\n\t\t\t['top-select-error']: isError,\n\t\t\t['top-disabled']: disabled,\n\t\t}\"\n\t\t:data-value=\"model\"\n\t\t:data-top-icon=\"icon\"\n\t\t:data-top-icon2=\"optionIcon\"\n\t>\n\t\t<select\n\t\t\t:class=\"{\n\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t['top-select_select']: true,\n\t\t\t\t['top-select_arrow']: true,\n\t\t\t\t['top-error']: isError,\n\t\t\t}\"\n\t\t\t:name=\"name\"\n\t\t\t:disabled=\"disabled\"\n\t\t\tv-model=\"model\"\n\t\t>\n\t\t\t<template v-for=\"[value, option] of optionByValue\">\n\t\t\t\t<optgroup\n\t\t\t\t\tv-if=\"option.children\"\n\t\t\t\t\t:key=\"'group_' + value\"\n\t\t\t\t\t:label=\"option.title\"\n\t\t\t\t\t:disabled=\"option.disabled\"\n\t\t\t\t>\n\t\t\t\t\t<option\n\t\t\t\t\t\tv-for=\"[subValue, subOption] of option.children\"\n\t\t\t\t\t\t:key=\"subValue\"\n\t\t\t\t\t\t:value=\"subValue\"\n\t\t\t\t\t\t:selected=\"subValue === model\"\n\t\t\t\t\t\t:disabled=\"subOption.disabled\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ subOption.title }}\n\t\t\t\t\t</option>\n\t\t\t\t</optgroup>\n\n\t\t\t\t<option\n\t\t\t\t\tv-else\n\t\t\t\t\t:key=\"value ?? undefined\"\n\t\t\t\t\t:value=\"value\"\n\t\t\t\t\t:selected=\"value === model\"\n\t\t\t\t\t:disabled=\"option.disabled\"\n\t\t\t\t>\n\t\t\t\t\t{{ option.title }}\n\t\t\t\t</option>\n\t\t\t</template>\n\t\t</select>\n\n\t\t<span\n\t\t\tv-if=\"addChanger && flatOptionByValue.size && !disabled\"\n\t\t\tclass=\"top-changer\"\n\t\t\t@click=\"selectNextValue\"\n\t\t></span>\n\n\t\t<span\n\t\t\tv-if=\"title\"\n\t\t\tclass=\"top-formsCaption\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</span>\n\t</label>\n</template>\n\n<style module>\n.top-select {\n\tcolor: var(--color-text-1);\n\t--top-icon-color: var(--color-icon-2);\n\t--top-icon2-color: var(--color-icon-2);\n\n\talign-items: center;\n\twidth: 180px;\n\tmax-width: 100%;\n\tdisplay: inline-flex;\n}\n\n.top-select-error {\n\t--top-icon-color: var(--color-icon-negative-1);\n\t--top-icon2-color: var(--color-icon-negative-1);\n}\n\n.top-select_select {\n\tbackground-color: var(--top-forms-background-color);\n\t/* для select вместо padding нужно использовать text-indent */\n\tpadding-left: var(--top-forms-padding);\n\n\t/* если есть значки, добавить отступ на их ширину с учетом уже добавленного padding */\n\ttext-indent: calc(clamp(0px, calc(var(--top-icon-both-width) - var(--top-forms-padding)), calc(var(--top-icon-both-width) - var(--top-forms-padding))));\n\n\twidth: 100%;\n\theight: var(--top-forms-base-height);\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tflex-grow: 1;\n\toverflow: hidden;\n}\n\n.top-select_select:disabled {\n\tcolor: var(--color-text-3);\n}\n\n.top-select optgroup {\n\tcolor: var(--color-text-1);\n\tfont-style: normal;\n}\n\n.top-select option:not(:disabled) {\n\tbackground: var(--content-background-color);\n\tcolor: var(--color-text-1);\n}\n\n.top-select option:disabled {\n\tbackground: unset;\n\tcolor: unset;\n}\n\n/* хром не мерняет цвет для optgroup option, стили оставлены по умолчанию */\n/*\n.top-select optgroup:disabled,\n.top-select optgroup option,\n.top-select option:disabled {\n\n}\n*/\n\n/* https://bugzilla.mozilla.org/show_bug.cgi?id=1743066 */\n@-moz-document url-prefix() {\n\t.top-select_select {\n\t\ttext-indent: calc(clamp(0px, calc(var(--top-icon-both-width) - var(--top-forms-padding)), calc(var(--top-icon-both-width) - var(--top-forms-padding))) / 2);\n\t}\n}\n\n@media only screen and (min-width: 900px) {\n\t/* changer */\n\t.top-changer {\n\t\tcursor: pointer;\n\t\tborder-radius: 100%;\n\t\twidth: 0;\n\t\ttransform: translateX(-44px);\n\t\tcolor: var(--color-text-2);\n\t\tfont-size: 16px;\n\t\tline-height: 1;\n\t\tdisplay: none;\n\t\tz-index: 2;\n\t\torder: 4;\n\t}\n\n\t.top-changer:hover {\n\t\tcolor: var(--color-primary);\n\t}\n\n\t.top-changer:after {\n\t\tcontent: \"\";\n\t\tbackground-color: var(--top-forms-background-color);\n\t\tfont-family: \"Topvisor-2\";\n\t}\n\n\t*:hover > .top-changer {\n\t\tdisplay: block;\n\t}\n}\n</style>","<template>\n\t<div class=\"top-loadbar\"></div>\n</template>\n\n<style module>\n:root {\n\t--top-loadbar-duration: 10s;\n\t--top-loadbar-color: var(--color-line-primary-2);\n}\n \n.top-loadbar {\n\tbackground: var(--top-loadbar-color);\n\twidth: 0;\n\theight: 4px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\n\tanimation: top-loadbar var(--top-loadbar-duration) forwards;\n}\n\n@keyframes top-loadbar {\n\tfrom {\n\t\t/* fix render pixels */\n\t\twidth: 4px;\n\t}\n\t4% {\n\t\twidth: calc(4%);\n\t}\n\t5% {\n\t\twidth: 5%;\n\t}\n\tto {\n\t\twidth: 95%;\n\t}\n}\n</style>","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Props, Emits } from './input';\nimport { Loadbar } from '@/components/forms/forms';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n\tcaptionType: '',\n});\n\nconst emit = defineEmits<Emits>();\n\nconst localValue = computed({\n\tget() {\n\t\treturn props.modelValue;\n\t},\n\tset(value) {\n\t\temit('update:modelValue', value);\n\t},\n});\n\nconst placeholder = computed(() => {\n\tif (props.addCleaner && !props.title) {\n\t\treturn '';\n\t}\n\tif (props.captionType !== '') {\n\t\treturn '';\n\t}\n\n\treturn props.title;\n});\n\nconst clean = (event: Event) => {\n\tif(props.modelValue){\n\t\tevent.stopPropagation();\n\t}\n\n\temit('update:modelValue', '');\n};\n</script>\n\n<template>\n\t<label\n\t\t:class=\"{\n\t\t\t['top-input']: true,\n\t\t\t['top-size_' + size]: true,\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-input-' + modificator]: !!modificator,\n\t\t\t['top-input-withCleaner']: addCleaner && localValue && localValue !== '0000-00-00',\n\t\t\t['top-formsCaptionWrapper']: captionType !== '',\n\t\t\t['top-formsCaptionWrapper-always']: captionType === 'top',\n\t\t}\"\n\t\t:data-top-icon=\"icon\"\n\t\t:data-top-icon2=\"icon2\"\n\t>\n\t\t<Loadbar v-if=\"isLoading\"/>\n\n\t\t<input\n\t\t\ttype=\"text\"\n\t\t\t:class=\"{\n\t\t\t\t['top-input_input']: true,\n\t\t\t\t['top-input_input-' + modificator]: !!modificator,\n\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t['top-error']: isError,\n\t\t\t}\"\n\t\t\tautocomplete=\"off_always\"\n\t\t\t:name=\"name\"\n\t\t\tv-model=\"localValue\"\n\t\t\t:title=\"title\"\n\t\t\t:placeholder=\"placeholder\"\n\t\t\t:disabled=\"disabled\"\n\t\t\t:readonly=\"readonly\"\n\t\t\t@keydown.esc=\"(event) => (addCleaner || !!$slots.btn) && clean(event)\"\n\t\t\t:=\"$attrs\"\n\t\t>\n\n\t\t<span\n\t\t\tv-if=\"addCleaner && localValue && localValue !== '0000-00-00'\"\n\t\t\tclass=\"top-input_cleaner\"\n\t\t\tdata-top-icon=\"\"\n\t\t\t@click.prevent=\"clean\"\n\t\t></span>\n\n\t\t<span\n\t\t\tv-if=\"captionType !== ''\"\n\t\t\tclass=\"top-formsCaption\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</span>\n\n\t\t<!-- @slot Слот для вставки произвольного кода в label -->\n\t\t<slot></slot>\n\t</label>\n</template>\n\n<style module>\n.top-input {\n\t--top-forms_clear-width: 0px;\n\n\tborder-radius: var(--top-forms-radius);\n\twidth: 180px;\n\tposition: relative;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n.top-input_input {\n\tcolor: var(--color-text-2);\n\tbackground: var(--top-forms-background-color);\n\theight: var(--top-forms-base-height);\n\tpadding: 0;\n\tpadding-right: calc(max(var(--top-forms-padding), calc(var(--top-icon2-width) + var(--top-forms_clear-width))));\n\tpadding-left: calc(max(var(--top-forms-padding), var(--top-icon-width)));\n}\n\n.top-input_input:hover {\n\tbackground: var(--top-forms-background-color-hover);\n}\n\n.top-input_input:focus {\n\tcolor: var(--color-text-1);\n\tborder-color: var(--color-line-primary-1);\n\toutline: none;\n}\n\n/* значки */\n.top-input[data-top-icon]:before,\n.top-input[data-top-icon2]:after {\n\t--top-icon-color: var(--color-icon-2);\n\t--top-icon2-color: var(--color-icon-2);\n\n\tposition: absolute;\n\tz-index: 3;\n\tfont-size: 20px;\n}\n\n.top-input[data-top-icon]:before {\n\tleft: 0;\n}\n\n.top-input[data-top-icon2]:after {\n\tright: 0;\n}\n\n/* cleaner */\n.top-input-withCleaner {\n\t--top-forms_clear-width: 24px;\n}\n\n.top-input_cleaner {\n\t--top-icon-size: 16px;\n\t--top-icon-width: 20px;\n\t--top-icon-color: var(--color-icon-3);\n\n\tcursor: pointer;\n\tborder-radius: 50%;\n\twidth: 20px;\n\theight: 16px;\n\tposition: absolute;\n\tright: calc(var(--top-forms-border-width) + max(var(--top-icon2-width), var(--top-forms-padding) / 2));\n\tz-index: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.top-input_cleaner:hover {\n\t--top-icon-color: var(--color-icon-2);\n}\n\n/* TODO: перенести в inputsRange */\n.top-input_input {\n\twidth: 50%;\n\tflex-grow: 1;\n}\n\n/* top-loadbar */\n.top-input .top-loadbar{\n\tborder-radius: var(--top-forms-radius) 0 0 0;\n}\n</style>"],"names":["isRetina","isMobile","isApp","isMacOS","isSafari","isChrome","isSafari2","getCommandKeyLabel","getScrollTop","get$scroll","getElsScroll","getOS","os","res","i","getOSAsync","platformVersion","_a","Page","onResizeDelay","onResizeTimer","onResizeListeners","windowSize","addOnReize","listener","removeOnResize","onResize","callback","Events","options","state","$$1","el","_b","Core","tvTooltipGenOptions","binding","vnode","tooltip","_prevVnode","instance","_binding","_vnode","focus","appStickyObserver","sticky","className","entries","condition","_el","appSwimUpInited","appSwimUpObserver","directiveSwipUpOptions","appSwimUpEls","swimUpElTransform","windowHeight","distance","percent","elTop","triggerHeightReducer","triggerHeight","swimUpInit","el2","entry","swimUp","args","genWindow","_window","reactive","style","type","media","elStyle","app","options2","device","maxInt","base","tMin","tMax","skew","damp","initialBias","initialN","delimiter","regexPunycode","regexNonASCII","regexSeparators","errors","baseMinusTMin","floor","stringFromCharCode","error","map","array","result","length","mapDomain","domain","parts","labels","encoded","ucs2decode","string","output","counter","value","extra","ucs2encode","codePoints","basicToDigit","codePoint","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","k","decode$1","input","inputLength","bias","basic","j","index","oldi","w","t","baseMinusT","out","encode$1","n","currentValue","basicLength","handledCPCount","m","handledCPCountPlusOne","q","qMinusT","toUnicode","toASCII","punycode","fromPuny","url","host","getHost","hostNormal","toPuny","normalize","hostToLowerCase","encode","utf8Encode","decode","utf8Decode","utftext","c","c2","c3","domainEn","domainRu","punyDomainRu","getPunyDomainRU","getDomainRegexp","regexp_en","regexp_ru","isEmail","email","rus_allow","emailTest","validUrl","isDomain","isIp","ip","user","genIntHash","hash","char","isUrl","addCommasWhite","nStr","x","x1","x2","rgx","nl2br","str","numberWithWord","number","precision","dimension","suffix","numberStr","ellipsis","max_length","pos","string1","string2","numberEnding","num","ending0","ending1","ending2","num100","num10","toRoditPadej","str_array","str2","rusToLatin","ru","newStr","match","htmlspecialchars","highlightHtml","text","fieldFilter","regExp","regExpString","camelToSnakeCase","token","genFlagLinkByCountryCode","countryCode","addLinkTags","domainRegexp","afterDomainRegexp","regexpMailto","regexpLink","toCapitalize","getRandomHash","l","L","getDayOfWeek","y","d","dateToString","dateObject","langFormat","timeFormat","Y","H","s","date","dateFormat","stringToDate","genDate","timestamp","useFormat","time","genDateMoscow","ms","dateoffset","moscow_dateoffset","dateStr","dateMixed","dateFormat2","emptyValue","dateForObj","timeStr","dateUnformat","dateChunks","dateFormatChunks","props","__props","titleStatus","computed","titleImage","tagName","model","useModel","useNativeDatepicker","onInputLazy","_e","emit","__emit","onUnmounted","$el","ref","localValue","oninput","e","onchange","dateFormatted","init","datepicker","value2","optionByValue","option","genOption","children","subOption","subIndex","flatOptionByValue","title","watch","optionIcon","selectNextValue","listEnabledValues","nextIndex","_sfc_render","_ctx","_cache","placeholder","clean","event"],"mappings":"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","x_google_ignoreList":[11]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"listItem.vue_vue_type_script_setup_true_lang-BliXIrA8.es.js","sources":["../../src/components/popup/popup/opener.vue","../../src/components/popup/popup/popup.vue","../../src/components/popup/popup/listItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onUpdated, ref } from 'vue';\nimport type { OpenerProps } from './popup';\n\nconst props = withDefaults(defineProps<OpenerProps>(), {\n\tpos: '3',\n\tnotch: true,\n\tposBy: 'fixed',\n});\n\nconst id = props.id || Math.random() + '';\n\nlet elOpener: Element;\n\n/**\n * Необычная функция для проброски props внтурь элемента слота\n *\n * @param el - вспомогательрный элемент для доступа к элементам слота\n */\nfunction render(el: any) {\n\tsetTimeout(() => {\n\t\telOpener = el.nextElementSibling;\n\n\t\tif (elOpener) {\n\t\t\trenderOpener(elOpener);\n\t\t}\n\t});\n}\n\nonUpdated(() => {\n\tif (elOpener) {\n\t\trenderOpener(elOpener);\n\t}\n});\n\nfunction renderOpener (elOpener: any) {\n\telOpener.dataset.topPopup = 'vue-' + id;\n\telOpener.dataset.topPopupId = id;\n\telOpener.dataset.topPopupP = props.pos;\n\telOpener.dataset.topPopupPosBy = props.posBy;\n\telOpener.dataset.topPopupNotch = props.notch ? 'true' : '';\n\telOpener.dataset.topPopupOpenByHover = props.openByHover ? 'true' : '';\n}\n</script>\n\n<template>\n\t<template :ref=\"render\"></template>\n\n\t<!-- @slot элемент для открытия Popup -->\n\t<slot></slot>\n</template>\n\n<!-- Использует общий deprecated класс .btn -->\n<style>\nh3[data-top-popup],\ndiv[data-top-popup],\ni[data-top-popup]:not(.btn),\nb[data-top-popup]:not(.btn) {\n\tcursor: pointer;\n\tuser-select: none;\n\tfont-style: normal;\n\ttext-decoration: none;\n\tdisplay: inline-flex;\n\talign-items: center;\n}\n\n[data-top-popup][data-top-popup-disabled] {\n\tpointer-events: none;\n\tcursor: auto !important;\n}\n\ni[contenteditable] {\n\tcursor: text !important;\n}\n</style>","<script setup lang=\"ts\">\nimport { ref, toRef, onUnmounted } from 'vue';\nimport type { Ref } from 'vue';\nimport Core from '@/core/core/core';\nimport type { Props, Emits } from './popup';\nimport Opener from './opener.vue';\nimport Worker from '@/components/popup/lib/worker';\nimport type PopupClass from '@/components/popup/lib/popup';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tid: '',\n\tpos: '3',\n\tnotch: true,\n\tposBy: 'fixed',\n});\n\nconst emit = defineEmits<Emits>();\n\nconst expose = {\n\tpopup: undefined as PopupClass | undefined,\n};\ndefineExpose(expose);\n\nconst id = props.id || Math.random() + '';\nconst elPopupRef: Ref<null|Element> = ref(null);\n\n// см. lib/popup\nconst onOpen = async (popup: PopupClass) => {\n\tif(popup.elPopupInner){\n\t\tpopup.elPopupInner.innerText = '';\n\n\t\telPopupRef.value = popup.elPopupInner;\n\t}\n\n\tvueConnector.opened = true;\n\tvueConnector.popup = popup;\n\n\texpose.popup = popup;\n\n\temit('open');\n};\n\n// см. lib/popup\nconst onClose = (_popup: PopupClass) => {\n\telPopupRef.value = null;\n\n\tvueConnector.opened = false;\n\tvueConnector.popup = undefined;\n\n\temit('close');\n};\n\nconst vueConnector = {\n\tonOpen,\n\tonClose,\n\tclassRef: toRef(props, 'class'),\n\topened: false,\n\tpopup: undefined as PopupClass | undefined,\n\ttransitionDurationRef: toRef(props, 'transitionDuration'),\n};\n\nWorker.regVueComponent(id, vueConnector);\n\nonUnmounted(() => {\n\tWorker.unregVueComponent(id);\n});\n</script>\n\n<template>\n\t<Opener\n\t\tv-if=\"$slots.opener\"\n\t\t:id=\"id\"\n\t\t:pos=\"pos\"\n\t\t:posBy=\"posBy\"\n\t\t:notch=\"notch\"\n\t\t:openByHover=\"openByHover\"\n\t>\n\t\t<!-- @slot элемент для открытия Popup -->\n\t\t<slot name=\"opener\"></slot>\n\t</Opener>\n\n\t<!-- Это шаблон для компонента Popup, сам Popup генерируется в js и может находиться где угодно -->\n\t<!-- elPopupRef будет установлен только после открытия и будет сброшен сразу после закрытия Popup -->\n\t<teleport\n\t\tv-if=\"elPopupRef\"\n\t\t:to=\"elPopupRef\"\n\t>\n\t\t<div v-if=\"$slots.header || Core.state.isMobile\" class=\"top-popup_header\">\n\t\t\t<span\n\t\t\t\tv-if=\"Core.state.isMobile\"\n\t\t\t\tclass=\"top-as-a closer\"\n\t\t\t>\n\t\t\t\t{{ vueConnector.popup?.options.i18n?.Close }}\n\t\t\t</span>\n\n\t\t\t<!-- @slot Шапка -->\n\t\t\t<slot name=\"header\"></slot>\n\t\t</div>\n\n\t\t<div v-if=\"$slots.widget\" class=\"top-popup_widget\">\n\t\t\t<!-- @slot Виджет -->\n\t\t\t<slot name=\"widget\"></slot>\n\t\t</div>\n\n\t\t<div v-if=\"$slots.content\" class=\"top-popup_content\">\n\t\t\t<!-- @slot Контент в свободной форме -->\n\t\t\t<slot name=\"content\"></slot>\n\t\t</div>\n\n\t\t<ul\n\t\t\tv-if=\"$slots.contentList\"\n\t\t\tclass=\"top-popup_content\"\n\t\t\t@scroll=\"$emit('scrollContentList', $event)\"\n\t\t>\n\t\t\t<!-- @slot Контент в виде списка, для вставки элементов списка используйте компонент popup/listItem -->\n\t\t\t<slot name=\"contentList\"></slot>\n\t\t</ul>\n\n\t\t<div v-if=\"$slots.footer\" class=\"top-popup_footer\">\n\t\t\t<!-- @slot Футер -->\n\t\t\t<slot name=\"footer\"></slot>\n\t\t</div>\n\t</teleport>\n</template>","<script setup lang=\"ts\">\nimport type { ListItemProps } from './popup';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<ListItemProps>(), {\n\ttype: 'button',\n\tcloseByClick: true,\n});\n</script>\n\n<template>\n\t<li :class=\"{\n\t\t'top-popup_liNoSelectable': props.type !== 'button'\n\t}\">\n\t\t<component\n\t\t\t:is=\"$attrs.href ? 'a' : 'div'\"\n\t\t\t:class=\"{\n\t\t\t\t'top-popup_listItem': true,\n\t\t\t\t'top-popup_listItem-button': props.type === 'button', // оформления кнопки\n\t\t\t\t'a': props.type === 'button', // оформления кнопки, deprecated\n\t\t\t\t'top-popup_listItem-title': props.type === 'title',\n\t\t\t\t'top-popup_listItem-delimiter': props.type === 'delimiter',\n\t\t\t\t'top-popup-noCloser': !closeByClick\n\t\t\t}\"\n\t\t\t:=$attrs\n\t\t>\n\t\t\t<slot></slot>\n\t\t</component>\n\t</li>\n</template>"],"names":["props","__props","id","elOpener","render","el","renderOpener","onUpdated","elOpener2","emit","__emit","expose","__expose","elPopupRef","ref","vueConnector","popup","_popup","toRef","Worker","onUnmounted"],"mappings":";;;;;;;;;;;;;;;;AAIA,UAAAA,IAAAC,GAMAC,IAAAF,EAAA,MAAA,KAAA,OAAA,IAAA;AAEA,QAAAG;AAOA,aAAAC,EAAAC,GAAA;AACC,iBAAA,MAAA;AACC,QAAAF,IAAAE,EAAA,oBAEAF,KACCG,EAAAH,CAAA;AAAA,MACD,CAAA;AAAA,IACA;AAGF,IAAAI,EAAA,MAAA;AACC,MAAAJ,KACCG,EAAAH,CAAA;AAAA,IACD,CAAA;AAGD,aAAAG,EAAAE,GAAA;AACC,MAAAA,EAAA,QAAA,WAAA,SAAAN,GACAM,EAAA,QAAA,aAAAN,GACAM,EAAA,QAAA,YAAAR,EAAA,KACAQ,EAAA,QAAA,gBAAAR,EAAA,OACAQ,EAAA,QAAA,gBAAAR,EAAA,QAAA,SAAA,IACAQ,EAAA,QAAA,sBAAAR,EAAA,cAAA,SAAA;AAAA,IAAoE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChCrE,UAAAA,IAAAC,GAOAQ,IAAAC,GAEAC,IAAA;AAAA,MAAe,OAAA;AAAA,IACP;AAER,IAAAC,EAAAD,CAAA;AAEA,UAAAT,IAAAF,EAAA,MAAA,KAAA,OAAA,IAAA,IACAa,IAAAC,EAAA,IAAA,GA4BAC,IAAA;AAAA,MAAqB,QAzBrB,OAAAC,MAAA;AACC,QAAAA,EAAA,iBACCA,EAAA,aAAA,YAAA,IAEAH,EAAA,QAAAG,EAAA,eAGDD,EAAA,SAAA,IACAA,EAAA,QAAAC,GAEAL,EAAA,QAAAK,GAEAP,EAAA,MAAA;AAAA,MAAW;AAAA,MAcX,SAVD,CAAAQ,MAAA;AACC,QAAAJ,EAAA,QAAA,MAEAE,EAAA,SAAA,IACAA,EAAA,QAAA,QAEAN,EAAA,OAAA;AAAA,MAAY;AAAA,MAKZ,UAAAS,EAAAlB,GAAA,OAAA;AAAA,MAC8B,QAAA;AAAA,MACtB,OAAA;AAAA,MACD,uBAAAkB,EAAAlB,GAAA,oBAAA;AAAA,IACiD;AAGzD,WAAAmB,EAAA,gBAAAjB,GAAAa,CAAA,GAEAK,EAAA,MAAA;AACC,MAAAD,EAAA,kBAAAjB,CAAA;AAAA,IAA2B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzD5B,UAAAF,IAAAC;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,2 +0,0 @@
1
- define(["require","exports","vue","./forms-Dixfp052.amd","../popup/worker.amd","../require/css.amd!../assets/listItem.css"],function(E,c,e,d,m){"use strict";if(typeof e>"u")var e=window.Vue;const f=e.defineComponent({__name:"opener",props:{id:{},pos:{default:"3"},notch:{type:Boolean,default:!0},openByHover:{type:Boolean},posBy:{default:"fixed"}},setup(r){const n=r,s=n.id||Math.random()+"";let p;function i(t){setTimeout(()=>{p=t.nextElementSibling,p&&a(p)})}e.onUpdated(()=>{p&&a(p)});function a(t){t.dataset.topPopup="vue-"+s,t.dataset.topPopupId=s,t.dataset.topPopupP=n.pos,t.dataset.topPopupPosBy=n.posBy,t.dataset.topPopupNotch=n.notch?"true":"",t.dataset.topPopupOpenByHover=n.openByHover?"true":""}return(t,u)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createElementVNode("template",{ref:i}),e.renderSlot(t.$slots,"default")],64))}}),C={key:0,class:"top-popup_header"},v={key:0,class:"top-as-a closer"},h={key:1,class:"top-popup_widget"},_={key:2,class:"top-popup_content"},$={key:4,class:"top-popup_footer"},P=e.defineComponent({__name:"popup",props:{id:{default:""},class:{},transitionDuration:{},pos:{default:"3"},notch:{type:Boolean,default:!0},openByHover:{type:Boolean},posBy:{default:"fixed"}},emits:["open","close","scrollContentList"],setup(r,{expose:n,emit:s}){const p=r,i=s,a={popup:void 0};n(a);const t=p.id||Math.random()+"",u=e.ref(null),l={onOpen:async o=>{o.elPopupInner&&(o.elPopupInner.innerText="",u.value=o.elPopupInner),l.opened=!0,l.popup=o,a.popup=o,i("open")},onClose:o=>{u.value=null,l.opened=!1,l.popup=void 0,i("close")},classRef:e.toRef(p,"class"),opened:!1,popup:void 0,transitionDurationRef:e.toRef(p,"transitionDuration")};return m.PopupWorker.regVueComponent(t,l),e.onUnmounted(()=>{m.PopupWorker.unregVueComponent(t)}),(o,B)=>{var y,k;return e.openBlock(),e.createElementBlock(e.Fragment,null,[o.$slots.opener?(e.openBlock(),e.createBlock(f,{key:0,id:e.unref(t),pos:o.pos,posBy:o.posBy,notch:o.notch,openByHover:o.openByHover},{default:e.withCtx(()=>[e.renderSlot(o.$slots,"opener")]),_:3},8,["id","pos","posBy","notch","openByHover"])):e.createCommentVNode("",!0),u.value?(e.openBlock(),e.createBlock(e.Teleport,{key:1,to:u.value},[o.$slots.header||e.unref(d.Core).state.isMobile?(e.openBlock(),e.createElementBlock("div",C,[e.unref(d.Core).state.isMobile?(e.openBlock(),e.createElementBlock("span",v,e.toDisplayString((k=(y=l.popup)==null?void 0:y.options.i18n)==null?void 0:k.Close),1)):e.createCommentVNode("",!0),e.renderSlot(o.$slots,"header")])):e.createCommentVNode("",!0),o.$slots.widget?(e.openBlock(),e.createElementBlock("div",h,[e.renderSlot(o.$slots,"widget")])):e.createCommentVNode("",!0),o.$slots.content?(e.openBlock(),e.createElementBlock("div",_,[e.renderSlot(o.$slots,"content")])):e.createCommentVNode("",!0),o.$slots.contentList?(e.openBlock(),e.createElementBlock("ul",{key:3,class:"top-popup_content",onScroll:B[0]||(B[0]=V=>o.$emit("scrollContentList",V))},[e.renderSlot(o.$slots,"contentList")],32)):e.createCommentVNode("",!0),o.$slots.footer?(e.openBlock(),e.createElementBlock("div",$,[e.renderSlot(o.$slots,"footer")])):e.createCommentVNode("",!0)],8,["to"])):e.createCommentVNode("",!0)],64)}}}),S=e.defineComponent({inheritAttrs:!1,__name:"listItem",props:{type:{default:"button"},closeByClick:{type:Boolean,default:!0}},setup(r){const n=r;return(s,p)=>(e.openBlock(),e.createElementBlock("li",{class:e.normalizeClass({"top-popup_liNoSelectable":n.type!=="button"})},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(s.$attrs.href?"a":"div"),e.mergeProps({class:{"top-popup_listItem":!0,"top-popup_listItem-button":n.type==="button",a:n.type==="button","top-popup_listItem-title":n.type==="title","top-popup_listItem-delimiter":n.type==="delimiter","top-popup-noCloser":!s.closeByClick}},s.$attrs),{default:e.withCtx(()=>[e.renderSlot(s.$slots,"default")]),_:3},16,["class"]))],2))}});c._sfc_main=P,c._sfc_main$1=f,c._sfc_main$2=S});
2
- //# sourceMappingURL=listItem.vue_vue_type_script_setup_true_lang-C0tRJmSC.amd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"listItem.vue_vue_type_script_setup_true_lang-C0tRJmSC.amd.js","sources":["../../src/components/popup/popup/opener.vue","../../src/components/popup/popup/popup.vue","../../src/components/popup/popup/listItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onUpdated, ref } from 'vue';\nimport type { OpenerProps } from './popup';\n\nconst props = withDefaults(defineProps<OpenerProps>(), {\n\tpos: '3',\n\tnotch: true,\n\tposBy: 'fixed',\n});\n\nconst id = props.id || Math.random() + '';\n\nlet elOpener: Element;\n\n/**\n * Необычная функция для проброски props внтурь элемента слота\n *\n * @param el - вспомогательрный элемент для доступа к элементам слота\n */\nfunction render(el: any) {\n\tsetTimeout(() => {\n\t\telOpener = el.nextElementSibling;\n\n\t\tif (elOpener) {\n\t\t\trenderOpener(elOpener);\n\t\t}\n\t});\n}\n\nonUpdated(() => {\n\tif (elOpener) {\n\t\trenderOpener(elOpener);\n\t}\n});\n\nfunction renderOpener (elOpener: any) {\n\telOpener.dataset.topPopup = 'vue-' + id;\n\telOpener.dataset.topPopupId = id;\n\telOpener.dataset.topPopupP = props.pos;\n\telOpener.dataset.topPopupPosBy = props.posBy;\n\telOpener.dataset.topPopupNotch = props.notch ? 'true' : '';\n\telOpener.dataset.topPopupOpenByHover = props.openByHover ? 'true' : '';\n}\n</script>\n\n<template>\n\t<template :ref=\"render\"></template>\n\n\t<!-- @slot элемент для открытия Popup -->\n\t<slot></slot>\n</template>\n\n<!-- Использует общий deprecated класс .btn -->\n<style>\nh3[data-top-popup],\ndiv[data-top-popup],\ni[data-top-popup]:not(.btn),\nb[data-top-popup]:not(.btn) {\n\tcursor: pointer;\n\tuser-select: none;\n\tfont-style: normal;\n\ttext-decoration: none;\n\tdisplay: inline-flex;\n\talign-items: center;\n}\n\n[data-top-popup][data-top-popup-disabled] {\n\tpointer-events: none;\n\tcursor: auto !important;\n}\n\ni[contenteditable] {\n\tcursor: text !important;\n}\n</style>","<script setup lang=\"ts\">\nimport { ref, toRef, onUnmounted } from 'vue';\nimport type { Ref } from 'vue';\nimport Core from '@/core/core/core';\nimport type { Props, Emits } from './popup';\nimport Opener from './opener.vue';\nimport Worker from '@/components/popup/lib/worker';\nimport type PopupClass from '@/components/popup/lib/popup';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tid: '',\n\tpos: '3',\n\tnotch: true,\n\tposBy: 'fixed',\n});\n\nconst emit = defineEmits<Emits>();\n\nconst expose = {\n\tpopup: undefined as PopupClass | undefined,\n};\ndefineExpose(expose);\n\nconst id = props.id || Math.random() + '';\nconst elPopupRef: Ref<null|Element> = ref(null);\n\n// см. lib/popup\nconst onOpen = async (popup: PopupClass) => {\n\tif(popup.elPopupInner){\n\t\tpopup.elPopupInner.innerText = '';\n\n\t\telPopupRef.value = popup.elPopupInner;\n\t}\n\n\tvueConnector.opened = true;\n\tvueConnector.popup = popup;\n\n\texpose.popup = popup;\n\n\temit('open');\n};\n\n// см. lib/popup\nconst onClose = (_popup: PopupClass) => {\n\telPopupRef.value = null;\n\n\tvueConnector.opened = false;\n\tvueConnector.popup = undefined;\n\n\temit('close');\n};\n\nconst vueConnector = {\n\tonOpen,\n\tonClose,\n\tclassRef: toRef(props, 'class'),\n\topened: false,\n\tpopup: undefined as PopupClass | undefined,\n\ttransitionDurationRef: toRef(props, 'transitionDuration'),\n};\n\nWorker.regVueComponent(id, vueConnector);\n\nonUnmounted(() => {\n\tWorker.unregVueComponent(id);\n});\n</script>\n\n<template>\n\t<Opener\n\t\tv-if=\"$slots.opener\"\n\t\t:id=\"id\"\n\t\t:pos=\"pos\"\n\t\t:posBy=\"posBy\"\n\t\t:notch=\"notch\"\n\t\t:openByHover=\"openByHover\"\n\t>\n\t\t<!-- @slot элемент для открытия Popup -->\n\t\t<slot name=\"opener\"></slot>\n\t</Opener>\n\n\t<!-- Это шаблон для компонента Popup, сам Popup генерируется в js и может находиться где угодно -->\n\t<!-- elPopupRef будет установлен только после открытия и будет сброшен сразу после закрытия Popup -->\n\t<teleport\n\t\tv-if=\"elPopupRef\"\n\t\t:to=\"elPopupRef\"\n\t>\n\t\t<div v-if=\"$slots.header || Core.state.isMobile\" class=\"top-popup_header\">\n\t\t\t<span\n\t\t\t\tv-if=\"Core.state.isMobile\"\n\t\t\t\tclass=\"top-as-a closer\"\n\t\t\t>\n\t\t\t\t{{ vueConnector.popup?.options.i18n?.Close }}\n\t\t\t</span>\n\n\t\t\t<!-- @slot Шапка -->\n\t\t\t<slot name=\"header\"></slot>\n\t\t</div>\n\n\t\t<div v-if=\"$slots.widget\" class=\"top-popup_widget\">\n\t\t\t<!-- @slot Виджет -->\n\t\t\t<slot name=\"widget\"></slot>\n\t\t</div>\n\n\t\t<div v-if=\"$slots.content\" class=\"top-popup_content\">\n\t\t\t<!-- @slot Контент в свободной форме -->\n\t\t\t<slot name=\"content\"></slot>\n\t\t</div>\n\n\t\t<ul\n\t\t\tv-if=\"$slots.contentList\"\n\t\t\tclass=\"top-popup_content\"\n\t\t\t@scroll=\"$emit('scrollContentList', $event)\"\n\t\t>\n\t\t\t<!-- @slot Контент в виде списка, для вставки элементов списка используйте компонент popup/listItem -->\n\t\t\t<slot name=\"contentList\"></slot>\n\t\t</ul>\n\n\t\t<div v-if=\"$slots.footer\" class=\"top-popup_footer\">\n\t\t\t<!-- @slot Футер -->\n\t\t\t<slot name=\"footer\"></slot>\n\t\t</div>\n\t</teleport>\n</template>","<script setup lang=\"ts\">\nimport type { ListItemProps } from './popup';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<ListItemProps>(), {\n\ttype: 'button',\n\tcloseByClick: true,\n});\n</script>\n\n<template>\n\t<li :class=\"{\n\t\t'top-popup_liNoSelectable': props.type !== 'button'\n\t}\">\n\t\t<component\n\t\t\t:is=\"$attrs.href ? 'a' : 'div'\"\n\t\t\t:class=\"{\n\t\t\t\t'top-popup_listItem': true,\n\t\t\t\t'top-popup_listItem-button': props.type === 'button', // оформления кнопки\n\t\t\t\t'a': props.type === 'button', // оформления кнопки, deprecated\n\t\t\t\t'top-popup_listItem-title': props.type === 'title',\n\t\t\t\t'top-popup_listItem-delimiter': props.type === 'delimiter',\n\t\t\t\t'top-popup-noCloser': !closeByClick\n\t\t\t}\"\n\t\t\t:=$attrs\n\t\t>\n\t\t\t<slot></slot>\n\t\t</component>\n\t</li>\n</template>"],"names":["props","__props","id","render","el","elOpener","renderOpener","elOpener2","emit","__emit","__expose","expose","elPopupRef","vue","popup","vueConnector","_popup","popup_worker"],"mappings":"qWAIA,MAAAA,EAAAC,EAMAC,EAAAF,EAAA,IAAA,KAAA,OAAA,EAAA,SASA,SAAAG,EAAAC,EAAA,iBAEEC,EAAAD,EAAA,sBAGCE,EAAAD,CAAA,CACD,CAAA,sBAMAC,EAAAD,CAAA,CACD,CAAA,EAGD,SAAAC,EAAAC,EAAA,6BAECA,EAAA,QAAA,WAAAL,4DAGAK,EAAA,QAAA,cAAAP,EAAA,MAAA,OAAA,GACAO,EAAA,QAAA,oBAAAP,EAAA,YAAA,OAAA,6kBChCD,MAAAA,EAAAC,EAOAO,EAAAC,iBAGQ,EAERC,EAAAC,CAAA,EAEA,MAAAT,EAAAF,EAAA,IAAA,KAAA,OAAA,EAAA,GACAY,EAAAC,EAAA,IAAA,IAAA,KA4BqB,OAzBrB,MAAAC,GAAA,CACCA,EAAA,eACCA,EAAA,aAAA,UAAA,GAEAF,EAAA,MAAAE,EAAA,cAGDC,EAAA,OAAA,GACAA,EAAA,MAAAD,EAEAH,EAAA,MAAAG,EAEAN,EAAA,MAAA,CAAW,EAcX,QAVDQ,GAAA,CACCJ,EAAA,MAAA,KAEAG,EAAA,OAAA,GACAA,EAAA,MAAA,OAEAP,EAAA,OAAA,CAAY,EAKZ,SAAAK,EAAA,MAAAb,EAAA,OAAA,yBAGO,sBAAAa,EAAA,MAAAb,EAAA,oBAAA,CACiD,+DAMxDiB,EAAA,YAAA,kBAAAf,CAAA,CAA2B,CAAA,0gDCzD5B,MAAAF,EAAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"menu-CHczkYl6.es.js","sources":["../../src/components/formsExt/menu/menu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, onMounted, onUpdated } from 'vue';\nimport type { Props, Item } from './menu';\nimport Core from '@/core/core/core';\nimport { isSafari } from '@/core/utils/device';\nimport { Button } from '@/components/forms/forms';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tstyling: 'default',\n});\n\nconst model = defineModel({\n\trequired: true,\n});\n\nconst el = ref();\n\n// валидация типа modelValue без возможности выбора нескольких значений (ожидается строка)\nif (!props.isMultiple && !(typeof (model.value) === 'string' || model.value instanceof String)) {\n\tconsole.warn('Type check failed for prop \"modelValue\". Expected String: ' + typeof (model.value));\n}\n\n// валидация типа modelValue с возможностью выбора нескольких значений (ожидается массив)\nif (props.isMultiple && !Array.isArray(model.value)) {\n\tconsole.warn('Type check failed for prop \"modelValue\". Expected Array: ' + typeof (model.value));\n}\n\n// для множественного выбора без пустого множества\n// если ничего не выбрано, присваиваем 1-ое значение\nif (props.isMultiple && !props.canBeEmptyMultiple && Array.isArray(model.value) && !model.value.length) {\n\tmodel.value = [props.items[0].href ?? props.items[0].value];\n}\n\nconst itemIsActive = (item: Item) => {\n\tif (!Array.isArray(model.value)) {\n\t\treturn item.value === model.value;\n\t}\n\n\treturn model.value.includes(item.value);\n};\n\n/**\n * Выбрать элемент\n * @param item\n * @param toggle - добавить или исключить элемент, для isMultiple\n */\nconst select = (item: Item, toggle = false) => {\n\tif (Array.isArray(model.value)) {\n\t\tlet modelNew = model.value.slice();\n\n\t\tif (toggle) {\n\t\t\tif (!modelNew.length) modelNew = props.items.map(item => item.value);\n\n\t\t\tconst index = modelNew.indexOf(item.value);\n\t\t\tif (index === -1) {\n\t\t\t\tmodelNew.push(item.value);\n\t\t\t} else {\n\t\t\t\tmodelNew.splice(index, 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif (modelNew.length === 1 && modelNew[0] === item.value) {\n\t\t\t\tmodelNew = [];\n\t\t\t} else {\n\t\t\t\tmodelNew = [item.value];\n\t\t\t}\n\t\t}\n\n\t\tif (!props.canBeEmptyMultiple && !modelNew.length) modelNew = [item.value];\n\n\t\tmodel.value = modelNew;\n\n\t\treturn;\n\t}\n\n\tmodel.value = item.value;\n};\n\n// вертикальный скролл в горизонтальный скролл\nconst onWheel = (event: WheelEvent) => {\n\tif (el.value.scrollWidth <= el.value.offsetWidth) return;\n\tif (event.shiftKey) return;\n\tif (Math.abs(event.deltaY) < 50) return; // устройство с высокой точностью, например тачпад\n\n\tevent.preventDefault();\n\n\tconst delta = event.deltaY > 0 ? 30 : -30;\n\tel.value.scrollLeft = el.value.scrollLeft + delta;\n};\n\n/**\n * Замена стандартному scrollIntoView, который меняет скролл документа\n *\n * Выравнивание по ближнему краю элемента\n *\n * Выравнивается таким образом, чтобы был виден соседний элемент\n */\nconst scrollIntoView = (isSmooth = true) => {\n\tconst elBtn = el.value.querySelector('.top-active');\n\tif (!elBtn) return;\n\n\tconst gap = 24;\n\n\t// левая и правая координаты элемента\n\tconst leftMargin = elBtn.offsetLeft - el.value.offsetLeft - gap;\n\tconst rightMargin = elBtn.offsetLeft - el.value.offsetLeft + elBtn.clientWidth + gap;\n\n\t// левая и правая границы видимой части меню\n\tconst leftMarginParent = el.value.scrollLeft;\n\tconst rightMarginParent = el.value.clientWidth + el.value.scrollLeft;\n\n\tlet scrollLeft: number|undefined = undefined;\n\n\t// левую границу элемента к левой границе меню\n\tif (leftMargin < leftMarginParent) scrollLeft = leftMargin;\n\n\t// правую границу элемента к правой границе меню\n\tif (rightMargin > rightMarginParent) scrollLeft = rightMargin - el.value.clientWidth;\n\n\tif (scrollLeft !== undefined) {\n\t\tif (isSafari()) {\n\t\t\tCore.$?.(el.value).animate({ scrollLeft: scrollLeft }, isSmooth ? 200 : 0);\n\t\t} else {\n\t\t\tel.value.scrollTo({ left: scrollLeft, behavior: isSmooth ? 'smooth' : 'auto' });\n\t\t}\n\t}\n};\n\n/**\n * Выбрать все элементы в меню\n */\nconst selectAll = () => {\n\tif (!Array.isArray(model.value)) return;\n\n\tif (model.value.length === props.items.length) {\n\t\tmodel.value = [props.items[0].href ?? props.items[0].value];\n\t\treturn;\n\t}\n\n\tmodel.value = props.items.map(item => item.href ?? item.value);\n};\n\nonMounted(() => scrollIntoView(false));\nonUpdated(() => scrollIntoView(true));\n\n</script>\n\n<template>\n\t<div\n\t\tref=\"el\"\n\t\t:class=\"{\n\t\t\t'top-menu': true,\n\t\t\t['top-style_' + styling]: true,\n\t\t\t['top-unwrap-x']: styling === 'default',\n\t\t}\"\n\t\t@wheel=\"onWheel\"\n\t>\n\t\t<Button\n\t\t\tv-for=\"item in items\"\n\t\t\t:=\"item\"\n\t\t\tclass=\"top-menu_item\"\n\t\t\tcolor=\"theme\"\n\t\t\tstyling=\"\"\n\t\t\t@click=\"select(item, $event.ctrlKey)\"\n\t\t\t:isActive=\"itemIsActive(item)\"\n\t\t>\n\t\t\t<template #default v-if=\"item.content\">\n\t\t\t\t{{ item.content }}\n\t\t\t</template>\n\t\t</Button>\n\n\t\t<div\n\t\t\tv-if=\"Array.isArray(model) && selectAllItem\"\n\t\t\tclass=\"top-menu_selectAll\"\n\t\t>\n\t\t\t<Button\n\t\t\t\t:=\"selectAllItem\"\n\t\t\t\tclass=\"top-menu_item\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\tstyling=\"\"\n\t\t\t\t@click=\"selectAll()\"\n\t\t\t\t:isActive=\"model.length === items.length\"\n\t\t\t>\n\t\t\t\t<template #default v-if=\"selectAllItem.content\">\n\t\t\t\t\t{{ selectAllItem.content }}\n\t\t\t\t</template>\n\t\t\t</Button>\n\t\t</div>\n\t</div>\n</template>\n\n<style module>\n.top-menu {\n\t--scroll-thumb-color: var(--color-line-1);\n\t--scroll-thumb-color-hover: var(--color-line-2);\n\t--scroll-thumb-color-active: var(--color-line-3);\n\n\tmax-width: 100%;\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: var(--top-gap-2);\n\toverflow-x: auto;\n\tscrollbar-width: none; /* firefox */\n\n\t/* предотвратить натинвые события браузера (назад / вперед) */\n\toverscroll-behavior-x: contain;\n}\n\n.top-menu::-webkit-scrollbar { display: none; }\n\n.top-menu .top-menu_item {\n\t--top-button-color: var(--color-text-2);\n\n\toutline-offset: -2px !important;\n\tmin-width: 0;\n\tmargin: 0;\n\tflex-shrink: 0;\n}\n\n.top-menu .top-menu_item[data-top-icon] {\n\t--top-icon-color: var(--color-text-2);\n}\n\n.top-menu_selectAll {\n\tposition: sticky;\n\tright: 0;\n\tbackground: var(--content-background-color);\n\tborder-left: 1px solid var(--color-line-1-opacity);\n\tpadding-left: var(--top-padding-1);\n\tbox-shadow: var(--content-background-color) var(--top-padding-2) 0px;\n}\n\n/* style default */\n.top-menu.top-style_default .top-menu_item {\n\t--top-forms-radius: 0;\n\t--top-forms-border-color: transparent;\n\t--top-forms-border-width: 2px;\n\n\tfilter: none;\n\tbox-shadow: none;\n\tborder: none;\n\tborder-bottom: var(--top-forms-border-width) solid var(--top-forms-border-color);\n\tbackground: none;\n}\n\n.top-menu.top-style_default .top-menu_item:hover {\n\t--top-icon-color: var(--color-text-1);\n\t--top-button-color: var(--color-text-1);\n\t--top-forms-border-color: var(--color-line-2-opacity);\n}\n\n.top-menu.top-style_default .top-menu_item:active,\n.top-menu.top-style_default .top-menu_item.top-active {\n\t--top-icon-color: var(--color-icon-primary-2);\n\t--top-button-color: var(--color-text-1);\n\t--top-forms-border-color: var(--color-line-primary-1);\n}\n\n.top-menu.top-style_default .top-menu_selectAll {\n\tpadding-left: var(--top-padding-2);\n}\n\n/* style bar */\n.top-menu.top-style_bar {\n\tborder-radius: var(--top-radius-3);\n\tborder: 1px solid var(--color-line-2-opacity);\n\tpadding: var(--top-padding-1);\n\tgap: 3px;\n}\n.top-menu.top-style_bar .top-menu_item {\n\t--top-button-background-color-hover: var(--color-layer-secondary-1);\n\t--top-button-background-color-active: var(--color-layer-secondary-2);\n\t--top-button-background-color-selected: var(--color-layer-primary-1);\n\n\tposition: relative;\n}\n\n.top-menu.top-style_bar .top-menu_item:hover {\n\t--top-icon-color: var(--color-icon-1);\n\t--top-button-color: var(--color-text-1);\n}\n\n.top-menu.top-style_bar .top-menu_item.top-active {\n\t--top-icon-color: var(--color-icon-primary-2);\n\t--top-button-color: var(--color-text-primary-1);\n}\n\n/* разделители кнопок в баре */\n.top-menu.top-style_bar .top-menu_item:not(:first-child):not(.top-active):not(:hover):after {\n\tcontent: \"\";\n\tbackground: var(--color-line-1-opacity);\n\twidth: 1px;\n\theight: 60%;\n\tdisplay: block;\n\tposition: absolute;\n\tleft: -2px;\n}\n.top-menu.top-style_bar .top-menu_item.top-active + .top-menu_item:after,\n.top-menu.top-style_bar .top-menu_item:hover + .top-menu_item:after {\n\tcontent: none !important;\n}\n\n/** TODO: .top-unwrap-x надо вынести глобально в UI или добавить в стили для storybook */\n.top-menu.top-unwrap-x {\n\tpadding-right: var(--top-unwrap-x);\n\tpadding-left: var(--top-unwrap-x);\n\tmargin-right: calc(0px - var(--top-unwrap-x));\n\tmargin-left: calc(0px - var(--top-unwrap-x));\n}\n</style>"],"names":["props","__props","model","useModel","el","ref","itemIsActive","item","select","toggle","modelNew","item2","index","onWheel","event","delta","scrollIntoView","isSmooth","elBtn","gap","leftMargin","rightMargin","leftMarginParent","rightMarginParent","scrollLeft","isSafari","_b","_a","Core","selectAll","onMounted","onUpdated"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAOA,UAAAA,IAAAC,GAIAC,IAAAC,EAAAF,GAAA,YAAA,GAIAG,IAAAC,EAAA;AAGA,IAAA,CAAAL,EAAA,cAAA,EAAA,OAAAE,EAAA,SAAA,YAAAA,EAAA,iBAAA,WACC,QAAA,KAAA,+DAAA,OAAAA,EAAA,KAAA,GAIDF,EAAA,cAAA,CAAA,MAAA,QAAAE,EAAA,KAAA,KACC,QAAA,KAAA,8DAAA,OAAAA,EAAA,KAAA,GAKDF,EAAA,cAAA,CAAAA,EAAA,sBAAA,MAAA,QAAAE,EAAA,KAAA,KAAA,CAAAA,EAAA,MAAA,WACCA,EAAA,QAAA,CAAAF,EAAA,MAAA,CAAA,EAAA,QAAAA,EAAA,MAAA,CAAA,EAAA,KAAA;AAGD,UAAAM,IAAA,CAAAC,MACC,MAAA,QAAAL,EAAA,KAAA,IAIAA,EAAA,MAAA,SAAAK,EAAA,KAAA,IAHCA,EAAA,UAAAL,EAAA,OAWFM,IAAA,CAAAD,GAAAE,IAAA,OAAA;AACC,UAAA,MAAA,QAAAP,EAAA,KAAA,GAAA;AACC,YAAAQ,IAAAR,EAAA,MAAA,MAAA;AAEA,YAAAO,GAAA;AACC,UAAAC,EAAA,WAAAA,IAAAV,EAAA,MAAA,IAAA,CAAAW,MAAAA,EAAA,KAAA;AAEA,gBAAAC,IAAAF,EAAA,QAAAH,EAAA,KAAA;AACA,UAAAK,MAAA,KACCF,EAAA,KAAAH,EAAA,KAAA,IAEAG,EAAA,OAAAE,GAAA,CAAA;AAAA,QACD;AAEA,UAAAF,EAAA,WAAA,KAAAA,EAAA,CAAA,MAAAH,EAAA,QACCG,IAAA,CAAA,IAEAA,IAAA,CAAAH,EAAA,KAAA;AAIF,QAAA,CAAAP,EAAA,sBAAA,CAAAU,EAAA,WAAAA,IAAA,CAAAH,EAAA,KAAA,IAEAL,EAAA,QAAAQ;AAEA;AAAA,MAAA;AAGD,MAAAR,EAAA,QAAAK,EAAA;AAAA,IAAmB,GAIpBM,IAAA,CAAAC,MAAA;AAGC,UAFAV,EAAA,MAAA,eAAAA,EAAA,MAAA,eACAU,EAAA,YACA,KAAA,IAAAA,EAAA,MAAA,IAAA,GAAA;AAEA,MAAAA,EAAA,eAAA;AAEA,YAAAC,IAAAD,EAAA,SAAA,IAAA,KAAA;AACA,MAAAV,EAAA,MAAA,aAAAA,EAAA,MAAA,aAAAW;AAAA,IAA4C,GAU7CC,IAAA,CAAAC,IAAA,OAAA;;AACC,YAAAC,IAAAd,EAAA,MAAA,cAAA,aAAA;AACA,UAAA,CAAAc,EAAA;AAEA,YAAAC,IAAA,IAGAC,IAAAF,EAAA,aAAAd,EAAA,MAAA,aAAAe,GACAE,IAAAH,EAAA,aAAAd,EAAA,MAAA,aAAAc,EAAA,cAAAC,GAGAG,IAAAlB,EAAA,MAAA,YACAmB,IAAAnB,EAAA,MAAA,cAAAA,EAAA,MAAA;AAEA,UAAAoB;AAGA,MAAAJ,IAAAE,MAAAE,IAAAJ,IAGAC,IAAAE,MAAAC,IAAAH,IAAAjB,EAAA,MAAA,cAEAoB,MAAA,WACCC,EAAA,KACCC,KAAAC,IAAAC,GAAA,MAAA,QAAAF,EAAA,KAAAC,GAAAvB,EAAA,OAAA,QAAA,EAAA,YAAAoB,EAAA,GAAAP,IAAA,MAAA,KAEAb,EAAA,MAAA,SAAA,EAAA,MAAAoB,GAAA,UAAAP,IAAA,WAAA,OAAA,CAAA;AAAA,IAEF,GAMDY,IAAA,MAAA;AACC,UAAA,MAAA,QAAA3B,EAAA,KAAA,GAEA;AAAA,YAAAA,EAAA,MAAA,WAAAF,EAAA,MAAA,QAAA;AACC,UAAAE,EAAA,QAAA,CAAAF,EAAA,MAAA,CAAA,EAAA,QAAAA,EAAA,MAAA,CAAA,EAAA,KAAA;AACA;AAAA,QAAA;AAGD,QAAAE,EAAA,QAAAF,EAAA,MAAA,IAAA,CAAAO,MAAAA,EAAA,QAAAA,EAAA,KAAA;AAAA;AAAA,IAA6D;AAG9D,WAAAuB,EAAA,MAAAd,EAAA,EAAA,CAAA,GACAe,EAAA,MAAAf,EAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"menu-buQxcAhv.amd.js","sources":["../../src/components/formsExt/menu/menu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, onMounted, onUpdated } from 'vue';\nimport type { Props, Item } from './menu';\nimport Core from '@/core/core/core';\nimport { isSafari } from '@/core/utils/device';\nimport { Button } from '@/components/forms/forms';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tstyling: 'default',\n});\n\nconst model = defineModel({\n\trequired: true,\n});\n\nconst el = ref();\n\n// валидация типа modelValue без возможности выбора нескольких значений (ожидается строка)\nif (!props.isMultiple && !(typeof (model.value) === 'string' || model.value instanceof String)) {\n\tconsole.warn('Type check failed for prop \"modelValue\". Expected String: ' + typeof (model.value));\n}\n\n// валидация типа modelValue с возможностью выбора нескольких значений (ожидается массив)\nif (props.isMultiple && !Array.isArray(model.value)) {\n\tconsole.warn('Type check failed for prop \"modelValue\". Expected Array: ' + typeof (model.value));\n}\n\n// для множественного выбора без пустого множества\n// если ничего не выбрано, присваиваем 1-ое значение\nif (props.isMultiple && !props.canBeEmptyMultiple && Array.isArray(model.value) && !model.value.length) {\n\tmodel.value = [props.items[0].href ?? props.items[0].value];\n}\n\nconst itemIsActive = (item: Item) => {\n\tif (!Array.isArray(model.value)) {\n\t\treturn item.value === model.value;\n\t}\n\n\treturn model.value.includes(item.value);\n};\n\n/**\n * Выбрать элемент\n * @param item\n * @param toggle - добавить или исключить элемент, для isMultiple\n */\nconst select = (item: Item, toggle = false) => {\n\tif (Array.isArray(model.value)) {\n\t\tlet modelNew = model.value.slice();\n\n\t\tif (toggle) {\n\t\t\tif (!modelNew.length) modelNew = props.items.map(item => item.value);\n\n\t\t\tconst index = modelNew.indexOf(item.value);\n\t\t\tif (index === -1) {\n\t\t\t\tmodelNew.push(item.value);\n\t\t\t} else {\n\t\t\t\tmodelNew.splice(index, 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif (modelNew.length === 1 && modelNew[0] === item.value) {\n\t\t\t\tmodelNew = [];\n\t\t\t} else {\n\t\t\t\tmodelNew = [item.value];\n\t\t\t}\n\t\t}\n\n\t\tif (!props.canBeEmptyMultiple && !modelNew.length) modelNew = [item.value];\n\n\t\tmodel.value = modelNew;\n\n\t\treturn;\n\t}\n\n\tmodel.value = item.value;\n};\n\n// вертикальный скролл в горизонтальный скролл\nconst onWheel = (event: WheelEvent) => {\n\tif (el.value.scrollWidth <= el.value.offsetWidth) return;\n\tif (event.shiftKey) return;\n\tif (Math.abs(event.deltaY) < 50) return; // устройство с высокой точностью, например тачпад\n\n\tevent.preventDefault();\n\n\tconst delta = event.deltaY > 0 ? 30 : -30;\n\tel.value.scrollLeft = el.value.scrollLeft + delta;\n};\n\n/**\n * Замена стандартному scrollIntoView, который меняет скролл документа\n *\n * Выравнивание по ближнему краю элемента\n *\n * Выравнивается таким образом, чтобы был виден соседний элемент\n */\nconst scrollIntoView = (isSmooth = true) => {\n\tconst elBtn = el.value.querySelector('.top-active');\n\tif (!elBtn) return;\n\n\tconst gap = 24;\n\n\t// левая и правая координаты элемента\n\tconst leftMargin = elBtn.offsetLeft - el.value.offsetLeft - gap;\n\tconst rightMargin = elBtn.offsetLeft - el.value.offsetLeft + elBtn.clientWidth + gap;\n\n\t// левая и правая границы видимой части меню\n\tconst leftMarginParent = el.value.scrollLeft;\n\tconst rightMarginParent = el.value.clientWidth + el.value.scrollLeft;\n\n\tlet scrollLeft: number|undefined = undefined;\n\n\t// левую границу элемента к левой границе меню\n\tif (leftMargin < leftMarginParent) scrollLeft = leftMargin;\n\n\t// правую границу элемента к правой границе меню\n\tif (rightMargin > rightMarginParent) scrollLeft = rightMargin - el.value.clientWidth;\n\n\tif (scrollLeft !== undefined) {\n\t\tif (isSafari()) {\n\t\t\tCore.$?.(el.value).animate({ scrollLeft: scrollLeft }, isSmooth ? 200 : 0);\n\t\t} else {\n\t\t\tel.value.scrollTo({ left: scrollLeft, behavior: isSmooth ? 'smooth' : 'auto' });\n\t\t}\n\t}\n};\n\n/**\n * Выбрать все элементы в меню\n */\nconst selectAll = () => {\n\tif (!Array.isArray(model.value)) return;\n\n\tif (model.value.length === props.items.length) {\n\t\tmodel.value = [props.items[0].href ?? props.items[0].value];\n\t\treturn;\n\t}\n\n\tmodel.value = props.items.map(item => item.href ?? item.value);\n};\n\nonMounted(() => scrollIntoView(false));\nonUpdated(() => scrollIntoView(true));\n\n</script>\n\n<template>\n\t<div\n\t\tref=\"el\"\n\t\t:class=\"{\n\t\t\t'top-menu': true,\n\t\t\t['top-style_' + styling]: true,\n\t\t\t['top-unwrap-x']: styling === 'default',\n\t\t}\"\n\t\t@wheel=\"onWheel\"\n\t>\n\t\t<Button\n\t\t\tv-for=\"item in items\"\n\t\t\t:=\"item\"\n\t\t\tclass=\"top-menu_item\"\n\t\t\tcolor=\"theme\"\n\t\t\tstyling=\"\"\n\t\t\t@click=\"select(item, $event.ctrlKey)\"\n\t\t\t:isActive=\"itemIsActive(item)\"\n\t\t>\n\t\t\t<template #default v-if=\"item.content\">\n\t\t\t\t{{ item.content }}\n\t\t\t</template>\n\t\t</Button>\n\n\t\t<div\n\t\t\tv-if=\"Array.isArray(model) && selectAllItem\"\n\t\t\tclass=\"top-menu_selectAll\"\n\t\t>\n\t\t\t<Button\n\t\t\t\t:=\"selectAllItem\"\n\t\t\t\tclass=\"top-menu_item\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\tstyling=\"\"\n\t\t\t\t@click=\"selectAll()\"\n\t\t\t\t:isActive=\"model.length === items.length\"\n\t\t\t>\n\t\t\t\t<template #default v-if=\"selectAllItem.content\">\n\t\t\t\t\t{{ selectAllItem.content }}\n\t\t\t\t</template>\n\t\t\t</Button>\n\t\t</div>\n\t</div>\n</template>\n\n<style module>\n.top-menu {\n\t--scroll-thumb-color: var(--color-line-1);\n\t--scroll-thumb-color-hover: var(--color-line-2);\n\t--scroll-thumb-color-active: var(--color-line-3);\n\n\tmax-width: 100%;\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: var(--top-gap-2);\n\toverflow-x: auto;\n\tscrollbar-width: none; /* firefox */\n\n\t/* предотвратить натинвые события браузера (назад / вперед) */\n\toverscroll-behavior-x: contain;\n}\n\n.top-menu::-webkit-scrollbar { display: none; }\n\n.top-menu .top-menu_item {\n\t--top-button-color: var(--color-text-2);\n\n\toutline-offset: -2px !important;\n\tmin-width: 0;\n\tmargin: 0;\n\tflex-shrink: 0;\n}\n\n.top-menu .top-menu_item[data-top-icon] {\n\t--top-icon-color: var(--color-text-2);\n}\n\n.top-menu_selectAll {\n\tposition: sticky;\n\tright: 0;\n\tbackground: var(--content-background-color);\n\tborder-left: 1px solid var(--color-line-1-opacity);\n\tpadding-left: var(--top-padding-1);\n\tbox-shadow: var(--content-background-color) var(--top-padding-2) 0px;\n}\n\n/* style default */\n.top-menu.top-style_default .top-menu_item {\n\t--top-forms-radius: 0;\n\t--top-forms-border-color: transparent;\n\t--top-forms-border-width: 2px;\n\n\tfilter: none;\n\tbox-shadow: none;\n\tborder: none;\n\tborder-bottom: var(--top-forms-border-width) solid var(--top-forms-border-color);\n\tbackground: none;\n}\n\n.top-menu.top-style_default .top-menu_item:hover {\n\t--top-icon-color: var(--color-text-1);\n\t--top-button-color: var(--color-text-1);\n\t--top-forms-border-color: var(--color-line-2-opacity);\n}\n\n.top-menu.top-style_default .top-menu_item:active,\n.top-menu.top-style_default .top-menu_item.top-active {\n\t--top-icon-color: var(--color-icon-primary-2);\n\t--top-button-color: var(--color-text-1);\n\t--top-forms-border-color: var(--color-line-primary-1);\n}\n\n.top-menu.top-style_default .top-menu_selectAll {\n\tpadding-left: var(--top-padding-2);\n}\n\n/* style bar */\n.top-menu.top-style_bar {\n\tborder-radius: var(--top-radius-3);\n\tborder: 1px solid var(--color-line-2-opacity);\n\tpadding: var(--top-padding-1);\n\tgap: 3px;\n}\n.top-menu.top-style_bar .top-menu_item {\n\t--top-button-background-color-hover: var(--color-layer-secondary-1);\n\t--top-button-background-color-active: var(--color-layer-secondary-2);\n\t--top-button-background-color-selected: var(--color-layer-primary-1);\n\n\tposition: relative;\n}\n\n.top-menu.top-style_bar .top-menu_item:hover {\n\t--top-icon-color: var(--color-icon-1);\n\t--top-button-color: var(--color-text-1);\n}\n\n.top-menu.top-style_bar .top-menu_item.top-active {\n\t--top-icon-color: var(--color-icon-primary-2);\n\t--top-button-color: var(--color-text-primary-1);\n}\n\n/* разделители кнопок в баре */\n.top-menu.top-style_bar .top-menu_item:not(:first-child):not(.top-active):not(:hover):after {\n\tcontent: \"\";\n\tbackground: var(--color-line-1-opacity);\n\twidth: 1px;\n\theight: 60%;\n\tdisplay: block;\n\tposition: absolute;\n\tleft: -2px;\n}\n.top-menu.top-style_bar .top-menu_item.top-active + .top-menu_item:after,\n.top-menu.top-style_bar .top-menu_item:hover + .top-menu_item:after {\n\tcontent: none !important;\n}\n\n/** TODO: .top-unwrap-x надо вынести глобально в UI или добавить в стили для storybook */\n.top-menu.top-unwrap-x {\n\tpadding-right: var(--top-unwrap-x);\n\tpadding-left: var(--top-unwrap-x);\n\tmargin-right: calc(0px - var(--top-unwrap-x));\n\tmargin-left: calc(0px - var(--top-unwrap-x));\n}\n</style>"],"names":["props","__props","el","vue","model","itemIsActive","item","index","modelNew","onWheel","event","delta","scrollIntoView","isSmooth","elBtn","gap","leftMargin","rightMargin","rightMarginParent","scrollLeft"],"mappings":"ydAOA,MAAAA,EAAAC,+BAQAC,EAAAC,EAAA,IAAA,mKAQAH,EAAA,YAAA,CAAA,MAAA,QAAAI,EAAA,KAAA,wNAUA,MAAAC,EAAAC,2MAqBGC,IAAA,gCAIA,MAEAC,EAAA,SAAA,GAAAA,EAAA,CAAA,IAAAF,EAAA,WAGCE,EAAA,CAAAF,EAAA,KAAA,EAIF,CAAAN,EAAA,oBAAA,CAAAQ,EAAA,SAAAA,EAAA,CAAAF,EAAA,KAAA,GAEAF,EAAA,MAAAI,EAEA,OAGDJ,EAAA,MAAAE,EAAA,KAAmB,EAIpBG,EAAAC,GAAA,CAGC,GAFAR,EAAA,MAAA,aAAAA,EAAA,MAAA,aACAQ,EAAA,UACA,KAAA,IAAAA,EAAA,MAAA,EAAA,GAAA,OAEAA,EAAA,eAAA,EAEA,MAAAC,EAAAD,EAAA,OAAA,EAAA,GAAA,IACAR,EAAA,MAAA,WAAAA,EAAA,MAAA,WAAAS,CAA4C,EAU7CC,EAAA,CAAAC,EAAA,KAAA,sDAEC,GAAA,CAAAC,EAAA,OAEA,MAAAC,EAAA,GAGAC,EAAAF,EAAA,WAAAZ,EAAA,MAAA,WAAAa,EACAE,EAAAH,EAAA,WAAAZ,EAAA,MAAA,WAAAY,EAAA,YAAAC,uBAIAG,EAAAhB,EAAA,MAAA,YAAAA,EAAA,MAAA,WAEA,IAAAiB,aAMAF,EAAAC,IAAAC,EAAAF,EAAAf,EAAA,MAAA,aAEAiB,IAAA,sJAMA,mCASA,IAAAf,EAAA,MAAA,SAAAJ,EAAA,MAAA,OAAA,6CAEC,+CAG4D"}