@topvisor/ui 1.0.9-fix-css → 1.0.10

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 (148) hide show
  1. package/.chunks/datepicker-ByWpmP7C.amd.js +248 -0
  2. package/.chunks/datepicker-ByWpmP7C.amd.js.map +1 -0
  3. package/.chunks/datepicker-CqM_Jrot.es.js +290 -0
  4. package/.chunks/datepicker-CqM_Jrot.es.js.map +1 -0
  5. package/.chunks/{forms-BydHEF-k.es.js → forms-B6DA2YGV.es.js} +268 -253
  6. package/.chunks/forms-B6DA2YGV.es.js.map +1 -0
  7. package/.chunks/{forms-Cq5zFLsO.amd.js → forms-BOqxOjGU.amd.js} +3 -3
  8. package/.chunks/forms-BOqxOjGU.amd.js.map +1 -0
  9. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-DinMn3Ud.es.js → listItem.vue_vue_type_script_setup_true_lang-CILdtVxX.es.js} +2 -2
  10. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-CILdtVxX.es.js.map +1 -0
  11. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-B0xTxYZR.amd.js → listItem.vue_vue_type_script_setup_true_lang-DNqgt-07.amd.js} +2 -2
  12. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-DNqgt-07.amd.js.map +1 -0
  13. package/.chunks/{menu.vue_vue_type_style_index_0_lang-C585WUlJ.es.js → menu.vue_vue_type_style_index_0_lang-DNejp6r9.es.js} +2 -2
  14. package/.chunks/menu.vue_vue_type_style_index_0_lang-DNejp6r9.es.js.map +1 -0
  15. package/.chunks/{menu.vue_vue_type_style_index_0_lang-BT-PgdJ5.amd.js → menu.vue_vue_type_style_index_0_lang-teY0us7_.amd.js} +2 -2
  16. package/.chunks/menu.vue_vue_type_style_index_0_lang-teY0us7_.amd.js.map +1 -0
  17. package/.chunks/notice-CEj6I4uX.es.js +169 -0
  18. package/.chunks/notice-CEj6I4uX.es.js.map +1 -0
  19. package/.chunks/notice-DTreV5av.amd.js +4 -0
  20. package/.chunks/notice-DTreV5av.amd.js.map +1 -0
  21. package/.chunks/{popup-D22VHVHf.amd.js → popup-DBBa2Ki8.amd.js} +448 -448
  22. package/.chunks/popup-DBBa2Ki8.amd.js.map +1 -0
  23. package/.chunks/{popup-B7AaTfNZ.es.js → popup-JjVFt_2L.es.js} +491 -491
  24. package/.chunks/popup-JjVFt_2L.es.js.map +1 -0
  25. package/.chunks/store-CX_6ZXhO.es.js.map +1 -1
  26. package/.chunks/store-esTid5oI.amd.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/assets/notice.css +1 -0
  32. package/assets/tabsView.css +1 -1
  33. package/assets/themes/dark.css +1 -1
  34. package/assets/themes/light.css +1 -1
  35. package/charts/charts.amd.js +1 -1
  36. package/charts/charts.amd.js.map +1 -1
  37. package/charts/charts.js +1 -1
  38. package/charts/charts.js.map +1 -1
  39. package/components/core/notice/item/item.vue.d.ts +8 -0
  40. package/components/core/notice/item/types.d.ts +57 -0
  41. package/components/core/notice/notice.vue.d.ts +5 -0
  42. package/components/core/notice/types.d.ts +1 -0
  43. package/components/core/notice/utils.d.ts +26 -0
  44. package/components/forms/avatar/avatar.vue.d.ts +1 -1
  45. package/components/forms/button/button.vue.d.ts +1 -1
  46. package/components/formsExt/editInput/editInput.d.ts +1 -1
  47. package/components/formsExt/menu/menu.d.ts +1 -1
  48. package/components/formsExt/selector2/selector2.vue.d.ts +3 -3
  49. package/components/popup/popup/popup.vue.d.ts +1 -1
  50. package/components/project/selectorCompetitors/selectorCompetitors.d.ts +1 -1
  51. package/core/app.amd.js +1 -1
  52. package/core/app.amd.js.map +1 -1
  53. package/core/app.js +54 -52
  54. package/core/app.js.map +1 -1
  55. package/core/core/core.d.ts +21 -0
  56. package/core/plugins/core.d.ts +4 -1
  57. package/forms/forms.amd.js +1 -1
  58. package/forms/forms.js +1 -1
  59. package/forms/helpers.amd.js.map +1 -1
  60. package/forms/helpers.js.map +1 -1
  61. package/formsExt/formsExt.amd.js +1 -1
  62. package/formsExt/formsExt.amd.js.map +1 -1
  63. package/formsExt/formsExt.js +2 -2
  64. package/formsExt/formsExt.js.map +1 -1
  65. package/icomoon/Read Me.txt +7 -7
  66. package/icomoon/Topvisor icons.json +5845 -5845
  67. package/icomoon/demo-files/demo.css +161 -161
  68. package/icomoon/demo-files/demo.js +30 -30
  69. package/icomoon/demo.html +3379 -3379
  70. package/icomoon/fonts/Topvisor-2.svg +263 -263
  71. package/icomoon/style.css +740 -740
  72. package/package.json +33 -37
  73. package/popup/popup.amd.js +1 -1
  74. package/popup/popup.amd.js.map +1 -1
  75. package/popup/popup.js +2 -2
  76. package/popup/popup.js.map +1 -1
  77. package/popup/worker.amd.js +1 -1
  78. package/popup/worker.amd.js.map +1 -1
  79. package/popup/worker.js +2 -2
  80. package/popup/worker.js.map +1 -1
  81. package/project/project.amd.js +1 -1
  82. package/project/project.amd.js.map +1 -1
  83. package/project/project.js +3 -3
  84. package/project/project.js.map +1 -1
  85. package/require/css.amd.js +12 -12
  86. package/tabs/tabs.amd.js.map +1 -1
  87. package/tabs/tabs.js.map +1 -1
  88. package/tabsView/tabsView.amd.js +1 -1
  89. package/tabsView/tabsView.amd.js.map +1 -1
  90. package/tabsView/tabsView.js +1 -1
  91. package/tabsView/tabsView.js.map +1 -1
  92. package/utils/check.amd.js.map +1 -1
  93. package/utils/check.js.map +1 -1
  94. package/utils/clipboard.amd.js.map +1 -1
  95. package/utils/clipboard.js.map +1 -1
  96. package/utils/date.amd.js +1 -1
  97. package/utils/date.js +1 -1
  98. package/utils/device.amd.js +1 -1
  99. package/utils/device.js +1 -1
  100. package/utils/dom.amd.js.map +1 -1
  101. package/utils/dom.js.map +1 -1
  102. package/utils/image.amd.js.map +1 -1
  103. package/utils/image.js.map +1 -1
  104. package/utils/keyboard.amd.js.map +1 -1
  105. package/utils/keyboard.js.map +1 -1
  106. package/utils/lodash.amd.js +1 -1
  107. package/utils/lodash.js +1 -1
  108. package/utils/number.amd.js.map +1 -1
  109. package/utils/number.js.map +1 -1
  110. package/utils/price.amd.js +1 -1
  111. package/utils/price.amd.js.map +1 -1
  112. package/utils/price.js +1 -1
  113. package/utils/price.js.map +1 -1
  114. package/utils/route.amd.js.map +1 -1
  115. package/utils/route.js.map +1 -1
  116. package/utils/scroll.amd.js.map +1 -1
  117. package/utils/scroll.js.map +1 -1
  118. package/utils/searchers.amd.js.map +1 -1
  119. package/utils/searchers.js.map +1 -1
  120. package/utils/string.amd.js +1 -1
  121. package/utils/string.amd.js.map +1 -1
  122. package/utils/string.js +1 -1
  123. package/utils/string.js.map +1 -1
  124. package/utils/system.amd.js.map +1 -1
  125. package/utils/system.js.map +1 -1
  126. package/utils/url.amd.js.map +1 -1
  127. package/utils/url.js.map +1 -1
  128. package/web-types.json +89 -89
  129. package/.chunks/datepicker-Cs3C14z5.amd.js +0 -248
  130. package/.chunks/datepicker-Cs3C14z5.amd.js.map +0 -1
  131. package/.chunks/datepicker-LNkS97nF.es.js +0 -290
  132. package/.chunks/datepicker-LNkS97nF.es.js.map +0 -1
  133. package/.chunks/forms-BydHEF-k.es.js.map +0 -1
  134. package/.chunks/forms-Cq5zFLsO.amd.js.map +0 -1
  135. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-B0xTxYZR.amd.js.map +0 -1
  136. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-DinMn3Ud.es.js.map +0 -1
  137. package/.chunks/menu.vue_vue_type_style_index_0_lang-BT-PgdJ5.amd.js.map +0 -1
  138. package/.chunks/menu.vue_vue_type_style_index_0_lang-C585WUlJ.es.js.map +0 -1
  139. package/.chunks/popup-B7AaTfNZ.es.js.map +0 -1
  140. package/.chunks/popup-D22VHVHf.amd.js.map +0 -1
  141. package/common/common.amd.js +0 -2
  142. package/common/common.amd.js.map +0 -1
  143. package/common/common.d.ts +0 -1
  144. package/common/common.js +0 -2
  145. package/common/common.js.map +0 -1
  146. package/components/common/common.d.ts +0 -0
  147. package/components/common/icon/icon.d.ts +0 -4
  148. /package/components/forms/button/{button.d.ts → types.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listItem.vue_vue_type_script_setup_true_lang-CILdtVxX.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\">\r\nimport { onUpdated } from 'vue';\r\nimport type { OpenerProps } from './popup';\r\n\r\nconst props = withDefaults(defineProps<OpenerProps>(), {\r\n\tpos: '3',\r\n\tnotch: true,\r\n\tposBy: 'fixed',\r\n});\r\n\r\nconst id = props.id || Math.random() + '';\r\n\r\nlet elOpener: Element;\r\n\r\n/**\r\n * Необычная функция для проброски props внтурь элемента слота\r\n *\r\n * @param el - вспомогательрный элемент для доступа к элементам слота\r\n */\r\nfunction render(el: any) {\r\n\tsetTimeout(() => {\r\n\t\telOpener = el.nextElementSibling;\r\n\r\n\t\tif (elOpener) {\r\n\t\t\trenderOpener(elOpener);\r\n\t\t}\r\n\t});\r\n}\r\n\r\nonUpdated(() => {\r\n\tif (elOpener) {\r\n\t\trenderOpener(elOpener);\r\n\t}\r\n});\r\n\r\nfunction renderOpener(elOpener: any) {\r\n\t/**\r\n\t * topPopup - необходимый атрибут для всез Popup\r\n\t *\r\n\t * Для Vue вместо него используется атрибут topPopupId\r\n\t */\r\n\telOpener.dataset.topPopup = '#' + id;\r\n\r\n\telOpener.dataset.topPopupId = id;\r\n\telOpener.dataset.topPopupPos = props.pos;\r\n\telOpener.dataset.topPopupPosBy = props.posBy;\r\n\telOpener.dataset.topPopupNotch = props.notch ? 'true' : '';\r\n\telOpener.dataset.topPopupOpenByHover = props.openByHover ? 'true' : '';\r\n}\r\n</script>\r\n\r\n<template>\r\n\t<template :ref=\"render\"></template>\r\n\r\n\t<!-- @slot элемент для открытия Popup -->\r\n\t<slot></slot>\r\n</template>\r\n\r\n<!-- Использует общий deprecated класс .btn -->\r\n<style>\r\nh3[data-top-popup],\r\ndiv[data-top-popup],\r\ni[data-top-popup]:not(.btn),\r\nb[data-top-popup]:not(.btn) {\r\n\tcursor: pointer;\r\n\tuser-select: none;\r\n\tfont-style: normal;\r\n\ttext-decoration: none;\r\n\tdisplay: inline-flex;\r\n\talign-items: center;\r\n}\r\n\r\n[data-top-popup][data-top-popup-disabled] {\r\n\tpointer-events: none;\r\n\tcursor: auto !important;\r\n}\r\n\r\ni[contenteditable] {\r\n\tcursor: text !important;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { onUnmounted, ref, toRef, watch } from 'vue';\r\nimport TopHint from '@/components/forms/hint/hint.vue';\r\nimport type PopupClass from '@/components/popup/lib/popup';\r\nimport type { Emits, Props } from './popup';\r\nimport Opener from './opener.vue';\r\nimport Worker from '@/components/popup/lib/worker';\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\tid: '',\r\n\tpos: '3',\r\n\tnotch: true,\r\n\tposBy: 'fixed',\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst expose = {\r\n\tpopup: undefined as PopupClass | undefined,\r\n};\r\ndefineExpose(expose);\r\n\r\nconst id = props.id || 'top-popup-id-' + Math.random() + '';\r\n\r\nconst elPopupRef = ref<HTMLElement | null>(null);\r\nconst elPopupInnerRef = ref<HTMLElement | null>(null);\r\n\r\n// см. lib/popup\r\nconst onOpen = async (popup: PopupClass) => {\r\n\tif (popup.elPopup) elPopupRef.value = popup.elPopup;\r\n\r\n\tif (popup.elPopupInner) {\r\n\t\tpopup.elPopupInner.innerText = '';\r\n\r\n\t\telPopupInnerRef.value = popup.elPopupInner;\r\n\t}\r\n\r\n\tvueConnector.opened = true;\r\n\tvueConnector.popup = popup;\r\n\r\n\texpose.popup = popup;\r\n\r\n\temit('open', { elPopup: popup.elPopup!, elPopupOpener: popup.el });\r\n};\r\n\r\n// см. lib/popup\r\nconst onClose = (popup: PopupClass) => {\r\n\telPopupInnerRef.value = null;\r\n\r\n\tvueConnector.opened = false;\r\n\tvueConnector.popup = undefined;\r\n\r\n\temit('close', { elPopup: popup.elPopup!, elPopupOpener: popup.el });\r\n};\r\n\r\nconst vueConnector = {\r\n\tonOpen,\r\n\tonClose,\r\n\tclassRef: toRef(props, 'class'),\r\n\topened: false,\r\n\tpopup: undefined as PopupClass | undefined,\r\n\ttransitionDurationRef: toRef(props, 'transitionDuration'),\r\n};\r\n\r\nwatch(() => props.class, (newValue, oldValue) => {\r\n\tif (!elPopupRef.value) return;\r\n\r\n\tconst newClasses = newValue?.split(' ') ?? [];\r\n\tconst oldClasses = oldValue?.split(' ') ?? [];\r\n\r\n\tconst delClasses = oldClasses.filter((oldClass) => !newClasses.includes(oldClass));\r\n\r\n\telPopupRef.value.classList.remove(...delClasses);\r\n\telPopupRef.value.classList.add(...newClasses);\r\n});\r\n\r\nWorker.regVueComponent(id, vueConnector);\r\n\r\nonUnmounted(() => {\r\n\tWorker.unregVueComponent(id);\r\n});\r\n</script>\r\n\r\n<template>\r\n\t<Opener\r\n\t\tv-if=\"$slots.opener\"\r\n\t\t:id=\"id\"\r\n\t\t:pos=\"pos\"\r\n\t\t:posBy=\"posBy\"\r\n\t\t:notch=\"notch\"\r\n\t\t:openByHover=\"openByHover\"\r\n\t>\r\n\t\t<!-- @slot элемент для открытия Popup -->\r\n\t\t<slot name=\"opener\"></slot>\r\n\t</Opener>\r\n\r\n\t<!-- Это шаблон для компонента Popup, сам Popup генерируется в js и может находиться где угодно -->\r\n\t<!-- elPopupInnerRef будет установлен только после открытия и будет сброшен сразу после закрытия Popup -->\r\n\t<teleport\r\n\t\tv-if=\"elPopupInnerRef\"\r\n\t\t:to=\"elPopupInnerRef\"\r\n\t>\r\n\t\t<div v-if=\"$slots.header || $core.state.isMobile\" class=\"top-popup_header\">\r\n\t\t\t<span\r\n\t\t\t\tv-if=\"$core.state.isMobile\"\r\n\t\t\t\tclass=\"top-as-a closer\"\r\n\t\t\t>\r\n\t\t\t\t{{ $i18n.Common.Close }}\r\n\t\t\t</span>\r\n\r\n\t\t\t<!-- @slot Шапка -->\r\n\t\t\t<slot name=\"header\"></slot>\r\n\t\t</div>\r\n\r\n\t\t<div v-if=\"$slots.widget\" class=\"top-popup_widget\">\r\n\t\t\t<!-- @slot Виджет -->\r\n\t\t\t<slot name=\"widget\"></slot>\r\n\t\t</div>\r\n\r\n\t\t<div v-if=\"$slots.content\" class=\"top-popup_content\">\r\n\t\t\t<!-- @slot Контент в свободной форме -->\r\n\t\t\t<slot name=\"content\"></slot>\r\n\t\t</div>\r\n\r\n\t\t<ul\r\n\t\t\tv-if=\"$slots.contentList\"\r\n\t\t\tclass=\"top-popup_content\"\r\n\t\t\t@scroll=\"$emit('scrollContentList', $event)\"\r\n\t\t>\r\n\t\t\t<!-- @slot Контент в виде списка, для вставки элементов списка используйте компонент popup/listItem -->\r\n\t\t\t<slot name=\"contentList\"></slot>\r\n\t\t</ul>\r\n\r\n\t\t<div v-if=\"$slots.footer || footerSupportLink\" class=\"top-popup_footer\">\r\n\t\t\t<a\r\n\t\t\t\tv-if=\"footerSupportLink\"\r\n\t\t\t\tclass=\"top-popup_footerSupportLink\"\r\n\t\t\t\t:href=\"footerSupportLink\"\r\n\t\t\t\ttarget=\"_blank\"\r\n\t\t\t>\r\n\t\t\t\t<TopHint hint=\"\"/>\r\n\t\t\t</a>\r\n\r\n\t\t\t<!-- @slot Футер -->\r\n\t\t\t<slot name=\"footer\"></slot>\r\n\t\t</div>\r\n\t</teleport>\r\n</template>\r\n\r\n<style>\r\n.top-popup_footerSupportLink {\r\n\tmargin-right: auto;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport type { ListItemProps } from './popup';\r\n\r\ndefineOptions({\r\n\tinheritAttrs: false,\r\n});\r\n\r\nconst props = withDefaults(defineProps<ListItemProps>(), {\r\n\ttype: 'button',\r\n\tcloseByClick: true,\r\n});\r\n</script>\r\n\r\n<template>\r\n\t<li\r\n\t\t:class=\"{\r\n\t\t'top-popup_liNoSelectable': props.type !== 'button'\r\n\t}\"\r\n\t>\r\n\t\t<component\r\n\t\t\t:is=\"$attrs.href ? 'a' : 'div'\"\r\n\t\t\t:class=\"{\r\n\t\t\t\t'top-popup_listItem': true,\r\n\t\t\t\t'top-popup_listItem-button': props.type === 'button', // оформления кнопки\r\n\t\t\t\t'a': props.type === 'button', // оформления кнопки, deprecated\r\n\t\t\t\t'top-popup_listItem-title': props.type === 'title',\r\n\t\t\t\t'top-popup_listItem-delimiter': props.type === 'delimiter',\r\n\t\t\t\t'top-popup-noCloser': !closeByClick\r\n\t\t\t}\"\r\n\t\t\t:=$attrs\r\n\t\t>\r\n\t\t\t<slot></slot>\r\n\t\t</component>\r\n\t</li>\r\n</template>\r\n"],"names":["props","__props","id","elOpener","render","el","renderOpener","onUpdated","elOpener2","emit","__emit","expose","__expose","elPopupRef","ref","elPopupInnerRef","vueConnector","popup","toRef","watch","newValue","oldValue","newClasses","delClasses","oldClass","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;AAMC,MAAAA,EAAA,QAAA,WAAA,MAAAN,GAEAM,EAAA,QAAA,aAAAN,GACAM,EAAA,QAAA,cAAAR,EAAA,KACAQ,EAAA,QAAA,gBAAAR,EAAA,OACAQ,EAAA,QAAA,gBAAAR,EAAA,QAAA,SAAA,IACAQ,EAAA,QAAA,sBAAAR,EAAA,cAAA,SAAA;AAAA,IAAoE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvCrE,UAAAA,IAAAC,GAOAQ,IAAAC,GAEAC,IAAA;AAAA,MAAe,OAAA;AAAA,IACP;AAER,IAAAC,EAAAD,CAAA;AAEA,UAAAT,IAAAF,EAAA,MAAA,kBAAA,KAAA,OAAA,GAEAa,IAAAC,EAAA,IAAA,GACAC,IAAAD,EAAA,IAAA,GA8BAE,IAAA;AAAA,MAAqB,QA3BrB,OAAAC,MAAA;AACC,QAAAA,EAAA,YAAAJ,EAAA,QAAAI,EAAA,UAEAA,EAAA,iBACCA,EAAA,aAAA,YAAA,IAEAF,EAAA,QAAAE,EAAA,eAGDD,EAAA,SAAA,IACAA,EAAA,QAAAC,GAEAN,EAAA,QAAAM,GAEAR,EAAA,QAAA,EAAA,SAAAQ,EAAA,SAAA,eAAAA,EAAA,GAAA,CAAA;AAAA,MAAiE;AAAA,MAcjE,SAVD,CAAAA,MAAA;AACC,QAAAF,EAAA,QAAA,MAEAC,EAAA,SAAA,IACAA,EAAA,QAAA,QAEAP,EAAA,SAAA,EAAA,SAAAQ,EAAA,SAAA,eAAAA,EAAA,GAAA,CAAA;AAAA,MAAkE;AAAA,MAKlE,UAAAC,EAAAlB,GAAA,OAAA;AAAA,MAC8B,QAAA;AAAA,MACtB,OAAA;AAAA,MACD,uBAAAkB,EAAAlB,GAAA,oBAAA;AAAA,IACiD;AAGzD,WAAAmB,EAAA,MAAAnB,EAAA,OAAA,CAAAoB,GAAAC,MAAA;AACC,UAAA,CAAAR,EAAA,MAAA;AAEA,YAAAS,KAAAF,KAAA,gBAAAA,EAAA,MAAA,SAAA,CAAA,GAGAG,MAFAF,KAAA,gBAAAA,EAAA,MAAA,SAAA,CAAA,GAEA,OAAA,CAAAG,MAAA,CAAAF,EAAA,SAAAE,CAAA,CAAA;AAEA,MAAAX,EAAA,MAAA,UAAA,OAAA,GAAAU,CAAA,GACAV,EAAA,MAAA,UAAA,IAAA,GAAAS,CAAA;AAAA,IAA4C,CAAA,GAG7CG,EAAA,gBAAAvB,GAAAc,CAAA,GAEAU,EAAA,MAAA;AACC,MAAAD,EAAA,kBAAAvB,CAAA;AAAA,IAA2B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxE5B,UAAAF,IAAAC;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,2 +1,2 @@
1
- define(["require","exports","vue","./forms-Cq5zFLsO.amd","../popup/worker.amd","../require/css.amd!../assets/listItem.css"],function(I,f,e,y,B){"use strict";if(typeof e>"u")var e=window.Vue;const k=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,p=n.id||Math.random()+"";let s;function u(t){setTimeout(()=>{s=t.nextElementSibling,s&&a(s)})}e.onUpdated(()=>{s&&a(s)});function a(t){t.dataset.topPopup="#"+p,t.dataset.topPopupId=p,t.dataset.topPopupPos=n.pos,t.dataset.topPopupPosBy=n.posBy,t.dataset.topPopupNotch=n.notch?"true":"",t.dataset.topPopupOpenByHover=n.openByHover?"true":""}return(t,i)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createElementVNode("template",{ref:u}),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"},P={key:4,class:"top-popup_footer"},_=["href"],S=e.defineComponent({__name:"popup",props:{id:{default:""},class:{},transitionDuration:{},footerSupportLink:{},pos:{default:"3"},notch:{type:Boolean,default:!0},openByHover:{type:Boolean},posBy:{default:"fixed"}},emits:["open","close","scrollContentList"],setup(r,{expose:n,emit:p}){const s=r,u=p,a={popup:void 0};n(a);const t=s.id||"top-popup-id-"+Math.random(),i=e.ref(null),d=e.ref(null),c={onOpen:async o=>{o.elPopup&&(i.value=o.elPopup),o.elPopupInner&&(o.elPopupInner.innerText="",d.value=o.elPopupInner),c.opened=!0,c.popup=o,a.popup=o,u("open",{elPopup:o.elPopup,elPopupOpener:o.el})},onClose:o=>{d.value=null,c.opened=!1,c.popup=void 0,u("close",{elPopup:o.elPopup,elPopupOpener:o.el})},classRef:e.toRef(s,"class"),opened:!1,popup:void 0,transitionDurationRef:e.toRef(s,"transitionDuration")};return e.watch(()=>s.class,(o,l)=>{if(!i.value)return;const m=(o==null?void 0:o.split(" "))??[],E=((l==null?void 0:l.split(" "))??[]).filter(g=>!m.includes(g));i.value.classList.remove(...E),i.value.classList.add(...m)}),B.TopPopupWorker.regVueComponent(t,c),e.onUnmounted(()=>{B.TopPopupWorker.unregVueComponent(t)}),(o,l)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[o.$slots.opener?(e.openBlock(),e.createBlock(k,{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),d.value?(e.openBlock(),e.createBlock(e.Teleport,{key:1,to:d.value},[o.$slots.header||o.$core.state.isMobile?(e.openBlock(),e.createElementBlock("div",C,[o.$core.state.isMobile?(e.openBlock(),e.createElementBlock("span",v,e.toDisplayString(o.$i18n.Common.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:l[0]||(l[0]=m=>o.$emit("scrollContentList",m))},[e.renderSlot(o.$slots,"contentList")],32)):e.createCommentVNode("",!0),o.$slots.footer||o.footerSupportLink?(e.openBlock(),e.createElementBlock("div",P,[o.footerSupportLink?(e.openBlock(),e.createElementBlock("a",{key:0,class:"top-popup_footerSupportLink",href:o.footerSupportLink,target:"_blank"},[e.createVNode(y._sfc_main$1,{hint:""})],8,_)):e.createCommentVNode("",!0),e.renderSlot(o.$slots,"footer")])):e.createCommentVNode("",!0)],8,["to"])):e.createCommentVNode("",!0)],64))}}),N=e.defineComponent({inheritAttrs:!1,__name:"listItem",props:{type:{default:"button"},closeByClick:{type:Boolean,default:!0}},setup(r){const n=r;return(p,s)=>(e.openBlock(),e.createElementBlock("li",{class:e.normalizeClass({"top-popup_liNoSelectable":n.type!=="button"})},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(p.$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":!p.closeByClick}},p.$attrs),{default:e.withCtx(()=>[e.renderSlot(p.$slots,"default")]),_:3},16,["class"]))],2))}});f._sfc_main=S,f._sfc_main$1=k,f._sfc_main$2=N});
2
- //# sourceMappingURL=listItem.vue_vue_type_script_setup_true_lang-B0xTxYZR.amd.js.map
1
+ define(["require","exports","vue","./forms-BOqxOjGU.amd","../popup/worker.amd","../require/css.amd!../assets/listItem.css"],function(I,f,e,y,B){"use strict";if(typeof e>"u")var e=window.Vue;const k=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,p=n.id||Math.random()+"";let s;function u(t){setTimeout(()=>{s=t.nextElementSibling,s&&a(s)})}e.onUpdated(()=>{s&&a(s)});function a(t){t.dataset.topPopup="#"+p,t.dataset.topPopupId=p,t.dataset.topPopupPos=n.pos,t.dataset.topPopupPosBy=n.posBy,t.dataset.topPopupNotch=n.notch?"true":"",t.dataset.topPopupOpenByHover=n.openByHover?"true":""}return(t,i)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createElementVNode("template",{ref:u}),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"},P={key:4,class:"top-popup_footer"},_=["href"],S=e.defineComponent({__name:"popup",props:{id:{default:""},class:{},transitionDuration:{},footerSupportLink:{},pos:{default:"3"},notch:{type:Boolean,default:!0},openByHover:{type:Boolean},posBy:{default:"fixed"}},emits:["open","close","scrollContentList"],setup(r,{expose:n,emit:p}){const s=r,u=p,a={popup:void 0};n(a);const t=s.id||"top-popup-id-"+Math.random(),i=e.ref(null),d=e.ref(null),c={onOpen:async o=>{o.elPopup&&(i.value=o.elPopup),o.elPopupInner&&(o.elPopupInner.innerText="",d.value=o.elPopupInner),c.opened=!0,c.popup=o,a.popup=o,u("open",{elPopup:o.elPopup,elPopupOpener:o.el})},onClose:o=>{d.value=null,c.opened=!1,c.popup=void 0,u("close",{elPopup:o.elPopup,elPopupOpener:o.el})},classRef:e.toRef(s,"class"),opened:!1,popup:void 0,transitionDurationRef:e.toRef(s,"transitionDuration")};return e.watch(()=>s.class,(o,l)=>{if(!i.value)return;const m=(o==null?void 0:o.split(" "))??[],E=((l==null?void 0:l.split(" "))??[]).filter(g=>!m.includes(g));i.value.classList.remove(...E),i.value.classList.add(...m)}),B.TopPopupWorker.regVueComponent(t,c),e.onUnmounted(()=>{B.TopPopupWorker.unregVueComponent(t)}),(o,l)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[o.$slots.opener?(e.openBlock(),e.createBlock(k,{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),d.value?(e.openBlock(),e.createBlock(e.Teleport,{key:1,to:d.value},[o.$slots.header||o.$core.state.isMobile?(e.openBlock(),e.createElementBlock("div",C,[o.$core.state.isMobile?(e.openBlock(),e.createElementBlock("span",v,e.toDisplayString(o.$i18n.Common.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:l[0]||(l[0]=m=>o.$emit("scrollContentList",m))},[e.renderSlot(o.$slots,"contentList")],32)):e.createCommentVNode("",!0),o.$slots.footer||o.footerSupportLink?(e.openBlock(),e.createElementBlock("div",P,[o.footerSupportLink?(e.openBlock(),e.createElementBlock("a",{key:0,class:"top-popup_footerSupportLink",href:o.footerSupportLink,target:"_blank"},[e.createVNode(y._sfc_main$1,{hint:""})],8,_)):e.createCommentVNode("",!0),e.renderSlot(o.$slots,"footer")])):e.createCommentVNode("",!0)],8,["to"])):e.createCommentVNode("",!0)],64))}}),N=e.defineComponent({inheritAttrs:!1,__name:"listItem",props:{type:{default:"button"},closeByClick:{type:Boolean,default:!0}},setup(r){const n=r;return(p,s)=>(e.openBlock(),e.createElementBlock("li",{class:e.normalizeClass({"top-popup_liNoSelectable":n.type!=="button"})},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(p.$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":!p.closeByClick}},p.$attrs),{default:e.withCtx(()=>[e.renderSlot(p.$slots,"default")]),_:3},16,["class"]))],2))}});f._sfc_main=S,f._sfc_main$1=k,f._sfc_main$2=N});
2
+ //# sourceMappingURL=listItem.vue_vue_type_script_setup_true_lang-DNqgt-07.amd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listItem.vue_vue_type_script_setup_true_lang-DNqgt-07.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\">\r\nimport { onUpdated } from 'vue';\r\nimport type { OpenerProps } from './popup';\r\n\r\nconst props = withDefaults(defineProps<OpenerProps>(), {\r\n\tpos: '3',\r\n\tnotch: true,\r\n\tposBy: 'fixed',\r\n});\r\n\r\nconst id = props.id || Math.random() + '';\r\n\r\nlet elOpener: Element;\r\n\r\n/**\r\n * Необычная функция для проброски props внтурь элемента слота\r\n *\r\n * @param el - вспомогательрный элемент для доступа к элементам слота\r\n */\r\nfunction render(el: any) {\r\n\tsetTimeout(() => {\r\n\t\telOpener = el.nextElementSibling;\r\n\r\n\t\tif (elOpener) {\r\n\t\t\trenderOpener(elOpener);\r\n\t\t}\r\n\t});\r\n}\r\n\r\nonUpdated(() => {\r\n\tif (elOpener) {\r\n\t\trenderOpener(elOpener);\r\n\t}\r\n});\r\n\r\nfunction renderOpener(elOpener: any) {\r\n\t/**\r\n\t * topPopup - необходимый атрибут для всез Popup\r\n\t *\r\n\t * Для Vue вместо него используется атрибут topPopupId\r\n\t */\r\n\telOpener.dataset.topPopup = '#' + id;\r\n\r\n\telOpener.dataset.topPopupId = id;\r\n\telOpener.dataset.topPopupPos = props.pos;\r\n\telOpener.dataset.topPopupPosBy = props.posBy;\r\n\telOpener.dataset.topPopupNotch = props.notch ? 'true' : '';\r\n\telOpener.dataset.topPopupOpenByHover = props.openByHover ? 'true' : '';\r\n}\r\n</script>\r\n\r\n<template>\r\n\t<template :ref=\"render\"></template>\r\n\r\n\t<!-- @slot элемент для открытия Popup -->\r\n\t<slot></slot>\r\n</template>\r\n\r\n<!-- Использует общий deprecated класс .btn -->\r\n<style>\r\nh3[data-top-popup],\r\ndiv[data-top-popup],\r\ni[data-top-popup]:not(.btn),\r\nb[data-top-popup]:not(.btn) {\r\n\tcursor: pointer;\r\n\tuser-select: none;\r\n\tfont-style: normal;\r\n\ttext-decoration: none;\r\n\tdisplay: inline-flex;\r\n\talign-items: center;\r\n}\r\n\r\n[data-top-popup][data-top-popup-disabled] {\r\n\tpointer-events: none;\r\n\tcursor: auto !important;\r\n}\r\n\r\ni[contenteditable] {\r\n\tcursor: text !important;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { onUnmounted, ref, toRef, watch } from 'vue';\r\nimport TopHint from '@/components/forms/hint/hint.vue';\r\nimport type PopupClass from '@/components/popup/lib/popup';\r\nimport type { Emits, Props } from './popup';\r\nimport Opener from './opener.vue';\r\nimport Worker from '@/components/popup/lib/worker';\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\tid: '',\r\n\tpos: '3',\r\n\tnotch: true,\r\n\tposBy: 'fixed',\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst expose = {\r\n\tpopup: undefined as PopupClass | undefined,\r\n};\r\ndefineExpose(expose);\r\n\r\nconst id = props.id || 'top-popup-id-' + Math.random() + '';\r\n\r\nconst elPopupRef = ref<HTMLElement | null>(null);\r\nconst elPopupInnerRef = ref<HTMLElement | null>(null);\r\n\r\n// см. lib/popup\r\nconst onOpen = async (popup: PopupClass) => {\r\n\tif (popup.elPopup) elPopupRef.value = popup.elPopup;\r\n\r\n\tif (popup.elPopupInner) {\r\n\t\tpopup.elPopupInner.innerText = '';\r\n\r\n\t\telPopupInnerRef.value = popup.elPopupInner;\r\n\t}\r\n\r\n\tvueConnector.opened = true;\r\n\tvueConnector.popup = popup;\r\n\r\n\texpose.popup = popup;\r\n\r\n\temit('open', { elPopup: popup.elPopup!, elPopupOpener: popup.el });\r\n};\r\n\r\n// см. lib/popup\r\nconst onClose = (popup: PopupClass) => {\r\n\telPopupInnerRef.value = null;\r\n\r\n\tvueConnector.opened = false;\r\n\tvueConnector.popup = undefined;\r\n\r\n\temit('close', { elPopup: popup.elPopup!, elPopupOpener: popup.el });\r\n};\r\n\r\nconst vueConnector = {\r\n\tonOpen,\r\n\tonClose,\r\n\tclassRef: toRef(props, 'class'),\r\n\topened: false,\r\n\tpopup: undefined as PopupClass | undefined,\r\n\ttransitionDurationRef: toRef(props, 'transitionDuration'),\r\n};\r\n\r\nwatch(() => props.class, (newValue, oldValue) => {\r\n\tif (!elPopupRef.value) return;\r\n\r\n\tconst newClasses = newValue?.split(' ') ?? [];\r\n\tconst oldClasses = oldValue?.split(' ') ?? [];\r\n\r\n\tconst delClasses = oldClasses.filter((oldClass) => !newClasses.includes(oldClass));\r\n\r\n\telPopupRef.value.classList.remove(...delClasses);\r\n\telPopupRef.value.classList.add(...newClasses);\r\n});\r\n\r\nWorker.regVueComponent(id, vueConnector);\r\n\r\nonUnmounted(() => {\r\n\tWorker.unregVueComponent(id);\r\n});\r\n</script>\r\n\r\n<template>\r\n\t<Opener\r\n\t\tv-if=\"$slots.opener\"\r\n\t\t:id=\"id\"\r\n\t\t:pos=\"pos\"\r\n\t\t:posBy=\"posBy\"\r\n\t\t:notch=\"notch\"\r\n\t\t:openByHover=\"openByHover\"\r\n\t>\r\n\t\t<!-- @slot элемент для открытия Popup -->\r\n\t\t<slot name=\"opener\"></slot>\r\n\t</Opener>\r\n\r\n\t<!-- Это шаблон для компонента Popup, сам Popup генерируется в js и может находиться где угодно -->\r\n\t<!-- elPopupInnerRef будет установлен только после открытия и будет сброшен сразу после закрытия Popup -->\r\n\t<teleport\r\n\t\tv-if=\"elPopupInnerRef\"\r\n\t\t:to=\"elPopupInnerRef\"\r\n\t>\r\n\t\t<div v-if=\"$slots.header || $core.state.isMobile\" class=\"top-popup_header\">\r\n\t\t\t<span\r\n\t\t\t\tv-if=\"$core.state.isMobile\"\r\n\t\t\t\tclass=\"top-as-a closer\"\r\n\t\t\t>\r\n\t\t\t\t{{ $i18n.Common.Close }}\r\n\t\t\t</span>\r\n\r\n\t\t\t<!-- @slot Шапка -->\r\n\t\t\t<slot name=\"header\"></slot>\r\n\t\t</div>\r\n\r\n\t\t<div v-if=\"$slots.widget\" class=\"top-popup_widget\">\r\n\t\t\t<!-- @slot Виджет -->\r\n\t\t\t<slot name=\"widget\"></slot>\r\n\t\t</div>\r\n\r\n\t\t<div v-if=\"$slots.content\" class=\"top-popup_content\">\r\n\t\t\t<!-- @slot Контент в свободной форме -->\r\n\t\t\t<slot name=\"content\"></slot>\r\n\t\t</div>\r\n\r\n\t\t<ul\r\n\t\t\tv-if=\"$slots.contentList\"\r\n\t\t\tclass=\"top-popup_content\"\r\n\t\t\t@scroll=\"$emit('scrollContentList', $event)\"\r\n\t\t>\r\n\t\t\t<!-- @slot Контент в виде списка, для вставки элементов списка используйте компонент popup/listItem -->\r\n\t\t\t<slot name=\"contentList\"></slot>\r\n\t\t</ul>\r\n\r\n\t\t<div v-if=\"$slots.footer || footerSupportLink\" class=\"top-popup_footer\">\r\n\t\t\t<a\r\n\t\t\t\tv-if=\"footerSupportLink\"\r\n\t\t\t\tclass=\"top-popup_footerSupportLink\"\r\n\t\t\t\t:href=\"footerSupportLink\"\r\n\t\t\t\ttarget=\"_blank\"\r\n\t\t\t>\r\n\t\t\t\t<TopHint hint=\"\"/>\r\n\t\t\t</a>\r\n\r\n\t\t\t<!-- @slot Футер -->\r\n\t\t\t<slot name=\"footer\"></slot>\r\n\t\t</div>\r\n\t</teleport>\r\n</template>\r\n\r\n<style>\r\n.top-popup_footerSupportLink {\r\n\tmargin-right: auto;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport type { ListItemProps } from './popup';\r\n\r\ndefineOptions({\r\n\tinheritAttrs: false,\r\n});\r\n\r\nconst props = withDefaults(defineProps<ListItemProps>(), {\r\n\ttype: 'button',\r\n\tcloseByClick: true,\r\n});\r\n</script>\r\n\r\n<template>\r\n\t<li\r\n\t\t:class=\"{\r\n\t\t'top-popup_liNoSelectable': props.type !== 'button'\r\n\t}\"\r\n\t>\r\n\t\t<component\r\n\t\t\t:is=\"$attrs.href ? 'a' : 'div'\"\r\n\t\t\t:class=\"{\r\n\t\t\t\t'top-popup_listItem': true,\r\n\t\t\t\t'top-popup_listItem-button': props.type === 'button', // оформления кнопки\r\n\t\t\t\t'a': props.type === 'button', // оформления кнопки, deprecated\r\n\t\t\t\t'top-popup_listItem-title': props.type === 'title',\r\n\t\t\t\t'top-popup_listItem-delimiter': props.type === 'delimiter',\r\n\t\t\t\t'top-popup-noCloser': !closeByClick\r\n\t\t\t}\"\r\n\t\t\t:=$attrs\r\n\t\t>\r\n\t\t\t<slot></slot>\r\n\t\t</component>\r\n\t</li>\r\n</template>\r\n"],"names":["props","__props","id","render","el","elOpener","renderOpener","elOpener2","emit","__emit","__expose","expose","elPopupRef","vue","elPopupInnerRef","popup","vueConnector","delClasses","oldClass","newClasses","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,0BAQCA,EAAA,QAAA,WAAAL,8DAGAK,EAAA,QAAA,cAAAP,EAAA,MAAA,OAAA,GACAO,EAAA,QAAA,oBAAAP,EAAA,YAAA,OAAA,6mBCvCD,MAAAA,EAAAC,EAOAO,EAAAC,iBAGQ,EAERC,EAAAC,CAAA,EAEA,MAAAT,EAAAF,EAAA,IAAA,gBAAA,KAAA,OAAA,EAEAY,EAAAC,EAAA,IAAA,IAAA,EACAC,EAAAD,EAAA,IAAA,IAAA,KA8BqB,OA3BrB,MAAAE,GAAA,CACCA,EAAA,UAAAH,EAAA,MAAAG,EAAA,SAEAA,EAAA,eACCA,EAAA,aAAA,UAAA,GAEAD,EAAA,MAAAC,EAAA,cAGDC,EAAA,OAAA,GACAA,EAAA,MAAAD,EAEAJ,EAAA,MAAAI,EAEAP,EAAA,OAAA,CAAA,QAAAO,EAAA,QAAA,cAAAA,EAAA,EAAA,CAAA,CAAiE,EAcjE,QAVDA,GAAA,CACCD,EAAA,MAAA,KAEAE,EAAA,OAAA,GACAA,EAAA,MAAA,OAEAR,EAAA,QAAA,CAAA,QAAAO,EAAA,QAAA,cAAAA,EAAA,EAAA,CAAA,CAAkE,EAKlE,SAAAF,EAAA,MAAAb,EAAA,OAAA,yBAGO,sBAAAa,EAAA,MAAAb,EAAA,oBAAA,CACiD,qCAIxD,GAAA,CAAAY,EAAA,MAAA,iDAKAK,sCAAA,OAAAC,GAAA,CAAAC,EAAA,SAAAD,CAAA,CAAA,4DAG4C,CAAA,2DAM5CE,EAAA,eAAA,kBAAAlB,CAAA,CAA2B,CAAA,grDCxE5B,MAAAF,EAAAC"}
@@ -1,6 +1,6 @@
1
1
  import { Core as S } from "../core/app.js";
