@topvisor/ui 1.0.8 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.chunks/datepicker-Cs3C14z5.amd.js +248 -0
- package/.chunks/datepicker-Cs3C14z5.amd.js.map +1 -0
- package/.chunks/datepicker-LNkS97nF.es.js +290 -0
- package/.chunks/datepicker-LNkS97nF.es.js.map +1 -0
- package/.chunks/forms-BydHEF-k.es.js +1928 -0
- package/.chunks/forms-BydHEF-k.es.js.map +1 -0
- package/.chunks/forms-Cq5zFLsO.amd.js +3 -0
- package/.chunks/forms-Cq5zFLsO.amd.js.map +1 -0
- package/.chunks/listItem.vue_vue_type_script_setup_true_lang-B0xTxYZR.amd.js +2 -0
- package/.chunks/listItem.vue_vue_type_script_setup_true_lang-B0xTxYZR.amd.js.map +1 -0
- package/.chunks/listItem.vue_vue_type_script_setup_true_lang-DinMn3Ud.es.js +174 -0
- package/.chunks/listItem.vue_vue_type_script_setup_true_lang-DinMn3Ud.es.js.map +1 -0
- package/.chunks/menu.vue_vue_type_style_index_0_lang-BT-PgdJ5.amd.js +2 -0
- package/.chunks/menu.vue_vue_type_style_index_0_lang-BT-PgdJ5.amd.js.map +1 -0
- package/.chunks/menu.vue_vue_type_style_index_0_lang-C585WUlJ.es.js +109 -0
- package/.chunks/menu.vue_vue_type_style_index_0_lang-C585WUlJ.es.js.map +1 -0
- package/.chunks/{popup-D-G2sXks.es.js → popup-B7AaTfNZ.es.js} +494 -493
- package/.chunks/popup-B7AaTfNZ.es.js.map +1 -0
- package/.chunks/popup-D22VHVHf.amd.js +448 -0
- package/.chunks/popup-D22VHVHf.amd.js.map +1 -0
- package/.chunks/store-CX_6ZXhO.es.js.map +1 -1
- package/.chunks/store-esTid5oI.amd.js.map +1 -1
- package/README.md +86 -86
- package/assets/charts.css +1 -0
- package/assets/core.css +1 -1
- package/assets/forms.css +1 -1
- package/assets/project.css +1 -1
- package/assets/tabsView.css +1 -1
- package/assets/themes/dark.css +1 -1
- package/assets/themes/light.css +1 -1
- package/charts/charts.amd.js +2 -0
- package/charts/charts.amd.js.map +1 -0
- package/charts/charts.d.ts +2 -0
- package/charts/charts.js +120 -0
- package/charts/charts.js.map +1 -0
- package/components/charts/charts.d.ts +3 -0
- package/components/charts/miniChart/miniChart.d.ts +80 -0
- package/components/charts/miniChart/miniChart.vue.d.ts +15 -0
- package/components/charts/miniChart/stories/dummy.d.ts +13 -0
- package/components/charts/miniChart/utils/consts.d.ts +8 -0
- package/components/formsExt/selector2/selector2.vue.d.ts +16 -20
- package/components/popup/alert/alert.vue.d.ts +8 -7
- package/components/popup/confirm/confirm.d.ts +1 -1
- package/components/popup/confirm/confirm.vue.d.ts +8 -7
- package/components/popup/lib/popup.d.ts +1 -1
- package/components/popup/popup/popup.d.ts +8 -4
- package/components/popup/popup/popup.vue.d.ts +8 -8
- package/components/popup/prompt/prompt.d.ts +1 -1
- package/components/popup/prompt/prompt.vue.d.ts +8 -7
- package/components/project/project.d.ts +9 -0
- package/components/project/tagSelector/popupListItem/tagPopupListItem.vue.d.ts +18 -0
- package/components/project/tagSelector/popupListItem/types.d.ts +33 -0
- package/components/project/tagSelector/popupOpener/popupOpener.vue.d.ts +26 -0
- package/components/project/tagSelector/popupOpener/types.d.ts +62 -0
- package/components/project/tagSelector/tagIcon/tagIcon.vue.d.ts +4 -0
- package/components/project/tagSelector/tagIcon/types.d.ts +21 -0
- package/components/project/tagSelector/tagSelector.vue.d.ts +37 -0
- package/components/project/tagSelector/tagsDefaults.d.ts +3 -0
- package/components/project/tagSelector/types.d.ts +138 -0
- package/components/project/tagSelector/utils/el.d.ts +19 -0
- package/components/project/tagSelector/utils/utils.d.ts +14 -0
- package/core/app.amd.js +1 -1
- package/core/app.amd.js.map +1 -1
- package/core/app.js +52 -45
- package/core/app.js.map +1 -1
- package/core/core/core.d.ts +4 -0
- package/core/directives/data.d.ts +10 -0
- package/core/utils/route.d.ts +1 -1
- package/forms/forms.amd.js +1 -1
- package/forms/forms.js +5 -5
- package/forms/helpers.amd.js.map +1 -1
- package/forms/helpers.js.map +1 -1
- package/formsExt/formsExt.amd.js +1 -1
- package/formsExt/formsExt.amd.js.map +1 -1
- package/formsExt/formsExt.js +121 -166
- package/formsExt/formsExt.js.map +1 -1
- package/icomoon/Read Me.txt +7 -7
- package/icomoon/Topvisor icons.json +5845 -5845
- package/icomoon/demo-files/demo.css +161 -161
- package/icomoon/demo-files/demo.js +30 -30
- package/icomoon/demo.html +3379 -3379
- package/icomoon/fonts/Topvisor-2.svg +263 -263
- package/icomoon/style.css +740 -740
- package/package.json +37 -37
- package/popup/popup.amd.js +1 -1
- package/popup/popup.amd.js.map +1 -1
- package/popup/popup.js +103 -108
- package/popup/popup.js.map +1 -1
- package/popup/worker.amd.js +1 -1
- package/popup/worker.amd.js.map +1 -1
- package/popup/worker.js +2 -2
- package/popup/worker.js.map +1 -1
- package/project/project.amd.js +1 -1
- package/project/project.amd.js.map +1 -1
- package/project/project.js +814 -262
- package/project/project.js.map +1 -1
- package/require/css.amd.js +12 -12
- package/tabs/tabs.amd.js +1 -1
- package/tabs/tabs.amd.js.map +1 -1
- package/tabs/tabs.js +41 -59
- package/tabs/tabs.js.map +1 -1
- package/tabsView/tabsView.amd.js +1 -1
- package/tabsView/tabsView.amd.js.map +1 -1
- package/tabsView/tabsView.js +144 -183
- package/tabsView/tabsView.js.map +1 -1
- package/utils/check.amd.js +1 -1
- package/utils/check.amd.js.map +1 -1
- package/utils/check.js +1 -1
- package/utils/check.js.map +1 -1
- package/utils/clipboard.amd.js.map +1 -1
- package/utils/clipboard.js.map +1 -1
- package/utils/date.amd.js +1 -1
- package/utils/date.js +1 -1
- package/utils/device.amd.js +1 -1
- package/utils/device.js +1 -1
- package/utils/dom.amd.js.map +1 -1
- package/utils/dom.js.map +1 -1
- package/utils/image.amd.js.map +1 -1
- package/utils/image.js.map +1 -1
- package/utils/keyboard.amd.js.map +1 -1
- package/utils/keyboard.js.map +1 -1
- package/utils/lodash.amd.js +1 -1
- package/utils/lodash.js +5 -5
- package/utils/number.amd.js.map +1 -1
- package/utils/number.js.map +1 -1
- package/utils/price.amd.js +1 -1
- package/utils/price.amd.js.map +1 -1
- package/utils/price.js +1 -1
- package/utils/price.js.map +1 -1
- package/utils/route.amd.js +1 -1
- package/utils/route.amd.js.map +1 -1
- package/utils/route.js +15 -15
- package/utils/route.js.map +1 -1
- package/utils/scroll.amd.js.map +1 -1
- package/utils/scroll.js.map +1 -1
- package/utils/searchers.amd.js.map +1 -1
- package/utils/searchers.js.map +1 -1
- package/utils/string.amd.js +1 -1
- package/utils/string.amd.js.map +1 -1
- package/utils/string.js +1 -1
- package/utils/string.js.map +1 -1
- package/utils/system.amd.js.map +1 -1
- package/utils/system.js.map +1 -1
- package/utils/url.amd.js.map +1 -1
- package/utils/url.js.map +1 -1
- package/web-types.json +89 -72
- package/.chunks/datepicker-CRfiJCmp.amd.js +0 -248
- package/.chunks/datepicker-CRfiJCmp.amd.js.map +0 -1
- package/.chunks/datepicker-CugKFVIH.es.js +0 -290
- package/.chunks/datepicker-CugKFVIH.es.js.map +0 -1
- package/.chunks/forms-CHiMZ8vg.es.js +0 -2015
- package/.chunks/forms-CHiMZ8vg.es.js.map +0 -1
- package/.chunks/forms-CjYoXTEQ.amd.js +0 -3
- package/.chunks/forms-CjYoXTEQ.amd.js.map +0 -1
- package/.chunks/listItem.vue_vue_type_script_setup_true_lang-Bb7B8CTJ.es.js +0 -174
- package/.chunks/listItem.vue_vue_type_script_setup_true_lang-Bb7B8CTJ.es.js.map +0 -1
- package/.chunks/listItem.vue_vue_type_script_setup_true_lang-CEF3WDJ_.amd.js +0 -2
- package/.chunks/listItem.vue_vue_type_script_setup_true_lang-CEF3WDJ_.amd.js.map +0 -1
- package/.chunks/menu-CHeV29rC.es.js +0 -118
- package/.chunks/menu-CHeV29rC.es.js.map +0 -1
- package/.chunks/menu-D1lnYuWU.amd.js +0 -2
- package/.chunks/menu-D1lnYuWU.amd.js.map +0 -1
- package/.chunks/popup-C4Tne4qA.amd.js +0 -447
- package/.chunks/popup-C4Tne4qA.amd.js.map +0 -1
- package/.chunks/popup-D-G2sXks.es.js.map +0 -1
- package/.chunks/utils-BOlUthaH.es.js +0 -91
- package/.chunks/utils-BOlUthaH.es.js.map +0 -1
- package/.chunks/utils-x88W55mf.amd.js +0 -2
- package/.chunks/utils-x88W55mf.amd.js.map +0 -1
- package/components/project/utils.d.ts +0 -1
- package/core/core.amd.js +0 -2
- package/core/core.amd.js.map +0 -1
- package/core/core.d.ts +0 -4
- package/core/core.js +0 -6
- package/core/core.js.map +0 -1
- package/project/utils.amd.js +0 -2
- package/project/utils.amd.js.map +0 -1
- package/project/utils.d.ts +0 -2
- package/project/utils.js +0 -6
- package/project/utils.js.map +0 -1
- package/test/themes/themes/dark-positions.amd.js +0 -2
- package/test/themes/themes/dark-positions.amd.js.map +0 -1
- package/test/themes/themes/dark-positions.d.ts +0 -1
- package/test/themes/themes/dark-positions.js +0 -2
- package/test/themes/themes/dark-positions.js.map +0 -1
- package/test/themes/themes/dark.amd.js +0 -2
- package/test/themes/themes/dark.amd.js.map +0 -1
- package/test/themes/themes/dark.d.ts +0 -1
- package/test/themes/themes/dark.js +0 -4
- package/test/themes/themes/dark.js.map +0 -1
- package/test/themes/themes/light-positions.amd.js +0 -2
- package/test/themes/themes/light-positions.amd.js.map +0 -1
- package/test/themes/themes/light-positions.d.ts +0 -1
- package/test/themes/themes/light-positions.js +0 -2
- package/test/themes/themes/light-positions.js.map +0 -1
- package/test/themes/themes/light.amd.js +0 -2
- package/test/themes/themes/light.amd.js.map +0 -1
- package/test/themes/themes/light.d.ts +0 -1
- package/test/themes/themes/light.js +0 -4
- package/test/themes/themes/light.js.map +0 -1
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { Core as b } from "../core/app.js";
|
|
2
|
+
import { defineComponent as C, onUpdated as I, openBlock as s, createElementBlock as n, Fragment as $, createElementVNode as H, renderSlot as a, ref as B, toRef as P, watch as N, onUnmounted as D, createBlock as h, unref as R, withCtx as _, createCommentVNode as l, Teleport as T, toDisplayString as M, createVNode as E, normalizeClass as w, resolveDynamicComponent as O, mergeProps as U } from "vue";
|
|
3
|
+
import { a as W } from "./forms-BydHEF-k.es.js";
|
|
4
|
+
import { TopPopupWorker as k } from "../popup/worker.js";
|
|
5
|
+
const g = ["../assets/listItem.css"].map((i) => import.meta.resolve(i));
|
|
6
|
+
b.insertCSSLinkToPage(g, !0);
|
|
7
|
+
const z = /* @__PURE__ */ C({
|
|
8
|
+
__name: "opener",
|
|
9
|
+
props: {
|
|
10
|
+
id: {},
|
|
11
|
+
pos: { default: "3" },
|
|
12
|
+
notch: { type: Boolean, default: !0 },
|
|
13
|
+
openByHover: { type: Boolean },
|
|
14
|
+
posBy: { default: "fixed" }
|
|
15
|
+
},
|
|
16
|
+
setup(i) {
|
|
17
|
+
const t = i, r = t.id || Math.random() + "";
|
|
18
|
+
let p;
|
|
19
|
+
function m(o) {
|
|
20
|
+
setTimeout(() => {
|
|
21
|
+
p = o.nextElementSibling, p && d(p);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
I(() => {
|
|
25
|
+
p && d(p);
|
|
26
|
+
});
|
|
27
|
+
function d(o) {
|
|
28
|
+
o.dataset.topPopup = "#" + r, o.dataset.topPopupId = r, o.dataset.topPopupPos = t.pos, o.dataset.topPopupPosBy = t.posBy, o.dataset.topPopupNotch = t.notch ? "true" : "", o.dataset.topPopupOpenByHover = t.openByHover ? "true" : "";
|
|
29
|
+
}
|
|
30
|
+
return (o, c) => (s(), n($, null, [
|
|
31
|
+
H("template", { ref: m }),
|
|
32
|
+
a(o.$slots, "default")
|
|
33
|
+
], 64));
|
|
34
|
+
}
|
|
35
|
+
}), A = {
|
|
36
|
+
key: 0,
|
|
37
|
+
class: "top-popup_header"
|
|
38
|
+
}, F = {
|
|
39
|
+
key: 0,
|
|
40
|
+
class: "top-as-a closer"
|
|
41
|
+
}, j = {
|
|
42
|
+
key: 1,
|
|
43
|
+
class: "top-popup_widget"
|
|
44
|
+
}, q = {
|
|
45
|
+
key: 2,
|
|
46
|
+
class: "top-popup_content"
|
|
47
|
+
}, G = {
|
|
48
|
+
key: 4,
|
|
49
|
+
class: "top-popup_footer"
|
|
50
|
+
}, J = ["href"], ee = /* @__PURE__ */ C({
|
|
51
|
+
__name: "popup",
|
|
52
|
+
props: {
|
|
53
|
+
id: { default: "" },
|
|
54
|
+
class: {},
|
|
55
|
+
transitionDuration: {},
|
|
56
|
+
footerSupportLink: {},
|
|
57
|
+
pos: { default: "3" },
|
|
58
|
+
notch: { type: Boolean, default: !0 },
|
|
59
|
+
openByHover: { type: Boolean },
|
|
60
|
+
posBy: { default: "fixed" }
|
|
61
|
+
},
|
|
62
|
+
emits: ["open", "close", "scrollContentList"],
|
|
63
|
+
setup(i, { expose: t, emit: r }) {
|
|
64
|
+
const p = i, m = r, d = {
|
|
65
|
+
popup: void 0
|
|
66
|
+
};
|
|
67
|
+
t(d);
|
|
68
|
+
const o = p.id || "top-popup-id-" + Math.random(), c = B(null), y = B(null), f = {
|
|
69
|
+
onOpen: async (e) => {
|
|
70
|
+
e.elPopup && (c.value = e.elPopup), e.elPopupInner && (e.elPopupInner.innerText = "", y.value = e.elPopupInner), f.opened = !0, f.popup = e, d.popup = e, m("open", { elPopup: e.elPopup, elPopupOpener: e.el });
|
|
71
|
+
},
|
|
72
|
+
onClose: (e) => {
|
|
73
|
+
y.value = null, f.opened = !1, f.popup = void 0, m("close", { elPopup: e.elPopup, elPopupOpener: e.el });
|
|
74
|
+
},
|
|
75
|
+
classRef: P(p, "class"),
|
|
76
|
+
opened: !1,
|
|
77
|
+
popup: void 0,
|
|
78
|
+
transitionDurationRef: P(p, "transitionDuration")
|
|
79
|
+
};
|
|
80
|
+
return N(() => p.class, (e, u) => {
|
|
81
|
+
if (!c.value) return;
|
|
82
|
+
const v = (e == null ? void 0 : e.split(" ")) ?? [], S = ((u == null ? void 0 : u.split(" ")) ?? []).filter((L) => !v.includes(L));
|
|
83
|
+
c.value.classList.remove(...S), c.value.classList.add(...v);
|
|
84
|
+
}), k.regVueComponent(o, f), D(() => {
|
|
85
|
+
k.unregVueComponent(o);
|
|
86
|
+
}), (e, u) => (s(), n($, null, [
|
|
87
|
+
e.$slots.opener ? (s(), h(z, {
|
|
88
|
+
key: 0,
|
|
89
|
+
id: R(o),
|
|
90
|
+
pos: e.pos,
|
|
91
|
+
posBy: e.posBy,
|
|
92
|
+
notch: e.notch,
|
|
93
|
+
openByHover: e.openByHover
|
|
94
|
+
}, {
|
|
95
|
+
default: _(() => [
|
|
96
|
+
a(e.$slots, "opener")
|
|
97
|
+
]),
|
|
98
|
+
_: 3
|
|
99
|
+
}, 8, ["id", "pos", "posBy", "notch", "openByHover"])) : l("", !0),
|
|
100
|
+
y.value ? (s(), h(T, {
|
|
101
|
+
key: 1,
|
|
102
|
+
to: y.value
|
|
103
|
+
}, [
|
|
104
|
+
e.$slots.header || e.$core.state.isMobile ? (s(), n("div", A, [
|
|
105
|
+
e.$core.state.isMobile ? (s(), n("span", F, M(e.$i18n.Common.Close), 1)) : l("", !0),
|
|
106
|
+
a(e.$slots, "header")
|
|
107
|
+
])) : l("", !0),
|
|
108
|
+
e.$slots.widget ? (s(), n("div", j, [
|
|
109
|
+
a(e.$slots, "widget")
|
|
110
|
+
])) : l("", !0),
|
|
111
|
+
e.$slots.content ? (s(), n("div", q, [
|
|
112
|
+
a(e.$slots, "content")
|
|
113
|
+
])) : l("", !0),
|
|
114
|
+
e.$slots.contentList ? (s(), n("ul", {
|
|
115
|
+
key: 3,
|
|
116
|
+
class: "top-popup_content",
|
|
117
|
+
onScroll: u[0] || (u[0] = (v) => e.$emit("scrollContentList", v))
|
|
118
|
+
}, [
|
|
119
|
+
a(e.$slots, "contentList")
|
|
120
|
+
], 32)) : l("", !0),
|
|
121
|
+
e.$slots.footer || e.footerSupportLink ? (s(), n("div", G, [
|
|
122
|
+
e.footerSupportLink ? (s(), n("a", {
|
|
123
|
+
key: 0,
|
|
124
|
+
class: "top-popup_footerSupportLink",
|
|
125
|
+
href: e.footerSupportLink,
|
|
126
|
+
target: "_blank"
|
|
127
|
+
}, [
|
|
128
|
+
E(W, { hint: "" })
|
|
129
|
+
], 8, J)) : l("", !0),
|
|
130
|
+
a(e.$slots, "footer")
|
|
131
|
+
])) : l("", !0)
|
|
132
|
+
], 8, ["to"])) : l("", !0)
|
|
133
|
+
], 64));
|
|
134
|
+
}
|
|
135
|
+
}), oe = /* @__PURE__ */ C({
|
|
136
|
+
inheritAttrs: !1,
|
|
137
|
+
__name: "listItem",
|
|
138
|
+
props: {
|
|
139
|
+
type: { default: "button" },
|
|
140
|
+
closeByClick: { type: Boolean, default: !0 }
|
|
141
|
+
},
|
|
142
|
+
setup(i) {
|
|
143
|
+
const t = i;
|
|
144
|
+
return (r, p) => (s(), n("li", {
|
|
145
|
+
class: w({
|
|
146
|
+
"top-popup_liNoSelectable": t.type !== "button"
|
|
147
|
+
})
|
|
148
|
+
}, [
|
|
149
|
+
(s(), h(O(r.$attrs.href ? "a" : "div"), U({
|
|
150
|
+
class: {
|
|
151
|
+
"top-popup_listItem": !0,
|
|
152
|
+
"top-popup_listItem-button": t.type === "button",
|
|
153
|
+
// оформления кнопки
|
|
154
|
+
a: t.type === "button",
|
|
155
|
+
// оформления кнопки, deprecated
|
|
156
|
+
"top-popup_listItem-title": t.type === "title",
|
|
157
|
+
"top-popup_listItem-delimiter": t.type === "delimiter",
|
|
158
|
+
"top-popup-noCloser": !r.closeByClick
|
|
159
|
+
}
|
|
160
|
+
}, r.$attrs), {
|
|
161
|
+
default: _(() => [
|
|
162
|
+
a(r.$slots, "default")
|
|
163
|
+
]),
|
|
164
|
+
_: 3
|
|
165
|
+
}, 16, ["class"]))
|
|
166
|
+
], 2));
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
export {
|
|
170
|
+
ee as _,
|
|
171
|
+
z as a,
|
|
172
|
+
oe as b
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=listItem.vue_vue_type_script_setup_true_lang-DinMn3Ud.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listItem.vue_vue_type_script_setup_true_lang-DinMn3Ud.es.js","sources":["../../src/components/popup/popup/opener.vue","../../src/components/popup/popup/popup.vue","../../src/components/popup/popup/listItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onUpdated } from 'vue';\nimport type { OpenerProps } from './popup';\n\nconst props = withDefaults(defineProps<OpenerProps>(), {\n\tpos: '3',\n\tnotch: true,\n\tposBy: 'fixed',\n});\n\nconst id = props.id || Math.random() + '';\n\nlet elOpener: Element;\n\n/**\n * Необычная функция для проброски props внтурь элемента слота\n *\n * @param el - вспомогательрный элемент для доступа к элементам слота\n */\nfunction render(el: any) {\n\tsetTimeout(() => {\n\t\telOpener = el.nextElementSibling;\n\n\t\tif (elOpener) {\n\t\t\trenderOpener(elOpener);\n\t\t}\n\t});\n}\n\nonUpdated(() => {\n\tif (elOpener) {\n\t\trenderOpener(elOpener);\n\t}\n});\n\nfunction renderOpener(elOpener: any) {\n\t/**\n\t * topPopup - необходимый атрибут для всез Popup\n\t *\n\t * Для Vue вместо него используется атрибут topPopupId\n\t */\n\telOpener.dataset.topPopup = '#' + id;\n\n\telOpener.dataset.topPopupId = id;\n\telOpener.dataset.topPopupPos = props.pos;\n\telOpener.dataset.topPopupPosBy = props.posBy;\n\telOpener.dataset.topPopupNotch = props.notch ? 'true' : '';\n\telOpener.dataset.topPopupOpenByHover = props.openByHover ? 'true' : '';\n}\n</script>\n\n<template>\n\t<template :ref=\"render\"></template>\n\n\t<!-- @slot элемент для открытия Popup -->\n\t<slot></slot>\n</template>\n\n<!-- Использует общий deprecated класс .btn -->\n<style>\nh3[data-top-popup],\ndiv[data-top-popup],\ni[data-top-popup]:not(.btn),\nb[data-top-popup]:not(.btn) {\n\tcursor: pointer;\n\tuser-select: none;\n\tfont-style: normal;\n\ttext-decoration: none;\n\tdisplay: inline-flex;\n\talign-items: center;\n}\n\n[data-top-popup][data-top-popup-disabled] {\n\tpointer-events: none;\n\tcursor: auto !important;\n}\n\ni[contenteditable] {\n\tcursor: text !important;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { onUnmounted, ref, toRef, watch } from 'vue';\nimport TopHint from '@/components/forms/hint/hint.vue';\nimport type PopupClass from '@/components/popup/lib/popup';\nimport type { Emits, Props } from './popup';\nimport Opener from './opener.vue';\nimport Worker from '@/components/popup/lib/worker';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tid: '',\n\tpos: '3',\n\tnotch: true,\n\tposBy: 'fixed',\n});\n\nconst emit = defineEmits<Emits>();\n\nconst expose = {\n\tpopup: undefined as PopupClass | undefined,\n};\ndefineExpose(expose);\n\nconst id = props.id || 'top-popup-id-' + Math.random() + '';\n\nconst elPopupRef = ref<HTMLElement | null>(null);\nconst elPopupInnerRef = ref<HTMLElement | null>(null);\n\n// см. lib/popup\nconst onOpen = async (popup: PopupClass) => {\n\tif (popup.elPopup) elPopupRef.value = popup.elPopup;\n\n\tif (popup.elPopupInner) {\n\t\tpopup.elPopupInner.innerText = '';\n\n\t\telPopupInnerRef.value = popup.elPopupInner;\n\t}\n\n\tvueConnector.opened = true;\n\tvueConnector.popup = popup;\n\n\texpose.popup = popup;\n\n\temit('open', { elPopup: popup.elPopup!, elPopupOpener: popup.el });\n};\n\n// см. lib/popup\nconst onClose = (popup: PopupClass) => {\n\telPopupInnerRef.value = null;\n\n\tvueConnector.opened = false;\n\tvueConnector.popup = undefined;\n\n\temit('close', { elPopup: popup.elPopup!, elPopupOpener: popup.el });\n};\n\nconst vueConnector = {\n\tonOpen,\n\tonClose,\n\tclassRef: toRef(props, 'class'),\n\topened: false,\n\tpopup: undefined as PopupClass | undefined,\n\ttransitionDurationRef: toRef(props, 'transitionDuration'),\n};\n\nwatch(() => props.class, (newValue, oldValue) => {\n\tif (!elPopupRef.value) return;\n\n\tconst newClasses = newValue?.split(' ') ?? [];\n\tconst oldClasses = oldValue?.split(' ') ?? [];\n\n\tconst delClasses = oldClasses.filter((oldClass) => !newClasses.includes(oldClass));\n\n\telPopupRef.value.classList.remove(...delClasses);\n\telPopupRef.value.classList.add(...newClasses);\n});\n\nWorker.regVueComponent(id, vueConnector);\n\nonUnmounted(() => {\n\tWorker.unregVueComponent(id);\n});\n</script>\n\n<template>\n\t<Opener\n\t\tv-if=\"$slots.opener\"\n\t\t:id=\"id\"\n\t\t:pos=\"pos\"\n\t\t:posBy=\"posBy\"\n\t\t:notch=\"notch\"\n\t\t:openByHover=\"openByHover\"\n\t>\n\t\t<!-- @slot элемент для открытия Popup -->\n\t\t<slot name=\"opener\"></slot>\n\t</Opener>\n\n\t<!-- Это шаблон для компонента Popup, сам Popup генерируется в js и может находиться где угодно -->\n\t<!-- elPopupInnerRef будет установлен только после открытия и будет сброшен сразу после закрытия Popup -->\n\t<teleport\n\t\tv-if=\"elPopupInnerRef\"\n\t\t:to=\"elPopupInnerRef\"\n\t>\n\t\t<div v-if=\"$slots.header || $core.state.isMobile\" class=\"top-popup_header\">\n\t\t\t<span\n\t\t\t\tv-if=\"$core.state.isMobile\"\n\t\t\t\tclass=\"top-as-a closer\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.Close }}\n\t\t\t</span>\n\n\t\t\t<!-- @slot Шапка -->\n\t\t\t<slot name=\"header\"></slot>\n\t\t</div>\n\n\t\t<div v-if=\"$slots.widget\" class=\"top-popup_widget\">\n\t\t\t<!-- @slot Виджет -->\n\t\t\t<slot name=\"widget\"></slot>\n\t\t</div>\n\n\t\t<div v-if=\"$slots.content\" class=\"top-popup_content\">\n\t\t\t<!-- @slot Контент в свободной форме -->\n\t\t\t<slot name=\"content\"></slot>\n\t\t</div>\n\n\t\t<ul\n\t\t\tv-if=\"$slots.contentList\"\n\t\t\tclass=\"top-popup_content\"\n\t\t\t@scroll=\"$emit('scrollContentList', $event)\"\n\t\t>\n\t\t\t<!-- @slot Контент в виде списка, для вставки элементов списка используйте компонент popup/listItem -->\n\t\t\t<slot name=\"contentList\"></slot>\n\t\t</ul>\n\n\t\t<div v-if=\"$slots.footer || footerSupportLink\" class=\"top-popup_footer\">\n\t\t\t<a\n\t\t\t\tv-if=\"footerSupportLink\"\n\t\t\t\tclass=\"top-popup_footerSupportLink\"\n\t\t\t\t:href=\"footerSupportLink\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t>\n\t\t\t\t<TopHint hint=\"\"/>\n\t\t\t</a>\n\n\t\t\t<!-- @slot Футер -->\n\t\t\t<slot name=\"footer\"></slot>\n\t\t</div>\n\t</teleport>\n</template>\n\n<style>\n.top-popup_footerSupportLink {\n\tmargin-right: auto;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { ListItemProps } from './popup';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<ListItemProps>(), {\n\ttype: 'button',\n\tcloseByClick: true,\n});\n</script>\n\n<template>\n\t<li\n\t\t:class=\"{\n\t\t'top-popup_liNoSelectable': props.type !== 'button'\n\t}\"\n\t>\n\t\t<component\n\t\t\t:is=\"$attrs.href ? 'a' : 'div'\"\n\t\t\t:class=\"{\n\t\t\t\t'top-popup_listItem': true,\n\t\t\t\t'top-popup_listItem-button': props.type === 'button', // оформления кнопки\n\t\t\t\t'a': props.type === 'button', // оформления кнопки, deprecated\n\t\t\t\t'top-popup_listItem-title': props.type === 'title',\n\t\t\t\t'top-popup_listItem-delimiter': props.type === 'delimiter',\n\t\t\t\t'top-popup-noCloser': !closeByClick\n\t\t\t}\"\n\t\t\t:=$attrs\n\t\t>\n\t\t\t<slot></slot>\n\t\t</component>\n\t</li>\n</template>\n"],"names":["props","__props","id","elOpener","render","el","renderOpener","onUpdated","elOpener2","emit","__emit","expose","__expose","elPopupRef","ref","elPopupInnerRef","vueConnector","popup","toRef","watch","newValue","oldValue","newClasses","delClasses","oldClass","Worker","onUnmounted"],"mappings":";;;;;;;;;;;;;;;;AAIA,UAAAA,IAAAC,GAMAC,IAAAF,EAAA,MAAA,KAAA,OAAA,IAAA;AAEA,QAAAG;AAOA,aAAAC,EAAAC,GAAA;AACC,iBAAA,MAAA;AACC,QAAAF,IAAAE,EAAA,oBAEAF,KACCG,EAAAH,CAAA;AAAA,MACD,CAAA;AAAA,IACA;AAGF,IAAAI,EAAA,MAAA;AACC,MAAAJ,KACCG,EAAAH,CAAA;AAAA,IACD,CAAA;AAGD,aAAAG,EAAAE,GAAA;AAMC,MAAAA,EAAA,QAAA,WAAA,MAAAN,GAEAM,EAAA,QAAA,aAAAN,GACAM,EAAA,QAAA,cAAAR,EAAA,KACAQ,EAAA,QAAA,gBAAAR,EAAA,OACAQ,EAAA,QAAA,gBAAAR,EAAA,QAAA,SAAA,IACAQ,EAAA,QAAA,sBAAAR,EAAA,cAAA,SAAA;AAAA,IAAoE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvCrE,UAAAA,IAAAC,GAOAQ,IAAAC,GAEAC,IAAA;AAAA,MAAe,OAAA;AAAA,IACP;AAER,IAAAC,EAAAD,CAAA;AAEA,UAAAT,IAAAF,EAAA,MAAA,kBAAA,KAAA,OAAA,GAEAa,IAAAC,EAAA,IAAA,GACAC,IAAAD,EAAA,IAAA,GA8BAE,IAAA;AAAA,MAAqB,QA3BrB,OAAAC,MAAA;AACC,QAAAA,EAAA,YAAAJ,EAAA,QAAAI,EAAA,UAEAA,EAAA,iBACCA,EAAA,aAAA,YAAA,IAEAF,EAAA,QAAAE,EAAA,eAGDD,EAAA,SAAA,IACAA,EAAA,QAAAC,GAEAN,EAAA,QAAAM,GAEAR,EAAA,QAAA,EAAA,SAAAQ,EAAA,SAAA,eAAAA,EAAA,GAAA,CAAA;AAAA,MAAiE;AAAA,MAcjE,SAVD,CAAAA,MAAA;AACC,QAAAF,EAAA,QAAA,MAEAC,EAAA,SAAA,IACAA,EAAA,QAAA,QAEAP,EAAA,SAAA,EAAA,SAAAQ,EAAA,SAAA,eAAAA,EAAA,GAAA,CAAA;AAAA,MAAkE;AAAA,MAKlE,UAAAC,EAAAlB,GAAA,OAAA;AAAA,MAC8B,QAAA;AAAA,MACtB,OAAA;AAAA,MACD,uBAAAkB,EAAAlB,GAAA,oBAAA;AAAA,IACiD;AAGzD,WAAAmB,EAAA,MAAAnB,EAAA,OAAA,CAAAoB,GAAAC,MAAA;AACC,UAAA,CAAAR,EAAA,MAAA;AAEA,YAAAS,KAAAF,KAAA,gBAAAA,EAAA,MAAA,SAAA,CAAA,GAGAG,MAFAF,KAAA,gBAAAA,EAAA,MAAA,SAAA,CAAA,GAEA,OAAA,CAAAG,MAAA,CAAAF,EAAA,SAAAE,CAAA,CAAA;AAEA,MAAAX,EAAA,MAAA,UAAA,OAAA,GAAAU,CAAA,GACAV,EAAA,MAAA,UAAA,IAAA,GAAAS,CAAA;AAAA,IAA4C,CAAA,GAG7CG,EAAA,gBAAAvB,GAAAc,CAAA,GAEAU,EAAA,MAAA;AACC,MAAAD,EAAA,kBAAAvB,CAAA;AAAA,IAA2B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxE5B,UAAAF,IAAAC;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
define(["require","exports","vue","./forms-Cq5zFLsO.amd","../require/css.amd!../assets/menu.css"],function(_,m,e,u){"use strict";if(typeof e>"u")var e=window.Vue;const y={key:0,class:"top-menu_selectAll"},h=e.defineComponent({__name:"menu",props:e.mergeModels({modelValue:{},items:{},isMultiple:{type:Boolean},canBeEmptyMultiple:{type:Boolean},styling:{default:"default"},selectAllItem:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(f){const n=f,a=e.useModel(f,"modelValue"),r=e.ref();!n.isMultiple&&!(typeof a.value=="string"||a.value instanceof String)&&console.warn('Type check failed for prop "modelValue". Expected String: '+typeof a.value),n.isMultiple&&!Array.isArray(a.value)&&console.warn('Type check failed for prop "modelValue". Expected Array: '+typeof a.value),n.isMultiple&&!n.canBeEmptyMultiple&&Array.isArray(a.value)&&!a.value.length&&(a.value=[n.items[0].href??n.items[0].value]);const g=l=>Array.isArray(a.value)?a.value.includes(l.value):l.value===a.value,A=(l,o=!1)=>{if(Array.isArray(a.value)){let t=a.value.slice();if(o){t.length||(t=n.items.map(c=>c.value));const s=t.indexOf(l.value);s===-1?t.push(l.value):t.splice(s,1)}else t.length===1&&t[0]===l.value?t=[]:t=[l.value];!n.canBeEmptyMultiple&&!t.length&&(t=[l.value]),a.value=t;return}a.value=l.value},k=l=>{if(r.value.scrollWidth<=r.value.offsetWidth||l.shiftKey||Math.abs(l.deltaY)<50)return;l.preventDefault();const o=l.deltaY>0?30:-30;r.value.scrollLeft=r.value.scrollLeft+o},v=(l=!0)=>{var d,p;const o=r.value.querySelector(".top-active");if(!o)return;const t=24,s=o.offsetLeft-r.value.offsetLeft-t,c=o.offsetLeft-r.value.offsetLeft+o.clientWidth+t,B=r.value.scrollLeft,V=r.value.clientWidth+r.value.scrollLeft;let i;s<B&&(i=s),c>V&&(i=c-r.value.clientWidth),i!==void 0&&(u.isSafari()?(p=(d=u.Core).$)==null||p.call(d,r.value).animate({scrollLeft:i},l?200:0):r.value.scrollTo({left:i,behavior:l?"smooth":"auto"}))},M=()=>{if(Array.isArray(a.value)){if(a.value.length===n.items.length){a.value=[n.items[0].href??n.items[0].value];return}a.value=n.items.map(l=>l.href??l.value)}};return e.onMounted(()=>v(!1)),e.onUpdated(()=>v(!0)),(l,o)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"el",ref:r,class:e.normalizeClass({"top-menu":!0,["top-style_"+l.styling]:!0}),onWheel:k},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.items,t=>(e.openBlock(),e.createBlock(u._sfc_main,e.mergeProps({ref_for:!0},t,{class:"top-menu_item",color:"theme",onClick:s=>A(t,s.ctrlKey),isActive:g(t)}),e.createSlots({_:2},[t.content?{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.content),1)]),key:"0"}:void 0]),1040,["onClick","isActive"]))),256)),Array.isArray(a.value)&&l.selectAllItem?(e.openBlock(),e.createElementBlock("div",y,[e.createVNode(u._sfc_main,e.mergeProps(l.selectAllItem,{class:"top-menu_item",color:"theme",styling:"",onClick:o[0]||(o[0]=t=>M()),isActive:a.value.length===l.items.length}),e.createSlots({_:2},[l.selectAllItem.content?{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.selectAllItem.content),1)]),key:"0"}:void 0]),1040,["isActive"])])):e.createCommentVNode("",!0)],34))}});m._sfc_main=h});
|
|
2
|
+
//# sourceMappingURL=menu.vue_vue_type_style_index_0_lang-BT-PgdJ5.amd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.vue_vue_type_style_index_0_lang-BT-PgdJ5.amd.js","sources":["../../src/components/formsExt/menu/menu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onMounted, onUpdated, ref } from 'vue';\nimport type { Item, Props } from './menu';\nimport Core from '@/core/core/core';\nimport { isSafari } from '@/core/utils/device';\nimport TopButton from '@/components/forms/button/button.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tstyling: 'default',\n});\n\nconst model = defineModel({\n\trequired: true,\n});\n\nconst el = ref();\n\n// валидация типа modelValue без возможности выбора нескольких значений (ожидается строка)\nif (!props.isMultiple && !(typeof (model.value) === 'string' || model.value instanceof String)) {\n\tconsole.warn('Type check failed for prop \"modelValue\". Expected String: ' + typeof (model.value));\n}\n\n// валидация типа modelValue с возможностью выбора нескольких значений (ожидается массив)\nif (props.isMultiple && !Array.isArray(model.value)) {\n\tconsole.warn('Type check failed for prop \"modelValue\". Expected Array: ' + typeof (model.value));\n}\n\n// для множественного выбора без пустого множества\n// если ничего не выбрано, присваиваем 1-ое значение\nif (props.isMultiple && !props.canBeEmptyMultiple && Array.isArray(model.value) && !model.value.length) {\n\tmodel.value = [props.items[0].href ?? props.items[0].value];\n}\n\nconst itemIsActive = (item: Item) => {\n\tif (!Array.isArray(model.value)) {\n\t\treturn item.value === model.value;\n\t}\n\n\treturn model.value.includes(item.value);\n};\n\n/**\n * Выбрать элемент\n * @param item\n * @param toggle - добавить или исключить элемент, для isMultiple\n */\nconst select = (item: Item, toggle = false) => {\n\tif (Array.isArray(model.value)) {\n\t\tlet modelNew = model.value.slice();\n\n\t\tif (toggle) {\n\t\t\tif (!modelNew.length) modelNew = props.items.map(item => item.value);\n\n\t\t\tconst index = modelNew.indexOf(item.value);\n\t\t\tif (index === -1) {\n\t\t\t\tmodelNew.push(item.value);\n\t\t\t} else {\n\t\t\t\tmodelNew.splice(index, 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif (modelNew.length === 1 && modelNew[0] === item.value) {\n\t\t\t\tmodelNew = [];\n\t\t\t} else {\n\t\t\t\tmodelNew = [item.value];\n\t\t\t}\n\t\t}\n\n\t\tif (!props.canBeEmptyMultiple && !modelNew.length) modelNew = [item.value];\n\n\t\tmodel.value = modelNew;\n\n\t\treturn;\n\t}\n\n\tmodel.value = item.value;\n};\n\n// вертикальный скролл в горизонтальный скролл\nconst onWheel = (event: WheelEvent) => {\n\tif (el.value.scrollWidth <= el.value.offsetWidth) return;\n\tif (event.shiftKey) return;\n\tif (Math.abs(event.deltaY) < 50) return; // устройство с высокой точностью, например тачпад\n\n\tevent.preventDefault();\n\n\tconst delta = event.deltaY > 0 ? 30 : -30;\n\tel.value.scrollLeft = el.value.scrollLeft + delta;\n};\n\n/**\n * Замена стандартному scrollIntoView, который меняет скролл документа\n *\n * Выравнивание по ближнему краю элемента\n *\n * Выравнивается таким образом, чтобы был виден соседний элемент\n */\nconst scrollIntoView = (isSmooth = true) => {\n\tconst elBtn = el.value.querySelector('.top-active');\n\tif (!elBtn) return;\n\n\tconst gap = 24;\n\n\t// левая и правая координаты элемента\n\tconst leftMargin = elBtn.offsetLeft - el.value.offsetLeft - gap;\n\tconst rightMargin = elBtn.offsetLeft - el.value.offsetLeft + elBtn.clientWidth + gap;\n\n\t// левая и правая границы видимой части меню\n\tconst leftMarginParent = el.value.scrollLeft;\n\tconst rightMarginParent = el.value.clientWidth + el.value.scrollLeft;\n\n\tlet scrollLeft: number | undefined = undefined;\n\n\t// левую границу элемента к левой границе меню\n\tif (leftMargin < leftMarginParent) scrollLeft = leftMargin;\n\n\t// правую границу элемента к правой границе меню\n\tif (rightMargin > rightMarginParent) scrollLeft = rightMargin - el.value.clientWidth;\n\n\tif (scrollLeft !== undefined) {\n\t\tif (isSafari()) {\n\t\t\tCore.$?.(el.value).animate({ scrollLeft: scrollLeft }, isSmooth ? 200 : 0);\n\t\t} else {\n\t\t\tel.value.scrollTo({ left: scrollLeft, behavior: isSmooth ? 'smooth' : 'auto' });\n\t\t}\n\t}\n};\n\n/**\n * Выбрать все элементы в меню\n */\nconst selectAll = () => {\n\tif (!Array.isArray(model.value)) return;\n\n\tif (model.value.length === props.items.length) {\n\t\tmodel.value = [props.items[0].href ?? props.items[0].value];\n\t\treturn;\n\t}\n\n\tmodel.value = props.items.map(item => item.href ?? item.value);\n};\n\nonMounted(() => scrollIntoView(false));\nonUpdated(() => scrollIntoView(true));\n\n</script>\n\n<template>\n\t<div\n\t\tref=\"el\"\n\t\t:class=\"{\n\t\t\t'top-menu': true,\n\t\t\t['top-style_' + styling]: true,\n\t\t\t// ['top-unwrap-x']: styling === 'default',\n\t\t}\"\n\t\t@wheel=\"onWheel\"\n\t>\n\t\t<TopButton\n\t\t\tv-for=\"item in items\"\n\t\t\t:=\"item\"\n\t\t\tclass=\"top-menu_item\"\n\t\t\tcolor=\"theme\"\n\t\t\t@click=\"select(item, $event.ctrlKey)\"\n\t\t\t:isActive=\"itemIsActive(item)\"\n\t\t>\n\t\t\t<template #default v-if=\"item.content\">\n\t\t\t\t{{ item.content }}\n\t\t\t</template>\n\t\t</TopButton>\n\n\t\t<div\n\t\t\tv-if=\"Array.isArray(model) && selectAllItem\"\n\t\t\tclass=\"top-menu_selectAll\"\n\t\t>\n\t\t\t<TopButton\n\t\t\t\t:=\"selectAllItem\"\n\t\t\t\tclass=\"top-menu_item\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\tstyling=\"\"\n\t\t\t\t@click=\"selectAll()\"\n\t\t\t\t:isActive=\"model.length === items.length\"\n\t\t\t>\n\t\t\t\t<template #default v-if=\"selectAllItem.content\">\n\t\t\t\t\t{{ selectAllItem.content }}\n\t\t\t\t</template>\n\t\t\t</TopButton>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.top-menu {\n\t--scroll-thumb-color: var(--color-line-1);\n\t--scroll-thumb-color-hover: var(--color-line-2);\n\t--scroll-thumb-color-active: var(--color-line-3);\n\n\tmax-width: 100%;\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: var(--top-gap-2);\n\toverflow-x: auto;\n\tscrollbar-width: none; /* firefox */\n\n\t/* предотвратить натинвые события браузера (назад / вперед) */\n\toverscroll-behavior-x: contain;\n}\n\n.top-menu::-webkit-scrollbar { display: none; }\n\n.top-menu .top-menu_item {\n\t--top-button-color: var(--color-text-2);\n\n\toutline-offset: -2px !important;\n\tmin-width: 0;\n\tmargin: 0;\n\tflex-shrink: 0;\n}\n\n.top-menu .top-menu_item[data-top-icon] {\n\t--top-icon-color: var(--color-text-2);\n}\n\n.top-menu_selectAll {\n\tposition: sticky;\n\tright: 0;\n\tbackground: var(--color-layout-front-1);\n\tborder-left: 1px solid var(--color-line-1);\n\tpadding-left: var(--top-padding-1);\n\tbox-shadow: var(--color-layout-front-1) var(--top-padding-2) 0px;\n}\n\n/* style default */\n.top-menu.top-style_default .top-menu_item {\n\t--top-forms-radius: 0;\n\t--top-forms-border-color: transparent;\n\t--top-forms-border-width: 2px;\n\n\tfilter: none;\n\tbox-shadow: none;\n\tborder: none;\n\tborder-bottom: var(--top-forms-border-width) solid var(--top-forms-border-color);\n\tbackground: none;\n}\n\n.top-style_default > .top-menu_item > [data-top-badge] {\n\tmargin-top: 0;\n}\n\n.top-menu.top-style_default .top-menu_item:hover {\n\t--top-icon-color: var(--color-text-1);\n\t--top-button-color: var(--color-text-1);\n\t--top-forms-border-color: var(--color-line-2);\n}\n\n.top-menu.top-style_default .top-menu_item:active,\n.top-menu.top-style_default .top-menu_item.top-active {\n\t--top-icon-color: var(--color-text-primary);\n\t--top-button-color: var(--color-text-1);\n\t--top-forms-border-color: var(--color-line-primary-1);\n}\n\n.top-menu.top-style_default .top-menu_selectAll {\n\tpadding-left: var(--top-padding-2);\n}\n\n/* style bar */\n.top-menu.top-style_bar {\n\tborder-radius: var(--top-radius-3);\n\tborder: 1px solid var(--color-line-2);\n\tpadding: var(--top-padding-1);\n\tgap: 3px;\n}\n.top-menu.top-style_bar .top-menu_item {\n\t--top-button-background-color-hover: var(--color-layer-1);\n\t--top-button-background-color-active: var(--color-layer-2);\n\t--top-button-background-color-selected: var(--color-layer-primary-1);\n\n\tposition: relative;\n}\n\n.top-menu.top-style_bar .top-menu_item:hover {\n\t--top-icon-color: var(--color-text-1);\n\t--top-button-color: var(--color-text-1);\n}\n\n.top-menu.top-style_bar .top-menu_item.top-active {\n\t--top-icon-color: var(--color-text-primary);\n\t--top-button-color: var(--color-text-primary);\n}\n\n/* разделители кнопок в баре */\n.top-menu.top-style_bar .top-menu_item:not(:first-child):not(.top-active):not(:hover):after {\n\tcontent: \"\";\n\tbackground: var(--color-line-1-opacity);\n\twidth: 1px;\n\theight: 60%;\n\tdisplay: block;\n\tposition: absolute;\n\tleft: -2px;\n}\n.top-menu.top-style_bar .top-menu_item.top-active + .top-menu_item:after,\n.top-menu.top-style_bar .top-menu_item:hover + .top-menu_item:after {\n\tcontent: none !important;\n}\n\n/*\n.top-style_bar > .top-menu_item > [data-top-badge] {\n\tmargin-top: -3px;\n}\n*/\n\n/** TODO: .top-unwrap-x надо вынести глобально в UI или добавить в стили для storybook */\n/*\n.top-menu.top-unwrap-x {\n\tpadding-right: var(--top-unwrap-x);\n\tpadding-left: var(--top-unwrap-x);\n\tmargin-right: calc(0px - var(--top-unwrap-x));\n\tmargin-left: calc(0px - var(--top-unwrap-x));\n}\n*/\n</style>\n"],"names":["props","__props","el","vue","model","itemIsActive","item","index","modelNew","onWheel","event","delta","scrollIntoView","isSmooth","elBtn","gap","leftMargin","rightMargin","rightMarginParent","scrollLeft"],"mappings":"ydAOA,MAAAA,EAAAC,+BAQAC,EAAAC,EAAA,IAAA,mKAQAH,EAAA,YAAA,CAAA,MAAA,QAAAI,EAAA,KAAA,wNAUA,MAAAC,EAAAC,2MAqBGC,IAAA,gCAIA,MAEAC,EAAA,SAAA,GAAAA,EAAA,CAAA,IAAAF,EAAA,WAGCE,EAAA,CAAAF,EAAA,KAAA,EAIF,CAAAN,EAAA,oBAAA,CAAAQ,EAAA,SAAAA,EAAA,CAAAF,EAAA,KAAA,GAEAF,EAAA,MAAAI,EAEA,OAGDJ,EAAA,MAAAE,EAAA,KAAmB,EAIpBG,EAAAC,GAAA,CAGC,GAFAR,EAAA,MAAA,aAAAA,EAAA,MAAA,aACAQ,EAAA,UACA,KAAA,IAAAA,EAAA,MAAA,EAAA,GAAA,OAEAA,EAAA,eAAA,EAEA,MAAAC,EAAAD,EAAA,OAAA,EAAA,GAAA,IACAR,EAAA,MAAA,WAAAA,EAAA,MAAA,WAAAS,CAA4C,EAU7CC,EAAA,CAAAC,EAAA,KAAA,sDAEC,GAAA,CAAAC,EAAA,OAEA,MAAAC,EAAA,GAGAC,EAAAF,EAAA,WAAAZ,EAAA,MAAA,WAAAa,EACAE,EAAAH,EAAA,WAAAZ,EAAA,MAAA,WAAAY,EAAA,YAAAC,uBAIAG,EAAAhB,EAAA,MAAA,YAAAA,EAAA,MAAA,WAEA,IAAAiB,aAMAF,EAAAC,IAAAC,EAAAF,EAAAf,EAAA,MAAA,aAEAiB,IAAA,sJAMA,mCASA,IAAAf,EAAA,MAAA,SAAAJ,EAAA,MAAA,OAAA,6CAEC,+CAG4D"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Core as S } from "../core/app.js";
|
|
2
|
+
import { defineComponent as E, mergeModels as W, useModel as w, ref as N, onMounted as T, onUpdated as P, openBlock as c, createElementBlock as f, normalizeClass as $, Fragment as b, renderList as q, createBlock as D, mergeProps as d, createSlots as y, withCtx as h, createTextVNode as g, toDisplayString as A, createVNode as K, createCommentVNode as Y } from "vue";
|
|
3
|
+
import { _ as M, i as x, C as z } from "./forms-BydHEF-k.es.js";
|
|
4
|
+
const I = ["../assets/menu.css"].map((n) => import.meta.resolve(n));
|
|
5
|
+
S.insertCSSLinkToPage(I, !0);
|
|
6
|
+
const F = {
|
|
7
|
+
key: 0,
|
|
8
|
+
class: "top-menu_selectAll"
|
|
9
|
+
}, G = /* @__PURE__ */ E({
|
|
10
|
+
__name: "menu",
|
|
11
|
+
props: /* @__PURE__ */ W({
|
|
12
|
+
modelValue: {},
|
|
13
|
+
items: {},
|
|
14
|
+
isMultiple: { type: Boolean },
|
|
15
|
+
canBeEmptyMultiple: { type: Boolean },
|
|
16
|
+
styling: { default: "default" },
|
|
17
|
+
selectAllItem: {}
|
|
18
|
+
}, {
|
|
19
|
+
modelValue: {
|
|
20
|
+
required: !0
|
|
21
|
+
},
|
|
22
|
+
modelModifiers: {}
|
|
23
|
+
}),
|
|
24
|
+
emits: ["update:modelValue"],
|
|
25
|
+
setup(n) {
|
|
26
|
+
const r = n, t = w(n, "modelValue"), a = N();
|
|
27
|
+
!r.isMultiple && !(typeof t.value == "string" || t.value instanceof String) && console.warn('Type check failed for prop "modelValue". Expected String: ' + typeof t.value), r.isMultiple && !Array.isArray(t.value) && console.warn('Type check failed for prop "modelValue". Expected Array: ' + typeof t.value), r.isMultiple && !r.canBeEmptyMultiple && Array.isArray(t.value) && !t.value.length && (t.value = [r.items[0].href ?? r.items[0].value]);
|
|
28
|
+
const k = (e) => Array.isArray(t.value) ? t.value.includes(e.value) : e.value === t.value, C = (e, o = !1) => {
|
|
29
|
+
if (Array.isArray(t.value)) {
|
|
30
|
+
let l = t.value.slice();
|
|
31
|
+
if (o) {
|
|
32
|
+
l.length || (l = r.items.map((u) => u.value));
|
|
33
|
+
const s = l.indexOf(e.value);
|
|
34
|
+
s === -1 ? l.push(e.value) : l.splice(s, 1);
|
|
35
|
+
} else
|
|
36
|
+
l.length === 1 && l[0] === e.value ? l = [] : l = [e.value];
|
|
37
|
+
!r.canBeEmptyMultiple && !l.length && (l = [e.value]), t.value = l;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
t.value = e.value;
|
|
41
|
+
}, L = (e) => {
|
|
42
|
+
if (a.value.scrollWidth <= a.value.offsetWidth || e.shiftKey || Math.abs(e.deltaY) < 50) return;
|
|
43
|
+
e.preventDefault();
|
|
44
|
+
const o = e.deltaY > 0 ? 30 : -30;
|
|
45
|
+
a.value.scrollLeft = a.value.scrollLeft + o;
|
|
46
|
+
}, v = (e = !0) => {
|
|
47
|
+
var m, p;
|
|
48
|
+
const o = a.value.querySelector(".top-active");
|
|
49
|
+
if (!o) return;
|
|
50
|
+
const l = 24, s = o.offsetLeft - a.value.offsetLeft - l, u = o.offsetLeft - a.value.offsetLeft + o.clientWidth + l, _ = a.value.scrollLeft, B = a.value.clientWidth + a.value.scrollLeft;
|
|
51
|
+
let i;
|
|
52
|
+
s < _ && (i = s), u > B && (i = u - a.value.clientWidth), i !== void 0 && (x() ? (p = (m = z).$) == null || p.call(m, a.value).animate({ scrollLeft: i }, e ? 200 : 0) : a.value.scrollTo({ left: i, behavior: e ? "smooth" : "auto" }));
|
|
53
|
+
}, V = () => {
|
|
54
|
+
if (Array.isArray(t.value)) {
|
|
55
|
+
if (t.value.length === r.items.length) {
|
|
56
|
+
t.value = [r.items[0].href ?? r.items[0].value];
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
t.value = r.items.map((e) => e.href ?? e.value);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
return T(() => v(!1)), P(() => v(!0)), (e, o) => (c(), f("div", {
|
|
63
|
+
ref_key: "el",
|
|
64
|
+
ref: a,
|
|
65
|
+
class: $({
|
|
66
|
+
"top-menu": !0,
|
|
67
|
+
["top-style_" + e.styling]: !0
|
|
68
|
+
// ['top-unwrap-x']: styling === 'default',
|
|
69
|
+
}),
|
|
70
|
+
onWheel: L
|
|
71
|
+
}, [
|
|
72
|
+
(c(!0), f(b, null, q(e.items, (l) => (c(), D(M, d({ ref_for: !0 }, l, {
|
|
73
|
+
class: "top-menu_item",
|
|
74
|
+
color: "theme",
|
|
75
|
+
onClick: (s) => C(l, s.ctrlKey),
|
|
76
|
+
isActive: k(l)
|
|
77
|
+
}), y({ _: 2 }, [
|
|
78
|
+
l.content ? {
|
|
79
|
+
name: "default",
|
|
80
|
+
fn: h(() => [
|
|
81
|
+
g(A(l.content), 1)
|
|
82
|
+
]),
|
|
83
|
+
key: "0"
|
|
84
|
+
} : void 0
|
|
85
|
+
]), 1040, ["onClick", "isActive"]))), 256)),
|
|
86
|
+
Array.isArray(t.value) && e.selectAllItem ? (c(), f("div", F, [
|
|
87
|
+
K(M, d(e.selectAllItem, {
|
|
88
|
+
class: "top-menu_item",
|
|
89
|
+
color: "theme",
|
|
90
|
+
styling: "",
|
|
91
|
+
onClick: o[0] || (o[0] = (l) => V()),
|
|
92
|
+
isActive: t.value.length === e.items.length
|
|
93
|
+
}), y({ _: 2 }, [
|
|
94
|
+
e.selectAllItem.content ? {
|
|
95
|
+
name: "default",
|
|
96
|
+
fn: h(() => [
|
|
97
|
+
g(A(e.selectAllItem.content), 1)
|
|
98
|
+
]),
|
|
99
|
+
key: "0"
|
|
100
|
+
} : void 0
|
|
101
|
+
]), 1040, ["isActive"])
|
|
102
|
+
])) : Y("", !0)
|
|
103
|
+
], 34));
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
export {
|
|
107
|
+
G as _
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=menu.vue_vue_type_style_index_0_lang-C585WUlJ.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.vue_vue_type_style_index_0_lang-C585WUlJ.es.js","sources":["../../src/components/formsExt/menu/menu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onMounted, onUpdated, ref } from 'vue';\nimport type { Item, Props } from './menu';\nimport Core from '@/core/core/core';\nimport { isSafari } from '@/core/utils/device';\nimport TopButton from '@/components/forms/button/button.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tstyling: 'default',\n});\n\nconst model = defineModel({\n\trequired: true,\n});\n\nconst el = ref();\n\n// валидация типа modelValue без возможности выбора нескольких значений (ожидается строка)\nif (!props.isMultiple && !(typeof (model.value) === 'string' || model.value instanceof String)) {\n\tconsole.warn('Type check failed for prop \"modelValue\". Expected String: ' + typeof (model.value));\n}\n\n// валидация типа modelValue с возможностью выбора нескольких значений (ожидается массив)\nif (props.isMultiple && !Array.isArray(model.value)) {\n\tconsole.warn('Type check failed for prop \"modelValue\". Expected Array: ' + typeof (model.value));\n}\n\n// для множественного выбора без пустого множества\n// если ничего не выбрано, присваиваем 1-ое значение\nif (props.isMultiple && !props.canBeEmptyMultiple && Array.isArray(model.value) && !model.value.length) {\n\tmodel.value = [props.items[0].href ?? props.items[0].value];\n}\n\nconst itemIsActive = (item: Item) => {\n\tif (!Array.isArray(model.value)) {\n\t\treturn item.value === model.value;\n\t}\n\n\treturn model.value.includes(item.value);\n};\n\n/**\n * Выбрать элемент\n * @param item\n * @param toggle - добавить или исключить элемент, для isMultiple\n */\nconst select = (item: Item, toggle = false) => {\n\tif (Array.isArray(model.value)) {\n\t\tlet modelNew = model.value.slice();\n\n\t\tif (toggle) {\n\t\t\tif (!modelNew.length) modelNew = props.items.map(item => item.value);\n\n\t\t\tconst index = modelNew.indexOf(item.value);\n\t\t\tif (index === -1) {\n\t\t\t\tmodelNew.push(item.value);\n\t\t\t} else {\n\t\t\t\tmodelNew.splice(index, 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif (modelNew.length === 1 && modelNew[0] === item.value) {\n\t\t\t\tmodelNew = [];\n\t\t\t} else {\n\t\t\t\tmodelNew = [item.value];\n\t\t\t}\n\t\t}\n\n\t\tif (!props.canBeEmptyMultiple && !modelNew.length) modelNew = [item.value];\n\n\t\tmodel.value = modelNew;\n\n\t\treturn;\n\t}\n\n\tmodel.value = item.value;\n};\n\n// вертикальный скролл в горизонтальный скролл\nconst onWheel = (event: WheelEvent) => {\n\tif (el.value.scrollWidth <= el.value.offsetWidth) return;\n\tif (event.shiftKey) return;\n\tif (Math.abs(event.deltaY) < 50) return; // устройство с высокой точностью, например тачпад\n\n\tevent.preventDefault();\n\n\tconst delta = event.deltaY > 0 ? 30 : -30;\n\tel.value.scrollLeft = el.value.scrollLeft + delta;\n};\n\n/**\n * Замена стандартному scrollIntoView, который меняет скролл документа\n *\n * Выравнивание по ближнему краю элемента\n *\n * Выравнивается таким образом, чтобы был виден соседний элемент\n */\nconst scrollIntoView = (isSmooth = true) => {\n\tconst elBtn = el.value.querySelector('.top-active');\n\tif (!elBtn) return;\n\n\tconst gap = 24;\n\n\t// левая и правая координаты элемента\n\tconst leftMargin = elBtn.offsetLeft - el.value.offsetLeft - gap;\n\tconst rightMargin = elBtn.offsetLeft - el.value.offsetLeft + elBtn.clientWidth + gap;\n\n\t// левая и правая границы видимой части меню\n\tconst leftMarginParent = el.value.scrollLeft;\n\tconst rightMarginParent = el.value.clientWidth + el.value.scrollLeft;\n\n\tlet scrollLeft: number | undefined = undefined;\n\n\t// левую границу элемента к левой границе меню\n\tif (leftMargin < leftMarginParent) scrollLeft = leftMargin;\n\n\t// правую границу элемента к правой границе меню\n\tif (rightMargin > rightMarginParent) scrollLeft = rightMargin - el.value.clientWidth;\n\n\tif (scrollLeft !== undefined) {\n\t\tif (isSafari()) {\n\t\t\tCore.$?.(el.value).animate({ scrollLeft: scrollLeft }, isSmooth ? 200 : 0);\n\t\t} else {\n\t\t\tel.value.scrollTo({ left: scrollLeft, behavior: isSmooth ? 'smooth' : 'auto' });\n\t\t}\n\t}\n};\n\n/**\n * Выбрать все элементы в меню\n */\nconst selectAll = () => {\n\tif (!Array.isArray(model.value)) return;\n\n\tif (model.value.length === props.items.length) {\n\t\tmodel.value = [props.items[0].href ?? props.items[0].value];\n\t\treturn;\n\t}\n\n\tmodel.value = props.items.map(item => item.href ?? item.value);\n};\n\nonMounted(() => scrollIntoView(false));\nonUpdated(() => scrollIntoView(true));\n\n</script>\n\n<template>\n\t<div\n\t\tref=\"el\"\n\t\t:class=\"{\n\t\t\t'top-menu': true,\n\t\t\t['top-style_' + styling]: true,\n\t\t\t// ['top-unwrap-x']: styling === 'default',\n\t\t}\"\n\t\t@wheel=\"onWheel\"\n\t>\n\t\t<TopButton\n\t\t\tv-for=\"item in items\"\n\t\t\t:=\"item\"\n\t\t\tclass=\"top-menu_item\"\n\t\t\tcolor=\"theme\"\n\t\t\t@click=\"select(item, $event.ctrlKey)\"\n\t\t\t:isActive=\"itemIsActive(item)\"\n\t\t>\n\t\t\t<template #default v-if=\"item.content\">\n\t\t\t\t{{ item.content }}\n\t\t\t</template>\n\t\t</TopButton>\n\n\t\t<div\n\t\t\tv-if=\"Array.isArray(model) && selectAllItem\"\n\t\t\tclass=\"top-menu_selectAll\"\n\t\t>\n\t\t\t<TopButton\n\t\t\t\t:=\"selectAllItem\"\n\t\t\t\tclass=\"top-menu_item\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\tstyling=\"\"\n\t\t\t\t@click=\"selectAll()\"\n\t\t\t\t:isActive=\"model.length === items.length\"\n\t\t\t>\n\t\t\t\t<template #default v-if=\"selectAllItem.content\">\n\t\t\t\t\t{{ selectAllItem.content }}\n\t\t\t\t</template>\n\t\t\t</TopButton>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.top-menu {\n\t--scroll-thumb-color: var(--color-line-1);\n\t--scroll-thumb-color-hover: var(--color-line-2);\n\t--scroll-thumb-color-active: var(--color-line-3);\n\n\tmax-width: 100%;\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: var(--top-gap-2);\n\toverflow-x: auto;\n\tscrollbar-width: none; /* firefox */\n\n\t/* предотвратить натинвые события браузера (назад / вперед) */\n\toverscroll-behavior-x: contain;\n}\n\n.top-menu::-webkit-scrollbar { display: none; }\n\n.top-menu .top-menu_item {\n\t--top-button-color: var(--color-text-2);\n\n\toutline-offset: -2px !important;\n\tmin-width: 0;\n\tmargin: 0;\n\tflex-shrink: 0;\n}\n\n.top-menu .top-menu_item[data-top-icon] {\n\t--top-icon-color: var(--color-text-2);\n}\n\n.top-menu_selectAll {\n\tposition: sticky;\n\tright: 0;\n\tbackground: var(--color-layout-front-1);\n\tborder-left: 1px solid var(--color-line-1);\n\tpadding-left: var(--top-padding-1);\n\tbox-shadow: var(--color-layout-front-1) var(--top-padding-2) 0px;\n}\n\n/* style default */\n.top-menu.top-style_default .top-menu_item {\n\t--top-forms-radius: 0;\n\t--top-forms-border-color: transparent;\n\t--top-forms-border-width: 2px;\n\n\tfilter: none;\n\tbox-shadow: none;\n\tborder: none;\n\tborder-bottom: var(--top-forms-border-width) solid var(--top-forms-border-color);\n\tbackground: none;\n}\n\n.top-style_default > .top-menu_item > [data-top-badge] {\n\tmargin-top: 0;\n}\n\n.top-menu.top-style_default .top-menu_item:hover {\n\t--top-icon-color: var(--color-text-1);\n\t--top-button-color: var(--color-text-1);\n\t--top-forms-border-color: var(--color-line-2);\n}\n\n.top-menu.top-style_default .top-menu_item:active,\n.top-menu.top-style_default .top-menu_item.top-active {\n\t--top-icon-color: var(--color-text-primary);\n\t--top-button-color: var(--color-text-1);\n\t--top-forms-border-color: var(--color-line-primary-1);\n}\n\n.top-menu.top-style_default .top-menu_selectAll {\n\tpadding-left: var(--top-padding-2);\n}\n\n/* style bar */\n.top-menu.top-style_bar {\n\tborder-radius: var(--top-radius-3);\n\tborder: 1px solid var(--color-line-2);\n\tpadding: var(--top-padding-1);\n\tgap: 3px;\n}\n.top-menu.top-style_bar .top-menu_item {\n\t--top-button-background-color-hover: var(--color-layer-1);\n\t--top-button-background-color-active: var(--color-layer-2);\n\t--top-button-background-color-selected: var(--color-layer-primary-1);\n\n\tposition: relative;\n}\n\n.top-menu.top-style_bar .top-menu_item:hover {\n\t--top-icon-color: var(--color-text-1);\n\t--top-button-color: var(--color-text-1);\n}\n\n.top-menu.top-style_bar .top-menu_item.top-active {\n\t--top-icon-color: var(--color-text-primary);\n\t--top-button-color: var(--color-text-primary);\n}\n\n/* разделители кнопок в баре */\n.top-menu.top-style_bar .top-menu_item:not(:first-child):not(.top-active):not(:hover):after {\n\tcontent: \"\";\n\tbackground: var(--color-line-1-opacity);\n\twidth: 1px;\n\theight: 60%;\n\tdisplay: block;\n\tposition: absolute;\n\tleft: -2px;\n}\n.top-menu.top-style_bar .top-menu_item.top-active + .top-menu_item:after,\n.top-menu.top-style_bar .top-menu_item:hover + .top-menu_item:after {\n\tcontent: none !important;\n}\n\n/*\n.top-style_bar > .top-menu_item > [data-top-badge] {\n\tmargin-top: -3px;\n}\n*/\n\n/** TODO: .top-unwrap-x надо вынести глобально в UI или добавить в стили для storybook */\n/*\n.top-menu.top-unwrap-x {\n\tpadding-right: var(--top-unwrap-x);\n\tpadding-left: var(--top-unwrap-x);\n\tmargin-right: calc(0px - var(--top-unwrap-x));\n\tmargin-left: calc(0px - var(--top-unwrap-x));\n}\n*/\n</style>\n"],"names":["props","__props","model","useModel","el","ref","itemIsActive","item","select","toggle","modelNew","item2","index","onWheel","event","delta","scrollIntoView","isSmooth","elBtn","gap","leftMargin","rightMargin","leftMarginParent","rightMarginParent","scrollLeft","isSafari","_b","_a","Core","selectAll","onMounted","onUpdated"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAOA,UAAAA,IAAAC,GAIAC,IAAAC,EAAAF,GAAA,YAAA,GAIAG,IAAAC,EAAA;AAGA,IAAA,CAAAL,EAAA,cAAA,EAAA,OAAAE,EAAA,SAAA,YAAAA,EAAA,iBAAA,WACC,QAAA,KAAA,+DAAA,OAAAA,EAAA,KAAA,GAIDF,EAAA,cAAA,CAAA,MAAA,QAAAE,EAAA,KAAA,KACC,QAAA,KAAA,8DAAA,OAAAA,EAAA,KAAA,GAKDF,EAAA,cAAA,CAAAA,EAAA,sBAAA,MAAA,QAAAE,EAAA,KAAA,KAAA,CAAAA,EAAA,MAAA,WACCA,EAAA,QAAA,CAAAF,EAAA,MAAA,CAAA,EAAA,QAAAA,EAAA,MAAA,CAAA,EAAA,KAAA;AAGD,UAAAM,IAAA,CAAAC,MACC,MAAA,QAAAL,EAAA,KAAA,IAIAA,EAAA,MAAA,SAAAK,EAAA,KAAA,IAHCA,EAAA,UAAAL,EAAA,OAWFM,IAAA,CAAAD,GAAAE,IAAA,OAAA;AACC,UAAA,MAAA,QAAAP,EAAA,KAAA,GAAA;AACC,YAAAQ,IAAAR,EAAA,MAAA,MAAA;AAEA,YAAAO,GAAA;AACC,UAAAC,EAAA,WAAAA,IAAAV,EAAA,MAAA,IAAA,CAAAW,MAAAA,EAAA,KAAA;AAEA,gBAAAC,IAAAF,EAAA,QAAAH,EAAA,KAAA;AACA,UAAAK,MAAA,KACCF,EAAA,KAAAH,EAAA,KAAA,IAEAG,EAAA,OAAAE,GAAA,CAAA;AAAA,QACD;AAEA,UAAAF,EAAA,WAAA,KAAAA,EAAA,CAAA,MAAAH,EAAA,QACCG,IAAA,CAAA,IAEAA,IAAA,CAAAH,EAAA,KAAA;AAIF,QAAA,CAAAP,EAAA,sBAAA,CAAAU,EAAA,WAAAA,IAAA,CAAAH,EAAA,KAAA,IAEAL,EAAA,QAAAQ;AAEA;AAAA,MAAA;AAGD,MAAAR,EAAA,QAAAK,EAAA;AAAA,IAAmB,GAIpBM,IAAA,CAAAC,MAAA;AAGC,UAFAV,EAAA,MAAA,eAAAA,EAAA,MAAA,eACAU,EAAA,YACA,KAAA,IAAAA,EAAA,MAAA,IAAA,GAAA;AAEA,MAAAA,EAAA,eAAA;AAEA,YAAAC,IAAAD,EAAA,SAAA,IAAA,KAAA;AACA,MAAAV,EAAA,MAAA,aAAAA,EAAA,MAAA,aAAAW;AAAA,IAA4C,GAU7CC,IAAA,CAAAC,IAAA,OAAA;;AACC,YAAAC,IAAAd,EAAA,MAAA,cAAA,aAAA;AACA,UAAA,CAAAc,EAAA;AAEA,YAAAC,IAAA,IAGAC,IAAAF,EAAA,aAAAd,EAAA,MAAA,aAAAe,GACAE,IAAAH,EAAA,aAAAd,EAAA,MAAA,aAAAc,EAAA,cAAAC,GAGAG,IAAAlB,EAAA,MAAA,YACAmB,IAAAnB,EAAA,MAAA,cAAAA,EAAA,MAAA;AAEA,UAAAoB;AAGA,MAAAJ,IAAAE,MAAAE,IAAAJ,IAGAC,IAAAE,MAAAC,IAAAH,IAAAjB,EAAA,MAAA,cAEAoB,MAAA,WACCC,EAAA,KACCC,KAAAC,IAAAC,GAAA,MAAA,QAAAF,EAAA,KAAAC,GAAAvB,EAAA,OAAA,QAAA,EAAA,YAAAoB,EAAA,GAAAP,IAAA,MAAA,KAEAb,EAAA,MAAA,SAAA,EAAA,MAAAoB,GAAA,UAAAP,IAAA,WAAA,OAAA,CAAA;AAAA,IAEF,GAMDY,IAAA,MAAA;AACC,UAAA,MAAA,QAAA3B,EAAA,KAAA,GAEA;AAAA,YAAAA,EAAA,MAAA,WAAAF,EAAA,MAAA,QAAA;AACC,UAAAE,EAAA,QAAA,CAAAF,EAAA,MAAA,CAAA,EAAA,QAAAA,EAAA,MAAA,CAAA,EAAA,KAAA;AACA;AAAA,QAAA;AAGD,QAAAE,EAAA,QAAAF,EAAA,MAAA,IAAA,CAAAO,MAAAA,EAAA,QAAAA,EAAA,KAAA;AAAA;AAAA,IAA6D;AAG9D,WAAAuB,EAAA,MAAAd,EAAA,EAAA,CAAA,GACAe,EAAA,MAAAf,EAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|