@burdenoff/microfe-technospam 2026.709.2 → 2026.709.4

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 (46) hide show
  1. package/dist/index.js +4 -4
  2. package/dist/technospam/TechnoSpamRoutes.d.ts.map +1 -1
  3. package/dist/technospam/TechnoSpamRoutes.js +100 -74
  4. package/dist/technospam/TechnoSpamRoutes.js.map +1 -1
  5. package/dist/technospam/components/PageLayout.d.ts.map +1 -1
  6. package/dist/technospam/components/PageLayout.js +26 -23
  7. package/dist/technospam/components/PageLayout.js.map +1 -1
  8. package/dist/technospam/components/TagInput.d.ts +18 -0
  9. package/dist/technospam/components/TagInput.d.ts.map +1 -0
  10. package/dist/technospam/components/TagInput.js +58 -0
  11. package/dist/technospam/components/TagInput.js.map +1 -0
  12. package/dist/technospam/components/TagStrip.d.ts +12 -0
  13. package/dist/technospam/components/TagStrip.d.ts.map +1 -0
  14. package/dist/technospam/components/TagStrip.js +20 -0
  15. package/dist/technospam/components/TagStrip.js.map +1 -0
  16. package/dist/technospam/components/index.d.ts +2 -0
  17. package/dist/technospam/components/index.d.ts.map +1 -1
  18. package/dist/technospam/components/index.js +2 -0
  19. package/dist/technospam/hooks/useNativeControls.d.ts +27 -0
  20. package/dist/technospam/hooks/useNativeControls.d.ts.map +1 -0
  21. package/dist/technospam/hooks/useNativeControls.js +18 -0
  22. package/dist/technospam/hooks/useNativeControls.js.map +1 -0
  23. package/dist/technospam/hooks/useTechnoSpamAnalytics.d.ts +1 -1
  24. package/dist/technospam/hooks/useTechnoSpamAnalytics.d.ts.map +1 -1
  25. package/dist/technospam/hooks/useTechnoSpamAnalytics.js.map +1 -1
  26. package/dist/technospam/hooks/useTechnoSpamPageView.d.ts +14 -0
  27. package/dist/technospam/hooks/useTechnoSpamPageView.d.ts.map +1 -0
  28. package/dist/technospam/hooks/useTechnoSpamPageView.js +26 -0
  29. package/dist/technospam/hooks/useTechnoSpamPageView.js.map +1 -0
  30. package/dist/technospam/index.js +1 -1
  31. package/dist/technospam/pages/AdminAdminDashboardPagePage.d.ts.map +1 -1
  32. package/dist/technospam/pages/AdminAdminDashboardPagePage.js +408 -399
  33. package/dist/technospam/pages/AdminAdminDashboardPagePage.js.map +1 -1
  34. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.d.ts.map +1 -1
  35. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js +50 -55
  36. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js.map +1 -1
  37. package/dist/technospam/pages/ApplicationsProblemsPagePage.js +25 -25
  38. package/dist/technospam/pages/CoursesCourseDetailsPagePage.d.ts.map +1 -1
  39. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +142 -144
  40. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
  41. package/dist/technospam/pages/CoursesCoursesPagePage.js +30 -30
  42. package/dist/technospam/pages/HackathonsHackathonsPagePage.js +29 -29
  43. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js +54 -54
  44. package/dist/technospam/pages/MentorshipMentorsPagePage.js +61 -61
  45. package/dist/technospam/pages/MentorshipSessionsPagePage.js +42 -42
  46. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { useTechnoSpam as e, useTechnoSpamNavigate as t } from "./technospam/providers/TechnoSpamProvider.js";
2
- import { TechnoSpamRoot as n } from "./technospam/TechnoSpamRoot.js";
3
- import { useSandboxAssistantTransport as r } from "./technospam/services/createSandboxAssistantTransport.js";
4
- import { useTechnoSpamAnalytics as i } from "./technospam/hooks/useTechnoSpamAnalytics.js";
2
+ import { useTechnoSpamAnalytics as n } from "./technospam/hooks/useTechnoSpamAnalytics.js";
3
+ import { TechnoSpamRoot as r } from "./technospam/TechnoSpamRoot.js";
4
+ import { useSandboxAssistantTransport as i } from "./technospam/services/createSandboxAssistantTransport.js";
5
5
  import "./technospam/index.js";
6
- export { n as TechnoSpamRoot, r as useSandboxAssistantTransport, e as useTechnoSpam, i as useTechnoSpamAnalytics, t as useTechnoSpamNavigate };
6
+ export { r as TechnoSpamRoot, i as useSandboxAssistantTransport, e as useTechnoSpam, n as useTechnoSpamAnalytics, t as useTechnoSpamNavigate };
@@ -1 +1 @@
1
- {"version":3,"file":"TechnoSpamRoutes.d.ts","sourceRoot":"","sources":["../../src/technospam/TechnoSpamRoutes.tsx"],"names":[],"mappings":"AAsFA,wBAAgB,gBAAgB,gCA0G/B"}
1
+ {"version":3,"file":"TechnoSpamRoutes.d.ts","sourceRoot":"","sources":["../../src/technospam/TechnoSpamRoutes.tsx"],"names":[],"mappings":"AAiIA,wBAAgB,gBAAgB,gCAyI/B"}
@@ -1,187 +1,213 @@
1
- import { DashboardDashboardPagePage as e } from "./pages/DashboardDashboardPagePage.js";
2
- import { Suspense as t, lazy as n } from "react";
3
- import { Loader2 as r } from "lucide-react";
4
- import { Navigate as i, Route as a, Routes as o } from "react-router-dom";
5
- import { jsx as s, jsxs as c } from "react/jsx-runtime";
1
+ import { useTechnoSpamPageView as e } from "./hooks/useTechnoSpamPageView.js";
2
+ import { EmptyView as t } from "./components/StateViews.js";
3
+ import "./components/index.js";
4
+ import { DashboardDashboardPagePage as n } from "./pages/DashboardDashboardPagePage.js";
5
+ import { Suspense as r, lazy as i, useMemo as a } from "react";
6
+ import { Loader2 as o, ShieldAlert as s } from "lucide-react";
7
+ import { Navigate as c, Route as l, Routes as u, useLocation as d } from "react-router-dom";
8
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
9
+ import { FeatureGate as m } from "@burdenoff/fe-libs/shared/feature-flags";
6
10
  //#region src/technospam/TechnoSpamRoutes.tsx
