@burdenoff/microfe-technospam 2026.828.1 → 2026.829.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/index.js +4 -3
  2. package/dist/node_modules/recharts/es6/cartesian/Brush.js.map +1 -1
  3. package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js.map +1 -1
  4. package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js.map +1 -1
  5. package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js.map +1 -1
  6. package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js.map +1 -1
  7. package/dist/node_modules/recharts/es6/cartesian/XAxis.js.map +1 -1
  8. package/dist/node_modules/recharts/es6/cartesian/YAxis.js.map +1 -1
  9. package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js.map +1 -1
  10. package/dist/node_modules/sonner/dist/index.js.map +1 -1
  11. package/dist/technospam/TechnoSpamRoot.js +4 -4
  12. package/dist/technospam/components/PageLayout.d.ts.map +1 -1
  13. package/dist/technospam/components/PageLayout.js +24 -23
  14. package/dist/technospam/components/PageLayout.js.map +1 -1
  15. package/dist/technospam/components/StateViews.d.ts +1 -1
  16. package/dist/technospam/components/StateViews.d.ts.map +1 -1
  17. package/dist/technospam/components/StateViews.js +28 -26
  18. package/dist/technospam/components/StateViews.js.map +1 -1
  19. package/dist/technospam/components/TagInput.d.ts +1 -1
  20. package/dist/technospam/components/TagInput.d.ts.map +1 -1
  21. package/dist/technospam/components/TagInput.js +39 -34
  22. package/dist/technospam/components/TagInput.js.map +1 -1
  23. package/dist/technospam/hooks/useTr.d.ts +17 -0
  24. package/dist/technospam/hooks/useTr.d.ts.map +1 -0
  25. package/dist/technospam/hooks/useTr.js +12 -0
  26. package/dist/technospam/hooks/useTr.js.map +1 -0
  27. package/dist/technospam/index.d.ts +1 -0
  28. package/dist/technospam/index.d.ts.map +1 -1
  29. package/dist/technospam/index.js +1 -0
  30. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
  31. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js +198 -189
  32. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  33. package/dist/technospam/pages/ApplicationsProblemsPagePage.d.ts.map +1 -1
  34. package/dist/technospam/pages/ApplicationsProblemsPagePage.js +165 -163
  35. package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
  36. package/dist/technospam/pages/CoursesCoursesPagePage.d.ts.map +1 -1
  37. package/dist/technospam/pages/CoursesCoursesPagePage.js +117 -113
  38. package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -1
  39. package/dist/technospam/pages/DashboardDashboardPagePage.d.ts.map +1 -1
  40. package/dist/technospam/pages/DashboardDashboardPagePage.js +211 -193
  41. package/dist/technospam/pages/DashboardDashboardPagePage.js.map +1 -1
  42. package/dist/technospam/pages/HackathonsHackathonsPagePage.d.ts.map +1 -1
  43. package/dist/technospam/pages/HackathonsHackathonsPagePage.js +110 -110
  44. package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -1
  45. package/dist/technospam/pages/MentorshipMentorsPagePage.d.ts.map +1 -1
  46. package/dist/technospam/pages/MentorshipMentorsPagePage.js +174 -160
  47. package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -1
  48. package/dist/technospam/pages/MentorshipSessionsPagePage.d.ts.map +1 -1
  49. package/dist/technospam/pages/MentorshipSessionsPagePage.js +156 -151
  50. package/dist/technospam/pages/MentorshipSessionsPagePage.js.map +1 -1
  51. package/dist/technospam/utils/i18n.js +1 -1
  52. package/dist/technospam/utils/i18n.js.map +1 -1
  53. package/package.json +1 -1
@@ -1,90 +1,69 @@
1
1
  import { useTechnoSpam as e, useTechnoSpamNavigate as t } from "../providers/TechnoSpamProvider.js";
2
2
  import { useTechnoSpamAnalytics as n } from "../hooks/useTechnoSpamAnalytics.js";
