@topvisor/ui 1.5.0-updates.0 → 1.5.0-updates.5

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 (305) hide show
  1. package/.chunks/api-CawzY1Cw.amd.js +2 -0
  2. package/.chunks/api-CawzY1Cw.amd.js.map +1 -0
  3. package/.chunks/api-CawzY1Cw.esm.js +208 -0
  4. package/.chunks/api-CawzY1Cw.esm.js.map +1 -0
  5. package/.chunks/app-CCX-gNqz.amd.js +2 -0
  6. package/.chunks/app-CCX-gNqz.amd.js.map +1 -0
  7. package/.chunks/app-CCX-gNqz.esm.js +396 -0
  8. package/.chunks/app-CCX-gNqz.esm.js.map +1 -0
  9. package/.chunks/datepicker-BTkZOq7d.amd.js +2 -0
  10. package/.chunks/datepicker-BTkZOq7d.amd.js.map +1 -0
  11. package/.chunks/datepicker-BTkZOq7d.esm.js +38 -0
  12. package/.chunks/datepicker-BTkZOq7d.esm.js.map +1 -0
  13. package/.chunks/dialog-DeM4SApg.amd.js +2 -0
  14. package/.chunks/dialog-DeM4SApg.amd.js.map +1 -0
  15. package/.chunks/dialog-DeM4SApg.esm.js +117 -0
  16. package/.chunks/dialog-DeM4SApg.esm.js.map +1 -0
  17. package/.chunks/dialog_regionSelectorRegions-CYrmaDt3.amd.js +2 -0
  18. package/.chunks/dialog_regionSelectorRegions-CYrmaDt3.amd.js.map +1 -0
  19. package/.chunks/dialog_regionSelectorRegions-CYrmaDt3.esm.js +169 -0
  20. package/.chunks/dialog_regionSelectorRegions-CYrmaDt3.esm.js.map +1 -0
  21. package/.chunks/dialogs-CMrERMI7.amd.js +2 -0
  22. package/.chunks/dialogs-CMrERMI7.amd.js.map +1 -0
  23. package/.chunks/dialogs-CMrERMI7.esm.js +237 -0
  24. package/.chunks/dialogs-CMrERMI7.esm.js.map +1 -0
  25. package/.chunks/field-CjkpGeA7.amd.js +2 -0
  26. package/.chunks/field-CjkpGeA7.amd.js.map +1 -0
  27. package/.chunks/field-CjkpGeA7.esm.js +16 -0
  28. package/.chunks/field-CjkpGeA7.esm.js.map +1 -0
  29. package/.chunks/forms-CbUt-6Ff.amd.js +2 -0
  30. package/.chunks/forms-CbUt-6Ff.amd.js.map +1 -0
  31. package/.chunks/forms-CbUt-6Ff.esm.js +1991 -0
  32. package/.chunks/forms-CbUt-6Ff.esm.js.map +1 -0
  33. package/.chunks/formsExt-CrTmBhja.amd.js +2 -0
  34. package/.chunks/formsExt-CrTmBhja.amd.js.map +1 -0
  35. package/.chunks/formsExt-CrTmBhja.esm.js +807 -0
  36. package/.chunks/formsExt-CrTmBhja.esm.js.map +1 -0
  37. package/.chunks/lazy-CGswTOPj.amd.js +2 -0
  38. package/.chunks/lazy-CGswTOPj.amd.js.map +1 -0
  39. package/.chunks/lazy-CGswTOPj.esm.js +68 -0
  40. package/.chunks/lazy-CGswTOPj.esm.js.map +1 -0
  41. package/.chunks/mocker-CwZe-g4N.amd.js +2 -0
  42. package/.chunks/mocker-CwZe-g4N.amd.js.map +1 -0
  43. package/.chunks/mocker-CwZe-g4N.esm.js +45 -0
  44. package/.chunks/mocker-CwZe-g4N.esm.js.map +1 -0
  45. package/.chunks/notice-CslVdVNm.amd.js +4 -0
  46. package/.chunks/notice-CslVdVNm.amd.js.map +1 -0
  47. package/.chunks/notice-CslVdVNm.esm.js +191 -0
  48. package/.chunks/notice-CslVdVNm.esm.js.map +1 -0
  49. package/.chunks/popup-DrByVU-k.amd.js +2 -0
  50. package/.chunks/popup-DrByVU-k.amd.js.map +1 -0
  51. package/.chunks/popup-DrByVU-k.esm.js +444 -0
  52. package/.chunks/popup-DrByVU-k.esm.js.map +1 -0
  53. package/.chunks/popup-dNrN-eKi.amd.js +2 -0
  54. package/.chunks/popup-dNrN-eKi.amd.js.map +1 -0
  55. package/.chunks/popup-dNrN-eKi.esm.js +323 -0
  56. package/.chunks/popup-dNrN-eKi.esm.js.map +1 -0
  57. package/.chunks/punycode.es6-B-5kB2YI.amd.js +2 -0
  58. package/.chunks/{punycode.es6-CgGegfA_.es.js.map → punycode.es6-B-5kB2YI.amd.js.map} +1 -1
  59. package/.chunks/punycode.es6-B-5kB2YI.esm.js +105 -0
  60. package/.chunks/punycode.es6-B-5kB2YI.esm.js.map +1 -0
  61. package/.chunks/store-DuQpSSLL.amd.js +2 -0
  62. package/.chunks/{store-CX_6ZXhO.es.js.map → store-DuQpSSLL.amd.js.map} +1 -1
  63. package/.chunks/store-DuQpSSLL.esm.js +27 -0
  64. package/.chunks/store-DuQpSSLL.esm.js.map +1 -0
  65. package/.chunks/utils-BwiXsV0S.amd.js +2 -0
  66. package/.chunks/utils-BwiXsV0S.amd.js.map +1 -0
  67. package/.chunks/utils-BwiXsV0S.esm.js +43 -0
  68. package/.chunks/utils-BwiXsV0S.esm.js.map +1 -0
  69. package/.chunks/utils-Dd0MZgyw.amd.js +2 -0
  70. package/.chunks/utils-Dd0MZgyw.amd.js.map +1 -0
  71. package/.chunks/utils-Dd0MZgyw.esm.js +287 -0
  72. package/.chunks/utils-Dd0MZgyw.esm.js.map +1 -0
  73. package/.chunks/worker-Db8YrEHo.amd.js +2 -0
  74. package/.chunks/worker-Db8YrEHo.amd.js.map +1 -0
  75. package/.chunks/worker-Db8YrEHo.esm.js +100 -0
  76. package/.chunks/worker-Db8YrEHo.esm.js.map +1 -0
  77. package/api/additional.amd.js +2 -2
  78. package/api/additional.amd.js.map +1 -1
  79. package/api/additional.js +70 -66
  80. package/api/additional.js.map +1 -1
  81. package/api/index.amd.js +2 -2
  82. package/api/index.amd.js.map +1 -1
  83. package/api/index.js +3 -285
  84. package/assets/charts.css +1 -1
  85. package/assets/core.css +1 -1
  86. package/assets/dialog_regionSelectorRegions.css +1 -1
  87. package/assets/extra.css +1 -1
  88. package/assets/forms.css +1 -1
  89. package/assets/formsExt.css +1 -0
  90. package/assets/layout.css +1 -1
  91. package/assets/notice.css +1 -1
  92. package/assets/popup.css +1 -0
  93. package/assets/project.css +1 -1
  94. package/assets/tabs.css +1 -1
  95. package/assets/tabsView.css +1 -1
  96. package/assets/themes/dark-th.css +1 -1
  97. package/assets/themes/dark.css +1 -1
  98. package/assets/themes/light.css +1 -1
  99. package/autoload-css-manifest.amd.json +79 -0
  100. package/autoload-css-manifest.json +90 -0
  101. package/charts/charts.amd.js +2 -2
  102. package/charts/charts.amd.js.map +1 -1
  103. package/charts/charts.js +146 -174
  104. package/charts/charts.js.map +1 -1
  105. package/core/app.amd.js +2 -2
  106. package/core/app.amd.js.map +1 -1
  107. package/core/app.js +5 -213
  108. package/dialog/dialog.amd.js +2 -2
  109. package/dialog/dialog.amd.js.map +1 -1
  110. package/dialog/dialog.js +4 -60
  111. package/extra/extra.amd.js +2 -2
  112. package/extra/extra.amd.js.map +1 -1
  113. package/extra/extra.js +73 -69
  114. package/extra/extra.js.map +1 -1
  115. package/forms/forms.amd.js +2 -2
  116. package/forms/forms.amd.js.map +1 -1
  117. package/forms/forms.js +2 -19
  118. package/forms/helpers.amd.js +2 -2
  119. package/forms/helpers.amd.js.map +1 -1
  120. package/forms/helpers.js +0 -2
  121. package/formsExt/formsExt.amd.js +2 -2
  122. package/formsExt/formsExt.amd.js.map +1 -1
  123. package/formsExt/formsExt.js +2 -373
  124. package/icomoon/demo-files/demo.amd.js +2 -0
  125. package/icomoon/demo-files/demo.amd.js.map +1 -0
  126. package/icomoon/demo.amd.js +2 -0
  127. package/icomoon/demo.amd.js.map +1 -0
  128. package/layout/layout.amd.js +2 -2
  129. package/layout/layout.amd.js.map +1 -1
  130. package/layout/layout.js +41 -57
  131. package/layout/layout.js.map +1 -1
  132. package/package.json +1 -1
  133. package/popup/popup.amd.js +2 -2
  134. package/popup/popup.amd.js.map +1 -1
  135. package/popup/popup.js +2 -282
  136. package/popup/worker.amd.js +2 -2
  137. package/popup/worker.amd.js.map +1 -1
  138. package/popup/worker.js +2 -144
  139. package/project/project.amd.js +2 -2
  140. package/project/project.amd.js.map +1 -1
  141. package/project/project.js +1666 -1643
  142. package/project/project.js.map +1 -1
  143. package/src/src/components/project/groupSelector/folders/types.d.ts +1 -1
  144. package/src/src/components/project/groupSelector/folders/utils.d.ts +35 -400
  145. package/src/src/components/project/groupSelector/groupSelector.vue.d.ts +1 -1
  146. package/src/src/components/project/groupSelector/groups/types.d.ts +1 -1
  147. package/src/src/components/project/groupSelector/groups/utils.d.ts +44 -757
  148. package/src/src/components/project/projectSelector/utils.d.ts +40 -39
  149. package/tabs/tabs.amd.js +2 -2
  150. package/tabs/tabs.amd.js.map +1 -1
  151. package/tabs/tabs.js +63 -77
  152. package/tabs/tabs.js.map +1 -1
  153. package/tabsView/tabsView.amd.js +2 -2
  154. package/tabsView/tabsView.amd.js.map +1 -1
  155. package/tabsView/tabsView.js +245 -288
  156. package/tabsView/tabsView.js.map +1 -1
  157. package/utils/check.amd.js +2 -2
  158. package/utils/check.amd.js.map +1 -1
  159. package/utils/check.js +15 -19
  160. package/utils/check.js.map +1 -1
  161. package/utils/clipboard.amd.js +6 -6
  162. package/utils/clipboard.amd.js.map +1 -1
  163. package/utils/clipboard.js +26 -31
  164. package/utils/clipboard.js.map +1 -1
  165. package/utils/date.amd.js +2 -2
  166. package/utils/date.amd.js.map +1 -1
  167. package/utils/date.js +2 -12
  168. package/utils/device.amd.js +2 -2
  169. package/utils/device.amd.js.map +1 -1
  170. package/utils/device.js +2 -15
  171. package/utils/dom.amd.js +2 -2
  172. package/utils/dom.amd.js.map +1 -1
  173. package/utils/dom.js +53 -67
  174. package/utils/dom.js.map +1 -1
  175. package/utils/image.amd.js +3 -3
  176. package/utils/image.amd.js.map +1 -1
  177. package/utils/image.js +12 -22
  178. package/utils/image.js.map +1 -1
  179. package/utils/keyboard.amd.js +2 -2
  180. package/utils/keyboard.amd.js.map +1 -1
  181. package/utils/keyboard.js +10 -11
  182. package/utils/keyboard.js.map +1 -1
  183. package/utils/lodash.amd.js +2 -2
  184. package/utils/lodash.amd.js.map +1 -1
  185. package/utils/lodash.js +2 -9
  186. package/utils/number.amd.js +2 -2
  187. package/utils/number.amd.js.map +1 -1
  188. package/utils/number.js +12 -12
  189. package/utils/number.js.map +1 -1
  190. package/utils/price.amd.js +2 -2
  191. package/utils/price.amd.js.map +1 -1
  192. package/utils/price.js +14 -9
  193. package/utils/price.js.map +1 -1
  194. package/utils/route.amd.js +2 -2
  195. package/utils/route.amd.js.map +1 -1
  196. package/utils/route.js +33 -37
  197. package/utils/route.js.map +1 -1
  198. package/utils/scroll.amd.js +2 -2
  199. package/utils/scroll.amd.js.map +1 -1
  200. package/utils/scroll.js +39 -43
  201. package/utils/scroll.js.map +1 -1
  202. package/utils/searchers.amd.js +2 -2
  203. package/utils/searchers.amd.js.map +1 -1
  204. package/utils/searchers.js +128 -133
  205. package/utils/searchers.js.map +1 -1
  206. package/utils/store.amd.js +2 -2
  207. package/utils/store.amd.js.map +1 -1
  208. package/utils/store.js +2 -7
  209. package/utils/string.amd.js +2 -2
  210. package/utils/string.amd.js.map +1 -1
  211. package/utils/string.js +120 -147
  212. package/utils/string.js.map +1 -1
  213. package/utils/system.amd.js +2 -2
  214. package/utils/system.amd.js.map +1 -1
  215. package/utils/system.js +25 -28
  216. package/utils/system.js.map +1 -1
  217. package/utils/url.amd.js +3 -3
  218. package/utils/url.amd.js.map +1 -1
  219. package/utils/url.js +36 -47
  220. package/utils/url.js.map +1 -1
  221. package/.chunks/core-Dgj_YGWh.es.js +0 -268
  222. package/.chunks/core-Dgj_YGWh.es.js.map +0 -1
  223. package/.chunks/core-DzDFXOdI.amd.js +0 -2
  224. package/.chunks/core-DzDFXOdI.amd.js.map +0 -1
  225. package/.chunks/datepicker-oa8ZwRhq.amd.js +0 -2
  226. package/.chunks/datepicker-oa8ZwRhq.amd.js.map +0 -1
  227. package/.chunks/datepicker-qToxk2nN.es.js +0 -41
  228. package/.chunks/datepicker-qToxk2nN.es.js.map +0 -1
  229. package/.chunks/dialog_regionSelectorRegions-CZ0tMVSq.amd.js +0 -2
  230. package/.chunks/dialog_regionSelectorRegions-CZ0tMVSq.amd.js.map +0 -1
  231. package/.chunks/dialog_regionSelectorRegions-qDW2Ejsv.es.js +0 -180
  232. package/.chunks/dialog_regionSelectorRegions-qDW2Ejsv.es.js.map +0 -1
  233. package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-BBix_8WK.amd.js +0 -2
  234. package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-BBix_8WK.amd.js.map +0 -1
  235. package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-CJ97l1ST.es.js +0 -323
  236. package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-CJ97l1ST.es.js.map +0 -1
  237. package/.chunks/field-Cvv0SRcJ.amd.js +0 -2
  238. package/.chunks/field-Cvv0SRcJ.amd.js.map +0 -1
  239. package/.chunks/field-CyyFzM-Y.es.js +0 -16
  240. package/.chunks/field-CyyFzM-Y.es.js.map +0 -1
  241. package/.chunks/forms-DDNzqU6o.amd.js +0 -3
  242. package/.chunks/forms-DDNzqU6o.amd.js.map +0 -1
  243. package/.chunks/forms-DtC-EKJL.es.js +0 -2053
  244. package/.chunks/forms-DtC-EKJL.es.js.map +0 -1
  245. package/.chunks/index-DLUtoTUg.amd.js +0 -2
  246. package/.chunks/index-DLUtoTUg.amd.js.map +0 -1
  247. package/.chunks/index-DkQWJkMc.es.js +0 -54
  248. package/.chunks/index-DkQWJkMc.es.js.map +0 -1
  249. package/.chunks/lazy-DDNqYkXn.amd.js +0 -2
  250. package/.chunks/lazy-DDNqYkXn.amd.js.map +0 -1
  251. package/.chunks/lazy-HKSyLh72.es.js +0 -75
  252. package/.chunks/lazy-HKSyLh72.es.js.map +0 -1
  253. package/.chunks/notice-BvQl911b.es.js +0 -191
  254. package/.chunks/notice-BvQl911b.es.js.map +0 -1
  255. package/.chunks/notice-CJ3WOTCM.amd.js +0 -4
  256. package/.chunks/notice-CJ3WOTCM.amd.js.map +0 -1
  257. package/.chunks/page.vue_vue_type_script_setup_true_lang-Dd5-B4Ss.es.js +0 -139
  258. package/.chunks/page.vue_vue_type_script_setup_true_lang-Dd5-B4Ss.es.js.map +0 -1
  259. package/.chunks/page.vue_vue_type_script_setup_true_lang-fl6-Ql4d.amd.js +0 -2
  260. package/.chunks/page.vue_vue_type_script_setup_true_lang-fl6-Ql4d.amd.js.map +0 -1
  261. package/.chunks/policy.vue_vue_type_style_index_0_lang-Bv3LwNDC.es.js +0 -519
  262. package/.chunks/policy.vue_vue_type_style_index_0_lang-Bv3LwNDC.es.js.map +0 -1
  263. package/.chunks/policy.vue_vue_type_style_index_0_lang-Da7rztT5.amd.js +0 -2
  264. package/.chunks/policy.vue_vue_type_style_index_0_lang-Da7rztT5.amd.js.map +0 -1
  265. package/.chunks/popup-OuDglAOF.es.js +0 -470
  266. package/.chunks/popup-OuDglAOF.es.js.map +0 -1
  267. package/.chunks/popup-yXIpyok3.amd.js +0 -2
  268. package/.chunks/popup-yXIpyok3.amd.js.map +0 -1
  269. package/.chunks/popupHint.vue_vue_type_style_index_0_lang-Bu_HvFoW.amd.js +0 -2
  270. package/.chunks/popupHint.vue_vue_type_style_index_0_lang-Bu_HvFoW.amd.js.map +0 -1
  271. package/.chunks/popupHint.vue_vue_type_style_index_0_lang-DAQIAxvu.es.js +0 -209
  272. package/.chunks/popupHint.vue_vue_type_style_index_0_lang-DAQIAxvu.es.js.map +0 -1
  273. package/.chunks/punycode.es6-CNOnFR2-.amd.js +0 -2
  274. package/.chunks/punycode.es6-CNOnFR2-.amd.js.map +0 -1
  275. package/.chunks/punycode.es6-CgGegfA_.es.js +0 -134
  276. package/.chunks/store-CX_6ZXhO.es.js +0 -29
  277. package/.chunks/store-YRW59xEF.amd.js +0 -2
  278. package/.chunks/store-YRW59xEF.amd.js.map +0 -1
  279. package/.chunks/utils-BNzP9anP.es.js +0 -78
  280. package/.chunks/utils-BNzP9anP.es.js.map +0 -1
  281. package/.chunks/utils-CWn_G7OO.amd.js +0 -2
  282. package/.chunks/utils-CWn_G7OO.amd.js.map +0 -1
  283. package/.chunks/utils-DIviuVEw.amd.js +0 -2
  284. package/.chunks/utils-DIviuVEw.amd.js.map +0 -1
  285. package/.chunks/utils-Dma85ehT.es.js +0 -288
  286. package/.chunks/utils-Dma85ehT.es.js.map +0 -1
  287. package/.chunks/widgetInput.vue_vue_type_script_setup_true_lang-CX_BOcVY.es.js +0 -39
  288. package/.chunks/widgetInput.vue_vue_type_script_setup_true_lang-CX_BOcVY.es.js.map +0 -1
  289. package/.chunks/widgetInput.vue_vue_type_script_setup_true_lang-CkOmb3VD.amd.js +0 -2
  290. package/.chunks/widgetInput.vue_vue_type_script_setup_true_lang-CkOmb3VD.amd.js.map +0 -1
  291. package/api/index.js.map +0 -1
  292. package/assets/policy.css +0 -1
  293. package/assets/popupHint.css +0 -1
  294. package/core/app.js.map +0 -1
  295. package/dialog/dialog.js.map +0 -1
  296. package/forms/forms.js.map +0 -1
  297. package/forms/helpers.js.map +0 -1
  298. package/formsExt/formsExt.js.map +0 -1
  299. package/popup/popup.js.map +0 -1
  300. package/popup/worker.js.map +0 -1
  301. package/src/src/components/project/groupSelector/utils.d.ts +0 -37
  302. package/utils/date.js.map +0 -1
  303. package/utils/device.js.map +0 -1
  304. package/utils/lodash.js.map +0 -1
  305. package/utils/store.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"],"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, UnwrapNestedRefs } from 'vue';\nimport { computed, ref } from 'vue';\nimport Core from '@/core/core/core';\nimport { defineStore, useStore, type Store as DefineStore } from '@/core/utils/store';\nimport StoreLocalStorage from '@/core/utils/store/localStorage';\nimport type { Props, Store } from './types';\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>): UnwrapNestedRefs<Store> & DefineStore => {\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 './types';\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 name=\"default\" 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 name=\"default\"></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-1);\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, ref, useSlots, watch } from 'vue';\nimport { TopPopup } from '../../popup/popup';\nimport { getHash, setHash } from '@/core/utils/route';\n\nimport type { MenuItem, PropsMenu, PropsMenuItem } from './types';\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\n</script>\n\n<template>\n\t<div\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: var(--top-tabsView-menu-border-bottom-width) 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-tabsView-menu-opener-padding);\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 Core from '@/core/core/core';\nimport { delHash } from '@/core/utils/route';\nimport type { Props } from './types';\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\t--top-tabsView-menu-border-bottom-width: 1px;\n\t--top-tabsView-menu-opener-padding: var(--top-padding-2);\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\n@media only screen and (max-width: 900px) {\n\t:root {\n\t\t/* Суммарно должна быть высота элемента \".top-tabsView_menu\" */\n\t\t--top-tabsView-contents-offset-top: calc(var(--top-icon-size) + var(--top-tabsView-menu-opener-padding) * 2 + var(--top-tabsView-menu-border-bottom-width));\n\t}\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 './types';\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"],"names":["genStorageKey","stateName","stateKey","StoreLocalStorage","store","localStorageValue","localStorageKey","popstateCallbacks","e","defineTabsStore","props","model","store$1","injectionKey","showMenuInPopup","vue","forms","isShort","component","scrollable","pageMod","popstateCallback","_e","useTabsStore","href","tagName","popupHint_vue_vue_type_style_index_0_lang","onClick","__props","_ctx","checkComponentIsLoading","preResolveComponent","condition","slots","menuItemByName","setMenuItemByNameFromItems","menuItems","subComponent","_sfc_main$4","activeMenuItem","numberChanged","countChanged","setMenuItemByName","activeItemName","isLoading","utils_route","_hoisted_1$1","_hoisted_4","_cache","$event","uid","componentRef","_hoisted_1"],"mappings":"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"}
