@platforma-sdk/ui-vue 1.42.23 → 1.42.26

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 (32) hide show
  1. package/.turbo/turbo-build.log +15 -15
  2. package/.turbo/turbo-type-check.log +1 -1
  3. package/CHANGELOG.md +12 -0
  4. package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js +48 -51
  5. package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js.map +1 -1
  6. package/dist/components/PlAnnotations/components/FilterSidebar.vue3.js +6 -8
  7. package/dist/components/PlAnnotations/components/FilterSidebar.vue3.js.map +1 -1
  8. package/dist/plugins/Monetization/LimitCard.vue2.js +59 -46
  9. package/dist/plugins/Monetization/LimitCard.vue2.js.map +1 -1
  10. package/dist/plugins/Monetization/LimitCard.vue3.js +21 -17
  11. package/dist/plugins/Monetization/LimitCard.vue3.js.map +1 -1
  12. package/dist/plugins/Monetization/MonetizationSidebar.vue.js +39 -39
  13. package/dist/plugins/Monetization/MonetizationSidebar.vue.js.map +1 -1
  14. package/dist/plugins/Monetization/RunStatus.vue.d.ts +1 -0
  15. package/dist/plugins/Monetization/RunStatus.vue2.js +17 -20
  16. package/dist/plugins/Monetization/RunStatus.vue2.js.map +1 -1
  17. package/dist/plugins/Monetization/RunStatus.vue3.js +15 -13
  18. package/dist/plugins/Monetization/RunStatus.vue3.js.map +1 -1
  19. package/dist/plugins/Monetization/UserCabinetCard.vue.d.ts +1 -0
  20. package/dist/plugins/Monetization/UserCabinetCard.vue2.js +42 -34
  21. package/dist/plugins/Monetization/UserCabinetCard.vue2.js.map +1 -1
  22. package/dist/plugins/Monetization/UserCabinetCard.vue3.js +17 -15
  23. package/dist/plugins/Monetization/UserCabinetCard.vue3.js.map +1 -1
  24. package/dist/plugins/Monetization/useInfo.js +5 -5
  25. package/dist/plugins/Monetization/useInfo.js.map +1 -1
  26. package/package.json +8 -8
  27. package/src/components/PlAnnotations/components/FilterSidebar.vue +0 -7
  28. package/src/plugins/Monetization/LimitCard.vue +94 -40
  29. package/src/plugins/Monetization/MonetizationSidebar.vue +3 -5
  30. package/src/plugins/Monetization/RunStatus.vue +11 -15
  31. package/src/plugins/Monetization/UserCabinetCard.vue +23 -1
  32. package/src/plugins/Monetization/useInfo.ts +1 -1