3
- import { PageLayout as r } from "../components/PageLayout.js";
4
- import { StatCard as i } from "../components/StatCard.js";
5
- import { MediaCover as a, topicIcon as o } from "../components/MediaCover.js";
6
- import { formatDuration as s } from "../utils/format.js";
7
- import { StatusBadge as c } from "../components/StatusBadge.js";
8
- import { LoadMore as l } from "../components/LoadMore.js";
9
- import { EmptyView as u, ErrorView as d, LoadingGrid as f } from "../components/StateViews.js";
10
- import { PremiumBadge as p } from "../components/UpgradeGate.js";
3
+ import { useTr as r } from "../hooks/useTr.js";
4
+ import { PageLayout as i } from "../components/PageLayout.js";
5
+ import { StatCard as a } from "../components/StatCard.js";
6
+ import { MediaCover as o, topicIcon as s } from "../components/MediaCover.js";
7
+ import { formatDuration as c } from "../utils/format.js";
8
+ import { StatusBadge as l } from "../components/StatusBadge.js";
9
+ import { LoadMore as u } from "../components/LoadMore.js";
10
+ import { EmptyView as d, ErrorView as f, LoadingGrid as p } from "../components/StateViews.js";
11
+ import { PremiumBadge as m } from "../components/UpgradeGate.js";
11
12
  import "../components/index.js";
12
- import { pageArg as m, useCoursesQuery as h, usePageLimit as g } from "../api/technospamApi.js";
13
- import { useMemo as _, useState as v } from "react";
14
- import { BookOpen as y, Clock as b, GraduationCap as x, Layers as S, Search as C, Sparkles as w } from "lucide-react";
15
- import { jsx as T, jsxs as E } from "react/jsx-runtime";
16
- import { Badge as D, Button as O, GlassCard as k, Input as A, Tabs as j, TabsList as M, TabsTrigger as N } from "@burdenoff/fe-libs/ui";
13
+ import { pageArg as h, useCoursesQuery as g, usePageLimit as _ } from "../api/technospamApi.js";
14
+ import { useMemo as v, useState as y } from "react";
15
+ import { BookOpen as b, Clock as x, GraduationCap as S, Layers as C, Search as w, Sparkles as T } from "lucide-react";
16
+ import { jsx as E, jsxs as D } from "react/jsx-runtime";
17
+ import { Badge as O, Button as k, GlassCard as A, Input as j, Tabs as M, TabsList as N, TabsTrigger as P } from "@burdenoff/fe-libs/ui";
17
18
  //#region src/technospam/pages/CoursesCoursesPagePage.tsx
