@topvisor/ui 1.0.8 → 1.0.9

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 (200) hide show
  1. package/.chunks/datepicker-Cs3C14z5.amd.js +248 -0
  2. package/.chunks/datepicker-Cs3C14z5.amd.js.map +1 -0
  3. package/.chunks/datepicker-LNkS97nF.es.js +290 -0
  4. package/.chunks/datepicker-LNkS97nF.es.js.map +1 -0
  5. package/.chunks/forms-BydHEF-k.es.js +1928 -0
  6. package/.chunks/forms-BydHEF-k.es.js.map +1 -0
  7. package/.chunks/forms-Cq5zFLsO.amd.js +3 -0
  8. package/.chunks/forms-Cq5zFLsO.amd.js.map +1 -0
  9. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-B0xTxYZR.amd.js +2 -0
  10. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-B0xTxYZR.amd.js.map +1 -0
  11. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-DinMn3Ud.es.js +174 -0
  12. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-DinMn3Ud.es.js.map +1 -0
  13. package/.chunks/menu.vue_vue_type_style_index_0_lang-BT-PgdJ5.amd.js +2 -0
  14. package/.chunks/menu.vue_vue_type_style_index_0_lang-BT-PgdJ5.amd.js.map +1 -0
  15. package/.chunks/menu.vue_vue_type_style_index_0_lang-C585WUlJ.es.js +109 -0
  16. package/.chunks/menu.vue_vue_type_style_index_0_lang-C585WUlJ.es.js.map +1 -0
  17. package/.chunks/{popup-D-G2sXks.es.js → popup-B7AaTfNZ.es.js} +494 -493
  18. package/.chunks/popup-B7AaTfNZ.es.js.map +1 -0
  19. package/.chunks/popup-D22VHVHf.amd.js +448 -0
  20. package/.chunks/popup-D22VHVHf.amd.js.map +1 -0
  21. package/.chunks/store-CX_6ZXhO.es.js.map +1 -1
  22. package/.chunks/store-esTid5oI.amd.js.map +1 -1
  23. package/README.md +86 -86
  24. package/assets/charts.css +1 -0
  25. package/assets/core.css +1 -1
  26. package/assets/forms.css +1 -1
  27. package/assets/project.css +1 -1
  28. package/assets/tabsView.css +1 -1
  29. package/assets/themes/dark.css +1 -1
  30. package/assets/themes/light.css +1 -1
  31. package/charts/charts.amd.js +2 -0
  32. package/charts/charts.amd.js.map +1 -0
  33. package/charts/charts.d.ts +2 -0
  34. package/charts/charts.js +120 -0
  35. package/charts/charts.js.map +1 -0
  36. package/components/charts/charts.d.ts +3 -0
  37. package/components/charts/miniChart/miniChart.d.ts +80 -0
  38. package/components/charts/miniChart/miniChart.vue.d.ts +15 -0
  39. package/components/charts/miniChart/stories/dummy.d.ts +13 -0
  40. package/components/charts/miniChart/utils/consts.d.ts +8 -0
  41. package/components/formsExt/selector2/selector2.vue.d.ts +16 -20
  42. package/components/popup/alert/alert.vue.d.ts +8 -7
  43. package/components/popup/confirm/confirm.d.ts +1 -1
  44. package/components/popup/confirm/confirm.vue.d.ts +8 -7
  45. package/components/popup/lib/popup.d.ts +1 -1
  46. package/components/popup/popup/popup.d.ts +8 -4
  47. package/components/popup/popup/popup.vue.d.ts +8 -8
  48. package/components/popup/prompt/prompt.d.ts +1 -1
  49. package/components/popup/prompt/prompt.vue.d.ts +8 -7
  50. package/components/project/project.d.ts +9 -0
  51. package/components/project/tagSelector/popupListItem/tagPopupListItem.vue.d.ts +18 -0
  52. package/components/project/tagSelector/popupListItem/types.d.ts +33 -0
  53. package/components/project/tagSelector/popupOpener/popupOpener.vue.d.ts +26 -0
  54. package/components/project/tagSelector/popupOpener/types.d.ts +62 -0
  55. package/components/project/tagSelector/tagIcon/tagIcon.vue.d.ts +4 -0
  56. package/components/project/tagSelector/tagIcon/types.d.ts +21 -0
  57. package/components/project/tagSelector/tagSelector.vue.d.ts +37 -0
  58. package/components/project/tagSelector/tagsDefaults.d.ts +3 -0
  59. package/components/project/tagSelector/types.d.ts +138 -0
  60. package/components/project/tagSelector/utils/el.d.ts +19 -0
  61. package/components/project/tagSelector/utils/utils.d.ts +14 -0
  62. package/core/app.amd.js +1 -1
  63. package/core/app.amd.js.map +1 -1
  64. package/core/app.js +52 -45
  65. package/core/app.js.map +1 -1
  66. package/core/core/core.d.ts +4 -0
  67. package/core/directives/data.d.ts +10 -0
  68. package/core/utils/route.d.ts +1 -1
  69. package/forms/forms.amd.js +1 -1
  70. package/forms/forms.js +5 -5
  71. package/forms/helpers.amd.js.map +1 -1
  72. package/forms/helpers.js.map +1 -1
  73. package/formsExt/formsExt.amd.js +1 -1
  74. package/formsExt/formsExt.amd.js.map +1 -1
  75. package/formsExt/formsExt.js +121 -166
  76. package/formsExt/formsExt.js.map +1 -1
  77. package/icomoon/Read Me.txt +7 -7
  78. package/icomoon/Topvisor icons.json +5845 -5845
  79. package/icomoon/demo-files/demo.css +161 -161
  80. package/icomoon/demo-files/demo.js +30 -30
  81. package/icomoon/demo.html +3379 -3379
  82. package/icomoon/fonts/Topvisor-2.svg +263 -263
  83. package/icomoon/style.css +740 -740
  84. package/package.json +37 -37
  85. package/popup/popup.amd.js +1 -1
  86. package/popup/popup.amd.js.map +1 -1
  87. package/popup/popup.js +103 -108
  88. package/popup/popup.js.map +1 -1
  89. package/popup/worker.amd.js +1 -1
  90. package/popup/worker.amd.js.map +1 -1
  91. package/popup/worker.js +2 -2
  92. package/popup/worker.js.map +1 -1
  93. package/project/project.amd.js +1 -1
  94. package/project/project.amd.js.map +1 -1
  95. package/project/project.js +814 -262
  96. package/project/project.js.map +1 -1
  97. package/require/css.amd.js +12 -12
  98. package/tabs/tabs.amd.js +1 -1
  99. package/tabs/tabs.amd.js.map +1 -1
  100. package/tabs/tabs.js +41 -59
  101. package/tabs/tabs.js.map +1 -1
  102. package/tabsView/tabsView.amd.js +1 -1
  103. package/tabsView/tabsView.amd.js.map +1 -1
  104. package/tabsView/tabsView.js +144 -183
  105. package/tabsView/tabsView.js.map +1 -1
  106. package/utils/check.amd.js +1 -1
  107. package/utils/check.amd.js.map +1 -1
  108. package/utils/check.js +1 -1
  109. package/utils/check.js.map +1 -1
  110. package/utils/clipboard.amd.js.map +1 -1
  111. package/utils/clipboard.js.map +1 -1
  112. package/utils/date.amd.js +1 -1
  113. package/utils/date.js +1 -1
  114. package/utils/device.amd.js +1 -1
  115. package/utils/device.js +1 -1
  116. package/utils/dom.amd.js.map +1 -1
  117. package/utils/dom.js.map +1 -1
  118. package/utils/image.amd.js.map +1 -1
  119. package/utils/image.js.map +1 -1
  120. package/utils/keyboard.amd.js.map +1 -1
  121. package/utils/keyboard.js.map +1 -1
  122. package/utils/lodash.amd.js +1 -1
  123. package/utils/lodash.js +5 -5
  124. package/utils/number.amd.js.map +1 -1
  125. package/utils/number.js.map +1 -1
  126. package/utils/price.amd.js +1 -1
  127. package/utils/price.amd.js.map +1 -1
  128. package/utils/price.js +1 -1
  129. package/utils/price.js.map +1 -1
  130. package/utils/route.amd.js +1 -1
  131. package/utils/route.amd.js.map +1 -1
  132. package/utils/route.js +15 -15
  133. package/utils/route.js.map +1 -1
  134. package/utils/scroll.amd.js.map +1 -1
  135. package/utils/scroll.js.map +1 -1
  136. package/utils/searchers.amd.js.map +1 -1
  137. package/utils/searchers.js.map +1 -1
  138. package/utils/string.amd.js +1 -1
  139. package/utils/string.amd.js.map +1 -1
  140. package/utils/string.js +1 -1
  141. package/utils/string.js.map +1 -1
  142. package/utils/system.amd.js.map +1 -1
  143. package/utils/system.js.map +1 -1
  144. package/utils/url.amd.js.map +1 -1
  145. package/utils/url.js.map +1 -1
  146. package/web-types.json +89 -72
  147. package/.chunks/datepicker-CRfiJCmp.amd.js +0 -248
  148. package/.chunks/datepicker-CRfiJCmp.amd.js.map +0 -1
  149. package/.chunks/datepicker-CugKFVIH.es.js +0 -290
  150. package/.chunks/datepicker-CugKFVIH.es.js.map +0 -1
  151. package/.chunks/forms-CHiMZ8vg.es.js +0 -2015
  152. package/.chunks/forms-CHiMZ8vg.es.js.map +0 -1
  153. package/.chunks/forms-CjYoXTEQ.amd.js +0 -3
  154. package/.chunks/forms-CjYoXTEQ.amd.js.map +0 -1
  155. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-Bb7B8CTJ.es.js +0 -174
  156. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-Bb7B8CTJ.es.js.map +0 -1
  157. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-CEF3WDJ_.amd.js +0 -2
  158. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-CEF3WDJ_.amd.js.map +0 -1
  159. package/.chunks/menu-CHeV29rC.es.js +0 -118
  160. package/.chunks/menu-CHeV29rC.es.js.map +0 -1
  161. package/.chunks/menu-D1lnYuWU.amd.js +0 -2
  162. package/.chunks/menu-D1lnYuWU.amd.js.map +0 -1
  163. package/.chunks/popup-C4Tne4qA.amd.js +0 -447
  164. package/.chunks/popup-C4Tne4qA.amd.js.map +0 -1
  165. package/.chunks/popup-D-G2sXks.es.js.map +0 -1
  166. package/.chunks/utils-BOlUthaH.es.js +0 -91
  167. package/.chunks/utils-BOlUthaH.es.js.map +0 -1
  168. package/.chunks/utils-x88W55mf.amd.js +0 -2
  169. package/.chunks/utils-x88W55mf.amd.js.map +0 -1
  170. package/components/project/utils.d.ts +0 -1
  171. package/core/core.amd.js +0 -2
  172. package/core/core.amd.js.map +0 -1
  173. package/core/core.d.ts +0 -4
  174. package/core/core.js +0 -6
  175. package/core/core.js.map +0 -1
  176. package/project/utils.amd.js +0 -2
  177. package/project/utils.amd.js.map +0 -1
  178. package/project/utils.d.ts +0 -2
  179. package/project/utils.js +0 -6
  180. package/project/utils.js.map +0 -1
  181. package/test/themes/themes/dark-positions.amd.js +0 -2
  182. package/test/themes/themes/dark-positions.amd.js.map +0 -1
  183. package/test/themes/themes/dark-positions.d.ts +0 -1
  184. package/test/themes/themes/dark-positions.js +0 -2
  185. package/test/themes/themes/dark-positions.js.map +0 -1
  186. package/test/themes/themes/dark.amd.js +0 -2
  187. package/test/themes/themes/dark.amd.js.map +0 -1
  188. package/test/themes/themes/dark.d.ts +0 -1
  189. package/test/themes/themes/dark.js +0 -4
  190. package/test/themes/themes/dark.js.map +0 -1
  191. package/test/themes/themes/light-positions.amd.js +0 -2
  192. package/test/themes/themes/light-positions.amd.js.map +0 -1
  193. package/test/themes/themes/light-positions.d.ts +0 -1
  194. package/test/themes/themes/light-positions.js +0 -2
  195. package/test/themes/themes/light-positions.js.map +0 -1
  196. package/test/themes/themes/light.amd.js +0 -2
  197. package/test/themes/themes/light.amd.js.map +0 -1
  198. package/test/themes/themes/light.d.ts +0 -1
  199. package/test/themes/themes/light.js +0 -4
  200. package/test/themes/themes/light.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tabsView.amd.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';\r\nimport type { Store } from './store';\r\n\r\n/**\r\n * Сгенерировать имя для сохранения данных в localStorage\r\n * @param stateName - имя свойства состояния\r\n * @param stateKey - ключ состояния, разные компоненты могут использовать одинаковый ключ\r\n */\r\nconst genStorageKey = <T extends Store>(stateName: keyof T, stateKey: string): string => {\r\n\tconst stateNameString = String(stateName);\r\n\r\n\treturn `top:${stateNameString}:${stateKey}`;\r\n};\r\n\r\n/**\r\n * Загрузить состояние\r\n * @param stateName - имя свойства состояния\r\n * @param store\r\n */\r\nconst loadLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\r\n\t// если Store.key не знадан, значит сохранение состояния в компоненте отключено\r\n\tif (!store.$id) return;\r\n\r\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\r\n\r\n\ttry {\r\n\t\tconst localStorageValue: typeof store[keyof typeof store] = JSON.parse(localStorage.getItem(localStorageKey) as string);\r\n\r\n\t\tif (typeof localStorageValue === typeof store[stateName]) {\r\n\t\t\tstore[stateName] = localStorageValue;\r\n\t\t}\r\n\t} catch (e) {\r\n\t\tconsole.warn(new Error(`В localStorage[${localStorageKey}] не корректный json`));\r\n\t}\r\n};\r\n\r\n/**\r\n * Добавить автосохранение состояние при его изменении\r\n * @param stateName - имя свойства состояния\r\n * @param store\r\n */\r\nconst addSaverLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\r\n\t// если store.$id не знадан, значит сохранение состояния в компоненте отключено\r\n\tif (!store.$id) return;\r\n\r\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\r\n\r\n\twatch(() => store[stateName], () => {\r\n\t\tlocalStorage.setItem(localStorageKey, JSON.stringify(store[stateName]));\r\n\t}, { immediate: true });\r\n};\r\n\r\nexport default {\r\n\tloadLocalStorge,\r\n\taddSaverLocalStorge,\r\n};","import type { InjectionKey, ModelRef } from 'vue';\r\nimport { computed, ref } from 'vue';\r\nimport Core from '@/core/core/core';\r\nimport { defineStore, useStore } from '@/core/utils/store';\r\nimport StoreLocalStorage from '@/core/utils/store/localStorage';\r\nimport type { Props, Store } from './tabsView';\r\nimport { getHash } from '@/core/utils/route';\r\n\r\nconst popstateCallbacks = new Set<(e: PopStateEvent) => void>();\r\n\r\naddEventListener('popstate', (e) => {\r\n\tpopstateCallbacks.forEach(popstateCallback => popstateCallback(e));\r\n});\r\n\r\nexport const injectionKey = Symbol() as InjectionKey<Store>;\r\n\r\n/**\r\n * Инициировать Store компонента\r\n */\r\nexport const defineTabsStore = (props: Props, model: ModelRef<string | undefined>) => {\r\n\tconst store = defineStore(injectionKey, () => {\r\n\t\tconst showMenuInPopup = computed(() => props.showMenuInPopup ?? Core.state.isMobile);\r\n\t\tconst pageMod = computed(() => props.pageMod);\r\n\t\tconst isShort = ref(false);\r\n\r\n\t\tconst component = ref(undefined);\r\n\t\tconst scrollable = ref(true);\r\n\r\n\t\treturn {\r\n\t\t\tshowMenuInPopup,\r\n\t\t\tpageMod,\r\n\t\t\tisShort,\r\n\t\t\tactiveItemName: model,\r\n\t\t\tcomponent,\r\n\t\t\tscrollable,\r\n\t\t};\r\n\t}, props.idState);\r\n\r\n\tif (props.isShortable) {\r\n\t\tconst stateName = 'isShort';\r\n\r\n\t\tStoreLocalStorage.loadLocalStorge(stateName, store);\r\n\t\tStoreLocalStorage.addSaverLocalStorge(stateName, store);\r\n\t}\r\n\r\n\tif (store.$id) {\r\n\t\tconst popstateCallback = (e: PopStateEvent) => {\r\n\t\t\tmodel.value = getHash(store.$id!);\r\n\t\t};\r\n\r\n\t\tpopstateCallbacks.add(popstateCallback);\r\n\t}\r\n\r\n\treturn store;\r\n};\r\n\r\n/**\r\n * Получить Store компонента\r\n */\r\nexport const useTabsStore = () => useStore(injectionKey);\r\n","<script setup lang=\"ts\">\r\nimport { computed } from 'vue';\r\nimport { genHash } from '@/core/utils/route';\r\nimport { TopPopupListItem } from '@/components/popup/popup';\r\nimport { useTabsStore } from './store';\r\nimport type { PropsMenuItem } from './tabsView';\r\n\r\nconst props = withDefaults(defineProps<PropsMenuItem>(), {\r\n\tscrollable: true,\r\n\tcomponent: undefined,\r\n});\r\n\r\nconst store = useTabsStore();\r\n\r\nconst href = computed(() => {\r\n\t// это внутренняя хеш навигация, ссылка на вкладку\r\n\tif (props.name && store.$id) {\r\n\t\treturn genHash(store.$id, props.name);\r\n\t}\r\n\r\n\treturn props.href;\r\n});\r\n\r\nconst tagName = computed(() => {\r\n\tif (store.showMenuInPopup) {\r\n\t\treturn TopPopupListItem;\r\n\t}\r\n\r\n\treturn href ? 'a' : 'button';\r\n});\r\n\r\n/**\r\n * Клик по элементу меню\r\n */\r\nconst onClick = (e: MouseEvent) => {\r\n\t// это внутренняя хеш навигация, ссылка на вкладку\r\n\tif (!props.href && href.value) {\r\n\t\te.preventDefault();\r\n\t}\r\n\r\n\tif (props.name) {\r\n\t\tstore.activeItemName = props.name;\r\n\t}\r\n};\r\n</script>\r\n\r\n<template>\r\n\t<component\r\n\t\t:is=\"tagName\"\r\n\t\ttarget=\"_self\"\r\n\t\t:class=\"{\r\n\t\t\t['top-tabsView_menuItem']: !store.showMenuInPopup,\r\n\t\t\t['top-active']: name && store.activeItemName === name,\r\n\t\t\t['top-disabled']: disabled,\r\n\t\t\t['top-spa-disabled']: true,\r\n\t\t}\"\r\n\t\t:href=\"href\"\r\n\t\t:data-top-icon=\"icon || undefined\"\r\n\t\t:disabled=\"disabled || undefined\"\r\n\t\t@click=\"onClick\"\r\n\t>\r\n\t\t<slot v-if=\"store.showMenuInPopup\"></slot>\r\n\r\n\t\t<span\r\n\t\t\tv-else-if=\"$slots.default && !store.isShort\"\r\n\t\t\tclass=\"top-ellipsis\"\r\n\t\t>\r\n\t\t\t<slot></slot>\r\n\t\t</span>\r\n\t</component>\r\n</template>\r\n\r\n<style module>\r\n.top-tabsView_menuItem {\r\n\t--top-icon-color: var(--color-text-2);\r\n\t--top-icon-width: calc(var(--top-icon-size));\r\n\r\n\tcursor: pointer;\r\n\tbox-sizing: border-box;\r\n\r\n\tborder: none;\r\n\tborder-radius: var(--top-radius-2);\r\n\tpadding: var(--top-padding-2);\r\n\tbackground: transparent;\r\n\theight: 40px;\r\n\r\n\tcolor: var(--color-text-1);\r\n\ttext-decoration: none;\r\n\twhite-space: nowrap;\r\n\r\n\tdisplay: flex;\r\n\tgap: var(--top-gap-2);\r\n\talign-items: center;\r\n\tjustify-content: flex-start;\r\n\ttransition: background var(--transition);\r\n}\r\n\r\n.top-tabsView_menuItem:hover {\r\n\t--top-icon-color: var(--color-text-1);\r\n\r\n\tbackground: var(--color-bg-shading-2);\r\n\ttext-decoration: none;\r\n}\r\n\r\n.top-tabsView_menuItem.top-active {\r\n\tcursor: unset;\r\n\tbackground: var(--color-layout-front-1);\r\n}\r\n\r\n.top-tabsView_menuItem:disabled:not(option):not(optgroup):not(.top-forms-option),\r\n.top-tabsView_menuItem:disabled ~ .top-formsCaption,\r\n.top-tabsView_menuItem.top-disabled[data-top-icon]:before,\r\n.top-tabsView_menuItem.top-disabled[data-top-icon2]:after {\r\n\topacity: unset;\r\n\tfilter: unset;\r\n}\r\n\r\n.top-tabsView_menuItem.top-disabled {\r\n\t--top-icon-color: var(--color-text-4);\r\n\r\n\tcolor: var(--color-text-4);\r\n}\r\n</style>\r\n","// TODO: Эту функцию можно вынести в глобальный utils\r\n\r\nimport { sleepWhile } from '@/core/utils/system';\r\n\r\n/**\r\n * Проверка нахождения компонента в состояние загрузки\r\n * @param component\r\n */\r\nexport const checkComponentIsLoading = (component: any) => {\r\n\treturn component?.name === 'AsyncComponentWrapper' && !component?.__asyncResolved;\r\n};\r\n\r\n/**\r\n * Презагрузить компонент\r\n *\r\n * Некоторое время ожидает загрузку компонента, прежде чем завершит работу\r\n */\r\nexport const preResolveComponent = async (component: any, condition: Function) => {\r\n\tif (component?.name !== 'AsyncComponentWrapper') return;\r\n\tif (component?.__asyncResolved) return;\r\n\r\n\tcomponent.__asyncLoader();\r\n\r\n\tawait sleepWhile(() => {\r\n\t\treturn condition() && checkComponentIsLoading(component);\r\n\t}, 200);\r\n};\r\n","<script setup lang=\"ts\">\r\nimport type { Ref, VNode } from 'vue';\r\nimport { markRaw, onMounted, onUnmounted, ref, useSlots, watch } from 'vue';\r\nimport { TopPopup } from '../../popup/popup';\r\nimport { getHash, setHash } from '@/core/utils/route';\r\n\r\nimport type { MenuItem, PropsMenu, PropsMenuItem } from './tabsView';\r\nimport { useTabsStore } from './store';\r\nimport TabsViewMenuItem from './menuItem.vue';\r\nimport { preResolveComponent } from './utils';\r\n\r\ndefineProps<PropsMenu>();\r\n\r\nconst isLoading = defineModel('isLoading');\r\n\r\nconst store = useTabsStore();\r\n\r\nconst slots = useSlots();\r\n\r\n// словарь используется для оптимизации получения нужного menuItem\r\nconst menuItemByName: Map<PropsMenuItem['name'], MenuItem> = new Map();\r\n\r\n// заполнить словарь с menuItem, по элементам в slot default\r\nconst setMenuItemByName = () => {\r\n\tif (!slots.default) return;\r\n\r\n\tconst component: any = slots.default().find(item => item.key === '_menu');\r\n\tif (!component) return;\r\n\r\n\tsetMenuItemByNameFromItems(component.children);\r\n};\r\n\r\n// заполнить словарь с menuItem, по элементам\r\nconst setMenuItemByNameFromItems = (menuItems: VNode[]) => {\r\n\tmenuItems.forEach((subComponent: any) => {\r\n\t\t// это не компонент элемента меню\r\n\t\tif (subComponent.type.__name && subComponent.type.__name !== TabsViewMenuItem.__name) return;\r\n\r\n\t\t// это не компонент, например template\r\n\t\tif (!subComponent.type.__name && typeof subComponent.children === 'object') {\r\n\t\t\tsetMenuItemByNameFromItems(subComponent.children);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!subComponent.props.name || subComponent.props.disabled) return;\r\n\r\n\t\tconst menuItem: MenuItem = {\r\n\t\t\ttitle: (subComponent.children.default?.()[0].children as string).trim(),\r\n\t\t\ticon: subComponent.props.icon,\r\n\t\t\tcomponent: subComponent.props.component ? markRaw(subComponent.props.component) : TabsViewMenuItem.props.component.default,\r\n\t\t\tscrollable: subComponent.props.scrollable ?? TabsViewMenuItem.props.scrollable.default,\r\n\t\t};\r\n\r\n\t\tmenuItemByName.set(subComponent.props.name, menuItem);\r\n\t});\r\n};\r\n\r\n/**\r\n * activeMenuItem нужен:\r\n * - для вывода текста активной вкладки в меню с popup\r\n * - для вывода компонента активной вкладки (store.component)\r\n * - для установки store.scrollable\r\n */\r\nconst activeMenuItem: Ref<MenuItem | null> = ref(null);\r\n\r\n/**\r\n * Кол-во изменений активной вкладки\r\n */\r\nlet countChanged = 0;\r\n\r\n/**\r\n * Смена активной вкладки\r\n *\r\n * TODO: смена slot, например смена языка, требует повторного выполнения setMenuItemByName()\r\n */\r\nwatch(\r\n\t() => store.activeItemName,\r\n\tasync () => {\r\n\t\tconst numberChanged = ++countChanged; // порядковый номер текущего изменения\r\n\r\n\t\tif (menuItemByName.size === 0) {\r\n\t\t\tsetMenuItemByName();\r\n\t\t}\r\n\r\n\t\tif (menuItemByName.size === 0) {\r\n\t\t\tstore.activeItemName = '';\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tactiveMenuItem.value = menuItemByName.get(store.activeItemName) ?? null;\r\n\r\n\t\t// элемент не найден, установить из хеша страницы\r\n\t\tif (!activeMenuItem.value && store.$id) {\r\n\t\t\tconst activeItemName = getHash(store.$id);\r\n\r\n\t\t\tactiveMenuItem.value = menuItemByName.get(activeItemName) ?? null;\r\n\r\n\t\t\tif (activeMenuItem.value) {\r\n\t\t\t\tstore.activeItemName = activeItemName;\r\n\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// элемент не найден, установить первый доступный\r\n\t\tif (!activeMenuItem.value) {\r\n\t\t\tstore.activeItemName = menuItemByName.keys().next().value!;\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// запрошена смена на уже активный элемент\r\n\t\tif (activeMenuItem.value.component === store.component) {\r\n\t\t\tisLoading.value = false;\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (store.$id) setHash(store.$id, store.activeItemName, false);\r\n\r\n\t\t// флаг загрузки будет сброшен при инициализации компонента\r\n\t\tisLoading.value = true;\r\n\r\n\t\t/**\r\n\t\t * Презагрузить компонент\r\n\t\t *\r\n\t\t * Нужно для того, чтобы минимизировать скачки интерфейса при ожидании загрузки асинхронного компонента\r\n\t\t */\r\n\t\tawait preResolveComponent(activeMenuItem.value.component, () => numberChanged === countChanged);\r\n\r\n\t\t// влкадка была сменена еще раз во время sleepWhile\r\n\t\tif (numberChanged !== countChanged) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tstore.scrollable = activeMenuItem.value.scrollable;\r\n\t\tstore.component = activeMenuItem.value.component;\r\n\r\n\t\tif (activeMenuItem.value && !store.component) {\r\n\t\t\tconsole.warn(`Компонент вкладки ${store.activeItemName} не найден. Добавьте props.component для пункта меню ${store.activeItemName}.`);\r\n\t\t}\r\n\t},\r\n\t{ immediate: true },\r\n);\r\n\r\nconst elRef = ref();\r\nlet resizeObserver: ResizeObserver;\r\n\r\nonMounted(() => {\r\n\tresizeObserver = new ResizeObserver(() => {\r\n\t\telRef.value.parentElement.style.setProperty('--top-tabsView-contents-offset-top', elRef.value.offsetHeight + 'px');\r\n\t});\r\n\r\n\tresizeObserver.observe(elRef.value);\r\n});\r\n\r\nonUnmounted(() => {\r\n\tresizeObserver.disconnect();\r\n});\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\tref=\"elRef\"\r\n\t\t:class=\"{\r\n\t\t\t'top-tabsView_menu': true,\r\n\t\t\t'top-tabsView_menu-inPopup_0': !store.showMenuInPopup,\r\n\t\t\t'top-tabsView_menu-inPopup_1': store.showMenuInPopup,\r\n\t\t\t'top-tabsView_menu-short': store.isShort && !store.showMenuInPopup,\r\n\t\t}\"\r\n\t>\r\n\t\t<!-- Спрятать меню под кнопку в popup -->\r\n\t\t<TopPopup v-if=\"store.showMenuInPopup\">\r\n\t\t\t<template #opener>\r\n\t\t\t\t<div class=\"top-tabsView_menuOpener\">\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tv-if=\"activeMenuItem\"\r\n\t\t\t\t\t\tclass=\"top-tabsView_menuOpenerActiveItem\"\r\n\t\t\t\t\t\t:data-top-icon=\"activeMenuItem.icon\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<span class=\"top-ellipsis\">\r\n\t\t\t\t\t\t\t{{ activeMenuItem.title }}\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class=\"top-tabsView_menuOpenerIcon\" data-top-icon=\"\"></div>\r\n\t\t\t\t</div>\r\n\t\t\t</template>\r\n\r\n\t\t\t<template #contentList>\r\n\t\t\t\t<slot></slot>\r\n\t\t\t</template>\r\n\t\t</TopPopup>\r\n\r\n\t\t<!-- Отобразить меню на странице -->\r\n\t\t<template v-else>\r\n\t\t\t<div class=\"top-tabsView_menuList\">\r\n\t\t\t\t<slot></slot>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div\r\n\t\t\t\tv-if=\"isShortable\"\r\n\t\t\t\tclass=\"top-tabsView_menuFooter\"\r\n\t\t\t>\r\n\t\t\t\t<TabsViewMenuItem\r\n\t\t\t\t\tv-if=\"isShortable\"\r\n\t\t\t\t\t:icon=\"store.isShort ? '' : ''\"\r\n\t\t\t\t\t@click=\"store.isShort = !store.isShort\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{{ store.isShort ? '' : 'Свернуть' }} <!--TODO: translate-->\r\n\t\t\t\t</TabsViewMenuItem>\r\n\t\t\t</div>\r\n\t\t</template>\r\n\t</div>\r\n</template>\r\n\r\n<style module>\r\n/* режим отображение табов в основной области документа */\r\n.top-tabsView-pageMod .top-tabsView_menu {\r\n\tbox-sizing: border-box;\r\n\tposition: sticky;\r\n\ttop: var(--top-tabsView-top);\r\n\tz-index: 10;\r\n}\r\n\r\n/* режим отображение табов в основной области документа без popup */\r\n.top-tabsView-pageMod .top-tabsView_menu-inPopup_0 {\r\n\theight: calc(var(--100vh) - var(--top-tabsView-top));\r\n}\r\n\r\n/* стантартный режим */\r\n.top-tabsView_menu-inPopup_0 {\r\n\tbox-sizing: border-box;\r\n\twidth: var(--top-tabsView-menu-width);\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tjustify-content: space-between;\r\n}\r\n\r\n/* режим вывода в popup */\r\n.top-tabsView_menu-inPopup_1 {\r\n\tborder-bottom: 1px solid var(--color-line-2-opacity);\r\n}\r\n\r\n.top-tabsView_menu-short {\r\n\twidth: auto;\r\n}\r\n\r\n.top-tabsView_menu > .top-tabsView_menuOpener {\r\n\tdisplay: flex;\r\n\tjustify-content: flex-end;\r\n}\r\n\r\n.top-tabsView_menu > .top-tabsView_menuOpener:hover {\r\n\tbackground: var(--color-layer-1);\r\n}\r\n\r\n.top-tabsView_menuOpenerIcon { display: flex; }\r\n\r\n.top-tabsView_menuOpenerActiveItem {\r\n\t--top-forms-padding: 0px;\r\n\r\n\tbox-sizing: border-box;\r\n\tpadding: var(--top-padding-2);\r\n\tmax-width: calc(100% - var(--top-forms-base-height));\r\n\twhite-space: nowrap;\r\n\tflex-grow: 1;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tgap: var(--top-padding-2);\r\n}\r\n\r\n.top-tabsView_menuList,\r\n.top-tabsView_menuFooter {\r\n\tpadding: var(--top-padding-2);\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: var(--top-gap-2);\r\n}\r\n\r\n.top-tabsView_menuList {\r\n\toverflow-y: auto;\r\n}\r\n\r\n.top-tabsView_menu-short .top-tabsView_menuFooter > .top-tabsView_menuItem {\r\n\t--top-icon-width: 100%;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { defineModel, onMounted, onUnmounted, ref, watch } from 'vue';\r\nimport Core from '@/core/core/core';\r\nimport { delHash } from '@/core/utils/route';\r\nimport type { Props } from './tabsView';\r\nimport { defineTabsStore } from './store';\r\nimport TabsViewMenu from './menu.vue';\r\nimport TopLoadbar from '@/components/forms/loadbar/loadbar.vue';\r\nimport { checkComponentIsLoading } from './utils';\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\tshowMenuInPopup: undefined,\r\n\tisShortable: false,\r\n});\r\n\r\nconst model = defineModel<string>();\r\n\r\nconst store = defineTabsStore(props, model);\r\n\r\nconst uid = Math.random();\r\n\r\nif (props.pageMod) Core.state.documentClassModificators.set(uid, 'top-hasTabsViewPageMod');\r\n\r\nonUnmounted(() => {\r\n\tif (props.pageMod) Core.state.documentClassModificators.delete(uid);\r\n\r\n\tif (store.$id) delHash(store.$id, store.activeItemName, true);\r\n});\r\n\r\nconst componentRef = ref();\r\nconst isLoading = ref(false);\r\n\r\nwatch([componentRef, () => store.component], () => {\r\n\tisLoading.value = checkComponentIsLoading(store.component);\r\n}, { immediate: true });\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\t:class=\"{\r\n\t\t\t'top-tabsView': true,\r\n\t\t\t'top-tabsView-pageMod': props.pageMod,\r\n\t\t\t'top-tabsView-inPopup': store.showMenuInPopup,\r\n\t\t}\"\r\n\t>\r\n\t\t<TabsViewMenu\r\n\t\t\t:isShortable=\"isShortable\"\r\n\t\t\tv-model:isLoading=\"isLoading\"\r\n\t\t>\r\n\t\t\t<!-- @slot Меню, ожидает передачу компонентов TabsViewMenuItem и TabsViewMenuTitle -->\r\n\t\t\t<slot name=\"menu\"></slot>\r\n\t\t</TabsViewMenu>\r\n\r\n\t\t<div\r\n\t\t\t:class=\"{\r\n\t\t\t\t'top-tabsView_contents': true,\r\n\t\t\t\t'top-tabsView_contents-isLoading': isLoading,\r\n\t\t\t\t'top-tabsView_contents-noScrollable': !store.scrollable,\r\n\t\t\t}\"\r\n\t\t>\r\n\t\t\t<TopLoadbar v-if=\"isLoading\"/>\r\n\r\n\t\t\t<keep-alive>\r\n\t\t\t\t<component\r\n\t\t\t\t\tref=\"componentRef\"\r\n\t\t\t\t\t:is=\"store.component\"\r\n\t\t\t\t/>\r\n\t\t\t</keep-alive>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<style module>\r\n:root {\r\n\t--top-tabsView-top: 0px;\r\n\t--top-tabsView-menu-width: 220px;\r\n\t--top-tabsView-contents-offset-top: 0px;\r\n}\r\n\r\n.top-tabsView {\r\n\tbackground: var(--color-layout-middle);\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n}\r\n\r\n.top-tabsView_contents {\r\n\tborder-radius: var(--top-radius-4);\r\n\tbackground: var(--color-layout-front-1);\r\n\tpadding: var(--top-padding-4);\r\n\tflex-grow: 1;\r\n\toverflow: auto;\r\n\tposition: relative;\r\n}\r\n\r\n.top-tabsView_contents-isLoading {\r\n\tpointer-events: none;\r\n}\r\n\r\n.top-tabsView_contents-noScrollable {\r\n\twidth: calc(100% - var(--top-tabsView-menu-width));\r\n\tpadding: 0;\r\n\toverflow: visible;\r\n}\r\n\r\n/* top-tabsView-inPopup */\r\n.top-tabsView-inPopup {\r\n\tbackground: var(--color-layout-front-1);\r\n\tflex-direction: column;\r\n}\r\n\r\n.top-tabsView-inPopup > .top-tabsView_contents {\r\n\tborder-radius: 0;\r\n}\r\n\r\n.top-tabsView-inPopup > .top-tabsView_contents-noScrollable {\r\n\twidth: auto;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\n\r\n</script>\r\n\r\n<template>\r\n\t<div class=\"top-tabsView_menuDelimeter\"></div>\r\n</template>\r\n\r\n<style module>\r\n.top-tabsView_menuDelimeter {\r\n\tpadding: var(--top-padding-1) 0;\r\n\tdisplay: flex;\r\n}\r\n\r\n.top-tabsView_menuDelimeter:before {\r\n\tcontent: \"\";\r\n\theight: 2px;\r\n\tbackground: var(--color-line-2);\r\n\tflex-grow: 1;\r\n}\r\n\r\n.top-tabsView_menuDelimeter:first-child,\r\n.top-tabsView_menuDelimeter + .top-tabsView_menuDelimeter {\r\n\tdisplay: none;\r\n}\r\n</style>","<script setup lang=\"ts\">\r\nimport { useTabsStore } from './store';\r\nimport type { PropsMenuTitle } from './tabsView';\r\nimport TabsViewMenuDelimeter from './menuDelimeter.vue';\r\nimport { TopPopupListItem } from '../../popup/popup';\r\n\r\ndefineProps<PropsMenuTitle>();\r\n\r\nconst store = useTabsStore();\r\n</script>\r\n\r\n<template>\r\n\t<TopPopupListItem\r\n\t\tv-if=\"store.showMenuInPopup\"\r\n\t\ttype=\"title\"\r\n\t>\r\n\t\t<slot></slot>\r\n\t</TopPopupListItem>\r\n\r\n\t<TabsViewMenuDelimeter v-else-if=\"store.isShort\"/>\r\n\r\n\t<div\r\n\t\tv-else\r\n\t\t:class=\"{\r\n\t\t\t'top-tabsView_menuTitle': true,\r\n\t\t\t'top-tabsView_menuTitle-subtitle': isSubtitle,\r\n\t\t}\"\r\n\t>\r\n\t\t<slot></slot>\r\n\t</div>\r\n</template>\r\n\r\n<style module>\r\n.top-tabsView_menuTitle {\r\n\tpadding: var(--top-padding-4) var(--top-padding-2) var(--top-padding-1);\r\n\tfont-weight: 600;\r\n\tcolor: var(--color-text-1);\r\n}\r\n\r\n.top-tabsView_menuTitle-subtitle {\r\n\tpadding-top: var(--top-padding-1);\r\n\tfont-size: 12px;\r\n\tfont-weight: 400;\r\n\tcolor: var(--color-text-2);\r\n}\r\n</style>\r\n","import type { ComponentCustomProps } from 'vue';\r\n\r\nimport TabsView from './tabsView/tabsView.vue';\r\nimport TabsViewMenuItem from './tabsView/menuItem.vue';\r\nimport TabsViewMenuTitle from './tabsView/menuTitle.vue';\r\n\r\nexport const TopTabsView = TabsView as typeof TabsView & ComponentCustomProps;\r\nexport const TopTabsViewMenuItem = TabsViewMenuItem as typeof TabsViewMenuItem & ComponentCustomProps;\r\nexport const TopTabsViewMenuTitle = TabsViewMenuTitle as typeof TabsViewMenuTitle & ComponentCustomProps;\r\n"],"names":["genStorageKey","stateName","stateKey","StoreLocalStorage","store","localStorageValue","localStorageKey","popstateCallbacks","e","popstateCallback","injectionKey","defineTabsStore","props","model","store$1","showMenuInPopup","vue","forms","isShort","scrollable","pageMod","component","useTabsStore","__props","href","tagName","onClick","checkComponentIsLoading","preResolveComponent","condition","slots","menuItemByName","item","setMenuItemByNameFromItems","menuItems","subComponent","TabsViewMenuItem","_b","_a","menuItem","activeMenuItem","countChanged","numberChanged","activeItemName","isLoading","utils_route","elRef","resizeObserver","uid","componentRef","_sfc_render","_ctx","_cache","TopTabsView","TabsView","TopTabsViewMenuItem","TopTabsViewMenuTitle","TabsViewMenuTitle"],"mappings":"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"}