@@ -1,29 +1,33 @@
1
- (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._container_1qgbe_2{display:flex;flex-direction:column;gap:8px;background-color:var(--bg-base-light);border-radius:6px;padding:10px 12px 16px;color:var(--txt-01);font-size:14px;font-weight:500;line-height:20px;border:1px solid var(--border-color-div-grey)}._label_1qgbe_16{display:block;margin-bottom:30px;color:var(--txt-01);font-size:14px;font-weight:600;line-height:20px}._content_1qgbe_25{display:flex;flex-direction:column;gap:20px}._contentAvailable_1qgbe_31{display:flex;align-items:flex-start;gap:8px}._contentAvailable_1qgbe_31 strong{font-size:28px;font-weight:500;line-height:36px;letter-spacing:-.56px}._progressBar_1qgbe_43{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;display:flex;align-items:center;border:1px solid var(--border-color-default)}._progressBar_1qgbe_43>span{display:block;height:100%}._progressBarAvailable_1qgbe_57{background-color:#49cc49;border-radius:4px}._progressBarUsed_1qgbe_62{background-color:#ffcecc;border-radius:4px}._progressBarToSpend_1qgbe_67{background-color:#faf5aa;border-radius:4px}._legends_1qgbe_72{display:flex;gap:8px}._legends_1qgbe_72>div{flex:1}._legends_1qgbe_72 span{display:block;border-radius:1px;border:1px solid var(--border-color-default);width:16px;height:16px}._usedLegend_1qgbe_89{display:flex;align-items:center;gap:8px}._usedLegend_1qgbe_89 span{background:#ffcecc}._toSpendLegend_1qgbe_98{display:flex;align-items:center;gap:8px}._toSpendLegend_1qgbe_98 span{background:#faf5aa}")),document.head.appendChild(e)}}catch(r){console.error("vite-plugin-css-injected-by-js",r)}})();
2
- const e = "_container_1qgbe_2", s = "_label_1qgbe_16", n = "_content_1qgbe_25", o = "_contentAvailable_1qgbe_31", r = "_progressBar_1qgbe_43", t = "_progressBarAvailable_1qgbe_57", _ = "_progressBarUsed_1qgbe_62", a = "_progressBarToSpend_1qgbe_67", g = "_legends_1qgbe_72", l = "_usedLegend_1qgbe_89", d = "_toSpendLegend_1qgbe_98", c = {
1
+ (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._container_17ssa_2{display:flex;flex-direction:column;background-color:var(--bg-base-light);border-radius:6px;padding:10px 12px 16px;color:var(--txt-01);font-size:14px;font-weight:500;line-height:20px;border:1px solid var(--border-color-div-grey)}._label_17ssa_15{display:block;min-height:36px;margin-bottom:8px;color:var(--txt-01);font-size:14px;font-weight:600;line-height:20px}._content_17ssa_25{display:flex;flex-direction:column;gap:16px}._contentAvailable_17ssa_31{display:flex;flex-direction:column;gap:6px}._contentAvailable_17ssa_31>div{display:flex;align-items:flex-start}._contentAvailable_17ssa_31>div:first-child{gap:8px}._contentAvailable_17ssa_31>div:first-child strong{font-size:28px;font-weight:500;line-height:36px;letter-spacing:-.56px}._afterRun_17ssa_50{display:flex;align-items:center;justify-content:flex-end;gap:4px;font-size:12px;font-style:normal;font-weight:500;line-height:16px;color:var(--txt-03)}._afterRun_17ssa_50._exceeded_17ssa_60{color:var(--txt-error)}._progressBar_17ssa_65{width:100%;height:12px;background-color:#e0e0e0;display:flex;align-items:center;border:1px solid var(--border-color-default)}._progressBar_17ssa_65>span{display:block;height:100%;outline:1px solid var(--border-color-default)}._progressBar_17ssa_65._exceeded_17ssa_60{opacity:.2}._progressBarAvailable_17ssa_82{background:linear-gradient(270deg,#a1e59c,#d0f5b0 98.81%)}._progressBarUsed_17ssa_86{background-color:#ffcecc}._progressBarToSpend_17ssa_90{background-color:#faf5aa}._legends_17ssa_94{display:flex;justify-content:space-between;gap:8px}._legends_17ssa_94 span{display:block;border-radius:1px;border:1px solid var(--border-color-default);width:12px;height:12px}._usedLegend_17ssa_108{display:flex;align-items:center;gap:8px}._usedLegend_17ssa_108 span{background:#ffcecc}._toSpendLegend_17ssa_117{display:flex;align-items:center;gap:8px}._toSpendLegend_17ssa_117 span{background:#faf5aa}")),document.head.appendChild(e)}}catch(a){console.error("vite-plugin-css-injected-by-js",a)}})();
2
+ const e = "_container_17ssa_2", s = "_label_17ssa_15", n = "_content_17ssa_25", a = "_contentAvailable_17ssa_31", r = "_afterRun_17ssa_50", o = "_exceeded_17ssa_60", _ = "_progressBar_17ssa_65", t = "_progressBarAvailable_17ssa_82", d = "_progressBarUsed_17ssa_86", c = "_progressBarToSpend_17ssa_90", l = "_legends_17ssa_94", g = "_usedLegend_17ssa_108", p = "_toSpendLegend_17ssa_117", B = {
3
3
  container: e,
4
4
  label: s,
5
5
  content: n,
6
- contentAvailable: o,
7
- progressBar: r,
6
+ contentAvailable: a,
7
+ afterRun: r,
8
+ exceeded: o,
9
+ progressBar: _,
8
10
  progressBarAvailable: t,
9
- progressBarUsed: _,
10
- progressBarToSpend: a,
11
- legends: g,
12
- usedLegend: l,
13
- toSpendLegend: d
11
+ progressBarUsed: d,
12
+ progressBarToSpend: c,
13
+ legends: l,
14
+ usedLegend: g,
15
+ toSpendLegend: p
14
16
  };
15
17
  export {
18
+ r as afterRun,
16
19
  e as container,
17
20
  n as content,
18
- o as contentAvailable,
19
- c as default,
21
+ a as contentAvailable,
22
+ B as default,
23
+ o as exceeded,
20
24
  s as label,
21
- g as legends,
22
- r as progressBar,
25
+ l as legends,
26
+ _ as progressBar,
23
27
  t as progressBarAvailable,
24
- a as progressBarToSpend,
25
- _ as progressBarUsed,
26
- d as toSpendLegend,
27
- l as usedLegend
28
+ c as progressBarToSpend,
29
+ d as progressBarUsed,
30
+ p as toSpendLegend,
31
+ g as usedLegend
28
32
  };
29
33
  //# sourceMappingURL=LimitCard.vue3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LimitCard.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
1
+ {"version":3,"file":"LimitCard.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
@@ -1,39 +1,39 @@
1
- import { defineComponent as h, ref as T, computed as s, createElementBlock as P, openBlock as n, Fragment as S, createBlock as l, createCommentVNode as u, unref as e, withCtx as i, createVNode as d, createTextVNode as x, toDisplayString as E, renderList as L, createElementVNode as N, Teleport as M, withModifiers as R } from "vue";
1
+ import { defineComponent as T, ref as U, computed as s, createElementBlock as P, openBlock as n, Fragment as S, createBlock as l, createCommentVNode as u, unref as e, withCtx as i, createVNode as d, createTextVNode as x, toDisplayString as E, renderList as L, createElementVNode as N, Teleport as M, withModifiers as R } from "vue";
2
2
  import { PlSlideModal as I, PlDropdown as O, PlBtnSecondary as q, PlAlert as D, PlBtnGhost as $, PlIcon24 as A } from "@milaboratories/uikit";
3
3
  import { useButtonTarget as F } from "./useButtonTarget.js";
4
4
  import { useInfo as G } from "./useInfo.js";
5
5
  import K from "./UserCabinetCard.vue.js";
6
- import W from "./RunStatus.vue.js";
7
- import j from "./LimitCard.vue.js";
8
- import H from "./EndOfPeriod.vue.js";
9
- const oe = /* @__PURE__ */ h({
6
+ import j from "./RunStatus.vue.js";
7
+ import H from "./LimitCard.vue.js";
8
+ import J from "./EndOfPeriod.vue.js";
9
+ const oe = /* @__PURE__ */ T({
10
10
  __name: "MonetizationSidebar",
11
- setup(J) {
12
- const p = T(!1), {
11
+ setup(Q) {
12
+ const p = U(!1), {
13
13
  result: o,
14
- error: m,
14
+ error: f,
15
15
  hasMonetization: c,
16
- canRun: f,
17
- status: v,
18
- customerEmail: b,
19
- endOfBillingPeriod: y,
20
- limits: g,
21
- refresh: w,
22
- isLoading: B
23
- } = G(), k = F(c), V = s(() => {
16
+ canRun: v,
17
+ status: B,
18
+ customerEmail: m,
19
+ endOfBillingPeriod: b,
20
+ limits: y,
21
+ refresh: V,
22
+ isLoading: g
23
+ } = G(), k = F(c), _ = s(() => {
24
24
  var a;
25
25
  return (a = o.value) == null ? void 0 : a.productName;
26
26
  }), C = s(() => {
27
27
  if (!o.value) return;
28
28
  const a = new URL(`https://scientist.platforma.bio/product/${o.value.productKey}`);
29
- return b.value && a.searchParams.set("email", b.value), a.toString();
30
- }), z = s(() => o.value ? [
29
+ return m.value && a.searchParams.set("email", m.value), a.toString();
30
+ }), h = s(() => o.value ? [
31
31
  {
32
32
  label: o.value.productName,
33
33
  value: o.value.productName
34
34
  }
35
- ] : []), U = s(() => {
36
- switch (v.value) {
35
+ ] : []), w = s(() => {
36
+ switch (B.value) {
37
37
  case "active":
38
38
  return "";
39
39
  case "limits_exceeded":
@@ -44,12 +44,10 @@ const oe = /* @__PURE__ */ h({
44
44
  return "Select a subscription plan in the Scientist Cabinet.";
45
45
  case "inactive":
46
46
  return "Not found billing period.";
47
- case "awaiting":
48
- return "Waiting for monetization information";
49
47
  default:
50
- return "Unknown status: " + v.value;
48
+ return "";
51
49
  }
52
- }), _ = s(() => f.value ? "monetization-on" : "monetization-off");
50
+ }), z = s(() => v.value ? "monetization-on" : "monetization-off");
53
51
  return (a, r) => (n(), P(S, null, [
54
52
  e(c) ? (n(), l(e(I), {
55
53
  key: 0,
@@ -65,12 +63,13 @@ const oe = /* @__PURE__ */ h({
65
63
  d(e(O), {
66
64
  label: "Product",
67
65
  readonly: "",
68
- "model-value": V.value,
69
- options: z.value
66
+ "model-value": _.value,
67
+ options: h.value
70
68
  }, null, 8, ["model-value", "options"]),
71
- d(W, {
72
- "can-run": e(f),
73
- "status-text": U.value
69
+ d(j, {
70
+ "can-run": e(v),
71
+ "is-loading": e(g),
72
+ "status-text": w.value
74
73
  }, {
75
74
  default: i(() => [
76
75
  d(e(q), {
@@ -79,30 +78,31 @@ const oe = /* @__PURE__ */ h({
79
78
  size: "small",
80
79
  style: { "margin-left": "auto" },
81
80
  icon: "loading",
82
- loading: e(B),
83
- onClick: e(w)
81
+ loading: e(g),
82
+ onClick: e(V)
84
83
  }, null, 8, ["loading", "onClick"])
85
84
  ]),
86
85
  _: 1
87
- }, 8, ["can-run", "status-text"]),
88
- e(m) ? (n(), l(e(D), {
86
+ }, 8, ["can-run", "is-loading", "status-text"]),
87
+ e(f) ? (n(), l(e(D), {
89
88
  key: 0,
90
89
  type: "error"
91
90
  }, {
92
91
  default: i(() => [
93
- x(E(e(m)), 1)
92
+ x(E(e(f)), 1)
94
93
  ]),
95
94
  _: 1
96
95
  })) : u("", !0),
97
96
  C.value ? (n(), l(K, {
98
97
  key: 1,
98
+ email: e(m),
99
99
  "user-cabinet-url": C.value
100
- }, null, 8, ["user-cabinet-url"])) : u("", !0),
101
- e(y) ? (n(), l(H, {
100
+ }, null, 8, ["email", "user-cabinet-url"])) : u("", !0),
101
+ e(b) ? (n(), l(J, {
102
102
  key: 2,
103
- "end-of-period": e(y)
103
+ "end-of-period": e(b)
104
104
  }, null, 8, ["end-of-period"])) : u("", !0),
105
- e(g) ? (n(!0), P(S, { key: 3 }, L(e(g), (t) => (n(), l(j, {
105
+ e(y) ? (n(!0), P(S, { key: 3 }, L(e(y), (t) => (n(), l(H, {
106
106
  key: t.type,
107
107
  type: t.type,
108
108
  label: t.type,
@@ -121,7 +121,7 @@ const oe = /* @__PURE__ */ h({
121
121
  onClick: r[1] || (r[1] = R((t) => p.value = !0, ["stop"]))
122
122
  }, {
123
123
  append: i(() => [
124
- d(e(A), { name: _.value }, null, 8, ["name"])
124
+ d(e(A), { name: z.value }, null, 8, ["name"])
125
125
  ]),
126
126
  default: i(() => [
127
127
  r[3] || (r[3] = x(" Subscription "))
@@ -1 +1 @@
1
- {"version":3,"file":"MonetizationSidebar.vue.js","sources":["../../../src/plugins/Monetization/MonetizationSidebar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from 'vue';\nimport { PlSlideModal, PlBtnGhost, PlDropdown, PlAlert, PlIcon24, PlBtnSecondary } from '@milaboratories/uikit';\nimport { useButtonTarget } from './useButtonTarget';\nimport { useInfo } from './useInfo';\nimport UserCabinetCard from './UserCabinetCard.vue';\nimport RunStatus from './RunStatus.vue';\nimport LimitCard from './LimitCard.vue';\nimport EndOfPeriod from './EndOfPeriod.vue';\n\nconst isOpen = ref(false);\n\nconst {\n result,\n error,\n hasMonetization,\n canRun,\n status,\n customerEmail,\n endOfBillingPeriod,\n limits,\n refresh,\n isLoading,\n} = useInfo();\n\nconst teleportTarget = useButtonTarget(hasMonetization);\n\nconst productName = computed(() => result.value?.productName);\n\nconst userCabinetUrl = computed(() => {\n if (!result.value) return undefined;\n\n const u = new URL(`https://scientist.platforma.bio/product/${result.value.productKey}`);\n\n if (customerEmail.value) {\n u.searchParams.set('email', customerEmail.value);\n }\n\n return u.toString();\n});\n\nconst options = computed(() => {\n if (!result.value) return [];\n\n return [\n {\n label: result.value.productName,\n value: result.value.productName,\n },\n ];\n});\n\nconst statusText = computed(() => {\n switch (status.value) {\n case 'active':\n return '';\n case 'limits_exceeded':\n return 'Usage limits exceeded for the current billing period.';\n case 'payment_required':\n return 'Payment required to continue using the service.';\n case 'select-tariff':\n return 'Select a subscription plan in the Scientist Cabinet.';\n case 'inactive':\n return 'Not found billing period.';\n case 'awaiting':\n return 'Waiting for monetization information';\n default:\n return 'Unknown status: ' + status.value;\n }\n});\n\nconst btnIcon = computed(() => {\n if (canRun.value) return 'monetization-on';\n return 'monetization-off';\n});\n</script>\n\n<template>\n <PlSlideModal v-if=\"hasMonetization\" v-model=\"isOpen\">\n <template #title>\n <div class=\"flex items-center gap-2\">\n <span>Subscription</span>\n </div>\n </template>\n <PlDropdown label=\"Product\" readonly :model-value=\"productName\" :options=\"options\" />\n <RunStatus :can-run=\"canRun\" :status-text=\"statusText\">\n <PlBtnSecondary\n title=\"Refresh status\"\n round\n size=\"small\"\n style=\"margin-left: auto;\"\n icon=\"loading\"\n :loading=\"isLoading\"\n @click=\"refresh\"\n />\n </RunStatus>\n <PlAlert v-if=\"error\" type=\"error\">\n {{ error }}\n </PlAlert>\n <UserCabinetCard v-if=\"userCabinetUrl\" :user-cabinet-url=\"userCabinetUrl\" />\n <EndOfPeriod v-if=\"endOfBillingPeriod\" :end-of-period=\"endOfBillingPeriod\" />\n <template v-if=\"limits\">\n <LimitCard\n v-for=\"limit in limits\"\n :key=\"limit.type\"\n :type=\"limit.type\"\n :label=\"limit.type\"\n :used=\"limit.used\"\n :to-spend=\"limit.toSpend\"\n :available=\"limit.available\"\n />\n </template>\n </PlSlideModal>\n <!-- Teleport to the title slot -->\n <Teleport v-if=\"hasMonetization && teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost @click.stop=\"isOpen = true\">\n Subscription\n <template #append>\n <PlIcon24 :name=\"btnIcon\" />\n </template>\n </PlBtnGhost>\n </Teleport>\n</template>\n"],"names":["isOpen","ref","result","error","hasMonetization","canRun","status","customerEmail","endOfBillingPeriod","limits","refresh","isLoading","useInfo","teleportTarget","useButtonTarget","productName","computed","_a","userCabinetUrl","u","options","statusText","btnIcon"],"mappings":";;;;;;;;;;;AAUA,UAAMA,IAASC,EAAI,EAAK,GAElB;AAAA,MACJ,QAAAC;AAAA,MACA,OAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,QAAAC;AAAA,MACA,QAAAC;AAAA,MACA,eAAAC;AAAA,MACA,oBAAAC;AAAA,MACA,QAAAC;AAAA,MACA,SAAAC;AAAA,MACA,WAAAC;AAAA,IAAA,IACEC,EAAA,GAEEC,IAAiBC,EAAgBV,CAAe,GAEhDW,IAAcC,EAAS,MAAA;;AAAM,cAAAC,IAAAf,EAAO,UAAP,gBAAAe,EAAc;AAAA,KAAW,GAEtDC,IAAiBF,EAAS,MAAM;AACpC,UAAI,CAACd,EAAO,MAAO;AAEnB,YAAMiB,IAAI,IAAI,IAAI,2CAA2CjB,EAAO,MAAM,UAAU,EAAE;AAEtF,aAAIK,EAAc,SAChBY,EAAE,aAAa,IAAI,SAASZ,EAAc,KAAK,GAG1CY,EAAE,SAAA;AAAA,IACX,CAAC,GAEKC,IAAUJ,EAAS,MAClBd,EAAO,QAEL;AAAA,MACL;AAAA,QACE,OAAOA,EAAO,MAAM;AAAA,QACpB,OAAOA,EAAO,MAAM;AAAA,MAAA;AAAA,IACtB,IANwB,CAAA,CAQ3B,GAEKmB,IAAaL,EAAS,MAAM;AAChC,cAAQV,EAAO,OAAA;AAAA,QACb,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT;AACE,iBAAO,qBAAqBA,EAAO;AAAA,MAAA;AAAA,IAEzC,CAAC,GAEKgB,IAAUN,EAAS,MACnBX,EAAO,QAAc,oBAClB,kBACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"MonetizationSidebar.vue.js","sources":["../../../src/plugins/Monetization/MonetizationSidebar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from 'vue';\nimport { PlSlideModal, PlBtnGhost, PlDropdown, PlAlert, PlIcon24, PlBtnSecondary } from '@milaboratories/uikit';\nimport { useButtonTarget } from './useButtonTarget';\nimport { useInfo } from './useInfo';\nimport UserCabinetCard from './UserCabinetCard.vue';\nimport RunStatus from './RunStatus.vue';\nimport LimitCard from './LimitCard.vue';\nimport EndOfPeriod from './EndOfPeriod.vue';\n\nconst isOpen = ref(false);\n\nconst {\n result,\n error,\n hasMonetization,\n canRun,\n status,\n customerEmail,\n endOfBillingPeriod,\n limits,\n refresh,\n isLoading,\n} = useInfo();\n\nconst teleportTarget = useButtonTarget(hasMonetization);\n\nconst productName = computed(() => result.value?.productName);\n\nconst userCabinetUrl = computed(() => {\n if (!result.value) return undefined;\n\n const u = new URL(`https://scientist.platforma.bio/product/${result.value.productKey}`);\n\n if (customerEmail.value) {\n u.searchParams.set('email', customerEmail.value);\n }\n\n return u.toString();\n});\n\nconst options = computed(() => {\n if (!result.value) return [];\n\n return [\n {\n label: result.value.productName,\n value: result.value.productName,\n },\n ];\n});\n\nconst statusText = computed(() => {\n switch (status.value) {\n case 'active':\n return '';\n case 'limits_exceeded':\n return 'Usage limits exceeded for the current billing period.';\n case 'payment_required':\n return 'Payment required to continue using the service.';\n case 'select-tariff':\n return 'Select a subscription plan in the Scientist Cabinet.';\n case 'inactive':\n return 'Not found billing period.';\n default:\n return '';\n }\n});\n\nconst btnIcon = computed(() => {\n if (canRun.value) return 'monetization-on';\n return 'monetization-off';\n});\n</script>\n\n<template>\n <PlSlideModal v-if=\"hasMonetization\" v-model=\"isOpen\">\n <template #title>\n <div class=\"flex items-center gap-2\">\n <span>Subscription</span>\n </div>\n </template>\n <PlDropdown label=\"Product\" readonly :model-value=\"productName\" :options=\"options\" />\n <RunStatus :can-run=\"canRun\" :is-loading=\"isLoading\" :status-text=\"statusText\">\n <PlBtnSecondary\n title=\"Refresh status\"\n round\n size=\"small\"\n style=\"margin-left: auto;\"\n icon=\"loading\"\n :loading=\"isLoading\"\n @click=\"refresh\"\n />\n </RunStatus>\n <PlAlert v-if=\"error\" type=\"error\">\n {{ error }}\n </PlAlert>\n <UserCabinetCard v-if=\"userCabinetUrl\" :email=\"customerEmail\" :user-cabinet-url=\"userCabinetUrl\" />\n <EndOfPeriod v-if=\"endOfBillingPeriod\" :end-of-period=\"endOfBillingPeriod\" />\n <template v-if=\"limits\">\n <LimitCard\n v-for=\"limit in limits\"\n :key=\"limit.type\"\n :type=\"limit.type\"\n :label=\"limit.type\"\n :used=\"limit.used\"\n :to-spend=\"limit.toSpend\"\n :available=\"limit.available\"\n />\n </template>\n </PlSlideModal>\n <!-- Teleport to the title slot -->\n <Teleport v-if=\"hasMonetization && teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost @click.stop=\"isOpen = true\">\n Subscription\n <template #append>\n <PlIcon24 :name=\"btnIcon\" />\n </template>\n </PlBtnGhost>\n </Teleport>\n</template>\n"],"names":["isOpen","ref","result","error","hasMonetization","canRun","status","customerEmail","endOfBillingPeriod","limits","refresh","isLoading","useInfo","teleportTarget","useButtonTarget","productName","computed","_a","userCabinetUrl","u","options","statusText","btnIcon"],"mappings":";;;;;;;;;;;AAUA,UAAMA,IAASC,EAAI,EAAK,GAElB;AAAA,MACJ,QAAAC;AAAA,MACA,OAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,QAAAC;AAAA,MACA,QAAAC;AAAA,MACA,eAAAC;AAAA,MACA,oBAAAC;AAAA,MACA,QAAAC;AAAA,MACA,SAAAC;AAAA,MACA,WAAAC;AAAA,IAAA,IACEC,EAAA,GAEEC,IAAiBC,EAAgBV,CAAe,GAEhDW,IAAcC,EAAS,MAAA;;AAAM,cAAAC,IAAAf,EAAO,UAAP,gBAAAe,EAAc;AAAA,KAAW,GAEtDC,IAAiBF,EAAS,MAAM;AACpC,UAAI,CAACd,EAAO,MAAO;AAEnB,YAAMiB,IAAI,IAAI,IAAI,2CAA2CjB,EAAO,MAAM,UAAU,EAAE;AAEtF,aAAIK,EAAc,SAChBY,EAAE,aAAa,IAAI,SAASZ,EAAc,KAAK,GAG1CY,EAAE,SAAA;AAAA,IACX,CAAC,GAEKC,IAAUJ,EAAS,MAClBd,EAAO,QAEL;AAAA,MACL;AAAA,QACE,OAAOA,EAAO,MAAM;AAAA,QACpB,OAAOA,EAAO,MAAM;AAAA,MAAA;AAAA,IACtB,IANwB,CAAA,CAQ3B,GAEKmB,IAAaL,EAAS,MAAM;AAChC,cAAQV,EAAO,OAAA;AAAA,QACb,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT;AACE,iBAAO;AAAA,MAAA;AAAA,IAEb,CAAC,GAEKgB,IAAUN,EAAS,MACnBX,EAAO,QAAc,oBAClB,kBACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,6 +1,7 @@
1
1
  type __VLS_Props = {
2
2
  canRun: boolean | undefined;
3
3
  statusText: string | undefined;
4
+ isLoading?: boolean;
4
5
  };
5
6
  declare function __VLS_template(): {
6
7
  attrs: Partial<{}>;
@@ -1,44 +1,41 @@
1
- import { defineComponent as p, computed as a, createElementBlock as r, openBlock as l, createElementVNode as n, createCommentVNode as o, normalizeClass as t, renderSlot as d, toDisplayString as u } from "vue";
2
- import "@milaboratories/uikit";
3
- const $ = /* @__PURE__ */ p({
1
+ import { defineComponent as i, computed as d, createElementBlock as a, openBlock as l, createElementVNode as n, createCommentVNode as p, normalizeClass as s, renderSlot as y, toDisplayString as o } from "vue";
2
+ const g = /* @__PURE__ */ i({
4
3
  __name: "RunStatus",
5
4
  props: {
6
5
  canRun: { type: Boolean },
7
- statusText: {}
6
+ statusText: {},
7
+ isLoading: { type: Boolean }
8
8
  },
9
- setup(i) {
10
- const s = i;
11
- a(() => s.canRun ? "Can run" : "Cannot run: check your monetization settings");
12
- const c = a(() => s.canRun ? "Ready to run" : "Cannot run");
13
- return (e, m) => (l(), r("div", null, [
9
+ setup(r) {
10
+ const t = r, u = d(() => t.isLoading ? "Updating..." : t.canRun ? "Ready to run" : "Cannot run");
11
+ return (e, c) => (l(), a("div", null, [
14
12
  n("div", {
15
- class: t([{ [e.$style["can-run"]]: e.canRun }, e.$style.container])
13
+ class: s([{ [e.$style["can-run"]]: e.canRun, [e.$style.loading]: e.isLoading }, e.$style.container])
16
14
  }, [
17
15
  n("div", {
18
- class: t(e.$style.badge)
16
+ class: s(e.$style.badge)
19
17
  }, [
20
18
  n("i", {
21
- class: t(e.$style.blob)
19
+ class: s(e.$style.blob)
22
20
  }, [
23
21
  n("span", null, [
24
22
  n("span", {
25
- class: t(e.$style.dot)
23
+ class: s(e.$style.dot)
26
24
  }, null, 2)
27
25
  ])
28
26
  ], 2),
29
- n("span", null, u(c.value), 1)
27
+ n("span", null, o(u.value), 1)
30
28
  ], 2),
31
- o("", !0),
32
- d(e.$slots, "default")
29
+ y(e.$slots, "default")
33
30
  ], 2),
34
- e.statusText ? (l(), r("div", {
31
+ e.statusText ? (l(), a("div", {
35
32
  key: 0,
36
- class: t(e.$style.statusText)
37
- }, u(e.statusText), 3)) : o("", !0)
33
+ class: s(e.$style.statusText)
34
+ }, o(e.statusText), 3)) : p("", !0)
38
35
  ]));
39
36
  }
40
37
  });
41
38
  export {
42
- $ as default
39
+ g as default
43
40
  };
44
41
  //# sourceMappingURL=RunStatus.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RunStatus.vue2.js","sources":["../../../src/plugins/Monetization/RunStatus.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PlIcon24, PlTooltip } from '@milaboratories/uikit';\n\nconst props = defineProps<{\n canRun: boolean | undefined;\n statusText: string | undefined;\n}>();\n\nconst tooltipText = computed(() => {\n if (props.canRun) {\n return 'Can run';\n }\n\n return 'Cannot run: check your monetization settings';\n});\n\nconst badgeText = computed(() => {\n if (props.canRun) {\n return 'Ready to run';\n }\n\n return 'Cannot run';\n});\n</script>\n\n<template>\n <div>\n <div :class=\"[{ [$style['can-run']]: canRun }, $style.container]\">\n <div :class=\"$style.badge\">\n <i :class=\"$style.blob\">\n <span>\n <span :class=\"$style.dot\" />\n </span>\n </i>\n <span>{{ badgeText }}</span>\n </div>\n <PlTooltip v-if=\"false\">\n <template #tooltip>\n {{ tooltipText }}\n </template>\n <PlIcon24 name=\"info\" />\n </PlTooltip>\n <slot />\n </div>\n <div v-if=\"statusText\" :class=\"$style.statusText\">{{ statusText }}</div>\n </div>\n</template>\n\n<style module>\n.container {\n display: flex;\n align-items: center;\n gap: 8px;\n --blob-color: #FF5C5C;\n --badge-background: rgba(255, 92, 92, 0.12);\n &.can-run {\n --blob-color: #49CC49;\n --badge-background: rgba(99, 224, 36, 0.12);\n }\n}\n\n.statusText {\n margin-top: 6px;\n color: var(--txt-error);\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.badge {\n display: flex;\n gap: 6px;\n height: 40px;\n padding: 6px 16px 6px 8px;\n align-items: center;\n border-radius: 6px;\n border: 1px solid var(--badge-background);\n background: var(--badge-background);\n}\n\n.blob {\n width: 24px;\n height: 24px;\n display: flex;\n place-items: center;\n place-content: center;\n\n >span {\n display: flex;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n place-content: center;\n place-items: center;\n background-color: rgb(from var(--blob-color) r g b / 0.24);\n }\n\n .dot {\n border-radius: 50%;\n height: 8px;\n width: 8px;\n transform: scale(1);\n\n background: var(--blob-color);\n box-shadow: 0 0 0 0 var(--blob-color);\n animation: pulse-glob 1s infinite;\n }\n}\n</style>\n"],"names":["props","__props","computed","badgeText"],"mappings":";;;;;;;;;AAIA,UAAMA,IAAQC;AAKM,IAAAC,EAAS,MACvBF,EAAM,SACD,YAGF,8CACR;AAED,UAAMG,IAAYD,EAAS,MACrBF,EAAM,SACD,iBAGF,YACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"RunStatus.vue2.js","sources":["../../../src/plugins/Monetization/RunStatus.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nconst props = defineProps<{\n canRun: boolean | undefined;\n statusText: string | undefined;\n isLoading?: boolean;\n}>();\n\nconst badgeText = computed(() => {\n if (props.isLoading) {\n return 'Updating...';\n }\n\n if (props.canRun) {\n return 'Ready to run';\n }\n\n return 'Cannot run';\n});\n</script>\n\n<template>\n <div>\n <div :class=\"[{ [$style['can-run']]: canRun, [$style.loading]: isLoading }, $style.container]\">\n <div :class=\"$style.badge\">\n <i :class=\"$style.blob\">\n <span>\n <span :class=\"$style.dot\" />\n </span>\n </i>\n <span>{{ badgeText }}</span>\n </div>\n <slot />\n </div>\n <div v-if=\"statusText\" :class=\"$style.statusText\">{{ statusText }}</div>\n </div>\n</template>\n\n<style module>\n.container {\n display: flex;\n align-items: center;\n gap: 8px;\n --blob-color: #FF5C5C;\n --badge-background: rgba(255, 92, 92, 0.12);\n\n &.can-run {\n --blob-color: #49CC49;\n --badge-background: rgba(99, 224, 36, 0.12);\n }\n\n &.loading {\n --blob-color: #FFAD0A;\n --badge-background: rgba(255, 173, 10, 0.12);\n }\n}\n\n.statusText {\n margin-top: 6px;\n color: var(--txt-error);\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.badge {\n display: flex;\n gap: 6px;\n height: 40px;\n padding: 6px 16px 6px 8px;\n align-items: center;\n border-radius: 6px;\n border: 1px solid var(--badge-background);\n background: var(--badge-background);\n}\n\n.blob {\n width: 24px;\n height: 24px;\n display: flex;\n place-items: center;\n place-content: center;\n\n >span {\n display: flex;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n place-content: center;\n place-items: center;\n background-color: rgb(from var(--blob-color) r g b / 0.24);\n }\n\n .dot {\n border-radius: 50%;\n height: 8px;\n width: 8px;\n transform: scale(1);\n\n background: var(--blob-color);\n box-shadow: 0 0 0 0 var(--blob-color);\n animation: pulse-glob 1s infinite;\n }\n}\n</style>\n"],"names":["props","__props","badgeText","computed"],"mappings":";;;;;;;;;AAGA,UAAMA,IAAQC,GAMRC,IAAYC,EAAS,MACrBH,EAAM,YACD,gBAGLA,EAAM,SACD,iBAGF,YACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,19 +1,21 @@
1
- (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._container_s8cm3_2{display:flex;align-items:center;gap:8px;--blob-color: #FF5C5C;--badge-background: rgba(255, 92, 92, .12)}._container_s8cm3_2._can-run_s8cm3_8{--blob-color: #49CC49;--badge-background: rgba(99, 224, 36, .12)}._statusText_s8cm3_14{margin-top:6px;color:var(--txt-error);font-size:14px;font-weight:500;line-height:20px}._badge_s8cm3_22{display:flex;gap:6px;height:40px;padding:6px 16px 6px 8px;align-items:center;border-radius:6px;border:1px solid var(--badge-background);background:var(--badge-background)}._blob_s8cm3_33{width:24px;height:24px;display:flex;place-items:center;place-content:center}._blob_s8cm3_33>span{display:flex;width:16px;height:16px;border-radius:50%;place-content:center;place-items:center;background-color:rgb(from var(--blob-color) r g b / .24)}._blob_s8cm3_33 ._dot_s8cm3_50{border-radius:50%;height:8px;width:8px;transform:scale(1);background:var(--blob-color);box-shadow:0 0 0 0 var(--blob-color);animation:_pulse-glob_s8cm3_1 1s infinite}")),document.head.appendChild(e)}}catch(o){console.error("vite-plugin-css-injected-by-js",o)}})();
2
- const t = "_container_s8cm3_2", s = "_statusText_s8cm3_14", _ = "_badge_s8cm3_22", c = "_blob_s8cm3_33", o = "_dot_s8cm3_50", n = {
1
+ (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._container_1l90y_2{display:flex;align-items:center;gap:8px;--blob-color: #FF5C5C;--badge-background: rgba(255, 92, 92, .12)}._container_1l90y_2._can-run_1l90y_9{--blob-color: #49CC49;--badge-background: rgba(99, 224, 36, .12)}._container_1l90y_2._loading_1l90y_14{--blob-color: #FFAD0A;--badge-background: rgba(255, 173, 10, .12)}._statusText_1l90y_20{margin-top:6px;color:var(--txt-error);font-size:14px;font-weight:500;line-height:20px}._badge_1l90y_28{display:flex;gap:6px;height:40px;padding:6px 16px 6px 8px;align-items:center;border-radius:6px;border:1px solid var(--badge-background);background:var(--badge-background)}._blob_1l90y_39{width:24px;height:24px;display:flex;place-items:center;place-content:center}._blob_1l90y_39>span{display:flex;width:16px;height:16px;border-radius:50%;place-content:center;place-items:center;background-color:rgb(from var(--blob-color) r g b / .24)}._blob_1l90y_39 ._dot_1l90y_56{border-radius:50%;height:8px;width:8px;transform:scale(1);background:var(--blob-color);box-shadow:0 0 0 0 var(--blob-color);animation:_pulse-glob_1l90y_1 1s infinite}")),document.head.appendChild(e)}}catch(o){console.error("vite-plugin-css-injected-by-js",o)}})();
2
+ const t = "_container_1l90y_2", _ = "_loading_1l90y_14", o = "_statusText_1l90y_20", l = "_badge_1l90y_28", n = "_blob_1l90y_39", s = "_dot_1l90y_56", a = {
3
3
  container: t,
4
- "can-run": "_can-run_s8cm3_8",
5
- statusText: s,
6
- badge: _,
7
- blob: c,
8
- "pulse-glob": "_pulse-glob_s8cm3_1",
9
- dot: o
4
+ "can-run": "_can-run_1l90y_9",
5
+ loading: _,
6
+ statusText: o,
7
+ badge: l,
8
+ blob: n,
9
+ "pulse-glob": "_pulse-glob_1l90y_1",
10
+ dot: s
10
11
  };
11
12
  export {
12
- _ as badge,
13
- c as blob,
13
+ l as badge,
14
+ n as blob,
14
15
  t as container,
15
- n as default,
16
- o as dot,
17
- s as statusText
16
+ a as default,
17
+ s as dot,
18
+ _ as loading,
19
+ o as statusText
18
20
  };
19
21
  //# sourceMappingURL=RunStatus.vue3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RunStatus.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
1
+ {"version":3,"file":"RunStatus.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
@@ -1,5 +1,6 @@
1
1
  type __VLS_Props = {
2
2
  userCabinetUrl: string;
3
+ email?: string;
3
4
  };
4
5
  declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
5
6
  export default _default;
@@ -1,63 +1,71 @@
1
- import { defineComponent as y, ref as C, computed as v, createElementBlock as s, openBlock as i, createCommentVNode as b, createElementVNode as l, normalizeClass as o, createVNode as r, toDisplayString as n, unref as c, withCtx as p, createTextVNode as f } from "vue";
2
- import { PlTooltip as U, PlMaskIcon24 as h } from "@milaboratories/uikit";
3
- const k = ["title"], V = /* @__PURE__ */ y({
1
+ import { defineComponent as v, ref as b, computed as f, createElementBlock as a, openBlock as s, createCommentVNode as p, createElementVNode as o, normalizeClass as t, createVNode as u, toDisplayString as i, unref as c, withCtx as d, createTextVNode as U } from "vue";
2
+ import { PlTooltip as k, PlMaskIcon24 as $ } from "@milaboratories/uikit";
3
+ const T = ["title"], w = /* @__PURE__ */ v({
4
4
  __name: "UserCabinetCard",
5
5
  props: {
6
- userCabinetUrl: {}
6
+ userCabinetUrl: {},
7
+ email: {}
7
8
  },
8
- setup(u) {
9
- const a = u, t = C(""), d = v(() => t.value ? "clipboard-copied" : "clipboard"), m = () => {
10
- a.userCabinetUrl && navigator.clipboard.writeText(a.userCabinetUrl).then(() => {
11
- t.value = "URL copied!", setTimeout(() => {
12
- t.value = "";
9
+ setup(m) {
10
+ const n = m, l = b(""), y = f(() => l.value ? "clipboard-copied" : "clipboard"), C = () => {
11
+ n.userCabinetUrl && navigator.clipboard.writeText(n.userCabinetUrl).then(() => {
12
+ l.value = "URL copied!", setTimeout(() => {
13
+ l.value = "";
13
14
  }, 2e3);
14
15
  }).catch((e) => {
15
- console.error("Failed to copy text: ", e), t.value = "Copy failed", setTimeout(() => {
16
- t.value = "";
16
+ console.error("Failed to copy text: ", e), l.value = "Copy failed", setTimeout(() => {
17
+ l.value = "";
17
18
  }, 2e3);
18
19
  });
19
20
  };
20
- return (e, T) => (i(), s("div", null, [
21
- e.userCabinetUrl ? (i(), s("div", {
21
+ return (e, r) => (s(), a("div", null, [
22
+ e.userCabinetUrl ? (s(), a("div", {
22
23
  key: 0,
23
- class: o(e.$style.urlSection)
24
+ class: t(e.$style.urlSection)
24
25
  }, [
25
- l("div", {
26
- class: o(e.$style.urlLabel)
26
+ o("div", {
27
+ class: t(e.$style.urlLabel)
27
28
  }, "Scientist cabinet URL:", 2),
28
- l("div", {
29
- class: o(e.$style.urlActions)
29
+ o("div", {
30
+ class: t(e.$style.urlActions)
30
31
  }, [
31
- l("div", {
32
- class: o(e.$style.urlDisplay),
32
+ o("div", {
33
+ class: t(e.$style.urlDisplay),
33
34
  title: e.userCabinetUrl
34
- }, n(e.userCabinetUrl), 11, k),
35
- r(c(U), {
35
+ }, i(e.userCabinetUrl), 11, T),
36
+ u(c(k), {
36
37
  "close-delay": 800,
37
38
  position: "top"
38
39
  }, {
39
- tooltip: p(() => [
40
- f(n(t.value ? t.value : "Copy"), 1)
40
+ tooltip: d(() => [
41
+ U(i(l.value ? l.value : "Copy"), 1)
41
42
  ]),
42
- default: p(() => [
43
- r(c(h), {
44
- class: o(e.$style.copyIcon),
43
+ default: d(() => [
44
+ u(c($), {
45
+ class: t(e.$style.copyIcon),
45
46
  title: "Copy content",
46
- name: d.value,
47
- onClick: m
47
+ name: y.value,
48
+ onClick: C
48
49
  }, null, 8, ["class", "name"])
49
50
  ]),
50
51
  _: 1
51
52
  })
52
- ], 2)
53
- ], 2)) : b("", !0),
54
- l("div", {
55
- class: o(e.$style.hint)
53
+ ], 2),
54
+ e.email ? (s(), a("div", {
55
+ key: 0,
56
+ class: t(e.$style.email)
57
+ }, [
58
+ r[0] || (r[0] = o("span", null, "License owner:", -1)),
59
+ o("span", null, i(e.email), 1)
60
+ ], 2)) : p("", !0)
61
+ ], 2)) : p("", !0),
62
+ o("div", {
63
+ class: t(e.$style.hint)
56
64
  }, " * Copy and paste the link into your browser ", 2)
57
65
  ]));
58
66
  }
59
67
  });
60
68
  export {
61
- V as default
69
+ w as default
62
70
  };
63
71
  //# sourceMappingURL=UserCabinetCard.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserCabinetCard.vue2.js","sources":["../../../src/plugins/Monetization/UserCabinetCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from 'vue';\nimport { PlTooltip, PlMaskIcon24 } from '@milaboratories/uikit';\n\nconst props = defineProps<{\n userCabinetUrl: string;\n}>();\n\nconst copiedMessage = ref('');\n\nconst iconName = computed(() => (copiedMessage.value ? 'clipboard-copied' : 'clipboard'));\n\nconst copyToClipboard = () => {\n if (props.userCabinetUrl) {\n navigator.clipboard.writeText(props.userCabinetUrl)\n .then(() => {\n copiedMessage.value = 'URL copied!';\n setTimeout(() => {\n copiedMessage.value = '';\n }, 2000);\n })\n .catch((err) => {\n console.error('Failed to copy text: ', err);\n copiedMessage.value = 'Copy failed';\n setTimeout(() => {\n copiedMessage.value = '';\n }, 2000);\n });\n }\n};\n</script>\n\n<template>\n <div>\n <div v-if=\"userCabinetUrl\" :class=\"$style.urlSection\">\n <div :class=\"$style.urlLabel\">Scientist cabinet URL:</div>\n <div :class=\"$style.urlActions\">\n <div :class=\"$style.urlDisplay\" :title=\"userCabinetUrl\">{{ userCabinetUrl }}</div>\n <PlTooltip :close-delay=\"800\" position=\"top\">\n <PlMaskIcon24 :class=\"$style.copyIcon\" title=\"Copy content\" :name=\"iconName\" @click=\"copyToClipboard\" />\n <template #tooltip>{{ copiedMessage ? copiedMessage : 'Copy' }}</template>\n </PlTooltip>\n </div>\n </div>\n <div :class=\"$style.hint\">\n * Copy and paste the link into your browser\n </div>\n </div>\n</template>\n\n<style module>\n.hint {\n margin-top: 6px;\n color: var(--txt-03);\n font-size: 12px;\n font-weight: 500;\n line-height: 16px;\n}\n\n.copyIcon {\n cursor: pointer;\n}\n\n.urlSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n background-color: #f0f0f0;\n border-radius: 6px;\n}\n\n.urlLabel {\n font-weight: 500;\n color: #555;\n}\n\n.urlActions {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: nowrap;\n}\n\n.urlDisplay {\n font-family: monospace;\n font-size: 14px;\n color: #0066cc;\n padding: 6px 10px 6px 0;\n border-radius: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 300px;\n}\n</style>\n"],"names":["props","__props","copiedMessage","ref","iconName","computed","copyToClipboard","err"],"mappings":";;;;;;;;AAIA,UAAMA,IAAQC,GAIRC,IAAgBC,EAAI,EAAE,GAEtBC,IAAWC,EAAS,MAAOH,EAAc,QAAQ,qBAAqB,WAAY,GAElFI,IAAkB,MAAM;AAC5B,MAAIN,EAAM,kBACR,UAAU,UAAU,UAAUA,EAAM,cAAc,EAC/C,KAAK,MAAM;AACV,QAAAE,EAAc,QAAQ,eACtB,WAAW,MAAM;AACf,UAAAA,EAAc,QAAQ;AAAA,QACxB,GAAG,GAAI;AAAA,MACT,CAAC,EACA,MAAM,CAACK,MAAQ;AACd,gBAAQ,MAAM,yBAAyBA,CAAG,GAC1CL,EAAc,QAAQ,eACtB,WAAW,MAAM;AACf,UAAAA,EAAc,QAAQ;AAAA,QACxB,GAAG,GAAI;AAAA,MACT,CAAC;AAAA,IAEP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"UserCabinetCard.vue2.js","sources":["../../../src/plugins/Monetization/UserCabinetCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from 'vue';\nimport { PlTooltip, PlMaskIcon24 } from '@milaboratories/uikit';\n\nconst props = defineProps<{\n userCabinetUrl: string;\n email?: string;\n}>();\n\nconst copiedMessage = ref('');\n\nconst iconName = computed(() => (copiedMessage.value ? 'clipboard-copied' : 'clipboard'));\n\nconst copyToClipboard = () => {\n if (props.userCabinetUrl) {\n navigator.clipboard.writeText(props.userCabinetUrl)\n .then(() => {\n copiedMessage.value = 'URL copied!';\n setTimeout(() => {\n copiedMessage.value = '';\n }, 2000);\n })\n .catch((err) => {\n console.error('Failed to copy text: ', err);\n copiedMessage.value = 'Copy failed';\n setTimeout(() => {\n copiedMessage.value = '';\n }, 2000);\n });\n }\n};\n</script>\n\n<template>\n <div>\n <div v-if=\"userCabinetUrl\" :class=\"$style.urlSection\">\n <div :class=\"$style.urlLabel\">Scientist cabinet URL:</div>\n <div :class=\"$style.urlActions\">\n <div :class=\"$style.urlDisplay\" :title=\"userCabinetUrl\">{{ userCabinetUrl }}</div>\n <PlTooltip :close-delay=\"800\" position=\"top\">\n <PlMaskIcon24 :class=\"$style.copyIcon\" title=\"Copy content\" :name=\"iconName\" @click=\"copyToClipboard\" />\n <template #tooltip>{{ copiedMessage ? copiedMessage : 'Copy' }}</template>\n </PlTooltip>\n </div>\n <div v-if=\"email\" :class=\"$style.email\">\n <span>License owner:</span>\n <span>{{ email }}</span>\n </div>\n </div>\n <div :class=\"$style.hint\">\n * Copy and paste the link into your browser\n </div>\n </div>\n</template>\n\n<style module>\n.hint {\n margin-top: 6px;\n color: var(--txt-03);\n font-size: 12px;\n font-weight: 500;\n line-height: 16px;\n}\n\n.email {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 12px;\n color: var(--txt-03);\n\n > span:last-child {\n max-width: 200px;\n text-overflow: ellipsis;\n display: block;\n white-space: nowrap;\n overflow: hidden;\n }\n}\n\n.copyIcon {\n cursor: pointer;\n}\n\n.urlSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n background-color: #F7F8FA;\n border-radius: 6px;\n border: 1px solid #E1E3EB;\n}\n\n.urlLabel {\n font-weight: 500;\n color: #555;\n}\n\n.urlActions {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: nowrap;\n}\n\n.urlDisplay {\n font-family: monospace;\n font-size: 14px;\n color: #0066cc;\n padding: 6px 10px 6px 0;\n border-radius: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 300px;\n}\n</style>\n"],"names":["props","__props","copiedMessage","ref","iconName","computed","copyToClipboard","err"],"mappings":";;;;;;;;;AAIA,UAAMA,IAAQC,GAKRC,IAAgBC,EAAI,EAAE,GAEtBC,IAAWC,EAAS,MAAOH,EAAc,QAAQ,qBAAqB,WAAY,GAElFI,IAAkB,MAAM;AAC5B,MAAIN,EAAM,kBACR,UAAU,UAAU,UAAUA,EAAM,cAAc,EAC/C,KAAK,MAAM;AACV,QAAAE,EAAc,QAAQ,eACtB,WAAW,MAAM;AACf,UAAAA,EAAc,QAAQ;AAAA,QACxB,GAAG,GAAI;AAAA,MACT,CAAC,EACA,MAAM,CAACK,MAAQ;AACd,gBAAQ,MAAM,yBAAyBA,CAAG,GAC1CL,EAAc,QAAQ,eACtB,WAAW,MAAM;AACf,UAAAA,EAAc,QAAQ;AAAA,QACxB,GAAG,GAAI;AAAA,MACT,CAAC;AAAA,IAEP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,19 +1,21 @@
1
- (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._hint_1bvg8_2{margin-top:6px;color:var(--txt-03);font-size:12px;font-weight:500;line-height:16px}._copyIcon_1bvg8_10{cursor:pointer}._urlSection_1bvg8_14{display:flex;flex-direction:column;gap:8px;padding:12px;background-color:#f0f0f0;border-radius:6px}._urlLabel_1bvg8_23{font-weight:500;color:#555}._urlActions_1bvg8_28{display:flex;align-items:center;gap:10px;flex-wrap:nowrap}._urlDisplay_1bvg8_35{font-family:monospace;font-size:14px;color:#06c;padding:6px 10px 6px 0;border-radius:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:300px}")),document.head.appendChild(e)}}catch(o){console.error("vite-plugin-css-injected-by-js",o)}})();
2
- const l = "_hint_1bvg8_2", o = "_copyIcon_1bvg8_10", c = "_urlSection_1bvg8_14", n = "_urlLabel_1bvg8_23", t = "_urlActions_1bvg8_28", _ = "_urlDisplay_1bvg8_35", s = {
3
- hint: l,
4
- copyIcon: o,
5
- urlSection: c,
6
- urlLabel: n,
7
- urlActions: t,
8
- urlDisplay: _
1
+ (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._hint_hc54t_2{margin-top:6px;color:var(--txt-03);font-size:12px;font-weight:500;line-height:16px}._email_hc54t_10{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--txt-03)}._email_hc54t_10>span:last-child{max-width:200px;text-overflow:ellipsis;display:block;white-space:nowrap;overflow:hidden}._copyIcon_hc54t_26{cursor:pointer}._urlSection_hc54t_30{display:flex;flex-direction:column;gap:8px;padding:12px;background-color:#f7f8fa;border-radius:6px;border:1px solid #E1E3EB}._urlLabel_hc54t_40{font-weight:500;color:#555}._urlActions_hc54t_45{display:flex;align-items:center;gap:10px;flex-wrap:nowrap}._urlDisplay_hc54t_52{font-family:monospace;font-size:14px;color:#06c;padding:6px 10px 6px 0;border-radius:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:300px}")),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}})();
2
+ const c = "_hint_hc54t_2", t = "_email_hc54t_10", l = "_copyIcon_hc54t_26", o = "_urlSection_hc54t_30", _ = "_urlLabel_hc54t_40", n = "_urlActions_hc54t_45", s = "_urlDisplay_hc54t_52", i = {
3
+ hint: c,
4
+ email: t,
5
+ copyIcon: l,
6
+ urlSection: o,
7
+ urlLabel: _,
8
+ urlActions: n,
9
+ urlDisplay: s
9
10
  };
10
11
  export {
11
- o as copyIcon,
12
- s as default,
13
- l as hint,
14
- t as urlActions,
15
- _ as urlDisplay,
16
- n as urlLabel,
17
- c as urlSection
12
+ l as copyIcon,
13
+ i as default,
14
+ t as email,
15
+ c as hint,
16
+ n as urlActions,
17
+ s as urlDisplay,
18
+ _ as urlLabel,
19
+ o as urlSection
18
20
  };
19
21
  //# sourceMappingURL=UserCabinetCard.vue3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserCabinetCard.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
1
+ {"version":3,"file":"UserCabinetCard.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
@@ -1,14 +1,14 @@
1
1
  import { computed as n, ref as i, watch as g } from "vue";
2
2
  import { useSdkPlugin as h } from "../../defineApp.js";
3
- import { Response as w } from "./validation.js";
4
- import { useIntervalFn as D } from "@vueuse/core";
3
+ import { Response as D } from "./validation.js";
4
+ import { useIntervalFn as O } from "@vueuse/core";
5
5
  function E() {
6
6
  const m = h(), s = n(() => m.loaded ? m.useApp() : void 0), a = n(() => {
7
7
  var e, o;
8
8
  return "__mnzDate" in ((o = (e = s.value) == null ? void 0 : e.model) == null ? void 0 : o.args);
9
9
  }), v = n(() => {
10
10
  var e;
11
- return w.safeParse((e = s.value) == null ? void 0 : e.model.outputs.__mnzInfo);
11
+ return D.safeParse((e = s.value) == null ? void 0 : e.model.outputs.__mnzInfo);
12
12
  }), c = n(() => {
13
13
  var e;
14
14
  return (e = v.value) == null ? void 0 : e.data;
@@ -33,7 +33,7 @@ function E() {
33
33
  return !!((e = t.value) != null && e.canRun);
34
34
  }), z = n(() => {
35
35
  var e;
36
- return c.value ? (e = t.value) == null ? void 0 : e.status : "awaiting";
36
+ return c.value ? (e = t.value) == null ? void 0 : e.status : "";
37
37
  }), I = n(() => {
38
38
  var e;
39
39
  return (e = t.value) == null ? void 0 : e.customerEmail;
@@ -50,7 +50,7 @@ function E() {
50
50
  return g(f, (e) => {
51
51
  var o;
52
52
  a.value && (((o = s.value) == null ? void 0 : o.model.args).__mnzCanRun = e);
53
- }), a.value && D(d, 6e4), {
53
+ }), a.value && O(d, 6e4), {
54
54
  hasMonetization: a,
55
55
  result: t,
56
56
  error: _,
@@ -1 +1 @@
1
- {"version":3,"file":"useInfo.js","sources":["../../../src/plugins/Monetization/useInfo.ts"],"sourcesContent":["import { computed, watch, ref } from 'vue';\nimport { useSdkPlugin } from '../../defineApp';\nimport { Response } from './validation';\nimport { useIntervalFn } from '@vueuse/core';\n\nexport function useInfo() {\n const sdk = useSdkPlugin();\n\n const app = computed(() => (sdk.loaded ? sdk.useApp() : undefined));\n\n const hasMonetization = computed(() => '__mnzDate' in (app.value?.model?.args as Record<string, unknown>));\n\n const parsed = computed(() => Response.safeParse(app.value?.model.outputs['__mnzInfo']));\n\n const currentInfo = computed<Response | undefined>(() => parsed.value?.data);\n\n const error = computed(() => parsed.value?.error ?? info.value?.response?.error);\n\n const info = ref<Response | undefined>(undefined);\n\n const isLoading = ref(false);\n\n const version = ref(0);\n\n watch([currentInfo], ([i]) => {\n if (i) {\n info.value = i;\n const v = ++version.value;\n setTimeout(() => {\n if (version.value === v) {\n isLoading.value = false;\n }\n }, 1000);\n }\n }, { immediate: true });\n\n const result = computed(() => info.value?.response?.result);\n\n const canRun = computed(() => !!result.value?.canRun);\n\n const status = computed(() => currentInfo.value ? result.value?.status : 'awaiting');\n\n const customerEmail = computed(() => result.value?.customerEmail);\n\n const endOfBillingPeriod = computed(() => result.value?.mnz.endOfBillingPeriod);\n\n const limits = computed(() => result.value?.mnz.limits);\n\n const refresh = () => {\n isLoading.value = true;\n (app.value?.model.args as Record<string, unknown>)['__mnzDate'] = new Date().toISOString();\n };\n\n watch(canRun, (v) => {\n if (hasMonetization.value) {\n (app.value?.model.args as Record<string, unknown>)['__mnzCanRun'] = v;\n }\n });\n\n if (hasMonetization.value) {\n useIntervalFn(refresh, 60_000); // 1 minute\n }\n\n return {\n hasMonetization,\n result,\n error,\n canRun,\n status,\n customerEmail,\n endOfBillingPeriod,\n limits,\n refresh,\n version,\n isLoading,\n };\n}\n"],"names":["useInfo","sdk","useSdkPlugin","app","computed","hasMonetization","_b","_a","parsed","Response","currentInfo","error","_c","info","ref","isLoading","version","watch","i","v","result","canRun","status","customerEmail","endOfBillingPeriod","limits","refresh","useIntervalFn"],"mappings":";;;;AAKO,SAASA,IAAU;AACxB,QAAMC,IAAMC,EAAA,GAENC,IAAMC,EAAS,MAAOH,EAAI,SAASA,EAAI,OAAA,IAAW,MAAU,GAE5DI,IAAkBD,EAAS,MAAA;;AAAM,4BAAgBE,KAAAC,IAAAJ,EAAI,UAAJ,gBAAAI,EAAW,UAAX,gBAAAD,EAAkB;AAAA,GAAgC,GAEnGE,IAASJ,EAAS,MAAA;;AAAM,WAAAK,EAAS,WAAUF,IAAAJ,EAAI,UAAJ,gBAAAI,EAAW,MAAM,QAAQ,SAAY;AAAA,GAAC,GAEjFG,IAAcN,EAA+B,MAAA;;AAAM,YAAAG,IAAAC,EAAO,UAAP,gBAAAD,EAAc;AAAA,GAAI,GAErEI,IAAQP,EAAS,MAAA;;AAAM,aAAAG,IAAAC,EAAO,UAAP,gBAAAD,EAAc,YAASK,KAAAN,IAAAO,EAAK,UAAL,gBAAAP,EAAY,aAAZ,gBAAAM,EAAsB;AAAA,GAAK,GAEzEC,IAAOC,EAA0B,MAAS,GAE1CC,IAAYD,EAAI,EAAK,GAErBE,IAAUF,EAAI,CAAC;AAErB,EAAAG,EAAM,CAACP,CAAW,GAAG,CAAC,CAACQ,CAAC,MAAM;AAC5B,QAAIA,GAAG;AACL,MAAAL,EAAK,QAAQK;AACb,YAAMC,IAAI,EAAEH,EAAQ;AACpB,iBAAW,MAAM;AACf,QAAIA,EAAQ,UAAUG,MACpBJ,EAAU,QAAQ;AAAA,MAEtB,GAAG,GAAI;AAAA,IACT;AAAA,EACF,GAAG,EAAE,WAAW,IAAM;AAEtB,QAAMK,IAAShB,EAAS,MAAA;;AAAM,YAAAE,KAAAC,IAAAM,EAAK,UAAL,gBAAAN,EAAY,aAAZ,gBAAAD,EAAsB;AAAA,GAAM,GAEpDe,IAASjB,EAAS,MAAA;;AAAM,YAAC,GAACG,IAAAa,EAAO,UAAP,QAAAb,EAAc;AAAA,GAAM,GAE9Ce,IAASlB,EAAS;;AAAM,WAAAM,EAAY,SAAQH,IAAAa,EAAO,UAAP,gBAAAb,EAAc,SAAS;AAAA,GAAU,GAE7EgB,IAAgBnB,EAAS,MAAA;;AAAM,YAAAG,IAAAa,EAAO,UAAP,gBAAAb,EAAc;AAAA,GAAa,GAE1DiB,IAAqBpB,EAAS,MAAA;;AAAM,YAAAG,IAAAa,EAAO,UAAP,gBAAAb,EAAc,IAAI;AAAA,GAAkB,GAExEkB,IAASrB,EAAS,MAAA;;AAAM,YAAAG,IAAAa,EAAO,UAAP,gBAAAb,EAAc,IAAI;AAAA,GAAM,GAEhDmB,IAAU,MAAM;;AACpB,IAAAX,EAAU,QAAQ,MACjBR,IAAAJ,EAAI,UAAJ,gBAAAI,EAAW,MAAM,MAAiC,aAAe,oBAAI,KAAA,GAAO,YAAA;AAAA,EAC/E;AAEA,SAAAU,EAAMI,GAAQ,CAACF,MAAM;;AACnB,IAAId,EAAgB,YACjBE,IAAAJ,EAAI,UAAJ,gBAAAI,EAAW,MAAM,MAAiC,cAAiBY;AAAA,EAExE,CAAC,GAEGd,EAAgB,SAClBsB,EAAcD,GAAS,GAAM,GAGxB;AAAA,IACL,iBAAArB;AAAA,IACA,QAAAe;AAAA,IACA,OAAAT;AAAA,IACA,QAAAU;AAAA,IACA,QAAAC;AAAA,IACA,eAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,QAAAC;AAAA,IACA,SAAAC;AAAA,IACA,SAAAV;AAAA,IACA,WAAAD;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"useInfo.js","sources":["../../../src/plugins/Monetization/useInfo.ts"],"sourcesContent":["import { computed, watch, ref } from 'vue';\nimport { useSdkPlugin } from '../../defineApp';\nimport { Response } from './validation';\nimport { useIntervalFn } from '@vueuse/core';\n\nexport function useInfo() {\n const sdk = useSdkPlugin();\n\n const app = computed(() => (sdk.loaded ? sdk.useApp() : undefined));\n\n const hasMonetization = computed(() => '__mnzDate' in (app.value?.model?.args as Record<string, unknown>));\n\n const parsed = computed(() => Response.safeParse(app.value?.model.outputs['__mnzInfo']));\n\n const currentInfo = computed<Response | undefined>(() => parsed.value?.data);\n\n const error = computed(() => parsed.value?.error ?? info.value?.response?.error);\n\n const info = ref<Response | undefined>(undefined);\n\n const isLoading = ref(false);\n\n const version = ref(0);\n\n watch([currentInfo], ([i]) => {\n if (i) {\n info.value = i;\n const v = ++version.value;\n setTimeout(() => {\n if (version.value === v) {\n isLoading.value = false;\n }\n }, 1000);\n }\n }, { immediate: true });\n\n const result = computed(() => info.value?.response?.result);\n\n const canRun = computed(() => !!result.value?.canRun);\n\n const status = computed(() => currentInfo.value ? result.value?.status : '');\n\n const customerEmail = computed(() => result.value?.customerEmail);\n\n const endOfBillingPeriod = computed(() => result.value?.mnz.endOfBillingPeriod);\n\n const limits = computed(() => result.value?.mnz.limits);\n\n const refresh = () => {\n isLoading.value = true;\n (app.value?.model.args as Record<string, unknown>)['__mnzDate'] = new Date().toISOString();\n };\n\n watch(canRun, (v) => {\n if (hasMonetization.value) {\n (app.value?.model.args as Record<string, unknown>)['__mnzCanRun'] = v;\n }\n });\n\n if (hasMonetization.value) {\n useIntervalFn(refresh, 60_000); // 1 minute\n }\n\n return {\n hasMonetization,\n result,\n error,\n canRun,\n status,\n customerEmail,\n endOfBillingPeriod,\n limits,\n refresh,\n version,\n isLoading,\n };\n}\n"],"names":["useInfo","sdk","useSdkPlugin","app","computed","hasMonetization","_b","_a","parsed","Response","currentInfo","error","_c","info","ref","isLoading","version","watch","i","v","result","canRun","status","customerEmail","endOfBillingPeriod","limits","refresh","useIntervalFn"],"mappings":";;;;AAKO,SAASA,IAAU;AACxB,QAAMC,IAAMC,EAAA,GAENC,IAAMC,EAAS,MAAOH,EAAI,SAASA,EAAI,OAAA,IAAW,MAAU,GAE5DI,IAAkBD,EAAS,MAAA;;AAAM,4BAAgBE,KAAAC,IAAAJ,EAAI,UAAJ,gBAAAI,EAAW,UAAX,gBAAAD,EAAkB;AAAA,GAAgC,GAEnGE,IAASJ,EAAS,MAAA;;AAAM,WAAAK,EAAS,WAAUF,IAAAJ,EAAI,UAAJ,gBAAAI,EAAW,MAAM,QAAQ,SAAY;AAAA,GAAC,GAEjFG,IAAcN,EAA+B,MAAA;;AAAM,YAAAG,IAAAC,EAAO,UAAP,gBAAAD,EAAc;AAAA,GAAI,GAErEI,IAAQP,EAAS,MAAA;;AAAM,aAAAG,IAAAC,EAAO,UAAP,gBAAAD,EAAc,YAASK,KAAAN,IAAAO,EAAK,UAAL,gBAAAP,EAAY,aAAZ,gBAAAM,EAAsB;AAAA,GAAK,GAEzEC,IAAOC,EAA0B,MAAS,GAE1CC,IAAYD,EAAI,EAAK,GAErBE,IAAUF,EAAI,CAAC;AAErB,EAAAG,EAAM,CAACP,CAAW,GAAG,CAAC,CAACQ,CAAC,MAAM;AAC5B,QAAIA,GAAG;AACL,MAAAL,EAAK,QAAQK;AACb,YAAMC,IAAI,EAAEH,EAAQ;AACpB,iBAAW,MAAM;AACf,QAAIA,EAAQ,UAAUG,MACpBJ,EAAU,QAAQ;AAAA,MAEtB,GAAG,GAAI;AAAA,IACT;AAAA,EACF,GAAG,EAAE,WAAW,IAAM;AAEtB,QAAMK,IAAShB,EAAS,MAAA;;AAAM,YAAAE,KAAAC,IAAAM,EAAK,UAAL,gBAAAN,EAAY,aAAZ,gBAAAD,EAAsB;AAAA,GAAM,GAEpDe,IAASjB,EAAS,MAAA;;AAAM,YAAC,GAACG,IAAAa,EAAO,UAAP,QAAAb,EAAc;AAAA,GAAM,GAE9Ce,IAASlB,EAAS;;AAAM,WAAAM,EAAY,SAAQH,IAAAa,EAAO,UAAP,gBAAAb,EAAc,SAAS;AAAA,GAAE,GAErEgB,IAAgBnB,EAAS,MAAA;;AAAM,YAAAG,IAAAa,EAAO,UAAP,gBAAAb,EAAc;AAAA,GAAa,GAE1DiB,IAAqBpB,EAAS,MAAA;;AAAM,YAAAG,IAAAa,EAAO,UAAP,gBAAAb,EAAc,IAAI;AAAA,GAAkB,GAExEkB,IAASrB,EAAS,MAAA;;AAAM,YAAAG,IAAAa,EAAO,UAAP,gBAAAb,EAAc,IAAI;AAAA,GAAM,GAEhDmB,IAAU,MAAM;;AACpB,IAAAX,EAAU,QAAQ,MACjBR,IAAAJ,EAAI,UAAJ,gBAAAI,EAAW,MAAM,MAAiC,aAAe,oBAAI,KAAA,GAAO,YAAA;AAAA,EAC/E;AAEA,SAAAU,EAAMI,GAAQ,CAACF,MAAM;;AACnB,IAAId,EAAgB,YACjBE,IAAAJ,EAAI,UAAJ,gBAAAI,EAAW,MAAM,MAAiC,cAAiBY;AAAA,EAExE,CAAC,GAEGd,EAAgB,SAClBsB,EAAcD,GAAS,GAAM,GAGxB;AAAA,IACL,iBAAArB;AAAA,IACA,QAAAe;AAAA,IACA,OAAAT;AAAA,IACA,QAAAU;AAAA,IACA,QAAAC;AAAA,IACA,eAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,QAAAC;AAAA,IACA,SAAAC;AAAA,IACA,SAAAV;AAAA,IACA,WAAAD;AAAA,EAAA;AAEJ;"}