@burdenoff/microfe-buildmyiq 2026.713.1 → 2026.715.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.
@@ -0,0 +1,10 @@
1
+ import { FC } from 'react';
2
+ import { BuildmyiqRootProps } from './types';
3
+
4
+ export interface BuildmyiqAdminRootProps extends BuildmyiqRootProps {
5
+ /** Workspace token is supplied by admin-app for workspace-scoped MFEs; not used directly by BUI hooks. */
6
+ workspaceToken?: string;
7
+ }
8
+ export declare const BuildmyiqAdminRoot: FC<BuildmyiqAdminRootProps>;
9
+ export { BuildmyiqAdminRoot as BuildMyIQAdminRoot };
10
+ //# sourceMappingURL=BuildmyiqAdminRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuildmyiqAdminRoot.d.ts","sourceRoot":"","sources":["../../src/buildmyiq/BuildmyiqAdminRoot.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAwBhC,OAAO,KAAK,EACV,kBAAkB,EAQnB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,0GAA0G;IAC1G,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAkoBD,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CAkB1D,CAAC;AAEF,OAAO,EAAE,kBAAkB,IAAI,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,597 @@
1
+ import { BuildmyiqProvider as e } from "./context/BuildmyiqContext.js";
2
+ import { PageLayout as t } from "./components/PageLayout.js";
3
+ import { formatDate as n, formatDateTime as r, formatHours as i, formatNumber as a, formatPercent as o } from "./utils/formatters.js";
4
+ import { StatusBadge as s } from "./components/StatusBadge.js";
5
+ import { EmptyState as c } from "./components/EmptyState.js";
6
+ import { ErrorView as l, LoadingView as u, Section as d } from "./components/StateViews.js";
7
+ import { DataTable as f } from "./components/DataTable.js";
8
+ import { FilterTabs as p } from "./components/FilterTabs.js";
9
+ import { Tabs as m } from "./components/Tabs.js";
10
+ import { Pagination as h } from "./components/Pagination.js";
11
+ import { useBuiArchiveCourse as g, useBuiAssessments as _, useBuiCourses as v, useBuiEnrollments as y, useBuiPublishCourse as b, useBuiSubmissions as x } from "./hooks/useBuildmyiqApi.js";
12
+ import { useMemo as S, useState as C } from "react";
13
+ import { QueryClient as w, QueryClientProvider as T } from "@tanstack/react-query";
14
+ import { FeatureFlagProvider as E } from "@burdenoff/fe-libs/shared/feature-flags";
15
+ import { BookOpen as D, CheckSquare as O, ClipboardCheck as k, GraduationCap as A, Users as j } from "lucide-react";
16
+ import { Fragment as M, jsx as N, jsxs as P } from "react/jsx-runtime";
17
+ import { Button as F } from "@burdenoff/fe-libs/ui";
18
+ //#region src/buildmyiq/BuildmyiqAdminRoot.tsx
19
+ var I = new w({ defaultOptions: { queries: {
20
+ staleTime: 30 * 1e3,
21
+ retry: 1,
22
+ refetchOnWindowFocus: !1
23
+ } } }), L = 12, R = [
24
+ {
25
+ value: "ALL",
26
+ label: "All"
27
+ },
28
+ {
29
+ value: "DRAFT",
30
+ label: "Draft"
31
+ },
32
+ {
33
+ value: "IN_REVIEW",
34
+ label: "In Review"
35
+ },
36
+ {
37
+ value: "PUBLISHED",
38
+ label: "Published"
39
+ },
40
+ {
41
+ value: "ARCHIVED",
42
+ label: "Archived"
43
+ }
44
+ ], z = [
45
+ {
46
+ value: "ALL",
47
+ label: "All"
48
+ },
49
+ {
50
+ value: "ENROLLED",
51
+ label: "Enrolled"
52
+ },
53
+ {
54
+ value: "IN_PROGRESS",
55
+ label: "In Progress"
56
+ },
57
+ {
58
+ value: "COMPLETED",
59
+ label: "Completed"
60
+ },
61
+ {
62
+ value: "DROPPED",
63
+ label: "Dropped"
64
+ },
65
+ {
66
+ value: "EXPIRED",
67
+ label: "Expired"
68
+ }
69
+ ], B = [
70
+ {
71
+ value: "ALL",
72
+ label: "All"
73
+ },
74
+ {
75
+ value: "SUBMITTED",
76
+ label: "Submitted"
77
+ },
78
+ {
79
+ value: "GRADING",
80
+ label: "Grading"
81
+ },
82
+ {
83
+ value: "GRADED",
84
+ label: "Graded"
85
+ },
86
+ {
87
+ value: "RETURNED",
88
+ label: "Returned"
89
+ }
90
+ ];
91
+ function V({ course: e }) {
92
+ let t = b(), n = g();
93
+ return /* @__PURE__ */ P("div", {
94
+ className: "flex flex-wrap items-center gap-2",
95
+ children: [
96
+ e.status === "DRAFT" && /* @__PURE__ */ N(F, {
97
+ variant: "outline",
98
+ size: "sm",
99
+ onClick: () => t.mutate(e.id),
100
+ disabled: t.isPending,
101
+ children: "Publish"
102
+ }),
103
+ e.status !== "ARCHIVED" && /* @__PURE__ */ N(F, {
104
+ variant: "outline",
105
+ size: "sm",
106
+ onClick: () => n.mutate(e.id),
107
+ disabled: n.isPending,
108
+ children: "Archive"
109
+ }),
110
+ e.status === "ARCHIVED" && /* @__PURE__ */ N("span", {
111
+ className: "text-xs text-text-secondary",
112
+ children: "Archived"
113
+ })
114
+ ]
115
+ });
116
+ }
117
+ function H() {
118
+ let [e, t] = C("ALL"), [r, o] = C(0), [m, g] = C([]), _ = r > 0 ? m[r - 1] : void 0, { data: y, isLoading: b, error: x, refetch: w } = v({
119
+ status: e === "ALL" ? void 0 : e,
120
+ cursor: _,
121
+ limit: L
122
+ }), T = S(() => [
123
+ {
124
+ key: "title",
125
+ header: "Course",
126
+ render: (e) => /* @__PURE__ */ P("div", {
127
+ className: "min-w-0",
128
+ children: [/* @__PURE__ */ N("p", {
129
+ className: "font-medium text-text-primary truncate",
130
+ children: e.title
131
+ }), /* @__PURE__ */ N("p", {
132
+ className: "text-xs text-text-secondary",
133
+ children: e.slug
134
+ })]
135
+ }),
136
+ sortValue: (e) => e.title.toLowerCase()
137
+ },
138
+ {
139
+ key: "status",
140
+ header: "Status",
141
+ render: (e) => /* @__PURE__ */ N(s, { status: e.status })
142
+ },
143
+ {
144
+ key: "level",
145
+ header: "Level",
146
+ render: (e) => /* @__PURE__ */ N(s, { status: e.level })
147
+ },
148
+ {
149
+ key: "lessons",
150
+ header: "Lessons",
151
+ align: "right",
152
+ render: (e) => a(e.lessons?.length ?? 0),
153
+ sortValue: (e) => e.lessons?.length ?? 0
154
+ },
155
+ {
156
+ key: "hours",
157
+ header: "Est. Hours",
158
+ align: "right",
159
+ render: (e) => i(e.estimatedHours),
160
+ sortValue: (e) => e.estimatedHours
161
+ },
162
+ {
163
+ key: "public",
164
+ header: "Visibility",
165
+ render: (e) => e.isPublic ? "Public" : "Private"
166
+ },
167
+ {
168
+ key: "created",
169
+ header: "Created",
170
+ render: (e) => n(e.createdAt),
171
+ sortValue: (e) => new Date(e.createdAt).getTime()
172
+ },
173
+ {
174
+ key: "actions",
175
+ header: "Actions",
176
+ align: "right",
177
+ render: (e) => /* @__PURE__ */ N(V, { course: e })
178
+ }
179
+ ], []), E = (e) => {
180
+ e > r && y?.pageInfo.cursor ? g((e) => [...e, y.pageInfo.cursor]) : e < r && g((e) => e.slice(0, -1)), o(e);
181
+ };
182
+ if (b) return /* @__PURE__ */ N(u, { label: "Loading courses…" });
183
+ if (x) return /* @__PURE__ */ N(l, {
184
+ title: "Could not load courses",
185
+ message: x.message,
186
+ onRetry: w
187
+ });
188
+ let O = y?.items ?? [];
189
+ return /* @__PURE__ */ P(d, {
190
+ title: "Course catalog",
191
+ description: "Publish, archive and inspect courses.",
192
+ children: [/* @__PURE__ */ N("div", {
193
+ className: "mb-4",
194
+ children: /* @__PURE__ */ N(p, {
195
+ options: R,
196
+ value: e,
197
+ onChange: (e) => {
198
+ t(e), o(0), g([]);
199
+ }
200
+ })
201
+ }), O.length === 0 ? /* @__PURE__ */ N(c, {
202
+ icon: /* @__PURE__ */ N(D, { size: 40 }),
203
+ title: "No courses found",
204
+ description: `There are no ${e === "ALL" ? "" : e.toLowerCase()} courses in this workspace.`
205
+ }) : /* @__PURE__ */ P(M, { children: [/* @__PURE__ */ N(f, {
206
+ columns: T,
207
+ rows: O,
208
+ rowKey: (e) => e.id,
209
+ defaultSort: {
210
+ key: "created",
211
+ dir: "desc"
212
+ }
213
+ }), /* @__PURE__ */ N(h, {
214
+ page: r,
215
+ pageSize: L,
216
+ itemCount: O.length,
217
+ hasMore: y?.pageInfo.hasMore ?? !1,
218
+ onPageChange: E
219
+ })] })]
220
+ });
221
+ }
222
+ function U() {
223
+ let [e, t] = C(""), { data: n, isLoading: r, error: i } = v({
224
+ status: "PUBLISHED",
225
+ limit: 100
226
+ }), { data: p, isLoading: m, error: h } = _(e || void 0), g = S(() => [
227
+ {
228
+ key: "title",
229
+ header: "Assessment",
230
+ render: (e) => /* @__PURE__ */ P("div", {
231
+ className: "min-w-0",
232
+ children: [/* @__PURE__ */ N("p", {
233
+ className: "font-medium text-text-primary truncate",
234
+ children: e.title
235
+ }), /* @__PURE__ */ N("p", {
236
+ className: "text-xs text-text-secondary",
237
+ children: e.type
238
+ })]
239
+ }),
240
+ sortValue: (e) => e.title.toLowerCase()
241
+ },
242
+ {
243
+ key: "status",
244
+ header: "Status",
245
+ render: (e) => /* @__PURE__ */ N(s, { status: e.status })
246
+ },
247
+ {
248
+ key: "questions",
249
+ header: "Questions",
250
+ align: "right",
251
+ render: (e) => a(e.questions?.length ?? 0),
252
+ sortValue: (e) => e.questions?.length ?? 0
253
+ },
254
+ {
255
+ key: "passing",
256
+ header: "Passing Score",
257
+ align: "right",
258
+ render: (e) => o(e.passingScore)
259
+ },
260
+ {
261
+ key: "attempts",
262
+ header: "Max Attempts",
263
+ align: "right",
264
+ render: (e) => a(e.maxAttempts)
265
+ },
266
+ {
267
+ key: "time",
268
+ header: "Time Limit",
269
+ align: "right",
270
+ render: (e) => e.timeLimitMin > 0 ? `${e.timeLimitMin} min` : "—"
271
+ }
272
+ ], []);
273
+ if (r) return /* @__PURE__ */ N(u, { label: "Loading courses…" });
274
+ if (i) return /* @__PURE__ */ N(l, {
275
+ title: "Could not load courses",
276
+ message: i.message
277
+ });
278
+ let y = n?.items ?? [];
279
+ return /* @__PURE__ */ N(d, {
280
+ title: "Assessments",
281
+ description: "Inspect assessments attached to a published course.",
282
+ action: /* @__PURE__ */ P("div", {
283
+ className: "min-w-[16rem]",
284
+ children: [/* @__PURE__ */ N("label", {
285
+ htmlFor: "bui-admin-course-select",
286
+ className: "sr-only",
287
+ children: "Select course"
288
+ }), /* @__PURE__ */ P("select", {
289
+ id: "bui-admin-course-select",
290
+ value: e,
291
+ onChange: (e) => t(e.target.value),
292
+ className: "w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg",
293
+ children: [/* @__PURE__ */ N("option", {
294
+ value: "",
295
+ children: "Choose a course…"
296
+ }), y.map((e) => /* @__PURE__ */ N("option", {
297
+ value: e.id,
298
+ children: e.title
299
+ }, e.id))]
300
+ })]
301
+ }),
302
+ children: e ? m ? /* @__PURE__ */ N(u, { label: "Loading assessments…" }) : h ? /* @__PURE__ */ N(l, {
303
+ title: "Could not load assessments",
304
+ message: h.message
305
+ }) : p?.length === 0 ? /* @__PURE__ */ N(c, {
306
+ icon: /* @__PURE__ */ N(k, { size: 40 }),
307
+ title: "No assessments",
308
+ description: "This course has no assessments yet."
309
+ }) : /* @__PURE__ */ N(f, {
310
+ columns: g,
311
+ rows: p ?? [],
312
+ rowKey: (e) => e.id,
313
+ defaultSort: {
314
+ key: "title",
315
+ dir: "asc"
316
+ }
317
+ }) : /* @__PURE__ */ N(c, {
318
+ icon: /* @__PURE__ */ N(k, { size: 40 }),
319
+ title: "Select a course",
320
+ description: "Choose a published course above to view its assessments."
321
+ })
322
+ });
323
+ }
324
+ function W() {
325
+ let [e, t] = C("ALL"), [n, i] = C(0), [a, m] = C([]), g = n > 0 ? a[n - 1] : void 0, { data: _, isLoading: v, error: b, refetch: x } = y({
326
+ status: e === "ALL" ? void 0 : e,
327
+ cursor: g,
328
+ limit: L
329
+ }), w = S(() => [
330
+ {
331
+ key: "learner",
332
+ header: "Learner",
333
+ render: (e) => /* @__PURE__ */ N("span", {
334
+ className: "font-mono text-xs text-text-secondary",
335
+ children: e.learnerId
336
+ })
337
+ },
338
+ {
339
+ key: "course",
340
+ header: "Course ID",
341
+ render: (e) => /* @__PURE__ */ N("span", {
342
+ className: "font-mono text-xs text-text-secondary",
343
+ children: e.courseId
344
+ })
345
+ },
346
+ {
347
+ key: "status",
348
+ header: "Status",
349
+ render: (e) => /* @__PURE__ */ N(s, { status: e.status })
350
+ },
351
+ {
352
+ key: "progress",
353
+ header: "Progress",
354
+ align: "right",
355
+ render: (e) => o(e.progressPct),
356
+ sortValue: (e) => e.progressPct
357
+ },
358
+ {
359
+ key: "cohort",
360
+ header: "Cohort",
361
+ render: (e) => e.cohort?.name ?? "—"
362
+ },
363
+ {
364
+ key: "enrolled",
365
+ header: "Enrolled",
366
+ render: (e) => r(e.enrolledAt),
367
+ sortValue: (e) => new Date(e.enrolledAt).getTime(),
368
+ hideOnMobile: !0
369
+ },
370
+ {
371
+ key: "lastActive",
372
+ header: "Last Active",
373
+ render: (e) => e.lastActiveAt ? G(e.lastActiveAt) : "—",
374
+ sortValue: (e) => e.lastActiveAt ? new Date(e.lastActiveAt).getTime() : 0,
375
+ hideOnMobile: !0
376
+ }
377
+ ], []), T = (e) => {
378
+ e > n && _?.pageInfo.cursor ? m((e) => [...e, _.pageInfo.cursor]) : e < n && m((e) => e.slice(0, -1)), i(e);
379
+ };
380
+ if (v) return /* @__PURE__ */ N(u, { label: "Loading enrollments…" });
381
+ if (b) return /* @__PURE__ */ N(l, {
382
+ title: "Could not load enrollments",
383
+ message: b.message,
384
+ onRetry: x
385
+ });
386
+ let E = _?.items ?? [];
387
+ return /* @__PURE__ */ P(d, {
388
+ title: "Enrollments",
389
+ description: "Workspace-wide learner enrollment overview.",
390
+ children: [/* @__PURE__ */ N("div", {
391
+ className: "mb-4",
392
+ children: /* @__PURE__ */ N(p, {
393
+ options: z,
394
+ value: e,
395
+ onChange: (e) => {
396
+ t(e), i(0), m([]);
397
+ }
398
+ })
399
+ }), E.length === 0 ? /* @__PURE__ */ N(c, {
400
+ icon: /* @__PURE__ */ N(j, { size: 40 }),
401
+ title: "No enrollments",
402
+ description: `There are no ${e === "ALL" ? "" : e.toLowerCase()} enrollments in this workspace.`
403
+ }) : /* @__PURE__ */ P(M, { children: [/* @__PURE__ */ N(f, {
404
+ columns: w,
405
+ rows: E,
406
+ rowKey: (e) => e.id,
407
+ defaultSort: {
408
+ key: "enrolled",
409
+ dir: "desc"
410
+ }
411
+ }), /* @__PURE__ */ N(h, {
412
+ page: n,
413
+ pageSize: L,
414
+ itemCount: E.length,
415
+ hasMore: _?.pageInfo.hasMore ?? !1,
416
+ onPageChange: T
417
+ })] })]
418
+ });
419
+ }
420
+ function G(e) {
421
+ let t = typeof e == "string" ? new Date(e) : e, n = /* @__PURE__ */ new Date(), r = t.getTime() - n.getTime(), i = r >= 0, a = Math.floor(Math.abs(r) / 1e3), o = Math.floor(a / 60), s = Math.floor(o / 60), c = Math.floor(s / 24), l = (e, t) => {
422
+ let n = `${e} ${t}${e === 1 ? "" : "s"}`;
423
+ return i ? `in ${n}` : `${n} ago`;
424
+ };
425
+ return a < 60 ? i ? "soon" : "just now" : o < 60 ? l(o, "min") : s < 24 ? l(s, "hour") : l(c, "day");
426
+ }
427
+ function K() {
428
+ let [e, t] = C("ALL"), [n, i] = C(0), [m, g] = C([]), _ = n > 0 ? m[n - 1] : void 0, { data: v, isLoading: y, error: b, refetch: w } = x({
429
+ status: e === "ALL" ? void 0 : e,
430
+ cursor: _,
431
+ limit: L
432
+ }), T = S(() => [
433
+ {
434
+ key: "learner",
435
+ header: "Learner",
436
+ render: (e) => /* @__PURE__ */ N("span", {
437
+ className: "font-mono text-xs text-text-secondary",
438
+ children: e.learnerId
439
+ })
440
+ },
441
+ {
442
+ key: "assessment",
443
+ header: "Assessment ID",
444
+ render: (e) => /* @__PURE__ */ N("span", {
445
+ className: "font-mono text-xs text-text-secondary",
446
+ children: e.assessmentId
447
+ })
448
+ },
449
+ {
450
+ key: "attempt",
451
+ header: "Attempt",
452
+ align: "right",
453
+ render: (e) => a(e.attempt)
454
+ },
455
+ {
456
+ key: "status",
457
+ header: "Status",
458
+ render: (e) => /* @__PURE__ */ N(s, { status: e.status })
459
+ },
460
+ {
461
+ key: "score",
462
+ header: "Score",
463
+ align: "right",
464
+ render: (e) => e.score == null ? "—" : o(e.score),
465
+ sortValue: (e) => e.score ?? -1
466
+ },
467
+ {
468
+ key: "passed",
469
+ header: "Passed",
470
+ align: "center",
471
+ render: (e) => e.passed == null ? "—" : e.passed ? "Yes" : "No"
472
+ },
473
+ {
474
+ key: "submitted",
475
+ header: "Submitted",
476
+ render: (e) => e.submittedAt ? r(e.submittedAt) : "—",
477
+ sortValue: (e) => e.submittedAt ? new Date(e.submittedAt).getTime() : 0,
478
+ hideOnMobile: !0
479
+ },
480
+ {
481
+ key: "actions",
482
+ header: "Review",
483
+ align: "right",
484
+ render: () => /* @__PURE__ */ N(F, {
485
+ variant: "ghost",
486
+ size: "sm",
487
+ disabled: !0,
488
+ children: "Open"
489
+ })
490
+ }
491
+ ], []), E = (e) => {
492
+ e > n && v?.pageInfo.cursor ? g((e) => [...e, v.pageInfo.cursor]) : e < n && g((e) => e.slice(0, -1)), i(e);
493
+ };
494
+ if (y) return /* @__PURE__ */ N(u, { label: "Loading submissions…" });
495
+ if (b) return /* @__PURE__ */ N(l, {
496
+ title: "Could not load submissions",
497
+ message: b.message,
498
+ onRetry: w
499
+ });
500
+ let D = v?.items ?? [];
501
+ return /* @__PURE__ */ P(d, {
502
+ title: "Submission review",
503
+ description: "Review learner submissions and grading status.",
504
+ children: [/* @__PURE__ */ N("div", {
505
+ className: "mb-4",
506
+ children: /* @__PURE__ */ N(p, {
507
+ options: B,
508
+ value: e,
509
+ onChange: (e) => {
510
+ t(e), i(0), g([]);
511
+ }
512
+ })
513
+ }), D.length === 0 ? /* @__PURE__ */ N(c, {
514
+ icon: /* @__PURE__ */ N(O, { size: 40 }),
515
+ title: "No submissions",
516
+ description: `There are no ${e === "ALL" ? "" : e.toLowerCase()} submissions in this workspace.`
517
+ }) : /* @__PURE__ */ P(M, { children: [/* @__PURE__ */ N(f, {
518
+ columns: T,
519
+ rows: D,
520
+ rowKey: (e) => e.id,
521
+ defaultSort: {
522
+ key: "submitted",
523
+ dir: "desc"
524
+ }
525
+ }), /* @__PURE__ */ N(h, {
526
+ page: n,
527
+ pageSize: L,
528
+ itemCount: D.length,
529
+ hasMore: v?.pageInfo.hasMore ?? !1,
530
+ onPageChange: E
531
+ })] })]
532
+ });
533
+ }
534
+ function q() {
535
+ let [e, n] = C("courses"), r = S(() => [
536
+ {
537
+ value: "courses",
538
+ label: "Courses",
539
+ icon: /* @__PURE__ */ N(D, { size: 18 })
540
+ },
541
+ {
542
+ value: "assessments",
543
+ label: "Assessments",
544
+ icon: /* @__PURE__ */ N(k, { size: 18 })
545
+ },
546
+ {
547
+ value: "enrollments",
548
+ label: "Enrollments",
549
+ icon: /* @__PURE__ */ N(j, { size: 18 })
550
+ },
551
+ {
552
+ value: "submissions",
553
+ label: "Submissions",
554
+ icon: /* @__PURE__ */ N(O, { size: 18 })
555
+ }
556
+ ], []);
557
+ return /* @__PURE__ */ P(t, {
558
+ title: "BuildMyIQ Admin",
559
+ description: "Course, assessment, enrollment and submission governance.",
560
+ actions: /* @__PURE__ */ P("span", {
561
+ className: "inline-flex items-center gap-2 text-sm text-text-secondary",
562
+ children: [/* @__PURE__ */ N(A, { size: 18 }), "Workspace-scoped"]
563
+ }),
564
+ children: [/* @__PURE__ */ N(m, {
565
+ items: r,
566
+ value: e,
567
+ onChange: (e) => n(e)
568
+ }), /* @__PURE__ */ P("div", {
569
+ className: "mt-6",
570
+ children: [
571
+ e === "courses" && /* @__PURE__ */ N(H, {}),
572
+ e === "assessments" && /* @__PURE__ */ N(U, {}),
573
+ e === "enrollments" && /* @__PURE__ */ N(W, {}),
574
+ e === "submissions" && /* @__PURE__ */ N(K, {})
575
+ ]
576
+ })]
577
+ });
578
+ }
579
+ var J = (t) => {
580
+ let n = t;
581
+ return /* @__PURE__ */ N(T, {
582
+ client: I,
583
+ children: /* @__PURE__ */ N(E, {
584
+ workspaceId: t.workspaceId ?? null,
585
+ gateway: "global",
586
+ defaultEnabled: !0,
587
+ children: /* @__PURE__ */ N(e, {
588
+ ...n,
589
+ children: /* @__PURE__ */ N(q, {})
590
+ })
591
+ })
592
+ });
593
+ };
594
+ //#endregion
595
+ export { J as BuildmyiqAdminRoot };
596
+
597
+ //# sourceMappingURL=BuildmyiqAdminRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuildmyiqAdminRoot.js","names":[],"sources":["../../src/buildmyiq/BuildmyiqAdminRoot.tsx"],"sourcesContent":["/**\n * BuildMyIQ Admin Root\n * @module buildmyiq\n *\n * Product-specific admin surface mounted inside `admin-app` under\n * `/admin/buildmyiq`. It exposes three core governance operations:\n *\n * 1. Course / assessment administration — list, publish, archive courses and\n * inspect assessments per course.\n * 2. Enrollment overview — workspace-wide enrollment list with status/progress.\n * 3. Submission review — graded/ungraded submission queue.\n *\n * The panel reuses the real `wspace-buildmyiq-svc` GraphQL operations already\n * consumed by the learner/author surfaces (`buiListCourses`, `buiListEnrollments`,\n * `buiListSubmissions`, `buiListAssessments`, `buiPublishCourse`, `buiArchiveCourse`).\n *\n * Remaining backend gaps (documented inline):\n * - Admin-scoped bulk mutations (bulk archive, bulk transition enrollment).\n * - Cross-workspace/admin analytics aggregations.\n * - Submission review detail + rubric grading UI.\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { BookOpen, ClipboardCheck, Users, CheckSquare, GraduationCap } from 'lucide-react';\nimport { BuildmyiqProvider } from './context/BuildmyiqContext';\nimport { PageLayout } from './components/PageLayout';\nimport { Tabs } from './components/Tabs';\nimport { DataTable, type Column } from './components/DataTable';\nimport { StatusBadge } from './components/StatusBadge';\nimport { LoadingView, ErrorView, Section } from './components/StateViews';\nimport { EmptyState } from './components/EmptyState';\nimport { Pagination } from './components/Pagination';\nimport { FilterTabs } from './components/FilterTabs';\nimport {\n useBuiCourses,\n useBuiAssessments,\n useBuiEnrollments,\n useBuiSubmissions,\n useBuiPublishCourse,\n useBuiArchiveCourse,\n} from './hooks/useBuildmyiqApi';\nimport { formatDate, formatDateTime, formatPercent, formatNumber, formatHours } from './utils';\nimport type {\n BuildmyiqRootProps,\n BuiCourse,\n BuiCourseStatus,\n BuiEnrollment,\n BuiEnrollmentStatus,\n BuiSubmission,\n BuiSubmissionStatus,\n BuiAssessment,\n} from './types';\n\nexport interface BuildmyiqAdminRootProps extends BuildmyiqRootProps {\n /** Workspace token is supplied by admin-app for workspace-scoped MFEs; not used directly by BUI hooks. */\n workspaceToken?: string;\n}\n\ntype AdminTab = 'courses' | 'assessments' | 'enrollments' | 'submissions';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 30 * 1000,\n retry: 1,\n refetchOnWindowFocus: false,\n },\n },\n});\n\nconst PAGE_SIZE = 12;\n\nconst COURSE_STATUS_OPTIONS: { value: 'ALL' | BuiCourseStatus; label: string }[] = [\n { value: 'ALL', label: 'All' },\n { value: 'DRAFT', label: 'Draft' },\n { value: 'IN_REVIEW', label: 'In Review' },\n { value: 'PUBLISHED', label: 'Published' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\nconst ENROLLMENT_STATUS_OPTIONS: { value: 'ALL' | BuiEnrollmentStatus; label: string }[] = [\n { value: 'ALL', label: 'All' },\n { value: 'ENROLLED', label: 'Enrolled' },\n { value: 'IN_PROGRESS', label: 'In Progress' },\n { value: 'COMPLETED', label: 'Completed' },\n { value: 'DROPPED', label: 'Dropped' },\n { value: 'EXPIRED', label: 'Expired' },\n];\n\nconst SUBMISSION_STATUS_OPTIONS: { value: 'ALL' | BuiSubmissionStatus; label: string }[] = [\n { value: 'ALL', label: 'All' },\n { value: 'SUBMITTED', label: 'Submitted' },\n { value: 'GRADING', label: 'Grading' },\n { value: 'GRADED', label: 'Graded' },\n { value: 'RETURNED', label: 'Returned' },\n];\n\n// ============================================================================\n// Course administration\n// ============================================================================\n\nfunction CourseActions({ course }: { course: BuiCourse }) {\n const publish = useBuiPublishCourse();\n const archive = useBuiArchiveCourse();\n\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n {course.status === 'DRAFT' && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => publish.mutate(course.id)}\n disabled={publish.isPending}\n >\n Publish\n </Button>\n )}\n {course.status !== 'ARCHIVED' && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => archive.mutate(course.id)}\n disabled={archive.isPending}\n >\n Archive\n </Button>\n )}\n {course.status === 'ARCHIVED' && (\n <span className=\"text-xs text-text-secondary\">Archived</span>\n )}\n </div>\n );\n}\n\nfunction CoursesPanel() {\n const [status, setStatus] = useState<'ALL' | BuiCourseStatus>('ALL');\n const [page, setPage] = useState(0);\n const [cursors, setCursors] = useState<string[]>([]);\n\n const cursor = page > 0 ? cursors[page - 1] : undefined;\n const { data, isLoading, error, refetch } = useBuiCourses({\n status: status === 'ALL' ? undefined : status,\n cursor,\n limit: PAGE_SIZE,\n });\n\n const columns = useMemo<Column<BuiCourse>[]>(\n () => [\n {\n key: 'title',\n header: 'Course',\n render: (c) => (\n <div className=\"min-w-0\">\n <p className=\"font-medium text-text-primary truncate\">{c.title}</p>\n <p className=\"text-xs text-text-secondary\">{c.slug}</p>\n </div>\n ),\n sortValue: (c) => c.title.toLowerCase(),\n },\n {\n key: 'status',\n header: 'Status',\n render: (c) => <StatusBadge status={c.status} />,\n },\n {\n key: 'level',\n header: 'Level',\n render: (c) => <StatusBadge status={c.level} />,\n },\n {\n key: 'lessons',\n header: 'Lessons',\n align: 'right',\n render: (c) => formatNumber(c.lessons?.length ?? 0),\n sortValue: (c) => c.lessons?.length ?? 0,\n },\n {\n key: 'hours',\n header: 'Est. Hours',\n align: 'right',\n render: (c) => formatHours(c.estimatedHours),\n sortValue: (c) => c.estimatedHours,\n },\n {\n key: 'public',\n header: 'Visibility',\n render: (c) => (c.isPublic ? 'Public' : 'Private'),\n },\n {\n key: 'created',\n header: 'Created',\n render: (c) => formatDate(c.createdAt),\n sortValue: (c) => new Date(c.createdAt).getTime(),\n },\n {\n key: 'actions',\n header: 'Actions',\n align: 'right',\n render: (c) => <CourseActions course={c} />,\n },\n ],\n []\n );\n\n const handlePageChange = (nextPage: number) => {\n if (nextPage > page && data?.pageInfo.cursor) {\n setCursors((prev) => [...prev, data.pageInfo.cursor as string]);\n } else if (nextPage < page) {\n setCursors((prev) => prev.slice(0, -1));\n }\n setPage(nextPage);\n };\n\n if (isLoading) return <LoadingView label=\"Loading courses…\" />;\n if (error)\n return <ErrorView title=\"Could not load courses\" message={error.message} onRetry={refetch} />;\n\n const rows = data?.items ?? [];\n\n return (\n <Section title=\"Course catalog\" description=\"Publish, archive and inspect courses.\">\n <div className=\"mb-4\">\n <FilterTabs\n options={COURSE_STATUS_OPTIONS}\n value={status}\n onChange={(v) => {\n setStatus(v);\n setPage(0);\n setCursors([]);\n }}\n />\n </div>\n {rows.length === 0 ? (\n <EmptyState\n icon={<BookOpen size={40} />}\n title=\"No courses found\"\n description={`There are no ${status === 'ALL' ? '' : status.toLowerCase()} courses in this workspace.`}\n />\n ) : (\n <>\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(c) => c.id}\n defaultSort={{ key: 'created', dir: 'desc' }}\n />\n <Pagination\n page={page}\n pageSize={PAGE_SIZE}\n itemCount={rows.length}\n hasMore={data?.pageInfo.hasMore ?? false}\n onPageChange={handlePageChange}\n />\n </>\n )}\n </Section>\n );\n}\n\n// ============================================================================\n// Assessment administration\n// ============================================================================\n\nfunction AssessmentsPanel() {\n const [selectedCourseId, setSelectedCourseId] = useState<string>('');\n\n const {\n data: coursesData,\n isLoading: coursesLoading,\n error: coursesError,\n } = useBuiCourses({\n status: 'PUBLISHED',\n limit: 100,\n });\n\n const {\n data: assessments,\n isLoading: assessmentsLoading,\n error: assessmentsError,\n } = useBuiAssessments(selectedCourseId || undefined);\n\n const columns = useMemo<Column<BuiAssessment>[]>(\n () => [\n {\n key: 'title',\n header: 'Assessment',\n render: (a) => (\n <div className=\"min-w-0\">\n <p className=\"font-medium text-text-primary truncate\">{a.title}</p>\n <p className=\"text-xs text-text-secondary\">{a.type}</p>\n </div>\n ),\n sortValue: (a) => a.title.toLowerCase(),\n },\n {\n key: 'status',\n header: 'Status',\n render: (a) => <StatusBadge status={a.status} />,\n },\n {\n key: 'questions',\n header: 'Questions',\n align: 'right',\n render: (a) => formatNumber(a.questions?.length ?? 0),\n sortValue: (a) => a.questions?.length ?? 0,\n },\n {\n key: 'passing',\n header: 'Passing Score',\n align: 'right',\n render: (a) => formatPercent(a.passingScore),\n },\n {\n key: 'attempts',\n header: 'Max Attempts',\n align: 'right',\n render: (a) => formatNumber(a.maxAttempts),\n },\n {\n key: 'time',\n header: 'Time Limit',\n align: 'right',\n render: (a) => (a.timeLimitMin > 0 ? `${a.timeLimitMin} min` : '—'),\n },\n ],\n []\n );\n\n if (coursesLoading) return <LoadingView label=\"Loading courses…\" />;\n if (coursesError)\n return <ErrorView title=\"Could not load courses\" message={coursesError.message} />;\n\n const courses = coursesData?.items ?? [];\n\n return (\n <Section\n title=\"Assessments\"\n description=\"Inspect assessments attached to a published course.\"\n action={\n <div className=\"min-w-[16rem]\">\n <label htmlFor=\"bui-admin-course-select\" className=\"sr-only\">\n Select course\n </label>\n <select\n id=\"bui-admin-course-select\"\n value={selectedCourseId}\n onChange={(e) => setSelectedCourseId(e.target.value)}\n className=\"w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg\"\n >\n <option value=\"\">Choose a course…</option>\n {courses.map((c) => (\n <option key={c.id} value={c.id}>\n {c.title}\n </option>\n ))}\n </select>\n </div>\n }\n >\n {!selectedCourseId ? (\n <EmptyState\n icon={<ClipboardCheck size={40} />}\n title=\"Select a course\"\n description=\"Choose a published course above to view its assessments.\"\n />\n ) : assessmentsLoading ? (\n <LoadingView label=\"Loading assessments…\" />\n ) : assessmentsError ? (\n <ErrorView title=\"Could not load assessments\" message={assessmentsError.message} />\n ) : assessments?.length === 0 ? (\n <EmptyState\n icon={<ClipboardCheck size={40} />}\n title=\"No assessments\"\n description=\"This course has no assessments yet.\"\n />\n ) : (\n <DataTable\n columns={columns}\n rows={assessments ?? []}\n rowKey={(a) => a.id}\n defaultSort={{ key: 'title', dir: 'asc' }}\n />\n )}\n </Section>\n );\n}\n\n// ============================================================================\n// Enrollment overview\n// ============================================================================\n\nfunction EnrollmentsPanel() {\n const [status, setStatus] = useState<'ALL' | BuiEnrollmentStatus>('ALL');\n const [page, setPage] = useState(0);\n const [cursors, setCursors] = useState<string[]>([]);\n\n const cursor = page > 0 ? cursors[page - 1] : undefined;\n const { data, isLoading, error, refetch } = useBuiEnrollments({\n status: status === 'ALL' ? undefined : status,\n cursor,\n limit: PAGE_SIZE,\n });\n\n const columns = useMemo<Column<BuiEnrollment>[]>(\n () => [\n {\n key: 'learner',\n header: 'Learner',\n render: (e) => <span className=\"font-mono text-xs text-text-secondary\">{e.learnerId}</span>,\n },\n {\n key: 'course',\n header: 'Course ID',\n render: (e) => <span className=\"font-mono text-xs text-text-secondary\">{e.courseId}</span>,\n },\n {\n key: 'status',\n header: 'Status',\n render: (e) => <StatusBadge status={e.status} />,\n },\n {\n key: 'progress',\n header: 'Progress',\n align: 'right',\n render: (e) => formatPercent(e.progressPct),\n sortValue: (e) => e.progressPct,\n },\n {\n key: 'cohort',\n header: 'Cohort',\n render: (e) => e.cohort?.name ?? '—',\n },\n {\n key: 'enrolled',\n header: 'Enrolled',\n render: (e) => formatDateTime(e.enrolledAt),\n sortValue: (e) => new Date(e.enrolledAt).getTime(),\n hideOnMobile: true,\n },\n {\n key: 'lastActive',\n header: 'Last Active',\n render: (e) => (e.lastActiveAt ? formatRelativeTime(e.lastActiveAt) : '—'),\n sortValue: (e) => (e.lastActiveAt ? new Date(e.lastActiveAt).getTime() : 0),\n hideOnMobile: true,\n },\n ],\n []\n );\n\n const handlePageChange = (nextPage: number) => {\n if (nextPage > page && data?.pageInfo.cursor) {\n setCursors((prev) => [...prev, data.pageInfo.cursor as string]);\n } else if (nextPage < page) {\n setCursors((prev) => prev.slice(0, -1));\n }\n setPage(nextPage);\n };\n\n if (isLoading) return <LoadingView label=\"Loading enrollments…\" />;\n if (error)\n return (\n <ErrorView title=\"Could not load enrollments\" message={error.message} onRetry={refetch} />\n );\n\n const rows = data?.items ?? [];\n\n return (\n <Section title=\"Enrollments\" description=\"Workspace-wide learner enrollment overview.\">\n <div className=\"mb-4\">\n <FilterTabs\n options={ENROLLMENT_STATUS_OPTIONS}\n value={status}\n onChange={(v) => {\n setStatus(v);\n setPage(0);\n setCursors([]);\n }}\n />\n </div>\n {rows.length === 0 ? (\n <EmptyState\n icon={<Users size={40} />}\n title=\"No enrollments\"\n description={`There are no ${status === 'ALL' ? '' : status.toLowerCase()} enrollments in this workspace.`}\n />\n ) : (\n <>\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(e) => e.id}\n defaultSort={{ key: 'enrolled', dir: 'desc' }}\n />\n <Pagination\n page={page}\n pageSize={PAGE_SIZE}\n itemCount={rows.length}\n hasMore={data?.pageInfo.hasMore ?? false}\n onPageChange={handlePageChange}\n />\n </>\n )}\n </Section>\n );\n}\n\n// Need formatRelativeTime for lastActive in enrollments; import it.\nfunction formatRelativeTime(date: string | Date): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n const now = new Date();\n const diffMs = d.getTime() - now.getTime();\n const future = diffMs >= 0;\n const absSeconds = Math.floor(Math.abs(diffMs) / 1000);\n const minutes = Math.floor(absSeconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const phrase = (value: number, unit: string) => {\n const label = `${value} ${unit}${value !== 1 ? 's' : ''}`;\n return future ? `in ${label}` : `${label} ago`;\n };\n if (absSeconds < 60) return future ? 'soon' : 'just now';\n if (minutes < 60) return phrase(minutes, 'min');\n if (hours < 24) return phrase(hours, 'hour');\n return phrase(days, 'day');\n}\n\n// ============================================================================\n// Submission review\n// ============================================================================\n\nfunction SubmissionsPanel() {\n const [status, setStatus] = useState<'ALL' | BuiSubmissionStatus>('ALL');\n const [page, setPage] = useState(0);\n const [cursors, setCursors] = useState<string[]>([]);\n\n const cursor = page > 0 ? cursors[page - 1] : undefined;\n const { data, isLoading, error, refetch } = useBuiSubmissions({\n status: status === 'ALL' ? undefined : status,\n cursor,\n limit: PAGE_SIZE,\n });\n\n const columns = useMemo<Column<BuiSubmission>[]>(\n () => [\n {\n key: 'learner',\n header: 'Learner',\n render: (s) => <span className=\"font-mono text-xs text-text-secondary\">{s.learnerId}</span>,\n },\n {\n key: 'assessment',\n header: 'Assessment ID',\n render: (s) => (\n <span className=\"font-mono text-xs text-text-secondary\">{s.assessmentId}</span>\n ),\n },\n {\n key: 'attempt',\n header: 'Attempt',\n align: 'right',\n render: (s) => formatNumber(s.attempt),\n },\n {\n key: 'status',\n header: 'Status',\n render: (s) => <StatusBadge status={s.status} />,\n },\n {\n key: 'score',\n header: 'Score',\n align: 'right',\n render: (s) => (s.score == null ? '—' : formatPercent(s.score)),\n sortValue: (s) => s.score ?? -1,\n },\n {\n key: 'passed',\n header: 'Passed',\n align: 'center',\n render: (s) => (s.passed == null ? '—' : s.passed ? 'Yes' : 'No'),\n },\n {\n key: 'submitted',\n header: 'Submitted',\n render: (s) => (s.submittedAt ? formatDateTime(s.submittedAt) : '—'),\n sortValue: (s) => (s.submittedAt ? new Date(s.submittedAt).getTime() : 0),\n hideOnMobile: true,\n },\n {\n key: 'actions',\n header: 'Review',\n align: 'right',\n render: () => (\n <Button variant=\"ghost\" size=\"sm\" disabled>\n Open\n </Button>\n ),\n },\n ],\n []\n );\n\n const handlePageChange = (nextPage: number) => {\n if (nextPage > page && data?.pageInfo.cursor) {\n setCursors((prev) => [...prev, data.pageInfo.cursor as string]);\n } else if (nextPage < page) {\n setCursors((prev) => prev.slice(0, -1));\n }\n setPage(nextPage);\n };\n\n if (isLoading) return <LoadingView label=\"Loading submissions…\" />;\n if (error)\n return (\n <ErrorView title=\"Could not load submissions\" message={error.message} onRetry={refetch} />\n );\n\n const rows = data?.items ?? [];\n\n return (\n <Section title=\"Submission review\" description=\"Review learner submissions and grading status.\">\n <div className=\"mb-4\">\n <FilterTabs\n options={SUBMISSION_STATUS_OPTIONS}\n value={status}\n onChange={(v) => {\n setStatus(v);\n setPage(0);\n setCursors([]);\n }}\n />\n </div>\n {rows.length === 0 ? (\n <EmptyState\n icon={<CheckSquare size={40} />}\n title=\"No submissions\"\n description={`There are no ${status === 'ALL' ? '' : status.toLowerCase()} submissions in this workspace.`}\n />\n ) : (\n <>\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(s) => s.id}\n defaultSort={{ key: 'submitted', dir: 'desc' }}\n />\n <Pagination\n page={page}\n pageSize={PAGE_SIZE}\n itemCount={rows.length}\n hasMore={data?.pageInfo.hasMore ?? false}\n onPageChange={handlePageChange}\n />\n </>\n )}\n </Section>\n );\n}\n\n// ============================================================================\n// Root\n// ============================================================================\n\nfunction BuildmyiqAdminDashboard() {\n const [activeTab, setActiveTab] = useState<AdminTab>('courses');\n\n const tabs = useMemo(\n () => [\n { value: 'courses' as const, label: 'Courses', icon: <BookOpen size={18} /> },\n { value: 'assessments' as const, label: 'Assessments', icon: <ClipboardCheck size={18} /> },\n { value: 'enrollments' as const, label: 'Enrollments', icon: <Users size={18} /> },\n { value: 'submissions' as const, label: 'Submissions', icon: <CheckSquare size={18} /> },\n ],\n []\n );\n\n return (\n <PageLayout\n title=\"BuildMyIQ Admin\"\n description=\"Course, assessment, enrollment and submission governance.\"\n actions={\n <span className=\"inline-flex items-center gap-2 text-sm text-text-secondary\">\n <GraduationCap size={18} />\n Workspace-scoped\n </span>\n }\n >\n <Tabs items={tabs} value={activeTab} onChange={(v) => setActiveTab(v)} />\n <div className=\"mt-6\">\n {activeTab === 'courses' && <CoursesPanel />}\n {activeTab === 'assessments' && <AssessmentsPanel />}\n {activeTab === 'enrollments' && <EnrollmentsPanel />}\n {activeTab === 'submissions' && <SubmissionsPanel />}\n </div>\n </PageLayout>\n );\n}\n\nexport const BuildmyiqAdminRoot: FC<BuildmyiqAdminRootProps> = (props) => {\n // Strip the admin-app workspace token before passing props to the BUI\n // provider; the BUI hooks use the shell's workspace-token provider instead.\n const providerProps: BuildmyiqRootProps = props;\n\n return (\n <QueryClientProvider client={queryClient}>\n <FeatureFlagProvider\n workspaceId={props.workspaceId ?? null}\n gateway=\"global\"\n defaultEnabled={true}\n >\n <BuildmyiqProvider {...providerProps}>\n <BuildmyiqAdminDashboard />\n </BuildmyiqProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n );\n};\n\nexport { BuildmyiqAdminRoot as BuildMyIQAdminRoot };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAgEA,IAAM,IAAc,IAAI,EAAY,EAClC,gBAAgB,EACd,SAAS;CACP,WAAW,KAAK;CAChB,OAAO;CACP,sBAAsB;CACvB,EACF,EACF,CAAC,EAEI,IAAY,IAEZ,IAA6E;CACjF;EAAE,OAAO;EAAO,OAAO;EAAO;CAC9B;EAAE,OAAO;EAAS,OAAO;EAAS;CAClC;EAAE,OAAO;EAAa,OAAO;EAAa;CAC1C;EAAE,OAAO;EAAa,OAAO;EAAa;CAC1C;EAAE,OAAO;EAAY,OAAO;EAAY;CACzC,EAEK,IAAqF;CACzF;EAAE,OAAO;EAAO,OAAO;EAAO;CAC9B;EAAE,OAAO;EAAY,OAAO;EAAY;CACxC;EAAE,OAAO;EAAe,OAAO;EAAe;CAC9C;EAAE,OAAO;EAAa,OAAO;EAAa;CAC1C;EAAE,OAAO;EAAW,OAAO;EAAW;CACtC;EAAE,OAAO;EAAW,OAAO;EAAW;CACvC,EAEK,IAAqF;CACzF;EAAE,OAAO;EAAO,OAAO;EAAO;CAC9B;EAAE,OAAO;EAAa,OAAO;EAAa;CAC1C;EAAE,OAAO;EAAW,OAAO;EAAW;CACtC;EAAE,OAAO;EAAU,OAAO;EAAU;CACpC;EAAE,OAAO;EAAY,OAAO;EAAY;CACzC;AAMD,SAAS,EAAc,EAAE,aAAiC;CACxD,IAAM,IAAU,GAAqB,EAC/B,IAAU,GAAqB;AAErC,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACG,EAAO,WAAW,WACjB,kBAAC,GAAD;IACE,SAAQ;IACR,MAAK;IACL,eAAe,EAAQ,OAAO,EAAO,GAAG;IACxC,UAAU,EAAQ;cACnB;IAEQ,CAAA;GAEV,EAAO,WAAW,cACjB,kBAAC,GAAD;IACE,SAAQ;IACR,MAAK;IACL,eAAe,EAAQ,OAAO,EAAO,GAAG;IACxC,UAAU,EAAQ;cACnB;IAEQ,CAAA;GAEV,EAAO,WAAW,cACjB,kBAAC,QAAD;IAAM,WAAU;cAA8B;IAAe,CAAA;GAE3D;;;AAIV,SAAS,IAAe;CACtB,IAAM,CAAC,GAAQ,KAAa,EAAkC,MAAM,EAC9D,CAAC,GAAM,KAAW,EAAS,EAAE,EAC7B,CAAC,GAAS,KAAc,EAAmB,EAAE,CAAC,EAE9C,IAAS,IAAO,IAAI,EAAQ,IAAO,KAAK,KAAA,GACxC,EAAE,SAAM,cAAW,UAAO,eAAY,EAAc;EACxD,QAAQ,MAAW,QAAQ,KAAA,IAAY;EACvC;EACA,OAAO;EACR,CAAC,EAEI,IAAU,QACR;EACJ;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MACP,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAU;eAA0C,EAAE;KAAU,CAAA,EACnE,kBAAC,KAAD;KAAG,WAAU;eAA+B,EAAE;KAAS,CAAA,CACnD;;GAER,YAAY,MAAM,EAAE,MAAM,aAAa;GACxC;EACD;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MAAM,kBAAC,GAAD,EAAa,QAAQ,EAAE,QAAU,CAAA;GACjD;EACD;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MAAM,kBAAC,GAAD,EAAa,QAAQ,EAAE,OAAS,CAAA;GAChD;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO;GACP,SAAS,MAAM,EAAa,EAAE,SAAS,UAAU,EAAE;GACnD,YAAY,MAAM,EAAE,SAAS,UAAU;GACxC;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO;GACP,SAAS,MAAM,EAAY,EAAE,eAAe;GAC5C,YAAY,MAAM,EAAE;GACrB;EACD;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MAAO,EAAE,WAAW,WAAW;GACzC;EACD;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MAAM,EAAW,EAAE,UAAU;GACtC,YAAY,MAAM,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS;GAClD;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO;GACP,SAAS,MAAM,kBAAC,GAAD,EAAe,QAAQ,GAAK,CAAA;GAC5C;EACF,EACD,EAAE,CACH,EAEK,KAAoB,MAAqB;AAM7C,EALI,IAAW,KAAQ,GAAM,SAAS,SACpC,GAAY,MAAS,CAAC,GAAG,GAAM,EAAK,SAAS,OAAiB,CAAC,GACtD,IAAW,KACpB,GAAY,MAAS,EAAK,MAAM,GAAG,GAAG,CAAC,EAEzC,EAAQ,EAAS;;AAGnB,KAAI,EAAW,QAAO,kBAAC,GAAD,EAAa,OAAM,oBAAqB,CAAA;AAC9D,KAAI,EACF,QAAO,kBAAC,GAAD;EAAW,OAAM;EAAyB,SAAS,EAAM;EAAS,SAAS;EAAW,CAAA;CAE/F,IAAM,IAAO,GAAM,SAAS,EAAE;AAE9B,QACE,kBAAC,GAAD;EAAS,OAAM;EAAiB,aAAY;YAA5C,CACE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IACE,SAAS;IACT,OAAO;IACP,WAAW,MAAM;AAGf,KAFA,EAAU,EAAE,EACZ,EAAQ,EAAE,EACV,EAAW,EAAE,CAAC;;IAEhB,CAAA;GACE,CAAA,EACL,EAAK,WAAW,IACf,kBAAC,GAAD;GACE,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;GAC5B,OAAM;GACN,aAAa,gBAAgB,MAAW,QAAQ,KAAK,EAAO,aAAa,CAAC;GAC1E,CAAA,GAEF,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;GACW;GACH;GACN,SAAS,MAAM,EAAE;GACjB,aAAa;IAAE,KAAK;IAAW,KAAK;IAAQ;GAC5C,CAAA,EACF,kBAAC,GAAD;GACQ;GACN,UAAU;GACV,WAAW,EAAK;GAChB,SAAS,GAAM,SAAS,WAAW;GACnC,cAAc;GACd,CAAA,CACD,EAAA,CAAA,CAEG;;;AAQd,SAAS,IAAmB;CAC1B,IAAM,CAAC,GAAkB,KAAuB,EAAiB,GAAG,EAE9D,EACJ,MAAM,GACN,WAAW,GACX,OAAO,MACL,EAAc;EAChB,QAAQ;EACR,OAAO;EACR,CAAC,EAEI,EACJ,MAAM,GACN,WAAW,GACX,OAAO,MACL,EAAkB,KAAoB,KAAA,EAAU,EAE9C,IAAU,QACR;EACJ;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MACP,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAU;eAA0C,EAAE;KAAU,CAAA,EACnE,kBAAC,KAAD;KAAG,WAAU;eAA+B,EAAE;KAAS,CAAA,CACnD;;GAER,YAAY,MAAM,EAAE,MAAM,aAAa;GACxC;EACD;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MAAM,kBAAC,GAAD,EAAa,QAAQ,EAAE,QAAU,CAAA;GACjD;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO;GACP,SAAS,MAAM,EAAa,EAAE,WAAW,UAAU,EAAE;GACrD,YAAY,MAAM,EAAE,WAAW,UAAU;GAC1C;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO;GACP,SAAS,MAAM,EAAc,EAAE,aAAa;GAC7C;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO;GACP,SAAS,MAAM,EAAa,EAAE,YAAY;GAC3C;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO;GACP,SAAS,MAAO,EAAE,eAAe,IAAI,GAAG,EAAE,aAAa,QAAQ;GAChE;EACF,EACD,EAAE,CACH;AAED,KAAI,EAAgB,QAAO,kBAAC,GAAD,EAAa,OAAM,oBAAqB,CAAA;AACnE,KAAI,EACF,QAAO,kBAAC,GAAD;EAAW,OAAM;EAAyB,SAAS,EAAa;EAAW,CAAA;CAEpF,IAAM,IAAU,GAAa,SAAS,EAAE;AAExC,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,QACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,SAAD;IAAO,SAAQ;IAA0B,WAAU;cAAU;IAErD,CAAA,EACR,kBAAC,UAAD;IACE,IAAG;IACH,OAAO;IACP,WAAW,MAAM,EAAoB,EAAE,OAAO,MAAM;IACpD,WAAU;cAJZ,CAME,kBAAC,UAAD;KAAQ,OAAM;eAAG;KAAyB,CAAA,EACzC,EAAQ,KAAK,MACZ,kBAAC,UAAD;KAAmB,OAAO,EAAE;eACzB,EAAE;KACI,EAFI,EAAE,GAEN,CACT,CACK;MACL;;YAGN,IAME,IACF,kBAAC,GAAD,EAAa,OAAM,wBAAyB,CAAA,GAC1C,IACF,kBAAC,GAAD;GAAW,OAAM;GAA6B,SAAS,EAAiB;GAAW,CAAA,GACjF,GAAa,WAAW,IAC1B,kBAAC,GAAD;GACE,MAAM,kBAAC,GAAD,EAAgB,MAAM,IAAM,CAAA;GAClC,OAAM;GACN,aAAY;GACZ,CAAA,GAEF,kBAAC,GAAD;GACW;GACT,MAAM,KAAe,EAAE;GACvB,SAAS,MAAM,EAAE;GACjB,aAAa;IAAE,KAAK;IAAS,KAAK;IAAO;GACzC,CAAA,GArBF,kBAAC,GAAD;GACE,MAAM,kBAAC,GAAD,EAAgB,MAAM,IAAM,CAAA;GAClC,OAAM;GACN,aAAY;GACZ,CAAA;EAmBI,CAAA;;AAQd,SAAS,IAAmB;CAC1B,IAAM,CAAC,GAAQ,KAAa,EAAsC,MAAM,EAClE,CAAC,GAAM,KAAW,EAAS,EAAE,EAC7B,CAAC,GAAS,KAAc,EAAmB,EAAE,CAAC,EAE9C,IAAS,IAAO,IAAI,EAAQ,IAAO,KAAK,KAAA,GACxC,EAAE,SAAM,cAAW,UAAO,eAAY,EAAkB;EAC5D,QAAQ,MAAW,QAAQ,KAAA,IAAY;EACvC;EACA,OAAO;EACR,CAAC,EAEI,IAAU,QACR;EACJ;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MAAM,kBAAC,QAAD;IAAM,WAAU;cAAyC,EAAE;IAAiB,CAAA;GAC5F;EACD;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MAAM,kBAAC,QAAD;IAAM,WAAU;cAAyC,EAAE;IAAgB,CAAA;GAC3F;EACD;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MAAM,kBAAC,GAAD,EAAa,QAAQ,EAAE,QAAU,CAAA;GACjD;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO;GACP,SAAS,MAAM,EAAc,EAAE,YAAY;GAC3C,YAAY,MAAM,EAAE;GACrB;EACD;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MAAM,EAAE,QAAQ,QAAQ;GAClC;EACD;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MAAM,EAAe,EAAE,WAAW;GAC3C,YAAY,MAAM,IAAI,KAAK,EAAE,WAAW,CAAC,SAAS;GAClD,cAAc;GACf;EACD;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MAAO,EAAE,eAAe,EAAmB,EAAE,aAAa,GAAG;GACtE,YAAY,MAAO,EAAE,eAAe,IAAI,KAAK,EAAE,aAAa,CAAC,SAAS,GAAG;GACzE,cAAc;GACf;EACF,EACD,EAAE,CACH,EAEK,KAAoB,MAAqB;AAM7C,EALI,IAAW,KAAQ,GAAM,SAAS,SACpC,GAAY,MAAS,CAAC,GAAG,GAAM,EAAK,SAAS,OAAiB,CAAC,GACtD,IAAW,KACpB,GAAY,MAAS,EAAK,MAAM,GAAG,GAAG,CAAC,EAEzC,EAAQ,EAAS;;AAGnB,KAAI,EAAW,QAAO,kBAAC,GAAD,EAAa,OAAM,wBAAyB,CAAA;AAClE,KAAI,EACF,QACE,kBAAC,GAAD;EAAW,OAAM;EAA6B,SAAS,EAAM;EAAS,SAAS;EAAW,CAAA;CAG9F,IAAM,IAAO,GAAM,SAAS,EAAE;AAE9B,QACE,kBAAC,GAAD;EAAS,OAAM;EAAc,aAAY;YAAzC,CACE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IACE,SAAS;IACT,OAAO;IACP,WAAW,MAAM;AAGf,KAFA,EAAU,EAAE,EACZ,EAAQ,EAAE,EACV,EAAW,EAAE,CAAC;;IAEhB,CAAA;GACE,CAAA,EACL,EAAK,WAAW,IACf,kBAAC,GAAD;GACE,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;GACzB,OAAM;GACN,aAAa,gBAAgB,MAAW,QAAQ,KAAK,EAAO,aAAa,CAAC;GAC1E,CAAA,GAEF,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;GACW;GACH;GACN,SAAS,MAAM,EAAE;GACjB,aAAa;IAAE,KAAK;IAAY,KAAK;IAAQ;GAC7C,CAAA,EACF,kBAAC,GAAD;GACQ;GACN,UAAU;GACV,WAAW,EAAK;GAChB,SAAS,GAAM,SAAS,WAAW;GACnC,cAAc;GACd,CAAA,CACD,EAAA,CAAA,CAEG;;;AAKd,SAAS,EAAmB,GAA6B;CACvD,IAAM,IAAI,OAAO,KAAS,WAAW,IAAI,KAAK,EAAK,GAAG,GAChD,oBAAM,IAAI,MAAM,EAChB,IAAS,EAAE,SAAS,GAAG,EAAI,SAAS,EACpC,IAAS,KAAU,GACnB,IAAa,KAAK,MAAM,KAAK,IAAI,EAAO,GAAG,IAAK,EAChD,IAAU,KAAK,MAAM,IAAa,GAAG,EACrC,IAAQ,KAAK,MAAM,IAAU,GAAG,EAChC,IAAO,KAAK,MAAM,IAAQ,GAAG,EAC7B,KAAU,GAAe,MAAiB;EAC9C,IAAM,IAAQ,GAAG,EAAM,GAAG,IAAO,MAAU,IAAU,KAAN;AAC/C,SAAO,IAAS,MAAM,MAAU,GAAG,EAAM;;AAK3C,QAHI,IAAa,KAAW,IAAS,SAAS,aAC1C,IAAU,KAAW,EAAO,GAAS,MAAM,GAC3C,IAAQ,KAAW,EAAO,GAAO,OAAO,GACrC,EAAO,GAAM,MAAM;;AAO5B,SAAS,IAAmB;CAC1B,IAAM,CAAC,GAAQ,KAAa,EAAsC,MAAM,EAClE,CAAC,GAAM,KAAW,EAAS,EAAE,EAC7B,CAAC,GAAS,KAAc,EAAmB,EAAE,CAAC,EAE9C,IAAS,IAAO,IAAI,EAAQ,IAAO,KAAK,KAAA,GACxC,EAAE,SAAM,cAAW,UAAO,eAAY,EAAkB;EAC5D,QAAQ,MAAW,QAAQ,KAAA,IAAY;EACvC;EACA,OAAO;EACR,CAAC,EAEI,IAAU,QACR;EACJ;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MAAM,kBAAC,QAAD;IAAM,WAAU;cAAyC,EAAE;IAAiB,CAAA;GAC5F;EACD;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MACP,kBAAC,QAAD;IAAM,WAAU;cAAyC,EAAE;IAAoB,CAAA;GAElF;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO;GACP,SAAS,MAAM,EAAa,EAAE,QAAQ;GACvC;EACD;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MAAM,kBAAC,GAAD,EAAa,QAAQ,EAAE,QAAU,CAAA;GACjD;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO;GACP,SAAS,MAAO,EAAE,SAAS,OAAO,MAAM,EAAc,EAAE,MAAM;GAC9D,YAAY,MAAM,EAAE,SAAS;GAC9B;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO;GACP,SAAS,MAAO,EAAE,UAAU,OAAO,MAAM,EAAE,SAAS,QAAQ;GAC7D;EACD;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MAAO,EAAE,cAAc,EAAe,EAAE,YAAY,GAAG;GAChE,YAAY,MAAO,EAAE,cAAc,IAAI,KAAK,EAAE,YAAY,CAAC,SAAS,GAAG;GACvE,cAAc;GACf;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO;GACP,cACE,kBAAC,GAAD;IAAQ,SAAQ;IAAQ,MAAK;IAAK,UAAA;cAAS;IAElC,CAAA;GAEZ;EACF,EACD,EAAE,CACH,EAEK,KAAoB,MAAqB;AAM7C,EALI,IAAW,KAAQ,GAAM,SAAS,SACpC,GAAY,MAAS,CAAC,GAAG,GAAM,EAAK,SAAS,OAAiB,CAAC,GACtD,IAAW,KACpB,GAAY,MAAS,EAAK,MAAM,GAAG,GAAG,CAAC,EAEzC,EAAQ,EAAS;;AAGnB,KAAI,EAAW,QAAO,kBAAC,GAAD,EAAa,OAAM,wBAAyB,CAAA;AAClE,KAAI,EACF,QACE,kBAAC,GAAD;EAAW,OAAM;EAA6B,SAAS,EAAM;EAAS,SAAS;EAAW,CAAA;CAG9F,IAAM,IAAO,GAAM,SAAS,EAAE;AAE9B,QACE,kBAAC,GAAD;EAAS,OAAM;EAAoB,aAAY;YAA/C,CACE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IACE,SAAS;IACT,OAAO;IACP,WAAW,MAAM;AAGf,KAFA,EAAU,EAAE,EACZ,EAAQ,EAAE,EACV,EAAW,EAAE,CAAC;;IAEhB,CAAA;GACE,CAAA,EACL,EAAK,WAAW,IACf,kBAAC,GAAD;GACE,MAAM,kBAAC,GAAD,EAAa,MAAM,IAAM,CAAA;GAC/B,OAAM;GACN,aAAa,gBAAgB,MAAW,QAAQ,KAAK,EAAO,aAAa,CAAC;GAC1E,CAAA,GAEF,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;GACW;GACH;GACN,SAAS,MAAM,EAAE;GACjB,aAAa;IAAE,KAAK;IAAa,KAAK;IAAQ;GAC9C,CAAA,EACF,kBAAC,GAAD;GACQ;GACN,UAAU;GACV,WAAW,EAAK;GAChB,SAAS,GAAM,SAAS,WAAW;GACnC,cAAc;GACd,CAAA,CACD,EAAA,CAAA,CAEG;;;AAQd,SAAS,IAA0B;CACjC,IAAM,CAAC,GAAW,KAAgB,EAAmB,UAAU,EAEzD,IAAO,QACL;EACJ;GAAE,OAAO;GAAoB,OAAO;GAAW,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;GAAE;EAC7E;GAAE,OAAO;GAAwB,OAAO;GAAe,MAAM,kBAAC,GAAD,EAAgB,MAAM,IAAM,CAAA;GAAE;EAC3F;GAAE,OAAO;GAAwB,OAAO;GAAe,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;GAAE;EAClF;GAAE,OAAO;GAAwB,OAAO;GAAe,MAAM,kBAAC,GAAD,EAAa,MAAM,IAAM,CAAA;GAAE;EACzF,EACD,EAAE,CACH;AAED,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,QAAD;GAAM,WAAU;aAAhB,CACE,kBAAC,GAAD,EAAe,MAAM,IAAM,CAAA,EAAA,mBAEtB;;YAPX,CAUE,kBAAC,GAAD;GAAM,OAAO;GAAM,OAAO;GAAW,WAAW,MAAM,EAAa,EAAE;GAAI,CAAA,EACzE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACG,MAAc,aAAa,kBAAC,GAAD,EAAgB,CAAA;IAC3C,MAAc,iBAAiB,kBAAC,GAAD,EAAoB,CAAA;IACnD,MAAc,iBAAiB,kBAAC,GAAD,EAAoB,CAAA;IACnD,MAAc,iBAAiB,kBAAC,GAAD,EAAoB,CAAA;IAChD;KACK;;;AAIjB,IAAa,KAAmD,MAAU;CAGxE,IAAM,IAAoC;AAE1C,QACE,kBAAC,GAAD;EAAqB,QAAQ;YAC3B,kBAAC,GAAD;GACE,aAAa,EAAM,eAAe;GAClC,SAAQ;GACR,gBAAgB;aAEhB,kBAAC,GAAD;IAAmB,GAAI;cACrB,kBAAC,GAAD,EAA2B,CAAA;IACT,CAAA;GACA,CAAA;EACF,CAAA"}
@@ -3,6 +3,7 @@
3
3
  * @module buildmyiq
