@topvisor/ui 0.9.29 → 0.9.30

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 (29) hide show
  1. package/.chunks/{datepicker-C5l1LY9e.es.js → datepicker-C5qdwKuQ.es.js} +2 -2
  2. package/.chunks/{datepicker-C5l1LY9e.es.js.map → datepicker-C5qdwKuQ.es.js.map} +1 -1
  3. package/.chunks/{forms-BwLbWSIF.es.js → forms-BkBLBZBn.es.js} +56 -58
  4. package/.chunks/{forms-BwLbWSIF.es.js.map → forms-BkBLBZBn.es.js.map} +1 -1
  5. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-C4297RyP.es.js → listItem.vue_vue_type_script_setup_true_lang-CmrUY2go.es.js} +34 -36
  6. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-C4297RyP.es.js.map → listItem.vue_vue_type_script_setup_true_lang-CmrUY2go.es.js.map} +1 -1
  7. package/.chunks/{menu-Czk2awpe.es.js → menu-DMBqYUnZ.es.js} +39 -41
  8. package/.chunks/{menu-Czk2awpe.es.js.map → menu-DMBqYUnZ.es.js.map} +1 -1
  9. package/.chunks/{popup-C5Ha2nU3.es.js → popup-CTCFSYwA.es.js} +2 -2
  10. package/.chunks/{popup-C5Ha2nU3.es.js.map → popup-CTCFSYwA.es.js.map} +1 -1
  11. package/.chunks/{widgetInput-DZXnw5Ms.es.js → widgetInput-Crf7T-Na.es.js} +12 -14
  12. package/.chunks/{widgetInput-DZXnw5Ms.es.js.map → widgetInput-Crf7T-Na.es.js.map} +1 -1
  13. package/core/core.js +1 -1
  14. package/forms/forms.js +1 -1
  15. package/formsExt/formsExt.js +60 -62
  16. package/formsExt/formsExt.js.map +1 -1
  17. package/package.json +1 -1
  18. package/popup/popup.js +2 -2
  19. package/popup/worker.js +2 -2
  20. package/project/project.js +29 -31
  21. package/project/project.js.map +1 -1
  22. package/tabs/tabs.js +21 -23
  23. package/tabs/tabs.js.map +1 -1
  24. package/tabsView/tabsView.js +43 -45
  25. package/tabsView/tabsView.js.map +1 -1
  26. package/utils/date.js +1 -1
  27. package/utils/device.js +1 -1
  28. package/utils/scroll.js +1 -1
  29. package/utils/window.js +1 -1
