@burdenoff/microfe-technospam 2026.705.1 → 2026.709.1

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 (48) hide show
  1. package/dist/generated/wspace-operations.js +67 -0
  2. package/dist/generated/wspace-operations.js.map +1 -0
  3. package/dist/index.js +3 -1
  4. package/dist/technospam/components/MediaCover.js +57 -0
  5. package/dist/technospam/components/MediaCover.js.map +1 -0
  6. package/dist/technospam/components/PageLayout.js +1 -1
  7. package/dist/technospam/components/PageLayout.js.map +1 -1
  8. package/dist/technospam/components/StatCard.js +19 -11
  9. package/dist/technospam/components/StatCard.js.map +1 -1
  10. package/dist/technospam/components/StatusBadge.js +1 -1
  11. package/dist/technospam/components/StatusBadge.js.map +1 -1
  12. package/dist/technospam/components/index.js +1 -0
  13. package/dist/technospam/hooks/useTechnoSpamAnalytics.js +13 -0
  14. package/dist/technospam/hooks/useTechnoSpamAnalytics.js.map +1 -0
  15. package/dist/technospam/index.js +2 -0
  16. package/dist/technospam/pages/AdminAdminDashboardPagePage.js +525 -459
  17. package/dist/technospam/pages/AdminAdminDashboardPagePage.js.map +1 -1
  18. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js +167 -127
  19. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  20. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js +178 -101
  21. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js.map +1 -1
  22. package/dist/technospam/pages/ApplicationsProblemsPagePage.js +103 -99
  23. package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
  24. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +316 -184
  25. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
  26. package/dist/technospam/pages/CoursesCoursesPagePage.js +101 -93
  27. package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -1
  28. package/dist/technospam/pages/CoursesMyLearningPagePage.js +119 -88
  29. package/dist/technospam/pages/CoursesMyLearningPagePage.js.map +1 -1
  30. package/dist/technospam/pages/DashboardDashboardPagePage.js +232 -199
  31. package/dist/technospam/pages/DashboardDashboardPagePage.js.map +1 -1
  32. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js +128 -106
  33. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js.map +1 -1
  34. package/dist/technospam/pages/HackathonsHackathonsPagePage.js +99 -91
  35. package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -1
  36. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js +185 -116
  37. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js.map +1 -1
  38. package/dist/technospam/pages/MentorshipMentorsPagePage.js +233 -165
  39. package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -1
  40. package/dist/technospam/pages/MentorshipSessionsPagePage.js +146 -113
  41. package/dist/technospam/pages/MentorshipSessionsPagePage.js.map +1 -1
  42. package/dist/technospam/services/assistantApi.js +222 -0
  43. package/dist/technospam/services/assistantApi.js.map +1 -0
  44. package/dist/technospam/services/createSandboxAssistantTransport.js +120 -0
  45. package/dist/technospam/services/createSandboxAssistantTransport.js.map +1 -0
  46. package/dist/technospam/utils/pageContext.js +46 -0
  47. package/dist/technospam/utils/pageContext.js.map +1 -0
  48. package/package.json +5 -1
@@ -1,189 +1,233 @@
1
1
  import { useTechnoSpam as e, useTechnoSpamNavigate as t } from "../providers/TechnoSpamProvider.js";
2
- import { PageLayout as n } from "../components/PageLayout.js";
3
- import { StatCard as r } from "../components/StatCard.js";
4
- import { formatMoney as i } from "../utils/format.js";
5
- import { LoadMore as a } from "../components/LoadMore.js";
6
- import { EmptyView as o, ErrorView as s, LoadingGrid as c } from "../components/StateViews.js";
2
+ import { cn as n } from "../utils/cn.js";
3
+ import { PageLayout as r } from "../components/PageLayout.js";
4
+ import { StatCard as i } from "../components/StatCard.js";
5
+ import { coverGradient as a, topicIcon as o } from "../components/MediaCover.js";
6
+ import { formatMoney as s } from "../utils/format.js";
7
+ import { LoadMore as c } from "../components/LoadMore.js";
8
+ import { EmptyView as l, ErrorView as u, LoadingGrid as d } from "../components/StateViews.js";
7
9
  import "../components/index.js";
8
- import { notify as l } from "../lib/toast.js";
9
- import { pageArg as u, useBecomeMentor as d, useMentorsQuery as f, usePageLimit as p } from "../api/technospamApi.js";
10
- import { useMemo as m, useState as h } from "react";
11
- import { Award as g, MessageSquare as _, Search as v, Sparkles as y, Star as b, UserPlus as x, Users as S, X as C } from "lucide-react";
12
- import { jsx as w, jsxs as T } from "react/jsx-runtime";
13
- import { Badge as E, Button as D, GlassCard as O, Input as k, Textarea as A } from "@burdenoff/fe-libs/ui";
10
+ import { notify as f } from "../lib/toast.js";
11
+ import { pageArg as p, useBecomeMentor as m, useMentorsQuery as h, usePageLimit as g } from "../api/technospamApi.js";
12
+ import { useTechnoSpamAnalytics as _ } from "../hooks/useTechnoSpamAnalytics.js";
13
+ import { createElement as v, useMemo as y, useState as b } from "react";
14
+ import { Award as x, MessageSquare as S, Search as C, Sparkles as w, Star as T, UserPlus as E, Users as D, X as O } from "lucide-react";
15
+ import { jsx as k, jsxs as A } from "react/jsx-runtime";
16
+ import { Badge as j, Button as M, GlassCard as N, Input as P, Textarea as F } from "@burdenoff/fe-libs/ui";
14
17
  //#region src/technospam/pages/MentorshipMentorsPagePage.tsx
