@topvisor/ui 1.0.1 → 1.0.3

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