@@ -1,16 +1,14 @@
1
- import { insertToPage as _ } from "../utils/css.js";
2
- import { defineComponent as C, mergeModels as v, useModel as V, computed as M, openBlock as s, createElementBlock as p, unref as y, createBlock as i, withCtx as a, createVNode as k, createTextVNode as g, toDisplayString as u, Fragment as B, renderList as h, normalizeClass as I, createElementVNode as S, createCommentVNode as b } from "vue";
3
- import { C as A, B as N, a as w } from "../.chunks/forms-BwLbWSIF.es.js";
4
- import { _ as E, b as j } from "../.chunks/listItem.vue_vue_type_script_setup_true_lang-C4297RyP.es.js";
5
- import { M as T } from "../.chunks/menu-Czk2awpe.es.js";
6
- const m = ["../assets/project.css"].map((l) => import.meta.resolve(l));
7
- console.time(m.join());
8
- _(m);
9
- console.timeEnd(m.join());
10
- const $ = {
1
+ import { insertToPage as f } from "../utils/css.js";
2
+ import { defineComponent as C, mergeModels as v, useModel as V, computed as M, openBlock as s, createElementBlock as c, unref as y, createBlock as i, withCtx as r, createVNode as k, createTextVNode as g, toDisplayString as p, Fragment as B, renderList as h, normalizeClass as I, createElementVNode as S, createCommentVNode as b } from "vue";
3
+ import { C as A, B as N, a as w } from "../.chunks/forms-BkBLBZBn.es.js";
4
+ import { _ as E, b as T } from "../.chunks/listItem.vue_vue_type_script_setup_true_lang-CmrUY2go.es.js";
5
+ import { M as $ } from "../.chunks/menu-DMBqYUnZ.es.js";
6
+ const _ = ["../assets/project.css"].map((l) => import.meta.resolve(l));
7
+ f(_);
8
+ const L = {
11
9
  key: 0,
12
10
  class: "top-selectorCompetitors"
13
- }, L = { class: "top-ellipsis" }, P = /* @__PURE__ */ C({
11
+ }, P = { class: "top-ellipsis" }, U = /* @__PURE__ */ C({
14
12
  __name: "selectorCompetitors",
15
13
  props: /* @__PURE__ */ v({
16
14
  modelValue: {},
@@ -22,8 +20,8 @@ const $ = {
22
20
  }),
23
21
  emits: ["update:modelValue"],
24
22
  setup(l) {
25
- const d = l, t = V(l, "modelValue"), f = M(() => {
26
- if (d.showSelectAllItem)
23
+ const u = l, t = V(l, "modelValue"), d = M(() => {
24
+ if (u.showSelectAllItem)
27
25
  return {
28
26
  icon: "",
29
27
  title: "Выбрать все",
@@ -32,63 +30,63 @@ const $ = {
32
30
  content: ""
33
31
  };
34
32
  });
35
- return (n, c) => n.items.length > 1 ? (s(), p("div", $, [
33
+ return (a, m) => a.items.length > 1 ? (s(), c("div", L, [
36
34
  y(A).state.isMobile ? (s(), i(E, { key: 0 }, {
37
- opener: a(() => [
35
+ opener: r(() => [
38
36
  k(N, {
39
37
  class: "top-selectorCompetitors_opener top-select_arrow",
40
38
  color: "theme",
41
39
  icon: ""
42
40
  }, {
43
- default: a(() => {
41
+ default: r(() => {
44
42
  var e;
45
43
  return [
46
- g(u((e = n.items.find((r) => {
44
+ g(p((e = a.items.find((n) => {
47
45
  var o;
48
- return r.value === ((o = t.value) == null ? void 0 : o[0]);
46
+ return n.value === ((o = t.value) == null ? void 0 : o[0]);
49
47
  })) == null ? void 0 : e.content), 1)
50
48
  ];
51
49
  }),
52
50
  _: 1
53
51
  })
54
52
  ]),
55
- contentList: a(() => [
56
- (s(!0), p(B, null, h(n.items, (e, r) => {
53
+ contentList: r(() => [
54
+ (s(!0), c(B, null, h(a.items, (e, n) => {
57
55
  var o;
58
- return s(), i(j, {
56
+ return s(), i(T, {
59
57
  class: I({
60
58
  "top-ellipsis": !0,
61
59
  "top-active": (o = t.value) == null ? void 0 : o.includes(e.value)
62
60
  }),
63
- "data-top-icon2": r === 0 ? "" : "",
61
+ "data-top-icon2": n === 0 ? "" : "",
64
62
  onClick: () => t.value = [e.value]
65
63
  }, {
66
- default: a(() => [
67
- S("span", L, u(e.content), 1)
64
+ default: r(() => [
65
+ S("span", P, p(e.content), 1)
68
66
  ]),
69
67
  _: 2
70
68
  }, 1032, ["class", "data-top-icon2", "onClick"]);
71
69
  }), 256))
72
70
  ]),
73
71
  _: 1
74
- })) : (s(), i(T, {
72
+ })) : (s(), i($, {
75
73
  key: 1,
76
74
  modelValue: t.value,
77
- "onUpdate:modelValue": c[0] || (c[0] = (e) => t.value = e),
78
- items: n.items,
75
+ "onUpdate:modelValue": m[0] || (m[0] = (e) => t.value = e),
76
+ items: a.items,
79
77
  isMultiple: !0,
80
78
  styling: "bar",
81
79
  canBeEmptyMultiple: !1,
82
- selectAllItem: f.value
80
+ selectAllItem: d.value
83
81
  }, null, 8, ["modelValue", "items", "selectAllItem"]))
84
82
  ])) : b("", !0);
85
83
  }
86
- }), U = {
84
+ }), j = {
87
85
  "top-selectorCompetitors_opener": "top-selectorCompetitors_opener",
88
86
  "top-button": "top-button"
89
87
  }, x = {
90
- $style: U
91
- }, H = /* @__PURE__ */ w(P, [["__cssModules", x]]);
88
+ $style: j
89
+ }, H = /* @__PURE__ */ w(U, [["__cssModules", x]]);
92
90
  export {
93
91
  H as SelectorCompetitors
94
92
  };
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sources":["../../src/components/project/selectorCompetitors/selectorCompetitors.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Props } from './selectorCompetitors';\nimport Core from '@/core/core/core';\nimport Button from '@/components/forms/button/button.vue';\nimport Popup from '@/components/popup/popup/popup.vue';\nimport ListItem from '@/components/popup/popup/listItem.vue';\nimport Menu from '@/components/formsExt/menu/menu.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tshowSelectAllItem: true,\n});\nconst model = defineModel<Props['modelValue']>();\n\nconst selectAllItem = computed(() => {\n\tif (props.showSelectAllItem) {\n\t\treturn {\n\t\t\ticon: '',\n\t\t\ttitle: 'Выбрать все', // ### TODO: сделать перевод\n\t\t\tvalue: 'all',\n\t\t\tcontent: '',\n\t\t};\n\t}\n});\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"items.length > 1\"\n\t\tclass=\"top-selectorCompetitors\"\n\t>\n\t\t<Popup v-if=\"Core.state.isMobile\">\n\t\t\t<template #opener>\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-selectorCompetitors_opener top-select_arrow\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t>\n\t\t\t\t\t{{ items.find((item) => item.value === model?.[0])?.content }}\n\t\t\t\t</Button>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<ListItem\n\t\t\t\t\tv-for=\"(item, index) in items\"\n\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t'top-ellipsis': true,\n\t\t\t\t\t\t\t'top-active': model?.includes(item.value)\n\t\t\t\t\t\t}\"\n\t\t\t\t\t:data-top-icon2=\"index === 0 ? '' : ''\"\n\t\t\t\t\t@click=\"() => model = [item.value]\"\n\t\t\t\t>\n\t\t\t\t\t\t<span class=\"top-ellipsis\">\n\t\t\t\t\t\t\t{{ item.content }}\n\t\t\t\t\t\t</span>\n\t\t\t\t</ListItem>\n\t\t\t</template>\n\t\t</Popup>\n\t\t<Menu\n\t\t\tv-else\n\t\t\tv-model=\"model\"\n\t\t\t:items=\"items\"\n\t\t\t:isMultiple=\"true\"\n\t\t\tstyling=\"bar\"\n\t\t\t:canBeEmptyMultiple=\"false\"\n\t\t\t:selectAllItem=\"selectAllItem\"\n\t\t/>\n\t</div>\n</template>\n\n<style module>\n.top-selectorCompetitors_opener.top-button {\n\twidth: 100%;\n}\n</style>"],"names":["props","__props","model","useModel","selectAllItem","computed"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AASA,UAAAA,IAAAC,GAGAC,IAAAC,EAAAF,GAAA,YAAA,GAEAG,IAAAC,EAAA,MAAA;AACC,UAAAL,EAAA;AACC,eAAA;AAAA,UAAO,MAAA;AAAA,UACA,OAAA;AAAA;AAAA,UACC,OAAA;AAAA,UACA,SAAA;AAAA,QACE;AAAA,IAEX,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"project.js","sources":["../../src/components/project/selectorCompetitors/selectorCompetitors.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Props } from './selectorCompetitors';\nimport Core from '@/core/core/core';\nimport Button from '@/components/forms/button/button.vue';\nimport Popup from '@/components/popup/popup/popup.vue';\nimport ListItem from '@/components/popup/popup/listItem.vue';\nimport Menu from '@/components/formsExt/menu/menu.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tshowSelectAllItem: true,\n});\nconst model = defineModel<Props['modelValue']>();\n\nconst selectAllItem = computed(() => {\n\tif (props.showSelectAllItem) {\n\t\treturn {\n\t\t\ticon: '',\n\t\t\ttitle: 'Выбрать все', // ### TODO: сделать перевод\n\t\t\tvalue: 'all',\n\t\t\tcontent: '',\n\t\t};\n\t}\n});\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"items.length > 1\"\n\t\tclass=\"top-selectorCompetitors\"\n\t>\n\t\t<Popup v-if=\"Core.state.isMobile\">\n\t\t\t<template #opener>\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-selectorCompetitors_opener top-select_arrow\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t>\n\t\t\t\t\t{{ items.find((item) => item.value === model?.[0])?.content }}\n\t\t\t\t</Button>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<ListItem\n\t\t\t\t\tv-for=\"(item, index) in items\"\n\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t'top-ellipsis': true,\n\t\t\t\t\t\t\t'top-active': model?.includes(item.value)\n\t\t\t\t\t\t}\"\n\t\t\t\t\t:data-top-icon2=\"index === 0 ? '' : ''\"\n\t\t\t\t\t@click=\"() => model = [item.value]\"\n\t\t\t\t>\n\t\t\t\t\t\t<span class=\"top-ellipsis\">\n\t\t\t\t\t\t\t{{ item.content }}\n\t\t\t\t\t\t</span>\n\t\t\t\t</ListItem>\n\t\t\t</template>\n\t\t</Popup>\n\t\t<Menu\n\t\t\tv-else\n\t\t\tv-model=\"model\"\n\t\t\t:items=\"items\"\n\t\t\t:isMultiple=\"true\"\n\t\t\tstyling=\"bar\"\n\t\t\t:canBeEmptyMultiple=\"false\"\n\t\t\t:selectAllItem=\"selectAllItem\"\n\t\t/>\n\t</div>\n</template>\n\n<style module>\n.top-selectorCompetitors_opener.top-button {\n\twidth: 100%;\n}\n</style>"],"names":["props","__props","model","useModel","selectAllItem","computed"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AASA,UAAAA,IAAAC,GAGAC,IAAAC,EAAAF,GAAA,YAAA,GAEAG,IAAAC,EAAA,MAAA;AACC,UAAAL,EAAA;AACC,eAAA;AAAA,UAAO,MAAA;AAAA,UACA,OAAA;AAAA;AAAA,UACC,OAAA;AAAA,UACA,SAAA;AAAA,QACE;AAAA,IAEX,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/tabs/tabs.js CHANGED
@@ -1,15 +1,13 @@
1
- import { insertToPage as r } from "../utils/css.js";
2
- import { defineComponent as b, openBlock as o, createElementBlock as a, renderSlot as s, createCommentVNode as _, createElementVNode as n, normalizeClass as p, Fragment as i } from "vue";
3
- import { a as d } from "../.chunks/forms-BwLbWSIF.es.js";
4
- const l = ["../assets/tabs.css"].map((e) => import.meta.resolve(e));
5
- console.time(l.join());
6
- r(l);
7
- console.timeEnd(l.join());
8
- const m = {
9
- class: /* @__PURE__ */ p({
1
+ import { insertToPage as c } from "../utils/css.js";
2
+ import { defineComponent as b, openBlock as a, createElementBlock as o, renderSlot as s, createCommentVNode as _, createElementVNode as n, normalizeClass as l, Fragment as i } from "vue";
3
+ import { a as p } from "../.chunks/forms-BkBLBZBn.es.js";
4
+ const r = ["../assets/tabs.css"].map((e) => import.meta.resolve(e));
5
+ c(r);
6
+ const u = {
7
+ class: /* @__PURE__ */ l({
10
8
  "top-tabs": !0
11
9
  })
12
- }, u = {
10
+ }, m = {
13
11
  key: 0,
14
12
  class: "top-tabs_header"
15
13
  }, $ = { class: "top-tabs_contents" }, h = /* @__PURE__ */ b({
@@ -18,9 +16,9 @@ const m = {
18
16
  id: {}
19
17
  },
20
18
  setup(e) {
21
- return (t, c) => (o(), a("div", m, [
19
+ return (t, d) => (a(), o("div", u, [
22
20
  s(t.$slots, "buttons"),
23
- t.$slots.header ? (o(), a("div", u, [
21
+ t.$slots.header ? (a(), o("div", m, [
24
22
  s(t.$slots, "header")
25
23
  ])) : _("", !0),
26
24
  n("div", $, [
@@ -36,7 +34,7 @@ const m = {
36
34
  "top-tabs_content": "top-tabs_content"
37
35
  }, v = {
38
36
  $style: f
39
- }, j = /* @__PURE__ */ d(h, [["__cssModules", v]]), y = ["id", "name", "value", "checked", "disabled"], I = ["for"], M = /* @__PURE__ */ b({
37
+ }, P = /* @__PURE__ */ p(h, [["__cssModules", v]]), y = ["id", "name", "value", "checked", "disabled"], I = ["for"], M = /* @__PURE__ */ b({
40
38
  __name: "tab",
41
39
  props: {
42
40
  tabsId: {},
@@ -46,7 +44,7 @@ const m = {
46
44
  disabled: { type: Boolean }
47
45
  },
48
46
  setup(e) {
49
- return (t, c) => (o(), a(i, null, [
47
+ return (t, d) => (a(), o(i, null, [
50
48
  n("input", {
51
49
  type: "radio",
52
50
  class: "top-tabs_tabInput top-unvisible",
@@ -57,7 +55,7 @@ const m = {
57
55
  disabled: t.disabled
58
56
  }, null, 8, y),
59
57
  n("label", {
60
- class: p({
58
+ class: l({
61
59
  "top-tabs_tabLabel": !0,
62
60
  "top-forms-focusable": !0,
63
61
  "top-disabled": t.disabled
@@ -74,14 +72,14 @@ const m = {
74
72
  "top-disabled": "top-disabled"
75
73
  }, k = {
76
74
  $style: T
77
- }, P = /* @__PURE__ */ d(M, [["__cssModules", k]]), C = ["data-tabs-name"], B = /* @__PURE__ */ b({
75
+ }, V = /* @__PURE__ */ p(M, [["__cssModules", k]]), C = ["data-tabs-name"], B = /* @__PURE__ */ b({
78
76
  __name: "content",
79
77
  props: {
80
78
  name: {}
81
79
  },
82
80
  setup(e) {
83
- return (t, c) => (o(), a("div", {
84
- class: p({
81
+ return (t, d) => (a(), o("div", {
82
+ class: l({
85
83
  "top-tabs_content": !0
86
84
  }),
87
85
  "data-tabs-name": t.name
@@ -91,12 +89,12 @@ const m = {
91
89
  }
92
90
  }), g = {
93
91
  "top-tabs_content": "top-tabs_content"
94
- }, E = {
92
+ }, L = {
95
93
  $style: g
96
- }, V = /* @__PURE__ */ d(B, [["__cssModules", E]]);
94
+ }, z = /* @__PURE__ */ p(B, [["__cssModules", L]]);
97
95
  export {
98
- j as Tabs,
99
- V as TabsContent,
100
- P as TabsTab
96
+ P as Tabs,
97
+ z as TabsContent,
98
+ V as TabsTab
101
99
  };
102
100
  //# sourceMappingURL=tabs.js.map
package/tabs/tabs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"tabs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,18 +1,16 @@
1
- import { insertToPage as j } from "../utils/css.js";
2
- import { watch as L, computed as M, ref as b, defineComponent as $, openBlock as l, createBlock as d, resolveDynamicComponent as C, normalizeClass as g, unref as n, withCtx as w, renderSlot as f, createElementBlock as m, createCommentVNode as v, mergeModels as R, useModel as D, useSlots as F, onMounted as U, onUnmounted as E, createElementVNode as h, toDisplayString as B, Fragment as W, createTextVNode as J, markRaw as q, createVNode as G, KeepAlive as Q } from "vue";
1
+ import { insertToPage as K } from "../utils/css.js";
2
+ import { watch as I, computed as M, ref as b, defineComponent as $, openBlock as l, createBlock as d, resolveDynamicComponent as O, normalizeClass as g, unref as n, withCtx as w, renderSlot as f, createElementBlock as m, createCommentVNode as v, mergeModels as C, useModel as R, useSlots as U, onMounted as W, onUnmounted as D, createElementVNode as h, toDisplayString as T, Fragment as j, createTextVNode as J, markRaw as q, createVNode as G, KeepAlive as Q } from "vue";
3
3
  import { genHash as X, getHash as Y, setHash as Z, delHash as x } from "../utils/route.js";
4
- import { C as ee, a as y, L as te } from "../.chunks/forms-BwLbWSIF.es.js";
4
+ import { C as ee, a as y, L as te } from "../.chunks/forms-BkBLBZBn.es.js";
5
5
  import { d as oe, u as se } from "../.chunks/store-PoMCiuBr.es.js";
6
- import { b as A, _ as ae } from "../.chunks/listItem.vue_vue_type_script_setup_true_lang-C4297RyP.es.js";
6
+ import { b as A, _ as ae } from "../.chunks/listItem.vue_vue_type_script_setup_true_lang-CmrUY2go.es.js";
7
7
  import "../popup/worker.js";
8
8
  import { sleepWhile as ne } from "../utils/system.js";
9
- const I = ["../assets/tabsView.css"].map((t) => import.meta.resolve(t));
10
- console.time(I.join());
11
- j(I);
12
- console.timeEnd(I.join());
13
- const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
9
+ const F = ["../assets/tabsView.css"].map((t) => import.meta.resolve(t));
10
+ K(F);
11
+ const E = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
14
12
  if (!o.$id) return;
15
- const e = z(t, o.$id);
13
+ const e = E(t, o.$id);
16
14
  try {
17
15
  const a = JSON.parse(localStorage.getItem(e));
18
16
  typeof a == typeof o[t] && (o[t] = a);
@@ -21,15 +19,15 @@ const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
21
19
  }
22
20
  }, le = (t, o) => {
23
21
  if (!o.$id) return;
24
- const e = z(t, o.$id);
25
- L(() => o[t], () => {
22
+ const e = E(t, o.$id);
23
+ I(() => o[t], () => {
26
24
  localStorage.setItem(e, JSON.stringify(o[t]));
27
25
  }, { immediate: !0 });
28
- }, O = {
26
+ }, B = {
29
27
  loadLocalStorge: ie,
30
28
  addSaverLocalStorge: le
31
- }, H = Symbol(), re = (t, o) => {
32
- const e = oe(H, () => {
29
+ }, z = Symbol(), re = (t, o) => {
30
+ const e = oe(z, () => {
33
31
  const a = M(() => t.showMenuInPopup ?? ee.state.isMobile), r = M(() => t.pageMod), c = b(!1), s = b(void 0), u = b(!0);
34
32
  return {
35
33
  showMenuInPopup: a,
@@ -42,10 +40,10 @@ const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
42
40
  }, t.idState);
43
41
  if (t.isShortable) {
44
42
  const a = "isShort";
45
- O.loadLocalStorge(a, e), O.addSaverLocalStorge(a, e);
43
+ B.loadLocalStorge(a, e), B.addSaverLocalStorge(a, e);
46
44
  }
47
45
  return e;
48
- }, P = () => se(H), ue = {
46
+ }, L = () => se(z), ue = {
49
47
  key: 1,
50
48
  class: "top-ellipsis"
51
49
  }, pe = /* @__PURE__ */ $({
@@ -59,10 +57,10 @@ const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
59
57
  scrollable: { type: Boolean, default: !0 }
60
58
  },
61
59
  setup(t) {
62
- const o = t, e = P(), a = M(() => o.name && e.$id ? X(e.$id, o.name) : o.href), r = M(() => e.showMenuInPopup ? A : a ? "a" : "button"), c = (s) => {
60
+ 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) => {
63
61
  !o.href && a.value && s.preventDefault(), o.name && (e.activeItemName = o.name);
64
62
  };
65
- return (s, u) => (l(), d(C(r.value), {
63
+ return (s, u) => (l(), d(O(r.value), {
66
64
  target: "_self",
67
65
  class: g({
68
66
  "top-tabsView_menuItem": !n(e).showMenuInPopup,
@@ -91,8 +89,8 @@ const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
91
89
  "top-disabled": "top-disabled"
92
90
  }, me = {
93
91
  $style: ce
94
- }, S = /* @__PURE__ */ y(pe, [["__cssModules", me]]), K = (t) => (t == null ? void 0 : t.name) === "AsyncComponentWrapper" && !(t != null && t.__asyncResolved), de = async (t, o) => {
95
- (t == null ? void 0 : t.name) === "AsyncComponentWrapper" && (t != null && t.__asyncResolved || (t.__asyncLoader(), await ne(() => o() && K(t), 200)));
92
+ }, S = /* @__PURE__ */ y(pe, [["__cssModules", me]]), H = (t) => (t == null ? void 0 : t.name) === "AsyncComponentWrapper" && !(t != null && t.__asyncResolved), de = async (t, o) => {
93
+ (t == null ? void 0 : t.name) === "AsyncComponentWrapper" && (t != null && t.__asyncResolved || (t.__asyncLoader(), await ne(() => o() && H(t), 200)));
96
94
  }, _e = { class: "top-tabsView_menuOpener" }, be = ["data-top-icon"], fe = { class: "top-ellipsis" }, we = /* @__PURE__ */ h("div", {
97
95
  class: "top-tabsView_menuOpenerIcon",
98
96
  "data-top-icon": ""
@@ -101,7 +99,7 @@ const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
101
99
  class: "top-tabsView_menuFooter"
102
100
  }, he = /* @__PURE__ */ $({
103
101
  __name: "menu",
104
- props: /* @__PURE__ */ R({
102
+ props: /* @__PURE__ */ C({
105
103
  isShortable: { type: Boolean },
106
104
  isLoading: { type: Boolean }
107
105
  }, {
@@ -110,23 +108,23 @@ const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
110
108
  }),
111
109
  emits: ["update:isLoading"],
112
110
  setup(t) {
113
- const o = D(t, "isLoading"), e = P(), a = F(), r = /* @__PURE__ */ new Map(), c = () => {
111
+ const o = R(t, "isLoading"), e = L(), a = U(), r = /* @__PURE__ */ new Map(), c = () => {
114
112
  if (!a.default) return;
115
113
  const p = a.default().find((i) => i.key === "_menu");
116
114
  p && p.children.forEach((i) => {
117
- var N, T;
115
+ var k, N;
118
116
  if (i.type.__name !== S.__name || !i.props.name || i.props.disabled) return;
119
- const k = {
120
- title: ((T = (N = i.children).default) == null ? void 0 : T.call(N)[0].children).trim(),
117
+ const P = {
118
+ title: ((N = (k = i.children).default) == null ? void 0 : N.call(k)[0].children).trim(),
121
119
  icon: i.props.icon,
122
120
  component: i.props.component ? q(i.props.component) : S.props.component.default,
123
121
  scrollable: i.props.scrollable ?? S.props.scrollable.default
124
122
  };
125
- r.set(i.props.name, k);
123
+ r.set(i.props.name, P);
126
124
  });
127
125
  }, s = b(null);
128
126
  let u = 0;
129
- L(
127
+ I(
130
128
  () => e.activeItemName,
131
129
  async () => {
132
130
  const p = ++u;
@@ -155,11 +153,11 @@ const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
155
153
  );
156
154
  const _ = b();
157
155
  let V;
158
- return U(() => {
156
+ return W(() => {
159
157
  V = new ResizeObserver(() => {
160
158
  _.value.parentElement.style.setProperty("--top-tabsView-contents-offset-top", _.value.offsetHeight + "px");
161
159
  }), V.observe(_.value);
162
- }), E(() => {
160
+ }), D(() => {
163
161
  V.disconnect();
164
162
  }), (p, i) => (l(), m("div", {
165
163
  ref_key: "elRef",
@@ -179,7 +177,7 @@ const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
179
177
  class: "top-tabsView_menuOpenerActiveItem",
180
178
  "data-top-icon": s.value.icon
181
179
  }, [
182
- h("span", fe, B(s.value.title), 1)
180
+ h("span", fe, T(s.value.title), 1)
183
181
  ], 8, be)) : v("", !0),
184
182
  we
185
183
  ])
@@ -188,7 +186,7 @@ const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
188
186
  f(p.$slots, "default")
189
187
  ]),
190
188
  _: 3
191
- })) : (l(), m(W, { key: 1 }, [
189
+ })) : (l(), m(j, { key: 1 }, [
192
190
  h("div", Ve, [
193
191
  f(p.$slots, "default")
194
192
  ]),
@@ -196,10 +194,10 @@ const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
196
194
  p.isShortable ? (l(), d(S, {
197
195
  key: 0,
198
196
  icon: n(e).isShort ? "" : "",
199
- onClick: i[0] || (i[0] = (k) => n(e).isShort = !n(e).isShort)
197
+ onClick: i[0] || (i[0] = (P) => n(e).isShort = !n(e).isShort)
200
198
  }, {
201
199
  default: w(() => [
202
- J(B(n(e).isShort ? "" : "Свернуть"), 1)
200
+ J(T(n(e).isShort ? "" : "Свернуть"), 1)
203
201
  ]),
204
202
  _: 1
205
203
  }, 8, ["icon"])) : v("", !0)
@@ -223,7 +221,7 @@ const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
223
221
  $style: ge
224
222
  }, Se = /* @__PURE__ */ y(he, [["__cssModules", ye]]), Me = /* @__PURE__ */ $({
225
223
  __name: "tabsView",
226
- props: /* @__PURE__ */ R({
224
+ props: /* @__PURE__ */ C({
227
225
  modelValue: {},
228
226
  pageMod: { type: Boolean },
229
227
  showMenuInPopup: { type: Boolean, default: void 0 },
@@ -235,15 +233,15 @@ const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
235
233
  }),
236
234
  emits: ["update:modelValue"],
237
235
  setup(t) {
238
- const o = t, e = D(t, "modelValue"), a = re(o, e), r = (u) => {
236
+ const o = t, e = R(t, "modelValue"), a = re(o, e), r = (u) => {
239
237
  document.documentElement.classList.toggle("top-hasTabsViewPageMod", u);
240
238
  };
241
- o.pageMod && r(!0), E(() => {
239
+ o.pageMod && r(!0), D(() => {
242
240
  o.pageMod && r(!1), a.$id && x(a.$id, a.activeItemName, !0);
243
241
  });
244
242
  const c = b(), s = b(!1);
245
- return L([c, () => a.component], () => {
246
- s.value = K(a.component);
243
+ return I([c, () => a.component], () => {
244
+ s.value = H(a.component);
247
245
  }, { immediate: !0 }), (u, _) => (l(), m("div", {
248
246
  class: g({
249
247
  "top-tabsView": !0,
@@ -270,7 +268,7 @@ const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
270
268
  }, [
271
269
  s.value ? (l(), d(n(te), { key: 0 })) : v("", !0),
272
270
  (l(), d(Q, null, [
273
- (l(), d(C(n(a).component), {
271
+ (l(), d(O(n(a).component), {
274
272
  ref_key: "componentRef",
275
273
  ref: c
276
274
  }, null, 512))
@@ -286,7 +284,7 @@ const z = (t, o) => `top:${String(t)}:${o}`, ie = (t, o) => {
286
284
  "top-tabsView-inPopup": "top-tabsView-inPopup"
287
285
  }, Ie = {
288
286
  $style: $e
289
- }, Ue = /* @__PURE__ */ y(Me, [["__cssModules", Ie]]), Le = {
287
+ }, We = /* @__PURE__ */ y(Me, [["__cssModules", Ie]]), Le = {
290
288
  "top-tabsView_menuDelimeter": "top-tabsView_menuDelimeter"
291
289
  }, Pe = {}, ke = { class: "top-tabsView_menuDelimeter" };
292
290
  function Ne(t, o) {
@@ -300,7 +298,7 @@ const Te = {
300
298
  isSubtitle: { type: Boolean }
301
299
  },
302
300
  setup(t) {
303
- const o = P();
301
+ const o = L();
304
302
  return (e, a) => n(o).showMenuInPopup ? (l(), d(n(A), {
305
303
  key: 0,
306
304
  type: "title"
@@ -324,10 +322,10 @@ const Te = {
324
322
  "top-tabsView_menuTitle-subtitle": "top-tabsView_menuTitle-subtitle"
325
323
  }, Re = {
326
324
  $style: Ce
327
- }, We = /* @__PURE__ */ y(Oe, [["__cssModules", Re]]);
325
+ }, je = /* @__PURE__ */ y(Oe, [["__cssModules", Re]]);
328
326
  export {
329
- Ue as TabsView,
327
+ We as TabsView,
330
328
  S as TabsViewMenuItem,
331
- We as TabsViewMenuTitle
329
+ je as TabsViewMenuTitle
332
330
  };
333
331
  //# 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"],"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);","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { genHash } from '@/core/utils/route';\nimport { PopupListItem } 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 PopupListItem;\n\t}\n\n\treturn href ? 'a' : 'button';\n});\n\n/**\n * Клик по элементу меню\n */\nconst onClick = (e: MouseEvent) => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (!props.href && href.value) {\n\t\te.preventDefault();\n\t}\n\n\tif (props.name) {\n\t\tstore.activeItemName = props.name;\n\t}\n};\n</script>\n\n<template>\n\t<component\n\t\t:is=\"tagName\"\n\t\ttarget=\"_self\"\n\t\t:class=\"{\n\t\t\t['top-tabsView_menuItem']: !store.showMenuInPopup,\n\t\t\t['top-active']: name && store.activeItemName === name,\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-spa-disabled']: true,\n\t\t}\"\n\t\t:href=\"href\"\n\t\t:data-top-icon=\"icon || undefined\"\n\t\t:disabled=\"disabled || undefined\"\n\t\t@click=\"onClick\"\n\t>\n\t\t<slot v-if=\"store.showMenuInPopup\"></slot>\n\n\t\t<span\n\t\t\tv-else-if=\"$slots.default && !store.isShort\"\n\t\t\tclass=\"top-ellipsis\"\n\t\t>\n\t\t\t<slot></slot>\n\t\t</span>\n\t</component>\n</template>\n\n<style module>\n.top-tabsView_menuItem {\n\t--top-icon-color: var(--color-text-1);\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-secondary-2-opacity);\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>","// 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};","<script setup lang=\"ts\">\nimport { ref, watch, markRaw, useSlots, onMounted, onUnmounted } from 'vue';\nimport type { Ref, Component } from 'vue';\nimport { Popup } from '../../popup/popup';\nimport { sleepWhile } from '@/core/utils/system';\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<Popup 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</Popup>\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-secondary-opacity);\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>","<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 { Loadbar } from '@/components/forms/forms';\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<Loadbar v-if=\"isLoading\"/>\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>","<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-opacity);\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 { PopupListItem } from '../../popup/popup';\n\ndefineProps<PropsMenuTitle>();\n\nconst store = useTabsStore();\n</script>\n\n<template>\n\t<PopupListItem\n\t\tv-if=\"store.showMenuInPopup\"\n\t\ttype=\"title\"\n\t>\n\t\t<slot></slot>\n\t</PopupListItem>\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}\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>"],"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","_sfc_main$5","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"],"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"],"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);","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { genHash } from '@/core/utils/route';\nimport { PopupListItem } 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 PopupListItem;\n\t}\n\n\treturn href ? 'a' : 'button';\n});\n\n/**\n * Клик по элементу меню\n */\nconst onClick = (e: MouseEvent) => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (!props.href && href.value) {\n\t\te.preventDefault();\n\t}\n\n\tif (props.name) {\n\t\tstore.activeItemName = props.name;\n\t}\n};\n</script>\n\n<template>\n\t<component\n\t\t:is=\"tagName\"\n\t\ttarget=\"_self\"\n\t\t:class=\"{\n\t\t\t['top-tabsView_menuItem']: !store.showMenuInPopup,\n\t\t\t['top-active']: name && store.activeItemName === name,\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-spa-disabled']: true,\n\t\t}\"\n\t\t:href=\"href\"\n\t\t:data-top-icon=\"icon || undefined\"\n\t\t:disabled=\"disabled || undefined\"\n\t\t@click=\"onClick\"\n\t>\n\t\t<slot v-if=\"store.showMenuInPopup\"></slot>\n\n\t\t<span\n\t\t\tv-else-if=\"$slots.default && !store.isShort\"\n\t\t\tclass=\"top-ellipsis\"\n\t\t>\n\t\t\t<slot></slot>\n\t\t</span>\n\t</component>\n</template>\n\n<style module>\n.top-tabsView_menuItem {\n\t--top-icon-color: var(--color-text-1);\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-secondary-2-opacity);\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>","// 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};","<script setup lang=\"ts\">\nimport { ref, watch, markRaw, useSlots, onMounted, onUnmounted } from 'vue';\nimport type { Ref, Component } from 'vue';\nimport { Popup } from '../../popup/popup';\nimport { sleepWhile } from '@/core/utils/system';\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<Popup 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</Popup>\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-secondary-opacity);\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>","<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 { Loadbar } from '@/components/forms/forms';\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<Loadbar v-if=\"isLoading\"/>\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>","<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-opacity);\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 { PopupListItem } from '../../popup/popup';\n\ndefineProps<PropsMenuTitle>();\n\nconst store = useTabsStore();\n</script>\n\n<template>\n\t<PopupListItem\n\t\tv-if=\"store.showMenuInPopup\"\n\t\ttype=\"title\"\n\t>\n\t\t<slot></slot>\n\t</PopupListItem>\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}\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>"],"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","_sfc_main$5","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"],"mappings":"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"}
package/utils/date.js CHANGED
@@ -1,4 +1,4 @@
1
- import { d as t, n as s, q as o, o as n, p as r, m as g, s as d } from "../.chunks/forms-BwLbWSIF.es.js";
1
+ import { d as t, n as s, q as o, o as n, p as r, m as g, s as d } from "../.chunks/forms-BkBLBZBn.es.js";
2
2
  export {
3
3
  t as dateFormat,
4
4
  s as dateToString,
package/utils/device.js CHANGED
@@ -1,4 +1,4 @@
1
- import { j as e, g as l, k as i, l as o, h as t, e as c, f as g, c as r, b as S, i as p } from "../.chunks/forms-BwLbWSIF.es.js";
1
+ import { j as e, g as l, k as i, l as o, h as t, e as c, f as g, c as r, b as S, i as p } from "../.chunks/forms-BkBLBZBn.es.js";
2
2
  export {
3
3
  e as get$scroll,
4
4
  l as getCommandKeyLabel,
package/utils/scroll.js CHANGED
@@ -1,4 +1,4 @@
1
- import { _ as c } from "../.chunks/forms-BwLbWSIF.es.js";
1
+ import { _ as c } from "../.chunks/forms-BkBLBZBn.es.js";
2
2
  import n from "./dom.js";
3
3
  const l = (t) => {
4
4
  if (!t || !t.parentElement) return;