@burdenoff/fe-libs 2026.926.4 → 2026.926.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ProductPickerSheet.d.ts","sourceRoot":"","sources":["../../src/chrome/ProductPickerSheet.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAO3C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAkCD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9C;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CAuH1D,CAAC"}
1
+ {"version":3,"file":"ProductPickerSheet.d.ts","sourceRoot":"","sources":["../../src/chrome/ProductPickerSheet.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQ3C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAkCD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9C;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CAuH1D,CAAC"}
@@ -1,110 +1,111 @@
1
- import { Sheet as e, SheetContent as t, SheetHeader as n, SheetTitle as r } from "../ui/sheet.js";
2
- import { filterProducts as i, resolveProductLogo as a } from "./ProductSwitcher.js";
3
- import { useMemo as o, useState as s } from "react";
4
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
1
+ import { isSameProductSlug as e } from "../shared/config/productSlug.js";
2
+ import { Sheet as t, SheetContent as n, SheetHeader as r, SheetTitle as i } from "../ui/sheet.js";
3
+ import { filterProducts as a, resolveProductLogo as o } from "./ProductSwitcher.js";
4
+ import { useMemo as s, useState as c } from "react";
5
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
5
6
  //#region src/chrome/ProductPickerSheet.tsx
6
- var u = 6, d = ({ product: e }) => {
7
- let [t, n] = s(!1), r = a(e);
8
- return r && !t ? /* @__PURE__ */ c("div", {
7
+ var d = 6, f = ({ product: e }) => {
8
+ let [t, n] = c(!1), r = o(e);
9
+ return r && !t ? /* @__PURE__ */ l("div", {
9
10
  className: "size-10 rounded-lg bg-white p-1 ring-1 ring-border-default dark:ring-border-strong flex items-center justify-center flex-shrink-0 overflow-hidden",
10
- children: /* @__PURE__ */ c("img", {
11
+ children: /* @__PURE__ */ l("img", {
11
12
  src: r,
12
13
  alt: e.name,
13
14
  className: "size-full object-contain",
14
15
  onError: () => n(!0)
15
16
  })
16
- }) : e.icon ? /* @__PURE__ */ c("div", {
17
+ }) : e.icon ? /* @__PURE__ */ l("div", {
17
18
  className: "size-10 rounded-lg bg-[var(--color-accent-soft)] flex items-center justify-center flex-shrink-0",
18
19
  children: e.icon
19
- }) : /* @__PURE__ */ c("div", {
20
+ }) : /* @__PURE__ */ l("div", {
20
21
  className: "size-10 rounded-lg bg-action-primary-bg flex items-center justify-center flex-shrink-0",
21
- children: /* @__PURE__ */ c("span", {
22
+ children: /* @__PURE__ */ l("span", {
22
23
  className: "text-action-primary-text font-bold text-sm",
23
24
  children: e.name.substring(0, 2).toUpperCase()
24
25
  })
25
26
  });
26
- }, f = ({ open: a, onOpenChange: f, products: p, currentProductId: m, onProductChange: h }) => {
27
- let [g, _] = s(""), v = p.length > u, y = o(() => i(p, g), [p, g]), b = (e) => {
28
- h && h(e), f(!1);
27
+ }, p = ({ open: o, onOpenChange: p, products: m, currentProductId: h, onProductChange: g }) => {
28
+ let [_, v] = c(""), y = m.length > d, b = s(() => a(m, _), [m, _]), x = (e) => {
29
+ g && g(e), p(!1);
29
30
  };
30
- return /* @__PURE__ */ c(e, {
31
- open: a,
31
+ return /* @__PURE__ */ l(t, {
32
+ open: o,
32
33
  onOpenChange: (e) => {
33
- e || _(""), f(e);
34
+ e || v(""), p(e);
34
35
  },
35
- children: /* @__PURE__ */ l(t, {
36
+ children: /* @__PURE__ */ u(n, {
36
37
  side: "bottom",
37
38
  className: "h-[60vh] flex flex-col p-0",
38
39
  children: [
39
- /* @__PURE__ */ c(n, {
40
+ /* @__PURE__ */ l(r, {
40
41
  className: "px-4 pt-4 pb-2 border-b border-border-subtle",
41
- children: /* @__PURE__ */ c(r, {
42
+ children: /* @__PURE__ */ l(i, {
42
43
  className: "text-text-primary",
43
44
  children: "Switch Product"
44
45
  })
45
46
  }),
46
- v && /* @__PURE__ */ l("div", {
47
+ y && /* @__PURE__ */ u("div", {
47
48
  className: "relative px-4 py-2 border-b border-border-subtle",
48
- children: [/* @__PURE__ */ c("svg", {
49
+ children: [/* @__PURE__ */ l("svg", {
49
50
  className: "pointer-events-none absolute left-7 top-1/2 -translate-y-1/2 size-4 text-text-muted",
50
51
  fill: "none",
51
52
  stroke: "currentColor",
52
53
  viewBox: "0 0 24 24",
53
- children: /* @__PURE__ */ c("path", {
54
+ children: /* @__PURE__ */ l("path", {
54
55
  strokeLinecap: "round",
55
56
  strokeLinejoin: "round",
56
57
  strokeWidth: 2,
57
58
  d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"
58
59
  })
59
- }), /* @__PURE__ */ c("input", {
60
+ }), /* @__PURE__ */ l("input", {
60
61
  type: "text",
61
- value: g,
62
- onChange: (e) => _(e.target.value),
62
+ value: _,
63
+ onChange: (e) => v(e.target.value),
63
64
  placeholder: "Search products…",
64
65
  "aria-label": "Search products",
65
66
  className: "w-full rounded-md border border-border-subtle bg-bg-surface py-2.5 pl-9 pr-3 text-sm text-text-primary placeholder:text-text-muted focus:border-transparent focus:outline-none focus:ring-2 focus:ring-[var(--color-action-primary-border)]"
66
67
  })]
67
68
  }),
68
- /* @__PURE__ */ l("div", {
69
+ /* @__PURE__ */ u("div", {
69
70
  className: "flex-1 overflow-y-auto py-2",
70
- children: [y.length === 0 && /* @__PURE__ */ l("p", {
71
+ children: [b.length === 0 && /* @__PURE__ */ u("p", {
71
72
  className: "px-4 py-6 text-center text-body-sm text-text-muted",
72
73
  children: [
73
74
  "No products match “",
74
- g,
75
+ _,
75
76
  "”"
76
77
  ]
77
- }), y.map((e) => /* @__PURE__ */ l("button", {
78
- onClick: () => b(e),
79
- className: `w-full flex items-center gap-4 px-4 py-3.5 text-body-sm transition-colors ${e.id === m ? "bg-[var(--color-accent-soft)]" : "hover:bg-bg-sunken"}`,
78
+ }), b.map((t) => /* @__PURE__ */ u("button", {
79
+ onClick: () => x(t),
80
+ className: `w-full flex items-center gap-4 px-4 py-3.5 text-body-sm transition-colors ${e(t.id, h) ? "bg-[var(--color-accent-soft)]" : "hover:bg-bg-sunken"}`,
80
81
  children: [
81
- /* @__PURE__ */ c(d, { product: e }),
82
- /* @__PURE__ */ l("div", {
82
+ /* @__PURE__ */ l(f, { product: t }),
83
+ /* @__PURE__ */ u("div", {
83
84
  className: "flex-1 text-left min-w-0",
84
- children: [/* @__PURE__ */ c("p", {
85
+ children: [/* @__PURE__ */ l("p", {
85
86
  className: "font-medium text-text-primary",
86
- children: e.name
87
- }), e.description && /* @__PURE__ */ c("p", {
87
+ children: t.name
88
+ }), t.description && /* @__PURE__ */ l("p", {
88
89
  className: "text-xs text-text-secondary truncate",
89
- children: e.description
90
+ children: t.description
90
91
  })]
91
92
  }),
92
- e.id === m && /* @__PURE__ */ c("svg", {
93
+ e(t.id, h) && /* @__PURE__ */ l("svg", {
93
94
  className: "size-5 text-action-primary-bg flex-shrink-0",
94
95
  fill: "currentColor",
95
96
  viewBox: "0 0 20 20",
96
- children: /* @__PURE__ */ c("path", {
97
+ children: /* @__PURE__ */ l("path", {
97
98
  fillRule: "evenodd",
98
99
  d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",
99
100
  clipRule: "evenodd"
100
101
  })
101
102
  }),
102
- e.url && e.id !== m && /* @__PURE__ */ c("svg", {
103
+ t.url && !e(t.id, h) && /* @__PURE__ */ l("svg", {
103
104
  className: "size-4 text-text-muted flex-shrink-0",
104
105
  fill: "none",
105
106
  stroke: "currentColor",
106
107
  viewBox: "0 0 24 24",
107
- children: /* @__PURE__ */ c("path", {
108
+ children: /* @__PURE__ */ l("path", {
108
109
  strokeLinecap: "round",
109
110
  strokeLinejoin: "round",
110
111
  strokeWidth: 2,
@@ -112,11 +113,11 @@ var u = 6, d = ({ product: e }) => {
112
113
  })
113
114
  })
114
115
  ]
115
- }, e.id))]
116
+ }, t.id))]
116
117
  })
117
118
  ]
118
119
  })
119
120
  });
120
121
  };
121
122
  //#endregion
122
- export { f as ProductPickerSheet };
123
+ export { p as ProductPickerSheet };
@@ -1 +1 @@
1
- {"version":3,"file":"ProductSwitcher.d.ts","sourceRoot":"","sources":["../../src/chrome/ProductSwitcher.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAWhC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,GAAG,SAAS,CAKrB;AA0CD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACzF,QAAQ,EAAE,CAAC,EAAE,EACb,KAAK,EAAE,MAAM,GACZ,CAAC,EAAE,CASL;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,EAAE,EACnB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,GAAG,SAAS,CAOrB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAgNpD,CAAC"}
1
+ {"version":3,"file":"ProductSwitcher.d.ts","sourceRoot":"","sources":["../../src/chrome/ProductSwitcher.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAYhC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,GAAG,SAAS,CAKrB;AA0CD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACzF,QAAQ,EAAE,CAAC,EAAE,EACb,KAAK,EAAE,MAAM,GACZ,CAAC,EAAE,CASL;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,EAAE,EACnB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,GAAG,SAAS,CAOrB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAgNpD,CAAC"}
@@ -1,82 +1,83 @@
1
- import { getProductsWithUrls as e } from "../shared/config/products.js";
2
- import { useShellLabel as t } from "../shared/providers/shell/useShellLabel.js";
3
- import { useEffect as n, useMemo as r, useRef as i, useState as a } from "react";
4
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
1
+ import { isSameProductSlug as e } from "../shared/config/productSlug.js";
2
+ import { getProductsWithUrls as t } from "../shared/config/products.js";
3
+ import { useShellLabel as n } from "../shared/providers/shell/useShellLabel.js";
4
+ import { useEffect as r, useMemo as i, useRef as a, useState as o } from "react";
5
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
5
6
  //#region src/chrome/ProductSwitcher.tsx
6
- var c = 6;
7
- function l(e) {
7
+ var l = 6;
8
+ function u(e) {
8
9
  if (e?.logoUrl) return e.logoUrl;
9
10
  let t = e?.url;
10
11
  if (!(!t || t === "#")) return `${t.replace(/\/+$/, "")}/icons/icon.svg`;
11
12
  }
12
- var u = ({ product: e, sizeClass: t, textClass: n }) => {
13
- let [r, i] = a(!1), s = l(e), c = !!s && !r;
14
- return /* @__PURE__ */ o("div", {
13
+ var d = ({ product: e, sizeClass: t, textClass: n }) => {
14
+ let [r, i] = o(!1), a = u(e), c = !!a && !r;
15
+ return /* @__PURE__ */ s("div", {
15
16
  className: `${t} rounded-md flex items-center justify-center flex-shrink-0 overflow-hidden ${c ? "bg-white p-0.5 ring-1 ring-border-default dark:ring-border-strong" : `text-text-inverse font-semibold ${n}`}`,
16
17
  style: c ? void 0 : { backgroundColor: e?.color || "var(--color-action-primary-bg)" },
17
- children: c ? /* @__PURE__ */ o("img", {
18
- src: s,
18
+ children: c ? /* @__PURE__ */ s("img", {
19
+ src: a,
19
20
  alt: e?.name ?? "",
20
21
  className: "size-full object-contain",
21
22
  onError: () => i(!0)
22
23
  }) : e?.icon || e?.name.charAt(0)
23
24
  });
24
25
  };
25
- function d(e, t) {
26
+ function f(e, t) {
26
27
  let n = t.trim().toLowerCase();
27
28
  return n ? e.filter((e) => e.name.toLowerCase().includes(n) || e.id.toLowerCase().includes(n) || (e.description ? e.description.toLowerCase().includes(n) : !1)) : e;
28
29
  }
29
- function f(t, n) {
30
- return t.find((e) => e.id === n) || (n ? e().find((e) => e.id === n) || {
31
- id: n,
32
- name: n,
30
+ function p(n, r) {
31
+ return n.find((t) => e(t.id, r)) || (r ? t().find((t) => e(t.id, r)) || {
32
+ id: r,
33
+ name: r,
33
34
  url: "#"
34
- } : t[0]);
35
+ } : n[0]);
35
36
  }
36
- var p = ({ products: e, currentProductId: l, onProductChange: p, compact: m = !1 }) => {
37
- let h = t(), [g, _] = a(!1), [v, y] = a(""), b = i(null), x = i(null), S = f(e, l), C = e.length > c, w = r(() => d(e, v), [e, v]);
38
- n(() => {
37
+ var m = ({ products: t, currentProductId: u, onProductChange: m, compact: h = !1 }) => {
38
+ let g = n(), [_, v] = o(!1), [y, b] = o(""), x = a(null), S = a(null), C = p(t, u), w = t.length > l, T = i(() => f(t, y), [t, y]);
39
+ r(() => {
39
40
  let e = (e) => {
40
- b.current && !b.current.contains(e.target) && _(!1);
41
+ x.current && !x.current.contains(e.target) && v(!1);
41
42
  };
42
- if (g) return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
43
- }, [g]), n(() => {
44
- if (!g) {
45
- y("");
43
+ if (_) return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
44
+ }, [_]), r(() => {
45
+ if (!_) {
46
+ b("");
46
47
  return;
47
48
  }
48
- if (C) {
49
- let e = setTimeout(() => x.current?.focus(), 60);
49
+ if (w) {
50
+ let e = setTimeout(() => S.current?.focus(), 60);
50
51
  return () => clearTimeout(e);
51
52
  }
52
- }, [g, C]);
53
- let T = (e) => {
54
- e.comingSoon || (p ? p(e) : window.location.href = e.url, _(!1));
53
+ }, [_, w]);
54
+ let E = (e) => {
55
+ e.comingSoon || (m ? m(e) : window.location.href = e.url, v(!1));
55
56
  };
56
- return /* @__PURE__ */ s("div", {
57
+ return /* @__PURE__ */ c("div", {
57
58
  className: "relative",
58
- ref: b,
59
- children: [/* @__PURE__ */ s("button", {
60
- onClick: () => _(!g),
61
- className: `flex items-center gap-2 px-3 py-2 rounded-button hover:bg-bg-sunken transition-colors ${g ? "bg-bg-sunken" : ""}`,
62
- "aria-label": h("productSwitcher.title", "Switch product"),
63
- "aria-expanded": g,
59
+ ref: x,
60
+ children: [/* @__PURE__ */ c("button", {
61
+ onClick: () => v(!_),
62
+ className: `flex items-center gap-2 px-3 py-2 rounded-button hover:bg-bg-sunken transition-colors ${_ ? "bg-bg-sunken" : ""}`,
63
+ "aria-label": g("productSwitcher.title", "Switch product"),
64
+ "aria-expanded": _,
64
65
  children: [
65
- /* @__PURE__ */ o(u, {
66
- product: S,
66
+ /* @__PURE__ */ s(d, {
67
+ product: C,
67
68
  sizeClass: "size-6",
68
69
  textClass: "text-xs"
69
70
  }),
70
- !m && /* @__PURE__ */ o("span", {
71
+ !h && /* @__PURE__ */ s("span", {
71
72
  className: "text-body-sm font-medium text-text-primary",
72
- children: S?.name
73
+ children: C?.name
73
74
  }),
74
- !m && /* @__PURE__ */ o("svg", {
75
- className: `w-4 h-4 text-text-secondary transition-transform ${g ? "rotate-180" : ""}`,
75
+ !h && /* @__PURE__ */ s("svg", {
76
+ className: `w-4 h-4 text-text-secondary transition-transform ${_ ? "rotate-180" : ""}`,
76
77
  fill: "none",
77
78
  stroke: "currentColor",
78
79
  viewBox: "0 0 24 24",
79
- children: /* @__PURE__ */ o("path", {
80
+ children: /* @__PURE__ */ s("path", {
80
81
  strokeLinecap: "round",
81
82
  strokeLinejoin: "round",
82
83
  strokeWidth: 2,
@@ -84,54 +85,54 @@ var p = ({ products: e, currentProductId: l, onProductChange: p, compact: m = !1
84
85
  })
85
86
  })
86
87
  ]
87
- }), g && /* @__PURE__ */ s("div", {
88
+ }), _ && /* @__PURE__ */ c("div", {
88
89
  className: "absolute right-0 mt-2 w-[calc(100vw-1.5rem)] sm:w-72 max-w-72 bg-bg-elevated border border-border-subtle rounded-card shadow-[var(--shadow-elevation-4)] z-50 py-2 overflow-hidden animate-in fade-in-0 zoom-in-95 slide-in-from-top-2 duration-200",
89
90
  children: [
90
- /* @__PURE__ */ o("div", {
91
+ /* @__PURE__ */ s("div", {
91
92
  className: "px-4 py-2 border-b border-border-subtle",
92
- children: /* @__PURE__ */ o("p", {
93
+ children: /* @__PURE__ */ s("p", {
93
94
  className: "text-[11px] font-medium text-text-muted uppercase tracking-wider",
94
- children: h("productSwitcher.title", "Switch Product")
95
+ children: g("productSwitcher.title", "Switch Product")
95
96
  })
96
97
  }),
97
- C && /* @__PURE__ */ s("div", {
98
+ w && /* @__PURE__ */ c("div", {
98
99
  className: "relative px-3 py-2 border-b border-border-subtle",
99
100
  children: [
100
- /* @__PURE__ */ o("svg", {
101
+ /* @__PURE__ */ s("svg", {
101
102
  className: "pointer-events-none absolute left-6 top-1/2 -translate-y-1/2 size-4 text-text-muted",
102
103
  fill: "none",
103
104
  stroke: "currentColor",
104
105
  viewBox: "0 0 24 24",
105
- children: /* @__PURE__ */ o("path", {
106
+ children: /* @__PURE__ */ s("path", {
106
107
  strokeLinecap: "round",
107
108
  strokeLinejoin: "round",
108
109
  strokeWidth: 2,
109
110
  d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"
110
111
  })
111
112
  }),
112
- /* @__PURE__ */ o("input", {
113
- ref: x,
113
+ /* @__PURE__ */ s("input", {
114
+ ref: S,
114
115
  type: "text",
115
- value: v,
116
- onChange: (e) => y(e.target.value),
116
+ value: y,
117
+ onChange: (e) => b(e.target.value),
117
118
  onKeyDown: (e) => {
118
- e.key === "Escape" && (v ? (e.stopPropagation(), y("")) : _(!1));
119
+ e.key === "Escape" && (y ? (e.stopPropagation(), b("")) : v(!1));
119
120
  },
120
- placeholder: h("productSwitcher.searchPlaceholder", "Search products…"),
121
- "aria-label": h("productSwitcher.searchAria", "Search products"),
121
+ placeholder: g("productSwitcher.searchPlaceholder", "Search products…"),
122
+ "aria-label": g("productSwitcher.searchAria", "Search products"),
122
123
  className: "w-full rounded-md border border-border-subtle bg-bg-surface py-2 pl-9 pr-8 text-sm text-text-primary placeholder:text-text-muted transition-all duration-200 focus:border-transparent focus:outline-none focus:ring-2 focus:ring-[var(--color-action-primary-border)]"
123
124
  }),
124
- v && /* @__PURE__ */ o("button", {
125
+ y && /* @__PURE__ */ s("button", {
125
126
  type: "button",
126
- onClick: () => y(""),
127
- "aria-label": h("common.clearSearch", "Clear search"),
127
+ onClick: () => b(""),
128
+ "aria-label": g("common.clearSearch", "Clear search"),
128
129
  className: "absolute right-5 top-1/2 -translate-y-1/2 rounded-button p-1 text-text-muted transition-colors hover:bg-bg-sunken hover:text-text-primary",
129
- children: /* @__PURE__ */ o("svg", {
130
+ children: /* @__PURE__ */ s("svg", {
130
131
  className: "size-4",
131
132
  fill: "none",
132
133
  stroke: "currentColor",
133
134
  viewBox: "0 0 24 24",
134
- children: /* @__PURE__ */ o("path", {
135
+ children: /* @__PURE__ */ s("path", {
135
136
  strokeLinecap: "round",
136
137
  strokeLinejoin: "round",
137
138
  strokeWidth: 2,
@@ -141,50 +142,50 @@ var p = ({ products: e, currentProductId: l, onProductChange: p, compact: m = !1
141
142
  })
142
143
  ]
143
144
  }),
144
- /* @__PURE__ */ s("div", {
145
+ /* @__PURE__ */ c("div", {
145
146
  className: "py-1 max-h-96 overflow-y-auto",
146
- children: [w.length === 0 && /* @__PURE__ */ s("p", {
147
+ children: [T.length === 0 && /* @__PURE__ */ c("p", {
147
148
  className: "px-4 py-6 text-center text-body-sm text-text-muted",
148
149
  children: [
149
150
  "No products match “",
150
- v,
151
+ y,
151
152
  "”"
152
153
  ]
153
- }), w.map((e) => /* @__PURE__ */ s("button", {
154
- onClick: () => T(e),
155
- disabled: e.comingSoon,
156
- "aria-disabled": e.comingSoon,
157
- title: e.comingSoon ? h("productSwitcher.soon", "Soon") : e.name,
158
- className: `w-full flex items-center gap-3 px-4 py-2.5 text-body-sm transition-colors ${e.comingSoon ? "text-text-muted cursor-not-allowed opacity-60" : e.id === l ? "bg-[var(--color-accent-soft)] text-text-primary font-medium" : "text-text-primary hover:bg-bg-sunken"}`,
154
+ }), T.map((t) => /* @__PURE__ */ c("button", {
155
+ onClick: () => E(t),
156
+ disabled: t.comingSoon,
157
+ "aria-disabled": t.comingSoon,
158
+ title: t.comingSoon ? g("productSwitcher.soon", "Soon") : t.name,
159
+ className: `w-full flex items-center gap-3 px-4 py-2.5 text-body-sm transition-colors ${t.comingSoon ? "text-text-muted cursor-not-allowed opacity-60" : e(t.id, u) ? "bg-[var(--color-accent-soft)] text-text-primary font-medium" : "text-text-primary hover:bg-bg-sunken"}`,
159
160
  children: [
160
- /* @__PURE__ */ o(u, {
161
- product: e,
161
+ /* @__PURE__ */ s(d, {
162
+ product: t,
162
163
  sizeClass: "size-8",
163
164
  textClass: "text-sm"
164
165
  }),
165
- /* @__PURE__ */ o("span", {
166
+ /* @__PURE__ */ s("span", {
166
167
  className: "flex-1 text-left leading-tight",
167
- children: e.name
168
+ children: t.name
168
169
  }),
169
- e.comingSoon ? /* @__PURE__ */ o("span", {
170
+ t.comingSoon ? /* @__PURE__ */ s("span", {
170
171
  className: "shrink-0 whitespace-nowrap rounded-full border border-border-subtle bg-bg-sunken px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-text-secondary",
171
- children: h("productSwitcher.soon", "Soon")
172
- }) : e.id === l && /* @__PURE__ */ o("svg", {
172
+ children: g("productSwitcher.soon", "Soon")
173
+ }) : e(t.id, u) && /* @__PURE__ */ s("svg", {
173
174
  className: "size-5 text-action-primary-bg",
174
175
  fill: "currentColor",
175
176
  viewBox: "0 0 20 20",
176
- children: /* @__PURE__ */ o("path", {
177
+ children: /* @__PURE__ */ s("path", {
177
178
  fillRule: "evenodd",
178
179
  d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",
179
180
  clipRule: "evenodd"
180
181
  })
181
182
  })
182
183
  ]
183
- }, e.id))]
184
+ }, t.id))]
184
185
  })
185
186
  ]
186
187
  })]
187
188
  });
188
189
  };
189
190
  //#endregion
190
- export { p as ProductSwitcher, d as filterProducts, l as resolveProductLogo };
191
+ export { m as ProductSwitcher, f as filterProducts, u as resolveProductLogo };
@@ -68,8 +68,10 @@ export { resolveGatewayUrls } from './gatewayUrls';
68
68
  export type { RuntimeGatewayUrls } from './gatewayUrls';
69
69
  export { resolveAuthBridgeConfig, resolveShellAuthBridgeConfig } from './authBridgeUrls';
70
70
  export type { RuntimeAuthBridgeConfig } from './authBridgeUrls';
71
- export { PRODUCTS, PRODUCT_URLS, getProductUrl, getProductsWithUrls } from './products';
71
+ export { PRODUCTS, PRODUCT_URLS, BOTMANOR_PRODUCT_SLUG, getProductUrl, getProductsWithUrls, findProductConfig, } from './products';
72
72
  export type { ProductConfig } from './products';
73
+ export { PRODUCT_SLUG_RENAMES, PRODUCT_SLUG_EMIT, normalizeProductSlug, legacyProductSlug, isSameProductSlug, emitProductSlug, } from './productSlug';
74
+ export type { ProductSlugRename } from './productSlug';
73
75
  export { getShellConfig, isShellLessRoute, shouldShowSidebar, shouldShowBreadcrumb, DEFAULT_SHELL_CONFIG, COMMON_SHELL_LESS_ROUTES, } from './shellRoutes';
74
76
  export type { ShellRouteConfig } from './shellRoutes';
75
77
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/config/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ;;QAEjB,uCAAuC;;QAEvC,4BAA4B;;QAE5B,6FAA6F;;;;QAI7F,uCAAuC;;QAEvC,4BAA4B;;QAE5B,6FAA6F;;QAE7F,uDAAuD;;;CAGjD,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;AACjD,MAAM,MAAM,OAAO,GAAG,MAAM,OAAO,QAAQ,CAAC;AAE5C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,CAMlF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO;IApC7C,uCAAuC;;IAEvC,4BAA4B;;IAE5B,6FAA6F;;;IAI7F,uCAAuC;;IAEvC,4BAA4B;;IAE5B,6FAA6F;;IAE7F,uDAAuD;;EAwB1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAanF;AAYD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxD,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AACzF,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAGhE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACxF,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/config/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ;;QAEjB,uCAAuC;;QAEvC,4BAA4B;;QAE5B,6FAA6F;;;;QAI7F,uCAAuC;;QAEvC,4BAA4B;;QAE5B,6FAA6F;;QAE7F,uDAAuD;;;CAGjD,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;AACjD,MAAM,MAAM,OAAO,GAAG,MAAM,OAAO,QAAQ,CAAC;AAE5C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,CAMlF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO;IApC7C,uCAAuC;;IAEvC,4BAA4B;;IAE5B,6FAA6F;;;IAI7F,uCAAuC;;IAEvC,4BAA4B;;IAE5B,6FAA6F;;IAE7F,uDAAuD;;EAwB1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAanF;AAYD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxD,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AACzF,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAGhE,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Product slug aliases for products whose machine slug is being renamed
3
+ * (today: `botlit` -> `botmanor`, botmanor-migration PLAN Stage 0 / WP-E).
4
+ *
5
+ * - Readers accept both slugs: compare with {@link isSameProductSlug}, look up
6
+ * keyed maps with `map[slug] ?? map[legacyProductSlug(slug)]`.
7
+ * - Writers emit {@link emitProductSlug}, which follows {@link PRODUCT_SLUG_EMIT}.
8
+ * It stays `"legacy"` until the stage that flips the slug; the flip is that
9
+ * one line plus a release.
10
+ *
11
+ * Local mirror of `@burdenoff/website-sdk`'s `utils/product-slug.ts` (and the
12
+ * product-slug concern of `@burdenoff/be-sdk/product-alias`), so fe-libs does
13
+ * not take a dependency on either SDK for ~20 lines of pure code.
14
+ *
15
+ * @module @burdenoff/fe-libs/shared/config/productSlug
16
+ */
17
+ /** One product whose slug is being renamed. Both values are lowercase. */
18
+ export interface ProductSlugRename {
19
+ readonly legacy: string;
20
+ readonly current: string;
21
+ }
22
+ /** Every product slug rename in flight. */
23
+ export declare const PRODUCT_SLUG_RENAMES: readonly ProductSlugRename[];
24
+ /** Which slug writers emit: the old one until the rename stage flips it. */
25
+ export declare const PRODUCT_SLUG_EMIT: Readonly<{
26
+ productSlug: 'legacy' | 'current';
27
+ }>;
28
+ /** `botlit` (any case) -> `botmanor`; every other slug is returned unchanged. */
29
+ export declare function normalizeProductSlug(slug: string): string;
30
+ /** Old spelling of a renamed slug (`botmanor` -> `botlit`); every other slug unchanged. */
31
+ export declare function legacyProductSlug(slug: string): string;
32
+ /** True when `a` and `b` are the same product under the rename. */
33
+ export declare function isSameProductSlug(a: string | null | undefined, b: string | null | undefined): boolean;
34
+ /** The slug writers should use today, from either spelling. */
35
+ export declare function emitProductSlug(slug: string): string;
36
+ //# sourceMappingURL=productSlug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"productSlug.d.ts","sourceRoot":"","sources":["../../../src/shared/config/productSlug.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EAE3D,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC;IAAE,WAAW,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,CAE5E,CAAC;AAOH,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC5B,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC3B,OAAO,CAGT;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIpD"}
@@ -0,0 +1,23 @@
1
+ //#region src/shared/config/productSlug.ts
2
+ var e = Object.freeze([Object.freeze({
3
+ legacy: "botlit",
4
+ current: "botmanor"
5
+ })]), t = Object.freeze({ productSlug: "legacy" });
6
+ function n(t) {
7
+ let n = t.toLowerCase();
8
+ return e.find((e) => e.legacy === n || e.current === n);
9
+ }
10
+ function r(e) {
11
+ return n(e)?.current ?? e;
12
+ }
13
+ function i(e) {
14
+ return n(e)?.legacy ?? e;
15
+ }
16
+ function a(e, t) {
17
+ return e == null || t == null ? e === t : e === t || r(e) === r(t);
18
+ }
19
+ function o(e) {
20
+ return t.productSlug === "current" ? r(e) : i(e);
21
+ }
22
+ //#endregion
23
+ export { t as PRODUCT_SLUG_EMIT, e as PRODUCT_SLUG_RENAMES, o as emitProductSlug, a as isSameProductSlug, i as legacyProductSlug, r as normalizeProductSlug };
@@ -3,6 +3,11 @@
3
3
  *
4
4
  * @module @burdenoff/fe-libs/shared/config/products
5
5
  */
6
+ /**
7
+ * BotManor's product id (slug). Still the legacy `botlit` until the rename
8
+ * stage flips `PRODUCT_SLUG_EMIT`; readers must accept both spellings.
9
+ */
10
+ export declare const BOTMANOR_PRODUCT_SLUG: string;
6
11
  export interface ProductConfig {
7
12
  id: string;
8
13
  name: string;
@@ -23,7 +28,7 @@ export declare const PRODUCT_URLS: {
23
28
  readonly bigconsole: "http://localhost:5148/";
24
29
  readonly workspaces: "http://localhost:5149/";
25
30
  readonly vibecontrols: "http://localhost:5151/";
26
- readonly botlit: "http://localhost:5152/";
31
+ readonly botlit: "http://localhost:5260/";
27
32
  };
28
33
  readonly production: {
29
34
  readonly fluidgrids: "https://app.fluidgrids.com/";
@@ -68,6 +73,8 @@ export declare const PRODUCT_URLS: {
68
73
  };
69
74
  export declare const PRODUCTS: ProductConfig[];
70
75
  export declare function getProductUrl(productId: string): string;
76
+ /** Catalog entry for a product id, accepting either spelling of a renamed slug. */
77
+ export declare function findProductConfig(productId: string): ProductConfig | undefined;
71
78
  /**
72
79
  * Absolute logo URL for a product — ALWAYS the production app's
73
80
  * `/icons/icon.svg`, regardless of the current environment.
@@ -1 +1 @@
1
- {"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../../../src/shared/config/products.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDf,CAAC;AAEX,eAAO,MAAM,QAAQ,EAAE,aAAa,EA+QnC,CAAC;AAOF,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB;;QA9W7B,MAAM;UACJ,MAAM;UACN,MAAM;WACL,MAAM;kBACC,MAAM;IACpB;;;;;OAKG;iBACU,OAAO;IAqWrB"}
1
+ {"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../../../src/shared/config/products.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAA8B,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDf,CAAC;AAEX,eAAO,MAAM,QAAQ,EAAE,aAAa,EA+QnC,CAAC;AAYF,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAE9E;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB;;QAxX7B,MAAM;UACJ,MAAM;UACN,MAAM;WACL,MAAM;kBACC,MAAM;IACpB;;;;;OAKG;iBACU,OAAO;IA+WrB"}