2
2
  import { defineComponent as E, mergeModels as W, useModel as w, ref as N, onMounted as T, onUpdated as P, openBlock as c, createElementBlock as f, normalizeClass as $, Fragment as b, renderList as q, createBlock as D, mergeProps as d, createSlots as y, withCtx as h, createTextVNode as g, toDisplayString as A, createVNode as K, createCommentVNode as Y } from "vue";
3
- import { _ as M, i as x, C as z } from "./forms-BydHEF-k.es.js";
3
+ import { _ as M, i as x, C as z } from "./forms-B6DA2YGV.es.js";
4
4
  const I = ["../assets/menu.css"].map((n) => import.meta.resolve(n));
5
5
  S.insertCSSLinkToPage(I, !0);
6
6
  const F = {
@@ -106,4 +106,4 @@ const F = {
106
106
  export {
107
107
  G as _
108
108
  };
109
- //# sourceMappingURL=menu.vue_vue_type_style_index_0_lang-C585WUlJ.es.js.map
109
+ //# sourceMappingURL=menu.vue_vue_type_style_index_0_lang-DNejp6r9.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.vue_vue_type_style_index_0_lang-DNejp6r9.es.js","sources":["../../src/components/formsExt/menu/menu.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { onMounted, onUpdated, ref } from 'vue';\r\nimport type { Item, Props } from './menu';\r\nimport Core from '@/core/core/core';\r\nimport { isSafari } from '@/core/utils/device';\r\nimport TopButton from '@/components/forms/button/button.vue';\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\tstyling: 'default',\r\n});\r\n\r\nconst model = defineModel({\r\n\trequired: true,\r\n});\r\n\r\nconst el = ref();\r\n\r\n// валидация типа modelValue без возможности выбора нескольких значений (ожидается строка)\r\nif (!props.isMultiple && !(typeof (model.value) === 'string' || model.value instanceof String)) {\r\n\tconsole.warn('Type check failed for prop \"modelValue\". Expected String: ' + typeof (model.value));\r\n}\r\n\r\n// валидация типа modelValue с возможностью выбора нескольких значений (ожидается массив)\r\nif (props.isMultiple && !Array.isArray(model.value)) {\r\n\tconsole.warn('Type check failed for prop \"modelValue\". Expected Array: ' + typeof (model.value));\r\n}\r\n\r\n// для множественного выбора без пустого множества\r\n// если ничего не выбрано, присваиваем 1-ое значение\r\nif (props.isMultiple && !props.canBeEmptyMultiple && Array.isArray(model.value) && !model.value.length) {\r\n\tmodel.value = [props.items[0].href ?? props.items[0].value];\r\n}\r\n\r\nconst itemIsActive = (item: Item) => {\r\n\tif (!Array.isArray(model.value)) {\r\n\t\treturn item.value === model.value;\r\n\t}\r\n\r\n\treturn model.value.includes(item.value);\r\n};\r\n\r\n/**\r\n * Выбрать элемент\r\n * @param item\r\n * @param toggle - добавить или исключить элемент, для isMultiple\r\n */\r\nconst select = (item: Item, toggle = false) => {\r\n\tif (Array.isArray(model.value)) {\r\n\t\tlet modelNew = model.value.slice();\r\n\r\n\t\tif (toggle) {\r\n\t\t\tif (!modelNew.length) modelNew = props.items.map(item => item.value);\r\n\r\n\t\t\tconst index = modelNew.indexOf(item.value);\r\n\t\t\tif (index === -1) {\r\n\t\t\t\tmodelNew.push(item.value);\r\n\t\t\t} else {\r\n\t\t\t\tmodelNew.splice(index, 1);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (modelNew.length === 1 && modelNew[0] === item.value) {\r\n\t\t\t\tmodelNew = [];\r\n\t\t\t} else {\r\n\t\t\t\tmodelNew = [item.value];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!props.canBeEmptyMultiple && !modelNew.length) modelNew = [item.value];\r\n\r\n\t\tmodel.value = modelNew;\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n\tmodel.value = item.value;\r\n};\r\n\r\n// вертикальный скролл в горизонтальный скролл\r\nconst onWheel = (event: WheelEvent) => {\r\n\tif (el.value.scrollWidth <= el.value.offsetWidth) return;\r\n\tif (event.shiftKey) return;\r\n\tif (Math.abs(event.deltaY) < 50) return; // устройство с высокой точностью, например тачпад\r\n\r\n\tevent.preventDefault();\r\n\r\n\tconst delta = event.deltaY > 0 ? 30 : -30;\r\n\tel.value.scrollLeft = el.value.scrollLeft + delta;\r\n};\r\n\r\n/**\r\n * Замена стандартному scrollIntoView, который меняет скролл документа\r\n *\r\n * Выравнивание по ближнему краю элемента\r\n *\r\n * Выравнивается таким образом, чтобы был виден соседний элемент\r\n */\r\nconst scrollIntoView = (isSmooth = true) => {\r\n\tconst elBtn = el.value.querySelector('.top-active');\r\n\tif (!elBtn) return;\r\n\r\n\tconst gap = 24;\r\n\r\n\t// левая и правая координаты элемента\r\n\tconst leftMargin = elBtn.offsetLeft - el.value.offsetLeft - gap;\r\n\tconst rightMargin = elBtn.offsetLeft - el.value.offsetLeft + elBtn.clientWidth + gap;\r\n\r\n\t// левая и правая границы видимой части меню\r\n\tconst leftMarginParent = el.value.scrollLeft;\r\n\tconst rightMarginParent = el.value.clientWidth + el.value.scrollLeft;\r\n\r\n\tlet scrollLeft: number | undefined = undefined;\r\n\r\n\t// левую границу элемента к левой границе меню\r\n\tif (leftMargin < leftMarginParent) scrollLeft = leftMargin;\r\n\r\n\t// правую границу элемента к правой границе меню\r\n\tif (rightMargin > rightMarginParent) scrollLeft = rightMargin - el.value.clientWidth;\r\n\r\n\tif (scrollLeft !== undefined) {\r\n\t\tif (isSafari()) {\r\n\t\t\tCore.$?.(el.value).animate({ scrollLeft: scrollLeft }, isSmooth ? 200 : 0);\r\n\t\t} else {\r\n\t\t\tel.value.scrollTo({ left: scrollLeft, behavior: isSmooth ? 'smooth' : 'auto' });\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * Выбрать все элементы в меню\r\n */\r\nconst selectAll = () => {\r\n\tif (!Array.isArray(model.value)) return;\r\n\r\n\tif (model.value.length === props.items.length) {\r\n\t\tmodel.value = [props.items[0].href ?? props.items[0].value];\r\n\t\treturn;\r\n\t}\r\n\r\n\tmodel.value = props.items.map(item => item.href ?? item.value);\r\n};\r\n\r\nonMounted(() => scrollIntoView(false));\r\nonUpdated(() => scrollIntoView(true));\r\n\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\tref=\"el\"\r\n\t\t:class=\"{\r\n\t\t\t'top-menu': true,\r\n\t\t\t['top-style_' + styling]: true,\r\n\t\t\t// ['top-unwrap-x']: styling === 'default',\r\n\t\t}\"\r\n\t\t@wheel=\"onWheel\"\r\n\t>\r\n\t\t<TopButton\r\n\t\t\tv-for=\"item in items\"\r\n\t\t\t:=\"item\"\r\n\t\t\tclass=\"top-menu_item\"\r\n\t\t\tcolor=\"theme\"\r\n\t\t\t@click=\"select(item, $event.ctrlKey)\"\r\n\t\t\t:isActive=\"itemIsActive(item)\"\r\n\t\t>\r\n\t\t\t<template #default v-if=\"item.content\">\r\n\t\t\t\t{{ item.content }}\r\n\t\t\t</template>\r\n\t\t</TopButton>\r\n\r\n\t\t<div\r\n\t\t\tv-if=\"Array.isArray(model) && selectAllItem\"\r\n\t\t\tclass=\"top-menu_selectAll\"\r\n\t\t>\r\n\t\t\t<TopButton\r\n\t\t\t\t:=\"selectAllItem\"\r\n\t\t\t\tclass=\"top-menu_item\"\r\n\t\t\t\tcolor=\"theme\"\r\n\t\t\t\tstyling=\"\"\r\n\t\t\t\t@click=\"selectAll()\"\r\n\t\t\t\t:isActive=\"model.length === items.length\"\r\n\t\t\t>\r\n\t\t\t\t<template #default v-if=\"selectAllItem.content\">\r\n\t\t\t\t\t{{ selectAllItem.content }}\r\n\t\t\t\t</template>\r\n\t\t\t</TopButton>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<style>\r\n.top-menu {\r\n\t--scroll-thumb-color: var(--color-line-1);\r\n\t--scroll-thumb-color-hover: var(--color-line-2);\r\n\t--scroll-thumb-color-active: var(--color-line-3);\r\n\r\n\tmax-width: 100%;\r\n\tdisplay: flex;\r\n\talign-items: flex-start;\r\n\tgap: var(--top-gap-2);\r\n\toverflow-x: auto;\r\n\tscrollbar-width: none; /* firefox */\r\n\r\n\t/* предотвратить натинвые события браузера (назад / вперед) */\r\n\toverscroll-behavior-x: contain;\r\n}\r\n\r\n.top-menu::-webkit-scrollbar { display: none; }\r\n\r\n.top-menu .top-menu_item {\r\n\t--top-button-color: var(--color-text-2);\r\n\r\n\toutline-offset: -2px !important;\r\n\tmin-width: 0;\r\n\tmargin: 0;\r\n\tflex-shrink: 0;\r\n}\r\n\r\n.top-menu .top-menu_item[data-top-icon] {\r\n\t--top-icon-color: var(--color-text-2);\r\n}\r\n\r\n.top-menu_selectAll {\r\n\tposition: sticky;\r\n\tright: 0;\r\n\tbackground: var(--color-layout-front-1);\r\n\tborder-left: 1px solid var(--color-line-1);\r\n\tpadding-left: var(--top-padding-1);\r\n\tbox-shadow: var(--color-layout-front-1) var(--top-padding-2) 0px;\r\n}\r\n\r\n/* style default */\r\n.top-menu.top-style_default .top-menu_item {\r\n\t--top-forms-radius: 0;\r\n\t--top-forms-border-color: transparent;\r\n\t--top-forms-border-width: 2px;\r\n\r\n\tfilter: none;\r\n\tbox-shadow: none;\r\n\tborder: none;\r\n\tborder-bottom: var(--top-forms-border-width) solid var(--top-forms-border-color);\r\n\tbackground: none;\r\n}\r\n\r\n.top-style_default > .top-menu_item > [data-top-badge] {\r\n\tmargin-top: 0;\r\n}\r\n\r\n.top-menu.top-style_default .top-menu_item:hover {\r\n\t--top-icon-color: var(--color-text-1);\r\n\t--top-button-color: var(--color-text-1);\r\n\t--top-forms-border-color: var(--color-line-2);\r\n}\r\n\r\n.top-menu.top-style_default .top-menu_item:active,\r\n.top-menu.top-style_default .top-menu_item.top-active {\r\n\t--top-icon-color: var(--color-text-primary);\r\n\t--top-button-color: var(--color-text-1);\r\n\t--top-forms-border-color: var(--color-line-primary-1);\r\n}\r\n\r\n.top-menu.top-style_default .top-menu_selectAll {\r\n\tpadding-left: var(--top-padding-2);\r\n}\r\n\r\n/* style bar */\r\n.top-menu.top-style_bar {\r\n\tborder-radius: var(--top-radius-3);\r\n\tborder: 1px solid var(--color-line-2);\r\n\tpadding: var(--top-padding-1);\r\n\tgap: 3px;\r\n}\r\n.top-menu.top-style_bar .top-menu_item {\r\n\t--top-button-background-color-hover: var(--color-layer-1);\r\n\t--top-button-background-color-active: var(--color-layer-2);\r\n\t--top-button-background-color-selected: var(--color-layer-primary-1);\r\n\r\n\tposition: relative;\r\n}\r\n\r\n.top-menu.top-style_bar .top-menu_item:hover {\r\n\t--top-icon-color: var(--color-text-1);\r\n\t--top-button-color: var(--color-text-1);\r\n}\r\n\r\n.top-menu.top-style_bar .top-menu_item.top-active {\r\n\t--top-icon-color: var(--color-text-primary);\r\n\t--top-button-color: var(--color-text-primary);\r\n}\r\n\r\n/* разделители кнопок в баре */\r\n.top-menu.top-style_bar .top-menu_item:not(:first-child):not(.top-active):not(:hover):after {\r\n\tcontent: \"\";\r\n\tbackground: var(--color-line-1-opacity);\r\n\twidth: 1px;\r\n\theight: 60%;\r\n\tdisplay: block;\r\n\tposition: absolute;\r\n\tleft: -2px;\r\n}\r\n.top-menu.top-style_bar .top-menu_item.top-active + .top-menu_item:after,\r\n.top-menu.top-style_bar .top-menu_item:hover + .top-menu_item:after {\r\n\tcontent: none !important;\r\n}\r\n\r\n/*\r\n.top-style_bar > .top-menu_item > [data-top-badge] {\r\n\tmargin-top: -3px;\r\n}\r\n*/\r\n\r\n/** TODO: .top-unwrap-x надо вынести глобально в UI или добавить в стили для storybook */\r\n/*\r\n.top-menu.top-unwrap-x {\r\n\tpadding-right: var(--top-unwrap-x);\r\n\tpadding-left: var(--top-unwrap-x);\r\n\tmargin-right: calc(0px - var(--top-unwrap-x));\r\n\tmargin-left: calc(0px - var(--top-unwrap-x));\r\n}\r\n*/\r\n</style>\r\n"],"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,2 +1,2 @@
1
- define(["require","exports","vue","./forms-Cq5zFLsO.amd","../require/css.amd!../assets/menu.css"],function(_,m,e,u){"use strict";if(typeof e>"u")var e=window.Vue;const y={key:0,class:"top-menu_selectAll"},h=e.defineComponent({__name:"menu",props:e.mergeModels({modelValue:{},items:{},isMultiple:{type:Boolean},canBeEmptyMultiple:{type:Boolean},styling:{default:"default"},selectAllItem:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(f){const n=f,a=e.useModel(f,"modelValue"),r=e.ref();!n.isMultiple&&!(typeof a.value=="string"||a.value instanceof String)&&console.warn('Type check failed for prop "modelValue". Expected String: '+typeof a.value),n.isMultiple&&!Array.isArray(a.value)&&console.warn('Type check failed for prop "modelValue". Expected Array: '+typeof a.value),n.isMultiple&&!n.canBeEmptyMultiple&&Array.isArray(a.value)&&!a.value.length&&(a.value=[n.items[0].href??n.items[0].value]);const g=l=>Array.isArray(a.value)?a.value.includes(l.value):l.value===a.value,A=(l,o=!1)=>{if(Array.isArray(a.value)){let t=a.value.slice();if(o){t.length||(t=n.items.map(c=>c.value));const s=t.indexOf(l.value);s===-1?t.push(l.value):t.splice(s,1)}else t.length===1&&t[0]===l.value?t=[]:t=[l.value];!n.canBeEmptyMultiple&&!t.length&&(t=[l.value]),a.value=t;return}a.value=l.value},k=l=>{if(r.value.scrollWidth<=r.value.offsetWidth||l.shiftKey||Math.abs(l.deltaY)<50)return;l.preventDefault();const o=l.deltaY>0?30:-30;r.value.scrollLeft=r.value.scrollLeft+o},v=(l=!0)=>{var d,p;const o=r.value.querySelector(".top-active");if(!o)return;const t=24,s=o.offsetLeft-r.value.offsetLeft-t,c=o.offsetLeft-r.value.offsetLeft+o.clientWidth+t,B=r.value.scrollLeft,V=r.value.clientWidth+r.value.scrollLeft;let i;s<B&&(i=s),c>V&&(i=c-r.value.clientWidth),i!==void 0&&(u.isSafari()?(p=(d=u.Core).$)==null||p.call(d,r.value).animate({scrollLeft:i},l?200:0):r.value.scrollTo({left:i,behavior:l?"smooth":"auto"}))},M=()=>{if(Array.isArray(a.value)){if(a.value.length===n.items.length){a.value=[n.items[0].href??n.items[0].value];return}a.value=n.items.map(l=>l.href??l.value)}};return e.onMounted(()=>v(!1)),e.onUpdated(()=>v(!0)),(l,o)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"el",ref:r,class:e.normalizeClass({"top-menu":!0,["top-style_"+l.styling]:!0}),onWheel:k},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.items,t=>(e.openBlock(),e.createBlock(u._sfc_main,e.mergeProps({ref_for:!0},t,{class:"top-menu_item",color:"theme",onClick:s=>A(t,s.ctrlKey),isActive:g(t)}),e.createSlots({_:2},[t.content?{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.content),1)]),key:"0"}:void 0]),1040,["onClick","isActive"]))),256)),Array.isArray(a.value)&&l.selectAllItem?(e.openBlock(),e.createElementBlock("div",y,[e.createVNode(u._sfc_main,e.mergeProps(l.selectAllItem,{class:"top-menu_item",color:"theme",styling:"",onClick:o[0]||(o[0]=t=>M()),isActive:a.value.length===l.items.length}),e.createSlots({_:2},[l.selectAllItem.content?{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.selectAllItem.content),1)]),key:"0"}:void 0]),1040,["isActive"])])):e.createCommentVNode("",!0)],34))}});m._sfc_main=h});
2
- //# sourceMappingURL=menu.vue_vue_type_style_index_0_lang-BT-PgdJ5.amd.js.map
1
+ define(["require","exports","vue","./forms-BOqxOjGU.amd","../require/css.amd!../assets/menu.css"],function(_,m,e,u){"use strict";if(typeof e>"u")var e=window.Vue;const y={key:0,class:"top-menu_selectAll"},h=e.defineComponent({__name:"menu",props:e.mergeModels({modelValue:{},items:{},isMultiple:{type:Boolean},canBeEmptyMultiple:{type:Boolean},styling:{default:"default"},selectAllItem:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(f){const n=f,a=e.useModel(f,"modelValue"),r=e.ref();!n.isMultiple&&!(typeof a.value=="string"||a.value instanceof String)&&console.warn('Type check failed for prop "modelValue". Expected String: '+typeof a.value),n.isMultiple&&!Array.isArray(a.value)&&console.warn('Type check failed for prop "modelValue". Expected Array: '+typeof a.value),n.isMultiple&&!n.canBeEmptyMultiple&&Array.isArray(a.value)&&!a.value.length&&(a.value=[n.items[0].href??n.items[0].value]);const g=l=>Array.isArray(a.value)?a.value.includes(l.value):l.value===a.value,A=(l,o=!1)=>{if(Array.isArray(a.value)){let t=a.value.slice();if(o){t.length||(t=n.items.map(c=>c.value));const s=t.indexOf(l.value);s===-1?t.push(l.value):t.splice(s,1)}else t.length===1&&t[0]===l.value?t=[]:t=[l.value];!n.canBeEmptyMultiple&&!t.length&&(t=[l.value]),a.value=t;return}a.value=l.value},k=l=>{if(r.value.scrollWidth<=r.value.offsetWidth||l.shiftKey||Math.abs(l.deltaY)<50)return;l.preventDefault();const o=l.deltaY>0?30:-30;r.value.scrollLeft=r.value.scrollLeft+o},v=(l=!0)=>{var d,p;const o=r.value.querySelector(".top-active");if(!o)return;const t=24,s=o.offsetLeft-r.value.offsetLeft-t,c=o.offsetLeft-r.value.offsetLeft+o.clientWidth+t,B=r.value.scrollLeft,V=r.value.clientWidth+r.value.scrollLeft;let i;s<B&&(i=s),c>V&&(i=c-r.value.clientWidth),i!==void 0&&(u.isSafari()?(p=(d=u.Core).$)==null||p.call(d,r.value).animate({scrollLeft:i},l?200:0):r.value.scrollTo({left:i,behavior:l?"smooth":"auto"}))},M=()=>{if(Array.isArray(a.value)){if(a.value.length===n.items.length){a.value=[n.items[0].href??n.items[0].value];return}a.value=n.items.map(l=>l.href??l.value)}};return e.onMounted(()=>v(!1)),e.onUpdated(()=>v(!0)),(l,o)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"el",ref:r,class:e.normalizeClass({"top-menu":!0,["top-style_"+l.styling]:!0}),onWheel:k},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.items,t=>(e.openBlock(),e.createBlock(u._sfc_main,e.mergeProps({ref_for:!0},t,{class:"top-menu_item",color:"theme",onClick:s=>A(t,s.ctrlKey),isActive:g(t)}),e.createSlots({_:2},[t.content?{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.content),1)]),key:"0"}:void 0]),1040,["onClick","isActive"]))),256)),Array.isArray(a.value)&&l.selectAllItem?(e.openBlock(),e.createElementBlock("div",y,[e.createVNode(u._sfc_main,e.mergeProps(l.selectAllItem,{class:"top-menu_item",color:"theme",styling:"",onClick:o[0]||(o[0]=t=>M()),isActive:a.value.length===l.items.length}),e.createSlots({_:2},[l.selectAllItem.content?{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.selectAllItem.content),1)]),key:"0"}:void 0]),1040,["isActive"])])):e.createCommentVNode("",!0)],34))}});m._sfc_main=h});
2
+ //# sourceMappingURL=menu.vue_vue_type_style_index_0_lang-teY0us7_.amd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.vue_vue_type_style_index_0_lang-teY0us7_.amd.js","sources":["../../src/components/formsExt/menu/menu.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { onMounted, onUpdated, ref } from 'vue';\r\nimport type { Item, Props } from './menu';\r\nimport Core from '@/core/core/core';\r\nimport { isSafari } from '@/core/utils/device';\r\nimport TopButton from '@/components/forms/button/button.vue';\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\tstyling: 'default',\r\n});\r\n\r\nconst model = defineModel({\r\n\trequired: true,\r\n});\r\n\r\nconst el = ref();\r\n\r\n// валидация типа modelValue без возможности выбора нескольких значений (ожидается строка)\r\nif (!props.isMultiple && !(typeof (model.value) === 'string' || model.value instanceof String)) {\r\n\tconsole.warn('Type check failed for prop \"modelValue\". Expected String: ' + typeof (model.value));\r\n}\r\n\r\n// валидация типа modelValue с возможностью выбора нескольких значений (ожидается массив)\r\nif (props.isMultiple && !Array.isArray(model.value)) {\r\n\tconsole.warn('Type check failed for prop \"modelValue\". Expected Array: ' + typeof (model.value));\r\n}\r\n\r\n// для множественного выбора без пустого множества\r\n// если ничего не выбрано, присваиваем 1-ое значение\r\nif (props.isMultiple && !props.canBeEmptyMultiple && Array.isArray(model.value) && !model.value.length) {\r\n\tmodel.value = [props.items[0].href ?? props.items[0].value];\r\n}\r\n\r\nconst itemIsActive = (item: Item) => {\r\n\tif (!Array.isArray(model.value)) {\r\n\t\treturn item.value === model.value;\r\n\t}\r\n\r\n\treturn model.value.includes(item.value);\r\n};\r\n\r\n/**\r\n * Выбрать элемент\r\n * @param item\r\n * @param toggle - добавить или исключить элемент, для isMultiple\r\n */\r\nconst select = (item: Item, toggle = false) => {\r\n\tif (Array.isArray(model.value)) {\r\n\t\tlet modelNew = model.value.slice();\r\n\r\n\t\tif (toggle) {\r\n\t\t\tif (!modelNew.length) modelNew = props.items.map(item => item.value);\r\n\r\n\t\t\tconst index = modelNew.indexOf(item.value);\r\n\t\t\tif (index === -1) {\r\n\t\t\t\tmodelNew.push(item.value);\r\n\t\t\t} else {\r\n\t\t\t\tmodelNew.splice(index, 1);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (modelNew.length === 1 && modelNew[0] === item.value) {\r\n\t\t\t\tmodelNew = [];\r\n\t\t\t} else {\r\n\t\t\t\tmodelNew = [item.value];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!props.canBeEmptyMultiple && !modelNew.length) modelNew = [item.value];\r\n\r\n\t\tmodel.value = modelNew;\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n\tmodel.value = item.value;\r\n};\r\n\r\n// вертикальный скролл в горизонтальный скролл\r\nconst onWheel = (event: WheelEvent) => {\r\n\tif (el.value.scrollWidth <= el.value.offsetWidth) return;\r\n\tif (event.shiftKey) return;\r\n\tif (Math.abs(event.deltaY) < 50) return; // устройство с высокой точностью, например тачпад\r\n\r\n\tevent.preventDefault();\r\n\r\n\tconst delta = event.deltaY > 0 ? 30 : -30;\r\n\tel.value.scrollLeft = el.value.scrollLeft + delta;\r\n};\r\n\r\n/**\r\n * Замена стандартному scrollIntoView, который меняет скролл документа\r\n *\r\n * Выравнивание по ближнему краю элемента\r\n *\r\n * Выравнивается таким образом, чтобы был виден соседний элемент\r\n */\r\nconst scrollIntoView = (isSmooth = true) => {\r\n\tconst elBtn = el.value.querySelector('.top-active');\r\n\tif (!elBtn) return;\r\n\r\n\tconst gap = 24;\r\n\r\n\t// левая и правая координаты элемента\r\n\tconst leftMargin = elBtn.offsetLeft - el.value.offsetLeft - gap;\r\n\tconst rightMargin = elBtn.offsetLeft - el.value.offsetLeft + elBtn.clientWidth + gap;\r\n\r\n\t// левая и правая границы видимой части меню\r\n\tconst leftMarginParent = el.value.scrollLeft;\r\n\tconst rightMarginParent = el.value.clientWidth + el.value.scrollLeft;\r\n\r\n\tlet scrollLeft: number | undefined = undefined;\r\n\r\n\t// левую границу элемента к левой границе меню\r\n\tif (leftMargin < leftMarginParent) scrollLeft = leftMargin;\r\n\r\n\t// правую границу элемента к правой границе меню\r\n\tif (rightMargin > rightMarginParent) scrollLeft = rightMargin - el.value.clientWidth;\r\n\r\n\tif (scrollLeft !== undefined) {\r\n\t\tif (isSafari()) {\r\n\t\t\tCore.$?.(el.value).animate({ scrollLeft: scrollLeft }, isSmooth ? 200 : 0);\r\n\t\t} else {\r\n\t\t\tel.value.scrollTo({ left: scrollLeft, behavior: isSmooth ? 'smooth' : 'auto' });\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * Выбрать все элементы в меню\r\n */\r\nconst selectAll = () => {\r\n\tif (!Array.isArray(model.value)) return;\r\n\r\n\tif (model.value.length === props.items.length) {\r\n\t\tmodel.value = [props.items[0].href ?? props.items[0].value];\r\n\t\treturn;\r\n\t}\r\n\r\n\tmodel.value = props.items.map(item => item.href ?? item.value);\r\n};\r\n\r\nonMounted(() => scrollIntoView(false));\r\nonUpdated(() => scrollIntoView(true));\r\n\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\tref=\"el\"\r\n\t\t:class=\"{\r\n\t\t\t'top-menu': true,\r\n\t\t\t['top-style_' + styling]: true,\r\n\t\t\t// ['top-unwrap-x']: styling === 'default',\r\n\t\t}\"\r\n\t\t@wheel=\"onWheel\"\r\n\t>\r\n\t\t<TopButton\r\n\t\t\tv-for=\"item in items\"\r\n\t\t\t:=\"item\"\r\n\t\t\tclass=\"top-menu_item\"\r\n\t\t\tcolor=\"theme\"\r\n\t\t\t@click=\"select(item, $event.ctrlKey)\"\r\n\t\t\t:isActive=\"itemIsActive(item)\"\r\n\t\t>\r\n\t\t\t<template #default v-if=\"item.content\">\r\n\t\t\t\t{{ item.content }}\r\n\t\t\t</template>\r\n\t\t</TopButton>\r\n\r\n\t\t<div\r\n\t\t\tv-if=\"Array.isArray(model) && selectAllItem\"\r\n\t\t\tclass=\"top-menu_selectAll\"\r\n\t\t>\r\n\t\t\t<TopButton\r\n\t\t\t\t:=\"selectAllItem\"\r\n\t\t\t\tclass=\"top-menu_item\"\r\n\t\t\t\tcolor=\"theme\"\r\n\t\t\t\tstyling=\"\"\r\n\t\t\t\t@click=\"selectAll()\"\r\n\t\t\t\t:isActive=\"model.length === items.length\"\r\n\t\t\t>\r\n\t\t\t\t<template #default v-if=\"selectAllItem.content\">\r\n\t\t\t\t\t{{ selectAllItem.content }}\r\n\t\t\t\t</template>\r\n\t\t\t</TopButton>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<style>\r\n.top-menu {\r\n\t--scroll-thumb-color: var(--color-line-1);\r\n\t--scroll-thumb-color-hover: var(--color-line-2);\r\n\t--scroll-thumb-color-active: var(--color-line-3);\r\n\r\n\tmax-width: 100%;\r\n\tdisplay: flex;\r\n\talign-items: flex-start;\r\n\tgap: var(--top-gap-2);\r\n\toverflow-x: auto;\r\n\tscrollbar-width: none; /* firefox */\r\n\r\n\t/* предотвратить натинвые события браузера (назад / вперед) */\r\n\toverscroll-behavior-x: contain;\r\n}\r\n\r\n.top-menu::-webkit-scrollbar { display: none; }\r\n\r\n.top-menu .top-menu_item {\r\n\t--top-button-color: var(--color-text-2);\r\n\r\n\toutline-offset: -2px !important;\r\n\tmin-width: 0;\r\n\tmargin: 0;\r\n\tflex-shrink: 0;\r\n}\r\n\r\n.top-menu .top-menu_item[data-top-icon] {\r\n\t--top-icon-color: var(--color-text-2);\r\n}\r\n\r\n.top-menu_selectAll {\r\n\tposition: sticky;\r\n\tright: 0;\r\n\tbackground: var(--color-layout-front-1);\r\n\tborder-left: 1px solid var(--color-line-1);\r\n\tpadding-left: var(--top-padding-1);\r\n\tbox-shadow: var(--color-layout-front-1) var(--top-padding-2) 0px;\r\n}\r\n\r\n/* style default */\r\n.top-menu.top-style_default .top-menu_item {\r\n\t--top-forms-radius: 0;\r\n\t--top-forms-border-color: transparent;\r\n\t--top-forms-border-width: 2px;\r\n\r\n\tfilter: none;\r\n\tbox-shadow: none;\r\n\tborder: none;\r\n\tborder-bottom: var(--top-forms-border-width) solid var(--top-forms-border-color);\r\n\tbackground: none;\r\n}\r\n\r\n.top-style_default > .top-menu_item > [data-top-badge] {\r\n\tmargin-top: 0;\r\n}\r\n\r\n.top-menu.top-style_default .top-menu_item:hover {\r\n\t--top-icon-color: var(--color-text-1);\r\n\t--top-button-color: var(--color-text-1);\r\n\t--top-forms-border-color: var(--color-line-2);\r\n}\r\n\r\n.top-menu.top-style_default .top-menu_item:active,\r\n.top-menu.top-style_default .top-menu_item.top-active {\r\n\t--top-icon-color: var(--color-text-primary);\r\n\t--top-button-color: var(--color-text-1);\r\n\t--top-forms-border-color: var(--color-line-primary-1);\r\n}\r\n\r\n.top-menu.top-style_default .top-menu_selectAll {\r\n\tpadding-left: var(--top-padding-2);\r\n}\r\n\r\n/* style bar */\r\n.top-menu.top-style_bar {\r\n\tborder-radius: var(--top-radius-3);\r\n\tborder: 1px solid var(--color-line-2);\r\n\tpadding: var(--top-padding-1);\r\n\tgap: 3px;\r\n}\r\n.top-menu.top-style_bar .top-menu_item {\r\n\t--top-button-background-color-hover: var(--color-layer-1);\r\n\t--top-button-background-color-active: var(--color-layer-2);\r\n\t--top-button-background-color-selected: var(--color-layer-primary-1);\r\n\r\n\tposition: relative;\r\n}\r\n\r\n.top-menu.top-style_bar .top-menu_item:hover {\r\n\t--top-icon-color: var(--color-text-1);\r\n\t--top-button-color: var(--color-text-1);\r\n}\r\n\r\n.top-menu.top-style_bar .top-menu_item.top-active {\r\n\t--top-icon-color: var(--color-text-primary);\r\n\t--top-button-color: var(--color-text-primary);\r\n}\r\n\r\n/* разделители кнопок в баре */\r\n.top-menu.top-style_bar .top-menu_item:not(:first-child):not(.top-active):not(:hover):after {\r\n\tcontent: \"\";\r\n\tbackground: var(--color-line-1-opacity);\r\n\twidth: 1px;\r\n\theight: 60%;\r\n\tdisplay: block;\r\n\tposition: absolute;\r\n\tleft: -2px;\r\n}\r\n.top-menu.top-style_bar .top-menu_item.top-active + .top-menu_item:after,\r\n.top-menu.top-style_bar .top-menu_item:hover + .top-menu_item:after {\r\n\tcontent: none !important;\r\n}\r\n\r\n/*\r\n.top-style_bar > .top-menu_item > [data-top-badge] {\r\n\tmargin-top: -3px;\r\n}\r\n*/\r\n\r\n/** TODO: .top-unwrap-x надо вынести глобально в UI или добавить в стили для storybook */\r\n/*\r\n.top-menu.top-unwrap-x {\r\n\tpadding-right: var(--top-unwrap-x);\r\n\tpadding-left: var(--top-unwrap-x);\r\n\tmargin-right: calc(0px - var(--top-unwrap-x));\r\n\tmargin-left: calc(0px - var(--top-unwrap-x));\r\n}\r\n*/\r\n</style>\r\n"],"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"}
@@ -0,0 +1,169 @@
1
+ import { Core as w } from "../core/app.js";
2
+ import { reactive as N, defineComponent as y, ref as h, computed as b, resolveComponent as z, withDirectives as D, openBlock as d, createElementBlock as T, normalizeClass as E, createElementVNode as f, createBlock as _, mergeProps as j, createCommentVNode as L, Teleport as x, Fragment as V, renderList as A, unref as F, normalizeStyle as J } from "vue";
3
+ import { C as g } from "./forms-B6DA2YGV.es.js";
4
+ import { genIntHash as O, nl2br as W } from "../utils/string.js";
5
+ const I = ["../assets/notice.css"].map((e) => import.meta.resolve(e));
6
+ w.insertCSSLinkToPage(I, !0);
7
+ const C = 300, a = N(/* @__PURE__ */ new Map()), q = (e, n, t) => "top-notice_" + O(e + n + JSON.stringify(t)), ne = (e, n = "info", t) => {
8
+ let i = "";
9
+ e = String(e);
10
+ const c = q(e, n, t);
11
+ if (t != null && t.title)
12
+ i = t.title;
13
+ else {
14
+ const u = e.split(`
15
+ `);
16
+ u.length && (i = String(u.shift()), e = u.join(`
17
+ `));
18
+ }
19
+ const s = a.get(c);
20
+ if (s) {
21
+ G(s);
22
+ return;
23
+ }
24
+ const l = {
25
+ id: c,
26
+ title: i,
27
+ text: e,
28
+ style: n,
29
+ buttonProps: t == null ? void 0 : t.buttonProps,
30
+ metaText: t == null ? void 0 : t.metaText,
31
+ isSafeHTML: t == null ? void 0 : t.isSafeHTML,
32
+ onClose: t == null ? void 0 : t.onClose
33
+ };
34
+ if (a.set(l.id, l), a.size > 5) {
35
+ const [u, p] = [...a].at(0) || [];
36
+ p && S(p);
37
+ }
38
+ g.state.isMobile && $("input").one("click", () => S(l));
39
+ }, G = (e) => {
40
+ e.hightlight = !0, setTimeout(() => e.hightlight = !1, C);
41
+ }, S = (e) => {
42
+ e.forceClosed = !0, setTimeout(() => {
43
+ var n;
44
+ (n = e.onClose) == null || n.call(e), a.delete(e.id);
45
+ }, C);
46
+ }, H = (e) => {
47
+ const n = "hacking was detected";
48
+ return e = e.replace(/<script/g, n), e = e.replace(/<img/g, n), e = e.replace(/<iframe/g, n), e = e.replace(/javascript:/g, n), e = e.replace(/<[^>]+ (@|on)\w+=[^>]+>?/g, n), e;
49
+ }, K = { class: "top-notice_itemTextWrapper" }, Q = ["innerHTML"], R = ["innerHTML"], U = ["innerHTML"], X = ["title"], Y = /* @__PURE__ */ y({
50
+ __name: "item",
51
+ props: {
52
+ id: {},
53
+ title: {},
54
+ text: {},
55
+ style: {},
56
+ metaText: {},
57
+ buttonProps: {},
58
+ isSafeHTML: { type: Boolean },
59
+ hightlight: { type: Boolean },
60
+ forceClosed: { type: Boolean }
61
+ },
62
+ emits: ["close"],
63
+ setup(e, { emit: n }) {
64
+ const t = e, i = n, c = h(!1);
65
+ setTimeout(() => c.value = !0, 10);
66
+ const s = h(!1), l = h("right"), u = b(() => {
67
+ let o = t.title.replace(/ {2}/g, "&nbsp;");
68
+ return t.isSafeHTML || (o = H(o)), o;
69
+ }), p = b(() => {
70
+ let o = W(t.text);
71
+ return o = o.replace(/ {2}/g, "&nbsp;"), t.isSafeHTML || (o = H(o)), o;
72
+ }), m = (o) => {
73
+ s.value = !0, o && (l.value = o), setTimeout(() => i("close"), C);
74
+ }, k = (o) => {
75
+ const { tagName: r } = o.target;
76
+ r === "A" && m();
77
+ }, P = {
78
+ mounted: (o) => {
79
+ if (!g.state.isMobile || !g.$ || !g.$.ui.draggable) return;
80
+ let r = "right";
81
+ g.$(o).draggable({
82
+ revert: !1,
83
+ axis: "x",
84
+ drag: (B, M) => {
85
+ r = M.position.left > 0 ? "right" : "left";
86
+ },
87
+ stop: (B, M) => {
88
+ m(r);
89
+ }
90
+ });
91
+ }
92
+ };
93
+ return (o, r) => {
94
+ const v = z("TopButton");
95
+ return D((d(), T("div", {
96
+ class: E(["top-notice_item", {
97
+ ["top-notice_item-" + o.style]: !0,
98
+ "top-notice_item-hightlight": o.hightlight,
99
+ "top-notice_item-showed": c.value,
100
+ "top-notice_item-closed": s.value || o.forceClosed,
101
+ ["top-notice_item-closed_" + l.value]: s.value
102
+ }]),
103
+ onClick: k
104
+ }, [
105
+ f("div", K, [
106
+ f("div", {
107
+ class: "top-notice_itemTitle",
108
+ innerHTML: u.value
109
+ }, null, 8, Q),
110
+ f("div", {
111
+ class: "top-notice_itemText",
112
+ innerHTML: p.value
113
+ }, null, 8, R)
114
+ ]),
115
+ o.buttonProps ? (d(), _(v, j({
116
+ key: 0,
117
+ class: "top-notice_itemButton",
118
+ size: "s"
119
+ }, o.buttonProps, {
120
+ title: o.buttonProps.title,
121
+ innerHTML: o.buttonProps.default
122
+ }), null, 16, ["title", "innerHTML"])) : L("", !0),
123
+ o.metaText ? (d(), T("div", {
124
+ key: 1,
125
+ class: "top-notice_itemMetaText",
126
+ innerHTML: o.metaText
127
+ }, null, 8, U)) : L("", !0),
128
+ f("div", {
129
+ class: "top-notice_itemClose",
130
+ "data-top-icon": "",
131
+ title: o.$i18n.Common.Close,
132
+ onClick: r[0] || (r[0] = () => m())
133
+ }, null, 8, X)
134
+ ], 2)), [
135
+ [P]
136
+ ]);
137
+ };
138
+ }
139
+ }), Z = { class: "top-notice" }, ie = /* @__PURE__ */ y({
140
+ __name: "notice",
141
+ setup(e) {
142
+ const n = (t) => {
143
+ var i;
144
+ (i = t.onClose) == null || i.call(t), a.delete(t.id);
145
+ };
146
+ return (t, i) => (d(), _(x, { to: "body" }, [
147
+ f("div", Z, [
148
+ (d(!0), T(V, null, A(F(a), ([c, s]) => (d(), _(Y, {
149
+ key: s.id,
150
+ id: s.id,
151
+ title: s.title,
152
+ text: s.text,
153
+ style: J(s.style),
154
+ buttonProps: s.buttonProps,
155
+ metaText: s.metaText,
156
+ isSafeHTML: s.isSafeHTML,
157
+ forceClosed: s.forceClosed,
158
+ hightlight: s.hightlight,
159
+ onClose: (l) => n(s)
160
+ }, null, 8, ["id", "title", "text", "style", "buttonProps", "metaText", "isSafeHTML", "forceClosed", "hightlight", "onClose"]))), 128))
161
+ ])
162
+ ]));
163
+ }
164
+ });
165
+ export {
166
+ ie as default,
167
+ ne as show
168
+ };
169
+ //# sourceMappingURL=notice-CEj6I4uX.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notice-CEj6I4uX.es.js","sources":["../../src/components/core/notice/utils.ts","../../src/components/core/notice/item/item.vue","../../src/components/core/notice/notice.vue"],"sourcesContent":["import { reactive } from 'vue';\r\nimport type { Props as ItemProps, Props, Style } from '@/components/core/notice/item/types';\r\nimport Core from '@/core/core/core.js';\r\nimport { genIntHash } from '@/core/utils/string';\r\n\r\nexport const transitionDuration = 300;\r\n\r\nexport type Item = Props & { onClose?: Function };\r\n\r\nexport const itemById = reactive(new Map<string, Item>());\r\n\r\nconst genItemId = (text: ItemProps['text'], style: ItemProps['style'], options?: Options) => {\r\n\treturn 'top-notice_' + genIntHash(text + style + JSON.stringify(options));\r\n};\r\n\r\nexport type Options = {\r\n\ttitle?: ItemProps['title'],\r\n\tmetaText?: ItemProps['metaText'],\r\n\tbuttonProps?: ItemProps['buttonProps'],\r\n\tisSafeHTML?: ItemProps['isSafeHTML'],\r\n\tonClose?: Function\r\n}\r\n\r\n/**\r\n * Показать сообщением в стиле push уведомления\r\n *\r\n * title будет получен из первой строки text\r\n *\r\n * Если в options указан title, он будет взят оттуда\r\n */\r\nexport const show = (text: string, style: Style = 'info', options?: Options) => {\r\n\tlet title = '';\r\n\r\n\ttext = String(text);\r\n\r\n\tconst id = genItemId(text, style, options);\r\n\r\n\tif (options?.title) {\r\n\t\ttitle = options.title;\r\n\t} else {\r\n\t\tconst chunks = text.split('\\n');\r\n\r\n\t\tif (chunks.length) {\r\n\t\t\ttitle = String(chunks.shift());\r\n\t\t\ttext = chunks.join('\\n');\r\n\t\t}\r\n\t}\r\n\r\n\tconst itemExists = itemById.get(id);\r\n\tif (itemExists) {\r\n\t\thightlight(itemExists);\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst item: Item = {\r\n\t\tid,\r\n\t\ttitle,\r\n\t\ttext,\r\n\t\tstyle,\r\n\t\tbuttonProps: options?.buttonProps,\r\n\t\tmetaText: options?.metaText,\r\n\t\tisSafeHTML: options?.isSafeHTML,\r\n\t\tonClose: options?.onClose,\r\n\t};\r\n\r\n\titemById.set(item.id, item);\r\n\r\n\tif (itemById.size > 5) {\r\n\t\tconst [_firstId, firstItem] = [...itemById].at(0) || [];\r\n\t\tif (firstItem) close(firstItem);\r\n\t}\r\n\r\n\t/**\r\n\t * Автозакрытие ошибок форм\r\n\t *\r\n\t * Добавляет\r\n\t */\r\n\tif (Core.state.isMobile) {\r\n\t\t$('input').one('click', () => close(item));\r\n\t}\r\n};\r\n\r\nconst hightlight = (item: Item) => {\r\n\titem.hightlight = true;\r\n\r\n\tsetTimeout(() => item.hightlight = false, transitionDuration);\r\n};\r\n\r\nconst close = (item: Item) => {\r\n\titem.forceClosed = true;\r\n\r\n\tsetTimeout(() => {\r\n\t\titem.onClose?.();\r\n\r\n\t\titemById.delete(item.id);\r\n\t}, transitionDuration);\r\n};\r\n\r\n/**\r\n * Убрать подозрительный html код\r\n */\r\nexport const prepareText = (text: string) => {\r\n\tconst textNoSafety = 'hacking was detected';\r\n\r\n\ttext = text.replace(/<script/g, textNoSafety);\r\n\ttext = text.replace(/<img/g, textNoSafety);\r\n\ttext = text.replace(/<iframe/g, textNoSafety);\r\n\ttext = text.replace(/javascript:/g, textNoSafety);\r\n\ttext = text.replace(/<[^>]+ (@|on)\\w+=[^>]+>?/g, textNoSafety);\r\n\r\n\treturn text;\r\n};\r\n","<script setup lang=\"ts\">\r\nimport { computed, ref } from 'vue';\r\n\r\nimport Core from '@/core/core/core.js';\r\nimport { nl2br } from '@/core/utils/string';\r\n\r\nimport type { Props, Emits } from './types';\r\nimport { transitionDuration, prepareText } from '@/components/core/notice/utils';\r\n\r\nconst props = defineProps<Props>();\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\n// анимация появления\r\nconst showed = ref(false);\r\nsetTimeout(() => showed.value = true, 10);\r\n\r\n// анимация закрытия\r\nconst closed = ref(false);\r\nconst closedDirection = ref<'top' | 'right' | 'bottom' | 'left'>('right');\r\n\r\nconst title = computed(() => {\r\n\tlet res = props.title.replace(/ {2}/g, '&nbsp;');\r\n\r\n\tif (!props.isSafeHTML) res = prepareText(res);\r\n\r\n\treturn res;\r\n});\r\n\r\nconst text = computed(() => {\r\n\tlet res = nl2br(props.text);\r\n\r\n\tres = res.replace(/ {2}/g, '&nbsp;');\r\n\r\n\tif (!props.isSafeHTML) res = prepareText(res);\r\n\r\n\treturn res;\r\n});\r\n\r\nconst close = (direction?: typeof closedDirection.value) => {\r\n\tclosed.value = true;\r\n\r\n\tif (direction) {\r\n\t\tclosedDirection.value = direction;\r\n\t}\r\n\r\n\tsetTimeout(() => emit('close'), transitionDuration);\r\n};\r\n\r\nconst onClick = (e: MouseEvent) => {\r\n\tconst { tagName } = e.target as HTMLElement;\r\n\r\n\tif (tagName === 'A') close();\r\n};\r\n\r\nconst vSwipe = {\r\n\tmounted: (el: HTMLElement) => {\r\n\t\tif (!Core.state.isMobile) return;\r\n\r\n\t\tif (!Core.$ || !Core.$.ui['draggable']) return;\r\n\r\n\t\tlet direction: typeof closedDirection.value = 'right';\r\n\r\n\t\tlet axis = 'x';\r\n\t\t// if (getOS() === 'iOS') axis = 'y';\r\n\r\n\t\tCore.$(el).draggable({\r\n\t\t\trevert: false,\r\n\t\t\taxis,\r\n\t\t\tdrag: (e, ui) => {\r\n\t\t\t\tif (axis == 'x') {\r\n\t\t\t\t\tdirection = ui.position.left > 0 ? 'right' : 'left';\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdirection = ui.position.top > 0 ? 'bottom' : 'top';\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tstop: (_e, _ui) => {\r\n\t\t\t\tclose(direction);\r\n\t\t\t},\r\n\t\t});\r\n\t},\r\n};\r\n\r\n// const vSwipe = {\r\n// \tmounted: (el: HTMLElement) => {\r\n// \t\tconst { distanceX, direction } = usePointerSwipe(el, {\r\n// \t\t\tdisableTextSelect: true,\r\n// \t\t\tonSwipe(e: PointerEvent) {\r\n// \t\t\t\tleft.value = -distanceX.value + 'px';\r\n// \t\t\t},\r\n// \t\t\tonSwipeEnd: (_e, direction) => {\r\n// \t\t\t\tclose(direction);\r\n// \t\t\t},\r\n// \t\t});\r\n// \t},\r\n// };\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\tclass=\"top-notice_item\"\r\n\t\t:class=\"{\r\n\t\t\t['top-notice_item-' + style]: true,\r\n\t\t\t'top-notice_item-hightlight': hightlight,\r\n\t\t\t'top-notice_item-showed': showed,\r\n\t\t\t'top-notice_item-closed': closed || forceClosed,\r\n\t\t\t['top-notice_item-closed_' + closedDirection]: closed,\r\n\t\t}\"\r\n\t\t@click=\"onClick\"\r\n\t\tv-swipe\r\n\t>\r\n\t\t<div class=\"top-notice_itemTextWrapper\">\r\n\t\t\t<div class=\"top-notice_itemTitle\" v-html=\"title\"></div>\r\n\t\t\t<div class=\"top-notice_itemText\" v-html=\"text\"></div>\r\n\t\t</div>\r\n\r\n\t\t<TopButton\r\n\t\t\tv-if=\"buttonProps\"\r\n\t\t\tclass=\"top-notice_itemButton\"\r\n\t\t\tsize=\"s\"\r\n\t\t\t:=\"buttonProps\"\r\n\t\t\t:title=\"buttonProps.title\"\r\n\t\t\tv-html=\"buttonProps.default\"\r\n\t\t/>\r\n\r\n\t\t<div v-if=\"metaText\" class=\"top-notice_itemMetaText\" v-html=\"metaText\"></div>\r\n\r\n\t\t<div\r\n\t\t\tclass=\"top-notice_itemClose\"\r\n\t\t\tdata-top-icon=\"\"\r\n\t\t\t:title=\"$i18n.Common.Close\"\r\n\t\t\t@click=\"() => close()\"\r\n\t\t></div>\r\n\t</div>\r\n</template>\r\n\r\n<style>\r\n@import \"style.css\";\r\n</style>\r\n","<!-- performance all in one file component, для Core.notice() -->\r\n<script lang=\"ts\">\r\nexport { show } from './utils';\r\n</script>\r\n\r\n<script setup lang=\"ts\">\r\nimport type { Item } from './utils';\r\nimport { itemById } from './utils';\r\n\r\nimport type { Props } from './types';\r\nimport TopNoticeItem from './item/item.vue';\r\n\r\ndefineProps<Props>();\r\n\r\nconst onCloseItem = (item: Item) => {\r\n\titem.onClose?.();\r\n\r\n\titemById.delete(item.id);\r\n};\r\n</script>\r\n\r\n<template>\r\n\t<teleport to=\"body\">\r\n\t\t<div class=\"top-notice\">\r\n\t\t\t<TopNoticeItem\r\n\t\t\t\tv-for=\"[_index, item] in itemById\"\r\n\t\t\t\t:key=\"item.id\"\r\n\t\t\t\t:id=\"item.id\"\r\n\t\t\t\t:title=\"item.title\"\r\n\t\t\t\t:text=\"item.text\"\r\n\t\t\t\t:style=\"item.style\"\r\n\t\t\t\t:buttonProps=\"item.buttonProps\"\r\n\t\t\t\t:metaText=\"item.metaText\"\r\n\t\t\t\t:isSafeHTML=\"item.isSafeHTML\"\r\n\t\t\t\t:forceClosed=\"item.forceClosed\"\r\n\t\t\t\t:hightlight=\"item.hightlight\"\r\n\t\t\t\t@close=\"onCloseItem(item)\"\r\n\t\t\t/>\r\n\t\t</div>\r\n\t</teleport>\r\n</template>\r\n\r\n<style>\r\n:root {\r\n\t--top-notice-top: var(--top-padding-4);\r\n\t--top-notice-right: var(--top-padding-4);\r\n}\r\n\r\n.top-notice {\r\n\twidth: 400px;\r\n\tfont-size: 14px;\r\n\tposition: fixed; top: var(--top-notice-top); right: var(--top-notice-right);\r\n\tz-index: 1000010;\r\n\tdisplay: flex; flex-direction: column-reverse; gap: var(--top-gap-2);\r\n}\r\n\r\n.top-notice ul {\r\n\tpadding: var(--top-padding-3) 0 0 var(--top-padding-5);\r\n}\r\n\r\n@media only screen and (max-width: 600px) {\r\n\t:root {\r\n\t\t--top-notice-top: var(--top-padding-4);\r\n\t\t--top-notice-right: var(--top-padding-4);\r\n\t}\r\n\r\n\t.top-notice { width: auto; left: var(--top-notice-right); }\r\n}\r\n</style>\r\n"],"names":["transitionDuration","itemById","reactive","genItemId","text","style","options","genIntHash","show","title","id","chunks","itemExists","hightlight","item","_firstId","firstItem","close","Core","_a","prepareText","textNoSafety","props","__props","emit","__emit","showed","ref","closed","closedDirection","computed","res","nl2br","direction","onClick","e","tagName","vSwipe","el","ui","_e","_ui","onCloseItem"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ define(["require","exports","vue","./forms-BOqxOjGU.amd","../utils/string.amd","../require/css.amd!../assets/notice.css"],function(j,p,e,f,T){"use strict";if(typeof e>"u")var e=window.Vue;const h=300,r=e.reactive(new Map),b=(t,i,o)=>"top-notice_"+T.genIntHash(t+i+JSON.stringify(o)),k=(t,i="info",o)=>{let s="";t=String(t);const u=b(t,i,o);if(o!=null&&o.title)s=o.title;else{const d=t.split(`
2
+ `);d.length&&(s=String(d.shift()),t=d.join(`
3
+ `))}const l=r.get(u);if(l){B(l);return}const c={id:u,title:s,text:t,style:i,buttonProps:o==null?void 0:o.buttonProps,metaText:o==null?void 0:o.metaText,isSafeHTML:o==null?void 0:o.isSafeHTML,onClose:o==null?void 0:o.onClose};if(r.set(c.id,c),r.size>5){const[d,g]=[...r].at(0)||[];g&&_(g)}f.Core.state.isMobile&&$("input").one("click",()=>_(c))},B=t=>{t.hightlight=!0,setTimeout(()=>t.hightlight=!1,h)},_=t=>{t.forceClosed=!0,setTimeout(()=>{var i;(i=t.onClose)==null||i.call(t),r.delete(t.id)},h)},C=t=>{const i="hacking was detected";return t=t.replace(/<script/g,i),t=t.replace(/<img/g,i),t=t.replace(/<iframe/g,i),t=t.replace(/javascript:/g,i),t=t.replace(/<[^>]+ (@|on)\w+=[^>]+>?/g,i),t},y={class:"top-notice_itemTextWrapper"},H=["innerHTML"],L=["innerHTML"],S=["innerHTML"],P=["title"],w=e.defineComponent({__name:"item",props:{id:{},title:{},text:{},style:{},metaText:{},buttonProps:{},isSafeHTML:{type:Boolean},hightlight:{type:Boolean},forceClosed:{type:Boolean}},emits:["close"],setup(t,{emit:i}){const o=t,s=i,u=e.ref(!1);setTimeout(()=>u.value=!0,10);const l=e.ref(!1),c=e.ref("right"),d=e.computed(()=>{let n=o.title.replace(/ {2}/g,"&nbsp;");return o.isSafeHTML||(n=C(n)),n}),g=e.computed(()=>{let n=T.nl2br(o.text);return n=n.replace(/ {2}/g,"&nbsp;"),o.isSafeHTML||(n=C(n)),n}),m=n=>{l.value=!0,n&&(c.value=n),setTimeout(()=>s("close"),h)},V=n=>{const{tagName:a}=n.target;a==="A"&&m()},I={mounted:n=>{if(!f.Core.state.isMobile||!f.Core.$||!f.Core.$.ui.draggable)return;let a="right";f.Core.$(n).draggable({revert:!1,axis:"x",drag:(z,M)=>{a=M.position.left>0?"right":"left"},stop:(z,M)=>{m(a)}})}};return(n,a)=>{const v=e.resolveComponent("TopButton");return e.withDirectives((e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["top-notice_item",{["top-notice_item-"+n.style]:!0,"top-notice_item-hightlight":n.hightlight,"top-notice_item-showed":u.value,"top-notice_item-closed":l.value||n.forceClosed,["top-notice_item-closed_"+c.value]:l.value}]),onClick:V},[e.createElementVNode("div",y,[e.createElementVNode("div",{class:"top-notice_itemTitle",innerHTML:d.value},null,8,H),e.createElementVNode("div",{class:"top-notice_itemText",innerHTML:g.value},null,8,L)]),n.buttonProps?(e.openBlock(),e.createBlock(v,e.mergeProps({key:0,class:"top-notice_itemButton",size:"s"},n.buttonProps,{title:n.buttonProps.title,innerHTML:n.buttonProps.default}),null,16,["title","innerHTML"])):e.createCommentVNode("",!0),n.metaText?(e.openBlock(),e.createElementBlock("div",{key:1,class:"top-notice_itemMetaText",innerHTML:n.metaText},null,8,S)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:"top-notice_itemClose","data-top-icon":"",title:n.$i18n.Common.Close,onClick:a[0]||(a[0]=()=>m())},null,8,P)],2)),[[I]])}}}),N={class:"top-notice"},E=e.defineComponent({__name:"notice",setup(t){const i=o=>{var s;(s=o.onClose)==null||s.call(o),r.delete(o.id)};return(o,s)=>(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[e.createElementVNode("div",N,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(r),([u,l])=>(e.openBlock(),e.createBlock(w,{key:l.id,id:l.id,title:l.title,text:l.text,style:e.normalizeStyle(l.style),buttonProps:l.buttonProps,metaText:l.metaText,isSafeHTML:l.isSafeHTML,forceClosed:l.forceClosed,hightlight:l.hightlight,onClose:c=>i(l)},null,8,["id","title","text","style","buttonProps","metaText","isSafeHTML","forceClosed","hightlight","onClose"]))),128))])]))}});p.default=E,p.show=k,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})});
4
+ //# sourceMappingURL=notice-DTreV5av.amd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notice-DTreV5av.amd.js","sources":["../../src/components/core/notice/utils.ts","../../src/components/core/notice/item/item.vue","../../src/components/core/notice/notice.vue"],"sourcesContent":["import { reactive } from 'vue';\r\nimport type { Props as ItemProps, Props, Style } from '@/components/core/notice/item/types';\r\nimport Core from '@/core/core/core.js';\r\nimport { genIntHash } from '@/core/utils/string';\r\n\r\nexport const transitionDuration = 300;\r\n\r\nexport type Item = Props & { onClose?: Function };\r\n\r\nexport const itemById = reactive(new Map<string, Item>());\r\n\r\nconst genItemId = (text: ItemProps['text'], style: ItemProps['style'], options?: Options) => {\r\n\treturn 'top-notice_' + genIntHash(text + style + JSON.stringify(options));\r\n};\r\n\r\nexport type Options = {\r\n\ttitle?: ItemProps['title'],\r\n\tmetaText?: ItemProps['metaText'],\r\n\tbuttonProps?: ItemProps['buttonProps'],\r\n\tisSafeHTML?: ItemProps['isSafeHTML'],\r\n\tonClose?: Function\r\n}\r\n\r\n/**\r\n * Показать сообщением в стиле push уведомления\r\n *\r\n * title будет получен из первой строки text\r\n *\r\n * Если в options указан title, он будет взят оттуда\r\n */\r\nexport const show = (text: string, style: Style = 'info', options?: Options) => {\r\n\tlet title = '';\r\n\r\n\ttext = String(text);\r\n\r\n\tconst id = genItemId(text, style, options);\r\n\r\n\tif (options?.title) {\r\n\t\ttitle = options.title;\r\n\t} else {\r\n\t\tconst chunks = text.split('\\n');\r\n\r\n\t\tif (chunks.length) {\r\n\t\t\ttitle = String(chunks.shift());\r\n\t\t\ttext = chunks.join('\\n');\r\n\t\t}\r\n\t}\r\n\r\n\tconst itemExists = itemById.get(id);\r\n\tif (itemExists) {\r\n\t\thightlight(itemExists);\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst item: Item = {\r\n\t\tid,\r\n\t\ttitle,\r\n\t\ttext,\r\n\t\tstyle,\r\n\t\tbuttonProps: options?.buttonProps,\r\n\t\tmetaText: options?.metaText,\r\n\t\tisSafeHTML: options?.isSafeHTML,\r\n\t\tonClose: options?.onClose,\r\n\t};\r\n\r\n\titemById.set(item.id, item);\r\n\r\n\tif (itemById.size > 5) {\r\n\t\tconst [_firstId, firstItem] = [...itemById].at(0) || [];\r\n\t\tif (firstItem) close(firstItem);\r\n\t}\r\n\r\n\t/**\r\n\t * Автозакрытие ошибок форм\r\n\t *\r\n\t * Добавляет\r\n\t */\r\n\tif (Core.state.isMobile) {\r\n\t\t$('input').one('click', () => close(item));\r\n\t}\r\n};\r\n\r\nconst hightlight = (item: Item) => {\r\n\titem.hightlight = true;\r\n\r\n\tsetTimeout(() => item.hightlight = false, transitionDuration);\r\n};\r\n\r\nconst close = (item: Item) => {\r\n\titem.forceClosed = true;\r\n\r\n\tsetTimeout(() => {\r\n\t\titem.onClose?.();\r\n\r\n\t\titemById.delete(item.id);\r\n\t}, transitionDuration);\r\n};\r\n\r\n/**\r\n * Убрать подозрительный html код\r\n */\r\nexport const prepareText = (text: string) => {\r\n\tconst textNoSafety = 'hacking was detected';\r\n\r\n\ttext = text.replace(/<script/g, textNoSafety);\r\n\ttext = text.replace(/<img/g, textNoSafety);\r\n\ttext = text.replace(/<iframe/g, textNoSafety);\r\n\ttext = text.replace(/javascript:/g, textNoSafety);\r\n\ttext = text.replace(/<[^>]+ (@|on)\\w+=[^>]+>?/g, textNoSafety);\r\n\r\n\treturn text;\r\n};\r\n","<script setup lang=\"ts\">\r\nimport { computed, ref } from 'vue';\r\n\r\nimport Core from '@/core/core/core.js';\r\nimport { nl2br } from '@/core/utils/string';\r\n\r\nimport type { Props, Emits } from './types';\r\nimport { transitionDuration, prepareText } from '@/components/core/notice/utils';\r\n\r\nconst props = defineProps<Props>();\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\n// анимация появления\r\nconst showed = ref(false);\r\nsetTimeout(() => showed.value = true, 10);\r\n\r\n// анимация закрытия\r\nconst closed = ref(false);\r\nconst closedDirection = ref<'top' | 'right' | 'bottom' | 'left'>('right');\r\n\r\nconst title = computed(() => {\r\n\tlet res = props.title.replace(/ {2}/g, '&nbsp;');\r\n\r\n\tif (!props.isSafeHTML) res = prepareText(res);\r\n\r\n\treturn res;\r\n});\r\n\r\nconst text = computed(() => {\r\n\tlet res = nl2br(props.text);\r\n\r\n\tres = res.replace(/ {2}/g, '&nbsp;');\r\n\r\n\tif (!props.isSafeHTML) res = prepareText(res);\r\n\r\n\treturn res;\r\n});\r\n\r\nconst close = (direction?: typeof closedDirection.value) => {\r\n\tclosed.value = true;\r\n\r\n\tif (direction) {\r\n\t\tclosedDirection.value = direction;\r\n\t}\r\n\r\n\tsetTimeout(() => emit('close'), transitionDuration);\r\n};\r\n\r\nconst onClick = (e: MouseEvent) => {\r\n\tconst { tagName } = e.target as HTMLElement;\r\n\r\n\tif (tagName === 'A') close();\r\n};\r\n\r\nconst vSwipe = {\r\n\tmounted: (el: HTMLElement) => {\r\n\t\tif (!Core.state.isMobile) return;\r\n\r\n\t\tif (!Core.$ || !Core.$.ui['draggable']) return;\r\n\r\n\t\tlet direction: typeof closedDirection.value = 'right';\r\n\r\n\t\tlet axis = 'x';\r\n\t\t// if (getOS() === 'iOS') axis = 'y';\r\n\r\n\t\tCore.$(el).draggable({\r\n\t\t\trevert: false,\r\n\t\t\taxis,\r\n\t\t\tdrag: (e, ui) => {\r\n\t\t\t\tif (axis == 'x') {\r\n\t\t\t\t\tdirection = ui.position.left > 0 ? 'right' : 'left';\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdirection = ui.position.top > 0 ? 'bottom' : 'top';\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tstop: (_e, _ui) => {\r\n\t\t\t\tclose(direction);\r\n\t\t\t},\r\n\t\t});\r\n\t},\r\n};\r\n\r\n// const vSwipe = {\r\n// \tmounted: (el: HTMLElement) => {\r\n// \t\tconst { distanceX, direction } = usePointerSwipe(el, {\r\n// \t\t\tdisableTextSelect: true,\r\n// \t\t\tonSwipe(e: PointerEvent) {\r\n// \t\t\t\tleft.value = -distanceX.value + 'px';\r\n// \t\t\t},\r\n// \t\t\tonSwipeEnd: (_e, direction) => {\r\n// \t\t\t\tclose(direction);\r\n// \t\t\t},\r\n// \t\t});\r\n// \t},\r\n// };\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\tclass=\"top-notice_item\"\r\n\t\t:class=\"{\r\n\t\t\t['top-notice_item-' + style]: true,\r\n\t\t\t'top-notice_item-hightlight': hightlight,\r\n\t\t\t'top-notice_item-showed': showed,\r\n\t\t\t'top-notice_item-closed': closed || forceClosed,\r\n\t\t\t['top-notice_item-closed_' + closedDirection]: closed,\r\n\t\t}\"\r\n\t\t@click=\"onClick\"\r\n\t\tv-swipe\r\n\t>\r\n\t\t<div class=\"top-notice_itemTextWrapper\">\r\n\t\t\t<div class=\"top-notice_itemTitle\" v-html=\"title\"></div>\r\n\t\t\t<div class=\"top-notice_itemText\" v-html=\"text\"></div>\r\n\t\t</div>\r\n\r\n\t\t<TopButton\r\n\t\t\tv-if=\"buttonProps\"\r\n\t\t\tclass=\"top-notice_itemButton\"\r\n\t\t\tsize=\"s\"\r\n\t\t\t:=\"buttonProps\"\r\n\t\t\t:title=\"buttonProps.title\"\r\n\t\t\tv-html=\"buttonProps.default\"\r\n\t\t/>\r\n\r\n\t\t<div v-if=\"metaText\" class=\"top-notice_itemMetaText\" v-html=\"metaText\"></div>\r\n\r\n\t\t<div\r\n\t\t\tclass=\"top-notice_itemClose\"\r\n\t\t\tdata-top-icon=\"\"\r\n\t\t\t:title=\"$i18n.Common.Close\"\r\n\t\t\t@click=\"() => close()\"\r\n\t\t></div>\r\n\t</div>\r\n</template>\r\n\r\n<style>\r\n@import \"style.css\";\r\n</style>\r\n","<!-- performance all in one file component, для Core.notice() -->\r\n<script lang=\"ts\">\r\nexport { show } from './utils';\r\n</script>\r\n\r\n<script setup lang=\"ts\">\r\nimport type { Item } from './utils';\r\nimport { itemById } from './utils';\r\n\r\nimport type { Props } from './types';\r\nimport TopNoticeItem from './item/item.vue';\r\n\r\ndefineProps<Props>();\r\n\r\nconst onCloseItem = (item: Item) => {\r\n\titem.onClose?.();\r\n\r\n\titemById.delete(item.id);\r\n};\r\n</script>\r\n\r\n<template>\r\n\t<teleport to=\"body\">\r\n\t\t<div class=\"top-notice\">\r\n\t\t\t<TopNoticeItem\r\n\t\t\t\tv-for=\"[_index, item] in itemById\"\r\n\t\t\t\t:key=\"item.id\"\r\n\t\t\t\t:id=\"item.id\"\r\n\t\t\t\t:title=\"item.title\"\r\n\t\t\t\t:text=\"item.text\"\r\n\t\t\t\t:style=\"item.style\"\r\n\t\t\t\t:buttonProps=\"item.buttonProps\"\r\n\t\t\t\t:metaText=\"item.metaText\"\r\n\t\t\t\t:isSafeHTML=\"item.isSafeHTML\"\r\n\t\t\t\t:forceClosed=\"item.forceClosed\"\r\n\t\t\t\t:hightlight=\"item.hightlight\"\r\n\t\t\t\t@close=\"onCloseItem(item)\"\r\n\t\t\t/>\r\n\t\t</div>\r\n\t</teleport>\r\n</template>\r\n\r\n<style>\r\n:root {\r\n\t--top-notice-top: var(--top-padding-4);\r\n\t--top-notice-right: var(--top-padding-4);\r\n}\r\n\r\n.top-notice {\r\n\twidth: 400px;\r\n\tfont-size: 14px;\r\n\tposition: fixed; top: var(--top-notice-top); right: var(--top-notice-right);\r\n\tz-index: 1000010;\r\n\tdisplay: flex; flex-direction: column-reverse; gap: var(--top-gap-2);\r\n}\r\n\r\n.top-notice ul {\r\n\tpadding: var(--top-padding-3) 0 0 var(--top-padding-5);\r\n}\r\n\r\n@media only screen and (max-width: 600px) {\r\n\t:root {\r\n\t\t--top-notice-top: var(--top-padding-4);\r\n\t\t--top-notice-right: var(--top-padding-4);\r\n\t}\r\n\r\n\t.top-notice { width: auto; left: var(--top-notice-right); }\r\n}\r\n</style>\r\n"],"names":["utils_string","text","style","options","show","title","chunks","hightlight","itemExists","id","itemById","_firstId","firstItem","close","forms","item","_a","prepareText","textNoSafety","props","__props","emit","__emit","showed","vue","closed","closedDirection","res","direction","onClick","e","tagName","el","ui","_e","_ui","onCloseItem"],"mappings":"yOAYC,cAAAA,EAAA,WAAAC,EAAAC,EAAA,KAAA,UAAAC,CAAA,CAAA,EAkBMC,EAAA,CAAAH,EAAAC,EAAA,OAAAC,IAAA,CACN,IAAAE,EAAA,GAEAJ,EAAA,OAAAA,CAAA,mBAIA,GAAAE,GAAA,MAAAA,EAAA,MACCE,EAAAF,EAAA,UAAgB;GAIhBG,EAAA;2BAQAC,EAAAC,CAAA,EAEA,gBAGkB,GAAAC,EAClB,MAAAJ,EACA,KAAAJ,EACA,MAAAC,EACA,YAAAC,GAAA,YAAAA,EAAA,YACsB,SAAAA,GAAA,YAAAA,EAAA,SACH,WAAAA,GAAA,YAAAA,EAAA,WACE,QAAAA,GAAA,YAAAA,EAAA,OACH,EAKnB,iBAAAO,EAAA,KAAA,EAAA,CACC,KAAA,CAAAC,EAAAC,CAAA,EAAA,CAAA,GAAAF,CAAA,EAAA,GAAA,CAAA,GAAA,CAAA,EACAE,GAAAC,EAAAD,CAAA,EAQDE,EAAA,KAAA,MAAA,UACC,EAAA,OAAA,EAAA,IAAA,QAAA,IAAAD,EAAAE,CAAA,CAAA,GAIFR,EAAAQ,GAAA,CACCA,EAAA,WAAA,oCAGD,EAEAF,EAAAE,GAAA,CACCA,EAAA,YAAA,0BAGCC,EAAAD,EAAA,UAAA,MAAAC,EAAA,KAAAD,qBAIF,EAKaE,EAAAhB,GAAA,CACZ,MAAAiB,EAAA,+eC9FD,MAAAC,EAAAC,EAEAC,EAAAC,EAGAC,EAAAC,EAAA,IAAA,EAAA,gCAIA,MAAAC,EAAAD,EAAA,IAAA,EAAA,EACAE,EAAAF,EAAA,IAAA,OAAA,EAEAnB,EAAAmB,EAAA,SAAA,IAAA,CACC,IAAAG,EAAAR,EAAA,MAAA,QAAA,QAAA,QAAA,EAEA,OAAAA,EAAA,aAAAQ,EAAAV,EAAAU,CAAA,IAEO,CAAA,EAGR1B,EAAAuB,EAAA,SAAA,IAAA,4DAKCL,EAAA,aAAAQ,EAAAV,EAAAU,CAAA,IAEO,CAAA,EAGRd,EAAAe,GAAA,CACCH,EAAA,MAAA,OAGCC,EAAA,MAAAE,+BAGiD,EAGnDC,EAAAC,GAAA,2BAGCC,IAAA,KAAAlB,EAAA,CAA2B,KAGb,QAAAmB,GAAA,CAIb,2BAAA,CAAAlB,EAAA,KAAA,GAAA,CAAAA,EAAA,KAAA,EAAA,GAAA,UAAA,OAEA,IAAAc,EAAA,yCAMS,KAJT,IAKC,KAAA,CAAAE,EAAAG,IAAA,CAGEL,EAAAK,EAAA,SAAA,KAAA,EAAA,QAAA,QAIF,KAAA,CAAAC,EAAAC,IAAA,CAECtB,EAAAe,CAAA,EACD,CAAA,EAEF,qrCClED,MAAAQ,EAAArB,GAAA,QACCC,EAAAD,EAAA,UAAA,MAAAC,EAAA,KAAAD,iBAEuB"}