1
+ {"version":3,"sources":["tabsView/tabsView.js","../../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"],"names":["exports","I","L","vue_1","R","z","B","store_DuQpSSLL_esm_js_1","t","forms_CbUt_6Ff_esm_js_1","n","route_js_1","V","H","U","i","popup_DrByVU_k_esm_js_1","o","W","G","system_js_1","K","q","J","Y","X","Z","a","c","l","u","Q","r","s","e","$","ee","te","ne"],"mappings":"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","sourcesContent":["define([\"require\", \"exports\", \"../.chunks/forms-CbUt-6Ff.esm.js\", \"../utils/system.js\", \"../utils/route.js\", \"../.chunks/store-DuQpSSLL.esm.js\", \"../.chunks/popup-DrByVU-k.esm.js\", \"vue\"], function (require, exports, forms_CbUt_6Ff_esm_js_1, system_js_1, route_js_1, store_DuQpSSLL_esm_js_1, popup_DrByVU_k_esm_js_1, vue_1) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports.TopTabsViewMenuTitle = exports.TopTabsViewMenuItem = exports.TopTabsView = void 0;\n //#region src/core/utils/store/localStorage.ts\n var I = (e, t) => `top:${String(e)}:${t}`, L = {\n loadLocalStorge: (e, t) => {\n if (!t.$id)\n return;\n let n = I(e, t.$id);\n try {\n let r = JSON.parse(localStorage.getItem(n));\n typeof r == typeof t[e] && (t[e] = r);\n }\n catch {\n console.warn(/* @__PURE__ */ Error(`В localStorage[${n}] не корректный json`));\n }\n },\n addSaverLocalStorge: (e, t) => {\n if (!t.$id)\n return;\n let n = I(e, t.$id);\n (0, vue_1.watch)(() => t[e], () => {\n localStorage.setItem(n, JSON.stringify(t[e]));\n }, { immediate: !0 });\n }\n }, R = /* @__PURE__ */ new Set();\n addEventListener(\"popstate\", (e) => {\n R.forEach((t) => t(e));\n });\n var z = Symbol(), B = (t, n) => {\n let r = (0, store_DuQpSSLL_esm_js_1.t)(z, () => ({\n showMenuInPopup: (0, vue_1.computed)(() => t.showMenuInPopup ?? forms_CbUt_6Ff_esm_js_1.O.state.isMobile),\n pageMod: (0, vue_1.computed)(() => t.pageMod),\n isShort: (0, vue_1.ref)(!1),\n activeItemName: n,\n component: (0, vue_1.ref)(void 0),\n scrollable: (0, vue_1.ref)(!0)\n }), t.idState);\n if (t.isShortable) {\n let e = \"isShort\";\n L.loadLocalStorge(e, r), L.addSaverLocalStorge(e, r);\n }\n return r.$id && R.add((e) => {\n n.value = (0, route_js_1.getHash)(r.$id);\n }), r;\n }, V = () => (0, store_DuQpSSLL_esm_js_1.r)(z), H = {\n key: 1,\n class: \"top-ellipsis\"\n }, U = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"menuItem\",\n props: {\n name: {},\n href: {},\n icon: {},\n disabled: { type: Boolean },\n component: { default: void 0 },\n scrollable: {\n type: Boolean,\n default: !0\n }\n },\n setup(e) {\n let t = e, n = V(), r = (0, vue_1.computed)(() => t.name && n.$id ? (0, route_js_1.genHash)(n.$id, t.name) : t.href), i = (0, vue_1.computed)(() => n.showMenuInPopup ? popup_DrByVU_k_esm_js_1.o : r ? \"a\" : \"button\"), o = (e) => {\n !t.href && r.value && e.preventDefault(), t.name && (n.activeItemName = t.name);\n };\n return (t, a) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.resolveDynamicComponent)(i.value), {\n target: \"_self\",\n class: (0, vue_1.normalizeClass)({\n \"top-tabsView_menuItem\": !(0, vue_1.unref)(n).showMenuInPopup,\n \"top-active\": e.name && (0, vue_1.unref)(n).activeItemName === e.name,\n \"top-disabled\": e.disabled,\n \"top-spa-disabled\": !0\n }),\n href: r.value,\n \"data-top-icon\": e.icon || void 0,\n disabled: e.disabled || void 0,\n onClick: o\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.unref)(n).showMenuInPopup ? (0, vue_1.renderSlot)(t.$slots, \"default\", { key: 0 }) : t.$slots.default && !(0, vue_1.unref)(n).isShort ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", H, [(0, vue_1.renderSlot)(t.$slots, \"default\")])) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n _: 3\n }, 8, [\n \"class\",\n \"href\",\n \"data-top-icon\",\n \"disabled\"\n ]));\n }\n }), W = (e) => e?.name === \"AsyncComponentWrapper\" && !e?.__asyncResolved, G = async (e, t) => {\n e?.name === \"AsyncComponentWrapper\" && (e?.__asyncResolved || (e.__asyncLoader(), await (0, system_js_1.sleepWhile)(() => t() && W(e), 200)));\n }, K = { class: \"top-tabsView_menuOpener\" }, q = [\"data-top-icon\"], J = { class: \"top-ellipsis\" }, Y = { class: \"top-tabsView_menuList\" }, X = {\n key: 0,\n class: \"top-tabsView_menuFooter\"\n }, Z = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"menu\",\n props: /* @__PURE__ */ (0, vue_1.mergeModels)({\n isShortable: { type: Boolean },\n isLoading: { type: Boolean }\n }, {\n isLoading: {},\n isLoadingModifiers: {}\n }),\n emits: [\"update:isLoading\"],\n setup(e) {\n let t = (0, vue_1.useModel)(e, \"isLoading\"), n = V(), r = (0, vue_1.useSlots)(), i = /* @__PURE__ */ new Map(), a = () => {\n if (!r.default)\n return;\n let e = r.default({}).find((e) => e.key === \"_menu\");\n e && c(e.children);\n }, c = (e) => {\n e.forEach((e) => {\n if (e.type.__name && e.type.__name !== U.__name)\n return;\n if (!e.type.__name && typeof e.children == \"object\") {\n c(e.children);\n return;\n }\n if (!e.props?.name || e.props?.disabled)\n return;\n let t = {\n title: (e.children.default?.()[0].children).trim(),\n icon: e.props.icon,\n component: e.props.component ? (0, vue_1.markRaw)(e.props.component) : U.props.component.default,\n scrollable: e.props.scrollable ?? U.props.scrollable.default\n };\n i.set(e.props.name, t);\n });\n }, l = (0, vue_1.ref)(null), u = 0;\n return (0, vue_1.watch)(() => n.activeItemName, async () => {\n let e = ++u;\n if (i.size === 0 && a(), i.size === 0) {\n n.activeItemName = \"\";\n return;\n }\n if (l.value = i.get(n.activeItemName) ?? null, !l.value && n.$id) {\n let e = (0, route_js_1.getHash)(n.$id);\n if (l.value = i.get(e) ?? null, l.value) {\n n.activeItemName = e;\n return;\n }\n }\n if (!l.value) {\n n.activeItemName = i.keys().next().value;\n return;\n }\n if (l.value.component === n.component) {\n t.value = !1;\n return;\n }\n n.$id && (0, route_js_1.setHash)(n.$id, n.activeItemName, !1), t.value = !0, await G(l.value.component, () => e === u), e === u && (n.scrollable = l.value.scrollable, n.component = l.value.component, l.value && !n.component && console.warn(`Компонент вкладки ${n.activeItemName} не найден. Добавьте props.component для пункта меню ${n.activeItemName}.`));\n }, { immediate: !0 }), (t, r) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-tabsView_menu\": !0,\n \"top-tabsView_menu-inPopup_0\": !(0, vue_1.unref)(n).showMenuInPopup,\n \"top-tabsView_menu-inPopup_1\": (0, vue_1.unref)(n).showMenuInPopup,\n \"top-tabsView_menu-short\": (0, vue_1.unref)(n).isShort && !(0, vue_1.unref)(n).showMenuInPopup\n }) }, [(0, vue_1.unref)(n).showMenuInPopup ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_DrByVU_k_esm_js_1.s), { key: 0 }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"div\", K, [l.value ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", {\n key: 0,\n class: \"top-tabsView_menuOpenerActiveItem\",\n \"data-top-icon\": l.value.icon\n }, [(0, vue_1.createElementVNode)(\"span\", J, (0, vue_1.toDisplayString)(l.value.title), 1)], 8, q)) : (0, vue_1.createCommentVNode)(\"\", !0), r[1] ||= (0, vue_1.createElementVNode)(\"div\", {\n class: \"top-tabsView_menuOpenerIcon\",\n \"data-top-icon\": \"\"\n }, null, -1)])]),\n contentList: (0, vue_1.withCtx)(() => [(0, vue_1.renderSlot)(t.$slots, \"default\")]),\n _: 3\n })) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 1 }, [(0, vue_1.createElementVNode)(\"div\", Y, [(0, vue_1.renderSlot)(t.$slots, \"default\")]), e.isShortable ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", X, [e.isShortable ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(U, {\n key: 0,\n icon: (0, vue_1.unref)(n).isShort ? \"\" : \"\",\n onClick: r[0] ||= (e) => (0, vue_1.unref)(n).isShort = !(0, vue_1.unref)(n).isShort\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)((0, vue_1.unref)(n).isShort ? \"\" : \"Свернуть\"), 1)]),\n _: 1\n }, 8, [\"icon\"])) : (0, vue_1.createCommentVNode)(\"\", !0)])) : (0, vue_1.createCommentVNode)(\"\", !0)], 64))], 2));\n }\n }), Q = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tabsView\",\n props: /* @__PURE__ */ (0, vue_1.mergeModels)({\n modelValue: {},\n pageMod: { type: Boolean },\n showMenuInPopup: {\n type: Boolean,\n default: void 0\n },\n isShortable: {\n type: Boolean,\n default: !1\n },\n idState: {}\n }, {\n modelValue: {},\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(n) {\n let r = n, a = B(r, (0, vue_1.useModel)(n, \"modelValue\")), o = Math.random();\n r.pageMod && forms_CbUt_6Ff_esm_js_1.O.state.documentClassModificators.set(o, \"top-hasTabsViewPageMod\"), (0, vue_1.onUnmounted)(() => {\n r.pageMod && forms_CbUt_6Ff_esm_js_1.O.state.documentClassModificators.delete(o), a.$id && (0, route_js_1.delHash)(a.$id, a.activeItemName, !0);\n });\n let s = (0, vue_1.ref)(), c = (0, vue_1.ref)(!1);\n return (0, vue_1.watch)([s, () => a.component], () => {\n c.value = W(a.component);\n }, { immediate: !0 }), (e, i) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-tabsView\": !0,\n \"top-tabsView-pageMod\": r.pageMod,\n \"top-tabsView-inPopup\": (0, vue_1.unref)(a).showMenuInPopup\n }) }, [(0, vue_1.createVNode)(Z, {\n isShortable: n.isShortable,\n isLoading: c.value,\n \"onUpdate:isLoading\": i[0] ||= (e) => c.value = e\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.renderSlot)(e.$slots, \"menu\")]),\n _: 3\n }, 8, [\"isShortable\", \"isLoading\"]), (0, vue_1.createElementVNode)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-tabsView_contents\": !0,\n \"top-tabsView_contents-isLoading\": c.value,\n \"top-tabsView_contents-noScrollable\": !(0, vue_1.unref)(a).scrollable\n }) }, [c.value ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_CbUt_6Ff_esm_js_1.l, { key: 0 })) : (0, vue_1.createCommentVNode)(\"\", !0), ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(vue_1.KeepAlive, null, [((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.resolveDynamicComponent)((0, vue_1.unref)(a).component), {\n ref_key: \"componentRef\",\n ref: s\n }, null, 512))], 1024))], 2)], 2));\n }\n }), $ = {}, ee = { class: \"top-tabsView_menuDelimeter\" };\n exports.TopTabsViewMenuItem = U;\n exports.TopTabsView = Q;\n function te(e, t) {\n return (0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", ee);\n }\n var ne = /* @__PURE__ */ (0, forms_CbUt_6Ff_esm_js_1.u)($, [[\"render\", te]]), re = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"menuTitle\",\n props: { isSubtitle: { type: Boolean } },\n setup(e) {\n let t = V();\n return (n, r) => (0, vue_1.unref)(t).showMenuInPopup ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_DrByVU_k_esm_js_1.o), {\n key: 0,\n type: \"title\"\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.renderSlot)(n.$slots, \"default\")]),\n _: 3\n })) : (0, vue_1.unref)(t).isShort ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(ne, { key: 1 })) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", {\n key: 2,\n class: (0, vue_1.normalizeClass)({\n \"top-tabsView_menuTitle\": !0,\n \"top-tabsView_menuTitle-subtitle\": e.isSubtitle\n })\n }, [(0, vue_1.renderSlot)(n.$slots, \"default\")], 2));\n }\n });\n exports.TopTabsViewMenuTitle = re;\n});\n//# sourceMappingURL=tabsView.js.map\n","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, UnwrapNestedRefs } from 'vue';\nimport { computed, ref } from 'vue';\nimport Core from '@/core/core/core';\nimport { defineStore, useStore, type Store as DefineStore } from '@/core/utils/store';\nimport StoreLocalStorage from '@/core/utils/store/localStorage';\nimport type { Props, Store } from './types';\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>): UnwrapNestedRefs<Store> & DefineStore => {\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 './types';\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 name=\"default\" 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 name=\"default\"></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-1);\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, ref, useSlots, watch } from 'vue';\nimport { TopPopup } from '../../popup/popup';\nimport { getHash, setHash } from '@/core/utils/route';\n\nimport type { MenuItem, PropsMenu, PropsMenuItem } from './types';\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\n</script>\n\n<template>\n\t<div\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: var(--top-tabsView-menu-border-bottom-width) 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-tabsView-menu-opener-padding);\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 Core from '@/core/core/core';\nimport { delHash } from '@/core/utils/route';\nimport type { Props } from './types';\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\t--top-tabsView-menu-border-bottom-width: 1px;\n\t--top-tabsView-menu-opener-padding: var(--top-padding-2);\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\n@media only screen and (max-width: 900px) {\n\t:root {\n\t\t/* Суммарно должна быть высота элемента \".top-tabsView_menu\" */\n\t\t--top-tabsView-contents-offset-top: calc(var(--top-icon-size) + var(--top-tabsView-menu-opener-padding) * 2 + var(--top-tabsView-menu-border-bottom-width));\n\t}\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 './types';\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"]}