18
- var P = [
19
- {
20
- value: "ALL",
21
- label: "All levels"
22
- },
23
- {
24
- value: "BEGINNER",
25
- label: "Beginner"
26
- },
27
- {
28
- value: "INTERMEDIATE",
29
- label: "Intermediate"
30
- },
31
- {
32
- value: "ADVANCED",
33
- label: "Advanced"
34
- },
35
- {
36
- value: "EXPERT",
37
- label: "Expert"
38
- }
39
- ];
40
19
  function F({ course: e, onOpen: t }) {
41
- return /* @__PURE__ */ E(k, {
20
+ return /* @__PURE__ */ D(A, {
42
21
  className: "group flex cursor-pointer flex-col overflow-hidden transition-all duration-200 hover:-translate-y-1 hover:shadow-lg",
43
22
  onClick: t,
44
- children: [/* @__PURE__ */ T(a, {
23
+ children: [/* @__PURE__ */ E(o, {
45
24
  seed: `${e.topic ?? ""} ${e.title}`,
46
- icon: o(e.topic ?? e.title),
47
- children: /* @__PURE__ */ E("div", {
25
+ icon: s(e.topic ?? e.title),
26
+ children: /* @__PURE__ */ D("div", {
48
27
  className: "flex flex-wrap items-center gap-1.5",
49
- children: [/* @__PURE__ */ T(c, {
28
+ children: [/* @__PURE__ */ E(l, {
50
29
  status: e.level,
51
30
  kind: "level"
52
- }), e.isPremiumOnly ? /* @__PURE__ */ T(p, { locked: e.isLocked }) : null]
31
+ }), e.isPremiumOnly ? /* @__PURE__ */ E(m, { locked: e.isLocked }) : null]
53
32
  })
54
- }), /* @__PURE__ */ E("div", {
33
+ }), /* @__PURE__ */ D("div", {
55
34
  className: "flex flex-1 flex-col gap-3 p-4",
56
35
  children: [
57
- /* @__PURE__ */ E("div", {
36
+ /* @__PURE__ */ D("div", {
58
37
  className: "min-w-0",
59
- children: [/* @__PURE__ */ T("h3", {
38
+ children: [/* @__PURE__ */ E("h3", {
60
39
  className: "truncate text-base font-semibold text-text-primary group-hover:text-accent-primary",
61
40
  children: e.title
62
- }), e.summary ? /* @__PURE__ */ T("p", {
41
+ }), e.summary ? /* @__PURE__ */ E("p", {
63
42
  className: "mt-1 line-clamp-2 text-sm text-text-secondary",
64
43
  children: e.summary
65
44
  }) : null]
66
45
  }),
67
- /* @__PURE__ */ E("div", {
46
+ /* @__PURE__ */ D("div", {
68
47
  className: "mt-auto flex flex-wrap items-center gap-3 text-xs text-text-muted",
69
- children: [e.topic ? /* @__PURE__ */ E("span", {
48
+ children: [e.topic ? /* @__PURE__ */ D("span", {
70
49
  className: "inline-flex items-center gap-1",
71
50
  children: [
72
- /* @__PURE__ */ T(S, { size: 13 }),
51
+ /* @__PURE__ */ E(C, { size: 13 }),
73
52
  " ",
74
53
  e.topic
75
54
  ]
76
- }) : null, /* @__PURE__ */ E("span", {
55
+ }) : null, /* @__PURE__ */ D("span", {
77
56
  className: "inline-flex items-center gap-1",
78
57
  children: [
79
- /* @__PURE__ */ T(b, { size: 13 }),
58
+ /* @__PURE__ */ E(x, { size: 13 }),
80
59
  " ",
81
- s(e.estimatedMinutes)
60
+ c(e.estimatedMinutes)
82
61
  ]
83
62
  })]
84
63
  }),
85
- e.tags.length ? /* @__PURE__ */ T("div", {
64
+ e.tags.length ? /* @__PURE__ */ E("div", {
86
65
  className: "flex flex-wrap gap-1.5",
87
- children: e.tags.slice(0, 3).map((e) => /* @__PURE__ */ T(D, {
66
+ children: e.tags.slice(0, 3).map((e) => /* @__PURE__ */ E(O, {
88
67
  variant: "secondary",
89
68
  className: "text-[11px]",
90
69
  children: e
@@ -95,76 +74,101 @@ function F({ course: e, onOpen: t }) {
95
74
  });
96
75
  }
97
76
  function I() {
98
- let a = t(), { workspaceId: o } = e(), { emit: c } = n(), [p, S] = v("ALL"), [D, k] = v(""), { limit: I, more: L } = g(), { data: R, loading: z, error: B } = h({
77
+ let o = t(), { workspaceId: s } = e(), { emit: l } = n(), m = r(), [C, O] = y("ALL"), [A, I] = y(""), L = v(() => [
78
+ {
79
+ value: "ALL",
80
+ label: m("technospam.courses.filterAllLevels", "All levels")
81
+ },
82
+ {
83
+ value: "BEGINNER",
84
+ label: m("technospam.courses.filterBeginner", "Beginner")
85
+ },
86
+ {
87
+ value: "INTERMEDIATE",
88
+ label: m("technospam.courses.filterIntermediate", "Intermediate")
89
+ },
90
+ {
91
+ value: "ADVANCED",
92
+ label: m("technospam.courses.filterAdvanced", "Advanced")
93
+ },
94
+ {
95
+ value: "EXPERT",
96
+ label: m("technospam.courses.filterExpert", "Expert")
97
+ }
98
+ ], [m]), { limit: R, more: z } = _(), { data: B, loading: V, error: H } = g({
99
99
  status: "PUBLISHED",
100
- pagination: m(I),
101
- ...p === "ALL" ? {} : { level: p }
102
- }), V = R?.tecListCourses?.items ?? [], H = R?.tecListCourses?.pageInfo?.hasMore ?? !1, U = _(() => {
103
- let e = D.trim().toLowerCase();
104
- return e ? V.filter((t) => t.title.toLowerCase().includes(e) || (t.topic ?? "").toLowerCase().includes(e) || t.tags.some((t) => t.toLowerCase().includes(e))) : V;
105
- }, [V, D]);
106
- return /* @__PURE__ */ E(r, {
100
+ pagination: h(R),
101
+ ...C === "ALL" ? {} : { level: C }
102
+ }), U = B?.tecListCourses?.items ?? [], W = B?.tecListCourses?.pageInfo?.hasMore ?? !1, G = v(() => {
103
+ let e = A.trim().toLowerCase();
104
+ return e ? U.filter((t) => t.title.toLowerCase().includes(e) || (t.topic ?? "").toLowerCase().includes(e) || t.tags.some((t) => t.toLowerCase().includes(e))) : U;
105
+ }, [U, A]);
106
+ return /* @__PURE__ */ D(i, {
107
107
  hero: !0,
108
- title: "Course Catalog",
109
- description: "Learn technology by doing — practical, project-based courses across the stack.",
110
- actions: /* @__PURE__ */ E(O, {
108
+ title: m("technospam.courses.title", "Course Catalog"),
109
+ description: m("technospam.courses.description", "Learn technology by doing — practical, project-based courses across the stack."),
110
+ actions: /* @__PURE__ */ D(k, {
111
111
  variant: "outline",
112
- onClick: () => a("/courses/my-learning-page"),
113
- children: [/* @__PURE__ */ T(x, { size: 16 }), " My Learning"]
112
+ onClick: () => o("/courses/my-learning-page"),
113
+ children: [
114
+ /* @__PURE__ */ E(S, { size: 16 }),
115
+ " ",
116
+ m("technospam.common.myLearning", "My Learning")
117
+ ]
114
118
  }),
115
119
  children: [
116
- /* @__PURE__ */ E("div", {
120
+ /* @__PURE__ */ D("div", {
117
121
  className: "mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4",
118
122
  children: [
119
- /* @__PURE__ */ T(i, {
120
- label: "Courses",
121
- value: V.length,
122
- icon: y,
123
+ /* @__PURE__ */ E(a, {
124
+ label: m("technospam.courses.statCourses", "Courses"),
125
+ value: U.length,
126
+ icon: b,
123
127
  tone: "blue"
124
128
  }),
125
- /* @__PURE__ */ T(i, {
126
- label: "Beginner-friendly",
127
- value: V.filter((e) => e.level === "BEGINNER").length,
128
- icon: w,
129
+ /* @__PURE__ */ E(a, {
130
+ label: m("technospam.courses.statBeginnerFriendly", "Beginner-friendly"),
131
+ value: U.filter((e) => e.level === "BEGINNER").length,
132
+ icon: T,
129
133
  tone: "green"
130
134
  }),
131
- /* @__PURE__ */ T(i, {
132
- label: "Advanced+",
133
- value: V.filter((e) => e.level === "ADVANCED" || e.level === "EXPERT").length,
134
- icon: x,
135
+ /* @__PURE__ */ E(a, {
136
+ label: m("technospam.courses.statAdvancedPlus", "Advanced+"),
137
+ value: U.filter((e) => e.level === "ADVANCED" || e.level === "EXPERT").length,
138
+ icon: S,
135
139
  tone: "purple"
136
140
  }),
137
- /* @__PURE__ */ T(i, {
138
- label: "Total content",
139
- value: s(V.reduce((e, t) => e + t.estimatedMinutes, 0)),
140
- icon: b,
141
+ /* @__PURE__ */ E(a, {
142
+ label: m("technospam.courses.statTotalContent", "Total content"),
143
+ value: c(U.reduce((e, t) => e + t.estimatedMinutes, 0)),
144
+ icon: x,
141
145
  tone: "teal"
142
146
  })
143
147
  ]
144
148
  }),
145
- /* @__PURE__ */ E("div", {
149
+ /* @__PURE__ */ D("div", {
146
150
  className: "mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
147
- children: [/* @__PURE__ */ T(j, {
148
- value: p,
149
- onValueChange: (e) => S(e),
150
- children: /* @__PURE__ */ T(M, { children: P.map((e) => /* @__PURE__ */ T(N, {
151
+ children: [/* @__PURE__ */ E(M, {
152
+ value: C,
153
+ onValueChange: (e) => O(e),
154
+ children: /* @__PURE__ */ E(N, { children: L.map((e) => /* @__PURE__ */ E(P, {
151
155
  value: e.value,
152
156
  children: e.label
153
157
  }, e.value)) })
154
- }), /* @__PURE__ */ E("div", {
158
+ }), /* @__PURE__ */ D("div", {
155
159
  className: "relative w-full sm:w-72",
156
- children: [/* @__PURE__ */ T(C, {
160
+ children: [/* @__PURE__ */ E(w, {
157
161
  className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-muted",
158
162
  size: 16
159
- }), /* @__PURE__ */ T(A, {
163
+ }), /* @__PURE__ */ E(j, {
160
164
  className: "pl-9",
161
- placeholder: "Search courses…",
162
- value: D,
163
- onChange: (e) => k(e.target.value),
165
+ placeholder: m("technospam.courses.searchPlaceholder", "Search courses…"),
166
+ value: A,
167
+ onChange: (e) => I(e.target.value),
164
168
  onBlur: () => {
165
- let e = D.trim();
166
- e && c("technospam.search.performed", {
167
- workspaceId: o,
169
+ let e = A.trim();
170
+ e && l("technospam.search.performed", {
171
+ workspaceId: s,
168
172
  entityType: "course",
169
173
  queryLength: e.length
170
174
  });
@@ -172,30 +176,30 @@ function I() {
172
176
  })]
173
177
  })]
174
178
  }),
175
- z && !V.length ? /* @__PURE__ */ T(f, {}) : B ? /* @__PURE__ */ T(d, {
176
- title: "Couldn't load courses",
177
- error: B
178
- }) : U.length === 0 ? /* @__PURE__ */ T(u, {
179
- icon: /* @__PURE__ */ T(y, { size: 26 }),
180
- title: D || p !== "ALL" ? "No matching courses" : "No courses published yet",
181
- description: D || p !== "ALL" ? "Try a different search or level filter." : "Published courses will appear here. Check back soon — TechnoSpam is pre-launch."
182
- }) : /* @__PURE__ */ T("div", {
179
+ V && !U.length ? /* @__PURE__ */ E(p, {}) : H ? /* @__PURE__ */ E(f, {
180
+ title: m("technospam.common.errorLoadCourses", "Couldn't load courses"),
181
+ error: H
182
+ }) : G.length === 0 ? /* @__PURE__ */ E(d, {
183
+ icon: /* @__PURE__ */ E(b, { size: 26 }),
184
+ title: A || C !== "ALL" ? m("technospam.courses.emptySearchTitle", "No matching courses") : m("technospam.courses.emptyDefaultTitle", "No courses published yet"),
185
+ description: A || C !== "ALL" ? m("technospam.courses.emptySearchDesc", "Try a different search or level filter.") : m("technospam.courses.emptyDefaultDesc", "Published courses will appear here. Check back soon — TechnoSpam is pre-launch.")
186
+ }) : /* @__PURE__ */ E("div", {
183
187
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
184
- children: U.map((e) => /* @__PURE__ */ T(F, {
188
+ children: G.map((e) => /* @__PURE__ */ E(F, {
185
189
  course: e,
186
190
  onOpen: () => {
187
- c("technospam.course.viewed", {
188
- workspaceId: o,
191
+ l("technospam.course.viewed", {
192
+ workspaceId: s,
189
193
  entityId: e.id,
190
194
  entityType: "TEC_COURSE"
191
- }), a(`/courses/course-details-page?id=${e.id}`);
195
+ }), o(`/courses/course-details-page?id=${e.id}`);
192
196
  }
193
197
  }, e.id))
194
198
  }),
195
- /* @__PURE__ */ T(l, {
196
- hasMore: H,
197
- loading: z,
198
- onClick: L
199
+ /* @__PURE__ */ E(u, {
200
+ hasMore: W,
201
+ loading: V,
202
+ onClick: z
199
203
  })
200
204
  ]
201
205
  });
@@ -1 +1 @@
1
- {"version":3,"file":"CoursesCoursesPagePage.js","names":[],"sources":["../../../src/technospam/pages/CoursesCoursesPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { BookOpen, Clock, GraduationCap, Layers, Search, Sparkles } from 'lucide-react';\nimport {\n Badge,\n Button,\n GlassCard,\n Input,\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 useCoursesQuery,\n usePageLimit,\n type TecCourse,\n type TecCourseLevel,\n} from '../api/technospamApi';\nimport { formatDuration } from '../utils/format';\nimport { useTechnoSpamAnalytics } from '../hooks/useTechnoSpamAnalytics';\n\nconst LEVELS: Array<{ value: 'ALL' | TecCourseLevel; label: string }> = [\n { value: 'ALL', label: 'All levels' },\n { value: 'BEGINNER', label: 'Beginner' },\n { value: 'INTERMEDIATE', label: 'Intermediate' },\n { value: 'ADVANCED', label: 'Advanced' },\n { value: 'EXPERT', label: 'Expert' },\n];\n\nfunction CourseCard({ course, onOpen }: { course: TecCourse; onOpen: () => void }) {\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={`${course.topic ?? ''} ${course.title}`}\n icon={topicIcon(course.topic ?? course.title)}\n >\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <StatusBadge status={course.level} kind=\"level\" />\n {course.isPremiumOnly ? <PremiumBadge locked={course.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 {course.title}\n </h3>\n {course.summary ? (\n <p className=\"mt-1 line-clamp-2 text-sm text-text-secondary\">{course.summary}</p>\n ) : null}\n </div>\n <div className=\"mt-auto flex flex-wrap items-center gap-3 text-xs text-text-muted\">\n {course.topic ? (\n <span className=\"inline-flex items-center gap-1\">\n <Layers size={13} /> {course.topic}\n </span>\n ) : null}\n <span className=\"inline-flex items-center gap-1\">\n <Clock size={13} /> {formatDuration(course.estimatedMinutes)}\n </span>\n </div>\n {course.tags.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {course.tags.slice(0, 3).map((t) => (\n <Badge key={t} variant=\"secondary\" className=\"text-[11px]\">\n {t}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n </GlassCard>\n );\n}\n\nexport function CoursesCoursesPagePage() {\n const navigate = useTechnoSpamNavigate();\n const { workspaceId } = useTechnoSpam();\n const { emit } = useTechnoSpamAnalytics();\n const [level, setLevel] = useState<'ALL' | TecCourseLevel>('ALL');\n const [search, setSearch] = useState('');\n\n const { limit, more } = usePageLimit();\n const { data, loading, error } = useCoursesQuery({\n status: 'PUBLISHED',\n pagination: pageArg(limit),\n ...(level !== 'ALL' ? { level } : {}),\n });\n\n const courses = data?.tecListCourses?.items ?? [];\n const hasMore = data?.tecListCourses?.pageInfo?.hasMore ?? false;\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return courses;\n return courses.filter(\n (c) =>\n c.title.toLowerCase().includes(q) ||\n (c.topic ?? '').toLowerCase().includes(q) ||\n c.tags.some((t) => t.toLowerCase().includes(q))\n );\n }, [courses, search]);\n\n return (\n <PageLayout\n hero\n title=\"Course Catalog\"\n description=\"Learn technology by doing — practical, project-based courses across the stack.\"\n actions={\n <Button variant=\"outline\" onClick={() => navigate('/courses/my-learning-page')}>\n <GraduationCap size={16} /> My Learning\n </Button>\n }\n >\n <div className=\"mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard label=\"Courses\" value={courses.length} icon={BookOpen} tone=\"blue\" />\n <StatCard\n label=\"Beginner-friendly\"\n value={courses.filter((c) => c.level === 'BEGINNER').length}\n icon={Sparkles}\n tone=\"green\"\n />\n <StatCard\n label=\"Advanced+\"\n value={courses.filter((c) => c.level === 'ADVANCED' || c.level === 'EXPERT').length}\n icon={GraduationCap}\n tone=\"purple\"\n />\n <StatCard\n label=\"Total content\"\n value={formatDuration(courses.reduce((s, c) => s + c.estimatedMinutes, 0))}\n icon={Clock}\n tone=\"teal\"\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 value={level} onValueChange={(v) => setLevel(v as 'ALL' | TecCourseLevel)}>\n <TabsList>\n {LEVELS.map((l) => (\n <TabsTrigger key={l.value} value={l.value}>\n {l.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=\"Search courses…\"\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: 'course',\n queryLength: value.length,\n });\n }\n }}\n />\n </div>\n </div>\n\n {loading && !courses.length ? (\n <LoadingGrid />\n ) : error ? (\n <ErrorView title=\"Couldn't load courses\" error={error} />\n ) : filtered.length === 0 ? (\n <EmptyView\n icon={<BookOpen size={26} />}\n title={search || level !== 'ALL' ? 'No matching courses' : 'No courses published yet'}\n description={\n search || level !== 'ALL'\n ? 'Try a different search or level filter.'\n : 'Published courses will appear here. Check back soon — TechnoSpam is pre-launch.'\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filtered.map((course) => (\n <CourseCard\n key={course.id}\n course={course}\n onOpen={() => {\n emit('technospam.course.viewed', {\n workspaceId,\n entityId: course.id,\n entityType: 'TEC_COURSE',\n });\n navigate(`/courses/course-details-page?id=${course.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":"CoursesCoursesPagePage.js","names":[],"sources":["../../../src/technospam/pages/CoursesCoursesPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { BookOpen, Clock, GraduationCap, Layers, Search, Sparkles } from 'lucide-react';\nimport {\n Badge,\n Button,\n GlassCard,\n Input,\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 useCoursesQuery,\n usePageLimit,\n type TecCourse,\n type TecCourseLevel,\n} from '../api/technospamApi';\nimport { formatDuration } from '../utils/format';\nimport { useTechnoSpamAnalytics } from '../hooks/useTechnoSpamAnalytics';\nimport { useTr } from '../hooks/useTr';\n\nfunction CourseCard({ course, onOpen }: { course: TecCourse; onOpen: () => void }) {\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={`${course.topic ?? ''} ${course.title}`}\n icon={topicIcon(course.topic ?? course.title)}\n >\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <StatusBadge status={course.level} kind=\"level\" />\n {course.isPremiumOnly ? <PremiumBadge locked={course.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 {course.title}\n </h3>\n {course.summary ? (\n <p className=\"mt-1 line-clamp-2 text-sm text-text-secondary\">{course.summary}</p>\n ) : null}\n </div>\n <div className=\"mt-auto flex flex-wrap items-center gap-3 text-xs text-text-muted\">\n {course.topic ? (\n <span className=\"inline-flex items-center gap-1\">\n <Layers size={13} /> {course.topic}\n </span>\n ) : null}\n <span className=\"inline-flex items-center gap-1\">\n <Clock size={13} /> {formatDuration(course.estimatedMinutes)}\n </span>\n </div>\n {course.tags.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {course.tags.slice(0, 3).map((t) => (\n <Badge key={t} variant=\"secondary\" className=\"text-[11px]\">\n {t}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n </GlassCard>\n );\n}\n\nexport function CoursesCoursesPagePage() {\n const navigate = useTechnoSpamNavigate();\n const { workspaceId } = useTechnoSpam();\n const { emit } = useTechnoSpamAnalytics();\n const tr = useTr();\n const [level, setLevel] = useState<'ALL' | TecCourseLevel>('ALL');\n const [search, setSearch] = useState('');\n\n const levels = useMemo(\n () => [\n { value: 'ALL' as const, label: tr('technospam.courses.filterAllLevels', 'All levels') },\n {\n value: 'BEGINNER' as TecCourseLevel,\n label: tr('technospam.courses.filterBeginner', 'Beginner'),\n },\n {\n value: 'INTERMEDIATE' as TecCourseLevel,\n label: tr('technospam.courses.filterIntermediate', 'Intermediate'),\n },\n {\n value: 'ADVANCED' as TecCourseLevel,\n label: tr('technospam.courses.filterAdvanced', 'Advanced'),\n },\n { value: 'EXPERT' as TecCourseLevel, label: tr('technospam.courses.filterExpert', 'Expert') },\n ],\n [tr]\n );\n\n const { limit, more } = usePageLimit();\n const { data, loading, error } = useCoursesQuery({\n status: 'PUBLISHED',\n pagination: pageArg(limit),\n ...(level !== 'ALL' ? { level } : {}),\n });\n\n const courses = data?.tecListCourses?.items ?? [];\n const hasMore = data?.tecListCourses?.pageInfo?.hasMore ?? false;\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return courses;\n return courses.filter(\n (c) =>\n c.title.toLowerCase().includes(q) ||\n (c.topic ?? '').toLowerCase().includes(q) ||\n c.tags.some((t) => t.toLowerCase().includes(q))\n );\n }, [courses, search]);\n\n return (\n <PageLayout\n hero\n title={tr('technospam.courses.title', 'Course Catalog')}\n description={tr(\n 'technospam.courses.description',\n 'Learn technology by doing — practical, project-based courses across the stack.'\n )}\n actions={\n <Button variant=\"outline\" onClick={() => navigate('/courses/my-learning-page')}>\n <GraduationCap size={16} /> {tr('technospam.common.myLearning', 'My Learning')}\n </Button>\n }\n >\n <div className=\"mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard\n label={tr('technospam.courses.statCourses', 'Courses')}\n value={courses.length}\n icon={BookOpen}\n tone=\"blue\"\n />\n <StatCard\n label={tr('technospam.courses.statBeginnerFriendly', 'Beginner-friendly')}\n value={courses.filter((c) => c.level === 'BEGINNER').length}\n icon={Sparkles}\n tone=\"green\"\n />\n <StatCard\n label={tr('technospam.courses.statAdvancedPlus', 'Advanced+')}\n value={courses.filter((c) => c.level === 'ADVANCED' || c.level === 'EXPERT').length}\n icon={GraduationCap}\n tone=\"purple\"\n />\n <StatCard\n label={tr('technospam.courses.statTotalContent', 'Total content')}\n value={formatDuration(courses.reduce((s, c) => s + c.estimatedMinutes, 0))}\n icon={Clock}\n tone=\"teal\"\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 value={level} onValueChange={(v) => setLevel(v as 'ALL' | TecCourseLevel)}>\n <TabsList>\n {levels.map((l) => (\n <TabsTrigger key={l.value} value={l.value}>\n {l.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.courses.searchPlaceholder', 'Search courses…')}\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: 'course',\n queryLength: value.length,\n });\n }\n }}\n />\n </div>\n </div>\n\n {loading && !courses.length ? (\n <LoadingGrid />\n ) : error ? (\n <ErrorView\n title={tr('technospam.common.errorLoadCourses', \"Couldn't load courses\")}\n error={error}\n />\n ) : filtered.length === 0 ? (\n <EmptyView\n icon={<BookOpen size={26} />}\n title={\n search || level !== 'ALL'\n ? tr('technospam.courses.emptySearchTitle', 'No matching courses')\n : tr('technospam.courses.emptyDefaultTitle', 'No courses published yet')\n }\n description={\n search || level !== 'ALL'\n ? tr('technospam.courses.emptySearchDesc', 'Try a different search or level filter.')\n : tr(\n 'technospam.courses.emptyDefaultDesc',\n 'Published courses 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((course) => (\n <CourseCard\n key={course.id}\n course={course}\n onOpen={() => {\n emit('technospam.course.viewed', {\n workspaceId,\n entityId: course.id,\n entityType: 'TEC_COURSE',\n });\n navigate(`/courses/course-details-page?id=${course.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 +1 @@
1
- {"version":3,"file":"DashboardDashboardPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/DashboardDashboardPagePage.tsx"],"names":[],"mappings":"AAuMA,wBAAgB,0BAA0B,gCAyRzC"}
1
+ {"version":3,"file":"DashboardDashboardPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/DashboardDashboardPagePage.tsx"],"names":[],"mappings":"AA0MA,wBAAgB,0BAA0B,gCA8UzC"}