@topvisor/ui 1.0.0-rc-2 → 1.0.1-colors-4

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 (114) hide show
  1. package/.chunks/{datepicker-DTNYG8Iy.es.js → datepicker-DUKbIc5P.es.js} +29 -29
  2. package/.chunks/datepicker-DUKbIc5P.es.js.map +1 -0
  3. package/.chunks/{datepicker-C-d1Do_N.amd.js → datepicker-Dr2CKlYv.amd.js} +13 -13
  4. package/.chunks/datepicker-Dr2CKlYv.amd.js.map +1 -0
  5. package/.chunks/{forms--Ye61xQ5.amd.js → forms-CQJeARc0.amd.js} +3 -3
  6. package/.chunks/forms-CQJeARc0.amd.js.map +1 -0
  7. package/.chunks/{forms-NfVxcPud.es.js → forms-UyeTiEcX.es.js} +19 -19
  8. package/.chunks/forms-UyeTiEcX.es.js.map +1 -0
  9. package/.chunks/i18n-C_OH9IT3.amd.js.map +1 -1
  10. package/.chunks/i18n-DuTvft1T.es.js.map +1 -1
  11. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-BToGplRR.es.js → listItem.vue_vue_type_script_setup_true_lang-BJPv6Rkm.es.js} +4 -4
  12. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-BJPv6Rkm.es.js.map +1 -0
  13. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-CHhCooGV.amd.js +2 -0
  14. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-CHhCooGV.amd.js.map +1 -0
  15. package/.chunks/{menu-ChmT8cWp.es.js → menu-BR766pdp.es.js} +2 -2
  16. package/.chunks/{menu-ChmT8cWp.es.js.map → menu-BR766pdp.es.js.map} +1 -1
  17. package/.chunks/{menu-Gnm18ZCc.amd.js → menu-C7wWX96K.amd.js} +2 -2
  18. package/.chunks/{menu-Gnm18ZCc.amd.js.map → menu-C7wWX96K.amd.js.map} +1 -1
  19. package/.chunks/popup-Bcbpecn1.amd.js +447 -0
  20. package/.chunks/popup-Bcbpecn1.amd.js.map +1 -0
  21. package/.chunks/{popup-_a1ivPRI.es.js → popup-CRwjKDwT.es.js} +42 -31
  22. package/.chunks/popup-CRwjKDwT.es.js.map +1 -0
  23. package/assets/core.css +1 -1
  24. package/assets/forms.css +1 -1
  25. package/assets/formsExt.css +1 -1
  26. package/assets/menu.css +1 -1
  27. package/assets/popup.css +1 -1
  28. package/assets/tabs.css +1 -1
  29. package/assets/tabsView.css +1 -1
  30. package/assets/themes/dark.css +1 -0
  31. package/assets/themes/light.css +1 -0
  32. package/components/forms/select/select.d.ts +1 -2
  33. package/components/popup/lib/popup.d.ts +11 -5
  34. package/components/popup/lib/popup.globalEvents.d.ts +10 -3
  35. package/components/popup/lib/worker.d.ts +37 -18
  36. package/components/popup/lib/worker.globalEvents.d.ts +9 -2
  37. package/components/popup/popup/opener.vue.d.ts +3 -3
  38. package/components/popup/popup/popup.d.ts +17 -13
  39. package/components/popup/popup/popup.vue.d.ts +3 -3
  40. package/core/app.amd.js +1 -1
  41. package/core/app.amd.js.map +1 -1
  42. package/core/app.js +102 -61
  43. package/core/app.js.map +1 -1
  44. package/core/core.amd.js +1 -1
  45. package/core/core.js +1 -1
  46. package/core/plugins/core.d.ts +4 -1
  47. package/core/plugins/i18n.d.ts +2 -2
  48. package/core/utils/dom.d.ts +1 -1
  49. package/forms/forms.amd.js +1 -1
  50. package/forms/forms.js +1 -1
  51. package/formsExt/formsExt.amd.js +1 -1
  52. package/formsExt/formsExt.amd.js.map +1 -1
  53. package/formsExt/formsExt.js +4 -4
  54. package/formsExt/formsExt.js.map +1 -1
  55. package/package.json +2 -1
  56. package/popup/popup.amd.js +1 -1
  57. package/popup/popup.js +2 -2
  58. package/popup/popup.js.map +1 -1
  59. package/popup/worker.amd.js +1 -1
  60. package/popup/worker.amd.js.map +1 -1
  61. package/popup/worker.js +52 -74
  62. package/popup/worker.js.map +1 -1
  63. package/project/project.amd.js +1 -1
  64. package/project/project.amd.js.map +1 -1
  65. package/project/project.js +17 -17
  66. package/project/project.js.map +1 -1
  67. package/tabs/tabs.amd.js +1 -1
  68. package/tabs/tabs.amd.js.map +1 -1
  69. package/tabs/tabs.js +7 -8
  70. package/tabs/tabs.js.map +1 -1
  71. package/tabsView/tabsView.amd.js +1 -1
  72. package/tabsView/tabsView.amd.js.map +1 -1
  73. package/tabsView/tabsView.js +1 -1
  74. package/tabsView/tabsView.js.map +1 -1
  75. package/test/themes/themes/dark-positions.amd.js +2 -0
  76. package/test/themes/themes/dark-positions.amd.js.map +1 -0
  77. package/test/themes/themes/dark-positions.d.ts +1 -0
  78. package/test/themes/themes/dark-positions.js +2 -0
  79. package/test/themes/themes/dark-positions.js.map +1 -0
  80. package/test/themes/themes/dark.amd.js +2 -0
  81. package/test/themes/themes/dark.amd.js.map +1 -0
  82. package/test/themes/themes/dark.d.ts +1 -0
  83. package/test/themes/themes/dark.js +4 -0
  84. package/test/themes/themes/dark.js.map +1 -0
  85. package/test/themes/themes/light-positions.amd.js +2 -0
  86. package/test/themes/themes/light-positions.amd.js.map +1 -0
  87. package/test/themes/themes/light-positions.d.ts +1 -0
  88. package/test/themes/themes/light-positions.js +2 -0
  89. package/test/themes/themes/light-positions.js.map +1 -0
  90. package/test/themes/themes/light.amd.js +2 -0
  91. package/test/themes/themes/light.amd.js.map +1 -0
  92. package/test/themes/themes/light.d.ts +1 -0
  93. package/test/themes/themes/light.js +4 -0
  94. package/test/themes/themes/light.js.map +1 -0
  95. package/utils/date.amd.js +1 -1
  96. package/utils/date.js +1 -1
  97. package/utils/device.amd.js +1 -1
  98. package/utils/device.js +1 -1
  99. package/utils/dom.amd.js.map +1 -1
  100. package/utils/dom.js.map +1 -1
  101. package/utils/price.amd.js +1 -1
  102. package/utils/price.js +1 -1
  103. package/.chunks/datepicker-C-d1Do_N.amd.js.map +0 -1
  104. package/.chunks/datepicker-DTNYG8Iy.es.js.map +0 -1
  105. package/.chunks/forms--Ye61xQ5.amd.js.map +0 -1
  106. package/.chunks/forms-NfVxcPud.es.js.map +0 -1
  107. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-BToGplRR.es.js.map +0 -1
  108. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-BsrusTUW.amd.js +0 -2
  109. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-BsrusTUW.amd.js.map +0 -1
  110. package/.chunks/popup-Dwf3PJQf.amd.js +0 -447
  111. package/.chunks/popup-Dwf3PJQf.amd.js.map +0 -1
  112. package/.chunks/popup-_a1ivPRI.es.js.map +0 -1
  113. package/assets/dark.css +0 -1
  114. package/assets/light.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tabsView.js","sources":["../../src/core/utils/store/localStorage.ts","../../src/components/tabsView/tabsView/store.ts","../../src/components/tabsView/tabsView/menuItem.vue","../../src/components/tabsView/tabsView/utils.ts","../../src/components/tabsView/tabsView/menu.vue","../../src/components/tabsView/tabsView/tabsView.vue","../../src/components/tabsView/tabsView/menuDelimeter.vue","../../src/components/tabsView/tabsView/menuTitle.vue","../../src/components/tabsView/tabsView.ts"],"sourcesContent":["import { watch } from 'vue';\nimport type { Store } from './store';\n\n/**\n * Сгенерировать имя для сохранения данных в localStorage\n * @param stateName - имя свойства состояния\n * @param stateKey - ключ состояния, разные компоненты могут использовать одинаковый ключ\n */\nconst genStorageKey = <T extends Store>(stateName: keyof T, stateKey: string): string => {\n\tconst stateNameString = String(stateName);\n\n\treturn `top:${stateNameString}:${stateKey}`;\n};\n\n/**\n * Загрузить состояние\n * @param stateName - имя свойства состояния\n * @param store\n */\nconst loadLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\n\t// если Store.key не знадан, значит сохранение состояния в компоненте отключено\n\tif (!store.$id) return;\n\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\n\n\ttry {\n\t\tconst localStorageValue: typeof store[keyof typeof store] = JSON.parse(localStorage.getItem(localStorageKey) as string);\n\n\t\tif (typeof localStorageValue === typeof store[stateName]) {\n\t\t\tstore[stateName] = localStorageValue;\n\t\t}\n\t} catch (e) {\n\t\tconsole.warn(new Error(`В localStorage[${localStorageKey}] не корректный json`));\n\t}\n};\n\n/**\n * Добавить автосохранение состояние при его изменении\n * @param stateName - имя свойства состояния\n * @param store\n */\nconst addSaverLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\n\t// если store.$id не знадан, значит сохранение состояния в компоненте отключено\n\tif (!store.$id) return;\n\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\n\n\twatch(() => store[stateName], () => {\n\t\tlocalStorage.setItem(localStorageKey, JSON.stringify(store[stateName]));\n\t}, { immediate: true });\n};\n\nexport default {\n\tloadLocalStorge,\n\taddSaverLocalStorge,\n};","import type { ModelRef, InjectionKey } from 'vue';\nimport { ref, computed } from 'vue';\nimport Core from '@/core/core/core';\nimport { defineStore, useStore } from '@/core/utils/store';\nimport StoreLocalStorage from '@/core/utils/store/localStorage';\nimport type { Props, Store } from './tabsView';\n\nexport const injectionKey = Symbol() as InjectionKey<Store>;\n\n/**\n * Инициировать Store компонента\n */\nexport const defineTabsStore = (props: Props, model: ModelRef<string | undefined>) => {\n\tconst store = defineStore(injectionKey, () => {\n\t\tconst showMenuInPopup = computed(() => props.showMenuInPopup ?? Core.state.isMobile);\n\t\tconst pageMod = computed(() => props.pageMod);\n\t\tconst isShort = ref(false);\n\n\t\tconst component = ref(undefined);\n\t\tconst scrollable = ref(true);\n\n\t\treturn {\n\t\t\tshowMenuInPopup,\n\t\t\tpageMod,\n\t\t\tisShort,\n\t\t\tactiveItemName: model,\n\t\t\tcomponent,\n\t\t\tscrollable,\n\t\t};\n\t}, props.idState);\n\n\tif (props.isShortable) {\n\t\tconst stateName = 'isShort';\n\n\t\tStoreLocalStorage.loadLocalStorge(stateName, store);\n\t\tStoreLocalStorage.addSaverLocalStorge(stateName, store);\n\t}\n\n\treturn store;\n};\n\n/**\n * Получить Store компонента\n */\nexport const useTabsStore = () => useStore(injectionKey);\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { genHash } from '@/core/utils/route';\nimport { TopPopupListItem } from '@/components/popup/popup';\nimport { useTabsStore } from './store';\nimport type { PropsMenuItem } from './tabsView';\n\nconst props = withDefaults(defineProps<PropsMenuItem>(), {\n\tscrollable: true,\n\tcomponent: undefined,\n});\n\nconst store = useTabsStore();\n\nconst href = computed(() => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (props.name && store.$id) {\n\t\treturn genHash(store.$id, props.name);\n\t}\n\n\treturn props.href;\n});\n\nconst tagName = computed(() => {\n\tif (store.showMenuInPopup) {\n\t\treturn TopPopupListItem;\n\t}\n\n\treturn href ? 'a' : 'button';\n});\n\n/**\n * Клик по элементу меню\n */\nconst onClick = (e: MouseEvent) => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (!props.href && href.value) {\n\t\te.preventDefault();\n\t}\n\n\tif (props.name) {\n\t\tstore.activeItemName = props.name;\n\t}\n};\n</script>\n\n<template>\n\t<component\n\t\t:is=\"tagName\"\n\t\ttarget=\"_self\"\n\t\t:class=\"{\n\t\t\t['top-tabsView_menuItem']: !store.showMenuInPopup,\n\t\t\t['top-active']: name && store.activeItemName === name,\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-spa-disabled']: true,\n\t\t}\"\n\t\t:href=\"href\"\n\t\t:data-top-icon=\"icon || undefined\"\n\t\t:disabled=\"disabled || undefined\"\n\t\t@click=\"onClick\"\n\t>\n\t\t<slot v-if=\"store.showMenuInPopup\"></slot>\n\n\t\t<span\n\t\t\tv-else-if=\"$slots.default && !store.isShort\"\n\t\t\tclass=\"top-ellipsis\"\n\t\t>\n\t\t\t<slot></slot>\n\t\t</span>\n\t</component>\n</template>\n\n<style module>\n.top-tabsView_menuItem {\n\t--top-icon-color: var(--color-icon-2);\n\t--top-icon-width: calc(var(--top-icon-size));\n\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\n\tborder: none;\n\tborder-radius: var(--top-radius-2);\n\tpadding: var(--top-padding-2);\n\tbackground: transparent;\n\theight: 40px;\n\n\tcolor: var(--color-text-1);\n\ttext-decoration: none;\n\twhite-space: nowrap;\n\n\tdisplay: flex;\n\tgap: var(--top-gap-2);\n\talign-items: center;\n\tjustify-content: flex-start;\n\ttransition: background var(--transition);\n}\n\n.top-tabsView_menuItem:hover {\n\tbackground: var(--color-layer-secondary-2);\n\t--top-icon-color: var(--color-icon-1);\n\ttext-decoration: none;\n}\n\n.top-tabsView_menuItem.top-active {\n\tcursor: unset;\n\tbackground: var(--color-bg-3);\n}\n\n.top-tabsView_menuItem:disabled:not(option):not(optgroup):not(.top-forms-option),\n.top-tabsView_menuItem:disabled ~ .top-formsCaption,\n.top-tabsView_menuItem.top-disabled[data-top-icon]:before,\n.top-tabsView_menuItem.top-disabled[data-top-icon2]:after {\n\topacity: unset;\n\tfilter: unset;\n}\n\n.top-tabsView_menuItem.top-disabled {\n\t--top-icon-color: var(--color-text-4);\n\n\tcolor: var(--color-text-4);\n}\n</style>\n","// TODO: Эту функцию можно вынести в глобальный utils\n\nimport { sleepWhile } from '@/core/utils/system';\n\n/**\n * Проверка нахождения компонента в состояние загрузки\n * @param component\n */\nexport const checkComponentIsLoading = (component: any) => {\n\treturn component?.name === 'AsyncComponentWrapper' && !component?.__asyncResolved;\n};\n\n/**\n * Презагрузить компонент\n *\n * Некоторое время ожидает загрузку компонента, прежде чем завершит работу\n */\nexport const preResolveComponent = async (component: any, condition: Function) => {\n\tif (component?.name !== 'AsyncComponentWrapper') return;\n\tif (component?.__asyncResolved) return;\n\n\tcomponent.__asyncLoader();\n\n\tawait sleepWhile(() => {\n\t\treturn condition() && checkComponentIsLoading(component);\n\t}, 200);\n};\n","<script setup lang=\"ts\">\nimport type { Ref } from 'vue';\nimport { markRaw, onMounted, onUnmounted, ref, useSlots, watch } from 'vue';\nimport { TopPopup } from '../../popup/popup';\nimport { getHash, setHash } from '@/core/utils/route';\n\nimport type { PropsMenu, PropsMenuItem, MenuItem } from './tabsView';\nimport { useTabsStore } from './store';\nimport TabsViewMenuItem from './menuItem.vue';\nimport { preResolveComponent } from './utils';\n\ndefineProps<PropsMenu>();\n\nconst isLoading = defineModel('isLoading');\n\nconst store = useTabsStore();\n\nconst slots = useSlots();\n\n// словарь используется для оптимизации получения нужного menuItem\nconst menuItemByName: Map<PropsMenuItem['name'], MenuItem> = new Map();\n\n// сгенерировать словарь с menuItem, по элементам в slot\nconst genMenuItemByName = () => {\n\tif (!slots.default) return;\n\n\tconst component: any = slots.default().find(item => item.key === '_menu');\n\tif (!component) return;\n\n\tcomponent.children.forEach((subComponent: any) => {\n\t\tif (subComponent.type.__name !== TabsViewMenuItem.__name) return;\n\t\tif (!subComponent.props.name || subComponent.props.disabled) return;\n\n\t\tconst menuItem: MenuItem = {\n\t\t\ttitle: (subComponent.children.default?.()[0].children as string).trim(),\n\t\t\ticon: subComponent.props.icon,\n\t\t\tcomponent: subComponent.props.component ? markRaw(subComponent.props.component) : TabsViewMenuItem.props.component.default,\n\t\t\tscrollable: subComponent.props.scrollable ?? TabsViewMenuItem.props.scrollable.default,\n\t\t};\n\n\t\tmenuItemByName.set(subComponent.props.name, menuItem);\n\t});\n};\n\n/**\n * activeMenuItem нужен:\n * - для вывода текста активной вкладки в меню с popup\n * - для вывода компонента активной вкладки (store.component)\n * - для установки store.scrollable\n */\nconst activeMenuItem: Ref<MenuItem | null> = ref(null);\n\n/**\n * Кол-во изменений активной вкладки\n */\nlet countChanged = 0;\n\n/**\n * Смена активной вкладки\n *\n * TODO: смена slot, например смена языка, требует повторного выполнения genMenuItemByName()\n */\nwatch(\n\t() => store.activeItemName,\n\tasync () => {\n\t\tconst numberChanged = ++countChanged; // порядковый номер текущего изменения\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tgenMenuItemByName();\n\t\t}\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tstore.activeItemName = '';\n\n\t\t\treturn;\n\t\t}\n\n\t\tactiveMenuItem.value = menuItemByName.get(store.activeItemName) ?? null;\n\n\t\t// элемент не найден, установить из хеша страницы\n\t\tif (!activeMenuItem.value && store.$id) {\n\t\t\tconst activeItemName = getHash(store.$id);\n\n\t\t\tactiveMenuItem.value = menuItemByName.get(activeItemName) ?? null;\n\n\t\t\tif (activeMenuItem.value) {\n\t\t\t\tstore.activeItemName = activeItemName;\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// элемент не найден, установить первый доступный\n\t\tif (!activeMenuItem.value) {\n\t\t\tstore.activeItemName = menuItemByName.keys().next().value;\n\n\t\t\treturn;\n\t\t}\n\n\t\t// запрошена смена на уже активный элемент\n\t\tif (activeMenuItem.value.component === store.component) {\n\t\t\tisLoading.value = false;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (store.$id) setHash(store.$id, store.activeItemName, true);\n\n\t\t// флаг загрузки будет сброшен при инициализации компонента\n\t\tisLoading.value = true;\n\n\t\t/**\n\t\t * Презагрузить компонент\n\t\t *\n\t\t * Нужно для того, чтобы минимизировать скачки интерфейса при ожидании загрузки асинхронного компонента\n\t\t */\n\t\tawait preResolveComponent(activeMenuItem.value.component, () => numberChanged === countChanged);\n\n\t\t// влкадка была сменена еще раз во время sleepWhile\n\t\tif (numberChanged !== countChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tstore.scrollable = activeMenuItem.value.scrollable;\n\t\tstore.component = activeMenuItem.value.component;\n\n\t\tif (activeMenuItem.value && !store.component) {\n\t\t\tconsole.warn(`Компонент вкладки ${store.activeItemName} не найден. Добавьте props.component для пункта меню ${store.activeItemName}.`);\n\t\t}\n\t},\n\t{ immediate: true },\n);\n\nconst elRef = ref();\nlet resizeObserver: ResizeObserver;\n\nonMounted(() => {\n\tresizeObserver = new ResizeObserver(() => {\n\t\telRef.value.parentElement.style.setProperty('--top-tabsView-contents-offset-top', elRef.value.offsetHeight + 'px');\n\t});\n\n\tresizeObserver.observe(elRef.value);\n});\n\nonUnmounted(() => {\n\tresizeObserver.disconnect();\n});\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t'top-tabsView_menu': true,\n\t\t\t'top-tabsView_menu-inPopup_0': !store.showMenuInPopup,\n\t\t\t'top-tabsView_menu-inPopup_1': store.showMenuInPopup,\n\t\t\t'top-tabsView_menu-short': store.isShort && !store.showMenuInPopup,\n\t\t}\"\n\t>\n\t\t<!-- Спрятать меню под кнопку в popup -->\n\t\t<TopPopup v-if=\"store.showMenuInPopup\">\n\t\t\t<template #opener>\n\t\t\t\t<div class=\"top-tabsView_menuOpener\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"activeMenuItem\"\n\t\t\t\t\t\tclass=\"top-tabsView_menuOpenerActiveItem\"\n\t\t\t\t\t\t:data-top-icon=\"activeMenuItem.icon\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"top-ellipsis\">\n\t\t\t\t\t\t\t{{ activeMenuItem.title }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"top-tabsView_menuOpenerIcon\" data-top-icon=\"\"></div>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<slot></slot>\n\t\t\t</template>\n\t\t</TopPopup>\n\n\t\t<!-- Отобразить меню на странице -->\n\t\t<template v-else>\n\t\t\t<div class=\"top-tabsView_menuList\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-if=\"isShortable\"\n\t\t\t\tclass=\"top-tabsView_menuFooter\"\n\t\t\t>\n\t\t\t\t<TabsViewMenuItem\n\t\t\t\t\tv-if=\"isShortable\"\n\t\t\t\t\t:icon=\"store.isShort ? '' : ''\"\n\t\t\t\t\t@click=\"store.isShort = !store.isShort\"\n\t\t\t\t>\n\t\t\t\t\t{{ store.isShort ? '' : 'Свернуть' }} <!--TODO: translate-->\n\t\t\t\t</TabsViewMenuItem>\n\t\t\t</div>\n\t\t</template>\n\t</div>\n</template>\n\n<style module>\n/* режим отображение табов в основной области документа */\n.top-tabsView-pageMod .top-tabsView_menu {\n\tbox-sizing: border-box;\n\tposition: sticky;\n\ttop: var(--top-tabsView-top);\n\tz-index: 10;\n}\n\n/* режим отображение табов в основной области документа без popup */\n.top-tabsView-pageMod .top-tabsView_menu-inPopup_0 {\n\theight: calc(var(--100vh) - var(--top-tabsView-top));\n}\n\n/* стантартный режим */\n.top-tabsView_menu-inPopup_0 {\n\tbox-sizing: border-box;\n\twidth: var(--top-tabsView-menu-width);\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: space-between;\n}\n\n/* режим вывода в popup */\n.top-tabsView_menu-inPopup_1 {\n\tborder-bottom: 1px solid var(--color-line-2-opacity);\n}\n\n.top-tabsView_menu-short {\n\twidth: auto;\n}\n\n.top-tabsView_menu > .top-tabsView_menuOpener {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n}\n\n.top-tabsView_menu > .top-tabsView_menuOpener:hover {\n\tbackground: var(--color-layer-secondary-1);\n}\n\n.top-tabsView_menuOpenerIcon { display: flex; }\n\n.top-tabsView_menuOpenerActiveItem {\n\t--top-forms-padding: 0px;\n\n\tbox-sizing: border-box;\n\tpadding: var(--top-padding-2);\n\tmax-width: calc(100% - var(--top-forms-base-height));\n\twhite-space: nowrap;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--top-padding-2);\n}\n\n.top-tabsView_menuList,\n.top-tabsView_menuFooter {\n\tpadding: var(--top-padding-2);\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-2);\n}\n\n.top-tabsView_menuList {\n\toverflow-y: auto;\n}\n\n.top-tabsView_menu-short .top-tabsView_menuFooter > .top-tabsView_menuItem {\n\t--top-icon-width: 100%;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { defineModel, onUnmounted, ref, watch } from 'vue';\nimport { delHash } from '@/core/utils/route';\nimport type { Props } from './tabsView';\nimport { defineTabsStore } from './store';\nimport TabsViewMenu from './menu.vue';\nimport TopLoadbar from '@/components/forms/loadbar/loadbar.vue';\nimport { checkComponentIsLoading } from './utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tshowMenuInPopup: undefined,\n\tisShortable: false,\n});\n\nconst model = defineModel<string>();\n\nconst store = defineTabsStore(props, model);\n\n/**\n * Установка или снятие глобального модификатора\n * @see props.pageMod\n */\nconst setDocumentPageModModificator = (pageMod: boolean) => {\n\tdocument.documentElement.classList.toggle('top-hasTabsViewPageMod', pageMod);\n};\n\nif (props.pageMod) setDocumentPageModModificator(true);\n\nonUnmounted(() => {\n\tif (props.pageMod) setDocumentPageModModificator(false);\n\n\tif (store.$id) delHash(store.$id, store.activeItemName, true);\n});\n\nconst componentRef = ref();\nconst isLoading = ref(false);\n\nwatch([componentRef, () => store.component], () => {\n\tisLoading.value = checkComponentIsLoading(store.component);\n}, { immediate: true });\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tabsView': true,\n\t\t\t'top-tabsView-pageMod': props.pageMod,\n\t\t\t'top-tabsView-inPopup': store.showMenuInPopup,\n\t\t}\"\n\t>\n\t\t<TabsViewMenu\n\t\t\t:isShortable=\"isShortable\"\n\t\t\tv-model:isLoading=\"isLoading\"\n\t\t>\n\t\t\t<!-- @slot Меню, ожидает передачу компонентов TabsViewMenuItem и TabsViewMenuTitle -->\n\t\t\t<slot name=\"menu\"></slot>\n\t\t</TabsViewMenu>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-tabsView_contents': true,\n\t\t\t\t'top-tabsView_contents-isLoading': isLoading,\n\t\t\t\t'top-tabsView_contents-noScrollable': !store.scrollable,\n\t\t\t}\"\n\t\t>\n\t\t\t<TopLoadbar v-if=\"isLoading\"/>\n\n\t\t\t<keep-alive>\n\t\t\t\t<component\n\t\t\t\t\tref=\"componentRef\"\n\t\t\t\t\t:is=\"store.component\"\n\t\t\t\t/>\n\t\t\t</keep-alive>\n\t\t</div>\n\t</div>\n</template>\n\n<style module>\n:root {\n\t--top-tabsView-top: 0px;\n\t--top-tabsView-menu-width: 220px;\n\t--top-tabsView-contents-offset-top: 0px;\n}\n\n.top-tabsView {\n\tbackground: var(--color-bg-2);\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: row;\n}\n\n.top-tabsView_contents {\n\tborder-radius: var(--top-radius-4);\n\tbackground: var(--color-bg-3);\n\tpadding: var(--top-padding-4);\n\tflex-grow: 1;\n\toverflow: auto;\n\tposition: relative;\n}\n\n.top-tabsView_contents-isLoading {\n\tpointer-events: none;\n}\n\n.top-tabsView_contents-noScrollable {\n\twidth: calc(100% - var(--top-tabsView-menu-width));\n\tpadding: 0;\n\toverflow: visible;\n}\n\n/* top-tabsView-inPopup */\n.top-tabsView-inPopup {\n\tbackground: var(--color-bg-3);\n\tflex-direction: column;\n}\n\n.top-tabsView-inPopup > .top-tabsView_contents {\n\tborder-radius: 0;\n}\n\n.top-tabsView-inPopup > .top-tabsView_contents-noScrollable {\n\twidth: auto;\n}\n</style>\n","<script setup lang=\"ts\">\n\n</script>\n\n<template>\n\t<div class=\"top-tabsView_menuDelimeter\"></div>\n</template>\n\n<style module>\n.top-tabsView_menuDelimeter {\n\tpadding: var(--top-padding-1) 0;\n\tdisplay: flex;\n}\n\n.top-tabsView_menuDelimeter:before {\n\tcontent: \"\";\n\theight: 2px;\n\tbackground: var(--color-line-2);\n\tflex-grow: 1;\n}\n\n.top-tabsView_menuDelimeter:first-child,\n.top-tabsView_menuDelimeter + .top-tabsView_menuDelimeter {\n\tdisplay: none;\n}\n</style>","<script setup lang=\"ts\">\nimport { useTabsStore } from './store';\nimport type { PropsMenuTitle } from './tabsView';\nimport TabsViewMenuDelimeter from './menuDelimeter.vue';\nimport { TopPopupListItem } from '../../popup/popup';\n\ndefineProps<PropsMenuTitle>();\n\nconst store = useTabsStore();\n</script>\n\n<template>\n\t<TopPopupListItem\n\t\tv-if=\"store.showMenuInPopup\"\n\t\ttype=\"title\"\n\t>\n\t\t<slot></slot>\n\t</TopPopupListItem>\n\n\t<TabsViewMenuDelimeter v-else-if=\"store.isShort\"/>\n\n\t<div\n\t\tv-else\n\t\t:class=\"{\n\t\t\t'top-tabsView_menuTitle': true,\n\t\t\t'top-tabsView_menuTitle-subtitle': isSubtitle,\n\t\t}\"\n\t>\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<style module>\n.top-tabsView_menuTitle {\n\tpadding: var(--top-padding-4) var(--top-padding-2) var(--top-padding-1);\n\tfont-weight: 600;\n\tcolor: var(--color-text-1);\n}\n\n.top-tabsView_menuTitle-subtitle {\n\tpadding-top: var(--top-padding-1);\n\tfont-size: 12px;\n\tfont-weight: 400;\n\tcolor: var(--color-text-2);\n}\n</style>\n","import type { ComponentCustomProps } from 'vue';\n\nimport TabsView from './tabsView/tabsView.vue';\nimport TabsViewMenuItem from './tabsView/menuItem.vue';\nimport TabsViewMenuTitle from './tabsView/menuTitle.vue';\n\nexport const TopTabsView = TabsView as typeof TabsView & ComponentCustomProps;\nexport const TopTabsViewMenuItem = TabsViewMenuItem as typeof TabsViewMenuItem & ComponentCustomProps;\nexport const TopTabsViewMenuTitle = TabsViewMenuTitle as typeof TabsViewMenuTitle & ComponentCustomProps;\n"],"names":["genStorageKey","stateName","stateKey","loadLocalStorge","store","localStorageKey","localStorageValue","addSaverLocalStorge","watch","StoreLocalStorage","injectionKey","defineTabsStore","props","model","defineStore","showMenuInPopup","computed","Core","pageMod","isShort","ref","component","scrollable","useTabsStore","useStore","__props","href","genHash","tagName","TopPopupListItem","onClick","e","checkComponentIsLoading","preResolveComponent","condition","sleepWhile","isLoading","useModel","slots","useSlots","menuItemByName","genMenuItemByName","item","subComponent","TabsViewMenuItem","menuItem","_b","_a","markRaw","activeMenuItem","countChanged","numberChanged","activeItemName","getHash","setHash","elRef","resizeObserver","onMounted","onUnmounted","setDocumentPageModModificator","delHash","componentRef","_sfc_render","_ctx","_cache","TopTabsView","TabsView","TopTabsViewMenuItem","TopTabsViewMenuTitle","TabsViewMenuTitle"],"mappings":"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"}
