@burdenoff/microfe-technospam 2026.704.2 → 2026.705.2

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 (40) hide show
  1. package/dist/technospam/api/technospamApi.js +233 -150
  2. package/dist/technospam/api/technospamApi.js.map +1 -1
  3. package/dist/technospam/components/LoadMore.js +18 -2
  4. package/dist/technospam/components/LoadMore.js.map +1 -0
  5. package/dist/technospam/components/MediaCover.js +57 -0
  6. package/dist/technospam/components/MediaCover.js.map +1 -0
  7. package/dist/technospam/components/PageLayout.js +1 -1
  8. package/dist/technospam/components/PageLayout.js.map +1 -1
  9. package/dist/technospam/components/StatCard.js +19 -11
  10. package/dist/technospam/components/StatCard.js.map +1 -1
  11. package/dist/technospam/components/StatusBadge.js +1 -1
  12. package/dist/technospam/components/StatusBadge.js.map +1 -1
  13. package/dist/technospam/components/index.js +1 -0
  14. package/dist/technospam/pages/AdminAdminDashboardPagePage.js +748 -352
  15. package/dist/technospam/pages/AdminAdminDashboardPagePage.js.map +1 -1
  16. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js +167 -127
  17. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  18. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js +178 -125
  19. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js.map +1 -1
  20. package/dist/technospam/pages/ApplicationsProblemsPagePage.js +89 -93
  21. package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
  22. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +295 -141
  23. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
  24. package/dist/technospam/pages/CoursesCoursesPagePage.js +86 -86
  25. package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -1
  26. package/dist/technospam/pages/CoursesMyLearningPagePage.js +122 -88
  27. package/dist/technospam/pages/CoursesMyLearningPagePage.js.map +1 -1
  28. package/dist/technospam/pages/DashboardDashboardPagePage.js +232 -199
  29. package/dist/technospam/pages/DashboardDashboardPagePage.js.map +1 -1
  30. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js +128 -106
  31. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js.map +1 -1
  32. package/dist/technospam/pages/HackathonsHackathonsPagePage.js +89 -73
  33. package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -1
  34. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js +171 -115
  35. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js.map +1 -1
  36. package/dist/technospam/pages/MentorshipMentorsPagePage.js +214 -151
  37. package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -1
  38. package/dist/technospam/pages/MentorshipSessionsPagePage.js +241 -116
  39. package/dist/technospam/pages/MentorshipSessionsPagePage.js.map +1 -1
  40. package/package.json +1 -1
@@ -1,191 +1,229 @@
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 { EmptyView as a, ErrorView as o, LoadingGrid as s } 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";
6
9
  import "../components/index.js";
7
- import { notify as c } from "../lib/toast.js";
8
- import { useBecomeMentor as l, useMentorsQuery as u } from "../api/technospamApi.js";
9
- import { useMemo as d, useState as f } from "react";
10
- import { Award as p, MessageSquare as m, Search as h, Sparkles as g, Star as _, UserPlus as v, Users as y, X as b } from "lucide-react";
11
- import { jsx as x, jsxs as S } from "react/jsx-runtime";
12
- import { Badge as C, Button as w, GlassCard as T, Input as E, Textarea as D } 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 { createElement as _, useMemo as v, useState as y } from "react";
13
+ import { Award as b, MessageSquare as x, Search as S, Sparkles as C, Star as w, UserPlus as T, Users as E, X as D } from "lucide-react";
14
+ import { jsx as O, jsxs as k } from "react/jsx-runtime";
15
+ import { Badge as A, Button as j, GlassCard as M, Input as N, Textarea as P } from "@burdenoff/fe-libs/ui";
13
16
  //#region src/technospam/pages/MentorshipMentorsPagePage.tsx