7
- var l = n(() => import("./pages/DashboardDashboardPagePage.js").then((e) => ({ default: e.DashboardDashboardPagePage }))), u = n(() => import("./pages/CoursesCoursesPagePage.js").then((e) => ({ default: e.CoursesCoursesPagePage }))), d = n(() => import("./pages/CoursesCourseDetailsPagePage.js").then((e) => ({ default: e.CoursesCourseDetailsPagePage }))), f = n(() => import("./pages/CoursesMyLearningPagePage.js").then((e) => ({ default: e.CoursesMyLearningPagePage }))), p = n(() => import("./pages/ApplicationsProblemsPagePage.js").then((e) => ({ default: e.ApplicationsProblemsPagePage }))), m = n(() => import("./pages/ApplicationsProblemDetailsPagePage.js").then((e) => ({ default: e.ApplicationsProblemDetailsPagePage }))), h = n(() => import("./pages/MentorshipMentorsPagePage.js").then((e) => ({ default: e.MentorshipMentorsPagePage }))), g = n(() => import("./pages/MentorshipMentorProfilePagePage.js").then((e) => ({ default: e.MentorshipMentorProfilePagePage }))), _ = n(() => import("./pages/MentorshipSessionsPagePage.js").then((e) => ({ default: e.MentorshipSessionsPagePage }))), v = n(() => import("./pages/HackathonsHackathonsPagePage.js").then((e) => ({ default: e.HackathonsHackathonsPagePage }))), y = n(() => import("./pages/HackathonsHackathonDetailsPagePage.js").then((e) => ({ default: e.HackathonsHackathonDetailsPagePage }))), b = n(() => import("./pages/AnalyticsAnalyticsPagePage.js").then((e) => ({ default: e.AnalyticsAnalyticsPagePage }))), x = n(() => import("./pages/AdminAdminDashboardPagePage.js").then((e) => ({ default: e.AdminAdminDashboardPagePage })));
8
- function S() {
9
- return /* @__PURE__ */ s("div", {
11
+ var h = i(() => import("./pages/DashboardDashboardPagePage.js").then((e) => ({ default: e.DashboardDashboardPagePage }))), g = i(() => import("./pages/CoursesCoursesPagePage.js").then((e) => ({ default: e.CoursesCoursesPagePage }))), _ = i(() => import("./pages/CoursesCourseDetailsPagePage.js").then((e) => ({ default: e.CoursesCourseDetailsPagePage }))), v = i(() => import("./pages/CoursesMyLearningPagePage.js").then((e) => ({ default: e.CoursesMyLearningPagePage }))), y = i(() => import("./pages/ApplicationsProblemsPagePage.js").then((e) => ({ default: e.ApplicationsProblemsPagePage }))), b = i(() => import("./pages/ApplicationsProblemDetailsPagePage.js").then((e) => ({ default: e.ApplicationsProblemDetailsPagePage }))), x = i(() => import("./pages/MentorshipMentorsPagePage.js").then((e) => ({ default: e.MentorshipMentorsPagePage }))), S = i(() => import("./pages/MentorshipMentorProfilePagePage.js").then((e) => ({ default: e.MentorshipMentorProfilePagePage }))), C = i(() => import("./pages/MentorshipSessionsPagePage.js").then((e) => ({ default: e.MentorshipSessionsPagePage }))), w = i(() => import("./pages/HackathonsHackathonsPagePage.js").then((e) => ({ default: e.HackathonsHackathonsPagePage }))), T = i(() => import("./pages/HackathonsHackathonDetailsPagePage.js").then((e) => ({ default: e.HackathonsHackathonDetailsPagePage }))), E = i(() => import("./pages/AnalyticsAnalyticsPagePage.js").then((e) => ({ default: e.AnalyticsAnalyticsPagePage }))), D = i(() => import("./pages/AdminAdminDashboardPagePage.js").then((e) => ({ default: e.AdminAdminDashboardPagePage })));
12
+ function O() {
13
+ return /* @__PURE__ */ f("div", {
10
14
  className: "flex h-full min-h-[40vh] items-center justify-center",
11
- children: /* @__PURE__ */ s(r, {
15
+ children: /* @__PURE__ */ f(o, {
12
16
  className: "animate-spin text-text-muted",
13
17
  size: 28
14
18
  })
15
19
  });
16
20
  }
17
- function C() {
18
- return /* @__PURE__ */ s(t, {
19
- fallback: /* @__PURE__ */ s(S, {}),
20
- children: /* @__PURE__ */ c(o, { children: [
21
- /* @__PURE__ */ s(a, {
21
+ function k() {
22
+ return /* @__PURE__ */ f("div", {
23
+ className: "flex h-full min-h-[40vh] items-center justify-center p-6",
24
+ children: /* @__PURE__ */ f(t, {
25
+ icon: /* @__PURE__ */ f(s, { size: 28 }),
26
+ title: "Feature not available",
27
+ description: "This TechnoSpam feature is currently disabled for your workspace."
28
+ })
29
+ });
30
+ }
31
+ function A(e, t) {
32
+ return /* @__PURE__ */ f(m, {
33
+ flag: e,
34
+ defaultValue: !0,
35
+ fallback: /* @__PURE__ */ f(k, {}),
36
+ children: t
37
+ });
38
+ }
39
+ function j() {
40
+ let { pathname: t } = d();
41
+ e(a(() => t.includes("/courses/course-details") ? "course-details" : t.includes("/courses/my-learning") ? "my-learning" : t.includes("/courses") ? "courses" : t.includes("/applications/problem-details") ? "problem-details" : t.includes("/applications") ? "problems" : t.includes("/mentorship/mentor-profile") ? "mentor-profile" : t.includes("/mentorship/sessions") ? "sessions" : t.includes("/mentorship") ? "mentors" : t.includes("/hackathons/hackathon-details") ? "hackathon-details" : t.includes("/hackathons") ? "hackathons" : t.includes("/analytics") ? "analytics" : t.includes("/admin") ? "admin" : "dashboard", [t]));
42
+ }
43
+ function M() {
44
+ return j(), /* @__PURE__ */ f(r, {
45
+ fallback: /* @__PURE__ */ f(O, {}),
46
+ children: /* @__PURE__ */ p(u, { children: [
47
+ /* @__PURE__ */ f(l, {
22
48
  index: !0,
23
- element: /* @__PURE__ */ s(e, {})
49
+ element: A("technospam.dashboard", /* @__PURE__ */ f(n, {}))
24
50
  }),
25
- /* @__PURE__ */ s(a, {
51
+ /* @__PURE__ */ f(l, {
26
52
  path: "dashboard/dashboard-page",
27
- element: /* @__PURE__ */ s(l, {})
53
+ element: A("technospam.dashboard", /* @__PURE__ */ f(h, {}))
28
54
  }),
29
- /* @__PURE__ */ s(a, {
55
+ /* @__PURE__ */ f(l, {
30
56
  path: "courses/courses-page",
31
- element: /* @__PURE__ */ s(u, {})
57
+ element: A("technospam.courses", /* @__PURE__ */ f(g, {}))
32
58
  }),
33
- /* @__PURE__ */ s(a, {
59
+ /* @__PURE__ */ f(l, {
34
60
  path: "courses/course-details-page",
35
- element: /* @__PURE__ */ s(d, {})
61
+ element: A("technospam.courses", /* @__PURE__ */ f(_, {}))
36
62
  }),
37
- /* @__PURE__ */ s(a, {
63
+ /* @__PURE__ */ f(l, {
38
64
  path: "courses/my-learning-page",
39
- element: /* @__PURE__ */ s(f, {})
65
+ element: A("technospam.courses", /* @__PURE__ */ f(v, {}))
40
66
  }),
41
- /* @__PURE__ */ s(a, {
67
+ /* @__PURE__ */ f(l, {
42
68
  path: "courses/instructors-page",
43
- element: /* @__PURE__ */ s(i, {
69
+ element: /* @__PURE__ */ f(c, {
44
70
  to: "../courses/courses-page",
45
71
  replace: !0
46
72
  })
47
73
  }),
48
- /* @__PURE__ */ s(a, {
74
+ /* @__PURE__ */ f(l, {
49
75
  path: "courses/instructor-profile-page",
50
- element: /* @__PURE__ */ s(i, {
76
+ element: /* @__PURE__ */ f(c, {
51
77
  to: "../courses/courses-page",
52
78
  replace: !0
53
79
  })
54
80
  }),
55
- /* @__PURE__ */ s(a, {
81
+ /* @__PURE__ */ f(l, {
56
82
  path: "applications/problems-page",
57
- element: /* @__PURE__ */ s(p, {})
83
+ element: A("technospam.problems", /* @__PURE__ */ f(y, {}))
58
84
  }),
59
- /* @__PURE__ */ s(a, {
85
+ /* @__PURE__ */ f(l, {
60
86
  path: "applications/problem-details-page",
61
- element: /* @__PURE__ */ s(m, {})
87
+ element: A("technospam.problems", /* @__PURE__ */ f(b, {}))
62
88
  }),
63
- /* @__PURE__ */ s(a, {
89
+ /* @__PURE__ */ f(l, {
64
90
  path: "applications/solutions-page",
65
- element: /* @__PURE__ */ s(i, {
91
+ element: /* @__PURE__ */ f(c, {
66
92
  to: "../applications/problems-page",
67
93
  replace: !0
68
94
  })
69
95
  }),
70
- /* @__PURE__ */ s(a, {
96
+ /* @__PURE__ */ f(l, {
71
97
  path: "applications/portfolio-page",
72
- element: /* @__PURE__ */ s(i, {
98
+ element: /* @__PURE__ */ f(c, {
73
99
  to: "../applications/problems-page",
74
100
  replace: !0
75
101
  })
76
102
  }),
77
- /* @__PURE__ */ s(a, {
103
+ /* @__PURE__ */ f(l, {
78
104
  path: "mentorship/mentors-page",
79
- element: /* @__PURE__ */ s(h, {})
105
+ element: A("technospam.mentorship", /* @__PURE__ */ f(x, {}))
80
106
  }),
81
- /* @__PURE__ */ s(a, {
107
+ /* @__PURE__ */ f(l, {
82
108
  path: "mentorship/mentor-profile-page",
83
- element: /* @__PURE__ */ s(g, {})
109
+ element: A("technospam.mentorship", /* @__PURE__ */ f(S, {}))
84
110
  }),
85
- /* @__PURE__ */ s(a, {
111
+ /* @__PURE__ */ f(l, {
86
112
  path: "mentorship/sessions-page",
87
- element: /* @__PURE__ */ s(_, {})
113
+ element: A("technospam.mentorship", /* @__PURE__ */ f(C, {}))
88
114
  }),
89
- /* @__PURE__ */ s(a, {
115
+ /* @__PURE__ */ f(l, {
90
116
  path: "mentorship/mentorship-page",
91
- element: /* @__PURE__ */ s(i, {
117
+ element: /* @__PURE__ */ f(c, {
92
118
  to: "../mentorship/mentors-page",
93
119
  replace: !0
94
120
  })
95
121
  }),
96
- /* @__PURE__ */ s(a, {
122
+ /* @__PURE__ */ f(l, {
97
123
  path: "mentorship/bookings-page",
98
- element: /* @__PURE__ */ s(i, {
124
+ element: /* @__PURE__ */ f(c, {
99
125
  to: "../mentorship/sessions-page",
100
126
  replace: !0
101
127
  })
102
128
  }),
103
- /* @__PURE__ */ s(a, {
129
+ /* @__PURE__ */ f(l, {
104
130
  path: "hackathons/hackathons-page",
105
- element: /* @__PURE__ */ s(v, {})
131
+ element: A("technospam.hackathons", /* @__PURE__ */ f(w, {}))
106
132
  }),
107
- /* @__PURE__ */ s(a, {
133
+ /* @__PURE__ */ f(l, {
108
134
  path: "hackathons/hackathon-details-page",
109
- element: /* @__PURE__ */ s(y, {})
135
+ element: A("technospam.hackathons", /* @__PURE__ */ f(T, {}))
110
136
  }),
111
- /* @__PURE__ */ s(a, {
137
+ /* @__PURE__ */ f(l, {
112
138
  path: "hackathons/events-page",
113
- element: /* @__PURE__ */ s(i, {
139
+ element: /* @__PURE__ */ f(c, {
114
140
  to: "../hackathons/hackathons-page",
115
141
  replace: !0
116
142
  })
117
143
  }),
118
- /* @__PURE__ */ s(a, {
144
+ /* @__PURE__ */ f(l, {
119
145
  path: "hackathons/teams-page",
120
- element: /* @__PURE__ */ s(i, {
146
+ element: /* @__PURE__ */ f(c, {
121
147
  to: "../hackathons/hackathons-page",
122
148
  replace: !0
123
149
  })
124
150
  }),
125
- /* @__PURE__ */ s(a, {
151
+ /* @__PURE__ */ f(l, {
126
152
  path: "analytics/analytics-page",
127
- element: /* @__PURE__ */ s(b, {})
153
+ element: A("technospam.analytics", /* @__PURE__ */ f(E, {}))
128
154
  }),
129
- /* @__PURE__ */ s(a, {
155
+ /* @__PURE__ */ f(l, {
130
156
  path: "analytics/progress-page",
131
- element: /* @__PURE__ */ s(i, {
157
+ element: /* @__PURE__ */ f(c, {
132
158
  to: "../analytics/analytics-page",
133
159
  replace: !0
134
160
  })
135
161
  }),
136
- /* @__PURE__ */ s(a, {
162
+ /* @__PURE__ */ f(l, {
137
163
  path: "analytics/achievements-page",
138
- element: /* @__PURE__ */ s(i, {
164
+ element: /* @__PURE__ */ f(c, {
139
165
  to: "../analytics/analytics-page",
140
166
  replace: !0
141
167
  })
142
168
  }),
143
- /* @__PURE__ */ s(a, {
169
+ /* @__PURE__ */ f(l, {
144
170
  path: "analytics/reports-page",
145
- element: /* @__PURE__ */ s(i, {
171
+ element: /* @__PURE__ */ f(c, {
146
172
  to: "../analytics/analytics-page",
147
173
  replace: !0
148
174
  })
149
175
  }),
150
- /* @__PURE__ */ s(a, {
176
+ /* @__PURE__ */ f(l, {
151
177
  path: "admin/admin-dashboard-page",
152
- element: /* @__PURE__ */ s(x, {})
178
+ element: A("technospam.admin", /* @__PURE__ */ f(D, {}))
153
179
  }),
154
- /* @__PURE__ */ s(a, {
180
+ /* @__PURE__ */ f(l, {
155
181
  path: "admin/audit-reports-page",
156
- element: /* @__PURE__ */ s(i, {
182
+ element: /* @__PURE__ */ f(c, {
157
183
  to: "../admin/admin-dashboard-page",
158
184
  replace: !0
159
185
  })
160
186
  }),
161
- /* @__PURE__ */ s(a, {
187
+ /* @__PURE__ */ f(l, {
162
188
  path: "study-planner/*",
163
- element: /* @__PURE__ */ s(i, {
189
+ element: /* @__PURE__ */ f(c, {
164
190
  to: "../dashboard/dashboard-page",
165
191
  replace: !0
166
192
  })
167
193
  }),
168
- /* @__PURE__ */ s(a, {
194
+ /* @__PURE__ */ f(l, {
169
195
  path: "open-source/*",
170
- element: /* @__PURE__ */ s(i, {
196
+ element: /* @__PURE__ */ f(c, {
171
197
  to: "../dashboard/dashboard-page",
172
198
  replace: !0
173
199
  })
174
200
  }),
175
- /* @__PURE__ */ s(a, {
201
+ /* @__PURE__ */ f(l, {
176
202
  path: "knowledge-base/*",
177
- element: /* @__PURE__ */ s(i, {
203
+ element: /* @__PURE__ */ f(c, {
178
204
  to: "../dashboard/dashboard-page",
179
205
  replace: !0
180
206
  })
181
207
  }),
182
- /* @__PURE__ */ s(a, {
208
+ /* @__PURE__ */ f(l, {
183
209
  path: "*",
184
- element: /* @__PURE__ */ s(i, {
210
+ element: /* @__PURE__ */ f(c, {
185
211
  to: "../dashboard/dashboard-page",
186
212
  replace: !0
187
213
  })
@@ -190,6 +216,6 @@ function C() {
190
216
  });
191
217
  }
192
218
  //#endregion
193
- export { C as TechnoSpamRoutes };
219
+ export { M as TechnoSpamRoutes };
194
220
 
195
221
  //# sourceMappingURL=TechnoSpamRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TechnoSpamRoutes.js","names":[],"sources":["../../src/technospam/TechnoSpamRoutes.tsx"],"sourcesContent":["import { lazy, Suspense } from 'react';\nimport { Navigate, Route, Routes } from 'react-router-dom';\nimport { Loader2 } from 'lucide-react';\n\n/**\n * TechnoSpam routes — every page is backed by the real wspace-technospam-svc\n * (Tec* fields). Modules with no backend (study planner, open source, knowledge\n * base, portfolio, standalone instructors, extra analytics/admin sub-pages) were\n * removed during the backend-reconciliation rebuild; their old paths redirect to\n * the nearest live page so stale links never 404.\n */\n\nimport { DashboardDashboardPagePage as IndexPage } from './pages/DashboardDashboardPagePage';\n\nconst DashboardDashboardPagePage = lazy(() =>\n import('./pages/DashboardDashboardPagePage').then((m) => ({\n default: m.DashboardDashboardPagePage,\n }))\n);\nconst CoursesCoursesPagePage = lazy(() =>\n import('./pages/CoursesCoursesPagePage').then((m) => ({ default: m.CoursesCoursesPagePage }))\n);\nconst CoursesCourseDetailsPagePage = lazy(() =>\n import('./pages/CoursesCourseDetailsPagePage').then((m) => ({\n default: m.CoursesCourseDetailsPagePage,\n }))\n);\nconst CoursesMyLearningPagePage = lazy(() =>\n import('./pages/CoursesMyLearningPagePage').then((m) => ({\n default: m.CoursesMyLearningPagePage,\n }))\n);\nconst ApplicationsProblemsPagePage = lazy(() =>\n import('./pages/ApplicationsProblemsPagePage').then((m) => ({\n default: m.ApplicationsProblemsPagePage,\n }))\n);\nconst ApplicationsProblemDetailsPagePage = lazy(() =>\n import('./pages/ApplicationsProblemDetailsPagePage').then((m) => ({\n default: m.ApplicationsProblemDetailsPagePage,\n }))\n);\nconst MentorshipMentorsPagePage = lazy(() =>\n import('./pages/MentorshipMentorsPagePage').then((m) => ({\n default: m.MentorshipMentorsPagePage,\n }))\n);\nconst MentorshipMentorProfilePagePage = lazy(() =>\n import('./pages/MentorshipMentorProfilePagePage').then((m) => ({\n default: m.MentorshipMentorProfilePagePage,\n }))\n);\nconst MentorshipSessionsPagePage = lazy(() =>\n import('./pages/MentorshipSessionsPagePage').then((m) => ({\n default: m.MentorshipSessionsPagePage,\n }))\n);\nconst HackathonsHackathonsPagePage = lazy(() =>\n import('./pages/HackathonsHackathonsPagePage').then((m) => ({\n default: m.HackathonsHackathonsPagePage,\n }))\n);\nconst HackathonsHackathonDetailsPagePage = lazy(() =>\n import('./pages/HackathonsHackathonDetailsPagePage').then((m) => ({\n default: m.HackathonsHackathonDetailsPagePage,\n }))\n);\nconst AnalyticsAnalyticsPagePage = lazy(() =>\n import('./pages/AnalyticsAnalyticsPagePage').then((m) => ({\n default: m.AnalyticsAnalyticsPagePage,\n }))\n);\nconst AdminAdminDashboardPagePage = lazy(() =>\n import('./pages/AdminAdminDashboardPagePage').then((m) => ({\n default: m.AdminAdminDashboardPagePage,\n }))\n);\n\nfunction PageLoader() {\n return (\n <div className=\"flex h-full min-h-[40vh] items-center justify-center\">\n <Loader2 className=\"animate-spin text-text-muted\" size={28} />\n </div>\n );\n}\n\nexport function TechnoSpamRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={<IndexPage />} />\n <Route path=\"dashboard/dashboard-page\" element={<DashboardDashboardPagePage />} />\n\n {/* Courses */}\n <Route path=\"courses/courses-page\" element={<CoursesCoursesPagePage />} />\n <Route path=\"courses/course-details-page\" element={<CoursesCourseDetailsPagePage />} />\n <Route path=\"courses/my-learning-page\" element={<CoursesMyLearningPagePage />} />\n <Route\n path=\"courses/instructors-page\"\n element={<Navigate to=\"../courses/courses-page\" replace />}\n />\n <Route\n path=\"courses/instructor-profile-page\"\n element={<Navigate to=\"../courses/courses-page\" replace />}\n />\n\n {/* Practice (applications) */}\n <Route path=\"applications/problems-page\" element={<ApplicationsProblemsPagePage />} />\n <Route\n path=\"applications/problem-details-page\"\n element={<ApplicationsProblemDetailsPagePage />}\n />\n <Route\n path=\"applications/solutions-page\"\n element={<Navigate to=\"../applications/problems-page\" replace />}\n />\n <Route\n path=\"applications/portfolio-page\"\n element={<Navigate to=\"../applications/problems-page\" replace />}\n />\n\n {/* Mentorship */}\n <Route path=\"mentorship/mentors-page\" element={<MentorshipMentorsPagePage />} />\n <Route\n path=\"mentorship/mentor-profile-page\"\n element={<MentorshipMentorProfilePagePage />}\n />\n <Route path=\"mentorship/sessions-page\" element={<MentorshipSessionsPagePage />} />\n <Route\n path=\"mentorship/mentorship-page\"\n element={<Navigate to=\"../mentorship/mentors-page\" replace />}\n />\n <Route\n path=\"mentorship/bookings-page\"\n element={<Navigate to=\"../mentorship/sessions-page\" replace />}\n />\n\n {/* Hackathons */}\n <Route path=\"hackathons/hackathons-page\" element={<HackathonsHackathonsPagePage />} />\n <Route\n path=\"hackathons/hackathon-details-page\"\n element={<HackathonsHackathonDetailsPagePage />}\n />\n <Route\n path=\"hackathons/events-page\"\n element={<Navigate to=\"../hackathons/hackathons-page\" replace />}\n />\n <Route\n path=\"hackathons/teams-page\"\n element={<Navigate to=\"../hackathons/hackathons-page\" replace />}\n />\n\n {/* Analytics */}\n <Route path=\"analytics/analytics-page\" element={<AnalyticsAnalyticsPagePage />} />\n <Route\n path=\"analytics/progress-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n <Route\n path=\"analytics/achievements-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n <Route\n path=\"analytics/reports-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n\n {/* Admin */}\n <Route path=\"admin/admin-dashboard-page\" element={<AdminAdminDashboardPagePage />} />\n <Route\n path=\"admin/audit-reports-page\"\n element={<Navigate to=\"../admin/admin-dashboard-page\" replace />}\n />\n\n {/* Removed modules → dashboard */}\n <Route\n path=\"study-planner/*\"\n element={<Navigate to=\"../dashboard/dashboard-page\" replace />}\n />\n <Route\n path=\"open-source/*\"\n element={<Navigate to=\"../dashboard/dashboard-page\" replace />}\n />\n <Route\n path=\"knowledge-base/*\"\n element={<Navigate to=\"../dashboard/dashboard-page\" replace />}\n />\n\n <Route path=\"*\" element={<Navigate to=\"../dashboard/dashboard-page\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TechnoSpamRoutes.js","names":[],"sources":["../../src/technospam/TechnoSpamRoutes.tsx"],"sourcesContent":["import { lazy, Suspense, useMemo } from 'react';\nimport { Navigate, Route, Routes, useLocation } from 'react-router-dom';\nimport { Loader2, ShieldAlert } from 'lucide-react';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useTechnoSpamPageView } from './hooks/useTechnoSpamPageView';\nimport { EmptyView } from './components';\n\n/**\n * TechnoSpam routes — every page is backed by the real wspace-technospam-svc\n * (Tec* fields). Modules with no backend (study planner, open source, knowledge\n * base, portfolio, standalone instructors, extra analytics/admin sub-pages) were\n * removed during the backend-reconciliation rebuild; their old paths redirect to\n * the nearest live page so stale links never 404.\n */\n\nimport { DashboardDashboardPagePage as IndexPage } from './pages/DashboardDashboardPagePage';\n\nconst DashboardDashboardPagePage = lazy(() =>\n import('./pages/DashboardDashboardPagePage').then((m) => ({\n default: m.DashboardDashboardPagePage,\n }))\n);\nconst CoursesCoursesPagePage = lazy(() =>\n import('./pages/CoursesCoursesPagePage').then((m) => ({ default: m.CoursesCoursesPagePage }))\n);\nconst CoursesCourseDetailsPagePage = lazy(() =>\n import('./pages/CoursesCourseDetailsPagePage').then((m) => ({\n default: m.CoursesCourseDetailsPagePage,\n }))\n);\nconst CoursesMyLearningPagePage = lazy(() =>\n import('./pages/CoursesMyLearningPagePage').then((m) => ({\n default: m.CoursesMyLearningPagePage,\n }))\n);\nconst ApplicationsProblemsPagePage = lazy(() =>\n import('./pages/ApplicationsProblemsPagePage').then((m) => ({\n default: m.ApplicationsProblemsPagePage,\n }))\n);\nconst ApplicationsProblemDetailsPagePage = lazy(() =>\n import('./pages/ApplicationsProblemDetailsPagePage').then((m) => ({\n default: m.ApplicationsProblemDetailsPagePage,\n }))\n);\nconst MentorshipMentorsPagePage = lazy(() =>\n import('./pages/MentorshipMentorsPagePage').then((m) => ({\n default: m.MentorshipMentorsPagePage,\n }))\n);\nconst MentorshipMentorProfilePagePage = lazy(() =>\n import('./pages/MentorshipMentorProfilePagePage').then((m) => ({\n default: m.MentorshipMentorProfilePagePage,\n }))\n);\nconst MentorshipSessionsPagePage = lazy(() =>\n import('./pages/MentorshipSessionsPagePage').then((m) => ({\n default: m.MentorshipSessionsPagePage,\n }))\n);\nconst HackathonsHackathonsPagePage = lazy(() =>\n import('./pages/HackathonsHackathonsPagePage').then((m) => ({\n default: m.HackathonsHackathonsPagePage,\n }))\n);\nconst HackathonsHackathonDetailsPagePage = lazy(() =>\n import('./pages/HackathonsHackathonDetailsPagePage').then((m) => ({\n default: m.HackathonsHackathonDetailsPagePage,\n }))\n);\nconst AnalyticsAnalyticsPagePage = lazy(() =>\n import('./pages/AnalyticsAnalyticsPagePage').then((m) => ({\n default: m.AnalyticsAnalyticsPagePage,\n }))\n);\nconst AdminAdminDashboardPagePage = lazy(() =>\n import('./pages/AdminAdminDashboardPagePage').then((m) => ({\n default: m.AdminAdminDashboardPagePage,\n }))\n);\n\nfunction PageLoader() {\n return (\n <div className=\"flex h-full min-h-[40vh] items-center justify-center\">\n <Loader2 className=\"animate-spin text-text-muted\" size={28} />\n </div>\n );\n}\n\nfunction FeatureDisabledFallback() {\n return (\n <div className=\"flex h-full min-h-[40vh] items-center justify-center p-6\">\n <EmptyView\n icon={<ShieldAlert size={28} />}\n title=\"Feature not available\"\n description=\"This TechnoSpam feature is currently disabled for your workspace.\"\n />\n </div>\n );\n}\n\nfunction gated(flag: string, element: React.ReactNode): React.ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={true} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nfunction useTrackedPageView() {\n const { pathname } = useLocation();\n const page = useMemo(() => {\n if (pathname.includes('/courses/course-details')) return 'course-details';\n if (pathname.includes('/courses/my-learning')) return 'my-learning';\n if (pathname.includes('/courses')) return 'courses';\n if (pathname.includes('/applications/problem-details')) return 'problem-details';\n if (pathname.includes('/applications')) return 'problems';\n if (pathname.includes('/mentorship/mentor-profile')) return 'mentor-profile';\n if (pathname.includes('/mentorship/sessions')) return 'sessions';\n if (pathname.includes('/mentorship')) return 'mentors';\n if (pathname.includes('/hackathons/hackathon-details')) return 'hackathon-details';\n if (pathname.includes('/hackathons')) return 'hackathons';\n if (pathname.includes('/analytics')) return 'analytics';\n if (pathname.includes('/admin')) return 'admin';\n return 'dashboard';\n }, [pathname]);\n useTechnoSpamPageView(page);\n}\n\nexport function TechnoSpamRoutes() {\n useTrackedPageView();\n return (\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={gated('technospam.dashboard', <IndexPage />)} />\n <Route\n path=\"dashboard/dashboard-page\"\n element={gated('technospam.dashboard', <DashboardDashboardPagePage />)}\n />\n\n {/* Courses */}\n <Route\n path=\"courses/courses-page\"\n element={gated('technospam.courses', <CoursesCoursesPagePage />)}\n />\n <Route\n path=\"courses/course-details-page\"\n element={gated('technospam.courses', <CoursesCourseDetailsPagePage />)}\n />\n <Route\n path=\"courses/my-learning-page\"\n element={gated('technospam.courses', <CoursesMyLearningPagePage />)}\n />\n <Route\n path=\"courses/instructors-page\"\n element={<Navigate to=\"../courses/courses-page\" replace />}\n />\n <Route\n path=\"courses/instructor-profile-page\"\n element={<Navigate to=\"../courses/courses-page\" replace />}\n />\n\n {/* Practice (applications) */}\n <Route\n path=\"applications/problems-page\"\n element={gated('technospam.problems', <ApplicationsProblemsPagePage />)}\n />\n <Route\n path=\"applications/problem-details-page\"\n element={gated('technospam.problems', <ApplicationsProblemDetailsPagePage />)}\n />\n <Route\n path=\"applications/solutions-page\"\n element={<Navigate to=\"../applications/problems-page\" replace />}\n />\n <Route\n path=\"applications/portfolio-page\"\n element={<Navigate to=\"../applications/problems-page\" replace />}\n />\n\n {/* Mentorship */}\n <Route\n path=\"mentorship/mentors-page\"\n element={gated('technospam.mentorship', <MentorshipMentorsPagePage />)}\n />\n <Route\n path=\"mentorship/mentor-profile-page\"\n element={gated('technospam.mentorship', <MentorshipMentorProfilePagePage />)}\n />\n <Route\n path=\"mentorship/sessions-page\"\n element={gated('technospam.mentorship', <MentorshipSessionsPagePage />)}\n />\n <Route\n path=\"mentorship/mentorship-page\"\n element={<Navigate to=\"../mentorship/mentors-page\" replace />}\n />\n <Route\n path=\"mentorship/bookings-page\"\n element={<Navigate to=\"../mentorship/sessions-page\" replace />}\n />\n\n {/* Hackathons */}\n <Route\n path=\"hackathons/hackathons-page\"\n element={gated('technospam.hackathons', <HackathonsHackathonsPagePage />)}\n />\n <Route\n path=\"hackathons/hackathon-details-page\"\n element={gated('technospam.hackathons', <HackathonsHackathonDetailsPagePage />)}\n />\n <Route\n path=\"hackathons/events-page\"\n element={<Navigate to=\"../hackathons/hackathons-page\" replace />}\n />\n <Route\n path=\"hackathons/teams-page\"\n element={<Navigate to=\"../hackathons/hackathons-page\" replace />}\n />\n\n {/* Analytics */}\n <Route\n path=\"analytics/analytics-page\"\n element={gated('technospam.analytics', <AnalyticsAnalyticsPagePage />)}\n />\n <Route\n path=\"analytics/progress-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n <Route\n path=\"analytics/achievements-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n <Route\n path=\"analytics/reports-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n\n {/* Admin */}\n <Route\n path=\"admin/admin-dashboard-page\"\n element={gated('technospam.admin', <AdminAdminDashboardPagePage />)}\n />\n <Route\n path=\"admin/audit-reports-page\"\n element={<Navigate to=\"../admin/admin-dashboard-page\" replace />}\n />\n\n {/* Removed modules → dashboard */}\n <Route\n path=\"study-planner/*\"\n element={<Navigate to=\"../dashboard/dashboard-page\" replace />}\n />\n <Route\n path=\"open-source/*\"\n element={<Navigate to=\"../dashboard/dashboard-page\" replace />}\n />\n <Route\n path=\"knowledge-base/*\"\n element={<Navigate to=\"../dashboard/dashboard-page\" replace />}\n />\n\n <Route path=\"*\" element={<Navigate to=\"../dashboard/dashboard-page\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PageLayout.d.ts","sourceRoot":"","sources":["../../../src/technospam/components/PageLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,UAAU,eAAe;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,WAAW,EACX,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,IAAY,GACb,EAAE,eAAe,+BAmCjB"}
1
+ {"version":3,"file":"PageLayout.d.ts","sourceRoot":"","sources":["../../../src/technospam/components/PageLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC,UAAU,eAAe;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,WAAW,EACX,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,IAAY,GACb,EAAE,eAAe,+BAuCjB"}
@@ -1,48 +1,51 @@
1
1
  import { useTechnoSpamNavigate as e } from "../providers/TechnoSpamProvider.js";
2
- import { cn as t } from "../utils/cn.js";
3
- import { ArrowLeft as n } from "lucide-react";
4
- import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
- import { AuroraBackground as a } from "@burdenoff/fe-libs/ui";
2
+ import { useNativeControls as t } from "../hooks/useNativeControls.js";
3
+ import { cn as n } from "../utils/cn.js";
4
+ import { ArrowLeft as r } from "lucide-react";
5
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
+ import { AuroraBackground as o } from "@burdenoff/fe-libs/ui";
6
7
  //#region src/technospam/components/PageLayout.tsx
7
- function o({ title: o, description: s, actions: c, children: l, backPath: u, hero: d = !1 }) {
8
- let f = e();
9
- return /* @__PURE__ */ i("div", {
8
+ function s({ title: s, description: c, actions: l, children: u, backPath: d, hero: f = !1 }) {
9
+ let p = e(), { impact: m } = t();
10
+ return /* @__PURE__ */ a("div", {
10
11
  className: "flex h-full flex-col bg-bg-surface",
11
- children: [/* @__PURE__ */ i("div", {
12
- className: t("relative flex flex-col gap-4 overflow-hidden border-b border-border-seam px-6 py-5 sm:flex-row sm:items-start sm:justify-between", d ? "bg-accent-primary/12" : "bg-bg-surface"),
12
+ children: [/* @__PURE__ */ a("div", {
13
+ className: n("relative flex flex-col gap-4 overflow-hidden border-b border-border-seam px-6 py-5 sm:flex-row sm:items-start sm:justify-between", f ? "bg-accent-primary/12" : "bg-bg-surface"),
13
14
  children: [
14
- d ? /* @__PURE__ */ r(a, { intensity: "subtle" }) : null,
15
- /* @__PURE__ */ i("div", {
15
+ f ? /* @__PURE__ */ i(o, { intensity: "subtle" }) : null,
16
+ /* @__PURE__ */ a("div", {
16
17
  className: "relative flex min-w-0 flex-col gap-1",
17
18
  children: [
18
- u ? /* @__PURE__ */ i("button", {
19
+ d ? /* @__PURE__ */ a("button", {
19
20
  type: "button",
20
- onClick: () => f(u),
21
+ onClick: () => {
22
+ m("light"), p(d);
23
+ },
21
24
  className: "flex w-fit items-center gap-1 text-sm text-text-secondary transition-colors hover:text-text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]",
22
- children: [/* @__PURE__ */ r(n, { size: 15 }), "Back"]
25
+ children: [/* @__PURE__ */ i(r, { size: 15 }), "Back"]
23
26
  }) : null,
24
- /* @__PURE__ */ r("h1", {
27
+ /* @__PURE__ */ i("h1", {
25
28
  className: "truncate text-xl font-semibold text-text-primary sm:text-2xl",
26
- children: o
29
+ children: s
27
30
  }),
28
- s ? /* @__PURE__ */ r("p", {
31
+ c ? /* @__PURE__ */ i("p", {
29
32
  className: "max-w-2xl text-sm text-text-secondary",
30
- children: s
33
+ children: c
31
34
  }) : null
32
35
  ]
33
36
  }),
34
- c ? /* @__PURE__ */ r("div", {
37
+ l ? /* @__PURE__ */ i("div", {
35
38
  className: "relative flex flex-wrap items-center gap-2",
36
- children: c
39
+ children: l
37
40
  }) : null
38
41
  ]
39
- }), /* @__PURE__ */ r("div", {
42
+ }), /* @__PURE__ */ i("div", {
40
43
  className: "flex-1 overflow-y-auto p-6",
41
- children: l
44
+ children: u
42
45
  })]
43
46
  });
44
47
  }
45
48
  //#endregion
46
- export { o as PageLayout };
49
+ export { s as PageLayout };
47
50
 
48
51
  //# sourceMappingURL=PageLayout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/technospam/components/PageLayout.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { ArrowLeft } from 'lucide-react';\nimport { AuroraBackground } from '@burdenoff/fe-libs/ui';\nimport { useTechnoSpamNavigate } from '../providers/TechnoSpamProvider';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n backPath?: string;\n /** Render the page header with the living-glass aurora backdrop (module hero). */\n hero?: boolean;\n}\n\n/**\n * Consistent page chrome for every TechnoSpam module page: a header band\n * (optionally with the aurora hero backdrop), an optional back affordance, an\n * actions slot, and a scrollable body. Mirrors the platform page pattern so\n * TechnoSpam feels native to the shell.\n */\nexport function PageLayout({\n title,\n description,\n actions,\n children,\n backPath,\n hero = false,\n}: PageLayoutProps) {\n const navigate = useTechnoSpamNavigate();\n\n return (\n <div className=\"flex h-full flex-col bg-bg-surface\">\n <div\n className={cn(\n 'relative flex flex-col gap-4 overflow-hidden border-b border-border-seam px-6 py-5 sm:flex-row sm:items-start sm:justify-between',\n hero ? 'bg-accent-primary/12' : 'bg-bg-surface'\n )}\n >\n {hero ? <AuroraBackground intensity=\"subtle\" /> : null}\n <div className=\"relative flex min-w-0 flex-col gap-1\">\n {backPath ? (\n <button\n type=\"button\"\n onClick={() => navigate(backPath)}\n className=\"flex w-fit items-center gap-1 text-sm text-text-secondary transition-colors hover:text-text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <ArrowLeft size={15} />\n Back\n </button>\n ) : null}\n <h1 className=\"truncate text-xl font-semibold text-text-primary sm:text-2xl\">{title}</h1>\n {description ? (\n <p className=\"max-w-2xl text-sm text-text-secondary\">{description}</p>\n ) : null}\n </div>\n {actions ? (\n <div className=\"relative flex flex-wrap items-center gap-2\">{actions}</div>\n ) : null}\n </div>\n <div className=\"flex-1 overflow-y-auto p-6\">{children}</div>\n </div>\n );\n}\n"],"mappings":";;;;;;AAsBA,SAAgB,EAAW,EACzB,UACA,gBACA,YACA,aACA,aACA,UAAO,MACW;CAClB,IAAM,IAAW,GAAuB;AAExC,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GACE,WAAW,EACT,oIACA,IAAO,yBAAyB,gBACjC;aAJH;IAMG,IAAO,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA,GAAG;IAClD,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,IACC,kBAAC,UAAD;OACE,MAAK;OACL,eAAe,EAAS,EAAS;OACjC,WAAU;iBAHZ,CAKE,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA,EAAA,OAEhB;WACP;MACJ,kBAAC,MAAD;OAAI,WAAU;iBAAgE;OAAW,CAAA;MACxF,IACC,kBAAC,KAAD;OAAG,WAAU;iBAAyC;OAAgB,CAAA,GACpE;MACA;;IACL,IACC,kBAAC,OAAD;KAAK,WAAU;eAA8C;KAAc,CAAA,GACzE;IACA;MACN,kBAAC,OAAD;GAAK,WAAU;GAA8B;GAAe,CAAA,CACxD"}
1
+ {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/technospam/components/PageLayout.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { ArrowLeft } from 'lucide-react';\nimport { AuroraBackground } from '@burdenoff/fe-libs/ui';\nimport { useTechnoSpamNavigate } from '../providers/TechnoSpamProvider';\nimport { useNativeControls } from '../hooks/useNativeControls';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n backPath?: string;\n /** Render the page header with the living-glass aurora backdrop (module hero). */\n hero?: boolean;\n}\n\n/**\n * Consistent page chrome for every TechnoSpam module page: a header band\n * (optionally with the aurora hero backdrop), an optional back affordance, an\n * actions slot, and a scrollable body. Mirrors the platform page pattern so\n * TechnoSpam feels native to the shell.\n */\nexport function PageLayout({\n title,\n description,\n actions,\n children,\n backPath,\n hero = false,\n}: PageLayoutProps) {\n const navigate = useTechnoSpamNavigate();\n const { impact } = useNativeControls();\n\n return (\n <div className=\"flex h-full flex-col bg-bg-surface\">\n <div\n className={cn(\n 'relative flex flex-col gap-4 overflow-hidden border-b border-border-seam px-6 py-5 sm:flex-row sm:items-start sm:justify-between',\n hero ? 'bg-accent-primary/12' : 'bg-bg-surface'\n )}\n >\n {hero ? <AuroraBackground intensity=\"subtle\" /> : null}\n <div className=\"relative flex min-w-0 flex-col gap-1\">\n {backPath ? (\n <button\n type=\"button\"\n onClick={() => {\n void impact('light');\n navigate(backPath);\n }}\n className=\"flex w-fit items-center gap-1 text-sm text-text-secondary transition-colors hover:text-text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <ArrowLeft size={15} />\n Back\n </button>\n ) : null}\n <h1 className=\"truncate text-xl font-semibold text-text-primary sm:text-2xl\">{title}</h1>\n {description ? (\n <p className=\"max-w-2xl text-sm text-text-secondary\">{description}</p>\n ) : null}\n </div>\n {actions ? (\n <div className=\"relative flex flex-wrap items-center gap-2\">{actions}</div>\n ) : null}\n </div>\n <div className=\"flex-1 overflow-y-auto p-6\">{children}</div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAuBA,SAAgB,EAAW,EACzB,UACA,gBACA,YACA,aACA,aACA,UAAO,MACW;CAClB,IAAM,IAAW,GAAuB,EAClC,EAAE,cAAW,GAAmB;AAEtC,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GACE,WAAW,EACT,oIACA,IAAO,yBAAyB,gBACjC;aAJH;IAMG,IAAO,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA,GAAG;IAClD,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,IACC,kBAAC,UAAD;OACE,MAAK;OACL,eAAe;AAEb,QADK,EAAO,QAAQ,EACpB,EAAS,EAAS;;OAEpB,WAAU;iBANZ,CAQE,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA,EAAA,OAEhB;WACP;MACJ,kBAAC,MAAD;OAAI,WAAU;iBAAgE;OAAW,CAAA;MACxF,IACC,kBAAC,KAAD;OAAG,WAAU;iBAAyC;OAAgB,CAAA,GACpE;MACA;;IACL,IACC,kBAAC,OAAD;KAAK,WAAU;eAA8C;KAAc,CAAA,GACzE;IACA;MACN,kBAAC,OAAD;GAAK,WAAU;GAA8B;GAAe,CAAA,CACxD"}
@@ -0,0 +1,18 @@
1
+ interface TagInputProps {
2
+ value: string[];
3
+ onChange: (tags: string[]) => void;
4
+ placeholder?: string;
5
+ className?: string;
6
+ maxTags?: number;
7
+ }
8
+ /**
9
+ * Small controlled tag input. Renders existing tags as removable chips and
10
+ * commits a new tag on Enter or when the add button is pressed.
11
+ *
12
+ * This is the TechnoSpam-local tag picker; it works with the legacy string-tag
13
+ * arrays stored on Tec* entities while the workspace-wide @burdenoff/microfe-tags
14
+ * taxonomy is being adopted product-wide.
15
+ */
16
+ export declare function TagInput({ value, onChange, placeholder, className, maxTags, }: TagInputProps): import("react").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=TagInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TagInput.d.ts","sourceRoot":"","sources":["../../../src/technospam/components/TagInput.tsx"],"names":[],"mappings":"AAKA,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,QAAQ,EACR,WAA0B,EAC1B,SAAS,EACT,OAAO,GACR,EAAE,aAAa,+BA4Df"}
@@ -0,0 +1,58 @@
1
+ import { cn as e } from "../utils/cn.js";
2
+ import { useCallback as t, useState as n } from "react";
3
+ import { Plus as r, X as i } from "lucide-react";
4
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
+ import { Button as s, Input as c } from "@burdenoff/fe-libs/ui";
6
+ //#region src/technospam/components/TagInput.tsx
7
+ function l({ value: l, onChange: u, placeholder: d = "Add a tag…", className: f, maxTags: p }) {
8
+ let [m, h] = n(""), g = t(() => {
9
+ let e = m.split(",").map((e) => e.trim()).filter(Boolean);
10
+ if (e.length === 0) return;
11
+ let t = Array.from(new Set([...l, ...e]));
12
+ u(p ? t.slice(0, p) : t), h("");
13
+ }, [
14
+ m,
15
+ l,
16
+ u,
17
+ p
18
+ ]), _ = t((e) => {
19
+ u(l.filter((t) => t !== e));
20
+ }, [l, u]);
21
+ return /* @__PURE__ */ o("div", {
22
+ className: e("space-y-2", f),
23
+ children: [/* @__PURE__ */ a("div", {
24
+ className: "flex flex-wrap items-center gap-1.5",
25
+ children: l.map((e) => /* @__PURE__ */ o("span", {
26
+ className: "inline-flex items-center gap-1 rounded-full border border-border-seam bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary",
27
+ children: [e, /* @__PURE__ */ a("button", {
28
+ type: "button",
29
+ onClick: () => _(e),
30
+ className: "rounded-full p-0.5 hover:bg-bg-surface hover:text-status-error-text focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]",
31
+ "aria-label": `Remove ${e}`,
32
+ children: /* @__PURE__ */ a(i, { size: 10 })
33
+ })]
34
+ }, e))
35
+ }), /* @__PURE__ */ o("div", {
36
+ className: "flex items-center gap-2",
37
+ children: [/* @__PURE__ */ a(c, {
38
+ value: m,
39
+ onChange: (e) => h(e.target.value),
40
+ onKeyDown: (e) => {
41
+ e.key === "Enter" && (e.preventDefault(), g());
42
+ },
43
+ placeholder: d,
44
+ className: "flex-1"
45
+ }), /* @__PURE__ */ o(s, {
46
+ type: "button",
47
+ variant: "outline",
48
+ size: "sm",
49
+ onClick: g,
50
+ children: [/* @__PURE__ */ a(r, { size: 14 }), " Add"]
51
+ })]
52
+ })]
53
+ });
54
+ }
55
+ //#endregion
56
+ export { l as TagInput };
57
+
58
+ //# sourceMappingURL=TagInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TagInput.js","names":[],"sources":["../../../src/technospam/components/TagInput.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { X, Plus } from 'lucide-react';\nimport { Input, Button } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface TagInputProps {\n value: string[];\n onChange: (tags: string[]) => void;\n placeholder?: string;\n className?: string;\n maxTags?: number;\n}\n\n/**\n * Small controlled tag input. Renders existing tags as removable chips and\n * commits a new tag on Enter or when the add button is pressed.\n *\n * This is the TechnoSpam-local tag picker; it works with the legacy string-tag\n * arrays stored on Tec* entities while the workspace-wide @burdenoff/microfe-tags\n * taxonomy is being adopted product-wide.\n */\nexport function TagInput({\n value,\n onChange,\n placeholder = 'Add a tag…',\n className,\n maxTags,\n}: TagInputProps) {\n const [draft, setDraft] = useState('');\n\n const commit = useCallback(() => {\n const next = draft\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean);\n if (next.length === 0) return;\n const merged = Array.from(new Set([...value, ...next]));\n onChange(maxTags ? merged.slice(0, maxTags) : merged);\n setDraft('');\n }, [draft, value, onChange, maxTags]);\n\n const remove = useCallback(\n (tag: string) => {\n onChange(value.filter((t) => t !== tag));\n },\n [value, onChange]\n );\n\n return (\n <div className={cn('space-y-2', className)}>\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {value.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center gap-1 rounded-full border border-border-seam bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary\"\n >\n {tag}\n <button\n type=\"button\"\n onClick={() => remove(tag)}\n className=\"rounded-full p-0.5 hover:bg-bg-surface hover:text-status-error-text focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]\"\n aria-label={`Remove ${tag}`}\n >\n <X size={10} />\n </button>\n </span>\n ))}\n </div>\n <div className=\"flex items-center gap-2\">\n <Input\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n }\n }}\n placeholder={placeholder}\n className=\"flex-1\"\n />\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={commit}>\n <Plus size={14} /> Add\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;AAqBA,SAAgB,EAAS,EACvB,UACA,aACA,iBAAc,cACd,cACA,cACgB;CAChB,IAAM,CAAC,GAAO,KAAY,EAAS,GAAG,EAEhC,IAAS,QAAkB;EAC/B,IAAM,IAAO,EACV,MAAM,IAAI,CACV,KAAK,MAAM,EAAE,MAAM,CAAC,CACpB,OAAO,QAAQ;AAClB,MAAI,EAAK,WAAW,EAAG;EACvB,IAAM,IAAS,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,GAAO,GAAG,EAAK,CAAC,CAAC;AAEvD,EADA,EAAS,IAAU,EAAO,MAAM,GAAG,EAAQ,GAAG,EAAO,EACrD,EAAS,GAAG;IACX;EAAC;EAAO;EAAO;EAAU;EAAQ,CAAC,EAE/B,IAAS,GACZ,MAAgB;AACf,IAAS,EAAM,QAAQ,MAAM,MAAM,EAAI,CAAC;IAE1C,CAAC,GAAO,EAAS,CAClB;AAED,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,aAAa,EAAU;YAA1C,CACE,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAM,KAAK,MACV,kBAAC,QAAD;IAEE,WAAU;cAFZ,CAIG,GACD,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAO,EAAI;KAC1B,WAAU;KACV,cAAY,UAAU;eAEtB,kBAAC,GAAD,EAAG,MAAM,IAAM,CAAA;KACR,CAAA,CACJ;MAZA,EAYA,CACP;GACE,CAAA,EACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD;IACE,OAAO;IACP,WAAW,MAAM,EAAS,EAAE,OAAO,MAAM;IACzC,YAAY,MAAM;AAChB,KAAI,EAAE,QAAQ,YACZ,EAAE,gBAAgB,EAClB,GAAQ;;IAGC;IACb,WAAU;IACV,CAAA,EACF,kBAAC,GAAD;IAAQ,MAAK;IAAS,SAAQ;IAAU,MAAK;IAAK,SAAS;cAA3D,CACE,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA,EAAA,OACX;MACL;KACF"}
@@ -0,0 +1,12 @@
1
+ interface TagStripProps {
2
+ tags: string[];
3
+ className?: string;
4
+ size?: 'sm' | 'md';
5
+ }
6
+ /**
7
+ * Read-only chip strip for entity tags. Falls back to nothing when the list
8
+ * is empty so callers don't have to guard.
9
+ */
10
+ export declare function TagStrip({ tags, className, size }: TagStripProps): import("react").JSX.Element | null;
11
+ export {};
12
+ //# sourceMappingURL=TagStrip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TagStrip.d.ts","sourceRoot":"","sources":["../../../src/technospam/components/TagStrip.tsx"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAW,EAAE,EAAE,aAAa,sCAkBvE"}
@@ -0,0 +1,20 @@
1
+ import { cn as e } from "../utils/cn.js";
2
+ import { Tag as t } from "lucide-react";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ //#region src/technospam/components/TagStrip.tsx
5
+ function i({ tags: i, className: a, size: o = "sm" }) {
6
+ return i.length ? /* @__PURE__ */ r("div", {
7
+ className: e("flex flex-wrap items-center gap-1.5", a),
8
+ children: [/* @__PURE__ */ n(t, {
9
+ size: o === "sm" ? 12 : 14,
10
+ className: "text-text-muted"
11
+ }), i.map((t) => /* @__PURE__ */ n("span", {
12
+ className: e("inline-flex items-center rounded-full border border-border-seam bg-bg-sunken px-2 font-medium text-text-secondary", o === "sm" ? "text-[11px] py-0.5" : "text-xs py-1"),
13
+ children: t
14
+ }, t))]
15
+ }) : null;
16
+ }
17
+ //#endregion
18
+ export { i as TagStrip };
19
+
20
+ //# sourceMappingURL=TagStrip.js.map