1
+ {"version":3,"file":"tabsView.js","sources":["../../src/core/utils/store/localStorage.ts","../../src/components/tabsView/tabsView/store.ts","../../src/components/tabsView/tabsView/menuItem.vue","../../src/components/tabsView/tabsView/utils.ts","../../src/components/tabsView/tabsView/menu.vue","../../src/components/tabsView/tabsView/tabsView.vue","../../src/components/tabsView/tabsView/menuDelimeter.vue","../../src/components/tabsView/tabsView/menuTitle.vue","../../src/components/tabsView/tabsView.ts"],"sourcesContent":["import { watch } from 'vue';\nimport type { Store } from './store';\n\n/**\n * Сгенерировать имя для сохранения данных в localStorage\n * @param stateName - имя свойства состояния\n * @param stateKey - ключ состояния, разные компоненты могут использовать одинаковый ключ\n */\nconst genStorageKey = <T extends Store>(stateName: keyof T, stateKey: string): string => {\n\tconst stateNameString = String(stateName);\n\n\treturn `top:${stateNameString}:${stateKey}`;\n};\n\n/**\n * Загрузить состояние\n * @param stateName - имя свойства состояния\n * @param store\n */\nconst loadLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\n\t// если Store.key не знадан, значит сохранение состояния в компоненте отключено\n\tif (!store.$id) return;\n\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\n\n\ttry {\n\t\tconst localStorageValue: typeof store[keyof typeof store] = JSON.parse(localStorage.getItem(localStorageKey) as string);\n\n\t\tif (typeof localStorageValue === typeof store[stateName]) {\n\t\t\tstore[stateName] = localStorageValue;\n\t\t}\n\t} catch (e) {\n\t\tconsole.warn(new Error(`В localStorage[${localStorageKey}] не корректный json`));\n\t}\n};\n\n/**\n * Добавить автосохранение состояние при его изменении\n * @param stateName - имя свойства состояния\n * @param store\n */\nconst addSaverLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\n\t// если store.$id не знадан, значит сохранение состояния в компоненте отключено\n\tif (!store.$id) return;\n\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\n\n\twatch(() => store[stateName], () => {\n\t\tlocalStorage.setItem(localStorageKey, JSON.stringify(store[stateName]));\n\t}, { immediate: true });\n};\n\nexport default {\n\tloadLocalStorge,\n\taddSaverLocalStorge,\n};","import type { ModelRef, InjectionKey } from 'vue';\nimport { ref, computed } from 'vue';\nimport Core from '@/core/core/core';\nimport { defineStore, useStore } from '@/core/utils/store';\nimport StoreLocalStorage from '@/core/utils/store/localStorage';\nimport type { Props, Store } from './tabsView';\n\nexport const injectionKey = Symbol() as InjectionKey<Store>;\n\n/**\n * Инициировать Store компонента\n */\nexport const defineTabsStore = (props: Props, model: ModelRef<string | undefined>) => {\n\tconst store = defineStore(injectionKey, () => {\n\t\tconst showMenuInPopup = computed(() => props.showMenuInPopup ?? Core.state.isMobile);\n\t\tconst pageMod = computed(() => props.pageMod);\n\t\tconst isShort = ref(false);\n\n\t\tconst component = ref(undefined);\n\t\tconst scrollable = ref(true);\n\n\t\treturn {\n\t\t\tshowMenuInPopup,\n\t\t\tpageMod,\n\t\t\tisShort,\n\t\t\tactiveItemName: model,\n\t\t\tcomponent,\n\t\t\tscrollable,\n\t\t};\n\t}, props.idState);\n\n\tif (props.isShortable) {\n\t\tconst stateName = 'isShort';\n\n\t\tStoreLocalStorage.loadLocalStorge(stateName, store);\n\t\tStoreLocalStorage.addSaverLocalStorge(stateName, store);\n\t}\n\n\treturn store;\n};\n\n/**\n * Получить Store компонента\n */\nexport const useTabsStore = () => useStore(injectionKey);\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { genHash } from '@/core/utils/route';\nimport { TopPopupListItem } from '@/components/popup/popup';\nimport { useTabsStore } from './store';\nimport type { PropsMenuItem } from './tabsView';\n\nconst props = withDefaults(defineProps<PropsMenuItem>(), {\n\tscrollable: true,\n\tcomponent: undefined,\n});\n\nconst store = useTabsStore();\n\nconst href = computed(() => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (props.name && store.$id) {\n\t\treturn genHash(store.$id, props.name);\n\t}\n\n\treturn props.href;\n});\n\nconst tagName = computed(() => {\n\tif (store.showMenuInPopup) {\n\t\treturn TopPopupListItem;\n\t}\n\n\treturn href ? 'a' : 'button';\n});\n\n/**\n * Клик по элементу меню\n */\nconst onClick = (e: MouseEvent) => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (!props.href && href.value) {\n\t\te.preventDefault();\n\t}\n\n\tif (props.name) {\n\t\tstore.activeItemName = props.name;\n\t}\n};\n</script>\n\n<template>\n\t<component\n\t\t:is=\"tagName\"\n\t\ttarget=\"_self\"\n\t\t:class=\"{\n\t\t\t['top-tabsView_menuItem']: !store.showMenuInPopup,\n\t\t\t['top-active']: name && store.activeItemName === name,\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-spa-disabled']: true,\n\t\t}\"\n\t\t:href=\"href\"\n\t\t:data-top-icon=\"icon || undefined\"\n\t\t:disabled=\"disabled || undefined\"\n\t\t@click=\"onClick\"\n\t>\n\t\t<slot v-if=\"store.showMenuInPopup\"></slot>\n\n\t\t<span\n\t\t\tv-else-if=\"$slots.default && !store.isShort\"\n\t\t\tclass=\"top-ellipsis\"\n\t\t>\n\t\t\t<slot></slot>\n\t\t</span>\n\t</component>\n</template>\n\n<style module>\n.top-tabsView_menuItem {\n\t--top-icon-color: var(--color-text-2);\n\t--top-icon-width: calc(var(--top-icon-size));\n\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\n\tborder: none;\n\tborder-radius: var(--top-radius-2);\n\tpadding: var(--top-padding-2);\n\tbackground: transparent;\n\theight: 40px;\n\n\tcolor: var(--color-text-1);\n\ttext-decoration: none;\n\twhite-space: nowrap;\n\n\tdisplay: flex;\n\tgap: var(--top-gap-2);\n\talign-items: center;\n\tjustify-content: flex-start;\n\ttransition: background var(--transition);\n}\n\n.top-tabsView_menuItem:hover {\n\t--top-icon-color: var(--color-text-1);\n\n\tbackground: var(--color-bg-shading-3);\n\ttext-decoration: none;\n}\n\n.top-tabsView_menuItem.top-active {\n\tcursor: unset;\n\tbackground: var(--color-layout-front);\n}\n\n.top-tabsView_menuItem:disabled:not(option):not(optgroup):not(.top-forms-option),\n.top-tabsView_menuItem:disabled ~ .top-formsCaption,\n.top-tabsView_menuItem.top-disabled[data-top-icon]:before,\n.top-tabsView_menuItem.top-disabled[data-top-icon2]:after {\n\topacity: unset;\n\tfilter: unset;\n}\n\n.top-tabsView_menuItem.top-disabled {\n\t--top-icon-color: var(--color-text-4);\n\n\tcolor: var(--color-text-4);\n}\n</style>\n","// TODO: Эту функцию можно вынести в глобальный utils\n\nimport { sleepWhile } from '@/core/utils/system';\n\n/**\n * Проверка нахождения компонента в состояние загрузки\n * @param component\n */\nexport const checkComponentIsLoading = (component: any) => {\n\treturn component?.name === 'AsyncComponentWrapper' && !component?.__asyncResolved;\n};\n\n/**\n * Презагрузить компонент\n *\n * Некоторое время ожидает загрузку компонента, прежде чем завершит работу\n */\nexport const preResolveComponent = async (component: any, condition: Function) => {\n\tif (component?.name !== 'AsyncComponentWrapper') return;\n\tif (component?.__asyncResolved) return;\n\n\tcomponent.__asyncLoader();\n\n\tawait sleepWhile(() => {\n\t\treturn condition() && checkComponentIsLoading(component);\n\t}, 200);\n};\n","<script setup lang=\"ts\">\nimport type { Ref } from 'vue';\nimport { markRaw, onMounted, onUnmounted, ref, useSlots, watch } from 'vue';\nimport { TopPopup } from '../../popup/popup';\nimport { getHash, setHash } from '@/core/utils/route';\n\nimport type { PropsMenu, PropsMenuItem, MenuItem } from './tabsView';\nimport { useTabsStore } from './store';\nimport TabsViewMenuItem from './menuItem.vue';\nimport { preResolveComponent } from './utils';\n\ndefineProps<PropsMenu>();\n\nconst isLoading = defineModel('isLoading');\n\nconst store = useTabsStore();\n\nconst slots = useSlots();\n\n// словарь используется для оптимизации получения нужного menuItem\nconst menuItemByName: Map<PropsMenuItem['name'], MenuItem> = new Map();\n\n// сгенерировать словарь с menuItem, по элементам в slot\nconst genMenuItemByName = () => {\n\tif (!slots.default) return;\n\n\tconst component: any = slots.default().find(item => item.key === '_menu');\n\tif (!component) return;\n\n\tcomponent.children.forEach((subComponent: any) => {\n\t\tif (subComponent.type.__name !== TabsViewMenuItem.__name) return;\n\t\tif (!subComponent.props.name || subComponent.props.disabled) return;\n\n\t\tconst menuItem: MenuItem = {\n\t\t\ttitle: (subComponent.children.default?.()[0].children as string).trim(),\n\t\t\ticon: subComponent.props.icon,\n\t\t\tcomponent: subComponent.props.component ? markRaw(subComponent.props.component) : TabsViewMenuItem.props.component.default,\n\t\t\tscrollable: subComponent.props.scrollable ?? TabsViewMenuItem.props.scrollable.default,\n\t\t};\n\n\t\tmenuItemByName.set(subComponent.props.name, menuItem);\n\t});\n};\n\n/**\n * activeMenuItem нужен:\n * - для вывода текста активной вкладки в меню с popup\n * - для вывода компонента активной вкладки (store.component)\n * - для установки store.scrollable\n */\nconst activeMenuItem: Ref<MenuItem | null> = ref(null);\n\n/**\n * Кол-во изменений активной вкладки\n */\nlet countChanged = 0;\n\n/**\n * Смена активной вкладки\n *\n * TODO: смена slot, например смена языка, требует повторного выполнения genMenuItemByName()\n */\nwatch(\n\t() => store.activeItemName,\n\tasync () => {\n\t\tconst numberChanged = ++countChanged; // порядковый номер текущего изменения\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tgenMenuItemByName();\n\t\t}\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tstore.activeItemName = '';\n\n\t\t\treturn;\n\t\t}\n\n\t\tactiveMenuItem.value = menuItemByName.get(store.activeItemName) ?? null;\n\n\t\t// элемент не найден, установить из хеша страницы\n\t\tif (!activeMenuItem.value && store.$id) {\n\t\t\tconst activeItemName = getHash(store.$id);\n\n\t\t\tactiveMenuItem.value = menuItemByName.get(activeItemName) ?? null;\n\n\t\t\tif (activeMenuItem.value) {\n\t\t\t\tstore.activeItemName = activeItemName;\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// элемент не найден, установить первый доступный\n\t\tif (!activeMenuItem.value) {\n\t\t\tstore.activeItemName = menuItemByName.keys().next().value;\n\n\t\t\treturn;\n\t\t}\n\n\t\t// запрошена смена на уже активный элемент\n\t\tif (activeMenuItem.value.component === store.component) {\n\t\t\tisLoading.value = false;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (store.$id) setHash(store.$id, store.activeItemName, true);\n\n\t\t// флаг загрузки будет сброшен при инициализации компонента\n\t\tisLoading.value = true;\n\n\t\t/**\n\t\t * Презагрузить компонент\n\t\t *\n\t\t * Нужно для того, чтобы минимизировать скачки интерфейса при ожидании загрузки асинхронного компонента\n\t\t */\n\t\tawait preResolveComponent(activeMenuItem.value.component, () => numberChanged === countChanged);\n\n\t\t// влкадка была сменена еще раз во время sleepWhile\n\t\tif (numberChanged !== countChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tstore.scrollable = activeMenuItem.value.scrollable;\n\t\tstore.component = activeMenuItem.value.component;\n\n\t\tif (activeMenuItem.value && !store.component) {\n\t\t\tconsole.warn(`Компонент вкладки ${store.activeItemName} не найден. Добавьте props.component для пункта меню ${store.activeItemName}.`);\n\t\t}\n\t},\n\t{ immediate: true },\n);\n\nconst elRef = ref();\nlet resizeObserver: ResizeObserver;\n\nonMounted(() => {\n\tresizeObserver = new ResizeObserver(() => {\n\t\telRef.value.parentElement.style.setProperty('--top-tabsView-contents-offset-top', elRef.value.offsetHeight + 'px');\n\t});\n\n\tresizeObserver.observe(elRef.value);\n});\n\nonUnmounted(() => {\n\tresizeObserver.disconnect();\n});\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t'top-tabsView_menu': true,\n\t\t\t'top-tabsView_menu-inPopup_0': !store.showMenuInPopup,\n\t\t\t'top-tabsView_menu-inPopup_1': store.showMenuInPopup,\n\t\t\t'top-tabsView_menu-short': store.isShort && !store.showMenuInPopup,\n\t\t}\"\n\t>\n\t\t<!-- Спрятать меню под кнопку в popup -->\n\t\t<TopPopup v-if=\"store.showMenuInPopup\">\n\t\t\t<template #opener>\n\t\t\t\t<div class=\"top-tabsView_menuOpener\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"activeMenuItem\"\n\t\t\t\t\t\tclass=\"top-tabsView_menuOpenerActiveItem\"\n\t\t\t\t\t\t:data-top-icon=\"activeMenuItem.icon\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"top-ellipsis\">\n\t\t\t\t\t\t\t{{ activeMenuItem.title }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"top-tabsView_menuOpenerIcon\" data-top-icon=\"\"></div>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<slot></slot>\n\t\t\t</template>\n\t\t</TopPopup>\n\n\t\t<!-- Отобразить меню на странице -->\n\t\t<template v-else>\n\t\t\t<div class=\"top-tabsView_menuList\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-if=\"isShortable\"\n\t\t\t\tclass=\"top-tabsView_menuFooter\"\n\t\t\t>\n\t\t\t\t<TabsViewMenuItem\n\t\t\t\t\tv-if=\"isShortable\"\n\t\t\t\t\t:icon=\"store.isShort ? '' : ''\"\n\t\t\t\t\t@click=\"store.isShort = !store.isShort\"\n\t\t\t\t>\n\t\t\t\t\t{{ store.isShort ? '' : 'Свернуть' }} <!--TODO: translate-->\n\t\t\t\t</TabsViewMenuItem>\n\t\t\t</div>\n\t\t</template>\n\t</div>\n</template>\n\n<style module>\n/* режим отображение табов в основной области документа */\n.top-tabsView-pageMod .top-tabsView_menu {\n\tbox-sizing: border-box;\n\tposition: sticky;\n\ttop: var(--top-tabsView-top);\n\tz-index: 10;\n}\n\n/* режим отображение табов в основной области документа без popup */\n.top-tabsView-pageMod .top-tabsView_menu-inPopup_0 {\n\theight: calc(var(--100vh) - var(--top-tabsView-top));\n}\n\n/* стантартный режим */\n.top-tabsView_menu-inPopup_0 {\n\tbox-sizing: border-box;\n\twidth: var(--top-tabsView-menu-width);\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: space-between;\n}\n\n/* режим вывода в popup */\n.top-tabsView_menu-inPopup_1 {\n\tborder-bottom: 1px solid var(--color-line-2-opacity);\n}\n\n.top-tabsView_menu-short {\n\twidth: auto;\n}\n\n.top-tabsView_menu > .top-tabsView_menuOpener {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n}\n\n.top-tabsView_menu > .top-tabsView_menuOpener:hover {\n\tbackground: var(--color-layer-1);\n}\n\n.top-tabsView_menuOpenerIcon { display: flex; }\n\n.top-tabsView_menuOpenerActiveItem {\n\t--top-forms-padding: 0px;\n\n\tbox-sizing: border-box;\n\tpadding: var(--top-padding-2);\n\tmax-width: calc(100% - var(--top-forms-base-height));\n\twhite-space: nowrap;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--top-padding-2);\n}\n\n.top-tabsView_menuList,\n.top-tabsView_menuFooter {\n\tpadding: var(--top-padding-2);\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-2);\n}\n\n.top-tabsView_menuList {\n\toverflow-y: auto;\n}\n\n.top-tabsView_menu-short .top-tabsView_menuFooter > .top-tabsView_menuItem {\n\t--top-icon-width: 100%;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { defineModel, onUnmounted, ref, watch } from 'vue';\nimport { delHash } from '@/core/utils/route';\nimport type { Props } from './tabsView';\nimport { defineTabsStore } from './store';\nimport TabsViewMenu from './menu.vue';\nimport TopLoadbar from '@/components/forms/loadbar/loadbar.vue';\nimport { checkComponentIsLoading } from './utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tshowMenuInPopup: undefined,\n\tisShortable: false,\n});\n\nconst model = defineModel<string>();\n\nconst store = defineTabsStore(props, model);\n\n/**\n * Установка или снятие глобального модификатора\n * @see props.pageMod\n */\nconst setDocumentPageModModificator = (pageMod: boolean) => {\n\tdocument.documentElement.classList.toggle('top-hasTabsViewPageMod', pageMod);\n};\n\nif (props.pageMod) setDocumentPageModModificator(true);\n\nonUnmounted(() => {\n\tif (props.pageMod) setDocumentPageModModificator(false);\n\n\tif (store.$id) delHash(store.$id, store.activeItemName, true);\n});\n\nconst componentRef = ref();\nconst isLoading = ref(false);\n\nwatch([componentRef, () => store.component], () => {\n\tisLoading.value = checkComponentIsLoading(store.component);\n}, { immediate: true });\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tabsView': true,\n\t\t\t'top-tabsView-pageMod': props.pageMod,\n\t\t\t'top-tabsView-inPopup': store.showMenuInPopup,\n\t\t}\"\n\t>\n\t\t<TabsViewMenu\n\t\t\t:isShortable=\"isShortable\"\n\t\t\tv-model:isLoading=\"isLoading\"\n\t\t>\n\t\t\t<!-- @slot Меню, ожидает передачу компонентов TabsViewMenuItem и TabsViewMenuTitle -->\n\t\t\t<slot name=\"menu\"></slot>\n\t\t</TabsViewMenu>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-tabsView_contents': true,\n\t\t\t\t'top-tabsView_contents-isLoading': isLoading,\n\t\t\t\t'top-tabsView_contents-noScrollable': !store.scrollable,\n\t\t\t}\"\n\t\t>\n\t\t\t<TopLoadbar v-if=\"isLoading\"/>\n\n\t\t\t<keep-alive>\n\t\t\t\t<component\n\t\t\t\t\tref=\"componentRef\"\n\t\t\t\t\t:is=\"store.component\"\n\t\t\t\t/>\n\t\t\t</keep-alive>\n\t\t</div>\n\t</div>\n</template>\n\n<style module>\n:root {\n\t--top-tabsView-top: 0px;\n\t--top-tabsView-menu-width: 220px;\n\t--top-tabsView-contents-offset-top: 0px;\n}\n\n.top-tabsView {\n\tbackground: var(--color-layout-middle);\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: row;\n}\n\n.top-tabsView_contents {\n\tborder-radius: var(--top-radius-4);\n\tbackground: var(--color-layout-front);\n\tpadding: var(--top-padding-4);\n\tflex-grow: 1;\n\toverflow: auto;\n\tposition: relative;\n}\n\n.top-tabsView_contents-isLoading {\n\tpointer-events: none;\n}\n\n.top-tabsView_contents-noScrollable {\n\twidth: calc(100% - var(--top-tabsView-menu-width));\n\tpadding: 0;\n\toverflow: visible;\n}\n\n/* top-tabsView-inPopup */\n.top-tabsView-inPopup {\n\tbackground: var(--color-layout-front);\n\tflex-direction: column;\n}\n\n.top-tabsView-inPopup > .top-tabsView_contents {\n\tborder-radius: 0;\n}\n\n.top-tabsView-inPopup > .top-tabsView_contents-noScrollable {\n\twidth: auto;\n}\n</style>\n","<script setup lang=\"ts\">\n\n</script>\n\n<template>\n\t<div class=\"top-tabsView_menuDelimeter\"></div>\n</template>\n\n<style module>\n.top-tabsView_menuDelimeter {\n\tpadding: var(--top-padding-1) 0;\n\tdisplay: flex;\n}\n\n.top-tabsView_menuDelimeter:before {\n\tcontent: \"\";\n\theight: 2px;\n\tbackground: var(--color-line-2);\n\tflex-grow: 1;\n}\n\n.top-tabsView_menuDelimeter:first-child,\n.top-tabsView_menuDelimeter + .top-tabsView_menuDelimeter {\n\tdisplay: none;\n}\n</style>","<script setup lang=\"ts\">\nimport { useTabsStore } from './store';\nimport type { PropsMenuTitle } from './tabsView';\nimport TabsViewMenuDelimeter from './menuDelimeter.vue';\nimport { TopPopupListItem } from '../../popup/popup';\n\ndefineProps<PropsMenuTitle>();\n\nconst store = useTabsStore();\n</script>\n\n<template>\n\t<TopPopupListItem\n\t\tv-if=\"store.showMenuInPopup\"\n\t\ttype=\"title\"\n\t>\n\t\t<slot></slot>\n\t</TopPopupListItem>\n\n\t<TabsViewMenuDelimeter v-else-if=\"store.isShort\"/>\n\n\t<div\n\t\tv-else\n\t\t:class=\"{\n\t\t\t'top-tabsView_menuTitle': true,\n\t\t\t'top-tabsView_menuTitle-subtitle': isSubtitle,\n\t\t}\"\n\t>\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<style module>\n.top-tabsView_menuTitle {\n\tpadding: var(--top-padding-4) var(--top-padding-2) var(--top-padding-1);\n\tfont-weight: 600;\n\tcolor: var(--color-text-1);\n}\n\n.top-tabsView_menuTitle-subtitle {\n\tpadding-top: var(--top-padding-1);\n\tfont-size: 12px;\n\tfont-weight: 400;\n\tcolor: var(--color-text-2);\n}\n</style>\n","import type { ComponentCustomProps } from 'vue';\n\nimport TabsView from './tabsView/tabsView.vue';\nimport TabsViewMenuItem from './tabsView/menuItem.vue';\nimport TabsViewMenuTitle from './tabsView/menuTitle.vue';\n\nexport const TopTabsView = TabsView as typeof TabsView & ComponentCustomProps;\nexport const TopTabsViewMenuItem = TabsViewMenuItem as typeof TabsViewMenuItem & ComponentCustomProps;\nexport const TopTabsViewMenuTitle = TabsViewMenuTitle as typeof TabsViewMenuTitle & ComponentCustomProps;\n"],"names":["genStorageKey","stateName","stateKey","loadLocalStorge","store","localStorageKey","localStorageValue","addSaverLocalStorge","watch","StoreLocalStorage","injectionKey","defineTabsStore","props","model","defineStore","showMenuInPopup","computed","Core","pageMod","isShort","ref","component","scrollable","useTabsStore","useStore","__props","href","genHash","tagName","TopPopupListItem","onClick","e","checkComponentIsLoading","preResolveComponent","condition","sleepWhile","isLoading","useModel","slots","useSlots","menuItemByName","genMenuItemByName","item","subComponent","TabsViewMenuItem","menuItem","_b","_a","markRaw","activeMenuItem","countChanged","numberChanged","activeItemName","getHash","setHash","elRef","resizeObserver","onMounted","onUnmounted","setDocumentPageModModificator","delHash","componentRef","_sfc_render","_ctx","_cache","TopTabsView","TabsView","TopTabsViewMenuItem","TopTabsViewMenuTitle","TabsViewMenuTitle"],"mappings":";;;;;;;;;AAQA,MAAAA,IAAA,CAAAC,GAAAC,MAGC,OAFA,OAAAD,CAAA,CAEA,IAAAC,CAAA,IAQDC,KAAA,CAAAF,GAAAG,MAAA;AAEC,MAAA,CAAAA,EAAA,IAAA;AAEA,QAAAC,IAAAL,EAAAC,GAAAG,EAAA,GAAA;AAEA,MAAA;AACC,UAAAE,IAAA,KAAA,MAAA,aAAA,QAAAD,CAAA,CAAA;AAEA,IAAA,OAAAC,KAAA,OAAAF,EAAAH,CAAA,MACCG,EAAAH,CAAA,IAAAK;AAAA,EACD,QAAA;AAEA,YAAA,KAAA,IAAA,MAAA,kBAAAD,CAAA,sBAAA,CAAA;AAAA,EAA+E;AAEjF,GAOAE,KAAA,CAAAN,GAAAG,MAAA;AAEC,MAAA,CAAAA,EAAA,IAAA;AAEA,QAAAC,IAAAL,EAAAC,GAAAG,EAAA,GAAA;AAEA,EAAAI,EAAA,MAAAJ,EAAAH,CAAA,GAAA,MAAA;AACC,iBAAA,QAAAI,GAAA,KAAA,UAAAD,EAAAH,CAAA,CAAA,CAAA;AAAA,EAAsE,GAAA,EAAA,WAAA,GAAA,CAAA;AAExE,GAEAQ,IAAA;AAAA,EAAe,iBAAAN;AAAA,EACd,qBAAAI;AAED,GChDOG,IAAA,OAAA,GAKMC,KAAA,CAAAC,GAAAC,MAAA;AACZ,QAAAT,IAAAU,GAAAJ,GAAA,MAAA;AACC,UAAAK,IAAAC,EAAA,MAAAJ,EAAA,mBAAAK,GAAA,MAAA,QAAA,GACAC,IAAAF,EAAA,MAAAJ,EAAA,OAAA,GACAO,IAAAC,EAAA,EAAA,GAEAC,IAAAD,EAAA,MAAA,GACAE,IAAAF,EAAA,EAAA;AAEA,WAAA;AAAA,MAAO,iBAAAL;AAAA,MACN,SAAAG;AAAA,MACA,SAAAC;AAAA,MACA,gBAAAN;AAAA,MACgB,WAAAQ;AAAA,MAChB,YAAAC;AAAA,IACA;AAAA,EACD,GAAAV,EAAA,OAAA;AAGD,MAAAA,EAAA,aAAA;AACC,UAAAX,IAAA;AAEA,IAAAQ,EAAA,gBAAAR,GAAAG,CAAA,GACAK,EAAA,oBAAAR,GAAAG,CAAA;AAAA,EAAsD;AAGvD,SAAAA;AACD,GAKamB,IAAA,MAAAC,GAAAd,CAAA;;;;;;;;;;;;;;ACrCb,UAAAE,IAAAa,GAKArB,IAAAmB,EAAA,GAEAG,IAAAV,EAAA,MAECJ,EAAA,QAAAR,EAAA,MACCuB,EAAAvB,EAAA,KAAAQ,EAAA,IAAA,IAGDA,EAAA,IAAa,GAGdgB,IAAAZ,EAAA,MACCZ,EAAA,kBACCyB,IAGDH,IAAA,MAAA,QAAoB,GAMrBI,IAAA,CAAAC,MAAA;AAEC,MAAA,CAAAnB,EAAA,QAAAc,EAAA,SACCK,EAAA,eAAA,GAGDnB,EAAA,SACCR,EAAA,iBAAAQ,EAAA;AAAA,IACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sDClCYoB,IAAA,CAAAX,OACZA,KAAA,gBAAAA,EAAA,UAAA,2BAAA,EAAAA,KAAA,QAAAA,EAAA,kBAQYY,KAAA,OAAAZ,GAAAa,MAAA;AACZ,GAAAb,KAAA,gBAAAA,EAAA,UAAA,4BACAA,KAAA,QAAAA,EAAA,oBAEAA,EAAA,cAAA,GAEA,MAAAc,GAAA,MACCD,EAAA,KAAAF,EAAAX,CAAA,GAAuD,GAAA;AAEzD;;;;;;;;;;;;;;;;;ACbA,UAAAe,IAAAC,EAAAZ,GAAA,WAAA,GAEArB,IAAAmB,EAAA,GAEAe,IAAAC,EAAA,GAGAC,IAAA,oBAAA,IAAA,GAGAC,IAAA,MAAA;AACC,UAAA,CAAAH,EAAA,QAAA;AAEA,YAAAjB,IAAAiB,EAAA,QAAA,EAAA,KAAA,CAAAI,MAAAA,EAAA,QAAA,OAAA;AACA,MAAArB,KAEAA,EAAA,SAAA,QAAA,CAAAsB,MAAA;;AAEC,YADAA,EAAA,KAAA,WAAAC,EAAA,UACA,CAAAD,EAAA,MAAA,QAAAA,EAAA,MAAA,SAAA;AAEA,cAAAE,IAAA;AAAA,UAA2B,SAAAC,KAAAC,IAAAJ,EAAA,UAAA,YAAA,gBAAAG,EAAA,KAAAC,GAAA,GAAA,UAAA,KAAA;AAAA,UAC4C,MAAAJ,EAAA,MAAA;AAAA,UAC7C,WAAAA,EAAA,MAAA,YAAAK,EAAAL,EAAA,MAAA,SAAA,IAAAC,EAAA,MAAA,UAAA;AAAA,UAC0F,YAAAD,EAAA,MAAA,cAAAC,EAAA,MAAA,WAAA;AAAA,QACpC;AAGhF,QAAAJ,EAAA,IAAAG,EAAA,MAAA,MAAAE,CAAA;AAAA,MAAoD,CAAA;AAAA,IACpD,GASFI,IAAA7B,EAAA,IAAA;AAKA,QAAA8B,IAAA;AAOA,IAAA1C;AAAA,MAAA,MAAAJ,EAAA;AAAA,MACa,YAAA;AAEX,cAAA+C,IAAA,EAAAD;AAMA,YAJAV,EAAA,SAAA,KACCC,EAAA,GAGDD,EAAA,SAAA,GAAA;AACC,UAAApC,EAAA,iBAAA;AAEA;AAAA,QAAA;AAMD,YAHA6C,EAAA,QAAAT,EAAA,IAAApC,EAAA,cAAA,KAAA,MAGA,CAAA6C,EAAA,SAAA7C,EAAA,KAAA;AACC,gBAAAgD,IAAAC,EAAAjD,EAAA,GAAA;AAIA,cAFA6C,EAAA,QAAAT,EAAA,IAAAY,CAAA,KAAA,MAEAH,EAAA,OAAA;AACC,YAAA7C,EAAA,iBAAAgD;AAEA;AAAA,UAAA;AAAA,QACD;AAID,YAAA,CAAAH,EAAA,OAAA;AACC,UAAA7C,EAAA,iBAAAoC,EAAA,KAAA,EAAA,KAAA,EAAA;AAEA;AAAA,QAAA;AAID,YAAAS,EAAA,MAAA,cAAA7C,EAAA,WAAA;AACC,UAAAgC,EAAA,QAAA;AAEA;AAAA,QAAA;AAgBD,QAbAhC,EAAA,OAAAkD,EAAAlD,EAAA,KAAAA,EAAA,gBAAA,EAAA,GAGAgC,EAAA,QAAA,IAOA,MAAAH,GAAAgB,EAAA,MAAA,WAAA,MAAAE,MAAAD,CAAA,GAGAC,MAAAD,MAIA9C,EAAA,aAAA6C,EAAA,MAAA,YACA7C,EAAA,YAAA6C,EAAA,MAAA,WAEAA,EAAA,SAAA,CAAA7C,EAAA,aACC,QAAA,KAAA,qBAAAA,EAAA,cAAA,wDAAAA,EAAA,cAAA,GAAA;AAAA,MACD;AAAA,MACD,EAAA,WAAA,GAAA;AAAA,IACkB;AAGnB,UAAAmD,IAAAnC,EAAA;AACA,QAAAoC;AAEA,WAAAC,EAAA,MAAA;AACC,MAAAD,IAAA,IAAA,eAAA,MAAA;AACC,QAAAD,EAAA,MAAA,cAAA,MAAA,YAAA,sCAAAA,EAAA,MAAA,eAAA,IAAA;AAAA,MAAiH,CAAA,GAGlHC,EAAA,QAAAD,EAAA,KAAA;AAAA,IAAkC,CAAA,GAGnCG,EAAA,MAAA;AACC,MAAAF,EAAA,WAAA;AAAA,IAA0B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxI3B,UAAA5C,IAAAa,GAKAZ,IAAAwB,EAAAZ,GAAA,YAAA,GAEArB,IAAAO,GAAAC,GAAAC,CAAA,GAMA8C,IAAA,CAAAzC,MAAA;AACC,eAAA,gBAAA,UAAA,OAAA,0BAAAA,CAAA;AAAA,IAA2E;AAG5E,IAAAN,EAAA,WAAA+C,EAAA,EAAA,GAEAD,EAAA,MAAA;AACC,MAAA9C,EAAA,WAAA+C,EAAA,EAAA,GAEAvD,EAAA,OAAAwD,EAAAxD,EAAA,KAAAA,EAAA,gBAAA,EAAA;AAAA,IAA4D,CAAA;AAG7D,UAAAyD,IAAAzC,EAAA,GACAgB,IAAAhB,EAAA,EAAA;AAEA,WAAAZ,EAAA,CAAAqD,GAAA,MAAAzD,EAAA,SAAA,GAAA,MAAA;AACC,MAAAgC,EAAA,QAAAJ,EAAA5B,EAAA,SAAA;AAAA,IAAyD,GAAA,EAAA,WAAA,GAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjCzD,SAAA0D,GAAAC,GAAAC,GAAA;;;;;;;;;;;ACGD,UAAA5D,IAAAmB,EAAA;;;;;;;;;;;;;;;;;;;;;;;;uDCFO0C,KAAAC,IACAC,KAAAvB,GACAwB,KAAAC;"}
@@ -0,0 +1,2 @@
1
+ define(function(){"use strict";if(typeof e>"u")var e=window.Vue});
2
+ //# sourceMappingURL=dark-positions.amd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dark-positions.amd.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=dark-positions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dark-positions.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ define(function(){"use strict";if(typeof e>"u")var e=window.Vue});
2
+ //# sourceMappingURL=dark.amd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dark.amd.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,4 @@
1
+ import s from "../core/core.js";
2
+ const o = ["../../../assets/themes/dark.css"].map((e) => import.meta.resolve(e));
3
+ s.insertCSSLinkToPage(o, !0);
4
+ //# sourceMappingURL=dark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dark.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -0,0 +1,2 @@
1
+ define(function(){"use strict";if(typeof e>"u")var e=window.Vue});
2
+ //# sourceMappingURL=light-positions.amd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light-positions.amd.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=light-positions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light-positions.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ define(function(){"use strict";if(typeof e>"u")var e=window.Vue});
2
+ //# sourceMappingURL=light.amd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light.amd.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,4 @@
1
+ import s from "../core/core.js";
2
+ const t = ["../../../assets/themes/light.css"].map((e) => import.meta.resolve(e));
3
+ s.insertCSSLinkToPage(t, !0);
4
+ //# sourceMappingURL=light.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
package/utils/date.amd.js CHANGED
@@ -1,2 +1,2 @@
1
- define(["require","exports","../.chunks/forms--Ye61xQ5.amd"],function(n,e,t){"use strict";if(typeof a>"u")var a=window.Vue;e.dateFormat=t.dateFormat,e.dateToString=t.dateToString,e.dateUnformat=t.dateUnformat,e.genDate=t.genDate,e.genDateMoscow=t.genDateMoscow,e.getDayOfWeek=t.getDayOfWeek,e.stringToDate=t.stringToDate,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
1
+ define(["require","exports","../.chunks/forms-CQJeARc0.amd"],function(n,e,t){"use strict";if(typeof a>"u")var a=window.Vue;e.dateFormat=t.dateFormat,e.dateToString=t.dateToString,e.dateUnformat=t.dateUnformat,e.genDate=t.genDate,e.genDateMoscow=t.genDateMoscow,e.getDayOfWeek=t.getDayOfWeek,e.stringToDate=t.stringToDate,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=date.amd.js.map
package/utils/date.js CHANGED
@@ -1,4 +1,4 @@
1
- import { d as t, G as s, K as o, I as r, J as g, F as n, H as d } from "../.chunks/forms-NfVxcPud.es.js";
1
+ import { d as t, G as s, K as o, I as r, J as g, F as n, H as d } from "../.chunks/forms-UyeTiEcX.es.js";
2
2
  export {
3
3
  t as dateFormat,
4
4
  s as dateToString,
@@ -1,2 +1,2 @@
1
- define(["require","exports","../.chunks/forms--Ye61xQ5.amd"],function(a,e,i){"use strict";if(typeof l>"u")var l=window.Vue;e.get$scroll=i.get$scroll,e.getCommandKeyLabel=i.getCommandKeyLabel,e.getElsScroll=i.getElsScroll,e.getOS=i.getOS,e.getOSAsync=i.getOSAsync,e.getScrollTop=i.getScrollTop,e.isApp=i.isApp,e.isMacOS=i.isMacOS,e.isMobile=i.isMobile,e.isRetina=i.isRetina,e.isSafari=i.isSafari,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
1
+ define(["require","exports","../.chunks/forms-CQJeARc0.amd"],function(a,e,i){"use strict";if(typeof l>"u")var l=window.Vue;e.get$scroll=i.get$scroll,e.getCommandKeyLabel=i.getCommandKeyLabel,e.getElsScroll=i.getElsScroll,e.getOS=i.getOS,e.getOSAsync=i.getOSAsync,e.getScrollTop=i.getScrollTop,e.isApp=i.isApp,e.isMacOS=i.isMacOS,e.isMobile=i.isMobile,e.isRetina=i.isRetina,e.isSafari=i.isSafari,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=device.amd.js.map
package/utils/device.js CHANGED
@@ -1,4 +1,4 @@
1
- import { z as e, x as i, A as l, B as t, D as o, y as g, v as r, w as S, u as c, t as p, i as m } from "../.chunks/forms-NfVxcPud.es.js";
1
+ import { z as e, x as i, A as l, B as t, D as o, y as g, v as r, w as S, u as c, t as p, i as m } from "../.chunks/forms-UyeTiEcX.es.js";
2
2
  export {
3
3
  e as get$scroll,
4
4
  i as getCommandKeyLabel,
@@ -1 +1 @@
1
- {"version":3,"file":"dom.amd.js","sources":["../../src/core/utils/dom.ts"],"sourcesContent":["/**\n * Работа с Document Object Model (DOM)\n * @packageDocumentation\n */\n\n/**\n * Создать элемент\n * @param tagName\n * @param attrs - атрибуты\n * @param elsChildrens\n * @returns - созданный элемент\n */\nexport function genEl(tagName: string, attrs: any, ...elsChildrens: HTMLElement[] | string[]): HTMLElement {\n\tconst el: any = document.createElement(tagName);\n\n\tfor (const name in attrs) {\n\t\tif (name.indexOf('on') === 0) {\n\t\t\t// events\n\t\t\tel[name] = attrs[name];\n\t\t} else {\n\t\t\tel.setAttribute(name, attrs[name]);\n\t\t}\n\t}\n\n\telsChildrens.forEach((elChildren: HTMLElement | string) => {\n\t\tif (typeof (elChildren) === 'string') {\n\t\t\tel.insertAdjacentHTML('beforeend', elChildren);\n\t\t} else {\n\t\t\tel.append(elChildren);\n\t\t}\n\t});\n\n\treturn el;\n}\n\n/**\n * Проверить видимость элемента\n * @param el\n * @returns - вернет true, если элемент считается видимым\n */\nexport function isVisible(el?: HTMLElement): boolean {\n\tif (!el) {\n\t\treturn false;\n\t}\n\n\tconst boundingClientRect = el.getBoundingClientRect();\n\treturn !!(boundingClientRect.width || boundingClientRect.height);\n}\n\n/**\n * Получить координаты элемента относительно документа\n * @param el\n * @returns - координаты элемента относительно документа\n */\nexport function offset(el: HTMLElement): { top: number, left: number } {\n\tconst boundingClientRect = el.getBoundingClientRect();\n\n\treturn {\n\t\ttop: boundingClientRect.top + window.scrollY,\n\t\tleft: boundingClientRect.left + window.scrollX,\n\t};\n}\n\n/**\n * Получить значение css свойства элемента\n * @param el\n * @param property - имя свойства\n * @return - значение css стиля\n */\nexport function css(el: HTMLElement, property: string): string {\n\treturn window.getComputedStyle(el).getPropertyValue(property);\n}\n\n/**\n * Обернуть элемент и вернуть только что созданный элемент\n * @param el - элемент, который требуется обернуть\n * @param tagName - имя тега элемента, в который треубется обернуть элемент\n */\nexport function wrap(el: HTMLElement, tagName: string): HTMLElement {\n\tconst elWrapper = document.createElement(tagName);\n\tel.after(elWrapper);\n\n\telWrapper.append(el);\n\n\treturn elWrapper;\n}\n\n/**\n * Найти и вернуть первый видимый элемент\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorVisible(el: HTMLElement, selectors: string): HTMLElement | null {\n\treturn querySelectorAllArray(el, selectors).find(isVisible) || null;\n}\n\n/**\n * Найти и вернуть последний видимый элемент\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorVisibleLast(el: HTMLElement, selectors: string): HTMLElement | null {\n\treturn querySelectorAllArray(el, selectors).findLast(isVisible) || null;\n}\n\n/**\n * Найти видимые элементы\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorAllVisible(el: HTMLElement | Document, selectors: string): HTMLElement[] {\n\treturn querySelectorAllArray(el, selectors).filter(isVisible);\n}\n\n/**\n * Найти элементы и вернуть в виде массива\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorAllArray(el: HTMLElement | Document, selectors: string): HTMLElement[] {\n\tif (!el) {\n\t\treturn [];\n\t}\n\n\treturn [...el.querySelectorAll(selectors)] as HTMLElement[];\n}\n\n/**\n * Хранилище данных элемента\n * @param el\n * @param contextName - контекст, обычно используется имя компонента\n * @param contextData - установить объект с данными, предыдущие данные будут заменены, установите null для удаления данных\n * @returns - вернет объект контекста или undefined, если данные контекста не найдены\n */\nexport function storage(\n\tel?: HTMLElement & { topData?: any },\n\tcontextName: string = 'common',\n\tcontextData: object | null | undefined = undefined,\n): any | undefined {\n\tif (!el) {\n\t\treturn;\n\t}\n\n\tif (!el.topData) {\n\t\tel.topData = {};\n\t}\n\n\tif (contextData) {\n\t\tel.topData[contextName] = contextData;\n\t}\n\n\tif (contextData === null) {\n\t\tdelete el.topData[contextName];\n\t}\n\n\treturn el.topData[contextName];\n}\n\n/**\n * Очистить хранилище элемента\n */\nexport function storageClear(el?: HTMLElement & { topData?: any }): void {\n\tif (!el) {\n\t\treturn;\n\t}\n\n\tdelete el.topData;\n}\n\nexport default {\n\tgenEl,\n\tisVisible,\n\toffset,\n\tcss,\n\twrap,\n\tquerySelectorVisible,\n\tquerySelectorVisibleLast,\n\tquerySelectorAllVisible,\n\tquerySelectorAllArray,\n\tstorage,\n\tstorageClear,\n};\n"],"names":["name","attrs","elsChildrens","elChildren","el","boundingClientRect","css","property","wrap","tagName","elWrapper","querySelectorVisible","selectors","querySelectorAllArray","isVisible","querySelectorVisibleLast","querySelectorAllVisible","storage","contextName","contextData","DOM","genEl","offset","storageClear"],"mappings":"gJAeC,UAAAA,KAAAC,uDASA,OAAAC,EAAA,QAAAC,GAAA,CACC,OAAAA,GAAA,6CAGCC,EAAA,OAAAD,CAAA,CACD,CAAA,iCAgBD,MAAAE,EAAAD,EAAA,sBAAA,4CAUA,MAAAC,EAAAD,EAAA,sBAAA,EAEA,MAAA,oDAEwC,EAUzB,SAAAE,EAAAF,EAAAG,EAAA,CACf,OAAA,OAAA,iBAAAH,CAAA,EAAA,iBAAAG,CAAA,EAQe,SAAAC,EAAAJ,EAAAK,EAAA,mCAEf,OAAAL,EAAA,MAAAM,CAAA,EAEAA,EAAA,OAAAN,CAAA,IAUe,SAAAO,EAAAP,EAAAQ,EAAA,CACf,OAAAC,EAAAT,EAAAQ,CAAA,EAAA,KAAAE,CAAA,GAAA,KAQe,SAAAC,EAAAX,EAAAQ,EAAA,CACf,OAAAC,EAAAT,EAAAQ,CAAA,EAAA,SAAAE,CAAA,GAAA,KAQe,SAAAE,EAAAZ,EAAAQ,EAAA,CACf,OAAAC,EAAAT,EAAAQ,CAAA,EAAA,OAAAE,CAAA,EAQe,SAAAD,EAAAT,EAAAQ,EAAA,wCAeT,SAAAK,EAAAb,EAAAc,EAAA,SAAAC,EAAA,OAAA,MASN,OAAAf,EAAA,UACCA,EAAA,QAAA,CAAA,uBAODe,IAAA,MACC,OAAAf,EAAA,QAAAc,CAAA,EAGDd,EAAA,QAAAc,CAAA,mBAWA,OAAAd,EAAA,QAGD,MAAAgB,EAAA,CAAe,MAAAC,EACd,UAAAP,EACA,OAAAQ,EACA,IAAAhB,EACA,KAAAE,EACA,qBAAAG,EACA,yBAAAI,EACA,wBAAAC,EACA,sBAAAH,EACA,QAAAI,EACA,aAAAM"}
1
+ {"version":3,"file":"dom.amd.js","sources":["../../src/core/utils/dom.ts"],"sourcesContent":["/**\n * Работа с Document Object Model (DOM)\n * @packageDocumentation\n */\n\n/**\n * Создать элемент\n * @param tagName\n * @param attrs - атрибуты\n * @param elsChildrens\n * @returns - созданный элемент\n */\nexport function genEl(tagName: string, attrs?: Record<string, string>, ...elsChildrens: HTMLElement[] | string[]): HTMLElement {\n\tconst el: any = document.createElement(tagName);\n\n\tfor (const name in attrs) {\n\t\tif (name.indexOf('on') === 0) {\n\t\t\t// events\n\t\t\tel[name] = attrs[name];\n\t\t} else {\n\t\t\tel.setAttribute(name, attrs[name]);\n\t\t}\n\t}\n\n\telsChildrens.forEach((elChildren: HTMLElement | string) => {\n\t\tif (typeof (elChildren) === 'string') {\n\t\t\tel.insertAdjacentHTML('beforeend', elChildren);\n\t\t} else {\n\t\t\tel.append(elChildren);\n\t\t}\n\t});\n\n\treturn el;\n}\n\n/**\n * Проверить видимость элемента\n * @param el\n * @returns - вернет true, если элемент считается видимым\n */\nexport function isVisible(el?: HTMLElement): boolean {\n\tif (!el) {\n\t\treturn false;\n\t}\n\n\tconst boundingClientRect = el.getBoundingClientRect();\n\treturn !!(boundingClientRect.width || boundingClientRect.height);\n}\n\n/**\n * Получить координаты элемента относительно документа\n * @param el\n * @returns - координаты элемента относительно документа\n */\nexport function offset(el: HTMLElement): { top: number, left: number } {\n\tconst boundingClientRect = el.getBoundingClientRect();\n\n\treturn {\n\t\ttop: boundingClientRect.top + window.scrollY,\n\t\tleft: boundingClientRect.left + window.scrollX,\n\t};\n}\n\n/**\n * Получить значение css свойства элемента\n * @param el\n * @param property - имя свойства\n * @return - значение css стиля\n */\nexport function css(el: HTMLElement, property: string): string {\n\treturn window.getComputedStyle(el).getPropertyValue(property);\n}\n\n/**\n * Обернуть элемент и вернуть только что созданный элемент\n * @param el - элемент, который требуется обернуть\n * @param tagName - имя тега элемента, в который треубется обернуть элемент\n */\nexport function wrap(el: HTMLElement, tagName: string): HTMLElement {\n\tconst elWrapper = document.createElement(tagName);\n\tel.after(elWrapper);\n\n\telWrapper.append(el);\n\n\treturn elWrapper;\n}\n\n/**\n * Найти и вернуть первый видимый элемент\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorVisible(el: HTMLElement, selectors: string): HTMLElement | null {\n\treturn querySelectorAllArray(el, selectors).find(isVisible) || null;\n}\n\n/**\n * Найти и вернуть последний видимый элемент\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorVisibleLast(el: HTMLElement, selectors: string): HTMLElement | null {\n\treturn querySelectorAllArray(el, selectors).findLast(isVisible) || null;\n}\n\n/**\n * Найти видимые элементы\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorAllVisible(el: HTMLElement | Document, selectors: string): HTMLElement[] {\n\treturn querySelectorAllArray(el, selectors).filter(isVisible);\n}\n\n/**\n * Найти элементы и вернуть в виде массива\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorAllArray(el: HTMLElement | Document, selectors: string): HTMLElement[] {\n\tif (!el) {\n\t\treturn [];\n\t}\n\n\treturn [...el.querySelectorAll(selectors)] as HTMLElement[];\n}\n\n/**\n * Хранилище данных элемента\n * @param el\n * @param contextName - контекст, обычно используется имя компонента\n * @param contextData - установить объект с данными, предыдущие данные будут заменены, установите null для удаления данных\n * @returns - вернет объект контекста или undefined, если данные контекста не найдены\n */\nexport function storage(\n\tel?: HTMLElement & { topData?: any },\n\tcontextName: string = 'common',\n\tcontextData: object | null | undefined = undefined,\n): any | undefined {\n\tif (!el) {\n\t\treturn;\n\t}\n\n\tif (!el.topData) {\n\t\tel.topData = {};\n\t}\n\n\tif (contextData) {\n\t\tel.topData[contextName] = contextData;\n\t}\n\n\tif (contextData === null) {\n\t\tdelete el.topData[contextName];\n\t}\n\n\treturn el.topData[contextName];\n}\n\n/**\n * Очистить хранилище элемента\n */\nexport function storageClear(el?: HTMLElement & { topData?: any }): void {\n\tif (!el) {\n\t\treturn;\n\t}\n\n\tdelete el.topData;\n}\n\nexport default {\n\tgenEl,\n\tisVisible,\n\toffset,\n\tcss,\n\twrap,\n\tquerySelectorVisible,\n\tquerySelectorVisibleLast,\n\tquerySelectorAllVisible,\n\tquerySelectorAllArray,\n\tstorage,\n\tstorageClear,\n};\n"],"names":["name","attrs","elsChildrens","elChildren","el","boundingClientRect","css","property","wrap","tagName","elWrapper","querySelectorVisible","selectors","querySelectorAllArray","isVisible","querySelectorVisibleLast","querySelectorAllVisible","storage","contextName","contextData","DOM","genEl","offset","storageClear"],"mappings":"gJAeC,UAAAA,KAAAC,uDASA,OAAAC,EAAA,QAAAC,GAAA,CACC,OAAAA,GAAA,6CAGCC,EAAA,OAAAD,CAAA,CACD,CAAA,iCAgBD,MAAAE,EAAAD,EAAA,sBAAA,4CAUA,MAAAC,EAAAD,EAAA,sBAAA,EAEA,MAAA,oDAEwC,EAUzB,SAAAE,EAAAF,EAAAG,EAAA,CACf,OAAA,OAAA,iBAAAH,CAAA,EAAA,iBAAAG,CAAA,EAQe,SAAAC,EAAAJ,EAAAK,EAAA,mCAEf,OAAAL,EAAA,MAAAM,CAAA,EAEAA,EAAA,OAAAN,CAAA,IAUe,SAAAO,EAAAP,EAAAQ,EAAA,CACf,OAAAC,EAAAT,EAAAQ,CAAA,EAAA,KAAAE,CAAA,GAAA,KAQe,SAAAC,EAAAX,EAAAQ,EAAA,CACf,OAAAC,EAAAT,EAAAQ,CAAA,EAAA,SAAAE,CAAA,GAAA,KAQe,SAAAE,EAAAZ,EAAAQ,EAAA,CACf,OAAAC,EAAAT,EAAAQ,CAAA,EAAA,OAAAE,CAAA,EAQe,SAAAD,EAAAT,EAAAQ,EAAA,wCAeT,SAAAK,EAAAb,EAAAc,EAAA,SAAAC,EAAA,OAAA,MASN,OAAAf,EAAA,UACCA,EAAA,QAAA,CAAA,uBAODe,IAAA,MACC,OAAAf,EAAA,QAAAc,CAAA,EAGDd,EAAA,QAAAc,CAAA,mBAWA,OAAAd,EAAA,QAGD,MAAAgB,EAAA,CAAe,MAAAC,EACd,UAAAP,EACA,OAAAQ,EACA,IAAAhB,EACA,KAAAE,EACA,qBAAAG,EACA,yBAAAI,EACA,wBAAAC,EACA,sBAAAH,EACA,QAAAI,EACA,aAAAM"}
package/utils/dom.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dom.js","sources":["../../src/core/utils/dom.ts"],"sourcesContent":["/**\n * Работа с Document Object Model (DOM)\n * @packageDocumentation\n */\n\n/**\n * Создать элемент\n * @param tagName\n * @param attrs - атрибуты\n * @param elsChildrens\n * @returns - созданный элемент\n */\nexport function genEl(tagName: string, attrs: any, ...elsChildrens: HTMLElement[] | string[]): HTMLElement {\n\tconst el: any = document.createElement(tagName);\n\n\tfor (const name in attrs) {\n\t\tif (name.indexOf('on') === 0) {\n\t\t\t// events\n\t\t\tel[name] = attrs[name];\n\t\t} else {\n\t\t\tel.setAttribute(name, attrs[name]);\n\t\t}\n\t}\n\n\telsChildrens.forEach((elChildren: HTMLElement | string) => {\n\t\tif (typeof (elChildren) === 'string') {\n\t\t\tel.insertAdjacentHTML('beforeend', elChildren);\n\t\t} else {\n\t\t\tel.append(elChildren);\n\t\t}\n\t});\n\n\treturn el;\n}\n\n/**\n * Проверить видимость элемента\n * @param el\n * @returns - вернет true, если элемент считается видимым\n */\nexport function isVisible(el?: HTMLElement): boolean {\n\tif (!el) {\n\t\treturn false;\n\t}\n\n\tconst boundingClientRect = el.getBoundingClientRect();\n\treturn !!(boundingClientRect.width || boundingClientRect.height);\n}\n\n/**\n * Получить координаты элемента относительно документа\n * @param el\n * @returns - координаты элемента относительно документа\n */\nexport function offset(el: HTMLElement): { top: number, left: number } {\n\tconst boundingClientRect = el.getBoundingClientRect();\n\n\treturn {\n\t\ttop: boundingClientRect.top + window.scrollY,\n\t\tleft: boundingClientRect.left + window.scrollX,\n\t};\n}\n\n/**\n * Получить значение css свойства элемента\n * @param el\n * @param property - имя свойства\n * @return - значение css стиля\n */\nexport function css(el: HTMLElement, property: string): string {\n\treturn window.getComputedStyle(el).getPropertyValue(property);\n}\n\n/**\n * Обернуть элемент и вернуть только что созданный элемент\n * @param el - элемент, который требуется обернуть\n * @param tagName - имя тега элемента, в который треубется обернуть элемент\n */\nexport function wrap(el: HTMLElement, tagName: string): HTMLElement {\n\tconst elWrapper = document.createElement(tagName);\n\tel.after(elWrapper);\n\n\telWrapper.append(el);\n\n\treturn elWrapper;\n}\n\n/**\n * Найти и вернуть первый видимый элемент\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorVisible(el: HTMLElement, selectors: string): HTMLElement | null {\n\treturn querySelectorAllArray(el, selectors).find(isVisible) || null;\n}\n\n/**\n * Найти и вернуть последний видимый элемент\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorVisibleLast(el: HTMLElement, selectors: string): HTMLElement | null {\n\treturn querySelectorAllArray(el, selectors).findLast(isVisible) || null;\n}\n\n/**\n * Найти видимые элементы\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorAllVisible(el: HTMLElement | Document, selectors: string): HTMLElement[] {\n\treturn querySelectorAllArray(el, selectors).filter(isVisible);\n}\n\n/**\n * Найти элементы и вернуть в виде массива\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorAllArray(el: HTMLElement | Document, selectors: string): HTMLElement[] {\n\tif (!el) {\n\t\treturn [];\n\t}\n\n\treturn [...el.querySelectorAll(selectors)] as HTMLElement[];\n}\n\n/**\n * Хранилище данных элемента\n * @param el\n * @param contextName - контекст, обычно используется имя компонента\n * @param contextData - установить объект с данными, предыдущие данные будут заменены, установите null для удаления данных\n * @returns - вернет объект контекста или undefined, если данные контекста не найдены\n */\nexport function storage(\n\tel?: HTMLElement & { topData?: any },\n\tcontextName: string = 'common',\n\tcontextData: object | null | undefined = undefined,\n): any | undefined {\n\tif (!el) {\n\t\treturn;\n\t}\n\n\tif (!el.topData) {\n\t\tel.topData = {};\n\t}\n\n\tif (contextData) {\n\t\tel.topData[contextName] = contextData;\n\t}\n\n\tif (contextData === null) {\n\t\tdelete el.topData[contextName];\n\t}\n\n\treturn el.topData[contextName];\n}\n\n/**\n * Очистить хранилище элемента\n */\nexport function storageClear(el?: HTMLElement & { topData?: any }): void {\n\tif (!el) {\n\t\treturn;\n\t}\n\n\tdelete el.topData;\n}\n\nexport default {\n\tgenEl,\n\tisVisible,\n\toffset,\n\tcss,\n\twrap,\n\tquerySelectorVisible,\n\tquerySelectorVisibleLast,\n\tquerySelectorAllVisible,\n\tquerySelectorAllArray,\n\tstorage,\n\tstorageClear,\n};\n"],"names":["genEl","tagName","attrs","elsChildrens","el","name","elChildren","isVisible","boundingClientRect","offset","css","property","wrap","elWrapper","querySelectorVisible","selectors","querySelectorAllArray","querySelectorVisibleLast","querySelectorAllVisible","storage","contextName","contextData","storageClear","DOM"],"mappings":"AAYgB,SAAAA,EAAMC,GAAiBC,MAAeC,GAAqD;AACpG,QAAAC,IAAU,SAAS,cAAcH,CAAO;AAE9C,aAAWI,KAAQH;AAClB,IAAIG,EAAK,QAAQ,IAAI,MAAM,IAEvBD,EAAAC,CAAI,IAAIH,EAAMG,CAAI,IAErBD,EAAG,aAAaC,GAAMH,EAAMG,CAAI,CAAC;AAItB,SAAAF,EAAA,QAAQ,CAACG,MAAqC;AACtD,IAAA,OAAQA,KAAgB,WACxBF,EAAA,mBAAmB,aAAaE,CAAU,IAE7CF,EAAG,OAAOE,CAAU;AAAA,EACrB,CACA,GAEMF;AACR;AAOO,SAASG,EAAUH,GAA2B;AACpD,MAAI,CAACA;AACG,WAAA;AAGF,QAAAI,IAAqBJ,EAAG;AAC9B,SAAO,CAAC,EAAEI,EAAmB,SAASA,EAAmB;AAC1D;AAOO,SAASC,EAAOL,GAAgD;AAChE,QAAAI,IAAqBJ,EAAG;AAEvB,SAAA;AAAA,IACN,KAAKI,EAAmB,MAAM,OAAO;AAAA,IACrC,MAAMA,EAAmB,OAAO,OAAO;AAAA,EAAA;AAEzC;AAQgB,SAAAE,EAAIN,GAAiBO,GAA0B;AAC9D,SAAO,OAAO,iBAAiBP,CAAE,EAAE,iBAAiBO,CAAQ;AAC7D;AAOgB,SAAAC,EAAKR,GAAiBH,GAA8B;AAC7D,QAAAY,IAAY,SAAS,cAAcZ,CAAO;AAChD,SAAAG,EAAG,MAAMS,CAAS,GAElBA,EAAU,OAAOT,CAAE,GAEZS;AACR;AAOgB,SAAAC,EAAqBV,GAAiBW,GAAuC;AAC5F,SAAOC,EAAsBZ,GAAIW,CAAS,EAAE,KAAKR,CAAS,KAAK;AAChE;AAOgB,SAAAU,EAAyBb,GAAiBW,GAAuC;AAChG,SAAOC,EAAsBZ,GAAIW,CAAS,EAAE,SAASR,CAAS,KAAK;AACpE;AAOgB,SAAAW,EAAwBd,GAA4BW,GAAkC;AACrG,SAAOC,EAAsBZ,GAAIW,CAAS,EAAE,OAAOR,CAAS;AAC7D;AAOgB,SAAAS,EAAsBZ,GAA4BW,GAAkC;AACnG,SAAKX,IAIE,CAAC,GAAGA,EAAG,iBAAiBW,CAAS,CAAC,IAHjC;AAIT;AASO,SAASI,EACff,GACAgB,IAAsB,UACtBC,IAAyC,QACvB;AAClB,MAAKjB;AAID,WAACA,EAAG,YACPA,EAAG,UAAU,KAGViB,MACAjB,EAAA,QAAQgB,CAAW,IAAIC,IAGvBA,MAAgB,QACZ,OAAAjB,EAAG,QAAQgB,CAAW,GAGvBhB,EAAG,QAAQgB,CAAW;AAC9B;AAKO,SAASE,EAAalB,GAA4C;AACxE,EAAKA,KAIL,OAAOA,EAAG;AACX;AAEA,MAAemB,IAAA;AAAA,EACd,OAAAvB;AAAA,EACA,WAAAO;AAAA,EACA,QAAAE;AAAA,EACA,KAAAC;AAAA,EACA,MAAAE;AAAA,EACA,sBAAAE;AAAA,EACA,0BAAAG;AAAA,EACA,yBAAAC;AAAA,EACA,uBAAAF;AAAA,EACA,SAAAG;AAAA,EACA,cAAAG;AACD;"}
1
+ {"version":3,"file":"dom.js","sources":["../../src/core/utils/dom.ts"],"sourcesContent":["/**\n * Работа с Document Object Model (DOM)\n * @packageDocumentation\n */\n\n/**\n * Создать элемент\n * @param tagName\n * @param attrs - атрибуты\n * @param elsChildrens\n * @returns - созданный элемент\n */\nexport function genEl(tagName: string, attrs?: Record<string, string>, ...elsChildrens: HTMLElement[] | string[]): HTMLElement {\n\tconst el: any = document.createElement(tagName);\n\n\tfor (const name in attrs) {\n\t\tif (name.indexOf('on') === 0) {\n\t\t\t// events\n\t\t\tel[name] = attrs[name];\n\t\t} else {\n\t\t\tel.setAttribute(name, attrs[name]);\n\t\t}\n\t}\n\n\telsChildrens.forEach((elChildren: HTMLElement | string) => {\n\t\tif (typeof (elChildren) === 'string') {\n\t\t\tel.insertAdjacentHTML('beforeend', elChildren);\n\t\t} else {\n\t\t\tel.append(elChildren);\n\t\t}\n\t});\n\n\treturn el;\n}\n\n/**\n * Проверить видимость элемента\n * @param el\n * @returns - вернет true, если элемент считается видимым\n */\nexport function isVisible(el?: HTMLElement): boolean {\n\tif (!el) {\n\t\treturn false;\n\t}\n\n\tconst boundingClientRect = el.getBoundingClientRect();\n\treturn !!(boundingClientRect.width || boundingClientRect.height);\n}\n\n/**\n * Получить координаты элемента относительно документа\n * @param el\n * @returns - координаты элемента относительно документа\n */\nexport function offset(el: HTMLElement): { top: number, left: number } {\n\tconst boundingClientRect = el.getBoundingClientRect();\n\n\treturn {\n\t\ttop: boundingClientRect.top + window.scrollY,\n\t\tleft: boundingClientRect.left + window.scrollX,\n\t};\n}\n\n/**\n * Получить значение css свойства элемента\n * @param el\n * @param property - имя свойства\n * @return - значение css стиля\n */\nexport function css(el: HTMLElement, property: string): string {\n\treturn window.getComputedStyle(el).getPropertyValue(property);\n}\n\n/**\n * Обернуть элемент и вернуть только что созданный элемент\n * @param el - элемент, который требуется обернуть\n * @param tagName - имя тега элемента, в который треубется обернуть элемент\n */\nexport function wrap(el: HTMLElement, tagName: string): HTMLElement {\n\tconst elWrapper = document.createElement(tagName);\n\tel.after(elWrapper);\n\n\telWrapper.append(el);\n\n\treturn elWrapper;\n}\n\n/**\n * Найти и вернуть первый видимый элемент\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorVisible(el: HTMLElement, selectors: string): HTMLElement | null {\n\treturn querySelectorAllArray(el, selectors).find(isVisible) || null;\n}\n\n/**\n * Найти и вернуть последний видимый элемент\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorVisibleLast(el: HTMLElement, selectors: string): HTMLElement | null {\n\treturn querySelectorAllArray(el, selectors).findLast(isVisible) || null;\n}\n\n/**\n * Найти видимые элементы\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorAllVisible(el: HTMLElement | Document, selectors: string): HTMLElement[] {\n\treturn querySelectorAllArray(el, selectors).filter(isVisible);\n}\n\n/**\n * Найти элементы и вернуть в виде массива\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorAllArray(el: HTMLElement | Document, selectors: string): HTMLElement[] {\n\tif (!el) {\n\t\treturn [];\n\t}\n\n\treturn [...el.querySelectorAll(selectors)] as HTMLElement[];\n}\n\n/**\n * Хранилище данных элемента\n * @param el\n * @param contextName - контекст, обычно используется имя компонента\n * @param contextData - установить объект с данными, предыдущие данные будут заменены, установите null для удаления данных\n * @returns - вернет объект контекста или undefined, если данные контекста не найдены\n */\nexport function storage(\n\tel?: HTMLElement & { topData?: any },\n\tcontextName: string = 'common',\n\tcontextData: object | null | undefined = undefined,\n): any | undefined {\n\tif (!el) {\n\t\treturn;\n\t}\n\n\tif (!el.topData) {\n\t\tel.topData = {};\n\t}\n\n\tif (contextData) {\n\t\tel.topData[contextName] = contextData;\n\t}\n\n\tif (contextData === null) {\n\t\tdelete el.topData[contextName];\n\t}\n\n\treturn el.topData[contextName];\n}\n\n/**\n * Очистить хранилище элемента\n */\nexport function storageClear(el?: HTMLElement & { topData?: any }): void {\n\tif (!el) {\n\t\treturn;\n\t}\n\n\tdelete el.topData;\n}\n\nexport default {\n\tgenEl,\n\tisVisible,\n\toffset,\n\tcss,\n\twrap,\n\tquerySelectorVisible,\n\tquerySelectorVisibleLast,\n\tquerySelectorAllVisible,\n\tquerySelectorAllArray,\n\tstorage,\n\tstorageClear,\n};\n"],"names":["genEl","tagName","attrs","elsChildrens","el","name","elChildren","isVisible","boundingClientRect","offset","css","property","wrap","elWrapper","querySelectorVisible","selectors","querySelectorAllArray","querySelectorVisibleLast","querySelectorAllVisible","storage","contextName","contextData","storageClear","DOM"],"mappings":"AAYgB,SAAAA,EAAMC,GAAiBC,MAAmCC,GAAqD;AACxH,QAAAC,IAAU,SAAS,cAAcH,CAAO;AAE9C,aAAWI,KAAQH;AAClB,IAAIG,EAAK,QAAQ,IAAI,MAAM,IAEvBD,EAAAC,CAAI,IAAIH,EAAMG,CAAI,IAErBD,EAAG,aAAaC,GAAMH,EAAMG,CAAI,CAAC;AAItB,SAAAF,EAAA,QAAQ,CAACG,MAAqC;AACtD,IAAA,OAAQA,KAAgB,WACxBF,EAAA,mBAAmB,aAAaE,CAAU,IAE7CF,EAAG,OAAOE,CAAU;AAAA,EACrB,CACA,GAEMF;AACR;AAOO,SAASG,EAAUH,GAA2B;AACpD,MAAI,CAACA;AACG,WAAA;AAGF,QAAAI,IAAqBJ,EAAG;AAC9B,SAAO,CAAC,EAAEI,EAAmB,SAASA,EAAmB;AAC1D;AAOO,SAASC,EAAOL,GAAgD;AAChE,QAAAI,IAAqBJ,EAAG;AAEvB,SAAA;AAAA,IACN,KAAKI,EAAmB,MAAM,OAAO;AAAA,IACrC,MAAMA,EAAmB,OAAO,OAAO;AAAA,EAAA;AAEzC;AAQgB,SAAAE,EAAIN,GAAiBO,GAA0B;AAC9D,SAAO,OAAO,iBAAiBP,CAAE,EAAE,iBAAiBO,CAAQ;AAC7D;AAOgB,SAAAC,EAAKR,GAAiBH,GAA8B;AAC7D,QAAAY,IAAY,SAAS,cAAcZ,CAAO;AAChD,SAAAG,EAAG,MAAMS,CAAS,GAElBA,EAAU,OAAOT,CAAE,GAEZS;AACR;AAOgB,SAAAC,EAAqBV,GAAiBW,GAAuC;AAC5F,SAAOC,EAAsBZ,GAAIW,CAAS,EAAE,KAAKR,CAAS,KAAK;AAChE;AAOgB,SAAAU,EAAyBb,GAAiBW,GAAuC;AAChG,SAAOC,EAAsBZ,GAAIW,CAAS,EAAE,SAASR,CAAS,KAAK;AACpE;AAOgB,SAAAW,EAAwBd,GAA4BW,GAAkC;AACrG,SAAOC,EAAsBZ,GAAIW,CAAS,EAAE,OAAOR,CAAS;AAC7D;AAOgB,SAAAS,EAAsBZ,GAA4BW,GAAkC;AACnG,SAAKX,IAIE,CAAC,GAAGA,EAAG,iBAAiBW,CAAS,CAAC,IAHjC;AAIT;AASO,SAASI,EACff,GACAgB,IAAsB,UACtBC,IAAyC,QACvB;AAClB,MAAKjB;AAID,WAACA,EAAG,YACPA,EAAG,UAAU,KAGViB,MACAjB,EAAA,QAAQgB,CAAW,IAAIC,IAGvBA,MAAgB,QACZ,OAAAjB,EAAG,QAAQgB,CAAW,GAGvBhB,EAAG,QAAQgB,CAAW;AAC9B;AAKO,SAASE,EAAalB,GAA4C;AACxE,EAAKA,KAIL,OAAOA,EAAG;AACX;AAEA,MAAemB,IAAA;AAAA,EACd,OAAAvB;AAAA,EACA,WAAAO;AAAA,EACA,QAAAE;AAAA,EACA,KAAAC;AAAA,EACA,MAAAE;AAAA,EACA,sBAAAE;AAAA,EACA,0BAAAG;AAAA,EACA,yBAAAC;AAAA,EACA,uBAAAF;AAAA,EACA,SAAAG;AAAA,EACA,cAAAG;AACD;"}
@@ -1,2 +1,2 @@
1
- define(["require","exports","../.chunks/i18n-C_OH9IT3.amd","../.chunks/forms--Ye61xQ5.amd"],function(a,n,t,i){"use strict";if(typeof u>"u")var u=window.Vue;const c=(o,e,s=i.Core.state.currency)=>{e=e??t.useI18nLang().value;let r=o.toLocaleString(e,{style:"currency",currency:s,maximumFractionDigits:2});return r=r.replace(",","."),r};n.genPrice=c,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})});
1
+ define(["require","exports","../.chunks/i18n-C_OH9IT3.amd","../.chunks/forms-CQJeARc0.amd"],function(a,n,t,i){"use strict";if(typeof u>"u")var u=window.Vue;const c=(o,e,s=i.Core.state.currency)=>{e=e??t.useI18nLang().value;let r=o.toLocaleString(e,{style:"currency",currency:s,maximumFractionDigits:2});return r=r.replace(",","."),r};n.genPrice=c,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=price.amd.js.map
package/utils/price.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { u as c } from "../.chunks/i18n-DuTvft1T.es.js";
2
- import { C as i } from "../.chunks/forms-NfVxcPud.es.js";
2
+ import { C as i } from "../.chunks/forms-UyeTiEcX.es.js";
3
3
  const u = (t, r, o = i.state.currency) => {
4
4
  r = r ?? c().value;
5
5
  let e = t.toLocaleString(r, { style: "currency", currency: o, maximumFractionDigits: 2 });
@@ -1 +0,0 @@
1
- {"version":3,"file":"datepicker-C-d1Do_N.amd.js","sources":["../../src/components/forms/inputDate/datepicker.ts","../../src/components/forms/inputDate/datepicker.css?raw"],"sourcesContent":["import { toRef, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { dateFormat } from '@/core/utils/date';\n\nimport css from '@/components/forms/inputDate/datepicker.css?raw';\n\nCore.insertStyleToPage(css);\n\nconst $ = (el: HTMLInputElement) => {\n\tif (!Core.$?.ui?.datepicker) {\n\t\tconsole.info('Для работы datepicker требуется глобальная загрузка jQuery UI Datepicker');\n\n\t\treturn;\n\t}\n\n\tCore.$.datepicker.setDefaults({\n\t\tdateFormat: Core.state.dateFormat.toLowerCase().replace('m', 'mm').replace('y', 'yy').replace('d', 'dd'),\n\t});\n\n\treturn Core.$(el);\n};\n\nexport function connectDatepicker(el: HTMLInputElement, options: any) {\n\treturn $(el)?.datepicker(options);\n}\n\nlet dateFormatted;\nlet delimiter: string;\nlet dateNumbersCount: number;\nlet delimitersIndexes: number[];\n\nwatch(toRef(Core.state.dateFormat), () => {\n\t// генерация отформатированной даты, извлечение из нее разделителей и их индексов\n\tdateFormatted = dateFormat('2000-01-01');\n\tdelimiter = dateFormatted.match(/\\D/)?.[0] ?? '-';\n\tdateNumbersCount = dateFormatted.replace(/\\D+/g, '').length;\n\tdelimitersIndexes = [];\n\n\tfor (let i = 0; i < dateFormatted.length; i++) {\n\t\tif (dateFormatted[i] === delimiter) {\n\t\t\tdelimitersIndexes.push(i);\n\t\t}\n\t}\n}, { immediate: true });\n\n/**\n * Автоформат при вводе в поле с датой\n */\nexport function oninput(e: any) {\n\tlet selectionPos = e.target.selectionEnd;\n\tlet value = e.target.value;\n\n\t// разбить занчение на две половины - до и после каретки\n\t// удалить все символы, кроме цифр\n\tlet valueChunkLeft = value.substring(0, selectionPos).replace(/\\D+/g, '');\n\tlet valueChunkRight = value.substring(selectionPos).replace(/\\D+/g, '');\n\n\tlet extraNumbersCount = valueChunkLeft.length + valueChunkRight.length - dateNumbersCount;\n\tif (extraNumbersCount > 0) {\n\t\t// // количество цифр больше требуемого - удалить лишние\n\t\tvalueChunkLeft = valueChunkLeft.substring(0, dateNumbersCount);\n\n\t\tconst valueChunkRightMaxLength = dateNumbersCount - valueChunkLeft.length;\n\t\tvalueChunkRight = valueChunkRight.substring(valueChunkRight.length - valueChunkRightMaxLength);\n\t} else if (extraNumbersCount < 0) {\n\t\t// количество цифр меньше требуемого - добавить 0\n\t\tif (e.inputType === 'deleteContentForward') {\n\t\t\t// нажатие на delete - добавить к левой части для правильного позиционирования каретки\n\t\t\tvalueChunkLeft += '0'.repeat(-extraNumbersCount);\n\t\t} else {\n\t\t\tvalueChunkRight = '0'.repeat(-extraNumbersCount) + valueChunkRight;\n\t\t}\n\t}\n\n\tselectionPos = valueChunkLeft.length;\n\tvalue = valueChunkLeft + valueChunkRight;\n\n\t// вставить разделители\n\tfor (let i = 0; i < delimitersIndexes.length; i++) {\n\t\tconst delimiterIndex = delimitersIndexes[i];\n\n\t\tvalue = value.substring(0, delimiterIndex) + delimiter + value.substring(delimiterIndex);\n\n\t\t// сдвинуть каретку, если разделитель вставлен левее ее\n\t\tif (selectionPos >= delimiterIndex) {\n\t\t\tselectionPos++;\n\t\t}\n\t}\n\n\t// нажатие на backspace - если слева символ разделителя, перенести каретку за него\n\tif (e.inputType === 'deleteContentBackward' && value[selectionPos - 1] === delimiter) {\n\t\tselectionPos--;\n\t}\n\n\t// если значение изменилось - вставить его и переместить каретку\n\tif (value !== e.target.value) {\n\t\te.target.value = value;\n\t\te.target.selectionStart = selectionPos;\n\t\te.target.selectionEnd = selectionPos;\n\t}\n}\n","export default \"/* ui-datepicker */\\n.ui-datepicker {\\n\\t--datepicker-day-color: var(--color-bg-3);\\n\\t--datepicker-day-color-hover: var(--color-layer-secondary-1);\\n\\t--datepicker-selected-color: var(--color-bg-primary-2);\\n\\t--datepicker-selected-color-hover: var(--color-bg-primary-1);\\n\\t--datepicker-range-color: var(--color-layer-primary-1);\\n\\t--datepicker-range-color-hover: var(--color-layer-primary-2);\\n\\n\\tuser-select: none;\\n\\twidth: auto;\\n\\tpadding: 0;\\n}\\n\\n.ui-datepicker:before,\\n.ui-datepicker:after {\\n\\tdisplay: none;\\n}\\n\\n/* на странице */\\n.ui-datepicker-inline {\\n\\tdisplay: inline-block !important;\\n}\\n\\n/* в popup */\\n.ui-datepicker:not(.ui-datepicker-inline) {\\n\\tborder-radius: 8px;\\n\\tbackground: var(--content-background-color);\\n\\tbox-shadow: var(--top-shadow);\\n\\tz-index: 10000000 !important;\\n\\tpadding: 8px;\\n}\\n\\n.ui-datepicker a {\\n\\ttext-decoration: none !important;\\n}\\n\\n.ui-datepicker option {\\n\\tcolor: var(--color-text-1);\\n\\tfont-size: 14px;\\n}\\n\\n.ui-datepicker-header {\\n\\tpadding: 0 !important;\\n\\tmargin: 0 0 18px 0;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n}\\n\\n.ui-datepicker-header > * {\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n}\\n\\n.ui-datepicker-title {\\n\\twidth: 100% !important;\\n\\theight: 24px;\\n\\tmargin: 0 !important;\\n}\\n\\n.ui-datepicker-month,\\n.ui-datepicker-year {\\n\\toutline: none !important;\\n\\twidth: auto !important;\\n\\tborder: none;\\n\\tpadding: 0;\\n\\tmargin: 0 6px !important;\\n\\ttext-align: center;\\n\\tfont-size: 16px !important;\\n}\\n\\n.ui-datepicker-month {\\n\\tcolor: var(--color-text-1);\\n}\\n\\n.ui-datepicker-year {\\n\\tcolor: var(--color-text-2);\\n}\\n\\n/*\\tselect.ui-datepicker-month,\\nselect.ui-datepicker-year{ cursor: pointer; color: var(--color-blue-500); }*/\\nselect.ui-datepicker-month,\\nselect.ui-datepicker-year {\\n\\tcursor: pointer;\\n}\\n\\n.ui-datepicker-prev,\\n.ui-datepicker-next {\\n\\tcursor: pointer;\\n\\twidth: 24px !important;\\n\\theight: 24px !important;\\n\\tfont-size: 24px;\\n\\tfont-family: \\\"Topvisor-2\\\";\\n\\tposition: static !important;\\n}\\n\\n.ui-datepicker-prev:before {\\n\\tcolor: var(--color-icon-3);\\n\\tcontent: \\\"\\\";\\n}\\n\\n.ui-datepicker-prev-hover:before {\\n\\tcolor: var(--color-icon-1);\\n\\tcontent: \\\"\\\";\\n}\\n\\n.ui-datepicker-next {\\n\\tcolor: var(--color-icon-3);\\n\\torder: 1;\\n}\\n\\n.ui-datepicker-next-hover {\\n\\tcolor: var(--color-icon-1);\\n\\torder: 1;\\n}\\n\\n.ui-datepicker-next:before {\\n\\tcontent: \\\"\\\";\\n}\\n\\n.ui-datepicker-prev > *,\\n.ui-datepicker-next > * {\\n\\tdisplay: none !important;\\n}\\n\\n.ui-datepicker thead th {\\n\\twidth: auto !important;\\n\\tpadding: 0 !important;\\n\\tcolor: var(--color-text-3);\\n\\tfont-size: 14px;\\n\\tfont-weight: 400 !important;\\n}\\n\\n.ui-datepicker table {\\n\\tmargin: 0 !important;\\n\\tfont-size: 14px;\\n}\\n\\n.ui-datepicker td {\\n\\tcolor: var(--color-text-1);\\n\\tbackground: none;\\n\\tpadding: 0 !important;\\n}\\n\\n.ui-datepicker td span,\\n.ui-datepicker td a {\\n\\tborder-radius: 8px;\\n\\tborder: none;\\n\\tmin-width: 32px;\\n\\theight: 32px;\\n\\tpadding: 0;\\n\\tmargin: 1px;\\n\\tcolor: var(--color-text-1) !important;\\n\\tline-height: 32px;\\n\\ttext-align: center;\\n\\tposition: relative;\\n\\tdisplay: block;\\n}\\n\\n/* обычные даты */\\n.ui-datepicker td a {\\n\\tbackground: var(--datepicker-day-color);\\n}\\n\\n.ui-datepicker td a:hover {\\n\\tbackground: var(--datepicker-day-color-hover);\\n}\\n\\n/* текущий день */\\ntd.ui-datepicker-today span,\\ntd.ui-datepicker-today a {\\n\\tbackground: none;\\n\\tposition: relative;\\n}\\n\\n/* выбранные даты */\\n.ui-datepicker td.selected a {\\n\\tbackground: var(--datepicker-range-color);\\n\\tpadding-right: 0;\\n\\tpadding-left: 1px;\\n\\tmargin-right: 1px;\\n\\tmargin-left: 0;\\n}\\n\\n.ui-datepicker td.selected a:hover {\\n\\tbackground: var(--datepicker-range-color-hover);\\n}\\n\\n.ui-datepicker td.selected:not(.selected-start):not(:first-child):not(.first-of-month) a {\\n\\tborder-top-left-radius: 0;\\n\\tborder-bottom-left-radius: 0;\\n\\tpadding-left: 1px;\\n\\tmargin-left: 0;\\n}\\n\\n.ui-datepicker td.selected:not(.selected-end):not(:last-child):not(.last-of-month) a {\\n\\tborder-top-right-radius: 0;\\n\\tborder-bottom-right-radius: 0;\\n\\tpadding-right: 1px;\\n\\tmargin-right: 0;\\n}\\n\\n.ui-datepicker td.selected-start a,\\n.ui-datepicker td.selected-end a,\\n.ui-datepicker td.ui-datepicker-current-day a {\\n\\tbackground: var(--datepicker-selected-color);\\n\\tcolor: #FFF !important;\\n}\\n\\n.ui-datepicker td.selected-start a:hover,\\n.ui-datepicker td.selected-end a:hover,\\n.ui-datepicker td.ui-datepicker-current-day a:hover {\\n\\tbackground: var(--datepicker-selected-color-hover);\\n}\\n\\n.ui-datepicker-day-marks {\\n\\tline-height: normal;\\n\\tposition: absolute;\\n\\tright: 0;\\n\\tbottom: 3px;\\n\\tleft: 0;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n}\\n\\n.ui-datepicker-day-marks > i {\\n\\tborder-radius: 50%;\\n\\tborder: 1px solid #FFF;\\n\\twidth: 4px;\\n\\theight: 4px;\\n\\tmargin: 0 2px;\\n}\\n\\n.ui-datepicker-day-marks-exists {\\n\\tbackground: var(--color-icon-primary-2);\\n}\\n\\n.ui-datepicker-day-marks-update {\\n\\tbackground: var(--color-icon-negative-2);\\n}\\n\\n.ui-datepicker-row-break {\\n\\tdisplay: none;\\n}\\n\""],"names":["Core","$","el","forms","connectDatepicker","options","dateFormatted","delimiter","dateNumbersCount","delimitersIndexes","watch","_a","i","valueChunkLeft","value","selectionPos","valueChunkRight","extraNumbersCount","valueChunkRightMaxLength","delimiterIndex"],"mappings":"0HAMAA,EAAAA,KAAAA,kBCNA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CDMAA,EAEA,MAAAC,EAAAC,GAAA,uEAEE,QAAA,KAAA,0EAAA,EAEA,OAGD,OAAAC,EAAA,KAAA,EAAA,WAAA,YAAA,CAA8B,WAAAA,EAAA,KAAA,MAAA,WAAA,YAAA,EAAA,QAAA,IAAA,IAAA,EAAA,QAAA,IAAA,IAAA,EAAA,QAAA,IAAA,IAAA,CAC0E,CAAA,EAGxGA,EAAA,KAAA,EAAAD,CAAA,CACD,EAEgB,SAAAE,EAAAF,EAAAG,EAAA,mDAIhB,IAAAC,EACAC,EACAC,EACAC,EAEAC,EAAAA,MAAAA,EAAAA,MAAAA,EAAAA,KAAAA,MAAAA,UAAAA,EAAAA,IAAAA,OAECJ,EAAAH,EAAA,WAAA,YAAA,EACAI,IAAAI,EAAAL,EAAA,MAAA,IAAA,IAAA,YAAAK,EAAA,KAAA,IACAH,EAAAF,EAAA,QAAA,OAAA,EAAA,EAAA,YAGA,QAAAM,EAAA,EAAAA,EAAAN,EAAA,OAAAM,IACCN,EAAAM,CAAA,IAAAL,GACCE,EAAA,KAAAG,CAAA,CAGH,EAAA,CAAA,UAAA,EAAA,CAAA,6DAWCC,EAAAC,EAAA,UAAA,EAAAC,CAAA,EAAA,QAAA,OAAA,EAAA,EACAC,EAAAF,EAAA,UAAAC,CAAA,EAAA,QAAA,OAAA,EAAA,EAEAE,EAAAJ,EAAA,OAAAG,EAAA,OAAAR,EACA,GAAAS,EAAA,EAAA,uCAKCD,EAAAA,EAAA,UAAAA,EAAA,OAAAE,CAAA,CAA6F,MAAAD,EAAA,IAG7F,EAAA,YAAA,6DAQDF,EAAAF,EAAA,OACAC,EAAAD,EAAAG,EAGA,QAAAJ,EAAA,EAAAA,EAAAH,EAAA,OAAAG,IAAA,CACC,MAAAO,EAAAV,EAAAG,CAAA,EAEAE,EAAAA,EAAA,UAAA,EAAAK,CAAA,EAAAZ,EAAAO,EAAA,UAAAK,CAAA,EAGAJ,GAAAI,OAMD,EAAA,YAAA,yBAAAL,EAAAC,EAAA,CAAA,IAAAR,4BAMC,EAAA,OAAA,MAAAO,EACA,EAAA,OAAA,eAAAC,EACA,EAAA,OAAA,aAAAA,EAEF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"datepicker-DTNYG8Iy.es.js","sources":["../../src/components/forms/inputDate/datepicker.css?raw","../../src/components/forms/inputDate/datepicker.ts"],"sourcesContent":["export default \"/* ui-datepicker */\\n.ui-datepicker {\\n\\t--datepicker-day-color: var(--color-bg-3);\\n\\t--datepicker-day-color-hover: var(--color-layer-secondary-1);\\n\\t--datepicker-selected-color: var(--color-bg-primary-2);\\n\\t--datepicker-selected-color-hover: var(--color-bg-primary-1);\\n\\t--datepicker-range-color: var(--color-layer-primary-1);\\n\\t--datepicker-range-color-hover: var(--color-layer-primary-2);\\n\\n\\tuser-select: none;\\n\\twidth: auto;\\n\\tpadding: 0;\\n}\\n\\n.ui-datepicker:before,\\n.ui-datepicker:after {\\n\\tdisplay: none;\\n}\\n\\n/* на странице */\\n.ui-datepicker-inline {\\n\\tdisplay: inline-block !important;\\n}\\n\\n/* в popup */\\n.ui-datepicker:not(.ui-datepicker-inline) {\\n\\tborder-radius: 8px;\\n\\tbackground: var(--content-background-color);\\n\\tbox-shadow: var(--top-shadow);\\n\\tz-index: 10000000 !important;\\n\\tpadding: 8px;\\n}\\n\\n.ui-datepicker a {\\n\\ttext-decoration: none !important;\\n}\\n\\n.ui-datepicker option {\\n\\tcolor: var(--color-text-1);\\n\\tfont-size: 14px;\\n}\\n\\n.ui-datepicker-header {\\n\\tpadding: 0 !important;\\n\\tmargin: 0 0 18px 0;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n}\\n\\n.ui-datepicker-header > * {\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n}\\n\\n.ui-datepicker-title {\\n\\twidth: 100% !important;\\n\\theight: 24px;\\n\\tmargin: 0 !important;\\n}\\n\\n.ui-datepicker-month,\\n.ui-datepicker-year {\\n\\toutline: none !important;\\n\\twidth: auto !important;\\n\\tborder: none;\\n\\tpadding: 0;\\n\\tmargin: 0 6px !important;\\n\\ttext-align: center;\\n\\tfont-size: 16px !important;\\n}\\n\\n.ui-datepicker-month {\\n\\tcolor: var(--color-text-1);\\n}\\n\\n.ui-datepicker-year {\\n\\tcolor: var(--color-text-2);\\n}\\n\\n/*\\tselect.ui-datepicker-month,\\nselect.ui-datepicker-year{ cursor: pointer; color: var(--color-blue-500); }*/\\nselect.ui-datepicker-month,\\nselect.ui-datepicker-year {\\n\\tcursor: pointer;\\n}\\n\\n.ui-datepicker-prev,\\n.ui-datepicker-next {\\n\\tcursor: pointer;\\n\\twidth: 24px !important;\\n\\theight: 24px !important;\\n\\tfont-size: 24px;\\n\\tfont-family: \\\"Topvisor-2\\\";\\n\\tposition: static !important;\\n}\\n\\n.ui-datepicker-prev:before {\\n\\tcolor: var(--color-icon-3);\\n\\tcontent: \\\"\\\";\\n}\\n\\n.ui-datepicker-prev-hover:before {\\n\\tcolor: var(--color-icon-1);\\n\\tcontent: \\\"\\\";\\n}\\n\\n.ui-datepicker-next {\\n\\tcolor: var(--color-icon-3);\\n\\torder: 1;\\n}\\n\\n.ui-datepicker-next-hover {\\n\\tcolor: var(--color-icon-1);\\n\\torder: 1;\\n}\\n\\n.ui-datepicker-next:before {\\n\\tcontent: \\\"\\\";\\n}\\n\\n.ui-datepicker-prev > *,\\n.ui-datepicker-next > * {\\n\\tdisplay: none !important;\\n}\\n\\n.ui-datepicker thead th {\\n\\twidth: auto !important;\\n\\tpadding: 0 !important;\\n\\tcolor: var(--color-text-3);\\n\\tfont-size: 14px;\\n\\tfont-weight: 400 !important;\\n}\\n\\n.ui-datepicker table {\\n\\tmargin: 0 !important;\\n\\tfont-size: 14px;\\n}\\n\\n.ui-datepicker td {\\n\\tcolor: var(--color-text-1);\\n\\tbackground: none;\\n\\tpadding: 0 !important;\\n}\\n\\n.ui-datepicker td span,\\n.ui-datepicker td a {\\n\\tborder-radius: 8px;\\n\\tborder: none;\\n\\tmin-width: 32px;\\n\\theight: 32px;\\n\\tpadding: 0;\\n\\tmargin: 1px;\\n\\tcolor: var(--color-text-1) !important;\\n\\tline-height: 32px;\\n\\ttext-align: center;\\n\\tposition: relative;\\n\\tdisplay: block;\\n}\\n\\n/* обычные даты */\\n.ui-datepicker td a {\\n\\tbackground: var(--datepicker-day-color);\\n}\\n\\n.ui-datepicker td a:hover {\\n\\tbackground: var(--datepicker-day-color-hover);\\n}\\n\\n/* текущий день */\\ntd.ui-datepicker-today span,\\ntd.ui-datepicker-today a {\\n\\tbackground: none;\\n\\tposition: relative;\\n}\\n\\n/* выбранные даты */\\n.ui-datepicker td.selected a {\\n\\tbackground: var(--datepicker-range-color);\\n\\tpadding-right: 0;\\n\\tpadding-left: 1px;\\n\\tmargin-right: 1px;\\n\\tmargin-left: 0;\\n}\\n\\n.ui-datepicker td.selected a:hover {\\n\\tbackground: var(--datepicker-range-color-hover);\\n}\\n\\n.ui-datepicker td.selected:not(.selected-start):not(:first-child):not(.first-of-month) a {\\n\\tborder-top-left-radius: 0;\\n\\tborder-bottom-left-radius: 0;\\n\\tpadding-left: 1px;\\n\\tmargin-left: 0;\\n}\\n\\n.ui-datepicker td.selected:not(.selected-end):not(:last-child):not(.last-of-month) a {\\n\\tborder-top-right-radius: 0;\\n\\tborder-bottom-right-radius: 0;\\n\\tpadding-right: 1px;\\n\\tmargin-right: 0;\\n}\\n\\n.ui-datepicker td.selected-start a,\\n.ui-datepicker td.selected-end a,\\n.ui-datepicker td.ui-datepicker-current-day a {\\n\\tbackground: var(--datepicker-selected-color);\\n\\tcolor: #FFF !important;\\n}\\n\\n.ui-datepicker td.selected-start a:hover,\\n.ui-datepicker td.selected-end a:hover,\\n.ui-datepicker td.ui-datepicker-current-day a:hover {\\n\\tbackground: var(--datepicker-selected-color-hover);\\n}\\n\\n.ui-datepicker-day-marks {\\n\\tline-height: normal;\\n\\tposition: absolute;\\n\\tright: 0;\\n\\tbottom: 3px;\\n\\tleft: 0;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n}\\n\\n.ui-datepicker-day-marks > i {\\n\\tborder-radius: 50%;\\n\\tborder: 1px solid #FFF;\\n\\twidth: 4px;\\n\\theight: 4px;\\n\\tmargin: 0 2px;\\n}\\n\\n.ui-datepicker-day-marks-exists {\\n\\tbackground: var(--color-icon-primary-2);\\n}\\n\\n.ui-datepicker-day-marks-update {\\n\\tbackground: var(--color-icon-negative-2);\\n}\\n\\n.ui-datepicker-row-break {\\n\\tdisplay: none;\\n}\\n\"","import { toRef, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { dateFormat } from '@/core/utils/date';\n\nimport css from '@/components/forms/inputDate/datepicker.css?raw';\n\nCore.insertStyleToPage(css);\n\nconst $ = (el: HTMLInputElement) => {\n\tif (!Core.$?.ui?.datepicker) {\n\t\tconsole.info('Для работы datepicker требуется глобальная загрузка jQuery UI Datepicker');\n\n\t\treturn;\n\t}\n\n\tCore.$.datepicker.setDefaults({\n\t\tdateFormat: Core.state.dateFormat.toLowerCase().replace('m', 'mm').replace('y', 'yy').replace('d', 'dd'),\n\t});\n\n\treturn Core.$(el);\n};\n\nexport function connectDatepicker(el: HTMLInputElement, options: any) {\n\treturn $(el)?.datepicker(options);\n}\n\nlet dateFormatted;\nlet delimiter: string;\nlet dateNumbersCount: number;\nlet delimitersIndexes: number[];\n\nwatch(toRef(Core.state.dateFormat), () => {\n\t// генерация отформатированной даты, извлечение из нее разделителей и их индексов\n\tdateFormatted = dateFormat('2000-01-01');\n\tdelimiter = dateFormatted.match(/\\D/)?.[0] ?? '-';\n\tdateNumbersCount = dateFormatted.replace(/\\D+/g, '').length;\n\tdelimitersIndexes = [];\n\n\tfor (let i = 0; i < dateFormatted.length; i++) {\n\t\tif (dateFormatted[i] === delimiter) {\n\t\t\tdelimitersIndexes.push(i);\n\t\t}\n\t}\n}, { immediate: true });\n\n/**\n * Автоформат при вводе в поле с датой\n */\nexport function oninput(e: any) {\n\tlet selectionPos = e.target.selectionEnd;\n\tlet value = e.target.value;\n\n\t// разбить занчение на две половины - до и после каретки\n\t// удалить все символы, кроме цифр\n\tlet valueChunkLeft = value.substring(0, selectionPos).replace(/\\D+/g, '');\n\tlet valueChunkRight = value.substring(selectionPos).replace(/\\D+/g, '');\n\n\tlet extraNumbersCount = valueChunkLeft.length + valueChunkRight.length - dateNumbersCount;\n\tif (extraNumbersCount > 0) {\n\t\t// // количество цифр больше требуемого - удалить лишние\n\t\tvalueChunkLeft = valueChunkLeft.substring(0, dateNumbersCount);\n\n\t\tconst valueChunkRightMaxLength = dateNumbersCount - valueChunkLeft.length;\n\t\tvalueChunkRight = valueChunkRight.substring(valueChunkRight.length - valueChunkRightMaxLength);\n\t} else if (extraNumbersCount < 0) {\n\t\t// количество цифр меньше требуемого - добавить 0\n\t\tif (e.inputType === 'deleteContentForward') {\n\t\t\t// нажатие на delete - добавить к левой части для правильного позиционирования каретки\n\t\t\tvalueChunkLeft += '0'.repeat(-extraNumbersCount);\n\t\t} else {\n\t\t\tvalueChunkRight = '0'.repeat(-extraNumbersCount) + valueChunkRight;\n\t\t}\n\t}\n\n\tselectionPos = valueChunkLeft.length;\n\tvalue = valueChunkLeft + valueChunkRight;\n\n\t// вставить разделители\n\tfor (let i = 0; i < delimitersIndexes.length; i++) {\n\t\tconst delimiterIndex = delimitersIndexes[i];\n\n\t\tvalue = value.substring(0, delimiterIndex) + delimiter + value.substring(delimiterIndex);\n\n\t\t// сдвинуть каретку, если разделитель вставлен левее ее\n\t\tif (selectionPos >= delimiterIndex) {\n\t\t\tselectionPos++;\n\t\t}\n\t}\n\n\t// нажатие на backspace - если слева символ разделителя, перенести каретку за него\n\tif (e.inputType === 'deleteContentBackward' && value[selectionPos - 1] === delimiter) {\n\t\tselectionPos--;\n\t}\n\n\t// если значение изменилось - вставить его и переместить каретку\n\tif (value !== e.target.value) {\n\t\te.target.value = value;\n\t\te.target.selectionStart = selectionPos;\n\t\te.target.selectionEnd = selectionPos;\n\t}\n}\n"],"names":["css","Core","$","el","_b","_a","connectDatepicker","options","dateFormatted","delimiter","dateNumbersCount","delimitersIndexes","watch","toRef","dateFormat","i","oninput","e","selectionPos","value","valueChunkLeft","valueChunkRight","extraNumbersCount","valueChunkRightMaxLength","delimiterIndex"],"mappings":";;AAAA,MAAeA,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACMfC,EAAK,kBAAkBD,CAAG;AAE1B,MAAME,IAAI,CAACC,MAAyB;;AACnC,MAAI,GAACC,KAAAC,IAAAJ,EAAK,MAAL,gBAAAI,EAAQ,OAAR,QAAAD,EAAY,aAAY;AAC5B,YAAQ,KAAK,0EAA0E;AAEvF;AAAA,EACD;AAEK,SAAAH,EAAA,EAAE,WAAW,YAAY;AAAA,IAC7B,YAAYA,EAAK,MAAM,WAAW,YAAA,EAAc,QAAQ,KAAK,IAAI,EAAE,QAAQ,KAAK,IAAI,EAAE,QAAQ,KAAK,IAAI;AAAA,EAAA,CACvG,GAEMA,EAAK,EAAEE,CAAE;AACjB;AAEgB,SAAAG,EAAkBH,GAAsBI,GAAc;;AACrE,UAAOF,IAAAH,EAAEC,CAAE,MAAJ,gBAAAE,EAAO,WAAWE;AAC1B;AAEA,IAAIC,GACAC,GACAC,GACAC;AAEJC,EAAMC,EAAMZ,EAAK,MAAM,UAAU,GAAG,MAAM;;AAEzC,EAAAO,IAAgBM,EAAW,YAAY,GACvCL,MAAYJ,IAAAG,EAAc,MAAM,IAAI,MAAxB,gBAAAH,EAA4B,OAAM,KAC9CK,IAAmBF,EAAc,QAAQ,QAAQ,EAAE,EAAE,QACrDG,IAAoB,CAAA;AAEpB,WAASI,IAAI,GAAGA,IAAIP,EAAc,QAAQO;AACrC,IAAAP,EAAcO,CAAC,MAAMN,KACxBE,EAAkB,KAAKI,CAAC;AAG3B,GAAG,EAAE,WAAW,GAAA,CAAM;AAKf,SAASC,EAAQC,GAAQ;AAC3B,MAAAC,IAAeD,EAAE,OAAO,cACxBE,IAAQF,EAAE,OAAO,OAIjBG,IAAiBD,EAAM,UAAU,GAAGD,CAAY,EAAE,QAAQ,QAAQ,EAAE,GACpEG,IAAkBF,EAAM,UAAUD,CAAY,EAAE,QAAQ,QAAQ,EAAE,GAElEI,IAAoBF,EAAe,SAASC,EAAgB,SAASX;AACzE,MAAIY,IAAoB,GAAG;AAET,IAAAF,IAAAA,EAAe,UAAU,GAAGV,CAAgB;AAEvD,UAAAa,IAA2Bb,IAAmBU,EAAe;AACnE,IAAAC,IAAkBA,EAAgB,UAAUA,EAAgB,SAASE,CAAwB;AAAA,EAAA,MAC9F,CAAWD,IAAoB,MAE1BL,EAAE,cAAc,yBAEDG,KAAA,IAAI,OAAO,CAACE,CAAiB,IAE/CD,IAAkB,IAAI,OAAO,CAACC,CAAiB,IAAID;AAIrD,EAAAH,IAAeE,EAAe,QAC9BD,IAAQC,IAAiBC;AAGzB,WAASN,IAAI,GAAGA,IAAIJ,EAAkB,QAAQI,KAAK;AAC5C,UAAAS,IAAiBb,EAAkBI,CAAC;AAElC,IAAAI,IAAAA,EAAM,UAAU,GAAGK,CAAc,IAAIf,IAAYU,EAAM,UAAUK,CAAc,GAGnFN,KAAgBM,KACnBN;AAAA,EAEF;AAGA,EAAID,EAAE,cAAc,2BAA2BE,EAAMD,IAAe,CAAC,MAAMT,KAC1ES,KAIGC,MAAUF,EAAE,OAAO,UACtBA,EAAE,OAAO,QAAQE,GACjBF,EAAE,OAAO,iBAAiBC,GAC1BD,EAAE,OAAO,eAAeC;AAE1B;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"forms--Ye61xQ5.amd.js","sources":["../../src/core/utils/device.ts","../../src/core/core/events.ts","../../src/core/core/options.ts","../../src/core/core/state.ts","../../src/core/core/core.ts","../../src/core/utils/date.ts","../../src/components/forms/avatar/avatar.vue","../../src/components/forms/button/button.vue","../../src/components/forms/loadbar/loadbar.vue","../../src/components/forms/input/input.vue","../../src/components/forms/inputDate/inputDate.vue","../../src/components/forms/radio/radio.vue","../../src/components/forms/switcher/switcher.vue","../../src/components/forms/textarea/textarea.vue","../../src/components/forms/select/select.vue","../../src/components/forms/forms.ts"],"sourcesContent":["/**\n * Получение информации об устройстве\n * @packageDocumentation\n */\n\n/**\n * Определить, увеличинная ли плотность пикселей у экрана (DPR > 1)\n */\nexport function isRetina(): boolean {\n\treturn ('devicePixelRatio' in window && window.devicePixelRatio > 1);\n}\n\n/**\n * Определить, является ли устройство мобильным\n */\nexport function isMobile(): boolean {\n\treturn !!navigator.userAgent.match(/Android|BlackBerry|iPhone|iPad|iPod|IEMobile|Opera Mini/i);\n}\n\n/**\n * Определить, открыт ли сайт в приложении\n */\nexport function isApp(): boolean {\n\treturn (navigator.userAgent.indexOf('Topvisor_App') != -1);\n}\n\n/**\n * Определить, является ли OS пользователя macOS\n */\nexport function isMacOS(): boolean {\n\treturn navigator.userAgent.indexOf('Mac OS X') !== -1;\n}\n\n/**\n * Определить, является ли текущий браузер пользователя Safari\n */\nexport function isSafari(): boolean {\n\tconst isChrome = /Chrome|Android/.test(navigator.userAgent);\n\n\tlet isSafari = /Safari/.test(navigator.userAgent);\n\tif (isChrome && isSafari) {\n\t\tisSafari = false;\n\t}\n\n\treturn isSafari;\n}\n\n/**\n * Вернуть текст для обозначения клавиши Ctrl / Command в зависимости от OS\n */\nexport function getCommandKeyLabel(): 'Ctrl' | '⌘' {\n\tif (isMacOS()) {\n\t\treturn '⌘';\n\t} else {\n\t\treturn 'Ctrl';\n\t}\n}\n\n/**\n * Вернуть скролл с учетом устройства\n */\nexport const getScrollTop = (): number | undefined => {\n\treturn $(document).scrollTop();\n};\n\n/**\n * Вернуть контейнеры со скроллом (требует jquery)\n */\nexport const get$scroll = (): JQuery<Document> => {\n\treturn $(document);\n};\n\n/**\n * Вернуть контейнеры со скроллом (без jquery)\n */\nexport const getElsScroll = (): Document[] => {\n\treturn [document];\n};\n\n/**\n * Получить операционную систему пользователя\n *\n * Не определяет Windows 11, см. getOSAsync()\n */\nexport const getOS = (): string => {\n\tconst os: [string, RegExp][] = [\n\t\t['iOS', /(iPhone|iPad)/i],\n\t\t['Android', /(Android)/i],\n\t\t['Windows Phone', /(IEMobile)/i],\n\t\t['Windows 3.11', /Win16/i],\n\t\t['Windows 95', /(Windows 95)|(Win95)|(Windows_95)/i],\n\t\t['Windows 98', /(Windows 98)|(Win98)/i],\n\t\t['Windows 2000', /(Windows NT 5.0)|(Windows 2000)/i],\n\t\t['Windows XP', /(Windows NT 5.1)|(Windows XP)/i],\n\t\t['Windows Server 2003', /(Windows NT 5.2)/i],\n\t\t['Windows Vista', /(Windows NT 6.0)/i],\n\t\t['Windows 7', /(Windows NT 6.1)/i],\n\t\t['Windows 8', /(Windows NT 6.[23])|(Windows 8)/i],\n\t\t['Windows 10', /(Windows NT 10)/i],\n\t\t['Windows NT 4.0', /(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)/i],\n\t\t['Windows ME', /Windows ME/i],\n\t\t['Windows', /Windows/i],\n\t\t['Open BSD', /OpenBSD/i],\n\t\t['Sun OS', /SunOS/i],\n\t\t['Linux', /(Linux)|(X11)/i],\n\t\t['Macintosh', /(Mac_PowerPC)|(Macintosh)|(Mac OS X 10.4)|(Mac OS X 10.5)|(Mac OS X 10.6)/i],\n\t\t['QNX', /QNX/i],\n\t\t['BeOS', /BeOS/i],\n\t\t['OS/2', /OS\\/2/i],\n\t];\n\n\tlet res = '';\n\tfor (let i = 0; i < os.length; i++) {\n\t\tif (os[i][1].test(navigator.userAgent)) {\n\t\t\tres = os[i][0];\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn res;\n};\n\n/**\n * Получить операционную систему пользователя, в том числе Windows 11\n */\nexport const getOSAsync = async (): Promise<string> => {\n\tlet os = getOS();\n\n\tif (os === 'Windows 10') {\n\t\t// @ts-ignore - experimental technology\n\t\tconst platformVersion = await navigator?.userAgentData?.getHighEntropyValues(['platformVersion']);\n\t\tif (platformVersion && platformVersion.platformVersion >= '13') {\n\t\t\tos = 'Windows 11';\n\t\t}\n\t}\n\n\treturn os;\n};\n","const onResizeDelay = 100;\n\nlet onResizeTimer: NodeJS.Timeout;\n\ntype TopEvent = Event & { topEvent: { widthDiff: number, hightDiff: number } }\n\n/**\n * Установленные обрабочики на событие изменения размеров окна\n */\nconst onResizeListeners: Map<(ev: TopEvent) => any, (ev: TopEvent) => any> = new Map();\n\n// зафиксированное состояние размеров окна\nconst windowSize = {\n\twidth: window.innerWidth,\n\theight: window.innerHeight,\n};\n\n/**\n * Добавить обработчик на событие изменения размеров экрана\n * вызов таких обработчиков будет опмизирован и объединен в одно событие\n */\nfunction addOnReize(listener: (this: HTMLElement, ev: TopEvent) => any) {\n\tonResizeListeners.set(listener, listener);\n}\n\n/**\n * Удаление обработчика на событие изменений размеров экрана\n */\nfunction removeOnResize(listener: (this: HTMLElement, ev: TopEvent) => any) {\n\tonResizeListeners.delete(listener);\n}\n\nfunction onResize(e: any) {\n\tclearTimeout(onResizeTimer);\n\n\tonResizeTimer = setTimeout(function () {\n\t\te.topEvent = {\n\t\t\twidthDiff: windowSize.width - window.innerWidth,\n\t\t\thightDiff: windowSize.height - window.innerHeight,\n\t\t};\n\n\t\twindowSize.width = window.innerWidth;\n\t\twindowSize.height = window.innerHeight;\n\n\t\tonResizeListeners.forEach((callback) => callback(e));\n\t}, onResizeDelay);\n}\n\nwindow.addEventListener('resize', onResize);\n\nexport default {\n\taddOnReize,\n\tremoveOnResize,\n};\n","/**\n * Конфигурация UI\n *\n * Начальные значений устанавилаются при подклчюении Core во Vue приложение через app.use(PluginCore, options)\n */\nexport default {\n\t/**\n\t * Базовая ширина страницы для отображения ПК / Мобильной версии сайта\n\t */\n\twidthForMobile: 900,\n\n\t/**\n\t * Формат даты, который будет испоьзоваться по умолчанию для вывода даты, как правило, завсит от текущего пользователя\n\t */\n\tdateFormat: 'Y-m-d',\n\n\t/**\n\t * Валюта, которая будет испоьзоваться по умолчанию, как правило, завсит от текущего пользователя\n\t */\n\tcurrency: 'USD' as 'RUB' | 'USD' | 'EUR',\n\n\t/**\n\t * Для Москвы: +0300\n\t */\n\tgmt: new Date().toString().match(/GMT(\\S+)/)?.[1] as string,\n};\n","import options from './options';\n\n/**\n * State UI для взаимодейсвтиями с приложениями Vue\n */\nconst state = {\n\tdateFormat: options.dateFormat,\n\tcurrency: options.currency,\n\tgmt: options.gmt,\n\n\t/**\n\t * Device by size\n\t * @see widthForMobile\n\t */\n\tisMobile: false,\n\n\t/**\n\t * Device by user agent\n\t */\n\tisMobileUA: false,\n\n\t/**\n\t * true, если плотность пикселей экрана больше 1\n\t */\n\tisRetina: false,\n\n\t/**\n\t * true, елси это приложение\n\t */\n\tisApp: false,\n\n\t/**\n\t * true при горизонтальном расположении устройства\n\t */\n\tisLandscape: true,\n\n\t/**\n\t * true при вертикальном расположении устройства\n\t */\n\tisPortrait: false,\n\n\t/**\n\t * Максимальная сторона страницы\n\t */\n\tsize: 0,\n\n\t// /**\n\t// * true, если страница скрыта\n\t// */\n\t// isHidden: false,\n};\n\nexport default state;\n","import { reactive } from 'vue';\nimport { isApp, isMobile, isRetina } from '@/core/utils/device';\nimport Events from '@/core/core/events';\nimport state from '@/core/core/state';\n\n/**\n * Статический класс с текущим состоянимем UI\n */\nexport default class Core {\n\n\t/**\n\t * Настройки словаря\n\t *\n\t * @deprecated - используйте useI18n() и $i18n;\n\t */\n\tstatic L = reactive({\n\t\tNot_date: 'Not date',\n\t});\n\n\tstatic state = reactive({ ...state });\n\n\tstatic widthForMobile = 900;\n\n\tstatic matchMediaIsMobile?: MediaQueryList;\n\n\tstatic $ = window['$'] as typeof $ | undefined;\n\n\tstatic Events = Events;\n\n\tstatic _setState() {\n\t\tCore.matchMediaIsMobile = window.matchMedia(`(max-width: ${Core.widthForMobile}px)`);\n\n\t\tCore.state.isMobileUA = isMobile();\n\t\tCore.state.isRetina = isRetina();\n\t\tCore.state.isApp = isApp();\n\t\t// Core.state.isHidden = this.isHidden();\n\n\t\tCore.setStateByWindowSize();\n\n\t\t// пересчет значений, зависящих от рамзеров окна\n\t\tEvents.addOnReize(Core.onResize);\n\n\t\tCore.onResize();\n\n\t\tCore.saveToCookie();\n\t}\n\n\tprivate static onResize() {\n\t\tCore.setStateByWindowSize();\n\n\t\t// честный vh\n\t\tdocument.documentElement.style.setProperty('--100vh', window.innerHeight + 'px');\n\t}\n\n\tprivate static setStateByWindowSize() {\n\t\tCore.state.isMobile = !!Core.matchMediaIsMobile?.matches;\n\t\tCore.state.isLandscape = (window.innerWidth > window.innerHeight);\n\t\tCore.state.isPortrait = !Core.state.isLandscape;\n\t\tCore.state.size = (window.innerWidth > window.innerHeight) ? window.innerWidth : window.innerHeight;\n\n\t\tCore.saveToCookie();\n\t}\n\n\t/**\n\t * Сохранить информацию об устройстве в cookie\n\t */\n\tprivate static saveToCookie() {\n\t\tconst device = [\n\t\t\t1,\n\t\t\twindow.innerWidth,\n\t\t\twindow.innerHeight,\n\t\t\twindow.devicePixelRatio,\n\t\t\tNumber(Core.state.isMobile),\n\t\t\tNumber(Core.state.isRetina),\n\t\t];\n\n\t\tdocument.cookie = 'device=' + device.join(',') + '; path=/;';\n\t}\n\n\t/**\n\t * Проверить скрыта страница или нет\n\t */\n\tstatic isHidden = (): boolean => document.hidden;\n\n\t/**\n\t * Вставить css стили на страницу по ссылке с автоматическим добавлением правил media\n\t *\n\t * Правила media:\n\t * - Файлы *.m.css будут грузиться, только на экранах с шириной менее, чем Core.widthForMobile\n\t * - Файлы *.pc.css будут грузиться, только на экранах с шириной более, чем Core.widthForMobile\n\t *\n\t * Настройкой Core.widthForMobile можно управлять через plugin: @topvisor/ui/plugin/core\n\t *\n\t * @param fileNames - список ссылок на css файлы\n\t * @param useSync - использовать синхронную загрузку css, только для css с того же домена. В синхронном режиме стили предзагружаются независимо от\n\t * media\n\t */\n\tstatic insertCSSLinkToPage = (fileNames: Array<string>, useSync = false) => {\n\t\tconst cssFilesByOptions = new Map();\n\t\tcssFilesByOptions.set('::', []);\n\n\t\tfileNames.forEach(filename => {\n\t\t\tlet m = false;\n\t\t\tlet pc = false;\n\n\t\t\tif (filename.match(/\\.m\\./)) {\n\t\t\t\tm = true;\n\t\t\t}\n\t\t\tif (filename.match(/\\.pc\\./)) {\n\t\t\t\tpc = true;\n\t\t\t}\n\n\t\t\tconst key = `${m}:${pc}`;\n\t\t\tif (!cssFilesByOptions.has(key)) {\n\t\t\t\tcssFilesByOptions.set(`${m}:${pc}`, []);\n\t\t\t}\n\t\t\tcssFilesByOptions.get(`${m}:${pc}`).push(filename);\n\t\t});\n\n\t\tconst promises: Array<Promise<unknown>> = [];\n\n\t\tcssFilesByOptions.forEach((fileNames, options: string) => {\n\t\t\tif (!fileNames.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst [m, pc] = options.split(':').map(item => item === 'true');\n\n\t\t\tlet media = 'all';\n\t\t\tif (m) {\n\t\t\t\tmedia = '(max-width: ' + Core.widthForMobile + 'px)';\n\t\t\t}\n\t\t\tif (pc) {\n\t\t\t\tmedia = '(min-width: ' + Core.widthForMobile + 'px)';\n\t\t\t}\n\n\t\t\tconst promisesI = Core._insertToPage(fileNames, media, useSync);\n\t\t\tpromisesI.forEach(promise => promises.push(promise));\n\t\t});\n\n\t\treturn Promise.all(promises);\n\t};\n\n\tprivate static _insertToPage = (fileNames: Array<string>, media: string, useSync: boolean) => {\n\t\tconst promises: Array<Promise<unknown>> = [];\n\n\t\tfileNames.forEach(fileName => {\n\t\t\t// синхронная загрузка, чтобы функция не выполнилась раньше загрузки стилей\n\t\t\tif (useSync) {\n\t\t\t\tconst request = new XMLHttpRequest();\n\t\t\t\trequest.open('GET', fileName, false);\n\t\t\t\trequest.send();\n\t\t\t}\n\n\t\t\tconst id = 'topCSSLink-' + fileName.replace(/\\W/g, '-');\n\n\t\t\t// стиль уже загружен\n\t\t\tif (window.hasOwnProperty(id)) return;\n\n\t\t\tlet resolve: Function;\n\t\t\tlet reject: Function;\n\t\t\tconst promise = new Promise((_resolve, _reject) => {\n\t\t\t\tresolve = _resolve;\n\t\t\t\treject = _reject;\n\t\t\t});\n\t\t\tpromises.push(promise);\n\n\t\t\tconst elLink = document.createElement('link');\n\t\t\telLink.id = id;\n\t\t\telLink.rel = 'stylesheet';\n\t\t\telLink.media = media;\n\t\t\telLink.href = fileName;\n\t\t\telLink.onload = () => resolve();\n\t\t\telLink.onerror = () => reject();\n\n\t\t\tdocument.head.append(elLink);\n\t\t});\n\n\t\treturn promises;\n\t};\n\n\t/**\n\t * Вставить css стили на страницу с автоматическим добавлением правил media\n\t *\n\t * Загрузка с Vite:\n\t *\n\t * ```js\n\t * import style from '/style.css?raw';\n\t *\n\t * insertToPageAsInine(style);\n\t * ```\n\t *\n\t * Загрузка с fetch:\n\t *\n\t * ```js\n\t * const style = await fetch('./style.css');\n\t *\n\t * insertToPageAsInine(style);\n\t * ```\n\t *\n\t * @param style - css стили в строке\n\t * @param type - если указать 'm' или 'pc', то стили будут применяться по условию в зависимости от настройки this.widthForMobile\n\t *\n\t * @see insertToPage\n\t */\n\tstatic insertStyleToPage = (style: string, type: '' | 'm' | 'pc' = '') => {\n\t\tlet media = 'all';\n\n\t\tif (type === 'm') {\n\t\t\tmedia = '(max-width: ' + Core.widthForMobile + 'px)';\n\t\t}\n\n\t\tif (type === 'pc') {\n\t\t\tmedia = '(min-width: ' + Core.widthForMobile + 'px)';\n\t\t}\n\n\t\tconst elStyle = document.createElement('style');\n\t\telStyle.innerHTML = style;\n\t\telStyle.media = media;\n\n\t\tdocument.head.append(elStyle);\n\t};\n\n}\n","/**\n * Работа с датами\n * @packageDocumentation\n */\n\nimport Core from '@/core/core/core';\n\nconst L = (window as any).L ?? {};\n\n/**\n * Получить день недели\n */\nexport const getDayOfWeek = (y: number, m: number, d: number): string => {\n\tswitch ((new Date(y, m, d)).getDay()) {\n\t\tcase 0:\n\t\t\treturn L.Vs + '.';\n\t\tcase 1:\n\t\t\treturn L.Pn + '.';\n\t\tcase 2:\n\t\t\treturn L.Vt + '.';\n\t\tcase 3:\n\t\t\treturn L.Sr + '.';\n\t\tcase 4:\n\t\t\treturn L.Ct + '.';\n\t\tcase 5:\n\t\t\treturn L.Pt + '.';\n\t\tcase 6:\n\t\t\treturn L.Sb + '.';\n\t\tdefault:\n\t\t\treturn '';\n\t}\n};\n\n/**\n * Преобразовать дату в строку формата Y-m-d H:i:s\n * @param dateObject - объект Date\n * @param langFormat - если true, формат даты будет взят из Core.state.dateFormat\n * @param timeFormat - 0-только дата | 1-дата и часы | 2-дата и часы с минутами | 3-дата и часы с минутами и секундами\n */\nexport const dateToString = (dateObject: Date, langFormat: boolean = true, timeFormat: 0 | 1 | 2 | 3 = 2): string => {\n\tlet Y = String(dateObject.getFullYear());\n\tlet d = String(dateObject.getDate()).padStart(2, '0');\n\tlet m = String(dateObject.getMonth() + 1).padStart(2, '0');\n\tlet H = String(dateObject.getHours()).padStart(2, '0');\n\tlet i = String(dateObject.getMinutes()).padStart(2, '0');\n\tlet s = String(dateObject.getSeconds()).padStart(2, '0');\n\n\tlet date = Y + '-' + m + '-' + d;\n\tif (timeFormat >= 1) date += ' ' + H;\n\tif (timeFormat >= 2) date += ':' + i;\n\tif (timeFormat === 3) date += ':' + s;\n\tif (langFormat) date = dateFormat(date, timeFormat);\n\n\treturn date;\n};\n\n/**\n * Получить объект Date из строки\n * @param date - строка с датой\n */\nexport function stringToDate(date: string): Date {\n\tif (date.indexOf('T') === -1) {\n\t\tif (date.length == 10) {\n\t\t\tdate += ' 00:00:00';\n\t\t}\n\n\t\tdate = date.replace(' ', 'T') + Core.state.gmt;\n\t}\n\n\treturn new Date(date);\n}\n\n/**\n * Генерация даты-строки из миллисекунд (UTC), в формате Y-m-d H:i:s\n * @param timestamp - дата в мс, если не передана, берется дата на момент вызова функции\n * @param useFormat - если true, формат даты будет взят из Core.state.dateFormat\n * @param time - 0-только дата | 1-дата и часы | 2-дата и часы с минутами | 3-дата и часы с минутами и секундами\n */\nexport function genDate(timestamp: number | undefined, useFormat: boolean = true, time: 0 | 1 | 2 | 3 = 0): string {\n\tlet date;\n\tif (timestamp != undefined) {\n\t\tdate = new Date(timestamp);\n\t} else {\n\t\tdate = new Date();\n\t}\n\n\tconst Y = date.getFullYear();\n\tconst m = String(date.getMonth() + 1).padStart(2, '0');\n\tconst d = date.getDate().toString().padStart(2, '0');\n\n\tconst H = date.getHours().toString().padStart(2, '0');\n\tconst i = date.getMinutes().toString().padStart(2, '0');\n\tconst s = date.getSeconds().toString().padStart(2, '0');\n\n\tdate = Y + '-' + m + '-' + d;\n\n\tif (time) date += ' ';\n\tif (time >= 1) date += H;\n\tif (time >= 2) date += ':' + i;\n\tif (time >= 3) date += ':' + s;\n\n\tif (useFormat) {\n\t\tdate = dateFormat(date, time);\n\t}\n\n\treturn date;\n}\n\n/**\n * Генерация даты-строки (время московское) из миллисекунд (UTC), в формате Y-m-d H:i:s\n * @param ms - дата в мс, если не передана, берется дата на момент вызова функции\n * @param langFormat - если true, формат даты будет взят из Core.state.dateFormat\n */\nexport function genDateMoscow(ms: number | undefined, langFormat: boolean = true): string {\n\tconst time_zone = (new Date().getTimezoneOffset() / 60) * (-1);\n\tconst dateoffset = time_zone * 60 * 60 * 1000;\n\tconst moscow_dateoffset = 3 * 60 * 60 * 1000;\n\n\tlet date: Date;\n\tif (ms !== undefined) {\n\t\tdate = new Date(ms);\n\t} else {\n\t\tdate = new Date();\n\t}\n\n\tdate.setTime(date.getTime() - dateoffset + moscow_dateoffset);\n\n\tlet Y = String(date.getFullYear());\n\tlet d = String(date.getDate()).padStart(2, '0');\n\tlet m = String(date.getMonth() + 1).padStart(2, '0');\n\tlet H = String(date.getHours()).padStart(2, '0');\n\tlet i = String(date.getMinutes()).padStart(2, '0');\n\tlet s = String(date.getSeconds()).padStart(2, '0');\n\n\tlet dateStr = Y + '-' + m + '-' + d + ' ' + H + ':' + i + ':' + s;\n\tif (langFormat) {\n\t\tdateStr = dateFormat(dateStr);\n\t}\n\n\treturn dateStr;\n}\n\n/**\n * Перевод даты в формат пользователя\n * @param date - объект даты или строка в формате Y-m-d H:i:s\n * @param time - 0-только дата | 1-дата и часы | 2-дата и часы с минутами | 3-дата и часы с минутами и секундами\n * @param dateformat -\n * @param emptyValue - значение, которое надо вернуть, если дата не указана\n */\nexport function dateFormat(dateMixed: string | Date, time: 0 | 1 | 2 | 3 = 2, dateFormat?: string, emptyValue: string = Core.L.Not_date): string {\n\tif (typeof dateMixed === 'string') {\n\t\tif (!dateMixed || dateMixed.substring(0, 10) === '0000-00-00') {\n\t\t\tif (emptyValue && emptyValue !== '0000-00-00') {\n\t\t\t\treturn emptyValue;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!dateMixed) return emptyValue;\n\n\tif (!dateFormat) {\n\t\tdateFormat = Core.state.dateFormat;\n\t}\n\n\tdateFormat = dateFormat.toLowerCase().replace('m', 'mm').replace('y', 'yy').replace('d', 'dd');\n\n\tlet date: Date;\n\tif (dateMixed instanceof Date) {\n\t\tdate = dateMixed;\n\t} else {\n\t\tlet dateForObj = dateMixed.substring(0, 10);\n\t\tif (dateForObj.length === 7) dateForObj += '-01';\n\t\tdateForObj += ' 00:00';\n\t\tdateForObj = dateForObj.replace(/-/g, '/'); // safari fix\n\n\t\tdate = new Date(dateForObj);\n\t\tif (isNaN(Number(date))) return emptyValue;\n\t}\n\n\tlet result = '';\n\n\tif (dateFormat && window['$']) {\n\t\tresult = $.datepicker.formatDate(dateFormat, date);\n\t}\n\n\tif (time && typeof dateMixed === 'string' && dateMixed.length > 10 || time && dateMixed instanceof Date) {\n\t\tlet timeStr: string = '';\n\t\tif (dateMixed instanceof Date) {\n\t\t\ttimeStr = new Date().toLocaleTimeString('en-US', {\n\t\t\t\thour12: false,\n\t\t\t\thour: 'numeric',\n\t\t\t\tminute: time >= 2 ? 'numeric' : undefined,\n\t\t\t\tsecond: time >= 3 ? 'numeric' : undefined,\n\t\t\t});\n\t\t} else {\n\t\t\tswitch (time) {\n\t\t\t\t// часы\n\t\t\t\tcase 1:\n\t\t\t\t\ttimeStr = dateMixed.substring(11, 13);\n\n\t\t\t\t\tbreak;\n\t\t\t\t// часы и минуты\n\t\t\t\tcase 2:\n\t\t\t\t\ttimeStr = dateMixed.substring(11, 16);\n\n\t\t\t\t\tbreak;\n\t\t\t\t// часы, минуты и секунды\n\t\t\t\tcase 3:\n\t\t\t\t\ttimeStr = dateMixed.substring(11, 19);\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tresult += ' ' + timeStr;\n\t}\n\n\tresult = result.trim();\n\n\treturn result;\n}\n\n/**\n * Перевод даты из формата пользователя в системный формат Y-m-d H:i:s\n * @param date - строка с датой\n * @param emptyValue - значение, которое надо вернуть, если дата не указана\n */\nexport function dateUnformat(date: string, emptyValue: string = Core.L.Not_date): string {\n\tif (!date) {\n\t\treturn emptyValue;\n\t}\n\n\tif (date.match(/\\d\\d\\d\\d-\\d\\d-\\d\\d/)) {\n\t\treturn date;\n\t}\n\n\tconst dateFormat = Core.state.dateFormat.toLowerCase();\n\n\tconst dateChunks = date.split(/\\W/);\n\tconst dateFormatChunks = dateFormat.split(/\\W/);\n\n\tlet d = '';\n\tlet m = '';\n\tlet y = '';\n\n\tdateFormatChunks.forEach((type, index) => {\n\t\tswitch (type) {\n\t\t\tcase 'd':\n\t\t\t\td = dateChunks[index];\n\n\t\t\t\tbreak;\n\t\t\tcase 'm':\n\t\t\t\tm = dateChunks[index];\n\n\t\t\t\tbreak;\n\t\t\tcase 'y':\n\t\t\t\ty = dateChunks[index];\n\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tlet result = y + '-' + m + '-' + d;\n\n\tif (!result.match(/\\d\\d\\d\\d-\\d\\d-\\d\\d/)) {\n\t\tconsole.info('Неверный формат даты, будет возращена текущая дата, ' + result);\n\n\t\tresult = genDate((new Date()).getTime(), false).substring(0, 10);\n\t}\n\n\treturn result;\n}\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\nimport type { Props } from './avatar';\nimport { dateFormat } from '@/core/utils/date';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 64,\n\ti18n: () => ({\n\t\tOnline: 'Online',\n\t\tLastSeen: 'Last seen',\n\t}),\n});\n\nconst titleStatus = computed(() => {\n\tif (props.isOnline) {\n\t\treturn props.i18n?.Online;\n\t}\n\n\tif (props.lastActiveTime) {\n\t\treturn props.i18n?.LastSeen + ': ' + dateFormat(props.lastActiveTime, 2);\n\t}\n});\n\nconst titleImage = computed(() => {\n\tif (!props.nickname) return titleStatus.value;\n\n\treturn props.nickname + (titleStatus.value ? `\\n${titleStatus.value}` : '');\n});\n</script>\n\n<template>\n\t<div class=\"top-avatar\">\n\t\t<img\n\t\t\tclass=\"top-avatar_image\"\n\t\t\t:src=\"image\"\n\t\t\t:title=\"titleImage\"\n\t\t\talt=\"\"\n\t\t>\n\n\t\t<div\n\t\t\tv-if=\"isOnline\"\n\t\t\tclass=\"top-avatar_status\"\n\t\t\t:title=\"titleStatus\"\n\t\t>\n\t\t</div>\n\t</div>\n</template>\n\n<style module>\n.top-avatar {\n\twidth: v-bind(size+ \"px\");\n\theight: v-bind(size+ \"px\");\n\tdisplay: flex;\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tposition: relative;\n\ttop: 0;\n\tleft: 0;\n}\n\n.top-avatar_image {\n\tborder-radius: 50%;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.top-avatar_status {\n\tborder-radius: 50%;\n\tborder: 2px solid var(--content-background-color);\n\tbackground-color: var(--color-bg-positive-2);\n\twidth: 25%;\n\theight: 25%;\n\tposition: absolute;\n\tright: 0;\n\tbottom: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Props } from './button';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tcolor: 'blue',\n\tstyling: '',\n\tsize: 's',\n});\n\nconst tagName = computed(() => props.href ? 'a' : 'button');\n\nconst type = computed(() => props.isSubmit ? 'submit' : undefined);\n</script>\n\n<template>\n\t<component\n\t\t:is=\"tagName\"\n\t\t:class=\"{\n\t\t\t['top-active']: isActive,\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t['top-button']: true,\n\t\t\t['top-button-progress']: isProgress,\n\t\t\t[`top-size_${size}`]: !!size,\n\t\t\t[`top-color_${color}`]: true,\n\t\t\t[`top-style_${styling}`]: !!styling,\n\t\t\t['top-button-withoutText']: !$slots.default,\n\t\t}\"\n\t\t:name=\"name\"\n\t\t:title=\"title\"\n\t\t:href=\"href\"\n\t\t:type=\"type\"\n\t\t:data-top-icon=\"icon || undefined\"\n\t\t:data-top-icon2=\"icon2 || undefined\"\n\t\t:disabled=\"disabled || undefined\"\n\t\t:inProgress=\"isProgress\"\n\t>\n\t\t<span\n\t\t\tv-if=\"badgeNumber\"\n\t\t\t:data-top-badge=\"badgeNumber\"\n\t\t\tclass=\"top-button_badge\"\n\t\t\t:class=\"{\n\t\t\t\t['top-button_badge-afterText']: badgePosAfterText,\n\t\t\t}\"\n\t\t></span>\n\n\t\t<span\n\t\t\tv-if=\"$slots.default\"\n\t\t\tclass=\"top-ellipsis\"\n\t\t>\n\t\t\t<!-- @slot Текст в кнопке -->\n\t\t\t<slot>\n\t\t\t\t{{ !icon ? 'Button' : '' }}\n\t\t\t</slot>\n\t\t</span>\n\n\t\t<!-- @slot HTML в кнопке -->\n\t\t<slot name=\"html\"></slot>\n\t</component>\n</template>\n\n<style module>\n@import \"./style/button.css\";\n@import \"./style/style-outline.css\";\n@import \"./style/style-soft.css\";\n@import \"./style/style-transparent.css\";\n\n.top-button {\n\t--top-button-color: var(--color-white);\n\t--top-button-background-color: transparent;\n\t--top-button-background-color-hover: var(--top-button-background-color);\n\t--top-button-background-color-active: var(--top-button-background-color-hover);\n\t--top-button-background-color-selected: var(--top-button-background-color-hover);\n\t--top-button-box-shadow: none;\n\t--top-button-box-shadow-hover: var(--top-shadow-darken-2);\n\t--top-button-box-shadow-active: var(--top-shadow-darken-3);\n\t--top-button-box-shadow-selected: var(--top-shadow-darken-3);\n\t--top-forms-border-width: 0px;\n\t--top-icon-width: calc(var(--top-icon-size) + var(--top-forms-padding));\n\t--top-icon2-width: calc(var(--top-icon2-size) + var(--top-forms-padding));\n}\n\n.top-button > .top-ellipsis { flex-grow: 0; }\n\n.top-button.top-size_xs {\n\t--top-forms-padding: var(--top-forms-padding_xs);\n\t--top-forms-base-height: var(--top-forms-base-height_xs);\n}\n\n.top-button.top-size_m {\n\t--top-forms-padding: var(--top-forms-padding_m);\n\t--top-forms-base-height: var(--top-forms-base-height_m);\n}\n\n.top-button.top-size_l {\n\t--top-forms-padding: var(--top-forms-padding_l);\n\t--top-forms-base-height: var(--top-forms-base-height_l);\n}\n\n.top-button_badge-afterText {\n\torder: 100;\n}\n\n.top-button:not([data-top-icon2]) > .top-button_badge-afterText {\n\tmargin-left: 0;\n}\n</style>\n","<template>\n\t<div class=\"top-loadbar\"></div>\n</template>\n\n<style module>\n:root {\n\t--top-loadbar-duration: 10s;\n\t--top-loadbar-color: var(--color-line-primary-2);\n}\n\n.top-loadbar {\n\tbackground: var(--top-loadbar-color);\n\twidth: 0;\n\theight: 4px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\n\tanimation: top-loadbar var(--top-loadbar-duration) forwards;\n}\n\n@keyframes top-loadbar {\n\tfrom {\n\t\t/* fix render pixels */\n\t\twidth: 4px;\n\t}\n\t4% {\n\t\twidth: calc(4%);\n\t}\n\t5% {\n\t\twidth: 5%;\n\t}\n\tto {\n\t\twidth: 95%;\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Emits, Props } from './input';\nimport TopLoadbar from '@/components/forms/loadbar/loadbar.vue';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n\tcaptionType: '',\n});\n\nconst emit = defineEmits<Emits>();\n\nconst localValue = computed({\n\tget() {\n\t\treturn props.modelValue;\n\t},\n\tset(value) {\n\t\temit('update:modelValue', value);\n\t},\n});\n\nconst placeholder = computed(() => {\n\tif (props.addCleaner && !props.title) {\n\t\treturn '';\n\t}\n\tif (props.captionType !== '') {\n\t\treturn '';\n\t}\n\n\treturn props.title;\n});\n\nconst clean = (event: Event) => {\n\tif (props.modelValue) {\n\t\tevent.stopPropagation();\n\t}\n\n\temit('update:modelValue', '');\n};\n</script>\n\n<template>\n\t<label\n\t\t:class=\"{\n\t\t\t['top-input']: true,\n\t\t\t['top-size_' + size]: true,\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-input-' + modificator]: !!modificator,\n\t\t\t['top-input-withCleaner']: addCleaner && localValue && localValue !== '0000-00-00',\n\t\t\t['top-formsCaptionWrapper']: captionType !== '',\n\t\t\t['top-formsCaptionWrapper-always']: captionType === 'top',\n\t\t}\"\n\t\t:data-top-icon=\"icon\"\n\t\t:data-top-icon2=\"icon2\"\n\t>\n\t\t<TopLoadbar v-if=\"isLoading\"/>\n\n\t\t<input\n\t\t\ttype=\"text\"\n\t\t\t:class=\"{\n\t\t\t\t['top-input_input']: true,\n\t\t\t\t['top-input_input-' + modificator]: !!modificator,\n\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t['top-error']: isError,\n\t\t\t}\"\n\t\t\tautocomplete=\"off_always\"\n\t\t\t:name=\"name\"\n\t\t\tv-model=\"localValue\"\n\t\t\t:title=\"title\"\n\t\t\t:placeholder=\"placeholder\"\n\t\t\t:disabled=\"disabled\"\n\t\t\t:readonly=\"readonly\"\n\t\t\t@keydown.esc=\"(event) => (addCleaner || !!$slots.btn) && clean(event)\"\n\t\t\t:=\"$attrs\"\n\t\t>\n\n\t\t<span\n\t\t\tv-if=\"addCleaner && localValue && localValue !== '0000-00-00'\"\n\t\t\tclass=\"top-input_cleaner\"\n\t\t\tdata-top-icon=\"\"\n\t\t\t@click.prevent=\"clean\"\n\t\t></span>\n\n\t\t<span\n\t\t\tv-if=\"captionType !== ''\"\n\t\t\tclass=\"top-formsCaption\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</span>\n\n\t\t<!-- @slot Слот для вставки произвольного кода в label -->\n\t\t<slot></slot>\n\t</label>\n</template>\n\n<style module>\n.top-input {\n\t--top-forms_clear-width: 0px;\n\n\tborder-radius: var(--top-forms-radius);\n\twidth: 180px;\n\tposition: relative;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n.top-input_input {\n\tcolor: var(--color-text-2);\n\tbackground: var(--top-forms-background-color);\n\theight: var(--top-forms-base-height);\n\tpadding: 0;\n\tpadding-right: calc(max(var(--top-forms-padding), calc(var(--top-icon2-width) + var(--top-forms_clear-width))));\n\tpadding-left: calc(max(var(--top-forms-padding), var(--top-icon-width)));\n}\n\n.top-input_input:hover {\n\tbackground: var(--top-forms-background-color-hover);\n}\n\n.top-input_input:focus {\n\tcolor: var(--color-text-1);\n\tborder-color: var(--color-line-primary-1);\n\toutline: none;\n}\n\n/* значки */\n.top-input[data-top-icon]:before,\n.top-input[data-top-icon2]:after {\n\t--top-icon-color: var(--color-icon-4);\n\t--top-icon2-color: var(--color-icon-4);\n\n\tposition: absolute;\n\tz-index: 3;\n\tfont-size: 20px;\n}\n\n.top-input[data-top-icon]:before {\n\tleft: 0;\n}\n\n.top-input[data-top-icon2]:after {\n\tright: 0;\n}\n\n/* cleaner */\n.top-input-withCleaner {\n\t--top-forms_clear-width: 24px;\n}\n\n.top-input_cleaner[data-top-icon] {\n\t--top-icon-size: 16px;\n\t--top-icon-width: 20px;\n\t--top-icon-color: var(--color-icon-3);\n\n\tcursor: pointer;\n\tborder-radius: 50%;\n\twidth: 20px;\n\theight: 16px;\n\tposition: absolute;\n\tright: calc(var(--top-forms-border-width) + max(var(--top-icon2-width), var(--top-forms-padding) / 2));\n\tz-index: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.top-input_cleaner[data-top-icon]:hover {\n\t--top-icon-color: var(--color-icon-2);\n}\n\n/* TODO: перенести в inputsRange */\n.top-input_input {\n\twidth: 50%;\n\tflex-grow: 1;\n}\n\n/* top-loadbar */\n.top-input .top-loadbar {\n\tborder-radius: var(--top-forms-radius) 0 0 0;\n}\n</style>\n","<script lang=\"ts\">\nconst useNativeDatepicker = !!document.documentElement.ontouchstart && !!document.createElement('input').showPicker;\n\nlet onInputLazy = (_e: any) => { };\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onUnmounted } from 'vue';\nimport { dateFormat, dateUnformat } from '@/core/utils/date';\nimport type { Props, Emits } from './inputDate';\nimport TopInput from '@/components/forms/input/input.vue';\nimport Core from '@/core/core/core';\n\nconst props = withDefaults(defineProps<Props>(), {\n\ticon2: '',\n});\n\nconst emit = defineEmits<Emits>();\n\nonUnmounted(() => {\n\tif ($el) {\n\t\t$el.datepicker('destroy');\n\t}\n});\n\nconst el = ref();\nlet $el: any;\n\nconst localValue = computed({\n\tget() {\n\t\treturn dateFormat(props.modelValue, 2, undefined, '0000-00-00');\n\t},\n\n\tset(value) {\n\t\tvalue = dateUnformat(value, '0000-00-00');\n\n\t\temit('update:modelValue', value);\n\t},\n});\n\nlet oninput = (e: any) => {\n\tonInputLazy(e);\n};\n\nlet onchange = (e: any) => {\n\tconst date = dateUnformat(e.target.value);\n\tconst dateFormatted = dateFormat(date);\n\n\tif (!dateFormatted || dateFormatted === Core.L.Not_date || e.target.value !== dateFormatted) {\n\t\te.target.value = localValue.value;\n\n\t\treturn;\n\t}\n\n\tlocalValue.value = e.target.value;\n};\n\n/**\n * Инициализпация функций выбора дат\n *\n * Для не нативного datepicker\n */\nasync function init(e: any) {\n\tconst datepicker = await import('./datepicker');\n\n\t// формат ввода\n\tonInputLazy = datepicker.oninput;\n\n\t// datepicker\n\t$el = datepicker.connectDatepicker(e.target, {\n\t\tonSelect: () => onchange(e),\n\t});\n\n\tif ($el) {\n\t\t$el.datepicker('show');\n\t}\n}\n</script>\n\n<template>\n\t<TopInput\n\t\tv-if=\"useNativeDatepicker\"\n\t\t:=\"$props\"\n\t\t:modelValue=\"localValue\"\n\t\treadonly\n\t\t@click=\"el.showPicker()\"\n\t>\n\t\t<input\n\t\t\tref=\"el\"\n\t\t\ttype=\"date\"\n\t\t\tclass=\"top-input_input-date\"\n\t\t\t:modelValue=\"modelValue\"\n\t\t\t@change=\"(e: any) => localValue = e.target.value\"\n\t\t\ttabindex=\"-1\"\n\t\t/>\n\t</TopInput>\n\n\t<TopInput\n\t\tv-else\n\t\t:=\"$props\"\n\t\t:modelValue=\"localValue\"\n\t\t@update:modelValue=\"(newValue) => (newValue === '') ? localValue = '' : ''\"\n\t\t@input.date=\"oninput\"\n\t\t@focus.once.date=\"init\"\n\t\t@change.date=\"onchange\"\n\t\tmodificator=\"datepicker\"\n\t/>\n</template>\n\n<style module>\n.top-input-datepicker {\n\twidth: calc(105px + var(--top-icon-width) + var(--top-icon2-width));\n}\n\n.top-input_input-date {\n\topacity: 0;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: -1;\n}\n\n.top-input_input-date::-webkit-inner-spin-button {\n\tdisplay: none;\n}\n\n.top-input_input-date::-webkit-calendar-picker-indicator {\n\topacity: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Emits, Props } from './radio';\nimport ControlLabel from '../controlLabel/controlLabel.vue';\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst localValue = computed({\n\tget() {\n\t\treturn props.modelValue;\n\t},\n\tset(value) {\n\t\temit('update:modelValue', value);\n\t},\n});\n\n</script>\n\n<template>\n\t<label\n\t\t:class=\"{\n\t\t\t['top-forms-optionWrapper']: true,\n\t\t\t['top-radio']: true,\n\t\t\t['top-radio_' + name]: name !== '',\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-error']: isError && !disabled,\n\t\t}\"\n\t>\n\t\t<input\n\t\t\ttype=\"radio\"\n\t\t\t:class=\"{\n\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t['top-forms-option']: true,\n\t\t\t\t['top-radio_input']: true,\n\t\t\t\t['top-error']: isError && !disabled,\n\t\t\t}\"\n\t\t\tv-model=\"localValue\"\n\t\t\t:name=\"name\"\n\t\t\t:value=\"value\"\n\t\t\t:disabled=\"disabled\"\n\t\t>\n\n\t\t<ControlLabel\n\t\t\tv-if=\"$slots.default\"\n\t\t\t:description=\"description\"\n\t\t\t:disabled=\"disabled\"\n\t\t>\n\t\t\t<!-- @slot Слот с заголовком -->\n\t\t\t<slot></slot>\n\t\t</ControlLabel>\n\t</label>\n</template>\n\n<style module>\n:root {\n\t--top-radio-background-color: var(--content-background-color);\n\t--top-radio-background-color-hover: var(--top-radio-background-color);\n\t--top-radio-background-color-active: var(--top-radio-background-color);\n}\n\n.top-radio {\n\tcursor: pointer;\n}\n\n.top-radio_input {\n\tborder-radius: 50%;\n\tbackground: var(--content-background-color);\n\tborder: 1px solid var(--color-line-3);\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\n}\n\n.top-radio_input:hover {\n\tborder-color: var(--color-line-3);\n\tbackground: var(--color-layer-secondary-1);\n}\n\n.top-radio_input:checked {\n\tborder-color: var(--color-line-primary-1);\n\tborder-width: 5px;\n}\n\n.top-radio_input:checked:hover {\n\tborder-color: var(--color-line-primary-2);\n}\n\n/* disabled */\n.top-radio_input:disabled {\n\tborder-color: var(--color-line-1-opacity);\n\tbackground: var(--color-theme-100);\n}\n\n/* disabled selected */\n.top-radio_input:checked:disabled {\n\tborder-color: var(--color-theme-400);\n}\n\n/* isError */\n.top-radio_input.top-error {\n\tborder-color: var(--color-line-negative-1);\n}\n\n.top-radio_input.top-error:hover {\n\tborder-color: var(--color-line-negative-2);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Emits, Props } from './switcher';\nimport ControlLabel from '../controlLabel/controlLabel.vue';\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst localValue = computed({\n\tget() {\n\t\treturn props.modelValue;\n\t},\n\tset(value) {\n\t\temit('update:modelValue', value);\n\t},\n});\n</script>\n\n<template>\n\t<label\n\t\t:class=\"{\n\t\t['top-forms-optionWrapper']: true,\n\t\t['top-checkboxSwitcher']: true,\n\t\t['top-disabled']: disabled,\n\t\t['top-error']: isError && !disabled,\n\t}\"\n\t>\n\t\t<input\n\t\t\ttype=\"checkbox\"\n\t\t\t:class=\"{\n\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t['top-forms-option']: true,\n\t\t\t\t['top-checkboxSwitcher_input']: true,\n\t\t\t\t['top-error']: isError && !disabled,\n\t\t\t}\"\n\t\t\tv-model=\"localValue\"\n\t\t\t:name=\"name\"\n\t\t\t:value=\"value\"\n\t\t\t:disabled=\"disabled\"\n\t\t>\n\n\t\t<ControlLabel\n\t\t\tv-if=\"$slots.default\"\n\t\t\t:description=\"description\"\n\t\t\t:disabled=\"disabled\"\n\t\t>\n\t\t\t<!-- @slot Слот с заголовком -->\n\t\t\t<slot></slot>\n\t\t</ControlLabel>\n\t</label>\n</template>\n\n<style module>\n.top-checkboxSwitcher {\n\tcursor: pointer;\n\tdisplay: inline-flex;\n\tgap: 4px;\n}\n\n.top-checkboxSwitcher_input {\n\tborder-radius: 9px;\n\tborder: none;\n\tbackground: var(--color-layer-secondary-2);\n\twidth: 36px;\n\theight: 18px;\n\tposition: relative;\n}\n\n.top-checkboxSwitcher_input:before {\n\tcontent: \"\";\n\tborder-radius: 50%;\n\tbackground: var(--color-white);\n\twidth: 12px;\n\theight: 12px;\n\tmargin: 3px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\n\ttransition: left 0.1s;\n}\n\n.top-checkboxSwitcher_input:hover {\n\tbackground: var(--color-layer-secondary-4);\n}\n\n/* checked */\n.top-checkboxSwitcher_input:checked {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxSwitcher_input:checked:hover {\n\tbackground: var(--color-bg-primary-1);\n}\n\n.top-checkboxSwitcher_input:checked:before {\n\tleft: 50%;\n}\n\n/* disabled */\n.top-checkboxSwitcher_input:disabled {\n\tbackground: var(--color-theme-400);\n}\n\n/* isError */\n.top-checkboxSwitcher_input.top-error {\n\tbackground: var(--color-layer-negative-3);\n}\n\n.top-checkboxSwitcher_input.top-error:hover {\n\tbackground: var(--color-layer-negative-4);\n}\n\n.top-checkboxSwitcher_input.top-error:checked {\n\tbackground: var(--color-bg-negative-2);\n}\n\n.top-checkboxSwitcher_input.top-error:checked:hover {\n\tbackground: var(--color-bg-negative-1);\n}\n\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport Hint from '@/components/forms/hint/hint.vue';\nimport type { Emits, Props } from './textarea';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\trows: 5,\n\tminHeight: 120,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst value = computed({\n\tget() {\n\t\treturn props.modelValue;\n\t},\n\tset(value) {\n\t\temit('update:modelValue', value);\n\t},\n});\n</script>\n\n<template>\n\t<label\n\t\t:class=\"{\n\t\t\t['top-textarea']: true,\n\t\t\t['top-textarea-' + name]: name,\n\t\t\t['top-disabled']: disabled,\n\t\t}\"\n\t>\n\t\t<textarea\n\t\t\ttype=\"text\"\n\t\t\t:class=\"{\n\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t['top-textarea_textarea']: true,\n\t\t\t\t['top-textarea_textarea-expandable']: expandable,\n\t\t\t\t['top-error']: isError,\n\t\t\t}\"\n\t\t\tautocomplete=\"off_always\"\n\t\t\t:name=\"name\"\n\t\t\t:placeholder=\"placeholder\"\n\t\t\t:disabled=\"disabled\"\n\t\t\t:readonly=\"readonly\"\n\t\t\t:rows=\"!expandable ? rows : undefined\"\n\t\t\t:=\"$attrs\"\n\t\t\tv-model=\"value\"\n\t\t/>\n\n\t\t<div\n\t\t\tv-if=\"expandable\"\n\t\t\tclass=\"top-textarea_pseudoContent\"\n\t\t>\n\t\t\t{{ value + ' ' }}\n\t\t</div>\n\n\t\t<Hint\n\t\t\tv-if=\"hint\"\n\t\t\tclass=\"top-textarea_hint\"\n\t\t\t:hint=\"hint\"\n\t\t\tv-top-tooltip\n\t\t/>\n\t</label>\n</template>\n\n<style module>\n.top-textarea {\n\twidth: 180px;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tposition: relative;\n}\n\n.top-textarea_textarea {\n\tcolor: var(--color-text-1);\n\tbackground: var(--top-forms-background-color);\n\twidth: 100%;\n\tpadding: var(--top-forms-padding);\n\tresize: none;\n}\n\n.top-textarea_textarea:hover {\n\tbackground: var(--top-forms-background-color-hover);\n}\n\n.top-textarea_textarea:focus {\n\tborder-color: var(--color-line-primary-1);\n\toutline: none;\n}\n\n.top-textarea_textarea.top-textarea_textarea-expandable {\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n\n.top-textarea_pseudoContent {\n\tbox-sizing: border-box;\n\tmin-height: v-bind(minHeight+ \"px\");\n\tpadding: var(--top-forms-padding);\n\tfont-size: 14px;\n\twhite-space: pre-wrap;\n\toverflow-wrap: anywhere;\n\tpointer-events: none;\n\topacity: 0;\n\tz-index: -1;\n}\n\n.top-textarea_hint {\n\tposition: absolute;\n\ttop: 2px;\n\tright: 2px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { ComputedRef } from 'vue';\nimport { computed, watch } from 'vue';\nimport type { Emits, LocalOptions, Option, Props } from './select';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst emit = defineEmits<Emits>();\n\n/**\n * Словарь с учетом вложенных Props['options']\n *\n * Этот словарь должен использовать в логике компонента, чтобы она не зависила от типа входных данных\n */\nconst optionByValue: ComputedRef<LocalOptions> = computed(() => {\n\t/**\n\t * Преобразование:\n\t * - Array => Map\n\t * - string => Option\n\t */\n\tconst res = new Map();\n\n\tprops.options.forEach((option, index) => {\n\t\t// базовый Options со строками\n\t\tif (typeof option === 'string') option = genOption(index, option);\n\n\t\tif (option.children) {\n\t\t\t// вложенные элементы Option для <optgroup>\n\t\t\tconst children = new Map();\n\n\t\t\toption.children.forEach((subOption, subIndex) => {\n\t\t\t\t// базовый Options со строками\n\t\t\t\tif (typeof subOption === 'string') subOption = genOption(subIndex, subOption);\n\n\t\t\t\tchildren.set(subOption.value, subOption);\n\t\t\t});\n\n\t\t\toption = { ...option };\n\t\t\toption.children = children;\n\n\t\t\tres.set(option.value, option);\n\t\t} else {\n\t\t\t// самостоятельный элемент Option\n\t\t\tres.set(option.value, option);\n\t\t}\n\t});\n\n\treturn res;\n});\n\n/**\n * Словарь со всеми не disabled значениями Props['options'] в порядке следования с учетом вложенных Props['options']\n */\nconst flatOptionByValue: ComputedRef<Map<Props['modelValue'], Option>> = computed(() => {\n\tconst res = new Map();\n\n\toptionByValue.value.forEach(option => {\n\t\tif (option.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// вложенные элементы Option для <optgroup>\n\t\tif (option.children) {\n\t\t\toption.children.forEach(subOption => {\n\t\t\t\tif (subOption.disabled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tres.set(subOption.value, subOption);\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tres.set(option.value, option);\n\t});\n\n\treturn res;\n});\n\n/**\n * Генерация Объекта option из строки\n *\n * Для базового способа указания props\n */\nconst genOption = (value: Props['modelValue'], title: string): Option => {\n\treturn {\n\t\tvalue,\n\t\ttitle,\n\t};\n};\n\n/**\n * Логика для обртаной своместимости:\n * - null - заменить на первое доступное значение\n * - undefined - заменить на первое доступное значение\n */\nwatch([\n\t() => props.modelValue,\n\tflatOptionByValue,\n], () => {\n\tif ((model.value === null || model.value === undefined) && flatOptionByValue.value.size) {\n\t\tconsole.warn('Пожалуйста, не передавайте в компонент Select значения null и undefined');\n\n\t\tmodel.value = flatOptionByValue.value.keys().next().value;\n\t}\n}, { immediate: true });\n\n/**\n * Иконка выбранного option\n */\nconst optionIcon = computed(() => {\n\treturn flatOptionByValue.value.get(model.value)?.icon;\n});\n\n/**\n * Выбрать следующее доступное значение\n */\nconst selectNextValue = () => {\n\tconst listEnabledValues = [...flatOptionByValue.value.keys()];\n\tconst currentIndex = listEnabledValues.indexOf(model.value);\n\tconst nextIndex = (currentIndex + 1) % listEnabledValues.length;\n\n\tmodel.value = listEnabledValues[nextIndex];\n};\n</script>\n\n<template>\n\t<label\n\t\t:class=\"{\n\t\t\t['top-select']:true,\n\t\t\t['top-select-' + name]:name,\n\t\t\t['top-size_' + size]: true,\n\t\t\t['top-formsCaptionWrapper']: !!title,\n\t\t\t['top-select-error']: isError,\n\t\t\t['top-disabled']: disabled,\n\t\t}\"\n\t\t:data-value=\"model\"\n\t\t:data-top-icon=\"icon\"\n\t\t:data-top-icon2=\"optionIcon\"\n\t>\n\t\t<select\n\t\t\t:class=\"{\n\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t['top-select_select']: true,\n\t\t\t\t['top-select_arrow']: true,\n\t\t\t\t['top-error']: isError,\n\t\t\t}\"\n\t\t\t:name=\"name\"\n\t\t\t:disabled=\"disabled\"\n\t\t\tv-model=\"model\"\n\t\t>\n\t\t\t<template v-for=\"[value, option] of optionByValue\">\n\t\t\t\t<optgroup\n\t\t\t\t\tv-if=\"option.children\"\n\t\t\t\t\t:key=\"'group_' + value\"\n\t\t\t\t\t:label=\"option.title\"\n\t\t\t\t\t:disabled=\"option.disabled\"\n\t\t\t\t>\n\t\t\t\t\t<option\n\t\t\t\t\t\tv-for=\"[subValue, subOption] of option.children\"\n\t\t\t\t\t\t:key=\"subValue\"\n\t\t\t\t\t\t:value=\"subValue\"\n\t\t\t\t\t\t:selected=\"subValue === model\"\n\t\t\t\t\t\t:disabled=\"subOption.disabled\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ subOption.title }}\n\t\t\t\t\t</option>\n\t\t\t\t</optgroup>\n\n\t\t\t\t<option\n\t\t\t\t\tv-else\n\t\t\t\t\t:key=\"value ?? undefined\"\n\t\t\t\t\t:value=\"value\"\n\t\t\t\t\t:selected=\"value === model\"\n\t\t\t\t\t:disabled=\"option.disabled\"\n\t\t\t\t>\n\t\t\t\t\t{{ option.title }}\n\t\t\t\t</option>\n\t\t\t</template>\n\t\t</select>\n\n\t\t<span\n\t\t\tv-if=\"addChanger && flatOptionByValue.size && !disabled\"\n\t\t\tclass=\"top-changer\"\n\t\t\t@click=\"selectNextValue\"\n\t\t></span>\n\n\t\t<span\n\t\t\tv-if=\"title\"\n\t\t\tclass=\"top-formsCaption\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</span>\n\t</label>\n</template>\n\n<style module>\n.top-select {\n\tcolor: var(--color-text-1);\n\t--top-icon-color: var(--color-icon-2);\n\t--top-icon2-color: var(--color-icon-2);\n\n\talign-items: center;\n\twidth: 180px;\n\tmax-width: 100%;\n\tdisplay: inline-flex;\n}\n\n.top-select-error {\n\t--top-icon-color: var(--color-icon-negative-1);\n\t--top-icon2-color: var(--color-icon-negative-1);\n}\n\n.top-select_select {\n\tbackground-color: var(--top-forms-background-color);\n\t/* для select вместо padding нужно использовать text-indent */\n\tpadding-left: var(--top-forms-padding);\n\n\t/* если есть значки, добавить отступ на их ширину с учетом уже добавленного padding */\n\ttext-indent: calc(clamp(0px, calc(var(--top-icon-both-width) - var(--top-forms-padding)), calc(var(--top-icon-both-width) - var(--top-forms-padding))));\n\n\twidth: 100%;\n\theight: var(--top-forms-base-height);\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tflex-grow: 1;\n\toverflow: hidden;\n}\n\n.top-select_select:disabled {\n\tcolor: var(--color-text-3);\n}\n\n.top-select optgroup {\n\tcolor: var(--color-text-1);\n\tfont-style: normal;\n}\n\n.top-select option:not(:disabled) {\n\tbackground: var(--content-background-color);\n\tcolor: var(--color-text-1);\n}\n\n.top-select option:disabled {\n\tbackground: unset;\n\tcolor: unset;\n}\n\n/* хром не мерняет цвет для optgroup option, стили оставлены по умолчанию */\n/*\n.top-select optgroup:disabled,\n.top-select optgroup option,\n.top-select option:disabled {\n\n}\n*/\n\n/* https://bugzilla.mozilla.org/show_bug.cgi?id=1743066 */\n@-moz-document url-prefix() {\n\t.top-select_select {\n\t\ttext-indent: calc(clamp(0px, calc(var(--top-icon-both-width) - var(--top-forms-padding)), calc(var(--top-icon-both-width) - var(--top-forms-padding))) / 2);\n\t}\n}\n\n@media only screen and (min-width: 900px) {\n\t/* changer */\n\t.top-changer {\n\t\tcursor: pointer;\n\t\tborder-radius: 100%;\n\t\twidth: 0;\n\t\ttransform: translateX(-44px);\n\t\tcolor: var(--color-text-2);\n\t\tfont-size: 16px;\n\t\tline-height: 1;\n\t\tdisplay: none;\n\t\tz-index: 2;\n\t\torder: 4;\n\t}\n\n\t.top-changer:hover {\n\t\tcolor: var(--color-primary);\n\t}\n\n\t.top-changer:after {\n\t\tcontent: \"\";\n\t\tbackground-color: var(--top-forms-background-color);\n\t\tfont-family: \"Topvisor-2\";\n\t}\n\n\t*:hover > .top-changer {\n\t\tdisplay: block;\n\t}\n}\n</style>\n","/**\n * Замечание для разработчиков\n *\n * При изменении библиотеки Forms не забудьте обновить ее подключение в плагине\n *\n * @see import('@/core/core/plugin')\n */\n\nimport type { ComponentCustomProps } from 'vue';\n\nimport Avatar from './avatar/avatar.vue';\nimport Button from './button/button.vue';\nimport Checkbox from './checkbox/checkbox.vue';\nimport ControlLabel from './controlLabel/controlLabel.vue';\nimport Hint from './hint/hint.vue';\nimport Input from './input/input.vue';\nimport InputDate from './inputDate/inputDate.vue';\nimport InputRange from './inputRange/inputRange.vue';\nimport Radio from './radio/radio.vue';\nimport Switcher from './switcher/switcher.vue';\nimport Textarea from './textarea/textarea.vue';\nimport Select from './select/select.vue';\nimport Loadbar from './loadbar/loadbar.vue';\n\n// Для не SFC, чтобы работало автозаполнение в template в ComponentOptions\n// Имена намеренно делаются разными, чтобы типы не конфликтовали: `Button` и `TopButton`\n\nexport const TopAvatar = Avatar as typeof Avatar & ComponentCustomProps;\nexport const TopButton = Button as typeof Button & ComponentCustomProps;\nexport const TopCheckbox = Checkbox as typeof Checkbox & ComponentCustomProps;\nexport const TopControlLabel = ControlLabel as typeof ControlLabel & ComponentCustomProps;\nexport const TopHint = Hint as typeof Hint & ComponentCustomProps;\nexport const TopInput = Input as typeof Input & ComponentCustomProps;\nexport const TopInputDate = InputDate as typeof InputDate & ComponentCustomProps;\nexport const TopInputRange = InputRange as typeof InputRange & ComponentCustomProps;\nexport const TopRadio = Radio as typeof Radio & ComponentCustomProps;\nexport const TopSwitcher = Switcher as typeof Switcher & ComponentCustomProps;\nexport const TopTextarea = Textarea as typeof Textarea & ComponentCustomProps;\nexport const TopSelect = Select as typeof Select & ComponentCustomProps;\nexport const TopLoadbar = Loadbar as typeof Loadbar & ComponentCustomProps;\n"],"names":["isRetina","isMobile","isApp","isMacOS","isSafari","isChrome","isSafari2","getCommandKeyLabel","getScrollTop","get$scroll","getElsScroll","getOS","res","i","os","getOSAsync","platformVersion","_a","onResizeTimer","onResizeListeners","windowSize","listener","callback","e","onResize","Events","addOnReize","removeOnResize","options","state","Core","vue","device","cssFilesByOptions","fileNames","filename","m","pc","key","promises","fileNames2","media","useSync","promise","fileName","request","id","elLink","resolve","reject","type","elStyle","style","L","getDayOfWeek","y","d","dateToString","dateObject","langFormat","timeFormat","H","s","date","Y","timestamp","time","genDateMoscow","ms","dateoffset","moscow_dateoffset","dateStr","dateFormat","dateMixed","dateFormat2","emptyValue","dateForObj","result","timeStr","dateChunks","index","props","__props","titleStatus","_b","titleImage","tagName","_sfc_render","_ctx","_cache","emit","__emit","localValue","value","placeholder","clean","event","onInputLazy","_e","$el","el","oninput","onchange","dateFormatted","init","datepicker","require","value2","optionByValue","option","genOption","children","subOption","subIndex","flatOptionByValue","title","model","optionIcon","listEnabledValues","TopAvatar","Avatar","TopButton","TopButton$1","TopCheckbox","Checkbox","TopControlLabel","ControlLabel","TopHint","TopHint$1","TopInput","TopInput$1","TopInputDate","InputDate","TopInputRange","InputRange","TopRadio","Radio","TopSwitcher","Switcher","TopTextarea","Textarea","TopSelect","Select","TopLoadbar","TopLoadbar$1"],"mappings":"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"}