14
- function O({ mentor: e, onOpen: t }) {
15
- return /* @__PURE__ */ S(T, {
16
- className: "group flex cursor-pointer flex-col gap-3 p-5 transition-shadow hover:shadow-md",
17
+ function F({ mentor: e, size: t = "md" }) {
18
+ return /* @__PURE__ */ k("div", {
19
+ className: "relative shrink-0",
20
+ children: [/* @__PURE__ */ O("span", {
21
+ 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)),
22
+ children: _(o(e.expertise.join(" ") || e.headline), {
23
+ size: t === "lg" ? 32 : 26,
24
+ strokeWidth: 1.7
25
+ })
26
+ }), e.isAcceptingMentees ? /* @__PURE__ */ O("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]
27
+ });
28
+ }
29
+ function I({ mentor: e, onOpen: t }) {
30
+ return /* @__PURE__ */ k(M, {
31
+ className: "group flex cursor-pointer flex-col gap-4 p-5 transition-all duration-200 hover:-translate-y-1 hover:shadow-lg",
17
32
  onClick: t,
18
33
  children: [
19
- /* @__PURE__ */ S("div", {
20
- className: "flex items-start justify-between gap-3",
21
- children: [/* @__PURE__ */ S("div", {
22
- className: "min-w-0",
23
- children: [/* @__PURE__ */ x("h3", {
34
+ /* @__PURE__ */ k("div", {
35
+ className: "flex items-start gap-4",
36
+ children: [/* @__PURE__ */ O(F, { mentor: e }), /* @__PURE__ */ k("div", {
37
+ className: "min-w-0 flex-1",
38
+ children: [/* @__PURE__ */ O("h3", {
24
39
  className: "truncate text-base font-semibold text-text-primary group-hover:text-accent-primary",
25
40
  children: e.headline
26
- }), /* @__PURE__ */ S("div", {
27
- className: "mt-1 text-sm font-medium text-text-secondary",
28
- children: [i(e.hourlyRate, e.currency), /* @__PURE__ */ x("span", {
29
- className: "text-text-muted",
30
- children: " / hr"
31
- })]
41
+ }), e.isAcceptingMentees ? /* @__PURE__ */ k(A, {
42
+ variant: "outline",
43
+ className: "mt-1.5 inline-flex items-center gap-1.5 border-status-success-border bg-status-success-bg-subtle text-status-success-text",
44
+ children: [/* @__PURE__ */ O("span", { className: "h-1.5 w-1.5 rounded-full bg-status-success-text" }), " Accepting mentees"]
45
+ }) : /* @__PURE__ */ O(A, {
46
+ variant: "outline",
47
+ className: "mt-1.5 border-border-seam bg-bg-sunken text-text-secondary",
48
+ children: "Not accepting"
32
49
  })]
33
- }), e.isAcceptingMentees ? /* @__PURE__ */ x(C, {
34
- variant: "outline",
35
- className: "shrink-0 border-status-success-border bg-status-success-bg-subtle text-status-success-text",
36
- children: "Accepting mentees"
37
- }) : /* @__PURE__ */ x(C, {
38
- variant: "outline",
39
- className: "shrink-0 border-border-seam bg-bg-sunken text-text-secondary",
40
- children: "Not accepting"
41
50
  })]
42
51
  }),
43
- e.bio ? /* @__PURE__ */ x("p", {
52
+ e.bio ? /* @__PURE__ */ O("p", {
44
53
  className: "line-clamp-2 text-sm text-text-secondary",
45
54
  children: e.bio
46
55
  }) : null,
47
- e.expertise.length ? /* @__PURE__ */ S("div", {
56
+ e.expertise.length ? /* @__PURE__ */ k("div", {
48
57
  className: "flex flex-wrap gap-1.5",
49
- children: [e.expertise.slice(0, 4).map((e) => /* @__PURE__ */ x(C, {
58
+ children: [e.expertise.slice(0, 4).map((e) => /* @__PURE__ */ O(A, {
50
59
  variant: "secondary",
51
60
  className: "text-[11px]",
52
61
  children: e
53
- }, e)), e.expertise.length > 4 ? /* @__PURE__ */ S("span", {
54
- className: "text-xs text-text-muted",
55
- children: [
56
- "+",
57
- e.expertise.length - 4,
58
- " more"
59
- ]
62
+ }, e)), e.expertise.length > 4 ? /* @__PURE__ */ k("span", {
63
+ className: "self-center text-xs text-text-muted",
64
+ children: ["+", e.expertise.length - 4]
60
65
  }) : null]
61
66
  }) : null,
62
- /* @__PURE__ */ S("div", {
63
- className: "mt-auto flex items-center gap-4 pt-1 text-xs text-text-muted",
64
- children: [/* @__PURE__ */ S("span", {
65
- className: "inline-flex items-center gap-1",
66
- children: [/* @__PURE__ */ x(_, {
67
- size: 13,
68
- className: "text-accent-teal"
69
- }), e.ratingAvg > 0 ? e.ratingAvg.toFixed(1) : "New"]
70
- }), /* @__PURE__ */ S("span", {
71
- className: "inline-flex items-center gap-1",
72
- children: [
73
- /* @__PURE__ */ x(m, { size: 13 }),
74
- " ",
75
- e.sessionsCount,
76
- " sessions"
77
- ]
78
- })]
67
+ /* @__PURE__ */ k("div", {
68
+ className: "mt-auto grid grid-cols-3 divide-x divide-border-seam rounded-xl border border-border-seam bg-bg-sunken text-center",
69
+ children: [
70
+ /* @__PURE__ */ k("div", {
71
+ className: "px-2 py-2.5",
72
+ children: [/* @__PURE__ */ k("div", {
73
+ className: "flex items-center justify-center gap-1 text-sm font-semibold text-text-primary",
74
+ children: [/* @__PURE__ */ O(w, {
75
+ size: 13,
76
+ className: "text-accent-teal"
77
+ }), e.ratingAvg > 0 ? e.ratingAvg.toFixed(1) : "New"]
78
+ }), /* @__PURE__ */ O("div", {
79
+ className: "text-[11px] text-text-muted",
80
+ children: "rating"
81
+ })]
82
+ }),
83
+ /* @__PURE__ */ k("div", {
84
+ className: "px-2 py-2.5",
85
+ children: [/* @__PURE__ */ O("div", {
86
+ className: "text-sm font-semibold text-text-primary",
87
+ children: e.sessionsCount
88
+ }), /* @__PURE__ */ O("div", {
89
+ className: "text-[11px] text-text-muted",
90
+ children: "sessions"
91
+ })]
92
+ }),
93
+ /* @__PURE__ */ k("div", {
94
+ className: "px-2 py-2.5",
95
+ children: [/* @__PURE__ */ O("div", {
96
+ className: "text-sm font-semibold text-text-primary",
97
+ children: s(e.hourlyRate, e.currency)
98
+ }), /* @__PURE__ */ O("div", {
99
+ className: "text-[11px] text-text-muted",
100
+ children: "/ hr"
101
+ })]
102
+ })
103
+ ]
104
+ }),
105
+ /* @__PURE__ */ O(j, {
106
+ className: "w-full",
107
+ onClick: (e) => {
108
+ e.stopPropagation(), t();
109
+ },
110
+ children: "View profile"
79
111
  })
80
112
  ]
81
113
  });
82
114
  }
83
- function k({ onClose: e, onDone: t }) {
84
- let [n, r] = f(""), [i, a] = f(""), [o, s] = f(""), [u, d] = f(""), [p, m] = f("USD"), [h, { loading: g }] = l(), _ = n.trim().length > 0 && !g;
85
- return /* @__PURE__ */ S(T, {
115
+ function L({ onClose: e, onDone: t }) {
116
+ let [n, r] = y(""), [i, a] = y(""), [o, s] = y(""), [c, l] = y(""), [u, d] = y("USD"), [p, { loading: h }] = m(), g = n.trim().length > 0 && !h;
117
+ return /* @__PURE__ */ k(M, {
86
118
  className: "mb-6 p-5",
87
- children: [/* @__PURE__ */ S("div", {
88
- className: "mb-4 flex items-center justify-between",
89
- children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("h2", {
90
- className: "text-base font-semibold text-text-primary",
91
- children: "Become a mentor"
92
- }), /* @__PURE__ */ x("p", {
93
- className: "text-sm text-text-secondary",
94
- children: "Share your expertise and start mentoring builders in the community."
95
- })] }), /* @__PURE__ */ x(w, {
119
+ children: [/* @__PURE__ */ k("div", {
120
+ className: "mb-4 flex items-start justify-between gap-3",
121
+ children: [/* @__PURE__ */ k("div", {
122
+ className: "flex items-center gap-3",
123
+ children: [/* @__PURE__ */ O("span", {
124
+ 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",
125
+ children: /* @__PURE__ */ O(T, { size: 20 })
126
+ }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("h2", {
127
+ className: "text-base font-semibold text-text-primary",
128
+ children: "Become a mentor"
129
+ }), /* @__PURE__ */ O("p", {
130
+ className: "text-sm text-text-secondary",
131
+ children: "Share your expertise and start mentoring builders in the community."
132
+ })] })]
133
+ }), /* @__PURE__ */ O(j, {
96
134
  variant: "ghost",
97
135
  size: "sm",
98
136
  onClick: e,
99
137
  "aria-label": "Close",
100
- children: /* @__PURE__ */ x(b, { size: 16 })
138
+ children: /* @__PURE__ */ O(D, { size: 16 })
101
139
  })]
102
- }), /* @__PURE__ */ S("div", {
140
+ }), /* @__PURE__ */ k("div", {
103
141
  className: "grid grid-cols-1 gap-4",
104
142
  children: [
105
- /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("label", {
143
+ /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ k("label", {
106
144
  className: "mb-1.5 block text-sm font-medium text-text-primary",
107
- children: ["Headline ", /* @__PURE__ */ x("span", {
145
+ children: ["Headline ", /* @__PURE__ */ O("span", {
108
146
  className: "text-status-error-text",
109
147
  children: "*"
110
148
  })]
111
- }), /* @__PURE__ */ x(E, {
149
+ }), /* @__PURE__ */ O(N, {
112
150
  placeholder: "e.g. Staff Engineer · Distributed systems & career growth",
113
151
  value: n,
114
152
  onChange: (e) => r(e.target.value)
115
153
  })] }),
116
- /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("label", {
154
+ /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("label", {
117
155
  className: "mb-1.5 block text-sm font-medium text-text-primary",
118
156
  children: "Bio"
119
- }), /* @__PURE__ */ x(D, {
157
+ }), /* @__PURE__ */ O(P, {
120
158
  rows: 3,
121
159
  placeholder: "Tell mentees about your experience and how you can help.",
122
160
  value: i,
123
161
  onChange: (e) => a(e.target.value)
124
162
  })] }),
125
- /* @__PURE__ */ S("div", { children: [
126
- /* @__PURE__ */ x("label", {
163
+ /* @__PURE__ */ k("div", { children: [
164
+ /* @__PURE__ */ O("label", {
127
165
  className: "mb-1.5 block text-sm font-medium text-text-primary",
128
166
  children: "Expertise"
129
167
  }),
130
- /* @__PURE__ */ x(E, {
168
+ /* @__PURE__ */ O(N, {
131
169
  placeholder: "React, System design, Career coaching",
132
170
  value: o,
133
171
  onChange: (e) => s(e.target.value)
134
172
  }),
135
- /* @__PURE__ */ x("p", {
173
+ /* @__PURE__ */ O("p", {
136
174
  className: "mt-1 text-xs text-text-muted",
137
175
  children: "Comma-separated topics."
138
176
  })
139
177
  ] }),
140
- /* @__PURE__ */ S("div", {
178
+ /* @__PURE__ */ k("div", {
141
179
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
142
- children: [/* @__PURE__ */ S("div", { children: [
143
- /* @__PURE__ */ x("label", {
180
+ children: [/* @__PURE__ */ k("div", { children: [
181
+ /* @__PURE__ */ O("label", {
144
182
  className: "mb-1.5 block text-sm font-medium text-text-primary",
145
183
  children: "Hourly rate"
146
184
  }),
147
- /* @__PURE__ */ x(E, {
185
+ /* @__PURE__ */ O(N, {
148
186
  type: "number",
149
187
  min: 0,
150
188
  placeholder: "0",
151
- value: u,
152
- onChange: (e) => d(e.target.value)
189
+ value: c,
190
+ onChange: (e) => l(e.target.value)
153
191
  }),
154
- /* @__PURE__ */ x("p", {
192
+ /* @__PURE__ */ O("p", {
155
193
  className: "mt-1 text-xs text-text-muted",
156
194
  children: "Whole number. Leave 0 for free."
157
195
  })
158
- ] }), /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("label", {
196
+ ] }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("label", {
159
197
  className: "mb-1.5 block text-sm font-medium text-text-primary",
160
198
  children: "Currency"
161
- }), /* @__PURE__ */ x(E, {
199
+ }), /* @__PURE__ */ O(N, {
162
200
  placeholder: "USD",
163
- value: p,
164
- onChange: (e) => m(e.target.value)
201
+ value: u,
202
+ onChange: (e) => d(e.target.value)
165
203
  })] })]
166
204
  }),
167
- /* @__PURE__ */ S("div", {
205
+ /* @__PURE__ */ k("div", {
168
206
  className: "flex flex-wrap items-center gap-2",
169
- children: [/* @__PURE__ */ S(w, {
207
+ children: [/* @__PURE__ */ k(j, {
170
208
  onClick: async () => {
171
- if (!_) return;
209
+ if (!g) return;
172
210
  let e = { headline: n.trim() };
173
211
  i.trim() && (e.bio = i.trim());
174
212
  let r = o.split(",").map((e) => e.trim()).filter(Boolean);
175
213
  r.length && (e.expertise = r);
176
- let a = Number.parseInt(u, 10);
177
- !Number.isNaN(a) && a >= 0 && (e.hourlyRate = a), p.trim() && (e.currency = p.trim().toUpperCase()), (await h({ variables: { input: e } })).data?.tecBecomeMentor && (c.success("Mentor profile created", "Your profile is pending review."), t());
214
+ let a = Number.parseInt(c, 10);
215
+ !Number.isNaN(a) && a >= 0 && (e.hourlyRate = a), u.trim() && (e.currency = u.trim().toUpperCase()), (await p({ variables: { input: e } })).data?.tecBecomeMentor && (f.success("Mentor profile created", "Your profile is pending review."), t());
178
216
  },
179
- disabled: !_,
217
+ disabled: !g,
180
218
  children: [
181
- /* @__PURE__ */ x(v, { size: 16 }),
219
+ /* @__PURE__ */ O(T, { size: 16 }),
182
220
  " ",
183
- g ? "Submitting…" : "Submit profile"
221
+ h ? "Submitting…" : "Submit profile"
184
222
  ]
185
- }), /* @__PURE__ */ x(w, {
223
+ }), /* @__PURE__ */ O(j, {
186
224
  variant: "outline",
187
225
  onClick: e,
188
- disabled: g,
226
+ disabled: h,
189
227
  children: "Cancel"
190
228
  })]
191
229
  })
@@ -193,91 +231,116 @@ function k({ onClose: e, onDone: t }) {
193
231
  })]
194
232
  });
195
233
  }
196
- function A() {
197
- let i = t(), { currentUser: c } = e(), [l, _] = f(""), [b, C] = f(!1), { data: D, loading: A, error: j, refetch: M } = u({ status: "ACTIVE" }), N = D?.tecListMentors.items ?? [], P = c?.id, F = !!(P && N.some((e) => e.userId === P)), I = d(() => {
198
- let e = l.trim().toLowerCase();
199
- return e ? N.filter((t) => t.headline.toLowerCase().includes(e) || t.expertise.some((t) => t.toLowerCase().includes(e))) : N;
200
- }, [N, l]), L = N.filter((e) => e.isAcceptingMentees).length;
201
- return /* @__PURE__ */ S(n, {
234
+ function R() {
235
+ let n = t(), { currentUser: a } = e(), [o, s] = y(""), [f, m] = y(!1), { limit: _, more: D } = g(), { data: A, loading: P, error: F, refetch: R } = h({
236
+ status: "ACTIVE",
237
+ pagination: p(_)
238
+ }), z = A?.tecListMentors.items ?? [], B = A?.tecListMentors.pageInfo.hasMore ?? !1, V = a?.id, H = !!(V && z.some((e) => e.userId === V)), U = v(() => {
239
+ let e = o.trim().toLowerCase();
240
+ return e ? z.filter((t) => t.headline.toLowerCase().includes(e) || t.expertise.some((t) => t.toLowerCase().includes(e))) : z;
241
+ }, [z, o]), W = z.filter((e) => e.isAcceptingMentees).length, G = z.reduce((e, t) => e + t.sessionsCount, 0), K = z.filter((e) => e.ratingAvg > 0), q = K.length ? (K.reduce((e, t) => e + t.ratingAvg, 0) / K.length).toFixed(1) : "—";
242
+ return /* @__PURE__ */ k(r, {
202
243
  hero: !0,
203
244
  title: "Find a Mentor",
204
245
  description: "Connect with experienced builders for 1:1 guidance, code review, and career coaching.",
205
- actions: /* @__PURE__ */ S(w, {
246
+ actions: /* @__PURE__ */ k(j, {
206
247
  variant: "outline",
207
- onClick: () => i("/mentorship/sessions-page"),
208
- children: [/* @__PURE__ */ x(m, { size: 16 }), " My sessions"]
248
+ onClick: () => n("/mentorship/sessions-page"),
249
+ children: [/* @__PURE__ */ O(x, { size: 16 }), " My sessions"]
209
250
  }),
210
251
  children: [
211
- F ? /* @__PURE__ */ S(T, {
252
+ H ? /* @__PURE__ */ k(M, {
212
253
  className: "mb-6 flex items-center gap-3 p-4",
213
- children: [/* @__PURE__ */ x("span", {
254
+ children: [/* @__PURE__ */ O("span", {
214
255
  className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-status-success-bg-subtle text-status-success-text",
215
- children: /* @__PURE__ */ x(p, { size: 20 })
216
- }), /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("div", {
256
+ children: /* @__PURE__ */ O(b, { size: 20 })
257
+ }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("div", {
217
258
  className: "text-sm font-semibold text-text-primary",
218
259
  children: "You're a mentor"
219
- }), /* @__PURE__ */ x("div", {
260
+ }), /* @__PURE__ */ O("div", {
220
261
  className: "text-xs text-text-secondary",
221
262
  children: "Your mentor profile is live. Mentees can request sessions with you."
222
263
  })] })]
223
- }) : b ? /* @__PURE__ */ x(k, {
224
- onClose: () => C(!1),
264
+ }) : f ? /* @__PURE__ */ O(L, {
265
+ onClose: () => m(!1),
225
266
  onDone: () => {
226
- C(!1), M();
267
+ m(!1), R();
227
268
  }
228
269
  }) : null,
229
- /* @__PURE__ */ S("div", {
270
+ /* @__PURE__ */ k("div", {
230
271
  className: "mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4",
231
- children: [/* @__PURE__ */ x(r, {
232
- label: "Mentors",
233
- value: N.length,
234
- icon: y
235
- }), /* @__PURE__ */ x(r, {
236
- label: "Accepting mentees",
237
- value: L,
238
- icon: g
239
- })]
272
+ children: [
273
+ /* @__PURE__ */ O(i, {
274
+ label: "Mentors",
275
+ value: z.length,
276
+ icon: E,
277
+ tone: "blue"
278
+ }),
279
+ /* @__PURE__ */ O(i, {
280
+ label: "Accepting mentees",
281
+ value: W,
282
+ icon: C,
283
+ tone: "green"
284
+ }),
285
+ /* @__PURE__ */ O(i, {
286
+ label: "Avg rating",
287
+ value: q,
288
+ icon: w,
289
+ tone: "amber"
290
+ }),
291
+ /* @__PURE__ */ O(i, {
292
+ label: "Total sessions",
293
+ value: G,
294
+ icon: x,
295
+ tone: "purple"
296
+ })
297
+ ]
240
298
  }),
241
- /* @__PURE__ */ S("div", {
299
+ /* @__PURE__ */ k("div", {
242
300
  className: "mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
243
- children: [/* @__PURE__ */ S("div", {
301
+ children: [/* @__PURE__ */ k("div", {
244
302
  className: "relative w-full sm:w-80",
245
- children: [/* @__PURE__ */ x(h, {
303
+ children: [/* @__PURE__ */ O(S, {
246
304
  className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-muted",
247
305
  size: 16
248
- }), /* @__PURE__ */ x(E, {
306
+ }), /* @__PURE__ */ O(N, {
249
307
  className: "pl-9",
250
308
  placeholder: "Search by headline or expertise…",
251
- value: l,
252
- onChange: (e) => _(e.target.value)
309
+ value: o,
310
+ onChange: (e) => s(e.target.value)
253
311
  })]
254
- }), !F && !b ? /* @__PURE__ */ S(w, {
255
- onClick: () => C(!0),
256
- children: [/* @__PURE__ */ x(v, { size: 16 }), " Become a mentor"]
312
+ }), !H && !f ? /* @__PURE__ */ k(j, {
313
+ onClick: () => m(!0),
314
+ children: [/* @__PURE__ */ O(T, { size: 16 }), " Become a mentor"]
257
315
  }) : null]
258
316
  }),
259
- A && !N.length ? /* @__PURE__ */ x(s, {}) : j ? /* @__PURE__ */ x(o, {
317
+ P && !z.length ? /* @__PURE__ */ O(d, {}) : F ? /* @__PURE__ */ O(u, {
260
318
  title: "Couldn't load mentors",
261
- error: j
262
- }) : I.length === 0 ? /* @__PURE__ */ x(a, {
263
- icon: /* @__PURE__ */ x(y, { size: 26 }),
264
- title: l ? "No matching mentors" : "No mentors yet",
265
- description: l ? "Try a different search term." : "Active mentors will appear here. TechnoSpam is pre-launch — be one of the first to sign up.",
266
- action: !l && !F ? /* @__PURE__ */ x(w, {
267
- onClick: () => C(!0),
319
+ error: F
320
+ }) : U.length === 0 ? /* @__PURE__ */ O(l, {
321
+ icon: /* @__PURE__ */ O(E, { size: 26 }),
322
+ title: o ? "No matching mentors" : "No mentors yet",
323
+ description: o ? "Try a different search term." : "Active mentors will appear here. TechnoSpam is pre-launch — be one of the first to sign up.",
324
+ action: !o && !H ? /* @__PURE__ */ O(j, {
325
+ onClick: () => m(!0),
268
326
  children: "Become a mentor"
269
327
  }) : void 0
270
- }) : /* @__PURE__ */ x("div", {
328
+ }) : /* @__PURE__ */ O("div", {
271
329
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
272
- children: I.map((e) => /* @__PURE__ */ x(O, {
330
+ children: U.map((e) => /* @__PURE__ */ O(I, {
273
331
  mentor: e,
274
- onOpen: () => i(`/mentorship/mentor-profile-page?id=${e.id}`)
332
+ onOpen: () => n(`/mentorship/mentor-profile-page?id=${e.id}`)
275
333
  }, e.id))
334
+ }),
335
+ /* @__PURE__ */ O(c, {
336
+ hasMore: B,
337
+ loading: P,
338
+ onClick: D
276
339
  })
277
340
  ]
278
341
  });
279
342
  }
280
343
  //#endregion
281
- export { A as MentorshipMentorsPagePage };
344
+ export { R as MentorshipMentorsPagePage };
282
345
 
283
346
  //# 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, LoadingGrid, PageLayout, StatCard } from '../components';\nimport { useTechnoSpam, useTechnoSpamNavigate } from '../providers/TechnoSpamProvider';\nimport { useBecomeMentor, useMentorsQuery, type TecMentor } 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 { data, loading, error, refetch } = useMentorsQuery({ status: 'ACTIVE' });\n\n const mentors = data?.tecListMentors.items ?? [];\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 </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';\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({ 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-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 } = 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 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 />\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={() => 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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"}