@burdenoff/microfe-technospam 2026.1031.1 → 2026.1031.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 (41) hide show
  1. package/dist/technospam/components/StatusBadge.js +1 -1
  2. package/dist/technospam/components/StatusBadge.js.map +1 -1
  3. package/dist/technospam/components/SubmissionViews.js +1 -1
  4. package/dist/technospam/components/SubmissionViews.js.map +1 -1
  5. package/dist/technospam/components/lesson/InteractiveWorkspace.js +1 -1
  6. package/dist/technospam/components/lesson/InteractiveWorkspace.js.map +1 -1
  7. package/dist/technospam/pages/AdminAdminDashboardPagePage.d.ts.map +1 -1
  8. package/dist/technospam/pages/AdminAdminDashboardPagePage.js +194 -186
  9. package/dist/technospam/pages/AdminAdminDashboardPagePage.js.map +1 -1
  10. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
  11. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js +5 -2
  12. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  13. package/dist/technospam/pages/ApplicationsPortfolioPagePage.js +1 -0
  14. package/dist/technospam/pages/ApplicationsPortfolioPagePage.js.map +1 -1
  15. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js +2 -1
  16. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js.map +1 -1
  17. package/dist/technospam/pages/ApplicationsProblemsPagePage.d.ts.map +1 -1
  18. package/dist/technospam/pages/ApplicationsProblemsPagePage.js +167 -162
  19. package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
  20. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +2 -2
  21. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
  22. package/dist/technospam/pages/CoursesCoursesPagePage.d.ts.map +1 -1
  23. package/dist/technospam/pages/CoursesCoursesPagePage.js +77 -77
  24. package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -1
  25. package/dist/technospam/pages/CoursesLessonPlayerPagePage.js +2 -2
  26. package/dist/technospam/pages/CoursesLessonPlayerPagePage.js.map +1 -1
  27. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js +3 -3
  28. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js.map +1 -1
  29. package/dist/technospam/pages/HackathonsHackathonsPagePage.d.ts.map +1 -1
  30. package/dist/technospam/pages/HackathonsHackathonsPagePage.js +71 -71
  31. package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -1
  32. package/dist/technospam/pages/MentorshipMentorProfilePagePage.d.ts.map +1 -1
  33. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js +6 -1
  34. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js.map +1 -1
  35. package/dist/technospam/pages/MentorshipMentorsPagePage.d.ts.map +1 -1
  36. package/dist/technospam/pages/MentorshipMentorsPagePage.js +1 -0
  37. package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -1
  38. package/dist/technospam/pages/MentorshipSessionsPagePage.d.ts.map +1 -1
  39. package/dist/technospam/pages/MentorshipSessionsPagePage.js +97 -98
  40. package/dist/technospam/pages/MentorshipSessionsPagePage.js.map +1 -1
  41. package/package.json +7 -6
@@ -6,103 +6,103 @@ import { StatCard as a } from "../components/StatCard.js";
6
6
  import { MediaCover as o, topicIcon as s } from "../components/MediaCover.js";
7
7
  import { StatusBadge as c } from "../components/StatusBadge.js";
8
8
  import { LoadMore as l } from "../components/LoadMore.js";
9
- import { EmptyView as ee, ErrorView as u, LoadingGrid as d } from "../components/StateViews.js";
10
- import { PremiumBadge as f } from "../components/UpgradeGate.js";
11
- import { pageArg as p, usePageLimit as m, useProblemsQuery as te, useSubmissionsQuery as h } from "../api/technospamApi.js";
9
+ import { EmptyView as ee, ErrorView as te, LoadingGrid as u } from "../components/StateViews.js";
10
+ import { PremiumBadge as d } from "../components/UpgradeGate.js";
11
+ import { pageArg as ne, usePageLimit as re, useProblemsQuery as f, useSubmissionsQuery as p } from "../api/technospamApi.js";
12
12
  import "../components/index.js";
13
- import { useMemo as g, useState as _ } from "react";
14
- import { Building2 as v, CheckCircle2 as y, Code2 as b, Flame as x, Gauge as ne, Layers as S, Search as re, Tag as C, Trophy as w } from "lucide-react";
15
- import { jsx as T, jsxs as E } from "react/jsx-runtime";
16
- import { Badge as D, GlassCard as O, Input as ie, Select as k, SelectContent as A, SelectItem as j, SelectTrigger as M, SelectValue as N, Tabs as P, TabsList as F, TabsTrigger as I } from "@burdenoff/fe-libs/ui";
13
+ import { useMemo as m, useState as h } from "react";
14
+ import { Building2 as g, CheckCircle2 as _, Code2 as v, Flame as y, Gauge as b, Layers as x, Search as ie, Tag as S, Trophy as C } from "lucide-react";
15
+ import { jsx as w, jsxs as T } from "react/jsx-runtime";
16
+ import { Badge as E, GlassCard as D, Input as ae, Select as O, SelectContent as k, SelectItem as A, SelectTrigger as j, SelectValue as M, Tabs as N, TabsContent as P, TabsList as F, TabsTrigger as I } from "@burdenoff/fe-libs/ui";
17
17
  //#region src/technospam/pages/ApplicationsProblemsPagePage.tsx