1
+ {"version":3,"file":"tabsView.amd.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 { InjectionKey, ModelRef } from 'vue';\nimport { computed, ref } 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';\nimport { getHash } from '@/core/utils/route';\n\nconst popstateCallbacks = new Set<(e: PopStateEvent) => void>();\n\naddEventListener('popstate', (e) => {\n\tpopstateCallbacks.forEach(popstateCallback => popstateCallback(e));\n});\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\tif (store.$id) {\n\t\tconst popstateCallback = (e: PopStateEvent) => {\n\t\t\tmodel.value = getHash(store.$id!);\n\t\t};\n\n\t\tpopstateCallbacks.add(popstateCallback);\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>\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-2);\n\ttext-decoration: none;\n}\n\n.top-tabsView_menuItem.top-active {\n\t--top-icon-color: inherit;\n\n\tbackground: var(--color-layout-front-1);\n\tcolor: inherit;\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, VNode } 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 { MenuItem, PropsMenu, PropsMenuItem } 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 default\nconst setMenuItemByName = () => {\n\tif (!slots.default) return;\n\n\tconst component: any = slots.default().find(item => item.key === '_menu');\n\tif (!component) return;\n\n\tsetMenuItemByNameFromItems(component.children);\n};\n\n// заполнить словарь с menuItem, по элементам\nconst setMenuItemByNameFromItems = (menuItems: VNode[]) => {\n\tmenuItems.forEach((subComponent: any) => {\n\t\t// это не компонент элемента меню\n\t\tif (subComponent.type.__name && subComponent.type.__name !== TabsViewMenuItem.__name) return;\n\n\t\t// это не компонент, например template\n\t\tif (!subComponent.type.__name && typeof subComponent.children === 'object') {\n\t\t\tsetMenuItemByNameFromItems(subComponent.children);\n\n\t\t\treturn;\n\t\t}\n\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, например смена языка, требует повторного выполнения setMenuItemByName()\n */\nwatch(\n\t() => store.activeItemName,\n\tasync () => {\n\t\tconst numberChanged = ++countChanged; // порядковый номер текущего изменения\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tsetMenuItemByName();\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, false);\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>\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\tflex-shrink: 0;\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, onMounted, onUnmounted, ref, watch } from 'vue';\nimport Core from '@/core/core/core';\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\nconst uid = Math.random();\n\nif (props.pageMod) Core.state.documentClassModificators.set(uid, 'top-hasTabsViewPageMod');\n\nonUnmounted(() => {\n\tif (props.pageMod) Core.state.documentClassModificators.delete(uid);\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>\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-1);\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-1);\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>\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>\n","<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>\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","StoreLocalStorage","store","localStorageValue","localStorageKey","popstateCallbacks","e","popstateCallback","injectionKey","defineTabsStore","props","model","store$1","showMenuInPopup","vue","forms","isShort","scrollable","pageMod","component","useTabsStore","__props","href","tagName","onClick","checkComponentIsLoading","preResolveComponent","condition","slots","menuItemByName","item","setMenuItemByNameFromItems","menuItems","subComponent","_sfc_main$4","_a","_b","_d","_c","menuItem","activeMenuItem","countChanged","numberChanged","activeItemName","isLoading","utils_route","elRef","resizeObserver","uid","componentRef","_sfc_render","_ctx","_cache","TopTabsView","_sfc_main$2","TopTabsViewMenuItem","TopTabsViewMenuTitle","_sfc_main"],"mappings":"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"}
@@ -1,61 +1,61 @@
1
- import J from "../core/core.js";
2
- import { watch as T, computed as M, ref as _, defineComponent as I, openBlock as r, createBlock as m, resolveDynamicComponent as R, normalizeClass as S, unref as i, withCtx as V, renderSlot as f, createElementBlock as d, createCommentVNode as y, mergeModels as D, useModel as E, useSlots as q, onMounted as G, onUnmounted as A, createElementVNode as v, toDisplayString as O, Fragment as Q, createTextVNode as X, markRaw as Y, createVNode as Z, KeepAlive as x } from "vue";
3
- import { C as L, _ as g, x as ee } from "../.chunks/forms-CHiMZ8vg.es.js";
4
- import { getHash as z, genHash as te, setHash as oe, delHash as se } from "../utils/route.js";
5
- import { d as ae, u as ne } from "../.chunks/store-CX_6ZXhO.es.js";
6
- import { TopPopupListItem as F, TopPopup as ie } from "../popup/popup.js";
7
- import { sleepWhile as le } from "../utils/system.js";
8
- const U = ["../assets/tabsView.css"].map((t) => import.meta.resolve(t));
9
- J.insertCSSLinkToPage(U, !0);
10
- const H = (t, o) => `top:${String(t)}:${o}`, re = (t, o) => {
1
+ import { Core as U } from "../core/app.js";
2
+ import { watch as k, computed as I, ref as f, defineComponent as M, openBlock as l, createBlock as m, resolveDynamicComponent as O, normalizeClass as w, unref as i, withCtx as b, renderSlot as v, createElementBlock as d, createCommentVNode as y, mergeModels as z, useModel as D, useSlots as G, onMounted as Q, onUnmounted as H, createElementVNode as S, toDisplayString as R, Fragment as X, createTextVNode as Y, markRaw as Z, createVNode as x, KeepAlive as ee } from "vue";
3
+ import { C as $, x as te, b as oe } from "../.chunks/forms-BydHEF-k.es.js";
4
+ import { getHash as K, genHash as ae, setHash as se, delHash as ne } from "../utils/route.js";
5
+ import { d as ie, u as re } from "../.chunks/store-CX_6ZXhO.es.js";
6
+ import { TopPopupListItem as A, TopPopup as le } from "../popup/popup.js";
7
+ import { sleepWhile as ue } from "../utils/system.js";
8
+ const q = ["../assets/tabsView.css"].map((t) => import.meta.resolve(t));
9
+ U.insertCSSLinkToPage(q, !0);
10
+ const j = (t, o) => `top:${String(t)}:${o}`, ce = (t, o) => {
11
11
  if (!o.$id) return;
12
- const e = H(t, o.$id);
12
+ const e = j(t, o.$id);
13
13
  try {
14
- const s = JSON.parse(localStorage.getItem(e));
15
- typeof s == typeof o[t] && (o[t] = s);
14
+ const a = JSON.parse(localStorage.getItem(e));
15
+ typeof a == typeof o[t] && (o[t] = a);
16
16
  } catch {
17
17
  console.warn(new Error(`В localStorage[${e}] не корректный json`));
18
18
  }
19
19
  }, pe = (t, o) => {
20
20
  if (!o.$id) return;
21
- const e = H(t, o.$id);
22
- T(() => o[t], () => {
21
+ const e = j(t, o.$id);
22
+ k(() => o[t], () => {
23
23
  localStorage.setItem(e, JSON.stringify(o[t]));
24
24
  }, { immediate: !0 });
25
- }, C = {
26
- loadLocalStorge: re,
25
+ }, E = {
26
+ loadLocalStorge: ce,
27
27
  addSaverLocalStorge: pe
28
- }, K = /* @__PURE__ */ new Set();
28
+ }, F = /* @__PURE__ */ new Set();
29
29
  addEventListener("popstate", (t) => {
30
- K.forEach((o) => o(t));
30
+ F.forEach((o) => o(t));
31
31
  });
32
- const j = Symbol(), ue = (t, o) => {
33
- const e = ae(j, () => {
34
- const s = M(() => t.showMenuInPopup ?? L.state.isMobile), p = M(() => t.pageMod), c = _(!1), n = _(void 0), l = _(!0);
32
+ const W = Symbol(), de = (t, o) => {
33
+ const e = ie(W, () => {
34
+ const a = I(() => t.showMenuInPopup ?? $.state.isMobile), u = I(() => t.pageMod), p = f(!1), n = f(void 0), r = f(!0);
35
35
  return {
36
- showMenuInPopup: s,
37
- pageMod: p,
38
- isShort: c,
36
+ showMenuInPopup: a,
37
+ pageMod: u,
38
+ isShort: p,
39
39
  activeItemName: o,
40
40
  component: n,
41
- scrollable: l
41
+ scrollable: r
42
42
  };
43
43
  }, t.idState);
44
44
  if (t.isShortable) {
45
- const s = "isShort";
46
- C.loadLocalStorge(s, e), C.addSaverLocalStorge(s, e);
45
+ const a = "isShort";
46
+ E.loadLocalStorge(a, e), E.addSaverLocalStorge(a, e);
47
47
  }
48
48
  if (e.$id) {
49
- const s = (p) => {
50
- o.value = z(e.$id);
49
+ const a = (u) => {
50
+ o.value = K(e.$id);
51
51
  };
52
- K.add(s);
52
+ F.add(a);
53
53
  }
54
54
  return e;
55
- }, P = () => ne(j), ce = {
55
+ }, L = () => re(W), me = {
56
56
  key: 1,
57
57
  class: "top-ellipsis"
58
- }, de = /* @__PURE__ */ I({
58
+ }, g = /* @__PURE__ */ M({
59
59
  __name: "menuItem",
60
60
  props: {
61
61
  name: {},
@@ -66,46 +66,38 @@ const j = Symbol(), ue = (t, o) => {
66
66
  scrollable: { type: Boolean, default: !0 }
67
67
  },
68
68
  setup(t) {
69
- const o = t, e = P(), s = M(() => o.name && e.$id ? te(e.$id, o.name) : o.href), p = M(() => e.showMenuInPopup ? F : s ? "a" : "button"), c = (n) => {
70
- !o.href && s.value && n.preventDefault(), o.name && (e.activeItemName = o.name);
69
+ const o = t, e = L(), a = I(() => o.name && e.$id ? ae(e.$id, o.name) : o.href), u = I(() => e.showMenuInPopup ? A : a ? "a" : "button"), p = (n) => {
70
+ !o.href && a.value && n.preventDefault(), o.name && (e.activeItemName = o.name);
71
71
  };
72
- return (n, l) => (r(), m(R(p.value), {
72
+ return (n, r) => (l(), m(O(u.value), {
73
73
  target: "_self",
74
- class: S({
74
+ class: w({
75
75
  "top-tabsView_menuItem": !i(e).showMenuInPopup,
76
76
  "top-active": n.name && i(e).activeItemName === n.name,
77
77
  "top-disabled": n.disabled,
78
78
  "top-spa-disabled": !0
79
79
  }),
80
- href: s.value,
80
+ href: a.value,
81
81
  "data-top-icon": n.icon || void 0,
82
82
  disabled: n.disabled || void 0,
83
- onClick: c
83
+ onClick: p
84
84
  }, {
85
- default: V(() => [
86
- i(e).showMenuInPopup ? f(n.$slots, "default", { key: 0 }) : n.$slots.default && !i(e).isShort ? (r(), d("span", ce, [
87
- f(n.$slots, "default")
85
+ default: b(() => [
86
+ i(e).showMenuInPopup ? v(n.$slots, "default", { key: 0 }) : n.$slots.default && !i(e).isShort ? (l(), d("span", me, [
87
+ v(n.$slots, "default")
88
88
  ])) : y("", !0)
89
89
  ]),
90
90
  _: 3
91
91
  }, 8, ["class", "href", "data-top-icon", "disabled"]));
92
92
  }
93
- }), me = {
94
- "top-tabsView_menuItem": "top-tabsView_menuItem",
95
- "top-active": "top-active",
96
- "top-forms-option": "top-forms-option",
97
- "top-formsCaption": "top-formsCaption",
98
- "top-disabled": "top-disabled"
99
- }, _e = {
100
- $style: me
101
- }, h = /* @__PURE__ */ g(de, [["__cssModules", _e]]), W = (t) => (t == null ? void 0 : t.name) === "AsyncComponentWrapper" && !(t != null && t.__asyncResolved), fe = async (t, o) => {
102
- (t == null ? void 0 : t.name) === "AsyncComponentWrapper" && (t != null && t.__asyncResolved || (t.__asyncLoader(), await le(() => o() && W(t), 200)));
103
- }, be = { class: "top-tabsView_menuOpener" }, we = ["data-top-icon"], Ve = { class: "top-ellipsis" }, ve = { class: "top-tabsView_menuList" }, he = {
93
+ }), J = (t) => (t == null ? void 0 : t.name) === "AsyncComponentWrapper" && !(t != null && t.__asyncResolved), fe = async (t, o) => {
94
+ (t == null ? void 0 : t.name) === "AsyncComponentWrapper" && (t != null && t.__asyncResolved || (t.__asyncLoader(), await ue(() => o() && J(t), 200)));
95
+ }, ve = { class: "top-tabsView_menuOpener" }, _e = ["data-top-icon"], he = { class: "top-ellipsis" }, be = { class: "top-tabsView_menuList" }, Se = {
104
96
  key: 0,
105
97
  class: "top-tabsView_menuFooter"
106
- }, ye = /* @__PURE__ */ I({
98
+ }, ge = /* @__PURE__ */ M({
107
99
  __name: "menu",
108
- props: /* @__PURE__ */ D({
100
+ props: /* @__PURE__ */ z({
109
101
  isShortable: { type: Boolean },
110
102
  isLoading: { type: Boolean }
111
103
  }, {
@@ -114,106 +106,106 @@ const j = Symbol(), ue = (t, o) => {
114
106
  }),
115
107
  emits: ["update:isLoading"],
116
108
  setup(t) {
117
- const o = E(t, "isLoading"), e = P(), s = q(), p = /* @__PURE__ */ new Map(), c = () => {
118
- if (!s.default) return;
119
- const u = s.default().find((a) => a.key === "_menu");
120
- u && n(u.children);
121
- }, n = (u) => {
122
- u.forEach((a) => {
123
- var N, B;
124
- if (a.type.__name && a.type.__name !== h.__name) return;
125
- if (!a.type.__name && typeof a.children == "object") {
126
- n(a.children);
109
+ const o = D(t, "isLoading"), e = L(), a = G(), u = /* @__PURE__ */ new Map(), p = () => {
110
+ if (!a.default) return;
111
+ const c = a.default().find((s) => s.key === "_menu");
112
+ c && n(c.children);
113
+ }, n = (c) => {
114
+ c.forEach((s) => {
115
+ var P, T, B, C;
116
+ if (s.type.__name && s.type.__name !== g.__name) return;
117
+ if (!s.type.__name && typeof s.children == "object") {
118
+ n(s.children);
127
119
  return;
128
120
  }
129
- if (!a.props.name || a.props.disabled) return;
130
- const k = {
131
- title: ((B = (N = a.children).default) == null ? void 0 : B.call(N)[0].children).trim(),
132
- icon: a.props.icon,
133
- component: a.props.component ? Y(a.props.component) : h.props.component.default,
134
- scrollable: a.props.scrollable ?? h.props.scrollable.default
121
+ if (!((P = s.props) != null && P.name) || (T = s.props) != null && T.disabled) return;
122
+ const N = {
123
+ title: ((C = (B = s.children).default) == null ? void 0 : C.call(B)[0].children).trim(),
124
+ icon: s.props.icon,
125
+ component: s.props.component ? Z(s.props.component) : g.props.component.default,
126
+ scrollable: s.props.scrollable ?? g.props.scrollable.default
135
127
  };
136
- p.set(a.props.name, k);
128
+ u.set(s.props.name, N);
137
129
  });
138
- }, l = _(null);
139
- let b = 0;
140
- T(
130
+ }, r = f(null);
131
+ let _ = 0;
132
+ k(
141
133
  () => e.activeItemName,
142
134
  async () => {
143
- const u = ++b;
144
- if (p.size === 0 && c(), p.size === 0) {
135
+ const c = ++_;
136
+ if (u.size === 0 && p(), u.size === 0) {
145
137
  e.activeItemName = "";
146
138
  return;
147
139
  }
148
- if (l.value = p.get(e.activeItemName) ?? null, !l.value && e.$id) {
149
- const a = z(e.$id);
150
- if (l.value = p.get(a) ?? null, l.value) {
151
- e.activeItemName = a;
140
+ if (r.value = u.get(e.activeItemName) ?? null, !r.value && e.$id) {
141
+ const s = K(e.$id);
142
+ if (r.value = u.get(s) ?? null, r.value) {
143
+ e.activeItemName = s;
152
144
  return;
153
145
  }
154
146
  }
155
- if (!l.value) {
156
- e.activeItemName = p.keys().next().value;
147
+ if (!r.value) {
148
+ e.activeItemName = u.keys().next().value;
157
149
  return;
158
150
  }
159
- if (l.value.component === e.component) {
151
+ if (r.value.component === e.component) {
160
152
  o.value = !1;
161
153
  return;
162
154
  }
163
- e.$id && oe(e.$id, e.activeItemName, !1), o.value = !0, await fe(l.value.component, () => u === b), u === b && (e.scrollable = l.value.scrollable, e.component = l.value.component, l.value && !e.component && console.warn(`Компонент вкладки ${e.activeItemName} не найден. Добавьте props.component для пункта меню ${e.activeItemName}.`));
155
+ e.$id && se(e.$id, e.activeItemName, !1), o.value = !0, await fe(r.value.component, () => c === _), c === _ && (e.scrollable = r.value.scrollable, e.component = r.value.component, r.value && !e.component && console.warn(`Компонент вкладки ${e.activeItemName} не найден. Добавьте props.component для пункта меню ${e.activeItemName}.`));
164
156
  },
165
157
  { immediate: !0 }
166
158
  );
167
- const w = _();
168
- let $;
169
- return G(() => {
170
- $ = new ResizeObserver(() => {
171
- w.value.parentElement.style.setProperty("--top-tabsView-contents-offset-top", w.value.offsetHeight + "px");
172
- }), $.observe(w.value);
173
- }), A(() => {
174
- $.disconnect();
175
- }), (u, a) => (r(), d("div", {
159
+ const h = f();
160
+ let V;
161
+ return Q(() => {
162
+ V = new ResizeObserver(() => {
163
+ h.value.parentElement.style.setProperty("--top-tabsView-contents-offset-top", h.value.offsetHeight + "px");
164
+ }), V.observe(h.value);
165
+ }), H(() => {
166
+ V.disconnect();
167
+ }), (c, s) => (l(), d("div", {
176
168
  ref_key: "elRef",
177
- ref: w,
178
- class: S({
169
+ ref: h,
170
+ class: w({
179
171
  "top-tabsView_menu": !0,
180
172
  "top-tabsView_menu-inPopup_0": !i(e).showMenuInPopup,
181
173
  "top-tabsView_menu-inPopup_1": i(e).showMenuInPopup,
182
174
  "top-tabsView_menu-short": i(e).isShort && !i(e).showMenuInPopup
183
175
  })
184
176
  }, [
185
- i(e).showMenuInPopup ? (r(), m(i(ie), { key: 0 }, {
186
- opener: V(() => [
187
- v("div", be, [
188
- l.value ? (r(), d("div", {
177
+ i(e).showMenuInPopup ? (l(), m(i(le), { key: 0 }, {
178
+ opener: b(() => [
179
+ S("div", ve, [
180
+ r.value ? (l(), d("div", {
189
181
  key: 0,
190
182
  class: "top-tabsView_menuOpenerActiveItem",
191
- "data-top-icon": l.value.icon
183
+ "data-top-icon": r.value.icon
192
184
  }, [
193
- v("span", Ve, O(l.value.title), 1)
194
- ], 8, we)) : y("", !0),
195
- a[1] || (a[1] = v("div", {
185
+ S("span", he, R(r.value.title), 1)
186
+ ], 8, _e)) : y("", !0),
187
+ s[1] || (s[1] = S("div", {
196
188
  class: "top-tabsView_menuOpenerIcon",
197
189
  "data-top-icon": ""
198
190
  }, null, -1))
199
191
  ])
200
192
  ]),
201
- contentList: V(() => [
202
- f(u.$slots, "default")
193
+ contentList: b(() => [
194
+ v(c.$slots, "default")
203
195
  ]),
204
196
  _: 3
205
- })) : (r(), d(Q, { key: 1 }, [
206
- v("div", ve, [
207
- f(u.$slots, "default")
197
+ })) : (l(), d(X, { key: 1 }, [
198
+ S("div", be, [
199
+ v(c.$slots, "default")
208
200
  ]),
209
- u.isShortable ? (r(), d("div", he, [
210
- u.isShortable ? (r(), m(h, {
201
+ c.isShortable ? (l(), d("div", Se, [
202
+ c.isShortable ? (l(), m(g, {
211
203
  key: 0,
212
204
  icon: i(e).isShort ? "" : "",
213
- onClick: a[0] || (a[0] = (k) => i(e).isShort = !i(e).isShort)
205
+ onClick: s[0] || (s[0] = (N) => i(e).isShort = !i(e).isShort)
214
206
  }, {
215
- default: V(() => [
216
- X(O(i(e).isShort ? "" : "Свернуть"), 1)
207
+ default: b(() => [
208
+ Y(R(i(e).isShort ? "" : "Свернуть"), 1)
217
209
  ]),
218
210
  _: 1
219
211
  }, 8, ["icon"])) : y("", !0)
@@ -221,23 +213,9 @@ const j = Symbol(), ue = (t, o) => {
221
213
  ], 64))
222
214
  ], 2));
223
215
  }
224
- }), Se = {
225
- "top-tabsView-pageMod": "top-tabsView-pageMod",
226
- "top-tabsView_menu": "top-tabsView_menu",
227
- "top-tabsView_menu-inPopup_0": "top-tabsView_menu-inPopup_0",
228
- "top-tabsView_menu-inPopup_1": "top-tabsView_menu-inPopup_1",
229
- "top-tabsView_menu-short": "top-tabsView_menu-short",
230
- "top-tabsView_menuOpener": "top-tabsView_menuOpener",
231
- "top-tabsView_menuOpenerIcon": "top-tabsView_menuOpenerIcon",
232
- "top-tabsView_menuOpenerActiveItem": "top-tabsView_menuOpenerActiveItem",
233
- "top-tabsView_menuList": "top-tabsView_menuList",
234
- "top-tabsView_menuFooter": "top-tabsView_menuFooter",
235
- "top-tabsView_menuItem": "top-tabsView_menuItem"
236
- }, ge = {
237
- $style: Se
238
- }, Me = /* @__PURE__ */ g(ye, [["__cssModules", ge]]), Ie = /* @__PURE__ */ I({
216
+ }), ye = /* @__PURE__ */ M({
239
217
  __name: "tabsView",
240
- props: /* @__PURE__ */ D({
218
+ props: /* @__PURE__ */ z({
241
219
  modelValue: {},
242
220
  pageMod: { type: Boolean },
243
221
  showMenuInPopup: { type: Boolean, default: void 0 },
@@ -249,97 +227,80 @@ const j = Symbol(), ue = (t, o) => {
249
227
  }),
250
228
  emits: ["update:modelValue"],
251
229
  setup(t) {
252
- const o = t, e = E(t, "modelValue"), s = ue(o, e), p = Math.random();
253
- o.pageMod && L.state.documentClassModificators.set(p, "top-hasTabsViewPageMod"), A(() => {
254
- o.pageMod && L.state.documentClassModificators.delete(p), s.$id && se(s.$id, s.activeItemName, !0);
230
+ const o = t, e = D(t, "modelValue"), a = de(o, e), u = Math.random();
231
+ o.pageMod && $.state.documentClassModificators.set(u, "top-hasTabsViewPageMod"), H(() => {
232
+ o.pageMod && $.state.documentClassModificators.delete(u), a.$id && ne(a.$id, a.activeItemName, !0);
255
233
  });
256
- const c = _(), n = _(!1);
257
- return T([c, () => s.component], () => {
258
- n.value = W(s.component);
259
- }, { immediate: !0 }), (l, b) => (r(), d("div", {
260
- class: S({
234
+ const p = f(), n = f(!1);
235
+ return k([p, () => a.component], () => {
236
+ n.value = J(a.component);
237
+ }, { immediate: !0 }), (r, _) => (l(), d("div", {
238
+ class: w({
261
239
  "top-tabsView": !0,
262
240
  "top-tabsView-pageMod": o.pageMod,
263
- "top-tabsView-inPopup": i(s).showMenuInPopup
241
+ "top-tabsView-inPopup": i(a).showMenuInPopup
264
242
  })
265
243
  }, [
266
- Z(Me, {
267
- isShortable: l.isShortable,
244
+ x(ge, {
245
+ isShortable: r.isShortable,
268
246
  isLoading: n.value,
269
- "onUpdate:isLoading": b[0] || (b[0] = (w) => n.value = w)
247
+ "onUpdate:isLoading": _[0] || (_[0] = (h) => n.value = h)
270
248
  }, {
271
- default: V(() => [
272
- f(l.$slots, "menu")
249
+ default: b(() => [
250
+ v(r.$slots, "menu")
273
251
  ]),
274
252
  _: 3
275
253
  }, 8, ["isShortable", "isLoading"]),
276
- v("div", {
277
- class: S({
254
+ S("div", {
255
+ class: w({
278
256
  "top-tabsView_contents": !0,
279
257
  "top-tabsView_contents-isLoading": n.value,
280
- "top-tabsView_contents-noScrollable": !i(s).scrollable
258
+ "top-tabsView_contents-noScrollable": !i(a).scrollable
281
259
  })
282
260
  }, [
283
- n.value ? (r(), m(ee, { key: 0 })) : y("", !0),
284
- (r(), m(x, null, [
285
- (r(), m(R(i(s).component), {
261
+ n.value ? (l(), m(te, { key: 0 })) : y("", !0),
262
+ (l(), m(ee, null, [
263
+ (l(), m(O(i(a).component), {
286
264
  ref_key: "componentRef",
287
- ref: c
265
+ ref: p
288
266
  }, null, 512))
289
267
  ], 1024))
290
268
  ], 2)
291
269
  ], 2));
292
270
  }
293
- }), $e = {
294
- "top-tabsView": "top-tabsView",
295
- "top-tabsView_contents": "top-tabsView_contents",
296
- "top-tabsView_contents-isLoading": "top-tabsView_contents-isLoading",
297
- "top-tabsView_contents-noScrollable": "top-tabsView_contents-noScrollable",
298
- "top-tabsView-inPopup": "top-tabsView-inPopup"
299
- }, Le = {
300
- $style: $e
301
- }, Te = /* @__PURE__ */ g(Ie, [["__cssModules", Le]]), Pe = {
302
- "top-tabsView_menuDelimeter": "top-tabsView_menuDelimeter"
303
- }, ke = {}, Ne = { class: "top-tabsView_menuDelimeter" };
304
- function Be(t, o) {
305
- return r(), d("div", Ne);
271
+ }), we = {}, Ie = { class: "top-tabsView_menuDelimeter" };
272
+ function Me(t, o) {
273
+ return l(), d("div", Ie);
306
274
  }
307
- const Oe = {
308
- $style: Pe
309
- }, Ce = /* @__PURE__ */ g(ke, [["render", Be], ["__cssModules", Oe]]), Re = /* @__PURE__ */ I({
275
+ const Ve = /* @__PURE__ */ oe(we, [["render", Me]]), $e = /* @__PURE__ */ M({
310
276
  __name: "menuTitle",
311
277
  props: {
312
278
  isSubtitle: { type: Boolean }
313
279
  },
314
280
  setup(t) {
315
- const o = P();
316
- return (e, s) => i(o).showMenuInPopup ? (r(), m(i(F), {
281
+ const o = L();
282
+ return (e, a) => i(o).showMenuInPopup ? (l(), m(i(A), {
317
283
  key: 0,
318
284
  type: "title"
319
285
  }, {
320
- default: V(() => [
321
- f(e.$slots, "default")
286
+ default: b(() => [
287
+ v(e.$slots, "default")
322
288
  ]),
323
289
  _: 3
324
- })) : i(o).isShort ? (r(), m(Ce, { key: 1 })) : (r(), d("div", {
290
+ })) : i(o).isShort ? (l(), m(Ve, { key: 1 })) : (l(), d("div", {
325
291
  key: 2,
326
- class: S({
292
+ class: w({
327
293
  "top-tabsView_menuTitle": !0,
328
294
  "top-tabsView_menuTitle-subtitle": e.isSubtitle
329
295
  })
330
296
  }, [
331
- f(e.$slots, "default")
297
+ v(e.$slots, "default")
332
298
  ], 2));
333
299
  }
334
- }), De = {
335
- "top-tabsView_menuTitle": "top-tabsView_menuTitle",
336
- "top-tabsView_menuTitle-subtitle": "top-tabsView_menuTitle-subtitle"
337
- }, Ee = {
338
- $style: De
339
- }, Ae = /* @__PURE__ */ g(Re, [["__cssModules", Ee]]), Ue = Te, qe = h, Ge = Ae;
300
+ }), Re = ye, Ee = g, Oe = $e;
340
301
  export {
341
- Ue as TopTabsView,
342
- qe as TopTabsViewMenuItem,
343
- Ge as TopTabsViewMenuTitle
302
+ Re as TopTabsView,
303
+ Ee as TopTabsViewMenuItem,
304
+ Oe as TopTabsViewMenuTitle
344
305
  };
345
306
  //# sourceMappingURL=tabsView.js.map