4
4
  */
5
5
  export { BuildmyiqRoot, BuildmyiqRoot as BuildMyIQRoot } from './BuildmyiqRoot';
6
+ export { BuildmyiqAdminRoot, BuildmyiqAdminRoot as BuildMyIQAdminRoot, type BuildmyiqAdminRootProps, } from './BuildmyiqAdminRoot';
6
7
  export type { BuildmyiqRootProps, NavItem, FooterItem, TrendDirection } from './types';
7
8
  export { BuildmyiqProvider, useBuildmyiq } from './context';
8
9
  export { cn, joinPath, formatDate, formatDateTime, formatRelativeTime, formatNumber, formatQuantity, formatPercent, formatDuration, formatHours, formatEnumLabel, formatPersonName, } from './utils';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/buildmyiq/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,aAAa,EAAE,aAAa,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhF,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGvF,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG5D,OAAO,EACL,EAAE,EACF,QAAQ,EACR,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,eAAe,EACf,gBAAgB,GACjB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/buildmyiq/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,aAAa,EAAE,aAAa,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,IAAI,kBAAkB,EACxC,KAAK,uBAAuB,GAC7B,MAAM,sBAAsB,CAAC;AAG9B,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGvF,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG5D,OAAO,EACL,EAAE,EACF,QAAQ,EACR,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,eAAe,EACf,gBAAgB,GACjB,MAAM,SAAS,CAAC"}