15
- function j({ mentor: e, onOpen: t }) {
16
- return /* @__PURE__ */ T(O, {
17
- className: "group flex cursor-pointer flex-col gap-3 p-5 transition-shadow hover:shadow-md",
18
+ function I({ mentor: e, size: t = "md" }) {
19
+ return /* @__PURE__ */ A("div", {
20
+ className: "relative shrink-0",
21
+ children: [/* @__PURE__ */ k("span", {
22
+ className: n("flex items-center justify-center rounded-full bg-gradient-to-br text-white shadow-md ring-1 ring-white/15", t === "lg" ? "h-20 w-20" : "h-16 w-16", a(e.headline)),
23
+ children: v(o(e.expertise.join(" ") || e.headline), {
24
+ size: t === "lg" ? 32 : 26,
25
+ strokeWidth: 1.7
26
+ })
27
+ }), e.isAcceptingMentees ? /* @__PURE__ */ k("span", { className: "absolute -bottom-0.5 -right-0.5 h-4 w-4 rounded-full border-2 border-bg-surface bg-status-success-text" }) : null]
28
+ });
29
+ }
30
+ function L({ mentor: e, onOpen: t }) {
31
+ return /* @__PURE__ */ A(N, {
32
+ className: "group flex cursor-pointer flex-col gap-4 p-5 transition-all duration-200 hover:-translate-y-1 hover:shadow-lg",
18
33
  onClick: t,
19
34
  children: [
20
- /* @__PURE__ */ T("div", {
21
- className: "flex items-start justify-between gap-3",
22
- children: [/* @__PURE__ */ T("div", {
23
- className: "min-w-0",
24
- children: [/* @__PURE__ */ w("h3", {
35
+ /* @__PURE__ */ A("div", {
36
+ className: "flex items-start gap-4",
37
+ children: [/* @__PURE__ */ k(I, { mentor: e }), /* @__PURE__ */ A("div", {
38
+ className: "min-w-0 flex-1",
39
+ children: [/* @__PURE__ */ k("h3", {
25
40
  className: "truncate text-base font-semibold text-text-primary group-hover:text-accent-primary",
26
41
  children: e.headline
27
- }), /* @__PURE__ */ T("div", {
28
- className: "mt-1 text-sm font-medium text-text-secondary",
29
- children: [i(e.hourlyRate, e.currency), /* @__PURE__ */ w("span", {
30
- className: "text-text-muted",
31
- children: " / hr"
32
- })]
42
+ }), e.isAcceptingMentees ? /* @__PURE__ */ A(j, {
43
+ variant: "outline",
44
+ className: "mt-1.5 inline-flex items-center gap-1.5 border-status-success-border bg-status-success-bg-subtle text-status-success-text",
45
+ children: [/* @__PURE__ */ k("span", { className: "h-1.5 w-1.5 rounded-full bg-status-success-text" }), " Accepting mentees"]
46
+ }) : /* @__PURE__ */ k(j, {
47
+ variant: "outline",
48
+ className: "mt-1.5 border-border-seam bg-bg-sunken text-text-secondary",
49
+ children: "Not accepting"
33
50
  })]
34
- }), e.isAcceptingMentees ? /* @__PURE__ */ w(E, {
35
- variant: "outline",
36
- className: "shrink-0 border-status-success-border bg-status-success-bg-subtle text-status-success-text",
37
- children: "Accepting mentees"
38
- }) : /* @__PURE__ */ w(E, {
39
- variant: "outline",
40
- className: "shrink-0 border-border-seam bg-bg-sunken text-text-secondary",
41
- children: "Not accepting"
42
51
  })]
43
52
  }),
44
- e.bio ? /* @__PURE__ */ w("p", {
53
+ e.bio ? /* @__PURE__ */ k("p", {
45
54
  className: "line-clamp-2 text-sm text-text-secondary",
46
55
  children: e.bio
47
56
  }) : null,
48
- e.expertise.length ? /* @__PURE__ */ T("div", {
57
+ e.expertise.length ? /* @__PURE__ */ A("div", {
49
58
  className: "flex flex-wrap gap-1.5",
50
- children: [e.expertise.slice(0, 4).map((e) => /* @__PURE__ */ w(E, {
59
+ children: [e.expertise.slice(0, 4).map((e) => /* @__PURE__ */ k(j, {
51
60
  variant: "secondary",
52
61
  className: "text-[11px]",
53
62
  children: e
54
- }, e)), e.expertise.length > 4 ? /* @__PURE__ */ T("span", {
55
- className: "text-xs text-text-muted",
56
- children: [
57
- "+",
58
- e.expertise.length - 4,
59
- " more"
60
- ]
63
+ }, e)), e.expertise.length > 4 ? /* @__PURE__ */ A("span", {
64
+ className: "self-center text-xs text-text-muted",
65
+ children: ["+", e.expertise.length - 4]
61
66
  }) : null]
62
67
  }) : null,
63
- /* @__PURE__ */ T("div", {
64
- className: "mt-auto flex items-center gap-4 pt-1 text-xs text-text-muted",
65
- children: [/* @__PURE__ */ T("span", {
66
- className: "inline-flex items-center gap-1",
67
- children: [/* @__PURE__ */ w(b, {
68
- size: 13,
69
- className: "text-accent-teal"
70
- }), e.ratingAvg > 0 ? e.ratingAvg.toFixed(1) : "New"]
71
- }), /* @__PURE__ */ T("span", {
72
- className: "inline-flex items-center gap-1",
73
- children: [
74
- /* @__PURE__ */ w(_, { size: 13 }),
75
- " ",
76
- e.sessionsCount,
77
- " sessions"
78
- ]
79
- })]
68
+ /* @__PURE__ */ A("div", {
69
+ className: "mt-auto grid grid-cols-3 divide-x divide-border-seam rounded-xl border border-border-seam bg-bg-sunken text-center",
70
+ children: [
71
+ /* @__PURE__ */ A("div", {
72
+ className: "px-2 py-2.5",
73
+ children: [/* @__PURE__ */ A("div", {
74
+ className: "flex items-center justify-center gap-1 text-sm font-semibold text-text-primary",
75
+ children: [/* @__PURE__ */ k(T, {
76
+ size: 13,
77
+ className: "text-accent-teal"
78
+ }), e.ratingAvg > 0 ? e.ratingAvg.toFixed(1) : "New"]
79
+ }), /* @__PURE__ */ k("div", {
80
+ className: "text-[11px] text-text-muted",
81
+ children: "rating"
82
+ })]
83
+ }),
84
+ /* @__PURE__ */ A("div", {
85
+ className: "px-2 py-2.5",
86
+ children: [/* @__PURE__ */ k("div", {
87
+ className: "text-sm font-semibold text-text-primary",
88
+ children: e.sessionsCount
89
+ }), /* @__PURE__ */ k("div", {
90
+ className: "text-[11px] text-text-muted",
91
+ children: "sessions"
92
+ })]
93
+ }),
94
+ /* @__PURE__ */ A("div", {
95
+ className: "px-2 py-2.5",
96
+ children: [/* @__PURE__ */ k("div", {
97
+ className: "text-sm font-semibold text-text-primary",
98
+ children: s(e.hourlyRate, e.currency)
99
+ }), /* @__PURE__ */ k("div", {
100
+ className: "text-[11px] text-text-muted",
101
+ children: "/ hr"
102
+ })]
103
+ })
104
+ ]
105
+ }),
106
+ /* @__PURE__ */ k(M, {
107
+ className: "w-full",
108
+ onClick: (e) => {
109
+ e.stopPropagation(), t();
110
+ },
111
+ children: "View profile"
80
112
  })
81
113
  ]
82
114
  });
83
115
  }
84
- function M({ onClose: e, onDone: t }) {
85
- let [n, r] = h(""), [i, a] = h(""), [o, s] = h(""), [c, u] = h(""), [f, p] = h("USD"), [m, { loading: g }] = d(), _ = n.trim().length > 0 && !g;
86
- return /* @__PURE__ */ T(O, {
116
+ function R({ onClose: e, onDone: t, workspaceId: n }) {
117
+ let [r, i] = b(""), [a, o] = b(""), [s, c] = b(""), [l, u] = b(""), [d, p] = b("USD"), [h, { loading: g }] = m(), { emit: v } = _(), y = r.trim().length > 0 && !g;
118
+ return /* @__PURE__ */ A(N, {
87
119
  className: "mb-6 p-5",
88
- children: [/* @__PURE__ */ T("div", {
89
- className: "mb-4 flex items-center justify-between",
90
- children: [/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("h2", {
91
- className: "text-base font-semibold text-text-primary",
92
- children: "Become a mentor"
93
- }), /* @__PURE__ */ w("p", {
94
- className: "text-sm text-text-secondary",
95
- children: "Share your expertise and start mentoring builders in the community."
96
- })] }), /* @__PURE__ */ w(D, {
120
+ children: [/* @__PURE__ */ A("div", {
121
+ className: "mb-4 flex items-start justify-between gap-3",
122
+ children: [/* @__PURE__ */ A("div", {
123
+ className: "flex items-center gap-3",
124
+ children: [/* @__PURE__ */ k("span", {
125
+ className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-gradient-to-br from-accent-primary to-accent-indigo text-white shadow-sm",
126
+ children: /* @__PURE__ */ k(E, { size: 20 })
127
+ }), /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("h2", {
128
+ className: "text-base font-semibold text-text-primary",
129
+ children: "Become a mentor"
130
+ }), /* @__PURE__ */ k("p", {
131
+ className: "text-sm text-text-secondary",
132
+ children: "Share your expertise and start mentoring builders in the community."
133
+ })] })]
134
+ }), /* @__PURE__ */ k(M, {
97
135
  variant: "ghost",
98
136
  size: "sm",
99
137
  onClick: e,
100
138
  "aria-label": "Close",
101
- children: /* @__PURE__ */ w(C, { size: 16 })
139
+ children: /* @__PURE__ */ k(O, { size: 16 })
102
140
  })]
103
- }), /* @__PURE__ */ T("div", {
141
+ }), /* @__PURE__ */ A("div", {
104
142
  className: "grid grid-cols-1 gap-4",
105
143
  children: [
106
- /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ T("label", {
144
+ /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ A("label", {
107
145
  className: "mb-1.5 block text-sm font-medium text-text-primary",
108
- children: ["Headline ", /* @__PURE__ */ w("span", {
146
+ children: ["Headline ", /* @__PURE__ */ k("span", {
109
147
  className: "text-status-error-text",
110
148
  children: "*"
111
149
  })]
112
- }), /* @__PURE__ */ w(k, {
150
+ }), /* @__PURE__ */ k(P, {
113
151
  placeholder: "e.g. Staff Engineer · Distributed systems & career growth",
114
- value: n,
115
- onChange: (e) => r(e.target.value)
152
+ value: r,
153
+ onChange: (e) => i(e.target.value)
116
154
  })] }),
117
- /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("label", {
155
+ /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("label", {
118
156
  className: "mb-1.5 block text-sm font-medium text-text-primary",
119
157
  children: "Bio"
120
- }), /* @__PURE__ */ w(A, {
158
+ }), /* @__PURE__ */ k(F, {
121
159
  rows: 3,
122
160
  placeholder: "Tell mentees about your experience and how you can help.",
123
- value: i,
124
- onChange: (e) => a(e.target.value)
161
+ value: a,
162
+ onChange: (e) => o(e.target.value)
125
163
  })] }),
126
- /* @__PURE__ */ T("div", { children: [
127
- /* @__PURE__ */ w("label", {
164
+ /* @__PURE__ */ A("div", { children: [
165
+ /* @__PURE__ */ k("label", {
128
166
  className: "mb-1.5 block text-sm font-medium text-text-primary",
129
167
  children: "Expertise"
130
168
  }),
131
- /* @__PURE__ */ w(k, {
169
+ /* @__PURE__ */ k(P, {
132
170
  placeholder: "React, System design, Career coaching",
133
- value: o,
134
- onChange: (e) => s(e.target.value)
171
+ value: s,
172
+ onChange: (e) => c(e.target.value)
135
173
  }),
136
- /* @__PURE__ */ w("p", {
174
+ /* @__PURE__ */ k("p", {
137
175
  className: "mt-1 text-xs text-text-muted",
138
176
  children: "Comma-separated topics."
139
177
  })
140
178
  ] }),
141
- /* @__PURE__ */ T("div", {
179
+ /* @__PURE__ */ A("div", {
142
180
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
143
- children: [/* @__PURE__ */ T("div", { children: [
144
- /* @__PURE__ */ w("label", {
181
+ children: [/* @__PURE__ */ A("div", { children: [
182
+ /* @__PURE__ */ k("label", {
145
183
  className: "mb-1.5 block text-sm font-medium text-text-primary",
146
184
  children: "Hourly rate"
147
185
  }),
148
- /* @__PURE__ */ w(k, {
186
+ /* @__PURE__ */ k(P, {
149
187
  type: "number",
150
188
  min: 0,
151
189
  placeholder: "0",
152
- value: c,
190
+ value: l,
153
191
  onChange: (e) => u(e.target.value)
154
192
  }),
155
- /* @__PURE__ */ w("p", {
193
+ /* @__PURE__ */ k("p", {
156
194
  className: "mt-1 text-xs text-text-muted",
157
195
  children: "Whole number. Leave 0 for free."
158
196
  })
159
- ] }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("label", {
197
+ ] }), /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("label", {
160
198
  className: "mb-1.5 block text-sm font-medium text-text-primary",
161
199
  children: "Currency"
162
- }), /* @__PURE__ */ w(k, {
200
+ }), /* @__PURE__ */ k(P, {
163
201
  placeholder: "USD",
164
- value: f,
202
+ value: d,
165
203
  onChange: (e) => p(e.target.value)
166
204
  })] })]
167
205
  }),
168
- /* @__PURE__ */ T("div", {
206
+ /* @__PURE__ */ A("div", {
169
207
  className: "flex flex-wrap items-center gap-2",
170
- children: [/* @__PURE__ */ T(D, {
208
+ children: [/* @__PURE__ */ A(M, {
171
209
  onClick: async () => {
172
- if (!_) return;
173
- let e = { headline: n.trim() };
174
- i.trim() && (e.bio = i.trim());
175
- let r = o.split(",").map((e) => e.trim()).filter(Boolean);
176
- r.length && (e.expertise = r);
177
- let a = Number.parseInt(c, 10);
178
- !Number.isNaN(a) && a >= 0 && (e.hourlyRate = a), f.trim() && (e.currency = f.trim().toUpperCase()), (await m({ variables: { input: e } })).data?.tecBecomeMentor && (l.success("Mentor profile created", "Your profile is pending review."), t());
210
+ if (!y) return;
211
+ let e = { headline: r.trim() };
212
+ a.trim() && (e.bio = a.trim());
213
+ let i = s.split(",").map((e) => e.trim()).filter(Boolean);
214
+ i.length && (e.expertise = i);
215
+ let o = Number.parseInt(l, 10);
216
+ !Number.isNaN(o) && o >= 0 && (e.hourlyRate = o), d.trim() && (e.currency = d.trim().toUpperCase()), v("technospam.mentor.become_mentor_clicked", { workspaceId: n });
217
+ let c = await h({ variables: { input: e } });
218
+ c.data?.tecBecomeMentor && (v("technospam.mentor.became_mentor", {
219
+ workspaceId: n,
220
+ entityId: c.data.tecBecomeMentor.id,
221
+ entityType: "TEC_MENTOR"
222
+ }), f.success("Mentor profile created", "Your profile is pending review."), t());
179
223
  },
180
- disabled: !_,
224
+ disabled: !y,
181
225
  children: [
182
- /* @__PURE__ */ w(x, { size: 16 }),
226
+ /* @__PURE__ */ k(E, { size: 16 }),
183
227
  " ",
184
228
  g ? "Submitting…" : "Submit profile"
185
229
  ]
186
- }), /* @__PURE__ */ w(D, {
230
+ }), /* @__PURE__ */ k(M, {
187
231
  variant: "outline",
188
232
  onClick: e,
189
233
  disabled: g,
@@ -194,99 +238,123 @@ function M({ onClose: e, onDone: t }) {
194
238
  })]
195
239
  });
196
240
  }
197
- function N() {
198
- let i = t(), { currentUser: l } = e(), [d, b] = h(""), [C, E] = h(!1), { limit: A, more: N } = p(), { data: P, loading: F, error: I, refetch: L } = f({
241
+ function z() {
242
+ let n = t(), { currentUser: a, workspaceId: o } = e(), { emit: s } = _(), [f, m] = b(""), [v, O] = b(!1), { limit: j, more: F } = g(), { data: I, loading: z, error: B, refetch: V } = h({
199
243
  status: "ACTIVE",
200
- pagination: u(A)
201
- }), R = P?.tecListMentors.items ?? [], z = P?.tecListMentors.pageInfo.hasMore ?? !1, B = l?.id, V = !!(B && R.some((e) => e.userId === B)), H = m(() => {
202
- let e = d.trim().toLowerCase();
203
- return e ? R.filter((t) => t.headline.toLowerCase().includes(e) || t.expertise.some((t) => t.toLowerCase().includes(e))) : R;
204
- }, [R, d]), U = R.filter((e) => e.isAcceptingMentees).length;
205
- return /* @__PURE__ */ T(n, {
244
+ pagination: p(j)
245
+ }), H = I?.tecListMentors.items ?? [], U = I?.tecListMentors.pageInfo.hasMore ?? !1, W = a?.id, G = !!(W && H.some((e) => e.userId === W)), K = y(() => {
246
+ let e = f.trim().toLowerCase();
247
+ return e ? H.filter((t) => t.headline.toLowerCase().includes(e) || t.expertise.some((t) => t.toLowerCase().includes(e))) : H;
248
+ }, [H, f]), q = H.filter((e) => e.isAcceptingMentees).length, J = H.reduce((e, t) => e + t.sessionsCount, 0), Y = H.filter((e) => e.ratingAvg > 0), X = Y.length ? (Y.reduce((e, t) => e + t.ratingAvg, 0) / Y.length).toFixed(1) : "—";
249
+ return /* @__PURE__ */ A(r, {
206
250
  hero: !0,
207
251
  title: "Find a Mentor",
208
252
  description: "Connect with experienced builders for 1:1 guidance, code review, and career coaching.",
209
- actions: /* @__PURE__ */ T(D, {
253
+ actions: /* @__PURE__ */ A(M, {
210
254
  variant: "outline",
211
- onClick: () => i("/mentorship/sessions-page"),
212
- children: [/* @__PURE__ */ w(_, { size: 16 }), " My sessions"]
255
+ onClick: () => n("/mentorship/sessions-page"),
256
+ children: [/* @__PURE__ */ k(S, { size: 16 }), " My sessions"]
213
257
  }),
214
258
  children: [
215
- V ? /* @__PURE__ */ T(O, {
259
+ G ? /* @__PURE__ */ A(N, {
216
260
  className: "mb-6 flex items-center gap-3 p-4",
217
- children: [/* @__PURE__ */ w("span", {
261
+ children: [/* @__PURE__ */ k("span", {
218
262
  className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-status-success-bg-subtle text-status-success-text",
219
- children: /* @__PURE__ */ w(g, { size: 20 })
220
- }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("div", {
263
+ children: /* @__PURE__ */ k(x, { size: 20 })
264
+ }), /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("div", {
221
265
  className: "text-sm font-semibold text-text-primary",
222
266
  children: "You're a mentor"
223
- }), /* @__PURE__ */ w("div", {
267
+ }), /* @__PURE__ */ k("div", {
224
268
  className: "text-xs text-text-secondary",
225
269
  children: "Your mentor profile is live. Mentees can request sessions with you."
226
270
  })] })]
227
- }) : C ? /* @__PURE__ */ w(M, {
228
- onClose: () => E(!1),
271
+ }) : v ? /* @__PURE__ */ k(R, {
272
+ onClose: () => O(!1),
229
273
  onDone: () => {
230
- E(!1), L();
231
- }
274
+ O(!1), V();
275
+ },
276
+ workspaceId: o
232
277
  }) : null,
233
- /* @__PURE__ */ T("div", {
278
+ /* @__PURE__ */ A("div", {
234
279
  className: "mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4",
235
- children: [/* @__PURE__ */ w(r, {
236
- label: "Mentors",
237
- value: R.length,
238
- icon: S
239
- }), /* @__PURE__ */ w(r, {
240
- label: "Accepting mentees",
241
- value: U,
242
- icon: y
243
- })]
280
+ children: [
281
+ /* @__PURE__ */ k(i, {
282
+ label: "Mentors",
283
+ value: H.length,
284
+ icon: D,
285
+ tone: "blue"
286
+ }),
287
+ /* @__PURE__ */ k(i, {
288
+ label: "Accepting mentees",
289
+ value: q,
290
+ icon: w,
291
+ tone: "green"
292
+ }),
293
+ /* @__PURE__ */ k(i, {
294
+ label: "Avg rating",
295
+ value: X,
296
+ icon: T,
297
+ tone: "amber"
298
+ }),
299
+ /* @__PURE__ */ k(i, {
300
+ label: "Total sessions",
301
+ value: J,
302
+ icon: S,
303
+ tone: "purple"
304
+ })
305
+ ]
244
306
  }),
245
- /* @__PURE__ */ T("div", {
307
+ /* @__PURE__ */ A("div", {
246
308
  className: "mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
247
- children: [/* @__PURE__ */ T("div", {
309
+ children: [/* @__PURE__ */ A("div", {
248
310
  className: "relative w-full sm:w-80",
249
- children: [/* @__PURE__ */ w(v, {
311
+ children: [/* @__PURE__ */ k(C, {
250
312
  className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-muted",
251
313
  size: 16
252
- }), /* @__PURE__ */ w(k, {
314
+ }), /* @__PURE__ */ k(P, {
253
315
  className: "pl-9",
254
316
  placeholder: "Search by headline or expertise…",
255
- value: d,
256
- onChange: (e) => b(e.target.value)
317
+ value: f,
318
+ onChange: (e) => m(e.target.value)
257
319
  })]
258
- }), !V && !C ? /* @__PURE__ */ T(D, {
259
- onClick: () => E(!0),
260
- children: [/* @__PURE__ */ w(x, { size: 16 }), " Become a mentor"]
320
+ }), !G && !v ? /* @__PURE__ */ A(M, {
321
+ onClick: () => O(!0),
322
+ children: [/* @__PURE__ */ k(E, { size: 16 }), " Become a mentor"]
261
323
  }) : null]
262
324
  }),
263
- F && !R.length ? /* @__PURE__ */ w(c, {}) : I ? /* @__PURE__ */ w(s, {
325
+ z && !H.length ? /* @__PURE__ */ k(d, {}) : B ? /* @__PURE__ */ k(u, {
264
326
  title: "Couldn't load mentors",
265
- error: I
266
- }) : H.length === 0 ? /* @__PURE__ */ w(o, {
267
- icon: /* @__PURE__ */ w(S, { size: 26 }),
268
- title: d ? "No matching mentors" : "No mentors yet",
269
- description: d ? "Try a different search term." : "Active mentors will appear here. TechnoSpam is pre-launch — be one of the first to sign up.",
270
- action: !d && !V ? /* @__PURE__ */ w(D, {
271
- onClick: () => E(!0),
327
+ error: B
328
+ }) : K.length === 0 ? /* @__PURE__ */ k(l, {
329
+ icon: /* @__PURE__ */ k(D, { size: 26 }),
330
+ title: f ? "No matching mentors" : "No mentors yet",
331
+ description: f ? "Try a different search term." : "Active mentors will appear here. TechnoSpam is pre-launch — be one of the first to sign up.",
332
+ action: !f && !G ? /* @__PURE__ */ k(M, {
333
+ onClick: () => O(!0),
272
334
  children: "Become a mentor"
273
335
  }) : void 0
274
- }) : /* @__PURE__ */ w("div", {
336
+ }) : /* @__PURE__ */ k("div", {
275
337
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
276
- children: H.map((e) => /* @__PURE__ */ w(j, {
338
+ children: K.map((e) => /* @__PURE__ */ k(L, {
277
339
  mentor: e,
278
- onOpen: () => i(`/mentorship/mentor-profile-page?id=${e.id}`)
340
+ onOpen: () => {
341
+ s("technospam.mentor.viewed", {
342
+ workspaceId: o,
343
+ entityId: e.id,
344
+ entityType: "TEC_MENTOR"
345
+ }), n(`/mentorship/mentor-profile-page?id=${e.id}`);
346
+ }
279
347
  }, e.id))
280
348
  }),
281
- /* @__PURE__ */ w(a, {
282
- hasMore: z,
283
- loading: F,
284
- onClick: N
349
+ /* @__PURE__ */ k(c, {
350
+ hasMore: U,
351
+ loading: z,
352
+ onClick: F
285
353
  })
286
354
  ]
287
355
  });
288
356
  }
289
357
  //#endregion
290
- export { N as MentorshipMentorsPagePage };
358
+ export { z as MentorshipMentorsPagePage };
291
359
 
292
360
  //# sourceMappingURL=MentorshipMentorsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MentorshipMentorsPagePage.js","names":[],"sources":["../../../src/technospam/pages/MentorshipMentorsPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { Award, MessageSquare, Search, Sparkles, Star, UserPlus, Users, X } from 'lucide-react';\nimport { Badge, Button, GlassCard, Input, Textarea } from '@burdenoff/fe-libs/ui';\nimport { EmptyView, ErrorView, LoadMore, LoadingGrid, PageLayout, StatCard } from '../components';\nimport { useTechnoSpam, useTechnoSpamNavigate } from '../providers/TechnoSpamProvider';\nimport {\n pageArg,\n useBecomeMentor,\n useMentorsQuery,\n usePageLimit,\n type TecMentor,\n} from '../api/technospamApi';\nimport { formatMoney } from '../utils/format';\nimport { notify } from '../lib/toast';\n\nfunction MentorCard({ mentor, onOpen }: { mentor: TecMentor; onOpen: () => void }) {\n return (\n <GlassCard\n className=\"group flex cursor-pointer flex-col gap-3 p-5 transition-shadow hover:shadow-md\"\n onClick={onOpen}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary group-hover:text-accent-primary\">\n {mentor.headline}\n </h3>\n <div className=\"mt-1 text-sm font-medium text-text-secondary\">\n {formatMoney(mentor.hourlyRate, mentor.currency)}\n <span className=\"text-text-muted\"> / hr</span>\n </div>\n </div>\n {mentor.isAcceptingMentees ? (\n <Badge\n variant=\"outline\"\n className=\"shrink-0 border-status-success-border bg-status-success-bg-subtle text-status-success-text\"\n >\n Accepting mentees\n </Badge>\n ) : (\n <Badge\n variant=\"outline\"\n className=\"shrink-0 border-border-seam bg-bg-sunken text-text-secondary\"\n >\n Not accepting\n </Badge>\n )}\n </div>\n\n {mentor.bio ? <p className=\"line-clamp-2 text-sm text-text-secondary\">{mentor.bio}</p> : null}\n\n {mentor.expertise.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {mentor.expertise.slice(0, 4).map((skill) => (\n <Badge key={skill} variant=\"secondary\" className=\"text-[11px]\">\n {skill}\n </Badge>\n ))}\n {mentor.expertise.length > 4 ? (\n <span className=\"text-xs text-text-muted\">+{mentor.expertise.length - 4} more</span>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"mt-auto flex items-center gap-4 pt-1 text-xs text-text-muted\">\n <span className=\"inline-flex items-center gap-1\">\n <Star size={13} className=\"text-accent-teal\" />\n {mentor.ratingAvg > 0 ? mentor.ratingAvg.toFixed(1) : 'New'}\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <MessageSquare size={13} /> {mentor.sessionsCount} sessions\n </span>\n </div>\n </GlassCard>\n );\n}\n\nfunction BecomeMentorForm({ onClose, onDone }: { onClose: () => void; onDone: () => void }) {\n const [headline, setHeadline] = useState('');\n const [bio, setBio] = useState('');\n const [expertise, setExpertise] = useState('');\n const [hourlyRate, setHourlyRate] = useState('');\n const [currency, setCurrency] = useState('USD');\n const [becomeMentor, { loading }] = useBecomeMentor();\n\n const canSubmit = headline.trim().length > 0 && !loading;\n\n const handleSubmit = async () => {\n if (!canSubmit) return;\n const input: {\n headline: string;\n bio?: string;\n expertise?: string[];\n hourlyRate?: number;\n currency?: string;\n } = { headline: headline.trim() };\n if (bio.trim()) input.bio = bio.trim();\n const exp = expertise\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n if (exp.length) input.expertise = exp;\n const rate = Number.parseInt(hourlyRate, 10);\n if (!Number.isNaN(rate) && rate >= 0) input.hourlyRate = rate;\n if (currency.trim()) input.currency = currency.trim().toUpperCase();\n\n const res = await becomeMentor({ variables: { input } });\n if (res.data?.tecBecomeMentor) {\n notify.success('Mentor profile created', 'Your profile is pending review.');\n onDone();\n }\n };\n\n return (\n <GlassCard className=\"mb-6 p-5\">\n <div className=\"mb-4 flex items-center justify-between\">\n <div>\n <h2 className=\"text-base font-semibold text-text-primary\">Become a mentor</h2>\n <p className=\"text-sm text-text-secondary\">\n Share your expertise and start mentoring builders in the community.\n </p>\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={onClose} aria-label=\"Close\">\n <X size={16} />\n </Button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Headline <span className=\"text-status-error-text\">*</span>\n </label>\n <Input\n placeholder=\"e.g. Staff Engineer · Distributed systems & career growth\"\n value={headline}\n onChange={(e) => setHeadline(e.target.value)}\n />\n </div>\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Bio</label>\n <Textarea\n rows={3}\n placeholder=\"Tell mentees about your experience and how you can help.\"\n value={bio}\n onChange={(e) => setBio(e.target.value)}\n />\n </div>\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Expertise</label>\n <Input\n placeholder=\"React, System design, Career coaching\"\n value={expertise}\n onChange={(e) => setExpertise(e.target.value)}\n />\n <p className=\"mt-1 text-xs text-text-muted\">Comma-separated topics.</p>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Hourly rate\n </label>\n <Input\n type=\"number\"\n min={0}\n placeholder=\"0\"\n value={hourlyRate}\n onChange={(e) => setHourlyRate(e.target.value)}\n />\n <p className=\"mt-1 text-xs text-text-muted\">Whole number. Leave 0 for free.</p>\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Currency</label>\n <Input\n placeholder=\"USD\"\n value={currency}\n onChange={(e) => setCurrency(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button onClick={handleSubmit} disabled={!canSubmit}>\n <UserPlus size={16} /> {loading ? 'Submitting…' : 'Submit profile'}\n </Button>\n <Button variant=\"outline\" onClick={onClose} disabled={loading}>\n Cancel\n </Button>\n </div>\n </div>\n </GlassCard>\n );\n}\n\nexport function MentorshipMentorsPagePage() {\n const navigate = useTechnoSpamNavigate();\n const { currentUser } = useTechnoSpam();\n const [search, setSearch] = useState('');\n const [showForm, setShowForm] = useState(false);\n\n const { limit, more } = usePageLimit();\n const { data, loading, error, refetch } = useMentorsQuery({\n status: 'ACTIVE',\n pagination: pageArg(limit),\n });\n\n const mentors = data?.tecListMentors.items ?? [];\n const hasMore = data?.tecListMentors.pageInfo.hasMore ?? false;\n const userId = currentUser?.id;\n const alreadyMentor = Boolean(userId && mentors.some((m) => m.userId === userId));\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return mentors;\n return mentors.filter(\n (m) =>\n m.headline.toLowerCase().includes(q) ||\n m.expertise.some((skill) => skill.toLowerCase().includes(q))\n );\n }, [mentors, search]);\n\n const accepting = mentors.filter((m) => m.isAcceptingMentees).length;\n\n return (\n <PageLayout\n hero\n title=\"Find a Mentor\"\n description=\"Connect with experienced builders for 1:1 guidance, code review, and career coaching.\"\n actions={\n <Button variant=\"outline\" onClick={() => navigate('/mentorship/sessions-page')}>\n <MessageSquare size={16} /> My sessions\n </Button>\n }\n >\n {alreadyMentor ? (\n <GlassCard className=\"mb-6 flex items-center gap-3 p-4\">\n <span className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-status-success-bg-subtle text-status-success-text\">\n <Award size={20} />\n </span>\n <div>\n <div className=\"text-sm font-semibold text-text-primary\">You&apos;re a mentor</div>\n <div className=\"text-xs text-text-secondary\">\n Your mentor profile is live. Mentees can request sessions with you.\n </div>\n </div>\n </GlassCard>\n ) : showForm ? (\n <BecomeMentorForm\n onClose={() => setShowForm(false)}\n onDone={() => {\n setShowForm(false);\n void refetch();\n }}\n />\n ) : null}\n\n <div className=\"mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard label=\"Mentors\" value={mentors.length} icon={Users} />\n <StatCard label=\"Accepting mentees\" value={accepting} icon={Sparkles} />\n </div>\n\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"relative w-full sm:w-80\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-muted\"\n size={16}\n />\n <Input\n className=\"pl-9\"\n placeholder=\"Search by headline or expertise…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n {!alreadyMentor && !showForm ? (\n <Button onClick={() => setShowForm(true)}>\n <UserPlus size={16} /> Become a mentor\n </Button>\n ) : null}\n </div>\n\n {loading && !mentors.length ? (\n <LoadingGrid />\n ) : error ? (\n <ErrorView title=\"Couldn't load mentors\" error={error} />\n ) : filtered.length === 0 ? (\n <EmptyView\n icon={<Users size={26} />}\n title={search ? 'No matching mentors' : 'No mentors yet'}\n description={\n search\n ? 'Try a different search term.'\n : 'Active mentors will appear here. TechnoSpam is pre-launch — be one of the first to sign up.'\n }\n action={\n !search && !alreadyMentor ? (\n <Button onClick={() => setShowForm(true)}>Become a mentor</Button>\n ) : undefined\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filtered.map((mentor) => (\n <MentorCard\n key={mentor.id}\n mentor={mentor}\n onOpen={() => navigate(`/mentorship/mentor-profile-page?id=${mentor.id}`)}\n />\n ))}\n </div>\n )}\n <LoadMore hasMore={hasMore} loading={loading} onClick={more} />\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"MentorshipMentorsPagePage.js","names":[],"sources":["../../../src/technospam/pages/MentorshipMentorsPagePage.tsx"],"sourcesContent":["import { createElement, useMemo, useState } from 'react';\nimport { Award, MessageSquare, Search, Sparkles, Star, UserPlus, Users, X } from 'lucide-react';\nimport { Badge, Button, GlassCard, Input, Textarea } from '@burdenoff/fe-libs/ui';\nimport {\n EmptyView,\n ErrorView,\n LoadMore,\n LoadingGrid,\n PageLayout,\n StatCard,\n coverGradient,\n topicIcon,\n} from '../components';\nimport { useTechnoSpam, useTechnoSpamNavigate } from '../providers/TechnoSpamProvider';\nimport {\n pageArg,\n useBecomeMentor,\n useMentorsQuery,\n usePageLimit,\n type TecMentor,\n} from '../api/technospamApi';\nimport { formatMoney } from '../utils/format';\nimport { cn } from '../utils/cn';\nimport { notify } from '../lib/toast';\nimport { useTechnoSpamAnalytics } from '../hooks/useTechnoSpamAnalytics';\n\n/** Circular gradient medallion standing in for a mentor avatar, with a live\n * \"accepting\" presence dot — mirrors the directory mockup within the dark theme. */\nfunction MentorMedallion({ mentor, size = 'md' }: { mentor: TecMentor; size?: 'md' | 'lg' }) {\n const box = size === 'lg' ? 'h-20 w-20' : 'h-16 w-16';\n return (\n <div className=\"relative shrink-0\">\n <span\n className={cn(\n 'flex items-center justify-center rounded-full bg-gradient-to-br text-white shadow-md ring-1 ring-white/15',\n box,\n coverGradient(mentor.headline)\n )}\n >\n {createElement(topicIcon(mentor.expertise.join(' ') || mentor.headline), {\n size: size === 'lg' ? 32 : 26,\n strokeWidth: 1.7,\n })}\n </span>\n {mentor.isAcceptingMentees ? (\n <span className=\"absolute -bottom-0.5 -right-0.5 h-4 w-4 rounded-full border-2 border-bg-surface bg-status-success-text\" />\n ) : null}\n </div>\n );\n}\n\nfunction MentorCard({ mentor, onOpen }: { mentor: TecMentor; onOpen: () => void }) {\n return (\n <GlassCard\n className=\"group flex cursor-pointer flex-col gap-4 p-5 transition-all duration-200 hover:-translate-y-1 hover:shadow-lg\"\n onClick={onOpen}\n >\n <div className=\"flex items-start gap-4\">\n <MentorMedallion mentor={mentor} />\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"truncate text-base font-semibold text-text-primary group-hover:text-accent-primary\">\n {mentor.headline}\n </h3>\n {mentor.isAcceptingMentees ? (\n <Badge\n variant=\"outline\"\n className=\"mt-1.5 inline-flex items-center gap-1.5 border-status-success-border bg-status-success-bg-subtle text-status-success-text\"\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-status-success-text\" /> Accepting mentees\n </Badge>\n ) : (\n <Badge\n variant=\"outline\"\n className=\"mt-1.5 border-border-seam bg-bg-sunken text-text-secondary\"\n >\n Not accepting\n </Badge>\n )}\n </div>\n </div>\n\n {mentor.bio ? <p className=\"line-clamp-2 text-sm text-text-secondary\">{mentor.bio}</p> : null}\n\n {mentor.expertise.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {mentor.expertise.slice(0, 4).map((skill) => (\n <Badge key={skill} variant=\"secondary\" className=\"text-[11px]\">\n {skill}\n </Badge>\n ))}\n {mentor.expertise.length > 4 ? (\n <span className=\"self-center text-xs text-text-muted\">\n +{mentor.expertise.length - 4}\n </span>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"mt-auto grid grid-cols-3 divide-x divide-border-seam rounded-xl border border-border-seam bg-bg-sunken text-center\">\n <div className=\"px-2 py-2.5\">\n <div className=\"flex items-center justify-center gap-1 text-sm font-semibold text-text-primary\">\n <Star size={13} className=\"text-accent-teal\" />\n {mentor.ratingAvg > 0 ? mentor.ratingAvg.toFixed(1) : 'New'}\n </div>\n <div className=\"text-[11px] text-text-muted\">rating</div>\n </div>\n <div className=\"px-2 py-2.5\">\n <div className=\"text-sm font-semibold text-text-primary\">{mentor.sessionsCount}</div>\n <div className=\"text-[11px] text-text-muted\">sessions</div>\n </div>\n <div className=\"px-2 py-2.5\">\n <div className=\"text-sm font-semibold text-text-primary\">\n {formatMoney(mentor.hourlyRate, mentor.currency)}\n </div>\n <div className=\"text-[11px] text-text-muted\">/ hr</div>\n </div>\n </div>\n\n <Button\n className=\"w-full\"\n onClick={(e) => {\n e.stopPropagation();\n onOpen();\n }}\n >\n View profile\n </Button>\n </GlassCard>\n );\n}\n\nfunction BecomeMentorForm({\n onClose,\n onDone,\n workspaceId,\n}: {\n onClose: () => void;\n onDone: () => void;\n workspaceId?: string;\n}) {\n const [headline, setHeadline] = useState('');\n const [bio, setBio] = useState('');\n const [expertise, setExpertise] = useState('');\n const [hourlyRate, setHourlyRate] = useState('');\n const [currency, setCurrency] = useState('USD');\n const [becomeMentor, { loading }] = useBecomeMentor();\n const { emit } = useTechnoSpamAnalytics();\n\n const canSubmit = headline.trim().length > 0 && !loading;\n\n const handleSubmit = async () => {\n if (!canSubmit) return;\n const input: {\n headline: string;\n bio?: string;\n expertise?: string[];\n hourlyRate?: number;\n currency?: string;\n } = { headline: headline.trim() };\n if (bio.trim()) input.bio = bio.trim();\n const exp = expertise\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n if (exp.length) input.expertise = exp;\n const rate = Number.parseInt(hourlyRate, 10);\n if (!Number.isNaN(rate) && rate >= 0) input.hourlyRate = rate;\n if (currency.trim()) input.currency = currency.trim().toUpperCase();\n\n emit('technospam.mentor.become_mentor_clicked', { workspaceId });\n const res = await becomeMentor({ variables: { input } });\n if (res.data?.tecBecomeMentor) {\n emit('technospam.mentor.became_mentor', {\n workspaceId,\n entityId: res.data.tecBecomeMentor.id,\n entityType: 'TEC_MENTOR',\n });\n notify.success('Mentor profile created', 'Your profile is pending review.');\n onDone();\n }\n };\n\n return (\n <GlassCard className=\"mb-6 p-5\">\n <div className=\"mb-4 flex items-start justify-between gap-3\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-gradient-to-br from-accent-primary to-accent-indigo text-white shadow-sm\">\n <UserPlus size={20} />\n </span>\n <div>\n <h2 className=\"text-base font-semibold text-text-primary\">Become a mentor</h2>\n <p className=\"text-sm text-text-secondary\">\n Share your expertise and start mentoring builders in the community.\n </p>\n </div>\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={onClose} aria-label=\"Close\">\n <X size={16} />\n </Button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Headline <span className=\"text-status-error-text\">*</span>\n </label>\n <Input\n placeholder=\"e.g. Staff Engineer · Distributed systems & career growth\"\n value={headline}\n onChange={(e) => setHeadline(e.target.value)}\n />\n </div>\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Bio</label>\n <Textarea\n rows={3}\n placeholder=\"Tell mentees about your experience and how you can help.\"\n value={bio}\n onChange={(e) => setBio(e.target.value)}\n />\n </div>\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Expertise</label>\n <Input\n placeholder=\"React, System design, Career coaching\"\n value={expertise}\n onChange={(e) => setExpertise(e.target.value)}\n />\n <p className=\"mt-1 text-xs text-text-muted\">Comma-separated topics.</p>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Hourly rate\n </label>\n <Input\n type=\"number\"\n min={0}\n placeholder=\"0\"\n value={hourlyRate}\n onChange={(e) => setHourlyRate(e.target.value)}\n />\n <p className=\"mt-1 text-xs text-text-muted\">Whole number. Leave 0 for free.</p>\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Currency</label>\n <Input\n placeholder=\"USD\"\n value={currency}\n onChange={(e) => setCurrency(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button onClick={handleSubmit} disabled={!canSubmit}>\n <UserPlus size={16} /> {loading ? 'Submitting…' : 'Submit profile'}\n </Button>\n <Button variant=\"outline\" onClick={onClose} disabled={loading}>\n Cancel\n </Button>\n </div>\n </div>\n </GlassCard>\n );\n}\n\nexport function MentorshipMentorsPagePage() {\n const navigate = useTechnoSpamNavigate();\n const { currentUser, workspaceId } = useTechnoSpam();\n const { emit } = useTechnoSpamAnalytics();\n const [search, setSearch] = useState('');\n const [showForm, setShowForm] = useState(false);\n\n const { limit, more } = usePageLimit();\n const { data, loading, error, refetch } = useMentorsQuery({\n status: 'ACTIVE',\n pagination: pageArg(limit),\n });\n\n const mentors = data?.tecListMentors.items ?? [];\n const hasMore = data?.tecListMentors.pageInfo.hasMore ?? false;\n const userId = currentUser?.id;\n const alreadyMentor = Boolean(userId && mentors.some((m) => m.userId === userId));\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return mentors;\n return mentors.filter(\n (m) =>\n m.headline.toLowerCase().includes(q) ||\n m.expertise.some((skill) => skill.toLowerCase().includes(q))\n );\n }, [mentors, search]);\n\n const accepting = mentors.filter((m) => m.isAcceptingMentees).length;\n const totalSessions = mentors.reduce((s, m) => s + m.sessionsCount, 0);\n const rated = mentors.filter((m) => m.ratingAvg > 0);\n const avgRating = rated.length\n ? (rated.reduce((s, m) => s + m.ratingAvg, 0) / rated.length).toFixed(1)\n : '—';\n\n return (\n <PageLayout\n hero\n title=\"Find a Mentor\"\n description=\"Connect with experienced builders for 1:1 guidance, code review, and career coaching.\"\n actions={\n <Button variant=\"outline\" onClick={() => navigate('/mentorship/sessions-page')}>\n <MessageSquare size={16} /> My sessions\n </Button>\n }\n >\n {alreadyMentor ? (\n <GlassCard className=\"mb-6 flex items-center gap-3 p-4\">\n <span className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-status-success-bg-subtle text-status-success-text\">\n <Award size={20} />\n </span>\n <div>\n <div className=\"text-sm font-semibold text-text-primary\">You&apos;re a mentor</div>\n <div className=\"text-xs text-text-secondary\">\n Your mentor profile is live. Mentees can request sessions with you.\n </div>\n </div>\n </GlassCard>\n ) : showForm ? (\n <BecomeMentorForm\n onClose={() => setShowForm(false)}\n onDone={() => {\n setShowForm(false);\n void refetch();\n }}\n workspaceId={workspaceId}\n />\n ) : null}\n\n <div className=\"mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard label=\"Mentors\" value={mentors.length} icon={Users} tone=\"blue\" />\n <StatCard label=\"Accepting mentees\" value={accepting} icon={Sparkles} tone=\"green\" />\n <StatCard label=\"Avg rating\" value={avgRating} icon={Star} tone=\"amber\" />\n <StatCard label=\"Total sessions\" value={totalSessions} icon={MessageSquare} tone=\"purple\" />\n </div>\n\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"relative w-full sm:w-80\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-muted\"\n size={16}\n />\n <Input\n className=\"pl-9\"\n placeholder=\"Search by headline or expertise…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n {!alreadyMentor && !showForm ? (\n <Button onClick={() => setShowForm(true)}>\n <UserPlus size={16} /> Become a mentor\n </Button>\n ) : null}\n </div>\n\n {loading && !mentors.length ? (\n <LoadingGrid />\n ) : error ? (\n <ErrorView title=\"Couldn't load mentors\" error={error} />\n ) : filtered.length === 0 ? (\n <EmptyView\n icon={<Users size={26} />}\n title={search ? 'No matching mentors' : 'No mentors yet'}\n description={\n search\n ? 'Try a different search term.'\n : 'Active mentors will appear here. TechnoSpam is pre-launch — be one of the first to sign up.'\n }\n action={\n !search && !alreadyMentor ? (\n <Button onClick={() => setShowForm(true)}>Become a mentor</Button>\n ) : undefined\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filtered.map((mentor) => (\n <MentorCard\n key={mentor.id}\n mentor={mentor}\n onOpen={() => {\n emit('technospam.mentor.viewed', {\n workspaceId,\n entityId: mentor.id,\n entityType: 'TEC_MENTOR',\n });\n navigate(`/mentorship/mentor-profile-page?id=${mentor.id}`);\n }}\n />\n ))}\n </div>\n )}\n <LoadMore hasMore={hasMore} loading={loading} onClick={more} />\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA4BA,SAAS,EAAgB,EAAE,WAAQ,UAAO,QAAmD;AAE3F,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,QAAD;GACE,WAAW,EACT,6GALI,MAAS,OAAO,cAAc,aAOlC,EAAc,EAAO,SAAS,CAC/B;aAEA,EAAc,EAAU,EAAO,UAAU,KAAK,IAAI,IAAI,EAAO,SAAS,EAAE;IACvE,MAAM,MAAS,OAAO,KAAK;IAC3B,aAAa;IACd,CAAC;GACG,CAAA,EACN,EAAO,qBACN,kBAAC,QAAD,EAAM,WAAU,0GAA2G,CAAA,GACzH,KACA;;;AAIV,SAAS,EAAW,EAAE,WAAQ,aAAqD;AACjF,QACE,kBAAC,GAAD;EACE,WAAU;EACV,SAAS;YAFX;GAIE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAyB,WAAU,CAAA,EACnC,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAO;MACL,CAAA,EACJ,EAAO,qBACN,kBAAC,GAAD;MACE,SAAQ;MACR,WAAU;gBAFZ,CAIE,kBAAC,QAAD,EAAM,WAAU,mDAAoD,CAAA,EAAA,qBAC9D;UAER,kBAAC,GAAD;MACE,SAAQ;MACR,WAAU;gBACX;MAEO,CAAA,CAEN;OACF;;GAEL,EAAO,MAAM,kBAAC,KAAD;IAAG,WAAU;cAA4C,EAAO;IAAQ,CAAA,GAAG;GAExF,EAAO,UAAU,SAChB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,EAAO,UAAU,MAAM,GAAG,EAAE,CAAC,KAAK,MACjC,kBAAC,GAAD;KAAmB,SAAQ;KAAY,WAAU;eAC9C;KACK,EAFI,EAEJ,CACR,EACD,EAAO,UAAU,SAAS,IACzB,kBAAC,QAAD;KAAM,WAAU;eAAhB,CAAsD,KAClD,EAAO,UAAU,SAAS,EACvB;SACL,KACA;QACJ;GAEJ,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QAAM,MAAM;QAAI,WAAU;QAAqB,CAAA,EAC9C,EAAO,YAAY,IAAI,EAAO,UAAU,QAAQ,EAAE,GAAG,MAClD;UACN,kBAAC,OAAD;OAAK,WAAU;iBAA8B;OAAY,CAAA,CACrD;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAA2C,EAAO;OAAoB,CAAA,EACrF,kBAAC,OAAD;OAAK,WAAU;iBAA8B;OAAc,CAAA,CACvD;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAY,EAAO,YAAY,EAAO,SAAS;OAC5C,CAAA,EACN,kBAAC,OAAD;OAAK,WAAU;iBAA8B;OAAU,CAAA,CACnD;;KACF;;GAEN,kBAAC,GAAD;IACE,WAAU;IACV,UAAU,MAAM;AAEd,KADA,EAAE,iBAAiB,EACnB,GAAQ;;cAEX;IAEQ,CAAA;GACC;;;AAIhB,SAAS,EAAiB,EACxB,YACA,WACA,kBAKC;CACD,IAAM,CAAC,GAAU,KAAe,EAAS,GAAG,EACtC,CAAC,GAAK,KAAU,EAAS,GAAG,EAC5B,CAAC,GAAW,KAAgB,EAAS,GAAG,EACxC,CAAC,GAAY,KAAiB,EAAS,GAAG,EAC1C,CAAC,GAAU,KAAe,EAAS,MAAM,EACzC,CAAC,GAAc,EAAE,gBAAa,GAAiB,EAC/C,EAAE,YAAS,GAAwB,EAEnC,IAAY,EAAS,MAAM,CAAC,SAAS,KAAK,CAAC;AAkCjD,QACE,kBAAC,GAAD;EAAW,WAAU;YAArB,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,QAAD;KAAM,WAAU;eACd,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;KACjB,CAAA,EACP,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eAA4C;KAAoB,CAAA,EAC9E,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAEvC,CAAA,CACA,EAAA,CAAA,CACF;OACN,kBAAC,GAAD;IAAQ,SAAQ;IAAQ,MAAK;IAAK,SAAS;IAAS,cAAW;cAC7D,kBAAC,GAAD,EAAG,MAAM,IAAM,CAAA;IACR,CAAA,CACL;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAjB,CAAsE,aAC3D,kBAAC,QAAD;MAAM,WAAU;gBAAyB;MAAQ,CAAA,CACpD;QACR,kBAAC,GAAD;KACE,aAAY;KACZ,OAAO;KACP,WAAW,MAAM,EAAY,EAAE,OAAO,MAAM;KAC5C,CAAA,CACE,EAAA,CAAA;IAEN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAqD;KAAW,CAAA,EACjF,kBAAC,GAAD;KACE,MAAM;KACN,aAAY;KACZ,OAAO;KACP,WAAW,MAAM,EAAO,EAAE,OAAO,MAAM;KACvC,CAAA,CACE,EAAA,CAAA;IAEN,kBAAC,OAAD,EAAA,UAAA;KACE,kBAAC,SAAD;MAAO,WAAU;gBAAqD;MAAiB,CAAA;KACvF,kBAAC,GAAD;MACE,aAAY;MACZ,OAAO;MACP,WAAW,MAAM,EAAa,EAAE,OAAO,MAAM;MAC7C,CAAA;KACF,kBAAC,KAAD;MAAG,WAAU;gBAA+B;MAA2B,CAAA;KACnE,EAAA,CAAA;IAEN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD,EAAA,UAAA;MACE,kBAAC,SAAD;OAAO,WAAU;iBAAqD;OAE9D,CAAA;MACR,kBAAC,GAAD;OACE,MAAK;OACL,KAAK;OACL,aAAY;OACZ,OAAO;OACP,WAAW,MAAM,EAAc,EAAE,OAAO,MAAM;OAC9C,CAAA;MACF,kBAAC,KAAD;OAAG,WAAU;iBAA+B;OAAmC,CAAA;MAC3E,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;MAAO,WAAU;gBAAqD;MAAgB,CAAA,EACtF,kBAAC,GAAD;MACE,aAAY;MACZ,OAAO;MACP,WAAW,MAAM,EAAY,EAAE,OAAO,MAAM;MAC5C,CAAA,CACE,EAAA,CAAA,CACF;;IAEN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAQ,SA5GK,YAAY;AAC/B,WAAI,CAAC,EAAW;OAChB,IAAM,IAMF,EAAE,UAAU,EAAS,MAAM,EAAE;AACjC,OAAI,EAAI,MAAM,KAAE,EAAM,MAAM,EAAI,MAAM;OACtC,IAAM,IAAM,EACT,MAAM,IAAI,CACV,KAAK,MAAM,EAAE,MAAM,CAAC,CACpB,OAAO,QAAQ;AAClB,OAAI,EAAI,WAAQ,EAAM,YAAY;OAClC,IAAM,IAAO,OAAO,SAAS,GAAY,GAAG;AAI5C,OAHI,CAAC,OAAO,MAAM,EAAK,IAAI,KAAQ,MAAG,EAAM,aAAa,IACrD,EAAS,MAAM,KAAE,EAAM,WAAW,EAAS,MAAM,CAAC,aAAa,GAEnE,EAAK,2CAA2C,EAAE,gBAAa,CAAC;OAChE,IAAM,IAAM,MAAM,EAAa,EAAE,WAAW,EAAE,UAAO,EAAE,CAAC;AACxD,OAAI,EAAI,MAAM,oBACZ,EAAK,mCAAmC;QACtC;QACA,UAAU,EAAI,KAAK,gBAAgB;QACnC,YAAY;QACb,CAAC,EACF,EAAO,QAAQ,0BAA0B,kCAAkC,EAC3E,GAAQ;;MAgF2B,UAAU,CAAC;gBAA1C;OACE,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;;OAAE,IAAU,gBAAgB;OAC3C;SACT,kBAAC,GAAD;MAAQ,SAAQ;MAAU,SAAS;MAAS,UAAU;gBAAS;MAEtD,CAAA,CACL;;IACF;KACI;;;AAIhB,SAAgB,IAA4B;CAC1C,IAAM,IAAW,GAAuB,EAClC,EAAE,gBAAa,mBAAgB,GAAe,EAC9C,EAAE,YAAS,GAAwB,EACnC,CAAC,GAAQ,KAAa,EAAS,GAAG,EAClC,CAAC,GAAU,KAAe,EAAS,GAAM,EAEzC,EAAE,UAAO,YAAS,GAAc,EAChC,EAAE,SAAM,YAAS,UAAO,eAAY,EAAgB;EACxD,QAAQ;EACR,YAAY,EAAQ,EAAM;EAC3B,CAAC,EAEI,IAAU,GAAM,eAAe,SAAS,EAAE,EAC1C,IAAU,GAAM,eAAe,SAAS,WAAW,IACnD,IAAS,GAAa,IACtB,IAAgB,GAAQ,KAAU,EAAQ,MAAM,MAAM,EAAE,WAAW,EAAO,GAE1E,IAAW,QAAc;EAC7B,IAAM,IAAI,EAAO,MAAM,CAAC,aAAa;AAErC,SADK,IACE,EAAQ,QACZ,MACC,EAAE,SAAS,aAAa,CAAC,SAAS,EAAE,IACpC,EAAE,UAAU,MAAM,MAAU,EAAM,aAAa,CAAC,SAAS,EAAE,CAAC,CAC/D,GALc;IAMd,CAAC,GAAS,EAAO,CAAC,EAEf,IAAY,EAAQ,QAAQ,MAAM,EAAE,mBAAmB,CAAC,QACxD,IAAgB,EAAQ,QAAQ,GAAG,MAAM,IAAI,EAAE,eAAe,EAAE,EAChE,IAAQ,EAAQ,QAAQ,MAAM,EAAE,YAAY,EAAE,EAC9C,IAAY,EAAM,UACnB,EAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,WAAW,EAAE,GAAG,EAAM,QAAQ,QAAQ,EAAE,GACtE;AAEJ,QACE,kBAAC,GAAD;EACE,MAAA;EACA,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,GAAD;GAAQ,SAAQ;GAAU,eAAe,EAAS,4BAA4B;aAA9E,CACE,kBAAC,GAAD,EAAe,MAAM,IAAM,CAAA,EAAA,eACpB;;YAPb;GAUG,IACC,kBAAC,GAAD;IAAW,WAAU;cAArB,CACE,kBAAC,QAAD;KAAM,WAAU;eACd,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;KACd,CAAA,EACP,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eAA0C;KAA0B,CAAA,EACnF,kBAAC,OAAD;KAAK,WAAU;eAA8B;KAEvC,CAAA,CACF,EAAA,CAAA,CACI;QACV,IACF,kBAAC,GAAD;IACE,eAAe,EAAY,GAAM;IACjC,cAAc;AAEP,KADL,EAAY,GAAM,EACb,GAAS;;IAEH;IACb,CAAA,GACA;GAEJ,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAU,OAAM;MAAU,OAAO,EAAQ;MAAQ,MAAM;MAAO,MAAK;MAAS,CAAA;KAC5E,kBAAC,GAAD;MAAU,OAAM;MAAoB,OAAO;MAAW,MAAM;MAAU,MAAK;MAAU,CAAA;KACrF,kBAAC,GAAD;MAAU,OAAM;MAAa,OAAO;MAAW,MAAM;MAAM,MAAK;MAAU,CAAA;KAC1E,kBAAC,GAAD;MAAU,OAAM;MAAiB,OAAO;MAAe,MAAM;MAAe,MAAK;MAAW,CAAA;KACxF;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,WAAU;MACV,MAAM;MACN,CAAA,EACF,kBAAC,GAAD;MACE,WAAU;MACV,aAAY;MACZ,OAAO;MACP,WAAW,MAAM,EAAU,EAAE,OAAO,MAAM;MAC1C,CAAA,CACE;QACL,CAAC,KAAiB,CAAC,IAClB,kBAAC,GAAD;KAAQ,eAAe,EAAY,GAAK;eAAxC,CACE,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA,EAAA,mBACf;SACP,KACA;;GAEL,KAAW,CAAC,EAAQ,SACnB,kBAAC,GAAD,EAAe,CAAA,GACb,IACF,kBAAC,GAAD;IAAW,OAAM;IAA+B;IAAS,CAAA,GACvD,EAAS,WAAW,IACtB,kBAAC,GAAD;IACE,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO,IAAS,wBAAwB;IACxC,aACE,IACI,iCACA;IAEN,QACE,CAAC,KAAU,CAAC,IACV,kBAAC,GAAD;KAAQ,eAAe,EAAY,GAAK;eAAE;KAAwB,CAAA,GAChE,KAAA;IAEN,CAAA,GAEF,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAS,KAAK,MACb,kBAAC,GAAD;KAEU;KACR,cAAc;AAMZ,MALA,EAAK,4BAA4B;OAC/B;OACA,UAAU,EAAO;OACjB,YAAY;OACb,CAAC,EACF,EAAS,sCAAsC,EAAO,KAAK;;KAE7D,EAVK,EAAO,GAUZ,CACF;IACE,CAAA;GAER,kBAAC,GAAD;IAAmB;IAAkB;IAAS,SAAS;IAAQ,CAAA;GACpD"}