18
18
  function L({ problem: e, solved: t, onOpen: n }) {
19
19
  let i = r();
20
- return /* @__PURE__ */ E(O, {
20
+ return /* @__PURE__ */ T(D, {
21
21
  className: "group flex cursor-pointer flex-col overflow-hidden transition-all duration-200 hover:-translate-y-1 hover:shadow-lg",
22
22
  onClick: n,
23
- children: [/* @__PURE__ */ E(o, {
23
+ children: [/* @__PURE__ */ T(o, {
24
24
  seed: `${e.topic ?? ""} ${e.difficulty} ${e.title}`,
25
25
  icon: s(e.topic ?? e.title),
26
- children: [t ? /* @__PURE__ */ E("span", {
26
+ children: [t ? /* @__PURE__ */ T("span", {
27
27
  className: "inline-flex items-center gap-1 rounded-full bg-status-success-bg-subtle px-2 py-0.5 text-[11px] font-medium text-status-success-text ring-1 ring-status-success-border/30",
28
28
  children: [
29
- /* @__PURE__ */ T(y, { size: 12 }),
29
+ /* @__PURE__ */ w(_, { size: 12 }),
30
30
  " ",
31
31
  i("technospam.problems.solved", "Solved")
32
32
  ]
33
- }) : /* @__PURE__ */ T("span", {}), /* @__PURE__ */ E("div", {
33
+ }) : /* @__PURE__ */ w("span", {}), /* @__PURE__ */ T("div", {
34
34
  className: "flex flex-wrap items-center gap-1.5",
35
- children: [/* @__PURE__ */ T(c, {
35
+ children: [/* @__PURE__ */ w(c, {
36
36
  status: e.difficulty,
37
37
  kind: "level"
38
- }), e.isPremiumOnly ? /* @__PURE__ */ T(f, { locked: e.isLocked }) : null]
38
+ }), e.isPremiumOnly ? /* @__PURE__ */ w(d, { locked: e.isLocked }) : null]
39
39
  })]
40
- }), /* @__PURE__ */ E("div", {
40
+ }), /* @__PURE__ */ T("div", {
41
41
  className: "flex flex-1 flex-col gap-3 p-4",
42
42
  children: [
43
- /* @__PURE__ */ E("div", {
43
+ /* @__PURE__ */ T("div", {
44
44
  className: "min-w-0",
45
- children: [/* @__PURE__ */ T("h3", {
45
+ children: [/* @__PURE__ */ w("h3", {
46
46
  className: "truncate text-base font-semibold text-text-primary group-hover:text-accent-primary",
47
47
  children: e.title
48
- }), e.statement ? /* @__PURE__ */ T("p", {
48
+ }), e.statement ? /* @__PURE__ */ w("p", {
49
49
  className: "mt-1 line-clamp-2 text-sm text-text-secondary",
50
50
  children: e.statement
51
51
  }) : null]
52
52
  }),
53
- /* @__PURE__ */ E("div", {
53
+ /* @__PURE__ */ T("div", {
54
54
  className: "mt-auto flex flex-wrap items-center gap-3 text-xs text-text-muted",
55
55
  children: [
56
- e.topic ? /* @__PURE__ */ E("span", {
56
+ e.topic ? /* @__PURE__ */ T("span", {
57
57
  className: "inline-flex items-center gap-1",
58
58
  children: [
59
- /* @__PURE__ */ T(S, { size: 13 }),
59
+ /* @__PURE__ */ w(x, { size: 13 }),
60
60
  " ",
61
61
  e.topic
62
62
  ]
63
63
  }) : null,
64
- /* @__PURE__ */ E("span", {
64
+ /* @__PURE__ */ T("span", {
65
65
  className: "inline-flex items-center gap-1",
66
66
  children: [
67
- /* @__PURE__ */ T(w, { size: 13 }),
67
+ /* @__PURE__ */ w(C, { size: 13 }),
68
68
  " ",
69
69
  i("technospam.problems.points", "{{count}} pts", { count: e.points })
70
70
  ]
71
71
  }),
72
- e.languages.length ? /* @__PURE__ */ E("span", {
72
+ e.languages.length ? /* @__PURE__ */ T("span", {
73
73
  className: "inline-flex items-center gap-1",
74
74
  children: [
75
- /* @__PURE__ */ T(b, { size: 13 }),
75
+ /* @__PURE__ */ w(v, { size: 13 }),
76
76
  " ",
77
77
  e.languages.length === 1 ? i("technospam.problems.languages", "{{count}} lang", { count: e.languages.length }) : i("technospam.problems.languagesPlural", "{{count}} langs", { count: e.languages.length })
78
78
  ]
79
79
  }) : null
80
80
  ]
81
81
  }),
82
- e.companies.length ? /* @__PURE__ */ E("div", {
82
+ e.companies.length ? /* @__PURE__ */ T("div", {
83
83
  className: "flex flex-wrap gap-1.5",
84
- children: [e.companies.slice(0, 3).map((e) => /* @__PURE__ */ E(D, {
84
+ children: [e.companies.slice(0, 3).map((e) => /* @__PURE__ */ T(E, {
85
85
  variant: "outline",
86
86
  className: "text-[11px] capitalize",
87
- children: [/* @__PURE__ */ T(v, {
87
+ children: [/* @__PURE__ */ w(g, {
88
88
  size: 10,
89
89
  className: "mr-1"
90
90
  }), e.replace(/-/g, " ")]
91
- }, e)), e.interviewFrequency === "HIGH" ? /* @__PURE__ */ E(D, {
91
+ }, e)), e.interviewFrequency === "HIGH" ? /* @__PURE__ */ T(E, {
92
92
  variant: "secondary",
93
93
  className: "text-[11px] text-status-warning-text",
94
- children: [/* @__PURE__ */ T(x, {
94
+ children: [/* @__PURE__ */ w(y, {
95
95
  size: 10,
96
96
  className: "mr-1"
97
97
  }), i("technospam.problems.frequentlyAsked", "Frequently asked")]
98
98
  }) : null]
99
99
  }) : null,
100
- e.tags.length ? /* @__PURE__ */ T("div", {
100
+ e.tags.length ? /* @__PURE__ */ w("div", {
101
101
  className: "flex flex-wrap gap-1.5",
102
- children: e.tags.slice(0, 3).map((e) => /* @__PURE__ */ E(D, {
102
+ children: e.tags.slice(0, 3).map((e) => /* @__PURE__ */ T(E, {
103
103
  variant: "secondary",
104
104
  className: "text-[11px]",
105
- children: [/* @__PURE__ */ T(C, {
105
+ children: [/* @__PURE__ */ w(S, {
106
106
  size: 10,
107
107
  className: "mr-1"
108
108
  }), e]
@@ -113,24 +113,24 @@ function L({ problem: e, solved: t, onOpen: n }) {
113
113
  });
114
114
  }
115
115
  function R() {
116
- let o = t(), { currentUser: s, workspaceId: c } = e(), { emit: f } = n(), v = r(), S = s?.id, [C, w] = _("ALL"), [D, O] = _("ALL"), [R, z] = _("ALL"), [B, V] = _(""), H = g(() => [
116
+ let o = t(), { currentUser: s, workspaceId: c } = e(), { emit: d } = n(), g = r(), x = s?.id, [S, C] = h("ALL"), [E, D] = h("ALL"), [R, z] = h("ALL"), [B, V] = h(""), H = m(() => [
117
117
  {
118
118
  value: "ALL",
119
- label: v("technospam.problems.filterAll", "All")
119
+ label: g("technospam.problems.filterAll", "All")
120
120
  },
121
121
  {
122
122
  value: "EASY",
123
- label: v("technospam.problems.filterEasy", "Easy")
123
+ label: g("technospam.problems.filterEasy", "Easy")
124
124
  },
125
125
  {
126
126
  value: "MEDIUM",
127
- label: v("technospam.problems.filterMedium", "Medium")
127
+ label: g("technospam.problems.filterMedium", "Medium")
128
128
  },
129
129
  {
130
130
  value: "HARD",
131
- label: v("technospam.problems.filterHard", "Hard")
131
+ label: g("technospam.problems.filterHard", "Hard")
132
132
  }
133
- ], [v]), U = g(() => [
133
+ ], [g]), U = m(() => [
134
134
  {
135
135
  value: "google",
136
136
  label: "Google"
@@ -155,7 +155,7 @@ function R() {
155
155
  value: "netflix",
156
156
  label: "Netflix"
157
157
  }
158
- ], []), W = g(() => [
158
+ ], []), W = m(() => [
159
159
  {
160
160
  value: "frontend",
161
161
  label: "Frontend"
@@ -180,137 +180,142 @@ function R() {
180
180
  value: "sre",
181
181
  label: "SRE / Infra"
182
182
  }
183
- ], []), { limit: G, more: K } = m(), { data: q, loading: J, error: Y } = te({
183
+ ], []), { limit: G, more: K } = re(), { data: q, loading: J, error: Y } = f({
184
184
  status: "PUBLISHED",
185
- pagination: p(G),
186
- ...C === "ALL" ? {} : { difficulty: C },
187
- ...D === "ALL" ? {} : { company: D },
185
+ pagination: ne(G),
186
+ ...S === "ALL" ? {} : { difficulty: S },
187
+ ...E === "ALL" ? {} : { company: E },
188
188
  ...R === "ALL" ? {} : { role: R }
189
- }), { data: X } = h(S ? { learnerId: S } : {}), Z = q?.tecListProblems?.items ?? [], ae = q?.tecListProblems?.pageInfo?.hasMore ?? !1, Q = g(() => new Set((X?.tecListSubmissions?.items ?? []).filter((e) => e.verdict === "ACCEPTED").map((e) => e.problemId)), [X]), oe = Z.filter((e) => Q.has(e.id)).length, se = Z.filter((e) => e.difficulty === "EASY").length, ce = Z.filter((e) => e.difficulty === "HARD").length, $ = g(() => {
189
+ }), { data: X } = p(x ? { learnerId: x } : {}), Z = q?.tecListProblems?.items ?? [], oe = q?.tecListProblems?.pageInfo?.hasMore ?? !1, Q = m(() => new Set((X?.tecListSubmissions?.items ?? []).filter((e) => e.verdict === "ACCEPTED").map((e) => e.problemId)), [X]), se = Z.filter((e) => Q.has(e.id)).length, ce = Z.filter((e) => e.difficulty === "EASY").length, le = Z.filter((e) => e.difficulty === "HARD").length, $ = m(() => {
190
190
  let e = B.trim().toLowerCase();
191
191
  return e ? Z.filter((t) => t.title.toLowerCase().includes(e) || (t.topic ?? "").toLowerCase().includes(e) || t.tags.some((t) => t.toLowerCase().includes(e))) : Z;
192
192
  }, [Z, B]);
193
- return /* @__PURE__ */ E(i, {
193
+ return /* @__PURE__ */ T(i, {
194
194
  hero: !0,
195
- title: v("technospam.problems.title", "Coding Problems"),
196
- description: v("technospam.problems.description", "Sharpen your problem-solving with hands-on, mentor-judged challenges across topics and difficulty."),
197
- children: [
198
- /* @__PURE__ */ E("div", {
199
- className: "mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4",
200
- children: [
201
- /* @__PURE__ */ T(a, {
202
- label: v("technospam.problems.statProblems", "Problems"),
203
- value: Z.length,
204
- icon: b,
205
- tone: "blue"
206
- }),
207
- /* @__PURE__ */ T(a, {
208
- label: v("technospam.problems.statSolved", "Solved"),
209
- value: oe,
210
- icon: y,
211
- tone: "green"
212
- }),
213
- /* @__PURE__ */ T(a, {
214
- label: v("technospam.problems.statEasy", "Easy"),
215
- value: se,
216
- icon: ne,
217
- tone: "teal"
218
- }),
219
- /* @__PURE__ */ T(a, {
220
- label: v("technospam.problems.statHard", "Hard"),
221
- value: ce,
222
- icon: x,
223
- tone: "amber"
224
- })
225
- ]
226
- }),
227
- /* @__PURE__ */ E("div", {
228
- className: "mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
229
- children: [/* @__PURE__ */ T(P, {
230
- value: C,
231
- onValueChange: (e) => w(e),
232
- children: /* @__PURE__ */ T(F, { children: H.map((e) => /* @__PURE__ */ T(I, {
195
+ title: g("technospam.problems.title", "Coding Problems"),
196
+ description: g("technospam.problems.description", "Sharpen your problem-solving with hands-on, mentor-judged challenges across topics and difficulty."),
197
+ children: [/* @__PURE__ */ T("div", {
198
+ className: "mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4",
199
+ children: [
200
+ /* @__PURE__ */ w(a, {
201
+ label: g("technospam.problems.statProblems", "Problems"),
202
+ value: Z.length,
203
+ icon: v,
204
+ tone: "blue"
205
+ }),
206
+ /* @__PURE__ */ w(a, {
207
+ label: g("technospam.problems.statSolved", "Solved"),
208
+ value: se,
209
+ icon: _,
210
+ tone: "green"
211
+ }),
212
+ /* @__PURE__ */ w(a, {
213
+ label: g("technospam.problems.statEasy", "Easy"),
214
+ value: ce,
215
+ icon: b,
216
+ tone: "teal"
217
+ }),
218
+ /* @__PURE__ */ w(a, {
219
+ label: g("technospam.problems.statHard", "Hard"),
220
+ value: le,
221
+ icon: y,
222
+ tone: "amber"
223
+ })
224
+ ]
225
+ }), /* @__PURE__ */ T(N, {
226
+ className: "gap-0",
227
+ value: S,
228
+ onValueChange: (e) => C(e),
229
+ children: [
230
+ /* @__PURE__ */ T("div", {
231
+ className: "mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
232
+ children: [/* @__PURE__ */ w(F, { children: H.map((e) => /* @__PURE__ */ w(I, {
233
233
  value: e.value,
234
234
  children: e.label
235
- }, e.value)) })
236
- }), /* @__PURE__ */ E("div", {
237
- className: "relative w-full sm:w-72",
238
- children: [/* @__PURE__ */ T(re, {
239
- className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-muted",
240
- size: 16
241
- }), /* @__PURE__ */ T(ie, {
242
- className: "pl-9",
243
- placeholder: v("technospam.problems.searchPlaceholder", "Search problems…"),
244
- value: B,
245
- onChange: (e) => V(e.target.value),
246
- onBlur: () => {
247
- let e = B.trim();
248
- e && f("technospam.search.performed", {
249
- workspaceId: c,
250
- entityType: "problem",
251
- queryLength: e.length
252
- });
253
- }
235
+ }, e.value)) }), /* @__PURE__ */ T("div", {
236
+ className: "relative w-full sm:w-72",
237
+ children: [/* @__PURE__ */ w(ie, {
238
+ className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-muted",
239
+ size: 16
240
+ }), /* @__PURE__ */ w(ae, {
241
+ className: "pl-9",
242
+ "aria-label": g("technospam.problems.searchLabel", "Search problems"),
243
+ placeholder: g("technospam.problems.searchPlaceholder", "Search problems…"),
244
+ value: B,
245
+ onChange: (e) => V(e.target.value),
246
+ onBlur: () => {
247
+ let e = B.trim();
248
+ e && d("technospam.search.performed", {
249
+ workspaceId: c,
250
+ entityType: "problem",
251
+ queryLength: e.length
252
+ });
253
+ }
254
+ })]
254
255
  })]
255
- })]
256
- }),
257
- /* @__PURE__ */ E("div", {
258
- className: "mb-4 flex flex-col gap-3 sm:flex-row sm:items-center",
259
- children: [/* @__PURE__ */ E(k, {
260
- value: D,
261
- onValueChange: O,
262
- children: [/* @__PURE__ */ T(M, {
263
- className: "w-full sm:w-48",
264
- children: /* @__PURE__ */ T(N, { placeholder: v("technospam.problems.companyPlaceholder", "Company") })
265
- }), /* @__PURE__ */ E(A, { children: [/* @__PURE__ */ T(j, {
266
- value: "ALL",
267
- children: v("technospam.problems.companyAll", "All companies")
268
- }), U.map((e) => /* @__PURE__ */ T(j, {
269
- value: e.value,
270
- children: e.label
271
- }, e.value))] })]
272
- }), /* @__PURE__ */ E(k, {
273
- value: R,
274
- onValueChange: z,
275
- children: [/* @__PURE__ */ T(M, {
276
- className: "w-full sm:w-48",
277
- children: /* @__PURE__ */ T(N, { placeholder: v("technospam.problems.rolePlaceholder", "Role") })
278
- }), /* @__PURE__ */ E(A, { children: [/* @__PURE__ */ T(j, {
279
- value: "ALL",
280
- children: v("technospam.problems.roleAll", "All roles")
281
- }), W.map((e) => /* @__PURE__ */ T(j, {
282
- value: e.value,
283
- children: e.label
284
- }, e.value))] })]
285
- })]
286
- }),
287
- J && !Z.length ? /* @__PURE__ */ T(d, {}) : Y ? /* @__PURE__ */ T(u, {
288
- title: v("technospam.common.errorLoadProblems", "Couldn't load problems"),
289
- error: Y
290
- }) : $.length === 0 ? /* @__PURE__ */ T(ee, {
291
- icon: /* @__PURE__ */ T(b, { size: 26 }),
292
- title: B || C !== "ALL" || D !== "ALL" || R !== "ALL" ? v("technospam.problems.emptySearchTitle", "No matching problems") : v("technospam.problems.emptyDefaultTitle", "No problems published yet"),
293
- description: B || C !== "ALL" || D !== "ALL" || R !== "ALL" ? v("technospam.problems.emptySearchDesc", "Try a different search, difficulty, company, or role filter.") : v("technospam.problems.emptyDefaultDesc", "Published problems will appear here. Check back soon — TechnoSpam is pre-launch.")
294
- }) : /* @__PURE__ */ T("div", {
295
- className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
296
- children: $.map((e) => /* @__PURE__ */ T(L, {
297
- problem: e,
298
- solved: Q.has(e.id),
299
- onOpen: () => {
300
- f("technospam.problem.viewed", {
301
- workspaceId: c,
302
- entityId: e.id,
303
- entityType: "TEC_PROBLEM"
304
- }), o(`/applications/problem-details-page?id=${e.id}`);
305
- }
306
- }, e.id))
307
- }),
308
- /* @__PURE__ */ T(l, {
309
- hasMore: ae,
310
- loading: J,
311
- onClick: K
312
- })
313
- ]
256
+ }),
257
+ /* @__PURE__ */ T("div", {
258
+ className: "mb-4 flex flex-col gap-3 sm:flex-row sm:items-center",
259
+ children: [/* @__PURE__ */ T(O, {
260
+ value: E,
261
+ onValueChange: D,
262
+ children: [/* @__PURE__ */ w(j, {
263
+ className: "w-full sm:w-48",
264
+ "aria-label": g("technospam.problems.companyFilterLabel", "Filter by company"),
265
+ children: /* @__PURE__ */ w(M, { placeholder: g("technospam.problems.companyPlaceholder", "Company") })
266
+ }), /* @__PURE__ */ T(k, { children: [/* @__PURE__ */ w(A, {
267
+ value: "ALL",
268
+ children: g("technospam.problems.companyAll", "All companies")
269
+ }), U.map((e) => /* @__PURE__ */ w(A, {
270
+ value: e.value,
271
+ children: e.label
272
+ }, e.value))] })]
273
+ }), /* @__PURE__ */ T(O, {
274
+ value: R,
275
+ onValueChange: z,
276
+ children: [/* @__PURE__ */ w(j, {
277
+ className: "w-full sm:w-48",
278
+ "aria-label": g("technospam.problems.roleFilterLabel", "Filter by role"),
279
+ children: /* @__PURE__ */ w(M, { placeholder: g("technospam.problems.rolePlaceholder", "Role") })
280
+ }), /* @__PURE__ */ T(k, { children: [/* @__PURE__ */ w(A, {
281
+ value: "ALL",
282
+ children: g("technospam.problems.roleAll", "All roles")
283
+ }), W.map((e) => /* @__PURE__ */ w(A, {
284
+ value: e.value,
285
+ children: e.label
286
+ }, e.value))] })]
287
+ })]
288
+ }),
289
+ /* @__PURE__ */ T(P, {
290
+ value: S,
291
+ children: [J && !Z.length ? /* @__PURE__ */ w(u, {}) : Y ? /* @__PURE__ */ w(te, {
292
+ title: g("technospam.common.errorLoadProblems", "Couldn't load problems"),
293
+ error: Y
294
+ }) : $.length === 0 ? /* @__PURE__ */ w(ee, {
295
+ icon: /* @__PURE__ */ w(v, { size: 26 }),
296
+ title: B || S !== "ALL" || E !== "ALL" || R !== "ALL" ? g("technospam.problems.emptySearchTitle", "No matching problems") : g("technospam.problems.emptyDefaultTitle", "No problems published yet"),
297
+ description: B || S !== "ALL" || E !== "ALL" || R !== "ALL" ? g("technospam.problems.emptySearchDesc", "Try a different search, difficulty, company, or role filter.") : g("technospam.problems.emptyDefaultDesc", "Published problems will appear here. Check back soon — TechnoSpam is pre-launch.")
298
+ }) : /* @__PURE__ */ w("div", {
299
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
300
+ children: $.map((e) => /* @__PURE__ */ w(L, {
301
+ problem: e,
302
+ solved: Q.has(e.id),
303
+ onOpen: () => {
304
+ d("technospam.problem.viewed", {
305
+ workspaceId: c,
306
+ entityId: e.id,
307
+ entityType: "TEC_PROBLEM"
308
+ }), o(`/applications/problem-details-page?id=${e.id}`);
309
+ }
310
+ }, e.id))
311
+ }), /* @__PURE__ */ w(l, {
312
+ hasMore: oe,
313
+ loading: J,
314
+ onClick: K
315
+ })]
316
+ })
317
+ ]
318
+ })]
314
319
  });
315
320
  }
316
321
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationsProblemsPagePage.js","names":[],"sources":["../../../src/technospam/pages/ApplicationsProblemsPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Building2,\n CheckCircle2,\n Code2,\n Flame,\n Gauge,\n Layers,\n Search,\n Tag,\n Trophy,\n} from 'lucide-react';\nimport {\n Badge,\n GlassCard,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tabs,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport {\n EmptyView,\n ErrorView,\n LoadMore,\n LoadingGrid,\n MediaCover,\n PageLayout,\n PremiumBadge,\n StatCard,\n StatusBadge,\n topicIcon,\n} from '../components';\nimport { useTechnoSpam, useTechnoSpamNavigate } from '../providers/TechnoSpamProvider';\nimport {\n pageArg,\n usePageLimit,\n useProblemsQuery,\n useSubmissionsQuery,\n type TecProblem,\n type TecProblemDifficulty,\n} from '../api/technospamApi';\nimport { useTechnoSpamAnalytics } from '../hooks/useTechnoSpamAnalytics';\nimport { useTr } from '../hooks/useTr';\n\nfunction ProblemCard({\n problem,\n solved,\n onOpen,\n}: {\n problem: TecProblem;\n solved: boolean;\n onOpen: () => void;\n}) {\n const tr = useTr();\n return (\n <GlassCard\n className=\"group flex cursor-pointer flex-col overflow-hidden transition-all duration-200 hover:-translate-y-1 hover:shadow-lg\"\n onClick={onOpen}\n >\n <MediaCover\n seed={`${problem.topic ?? ''} ${problem.difficulty} ${problem.title}`}\n icon={topicIcon(problem.topic ?? problem.title)}\n >\n {solved ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-status-success-bg-subtle px-2 py-0.5 text-[11px] font-medium text-status-success-text ring-1 ring-status-success-border/30\">\n <CheckCircle2 size={12} /> {tr('technospam.problems.solved', 'Solved')}\n </span>\n ) : (\n <span />\n )}\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <StatusBadge status={problem.difficulty} kind=\"level\" />\n {problem.isPremiumOnly ? <PremiumBadge locked={problem.isLocked} /> : null}\n </div>\n </MediaCover>\n <div className=\"flex flex-1 flex-col gap-3 p-4\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary group-hover:text-accent-primary\">\n {problem.title}\n </h3>\n {problem.statement ? (\n <p className=\"mt-1 line-clamp-2 text-sm text-text-secondary\">{problem.statement}</p>\n ) : null}\n </div>\n <div className=\"mt-auto flex flex-wrap items-center gap-3 text-xs text-text-muted\">\n {problem.topic ? (\n <span className=\"inline-flex items-center gap-1\">\n <Layers size={13} /> {problem.topic}\n </span>\n ) : null}\n <span className=\"inline-flex items-center gap-1\">\n <Trophy size={13} />{' '}\n {tr('technospam.problems.points', '{{count}} pts', { count: problem.points })}\n </span>\n {problem.languages.length ? (\n <span className=\"inline-flex items-center gap-1\">\n <Code2 size={13} />{' '}\n {problem.languages.length === 1\n ? tr('technospam.problems.languages', '{{count}} lang', {\n count: problem.languages.length,\n })\n : tr('technospam.problems.languagesPlural', '{{count}} langs', {\n count: problem.languages.length,\n })}\n </span>\n ) : null}\n </div>\n {problem.companies.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {problem.companies.slice(0, 3).map((c) => (\n <Badge key={c} variant=\"outline\" className=\"text-[11px] capitalize\">\n <Building2 size={10} className=\"mr-1\" />\n {c.replace(/-/g, ' ')}\n </Badge>\n ))}\n {problem.interviewFrequency === 'HIGH' ? (\n <Badge variant=\"secondary\" className=\"text-[11px] text-status-warning-text\">\n <Flame size={10} className=\"mr-1\" />\n {tr('technospam.problems.frequentlyAsked', 'Frequently asked')}\n </Badge>\n ) : null}\n </div>\n ) : null}\n {problem.tags.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {problem.tags.slice(0, 3).map((t) => (\n <Badge key={t} variant=\"secondary\" className=\"text-[11px]\">\n <Tag size={10} className=\"mr-1\" />\n {t}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n </GlassCard>\n );\n}\n\nexport function ApplicationsProblemsPagePage() {\n const navigate = useTechnoSpamNavigate();\n const { currentUser, workspaceId } = useTechnoSpam();\n const { emit } = useTechnoSpamAnalytics();\n const tr = useTr();\n const learnerId = currentUser?.id;\n const [difficulty, setDifficulty] = useState<'ALL' | TecProblemDifficulty>('ALL');\n const [company, setCompany] = useState<string>('ALL');\n const [role, setRole] = useState<string>('ALL');\n const [search, setSearch] = useState('');\n\n const difficulties = useMemo(\n () => [\n { value: 'ALL' as const, label: tr('technospam.problems.filterAll', 'All') },\n {\n value: 'EASY' as TecProblemDifficulty,\n label: tr('technospam.problems.filterEasy', 'Easy'),\n },\n {\n value: 'MEDIUM' as TecProblemDifficulty,\n label: tr('technospam.problems.filterMedium', 'Medium'),\n },\n {\n value: 'HARD' as TecProblemDifficulty,\n label: tr('technospam.problems.filterHard', 'Hard'),\n },\n ],\n [tr]\n );\n\n // Curated interview-target lists for the catalog filters. Values follow the\n // backend's lowercase-slug convention (see practice.service.ts normalizeSlug).\n const companies = useMemo(\n () => [\n { value: 'google', label: 'Google' },\n { value: 'amazon', label: 'Amazon' },\n { value: 'meta', label: 'Meta' },\n { value: 'microsoft', label: 'Microsoft' },\n { value: 'apple', label: 'Apple' },\n { value: 'netflix', label: 'Netflix' },\n ],\n []\n );\n\n const roles = useMemo(\n () => [\n { value: 'frontend', label: 'Frontend' },\n { value: 'backend', label: 'Backend' },\n { value: 'fullstack', label: 'Full-Stack' },\n { value: 'data-science', label: 'Data Science' },\n { value: 'mobile', label: 'Mobile' },\n { value: 'sre', label: 'SRE / Infra' },\n ],\n []\n );\n\n const { limit, more } = usePageLimit();\n const { data, loading, error } = useProblemsQuery({\n status: 'PUBLISHED',\n pagination: pageArg(limit),\n ...(difficulty !== 'ALL' ? { difficulty } : {}),\n ...(company !== 'ALL' ? { company } : {}),\n ...(role !== 'ALL' ? { role } : {}),\n });\n const { data: subsData } = useSubmissionsQuery(learnerId ? { learnerId } : {});\n\n const problems = data?.tecListProblems?.items ?? [];\n const hasMore = data?.tecListProblems?.pageInfo?.hasMore ?? false;\n\n const solvedSet = useMemo(\n () =>\n new Set(\n (subsData?.tecListSubmissions?.items ?? [])\n .filter((s) => s.verdict === 'ACCEPTED')\n .map((s) => s.problemId)\n ),\n [subsData]\n );\n\n const solvedCount = problems.filter((p) => solvedSet.has(p.id)).length;\n const easyCount = problems.filter((p) => p.difficulty === 'EASY').length;\n const hardCount = problems.filter((p) => p.difficulty === 'HARD').length;\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return problems;\n return problems.filter(\n (p) =>\n p.title.toLowerCase().includes(q) ||\n (p.topic ?? '').toLowerCase().includes(q) ||\n p.tags.some((t) => t.toLowerCase().includes(q))\n );\n }, [problems, search]);\n\n return (\n <PageLayout\n hero\n title={tr('technospam.problems.title', 'Coding Problems')}\n description={tr(\n 'technospam.problems.description',\n 'Sharpen your problem-solving with hands-on, mentor-judged challenges across topics and difficulty.'\n )}\n >\n <div className=\"mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard\n label={tr('technospam.problems.statProblems', 'Problems')}\n value={problems.length}\n icon={Code2}\n tone=\"blue\"\n />\n <StatCard\n label={tr('technospam.problems.statSolved', 'Solved')}\n value={solvedCount}\n icon={CheckCircle2}\n tone=\"green\"\n />\n <StatCard\n label={tr('technospam.problems.statEasy', 'Easy')}\n value={easyCount}\n icon={Gauge}\n tone=\"teal\"\n />\n <StatCard\n label={tr('technospam.problems.statHard', 'Hard')}\n value={hardCount}\n icon={Flame}\n tone=\"amber\"\n />\n </div>\n\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <Tabs\n value={difficulty}\n onValueChange={(v) => setDifficulty(v as 'ALL' | TecProblemDifficulty)}\n >\n <TabsList>\n {difficulties.map((d) => (\n <TabsTrigger key={d.value} value={d.value}>\n {d.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n <div className=\"relative w-full sm:w-72\">\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={tr('technospam.problems.searchPlaceholder', 'Search problems…')}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onBlur={() => {\n const value = search.trim();\n if (value) {\n emit('technospam.search.performed', {\n workspaceId,\n entityType: 'problem',\n queryLength: value.length,\n });\n }\n }}\n />\n </div>\n </div>\n\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center\">\n <Select value={company} onValueChange={setCompany}>\n <SelectTrigger className=\"w-full sm:w-48\">\n <SelectValue placeholder={tr('technospam.problems.companyPlaceholder', 'Company')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">\n {tr('technospam.problems.companyAll', 'All companies')}\n </SelectItem>\n {companies.map((c) => (\n <SelectItem key={c.value} value={c.value}>\n {c.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select value={role} onValueChange={setRole}>\n <SelectTrigger className=\"w-full sm:w-48\">\n <SelectValue placeholder={tr('technospam.problems.rolePlaceholder', 'Role')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">{tr('technospam.problems.roleAll', 'All roles')}</SelectItem>\n {roles.map((r) => (\n <SelectItem key={r.value} value={r.value}>\n {r.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {loading && !problems.length ? (\n <LoadingGrid />\n ) : error ? (\n <ErrorView\n title={tr('technospam.common.errorLoadProblems', \"Couldn't load problems\")}\n error={error}\n />\n ) : filtered.length === 0 ? (\n <EmptyView\n icon={<Code2 size={26} />}\n title={\n search || difficulty !== 'ALL' || company !== 'ALL' || role !== 'ALL'\n ? tr('technospam.problems.emptySearchTitle', 'No matching problems')\n : tr('technospam.problems.emptyDefaultTitle', 'No problems published yet')\n }\n description={\n search || difficulty !== 'ALL' || company !== 'ALL' || role !== 'ALL'\n ? tr(\n 'technospam.problems.emptySearchDesc',\n 'Try a different search, difficulty, company, or role filter.'\n )\n : tr(\n 'technospam.problems.emptyDefaultDesc',\n 'Published problems will appear here. Check back soon — TechnoSpam is pre-launch.'\n )\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filtered.map((problem) => (\n <ProblemCard\n key={problem.id}\n problem={problem}\n solved={solvedSet.has(problem.id)}\n onOpen={() => {\n emit('technospam.problem.viewed', {\n workspaceId,\n entityId: problem.id,\n entityType: 'TEC_PROBLEM',\n });\n navigate(`/applications/problem-details-page?id=${problem.id}`);\n }}\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":"ApplicationsProblemsPagePage.js","names":[],"sources":["../../../src/technospam/pages/ApplicationsProblemsPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Building2,\n CheckCircle2,\n Code2,\n Flame,\n Gauge,\n Layers,\n Search,\n Tag,\n Trophy,\n} from 'lucide-react';\nimport {\n Badge,\n GlassCard,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport {\n EmptyView,\n ErrorView,\n LoadMore,\n LoadingGrid,\n MediaCover,\n PageLayout,\n PremiumBadge,\n StatCard,\n StatusBadge,\n topicIcon,\n} from '../components';\nimport { useTechnoSpam, useTechnoSpamNavigate } from '../providers/TechnoSpamProvider';\nimport {\n pageArg,\n usePageLimit,\n useProblemsQuery,\n useSubmissionsQuery,\n type TecProblem,\n type TecProblemDifficulty,\n} from '../api/technospamApi';\nimport { useTechnoSpamAnalytics } from '../hooks/useTechnoSpamAnalytics';\nimport { useTr } from '../hooks/useTr';\n\nfunction ProblemCard({\n problem,\n solved,\n onOpen,\n}: {\n problem: TecProblem;\n solved: boolean;\n onOpen: () => void;\n}) {\n const tr = useTr();\n return (\n <GlassCard\n className=\"group flex cursor-pointer flex-col overflow-hidden transition-all duration-200 hover:-translate-y-1 hover:shadow-lg\"\n onClick={onOpen}\n >\n <MediaCover\n seed={`${problem.topic ?? ''} ${problem.difficulty} ${problem.title}`}\n icon={topicIcon(problem.topic ?? problem.title)}\n >\n {solved ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-status-success-bg-subtle px-2 py-0.5 text-[11px] font-medium text-status-success-text ring-1 ring-status-success-border/30\">\n <CheckCircle2 size={12} /> {tr('technospam.problems.solved', 'Solved')}\n </span>\n ) : (\n <span />\n )}\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <StatusBadge status={problem.difficulty} kind=\"level\" />\n {problem.isPremiumOnly ? <PremiumBadge locked={problem.isLocked} /> : null}\n </div>\n </MediaCover>\n <div className=\"flex flex-1 flex-col gap-3 p-4\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary group-hover:text-accent-primary\">\n {problem.title}\n </h3>\n {problem.statement ? (\n <p className=\"mt-1 line-clamp-2 text-sm text-text-secondary\">{problem.statement}</p>\n ) : null}\n </div>\n <div className=\"mt-auto flex flex-wrap items-center gap-3 text-xs text-text-muted\">\n {problem.topic ? (\n <span className=\"inline-flex items-center gap-1\">\n <Layers size={13} /> {problem.topic}\n </span>\n ) : null}\n <span className=\"inline-flex items-center gap-1\">\n <Trophy size={13} />{' '}\n {tr('technospam.problems.points', '{{count}} pts', { count: problem.points })}\n </span>\n {problem.languages.length ? (\n <span className=\"inline-flex items-center gap-1\">\n <Code2 size={13} />{' '}\n {problem.languages.length === 1\n ? tr('technospam.problems.languages', '{{count}} lang', {\n count: problem.languages.length,\n })\n : tr('technospam.problems.languagesPlural', '{{count}} langs', {\n count: problem.languages.length,\n })}\n </span>\n ) : null}\n </div>\n {problem.companies.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {problem.companies.slice(0, 3).map((c) => (\n <Badge key={c} variant=\"outline\" className=\"text-[11px] capitalize\">\n <Building2 size={10} className=\"mr-1\" />\n {c.replace(/-/g, ' ')}\n </Badge>\n ))}\n {problem.interviewFrequency === 'HIGH' ? (\n <Badge variant=\"secondary\" className=\"text-[11px] text-status-warning-text\">\n <Flame size={10} className=\"mr-1\" />\n {tr('technospam.problems.frequentlyAsked', 'Frequently asked')}\n </Badge>\n ) : null}\n </div>\n ) : null}\n {problem.tags.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {problem.tags.slice(0, 3).map((t) => (\n <Badge key={t} variant=\"secondary\" className=\"text-[11px]\">\n <Tag size={10} className=\"mr-1\" />\n {t}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n </GlassCard>\n );\n}\n\nexport function ApplicationsProblemsPagePage() {\n const navigate = useTechnoSpamNavigate();\n const { currentUser, workspaceId } = useTechnoSpam();\n const { emit } = useTechnoSpamAnalytics();\n const tr = useTr();\n const learnerId = currentUser?.id;\n const [difficulty, setDifficulty] = useState<'ALL' | TecProblemDifficulty>('ALL');\n const [company, setCompany] = useState<string>('ALL');\n const [role, setRole] = useState<string>('ALL');\n const [search, setSearch] = useState('');\n\n const difficulties = useMemo(\n () => [\n { value: 'ALL' as const, label: tr('technospam.problems.filterAll', 'All') },\n {\n value: 'EASY' as TecProblemDifficulty,\n label: tr('technospam.problems.filterEasy', 'Easy'),\n },\n {\n value: 'MEDIUM' as TecProblemDifficulty,\n label: tr('technospam.problems.filterMedium', 'Medium'),\n },\n {\n value: 'HARD' as TecProblemDifficulty,\n label: tr('technospam.problems.filterHard', 'Hard'),\n },\n ],\n [tr]\n );\n\n // Curated interview-target lists for the catalog filters. Values follow the\n // backend's lowercase-slug convention (see practice.service.ts normalizeSlug).\n const companies = useMemo(\n () => [\n { value: 'google', label: 'Google' },\n { value: 'amazon', label: 'Amazon' },\n { value: 'meta', label: 'Meta' },\n { value: 'microsoft', label: 'Microsoft' },\n { value: 'apple', label: 'Apple' },\n { value: 'netflix', label: 'Netflix' },\n ],\n []\n );\n\n const roles = useMemo(\n () => [\n { value: 'frontend', label: 'Frontend' },\n { value: 'backend', label: 'Backend' },\n { value: 'fullstack', label: 'Full-Stack' },\n { value: 'data-science', label: 'Data Science' },\n { value: 'mobile', label: 'Mobile' },\n { value: 'sre', label: 'SRE / Infra' },\n ],\n []\n );\n\n const { limit, more } = usePageLimit();\n const { data, loading, error } = useProblemsQuery({\n status: 'PUBLISHED',\n pagination: pageArg(limit),\n ...(difficulty !== 'ALL' ? { difficulty } : {}),\n ...(company !== 'ALL' ? { company } : {}),\n ...(role !== 'ALL' ? { role } : {}),\n });\n const { data: subsData } = useSubmissionsQuery(learnerId ? { learnerId } : {});\n\n const problems = data?.tecListProblems?.items ?? [];\n const hasMore = data?.tecListProblems?.pageInfo?.hasMore ?? false;\n\n const solvedSet = useMemo(\n () =>\n new Set(\n (subsData?.tecListSubmissions?.items ?? [])\n .filter((s) => s.verdict === 'ACCEPTED')\n .map((s) => s.problemId)\n ),\n [subsData]\n );\n\n const solvedCount = problems.filter((p) => solvedSet.has(p.id)).length;\n const easyCount = problems.filter((p) => p.difficulty === 'EASY').length;\n const hardCount = problems.filter((p) => p.difficulty === 'HARD').length;\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return problems;\n return problems.filter(\n (p) =>\n p.title.toLowerCase().includes(q) ||\n (p.topic ?? '').toLowerCase().includes(q) ||\n p.tags.some((t) => t.toLowerCase().includes(q))\n );\n }, [problems, search]);\n\n return (\n <PageLayout\n hero\n title={tr('technospam.problems.title', 'Coding Problems')}\n description={tr(\n 'technospam.problems.description',\n 'Sharpen your problem-solving with hands-on, mentor-judged challenges across topics and difficulty.'\n )}\n >\n <div className=\"mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard\n label={tr('technospam.problems.statProblems', 'Problems')}\n value={problems.length}\n icon={Code2}\n tone=\"blue\"\n />\n <StatCard\n label={tr('technospam.problems.statSolved', 'Solved')}\n value={solvedCount}\n icon={CheckCircle2}\n tone=\"green\"\n />\n <StatCard\n label={tr('technospam.problems.statEasy', 'Easy')}\n value={easyCount}\n icon={Gauge}\n tone=\"teal\"\n />\n <StatCard\n label={tr('technospam.problems.statHard', 'Hard')}\n value={hardCount}\n icon={Flame}\n tone=\"amber\"\n />\n </div>\n\n {/* The tabs filter one list, so that list is their tab panel: Radix points every\n trigger's aria-controls at a panel id, and without a TabsContent the id\n resolved to nothing (axe aria-valid-attr-value, critical; BOFF-3157). */}\n <Tabs\n className=\"gap-0\"\n value={difficulty}\n onValueChange={(v) => setDifficulty(v as 'ALL' | TecProblemDifficulty)}\n >\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <TabsList>\n {difficulties.map((d) => (\n <TabsTrigger key={d.value} value={d.value}>\n {d.label}\n </TabsTrigger>\n ))}\n </TabsList>\n <div className=\"relative w-full sm:w-72\">\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 aria-label={tr('technospam.problems.searchLabel', 'Search problems')}\n placeholder={tr('technospam.problems.searchPlaceholder', 'Search problems…')}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onBlur={() => {\n const value = search.trim();\n if (value) {\n emit('technospam.search.performed', {\n workspaceId,\n entityType: 'problem',\n queryLength: value.length,\n });\n }\n }}\n />\n </div>\n </div>\n\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center\">\n <Select value={company} onValueChange={setCompany}>\n <SelectTrigger\n className=\"w-full sm:w-48\"\n aria-label={tr('technospam.problems.companyFilterLabel', 'Filter by company')}\n >\n <SelectValue placeholder={tr('technospam.problems.companyPlaceholder', 'Company')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">\n {tr('technospam.problems.companyAll', 'All companies')}\n </SelectItem>\n {companies.map((c) => (\n <SelectItem key={c.value} value={c.value}>\n {c.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select value={role} onValueChange={setRole}>\n <SelectTrigger\n className=\"w-full sm:w-48\"\n aria-label={tr('technospam.problems.roleFilterLabel', 'Filter by role')}\n >\n <SelectValue placeholder={tr('technospam.problems.rolePlaceholder', 'Role')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">{tr('technospam.problems.roleAll', 'All roles')}</SelectItem>\n {roles.map((r) => (\n <SelectItem key={r.value} value={r.value}>\n {r.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <TabsContent value={difficulty}>\n {loading && !problems.length ? (\n <LoadingGrid />\n ) : error ? (\n <ErrorView\n title={tr('technospam.common.errorLoadProblems', \"Couldn't load problems\")}\n error={error}\n />\n ) : filtered.length === 0 ? (\n <EmptyView\n icon={<Code2 size={26} />}\n title={\n search || difficulty !== 'ALL' || company !== 'ALL' || role !== 'ALL'\n ? tr('technospam.problems.emptySearchTitle', 'No matching problems')\n : tr('technospam.problems.emptyDefaultTitle', 'No problems published yet')\n }\n description={\n search || difficulty !== 'ALL' || company !== 'ALL' || role !== 'ALL'\n ? tr(\n 'technospam.problems.emptySearchDesc',\n 'Try a different search, difficulty, company, or role filter.'\n )\n : tr(\n 'technospam.problems.emptyDefaultDesc',\n 'Published problems will appear here. Check back soon — TechnoSpam is pre-launch.'\n )\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filtered.map((problem) => (\n <ProblemCard\n key={problem.id}\n problem={problem}\n solved={solvedSet.has(problem.id)}\n onOpen={() => {\n emit('technospam.problem.viewed', {\n workspaceId,\n entityId: problem.id,\n entityType: 'TEC_PROBLEM',\n });\n navigate(`/applications/problem-details-page?id=${problem.id}`);\n }}\n />\n ))}\n </div>\n )}\n <LoadMore hasMore={hasMore} loading={loading} onClick={more} />\n </TabsContent>\n </Tabs>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -24,7 +24,7 @@ var I = {
24
24
  VIDEO: {
25
25
  icon: T,
26
26
  chip: "bg-accent-primary/15 text-accent-primary",
27
- badge: "border-accent-primary/25 bg-accent-primary/10 text-accent-primary"
27
+ badge: "border-accent-primary/25 bg-accent-primary/6 text-accent-primary"
28
28
  },
29
29
  ARTICLE: {
30
30
  icon: S,
@@ -98,7 +98,7 @@ function de({ lesson: e, index: t, done: n, open: i, onToggle: a, onStart: o })
98
98
  size: 18,
99
99
  className: "text-status-success-text"
100
100
  }) : e.isPreview ? /* @__PURE__ */ M("span", {
101
- className: "inline-flex items-center gap-1 rounded-full border border-accent-primary/30 bg-accent-primary/10 px-2 py-0.5 text-[11px] font-medium text-accent-primary",
101
+ className: "inline-flex items-center gap-1 rounded-full border border-accent-primary/30 bg-accent-primary/6 px-2 py-0.5 text-[11px] font-medium text-accent-primary",
102
102
  children: [/* @__PURE__ */ j(x, { size: 12 }), " Preview"]
103
103
  }) : e.isLocked ? /* @__PURE__ */ M("span", {
104
104
  className: "inline-flex items-center gap-1 rounded-full border border-status-warning-border/60 bg-status-warning-bg-subtle px-2 py-0.5 text-[11px] font-medium text-status-warning-text",