@@ -4,3 +4,4 @@ import "./context/index.js";
4
4
  import "./utils/cn.js";
5
5
  import "./utils/formatters.js";
6
6
  import "./BuildmyiqRoot.js";
7
+ import "./BuildmyiqAdminRoot.js";
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@ import { BuildmyiqProvider as t, useBuildmyiq as n } from "./buildmyiq/context/B
3
3
  import { cn as r } from "./buildmyiq/utils/cn.js";
4
4
  import { formatDate as i, formatDateTime as a, formatDuration as o, formatEnumLabel as s, formatHours as c, formatNumber as l, formatPercent as u, formatPersonName as d, formatQuantity as f, formatRelativeTime as p } from "./buildmyiq/utils/formatters.js";
5
5
  import { BuildmyiqRoot as m } from "./buildmyiq/BuildmyiqRoot.js";
6
+ import { BuildmyiqAdminRoot as h } from "./buildmyiq/BuildmyiqAdminRoot.js";
6
7
  import "./buildmyiq/index.js";
7
- import { useSandboxAssistantTransport as h } from "./services/createSandboxAssistantTransport.js";
8
- export { m as BuildMyIQRoot, t as BuildmyiqProvider, m as BuildmyiqRoot, r as cn, i as formatDate, a as formatDateTime, o as formatDuration, s as formatEnumLabel, c as formatHours, l as formatNumber, u as formatPercent, d as formatPersonName, f as formatQuantity, p as formatRelativeTime, e as joinPath, n as useBuildmyiq, h as useSandboxAssistantTransport };
8
+ import { useSandboxAssistantTransport as g } from "./services/createSandboxAssistantTransport.js";
9
+ export { h as BuildMyIQAdminRoot, m as BuildMyIQRoot, h as BuildmyiqAdminRoot, t as BuildmyiqProvider, m as BuildmyiqRoot, r as cn, i as formatDate, a as formatDateTime, o as formatDuration, s as formatEnumLabel, c as formatHours, l as formatNumber, u as formatPercent, d as formatPersonName, f as formatQuantity, p as formatRelativeTime, e as joinPath, n as useBuildmyiq, g as useSandboxAssistantTransport };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-buildmyiq",
3
- "version": "2026.713.1",
3
+ "version": "2026.715.2",
4
4
  "description": "Burdenoff BuildMyIQ Microfrontend — education, learning & development",
5
5
  "type": "module",
6
6
  "files": [