@burdenoff/microfe-buildmyiq 2026.705.9 → 2026.705.11

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 (29) hide show
  1. package/dist/buildmyiq/BuildmyiqRoot.js +54 -46
  2. package/dist/buildmyiq/BuildmyiqRoot.js.map +1 -1
  3. package/dist/buildmyiq/BuildmyiqRoutes.js +19 -11
  4. package/dist/buildmyiq/BuildmyiqRoutes.js.map +1 -1
  5. package/dist/buildmyiq/components/DataTable.js +1 -1
  6. package/dist/buildmyiq/components/DataTable.js.map +1 -1
  7. package/dist/buildmyiq/components/MiniBar.js +1 -1
  8. package/dist/buildmyiq/components/MiniBar.js.map +1 -1
  9. package/dist/buildmyiq/hooks/useBuildmyiqApi.js +23 -15
  10. package/dist/buildmyiq/hooks/useBuildmyiqApi.js.map +1 -1
  11. package/dist/buildmyiq/pages/DashboardPage.js +2 -2
  12. package/dist/buildmyiq/pages/DashboardPage.js.map +1 -1
  13. package/dist/buildmyiq/pages/assessments/TakeAssessmentPage.js +264 -0
  14. package/dist/buildmyiq/pages/assessments/TakeAssessmentPage.js.map +1 -0
  15. package/dist/buildmyiq/pages/authoring/AuthoringPage.js +4 -4
  16. package/dist/buildmyiq/pages/authoring/AuthoringPage.js.map +1 -1
  17. package/dist/buildmyiq/pages/authoring/_forms.js +15 -15
  18. package/dist/buildmyiq/pages/authoring/_forms.js.map +1 -1
  19. package/dist/buildmyiq/pages/catalog/CourseDetailPage.js +9 -1
  20. package/dist/buildmyiq/pages/catalog/CourseDetailPage.js.map +1 -1
  21. package/dist/buildmyiq/pages/certificates/CertificatesPage.js +1 -1
  22. package/dist/buildmyiq/pages/certificates/CertificatesPage.js.map +1 -1
  23. package/dist/buildmyiq/pages/cohorts/CohortsPage.js +1 -1
  24. package/dist/buildmyiq/pages/cohorts/CohortsPage.js.map +1 -1
  25. package/dist/buildmyiq/pages/insights/InsightsPage.js +242 -0
  26. package/dist/buildmyiq/pages/insights/InsightsPage.js.map +1 -0
  27. package/dist/buildmyiq/pages/learning/MyLearningPage.js +83 -77
  28. package/dist/buildmyiq/pages/learning/MyLearningPage.js.map +1 -1
  29. package/package.json +1 -1
@@ -5,119 +5,127 @@ import { useCallback as r, useEffect as i } from "react";
5
5
  import { QueryClient as a, QueryClientProvider as o } from "@tanstack/react-query";
6
6
  import { FeatureFlagProvider as s } from "@burdenoff/fe-libs/shared/feature-flags";
7
7
  import { useI18n as c } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
- import { Award as l, BookOpen as u, CheckSquare as d, ClipboardCheck as f, GraduationCap as p, LayoutDashboard as m, PencilRuler as h, Target as g, Users as _ } from "lucide-react";
9
- import { jsx as v } from "react/jsx-runtime";
8
+ import { Award as l, BookOpen as u, CheckSquare as d, ClipboardCheck as f, GraduationCap as p, LayoutDashboard as m, LineChart as h, PencilRuler as g, Target as _, Users as v } from "lucide-react";
9
+ import { jsx as y } from "react/jsx-runtime";
10
10
  //#region src/buildmyiq/BuildmyiqRoot.tsx
11
- var y = new a({ defaultOptions: { queries: {
11
+ var b = new a({ defaultOptions: { queries: {
12
12
  staleTime: 300 * 1e3,
13
13
  retry: 1,
14
14
  refetchOnWindowFocus: !1
15
- } } }), b = (a) => {
16
- let { registerNavItems: b, registerFooterItems: x, basePath: S = "/" } = a, { t: C } = c(), w = r((e, t) => {
17
- let n = C(e);
15
+ } } }), x = (a) => {
16
+ let { registerNavItems: x, registerFooterItems: S, basePath: C = "/" } = a, { t: w } = c(), T = r((e, t) => {
17
+ let n = w(e);
18
18
  return n === e ? t : n;
19
- }, [C]);
19
+ }, [w]);
20
20
  return i(() => {
21
- if (b) return b([
21
+ if (x) return x([
22
22
  {
23
23
  id: "buildmyiq-dashboard",
24
- label: w("buildmyiq.nav.dashboard", "Dashboard"),
25
- path: e(S, ""),
26
- icon: /* @__PURE__ */ v(m, { size: 20 }),
24
+ label: T("buildmyiq.nav.dashboard", "Dashboard"),
25
+ path: e(C, ""),
26
+ icon: /* @__PURE__ */ y(m, { size: 20 }),
27
27
  order: 0,
28
28
  group: "products"
29
29
  },
30
30
  {
31
31
  id: "buildmyiq-catalog",
32
- label: w("buildmyiq.nav.catalog", "Catalog"),
33
- path: e(S, "catalog"),
34
- icon: /* @__PURE__ */ v(u, { size: 20 }),
32
+ label: T("buildmyiq.nav.catalog", "Catalog"),
33
+ path: e(C, "catalog"),
34
+ icon: /* @__PURE__ */ y(u, { size: 20 }),
35
35
  order: 1,
36
36
  group: "products"
37
37
  },
38
38
  {
39
39
  id: "buildmyiq-learning",
40
- label: w("buildmyiq.nav.learning", "My Learning"),
41
- path: e(S, "learning"),
42
- icon: /* @__PURE__ */ v(p, { size: 20 }),
40
+ label: T("buildmyiq.nav.learning", "My Learning"),
41
+ path: e(C, "learning"),
42
+ icon: /* @__PURE__ */ y(p, { size: 20 }),
43
43
  order: 2,
44
44
  group: "products"
45
45
  },
46
46
  {
47
47
  id: "buildmyiq-authoring",
48
- label: w("buildmyiq.nav.authoring", "Authoring"),
49
- path: e(S, "authoring"),
50
- icon: /* @__PURE__ */ v(h, { size: 20 }),
48
+ label: T("buildmyiq.nav.authoring", "Authoring"),
49
+ path: e(C, "authoring"),
50
+ icon: /* @__PURE__ */ y(g, { size: 20 }),
51
51
  order: 3,
52
52
  group: "products"
53
53
  },
54
54
  {
55
55
  id: "buildmyiq-assessments",
56
- label: w("buildmyiq.nav.assessments", "Assessments"),
57
- path: e(S, "assessments"),
58
- icon: /* @__PURE__ */ v(f, { size: 20 }),
56
+ label: T("buildmyiq.nav.assessments", "Assessments"),
57
+ path: e(C, "assessments"),
58
+ icon: /* @__PURE__ */ y(f, { size: 20 }),
59
59
  order: 4,
60
60
  group: "products"
61
61
  },
62
62
  {
63
63
  id: "buildmyiq-submissions",
64
- label: w("buildmyiq.nav.submissions", "Grading"),
65
- path: e(S, "submissions"),
66
- icon: /* @__PURE__ */ v(d, { size: 20 }),
64
+ label: T("buildmyiq.nav.submissions", "Grading"),
65
+ path: e(C, "submissions"),
66
+ icon: /* @__PURE__ */ y(d, { size: 20 }),
67
67
  order: 5,
68
68
  group: "products"
69
69
  },
70
70
  {
71
71
  id: "buildmyiq-cohorts",
72
- label: w("buildmyiq.nav.cohorts", "Cohorts"),
73
- path: e(S, "cohorts"),
74
- icon: /* @__PURE__ */ v(_, { size: 20 }),
72
+ label: T("buildmyiq.nav.cohorts", "Cohorts"),
73
+ path: e(C, "cohorts"),
74
+ icon: /* @__PURE__ */ y(v, { size: 20 }),
75
75
  order: 6,
76
76
  group: "products"
77
77
  },
78
78
  {
79
79
  id: "buildmyiq-skills",
80
- label: w("buildmyiq.nav.skills", "Skills"),
81
- path: e(S, "skills"),
82
- icon: /* @__PURE__ */ v(g, { size: 20 }),
80
+ label: T("buildmyiq.nav.skills", "Skills"),
81
+ path: e(C, "skills"),
82
+ icon: /* @__PURE__ */ y(_, { size: 20 }),
83
83
  order: 7,
84
84
  group: "products"
85
85
  },
86
86
  {
87
87
  id: "buildmyiq-certificates",
88
- label: w("buildmyiq.nav.certificates", "Certificates"),
89
- path: e(S, "certificates"),
90
- icon: /* @__PURE__ */ v(l, { size: 20 }),
88
+ label: T("buildmyiq.nav.certificates", "Certificates"),
89
+ path: e(C, "certificates"),
90
+ icon: /* @__PURE__ */ y(l, { size: 20 }),
91
91
  order: 8,
92
92
  group: "products"
93
+ },
94
+ {
95
+ id: "buildmyiq-insights",
96
+ label: T("buildmyiq.nav.insights", "Insights"),
97
+ path: e(C, "insights"),
98
+ icon: /* @__PURE__ */ y(h, { size: 20 }),
99
+ order: 9,
100
+ group: "products"
93
101
  }
94
102
  ]);
95
103
  }, [
96
- b,
97
- S,
98
- w
104
+ x,
105
+ C,
106
+ T
99
107
  ]), i(() => {
100
- if (x) return x([{
108
+ if (S) return S([{
101
109
  id: "buildmyiq-status",
102
- label: w("buildmyiq.footer.ready", "BuildMyIQ Ready"),
110
+ label: T("buildmyiq.footer.ready", "BuildMyIQ Ready"),
103
111
  type: "status",
104
112
  section: "left",
105
113
  order: 10
106
114
  }]);
107
- }, [x, w]), /* @__PURE__ */ v(o, {
108
- client: y,
109
- children: /* @__PURE__ */ v(s, {
115
+ }, [S, T]), /* @__PURE__ */ y(o, {
116
+ client: b,
117
+ children: /* @__PURE__ */ y(s, {
110
118
  workspaceId: null,
111
119
  gateway: "global",
112
120
  defaultEnabled: !0,
113
- children: /* @__PURE__ */ v(t, {
121
+ children: /* @__PURE__ */ y(t, {
114
122
  ...a,
115
- children: /* @__PURE__ */ v(n, {})
123
+ children: /* @__PURE__ */ y(n, {})
116
124
  })
117
125
  })
118
126
  });
119
127
  };
120
128
  //#endregion
121
- export { b as BuildmyiqRoot };
129
+ export { x as BuildmyiqRoot };
122
130
 
123
131
  //# sourceMappingURL=BuildmyiqRoot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BuildmyiqRoot.js","names":[],"sources":["../../src/buildmyiq/BuildmyiqRoot.tsx"],"sourcesContent":["/**\n * Buildmyiq Root Component\n * @module buildmyiq\n *\n * Host-contract entry point. Registers the product's sidebar nav (nine sections\n * that map 1:1 to the wspace-buildmyiq-svc `bui*` backend) and mounts the routed\n * pages inside the shared QueryClient + FeatureFlag providers.\n */\n\nimport type { FC } from 'react';\nimport { useCallback, useEffect } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n LayoutDashboard,\n BookOpen,\n GraduationCap,\n PencilRuler,\n ClipboardCheck,\n CheckSquare,\n Users,\n Target,\n Award,\n} from 'lucide-react';\nimport { BuildmyiqProvider } from './context/BuildmyiqContext';\nimport { BuildmyiqRoutes } from './BuildmyiqRoutes';\nimport { joinPath } from './utils/navigation';\nimport type { BuildmyiqRootProps, NavItem } from './types';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n refetchOnWindowFocus: false,\n },\n },\n});\n\nexport const BuildmyiqRoot: FC<BuildmyiqRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/' } = props;\n const { t: translate } = useI18n();\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n // Register navigation items with the shell on mount. Ids/paths/orders match\n // the app-shell static NavRegistration block so the two are a single,\n // consistent source of truth.\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'buildmyiq-dashboard',\n label: t('buildmyiq.nav.dashboard', 'Dashboard'),\n path: joinPath(basePath, ''),\n icon: <LayoutDashboard size={20} />,\n order: 0,\n group: 'products',\n },\n {\n id: 'buildmyiq-catalog',\n label: t('buildmyiq.nav.catalog', 'Catalog'),\n path: joinPath(basePath, 'catalog'),\n icon: <BookOpen size={20} />,\n order: 1,\n group: 'products',\n },\n {\n id: 'buildmyiq-learning',\n label: t('buildmyiq.nav.learning', 'My Learning'),\n path: joinPath(basePath, 'learning'),\n icon: <GraduationCap size={20} />,\n order: 2,\n group: 'products',\n },\n {\n id: 'buildmyiq-authoring',\n label: t('buildmyiq.nav.authoring', 'Authoring'),\n path: joinPath(basePath, 'authoring'),\n icon: <PencilRuler size={20} />,\n order: 3,\n group: 'products',\n },\n {\n id: 'buildmyiq-assessments',\n label: t('buildmyiq.nav.assessments', 'Assessments'),\n path: joinPath(basePath, 'assessments'),\n icon: <ClipboardCheck size={20} />,\n order: 4,\n group: 'products',\n },\n {\n id: 'buildmyiq-submissions',\n label: t('buildmyiq.nav.submissions', 'Grading'),\n path: joinPath(basePath, 'submissions'),\n icon: <CheckSquare size={20} />,\n order: 5,\n group: 'products',\n },\n {\n id: 'buildmyiq-cohorts',\n label: t('buildmyiq.nav.cohorts', 'Cohorts'),\n path: joinPath(basePath, 'cohorts'),\n icon: <Users size={20} />,\n order: 6,\n group: 'products',\n },\n {\n id: 'buildmyiq-skills',\n label: t('buildmyiq.nav.skills', 'Skills'),\n path: joinPath(basePath, 'skills'),\n icon: <Target size={20} />,\n order: 7,\n group: 'products',\n },\n {\n id: 'buildmyiq-certificates',\n label: t('buildmyiq.nav.certificates', 'Certificates'),\n path: joinPath(basePath, 'certificates'),\n icon: <Award size={20} />,\n order: 8,\n group: 'products',\n },\n ];\n\n return registerNavItems(navItems);\n }, [registerNavItems, basePath, t]);\n\n useEffect(() => {\n if (!registerFooterItems) return;\n return registerFooterItems([\n {\n id: 'buildmyiq-status',\n label: t('buildmyiq.footer.ready', 'BuildMyIQ Ready'),\n type: 'status',\n section: 'left',\n order: 10,\n },\n ]);\n }, [registerFooterItems, t]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <BuildmyiqProvider {...props}>\n <BuildmyiqRoutes />\n </BuildmyiqProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n );\n};\n"],"mappings":";;;;;;;;;;AA8BA,IAAM,IAAc,IAAI,EAAY,EAClC,gBAAgB,EACd,SAAS;CACP,WAAW,MAAS;CACpB,OAAO;CACP,sBAAsB;CACvB,EACF,EACF,CAAC,EAEW,KAAyC,MAAU;CAC9D,IAAM,EAAE,qBAAkB,wBAAqB,cAAW,QAAQ,GAC5D,EAAE,GAAG,MAAc,GAAS,EAC5B,IAAI,GACP,GAAa,MAA6B;EACzC,IAAM,IAAQ,EAAU,EAAI;AAC5B,SAAO,MAAU,IAAM,IAAW;IAEpC,CAAC,EAAU,CACZ;AAmGD,QA9FA,QAAgB;AACT,QA6EL,QAAO,EA3EqB;GAC1B;IACE,IAAI;IACJ,OAAO,EAAE,2BAA2B,YAAY;IAChD,MAAM,EAAS,GAAU,GAAG;IAC5B,MAAM,kBAAC,GAAD,EAAiB,MAAM,IAAM,CAAA;IACnC,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,yBAAyB,UAAU;IAC5C,MAAM,EAAS,GAAU,UAAU;IACnC,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;IAC5B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,0BAA0B,cAAc;IACjD,MAAM,EAAS,GAAU,WAAW;IACpC,MAAM,kBAAC,GAAD,EAAe,MAAM,IAAM,CAAA;IACjC,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,2BAA2B,YAAY;IAChD,MAAM,EAAS,GAAU,YAAY;IACrC,MAAM,kBAAC,GAAD,EAAa,MAAM,IAAM,CAAA;IAC/B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,6BAA6B,cAAc;IACpD,MAAM,EAAS,GAAU,cAAc;IACvC,MAAM,kBAAC,GAAD,EAAgB,MAAM,IAAM,CAAA;IAClC,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,6BAA6B,UAAU;IAChD,MAAM,EAAS,GAAU,cAAc;IACvC,MAAM,kBAAC,GAAD,EAAa,MAAM,IAAM,CAAA;IAC/B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,yBAAyB,UAAU;IAC5C,MAAM,EAAS,GAAU,UAAU;IACnC,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,wBAAwB,SAAS;IAC1C,MAAM,EAAS,GAAU,SAAS;IAClC,MAAM,kBAAC,GAAD,EAAQ,MAAM,IAAM,CAAA;IAC1B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,8BAA8B,eAAe;IACtD,MAAM,EAAS,GAAU,eAAe;IACxC,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GACF,CAEgC;IAChC;EAAC;EAAkB;EAAU;EAAE,CAAC,EAEnC,QAAgB;AACT,QACL,QAAO,EAAoB,CACzB;GACE,IAAI;GACJ,OAAO,EAAE,0BAA0B,kBAAkB;GACrD,MAAM;GACN,SAAS;GACT,OAAO;GACR,CACF,CAAC;IACD,CAAC,GAAqB,EAAE,CAAC,EAG1B,kBAAC,GAAD;EAAqB,QAAQ;YAC3B,kBAAC,GAAD;GAAqB,aAAa;GAAM,SAAQ;GAAS,gBAAgB;aACvE,kBAAC,GAAD;IAAmB,GAAI;cACrB,kBAAC,GAAD,EAAmB,CAAA;IACD,CAAA;GACA,CAAA;EACF,CAAA"}
1
+ {"version":3,"file":"BuildmyiqRoot.js","names":[],"sources":["../../src/buildmyiq/BuildmyiqRoot.tsx"],"sourcesContent":["/**\n * Buildmyiq Root Component\n * @module buildmyiq\n *\n * Host-contract entry point. Registers the product's sidebar nav (nine sections\n * that map 1:1 to the wspace-buildmyiq-svc `bui*` backend) and mounts the routed\n * pages inside the shared QueryClient + FeatureFlag providers.\n */\n\nimport type { FC } from 'react';\nimport { useCallback, useEffect } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n LayoutDashboard,\n BookOpen,\n GraduationCap,\n PencilRuler,\n ClipboardCheck,\n CheckSquare,\n Users,\n Target,\n Award,\n LineChart,\n} from 'lucide-react';\nimport { BuildmyiqProvider } from './context/BuildmyiqContext';\nimport { BuildmyiqRoutes } from './BuildmyiqRoutes';\nimport { joinPath } from './utils/navigation';\nimport type { BuildmyiqRootProps, NavItem } from './types';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n refetchOnWindowFocus: false,\n },\n },\n});\n\nexport const BuildmyiqRoot: FC<BuildmyiqRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/' } = props;\n const { t: translate } = useI18n();\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n // Register navigation items with the shell on mount. Ids/paths/orders match\n // the app-shell static NavRegistration block so the two are a single,\n // consistent source of truth.\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'buildmyiq-dashboard',\n label: t('buildmyiq.nav.dashboard', 'Dashboard'),\n path: joinPath(basePath, ''),\n icon: <LayoutDashboard size={20} />,\n order: 0,\n group: 'products',\n },\n {\n id: 'buildmyiq-catalog',\n label: t('buildmyiq.nav.catalog', 'Catalog'),\n path: joinPath(basePath, 'catalog'),\n icon: <BookOpen size={20} />,\n order: 1,\n group: 'products',\n },\n {\n id: 'buildmyiq-learning',\n label: t('buildmyiq.nav.learning', 'My Learning'),\n path: joinPath(basePath, 'learning'),\n icon: <GraduationCap size={20} />,\n order: 2,\n group: 'products',\n },\n {\n id: 'buildmyiq-authoring',\n label: t('buildmyiq.nav.authoring', 'Authoring'),\n path: joinPath(basePath, 'authoring'),\n icon: <PencilRuler size={20} />,\n order: 3,\n group: 'products',\n },\n {\n id: 'buildmyiq-assessments',\n label: t('buildmyiq.nav.assessments', 'Assessments'),\n path: joinPath(basePath, 'assessments'),\n icon: <ClipboardCheck size={20} />,\n order: 4,\n group: 'products',\n },\n {\n id: 'buildmyiq-submissions',\n label: t('buildmyiq.nav.submissions', 'Grading'),\n path: joinPath(basePath, 'submissions'),\n icon: <CheckSquare size={20} />,\n order: 5,\n group: 'products',\n },\n {\n id: 'buildmyiq-cohorts',\n label: t('buildmyiq.nav.cohorts', 'Cohorts'),\n path: joinPath(basePath, 'cohorts'),\n icon: <Users size={20} />,\n order: 6,\n group: 'products',\n },\n {\n id: 'buildmyiq-skills',\n label: t('buildmyiq.nav.skills', 'Skills'),\n path: joinPath(basePath, 'skills'),\n icon: <Target size={20} />,\n order: 7,\n group: 'products',\n },\n {\n id: 'buildmyiq-certificates',\n label: t('buildmyiq.nav.certificates', 'Certificates'),\n path: joinPath(basePath, 'certificates'),\n icon: <Award size={20} />,\n order: 8,\n group: 'products',\n },\n {\n id: 'buildmyiq-insights',\n label: t('buildmyiq.nav.insights', 'Insights'),\n path: joinPath(basePath, 'insights'),\n icon: <LineChart size={20} />,\n order: 9,\n group: 'products',\n },\n ];\n\n return registerNavItems(navItems);\n }, [registerNavItems, basePath, t]);\n\n useEffect(() => {\n if (!registerFooterItems) return;\n return registerFooterItems([\n {\n id: 'buildmyiq-status',\n label: t('buildmyiq.footer.ready', 'BuildMyIQ Ready'),\n type: 'status',\n section: 'left',\n order: 10,\n },\n ]);\n }, [registerFooterItems, t]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <BuildmyiqProvider {...props}>\n <BuildmyiqRoutes />\n </BuildmyiqProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n );\n};\n"],"mappings":"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"}
@@ -5,15 +5,15 @@ import { Navigate as i, Route as a, Routes as o, useLocation as s } from "react-
5
5
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
6
6
  import { Spinner as u } from "@burdenoff/fe-libs/ui";
7
7
  //#region src/buildmyiq/BuildmyiqRoutes.tsx
8
- var d = r(() => import("./pages/catalog/CatalogPage.js").then((e) => ({ default: e.CatalogPage }))), f = r(() => import("./pages/catalog/CourseDetailPage.js").then((e) => ({ default: e.CourseDetailPage }))), p = r(() => import("./pages/learning/MyLearningPage.js").then((e) => ({ default: e.MyLearningPage }))), m = r(() => import("./pages/learning/LessonPlayerPage.js").then((e) => ({ default: e.LessonPlayerPage }))), h = r(() => import("./pages/authoring/AuthoringPage.js").then((e) => ({ default: e.AuthoringPage }))), g = r(() => import("./pages/authoring/CourseBuilderPage.js").then((e) => ({ default: e.CourseBuilderPage }))), _ = r(() => import("./pages/assessments/AssessmentsPage.js").then((e) => ({ default: e.AssessmentsPage }))), v = r(() => import("./pages/assessments/AssessmentDetailPage.js").then((e) => ({ default: e.AssessmentDetailPage }))), y = r(() => import("./pages/submissions/SubmissionsPage.js").then((e) => ({ default: e.SubmissionsPage }))), b = r(() => import("./pages/cohorts/CohortsPage.js").then((e) => ({ default: e.CohortsPage }))), x = r(() => import("./pages/skills/SkillsPage.js").then((e) => ({ default: e.SkillsPage }))), S = r(() => import("./pages/certificates/CertificatesPage.js").then((e) => ({ default: e.CertificatesPage }))), C = () => /* @__PURE__ */ c("div", {
8
+ var d = r(() => import("./pages/catalog/CatalogPage.js").then((e) => ({ default: e.CatalogPage }))), f = r(() => import("./pages/catalog/CourseDetailPage.js").then((e) => ({ default: e.CourseDetailPage }))), p = r(() => import("./pages/learning/MyLearningPage.js").then((e) => ({ default: e.MyLearningPage }))), m = r(() => import("./pages/learning/LessonPlayerPage.js").then((e) => ({ default: e.LessonPlayerPage }))), h = r(() => import("./pages/authoring/AuthoringPage.js").then((e) => ({ default: e.AuthoringPage }))), g = r(() => import("./pages/authoring/CourseBuilderPage.js").then((e) => ({ default: e.CourseBuilderPage }))), _ = r(() => import("./pages/assessments/AssessmentsPage.js").then((e) => ({ default: e.AssessmentsPage }))), v = r(() => import("./pages/assessments/AssessmentDetailPage.js").then((e) => ({ default: e.AssessmentDetailPage }))), y = r(() => import("./pages/assessments/TakeAssessmentPage.js").then((e) => ({ default: e.TakeAssessmentPage }))), b = r(() => import("./pages/insights/InsightsPage.js").then((e) => ({ default: e.InsightsPage }))), x = r(() => import("./pages/submissions/SubmissionsPage.js").then((e) => ({ default: e.SubmissionsPage }))), S = r(() => import("./pages/cohorts/CohortsPage.js").then((e) => ({ default: e.CohortsPage }))), C = r(() => import("./pages/skills/SkillsPage.js").then((e) => ({ default: e.SkillsPage }))), w = r(() => import("./pages/certificates/CertificatesPage.js").then((e) => ({ default: e.CertificatesPage }))), T = () => /* @__PURE__ */ c("div", {
9
9
  className: "flex min-h-[400px] items-center justify-center",
10
10
  children: /* @__PURE__ */ c(u, { size: "lg" })
11
- }), w = () => {
12
- let { basePath: r, isStandalone: u } = e(), w = s(), T = r === "/" ? "" : (r ?? "").replace(/\/$/, "");
13
- return T && !u && !(w.pathname === T || w.pathname.startsWith(T + "/")) ? null : /* @__PURE__ */ c("div", {
11
+ }), E = () => {
12
+ let { basePath: r, isStandalone: u } = e(), E = s(), D = r === "/" ? "" : (r ?? "").replace(/\/$/, "");
13
+ return D && !u && !(E.pathname === D || E.pathname.startsWith(D + "/")) ? null : /* @__PURE__ */ c("div", {
14
14
  className: "flex min-h-full flex-col",
15
15
  children: /* @__PURE__ */ c(n, {
16
- fallback: /* @__PURE__ */ c(C, {}),
16
+ fallback: /* @__PURE__ */ c(T, {}),
17
17
  children: /* @__PURE__ */ l(o, { children: [
18
18
  /* @__PURE__ */ c(a, {
19
19
  index: !0,
@@ -52,25 +52,33 @@ var d = r(() => import("./pages/catalog/CatalogPage.js").then((e) => ({ default:
52
52
  element: /* @__PURE__ */ c(v, {})
53
53
  }),
54
54
  /* @__PURE__ */ c(a, {
55
- path: "submissions",
55
+ path: "assessments/:assessmentId/take",
56
56
  element: /* @__PURE__ */ c(y, {})
57
57
  }),
58
58
  /* @__PURE__ */ c(a, {
59
- path: "cohorts",
59
+ path: "insights",
60
60
  element: /* @__PURE__ */ c(b, {})
61
61
  }),
62
62
  /* @__PURE__ */ c(a, {
63
- path: "skills",
63
+ path: "submissions",
64
64
  element: /* @__PURE__ */ c(x, {})
65
65
  }),
66
66
  /* @__PURE__ */ c(a, {
67
- path: "certificates",
67
+ path: "cohorts",
68
68
  element: /* @__PURE__ */ c(S, {})
69
69
  }),
70
+ /* @__PURE__ */ c(a, {
71
+ path: "skills",
72
+ element: /* @__PURE__ */ c(C, {})
73
+ }),
74
+ /* @__PURE__ */ c(a, {
75
+ path: "certificates",
76
+ element: /* @__PURE__ */ c(w, {})
77
+ }),
70
78
  /* @__PURE__ */ c(a, {
71
79
  path: "*",
72
80
  element: /* @__PURE__ */ c(i, {
73
- to: T || "/",
81
+ to: D || "/",
74
82
  replace: !0
75
83
  })
76
84
  })
@@ -79,6 +87,6 @@ var d = r(() => import("./pages/catalog/CatalogPage.js").then((e) => ({ default:
79
87
  });
80
88
  };
81
89
  //#endregion
82
- export { w as BuildmyiqRoutes };
90
+ export { E as BuildmyiqRoutes };
83
91
 
84
92
  //# sourceMappingURL=BuildmyiqRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BuildmyiqRoutes.js","names":[],"sources":["../../src/buildmyiq/BuildmyiqRoutes.tsx"],"sourcesContent":["/**\n * Buildmyiq Routes\n * @module buildmyiq\n *\n * Domain routes. The dashboard is eager-loaded (primary landing); all other\n * pages are lazy-loaded. Every route maps to a real `bui*` backend capability.\n */\n\nimport { type FC, lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router-dom';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { useBuildmyiq } from './context/BuildmyiqContext';\n\n// Eager — primary landing\nimport { DashboardPage } from './pages/DashboardPage';\n\n// Catalog (learner-facing course discovery + detail + enrol)\nconst CatalogPage = lazy(() =>\n import('./pages/catalog/CatalogPage').then((m) => ({ default: m.CatalogPage }))\n);\nconst CourseDetailPage = lazy(() =>\n import('./pages/catalog/CourseDetailPage').then((m) => ({ default: m.CourseDetailPage }))\n);\n\n// My Learning (enrollments + progress + lesson player)\nconst MyLearningPage = lazy(() =>\n import('./pages/learning/MyLearningPage').then((m) => ({ default: m.MyLearningPage }))\n);\nconst LessonPlayerPage = lazy(() =>\n import('./pages/learning/LessonPlayerPage').then((m) => ({ default: m.LessonPlayerPage }))\n);\n\n// Authoring (instructor course management + builder)\nconst AuthoringPage = lazy(() =>\n import('./pages/authoring/AuthoringPage').then((m) => ({ default: m.AuthoringPage }))\n);\nconst CourseBuilderPage = lazy(() =>\n import('./pages/authoring/CourseBuilderPage').then((m) => ({ default: m.CourseBuilderPage }))\n);\n\n// Assessments (list + builder/questions/detail)\nconst AssessmentsPage = lazy(() =>\n import('./pages/assessments/AssessmentsPage').then((m) => ({ default: m.AssessmentsPage }))\n);\nconst AssessmentDetailPage = lazy(() =>\n import('./pages/assessments/AssessmentDetailPage').then((m) => ({\n default: m.AssessmentDetailPage,\n }))\n);\n\n// Grading (submissions queue)\nconst SubmissionsPage = lazy(() =>\n import('./pages/submissions/SubmissionsPage').then((m) => ({ default: m.SubmissionsPage }))\n);\n\n// Cohorts\nconst CohortsPage = lazy(() =>\n import('./pages/cohorts/CohortsPage').then((m) => ({ default: m.CohortsPage }))\n);\n\n// Skills taxonomy\nconst SkillsPage = lazy(() =>\n import('./pages/skills/SkillsPage').then((m) => ({ default: m.SkillsPage }))\n);\n\n// Certificates\nconst CertificatesPage = lazy(() =>\n import('./pages/certificates/CertificatesPage').then((m) => ({ default: m.CertificatesPage }))\n);\n\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n);\n\nexport const BuildmyiqRoutes: FC = () => {\n const { basePath, isStandalone } = useBuildmyiq();\n const location = useLocation();\n\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n // Guard: only render if the current path matches basePath (integrated mode).\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={<DashboardPage />} />\n\n <Route path=\"catalog\" element={<CatalogPage />} />\n <Route path=\"catalog/:courseId\" element={<CourseDetailPage />} />\n\n <Route path=\"learning\" element={<MyLearningPage />} />\n <Route path=\"learning/:enrollmentId\" element={<LessonPlayerPage />} />\n\n <Route path=\"authoring\" element={<AuthoringPage />} />\n <Route path=\"authoring/:courseId\" element={<CourseBuilderPage />} />\n\n <Route path=\"assessments\" element={<AssessmentsPage />} />\n <Route path=\"assessments/:assessmentId\" element={<AssessmentDetailPage />} />\n\n <Route path=\"submissions\" element={<SubmissionsPage />} />\n <Route path=\"cohorts\" element={<CohortsPage />} />\n <Route path=\"skills\" element={<SkillsPage />} />\n <Route path=\"certificates\" element={<CertificatesPage />} />\n\n <Route path=\"*\" element={<Navigate to={normalizedBasePath || '/'} replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"BuildmyiqRoutes.js","names":[],"sources":["../../src/buildmyiq/BuildmyiqRoutes.tsx"],"sourcesContent":["/**\n * Buildmyiq Routes\n * @module buildmyiq\n *\n * Domain routes. The dashboard is eager-loaded (primary landing); all other\n * pages are lazy-loaded. Every route maps to a real `bui*` backend capability.\n */\n\nimport { type FC, lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router-dom';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { useBuildmyiq } from './context/BuildmyiqContext';\n\n// Eager — primary landing\nimport { DashboardPage } from './pages/DashboardPage';\n\n// Catalog (learner-facing course discovery + detail + enrol)\nconst CatalogPage = lazy(() =>\n import('./pages/catalog/CatalogPage').then((m) => ({ default: m.CatalogPage }))\n);\nconst CourseDetailPage = lazy(() =>\n import('./pages/catalog/CourseDetailPage').then((m) => ({ default: m.CourseDetailPage }))\n);\n\n// My Learning (enrollments + progress + lesson player)\nconst MyLearningPage = lazy(() =>\n import('./pages/learning/MyLearningPage').then((m) => ({ default: m.MyLearningPage }))\n);\nconst LessonPlayerPage = lazy(() =>\n import('./pages/learning/LessonPlayerPage').then((m) => ({ default: m.LessonPlayerPage }))\n);\n\n// Authoring (instructor course management + builder)\nconst AuthoringPage = lazy(() =>\n import('./pages/authoring/AuthoringPage').then((m) => ({ default: m.AuthoringPage }))\n);\nconst CourseBuilderPage = lazy(() =>\n import('./pages/authoring/CourseBuilderPage').then((m) => ({ default: m.CourseBuilderPage }))\n);\n\n// Assessments (list + builder/questions/detail)\nconst AssessmentsPage = lazy(() =>\n import('./pages/assessments/AssessmentsPage').then((m) => ({ default: m.AssessmentsPage }))\n);\nconst AssessmentDetailPage = lazy(() =>\n import('./pages/assessments/AssessmentDetailPage').then((m) => ({\n default: m.AssessmentDetailPage,\n }))\n);\n// Learner-facing: take a published assessment (answer + submit)\nconst TakeAssessmentPage = lazy(() =>\n import('./pages/assessments/TakeAssessmentPage').then((m) => ({ default: m.TakeAssessmentPage }))\n);\n\n// Insights (educator analytics, derived from real data)\nconst InsightsPage = lazy(() =>\n import('./pages/insights/InsightsPage').then((m) => ({ default: m.InsightsPage }))\n);\n\n// Grading (submissions queue)\nconst SubmissionsPage = lazy(() =>\n import('./pages/submissions/SubmissionsPage').then((m) => ({ default: m.SubmissionsPage }))\n);\n\n// Cohorts\nconst CohortsPage = lazy(() =>\n import('./pages/cohorts/CohortsPage').then((m) => ({ default: m.CohortsPage }))\n);\n\n// Skills taxonomy\nconst SkillsPage = lazy(() =>\n import('./pages/skills/SkillsPage').then((m) => ({ default: m.SkillsPage }))\n);\n\n// Certificates\nconst CertificatesPage = lazy(() =>\n import('./pages/certificates/CertificatesPage').then((m) => ({ default: m.CertificatesPage }))\n);\n\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n);\n\nexport const BuildmyiqRoutes: FC = () => {\n const { basePath, isStandalone } = useBuildmyiq();\n const location = useLocation();\n\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n // Guard: only render if the current path matches basePath (integrated mode).\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={<DashboardPage />} />\n\n <Route path=\"catalog\" element={<CatalogPage />} />\n <Route path=\"catalog/:courseId\" element={<CourseDetailPage />} />\n\n <Route path=\"learning\" element={<MyLearningPage />} />\n <Route path=\"learning/:enrollmentId\" element={<LessonPlayerPage />} />\n\n <Route path=\"authoring\" element={<AuthoringPage />} />\n <Route path=\"authoring/:courseId\" element={<CourseBuilderPage />} />\n\n <Route path=\"assessments\" element={<AssessmentsPage />} />\n <Route path=\"assessments/:assessmentId\" element={<AssessmentDetailPage />} />\n <Route path=\"assessments/:assessmentId/take\" element={<TakeAssessmentPage />} />\n\n <Route path=\"insights\" element={<InsightsPage />} />\n\n <Route path=\"submissions\" element={<SubmissionsPage />} />\n <Route path=\"cohorts\" element={<CohortsPage />} />\n <Route path=\"skills\" element={<SkillsPage />} />\n <Route path=\"certificates\" element={<CertificatesPage />} />\n\n <Route path=\"*\" element={<Navigate to={normalizedBasePath || '/'} replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -49,7 +49,7 @@ function u({ columns: u, rows: d, rowKey: f, onRowClick: p, className: m, defaul
49
49
  className: e("px-4 py-3 font-medium text-text-secondary whitespace-nowrap", l[t.align ?? "left"], t.hideOnMobile && "hidden md:table-cell", n && "cursor-pointer select-none hover:text-text-primary"),
50
50
  children: /* @__PURE__ */ s("span", {
51
51
  className: e("inline-flex items-center gap-1", t.align === "right" && "flex-row-reverse"),
52
- children: [t.header, n && (c ? g?.dir === "asc" ? /* @__PURE__ */ o(i, { className: "h-3.5 w-3.5 text-accent" }) : /* @__PURE__ */ o(r, { className: "h-3.5 w-3.5 text-accent" }) : /* @__PURE__ */ o(a, { className: "h-3.5 w-3.5 opacity-40" }))]
52
+ children: [t.header, n && (c ? g?.dir === "asc" ? /* @__PURE__ */ o(i, { className: "h-3.5 w-3.5 text-[var(--color-accent-primary)]" }) : /* @__PURE__ */ o(r, { className: "h-3.5 w-3.5 text-[var(--color-accent-primary)]" }) : /* @__PURE__ */ o(a, { className: "h-3.5 w-3.5 opacity-40" }))]
53
53
  })
54
54
  }, t.key);
55
55
  })
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.js","names":[],"sources":["../../../src/buildmyiq/components/DataTable.tsx"],"sourcesContent":["/**\n * DataTable — a lightweight, semantic-token table for list pages.\n * @module buildmyiq/components\n *\n * Deliberately minimal (no external table lib). Renders a responsive,\n * horizontally-scrollable table wrapped in a GlassCard. Columns declare a\n * header, a render fn, optional alignment, and optionally a `sortValue` to make\n * the column click-sortable.\n */\n\nimport { useMemo, useState, type ReactNode } from 'react';\nimport { ChevronUp, ChevronDown, ChevronsUpDown } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\nexport interface Column<T> {\n key: string;\n header: ReactNode;\n render: (row: T) => ReactNode;\n align?: 'left' | 'right' | 'center';\n className?: string;\n /** Hide below the `md` breakpoint for a mobile-friendly layout. */\n hideOnMobile?: boolean;\n /** Provide to make this column click-sortable (returns a comparable value). */\n sortValue?: (row: T) => string | number;\n}\n\ninterface DataTableProps<T> {\n columns: Column<T>[];\n rows: T[];\n rowKey: (row: T) => string;\n onRowClick?: (row: T) => void;\n className?: string;\n /** Default sort: a column key + direction. */\n defaultSort?: { key: string; dir: 'asc' | 'desc' };\n}\n\nconst alignClass = {\n left: 'text-left',\n right: 'text-right',\n center: 'text-center',\n} as const;\n\nexport function DataTable<T>({\n columns,\n rows,\n rowKey,\n onRowClick,\n className,\n defaultSort,\n}: DataTableProps<T>) {\n const [sort, setSort] = useState<{ key: string; dir: 'asc' | 'desc' } | null>(\n defaultSort ?? null\n );\n\n const sortedRows = useMemo(() => {\n if (!sort) return rows;\n const col = columns.find((c) => c.key === sort.key);\n if (!col?.sortValue) return rows;\n const dir = sort.dir === 'asc' ? 1 : -1;\n return [...rows].sort((a, b) => {\n const va = col.sortValue!(a);\n const vb = col.sortValue!(b);\n if (va < vb) return -1 * dir;\n if (va > vb) return 1 * dir;\n return 0;\n });\n }, [rows, sort, columns]);\n\n const toggleSort = (key: string) => {\n setSort((prev) =>\n prev?.key === key ? { key, dir: prev.dir === 'asc' ? 'desc' : 'asc' } : { key, dir: 'asc' }\n );\n };\n\n return (\n <GlassCard treatment=\"plain\" className={cn('overflow-hidden', className)}>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam\">\n {columns.map((col) => {\n const sortable = Boolean(col.sortValue);\n const active = sort?.key === col.key;\n return (\n <th\n key={col.key}\n onClick={sortable ? () => toggleSort(col.key) : undefined}\n aria-sort={\n active ? (sort?.dir === 'asc' ? 'ascending' : 'descending') : undefined\n }\n className={cn(\n 'px-4 py-3 font-medium text-text-secondary whitespace-nowrap',\n alignClass[col.align ?? 'left'],\n col.hideOnMobile && 'hidden md:table-cell',\n sortable && 'cursor-pointer select-none hover:text-text-primary'\n )}\n >\n <span\n className={cn(\n 'inline-flex items-center gap-1',\n col.align === 'right' && 'flex-row-reverse'\n )}\n >\n {col.header}\n {sortable &&\n (active ? (\n sort?.dir === 'asc' ? (\n <ChevronUp className=\"h-3.5 w-3.5 text-accent\" />\n ) : (\n <ChevronDown className=\"h-3.5 w-3.5 text-accent\" />\n )\n ) : (\n <ChevronsUpDown className=\"h-3.5 w-3.5 opacity-40\" />\n ))}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {sortedRows.map((row) => (\n <tr\n key={rowKey(row)}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={cn(\n 'group border-b border-border-seam/60 last:border-0',\n onRowClick && 'cursor-pointer transition-colors hover:bg-bg-sunken/60'\n )}\n >\n {columns.map((col) => (\n <td\n key={col.key}\n className={cn(\n 'px-4 py-3 text-text-primary align-middle',\n alignClass[col.align ?? 'left'],\n col.hideOnMobile && 'hidden md:table-cell',\n col.className\n )}\n >\n {col.render(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </GlassCard>\n );\n}\n"],"mappings":";;;;;;AAqCA,IAAM,IAAa;CACjB,MAAM;CACN,OAAO;CACP,QAAQ;CACT;AAED,SAAgB,EAAa,EAC3B,YACA,SACA,WACA,eACA,cACA,kBACoB;CACpB,IAAM,CAAC,GAAM,KAAW,EACtB,KAAe,KAChB,EAEK,IAAa,QAAc;AAC/B,MAAI,CAAC,EAAM,QAAO;EAClB,IAAM,IAAM,EAAQ,MAAM,MAAM,EAAE,QAAQ,EAAK,IAAI;AACnD,MAAI,CAAC,GAAK,UAAW,QAAO;EAC5B,IAAM,IAAM,EAAK,QAAQ,QAAQ,IAAI;AACrC,SAAO,CAAC,GAAG,EAAK,CAAC,MAAM,GAAG,MAAM;GAC9B,IAAM,IAAK,EAAI,UAAW,EAAE,EACtB,IAAK,EAAI,UAAW,EAAE;AAG5B,UAFI,IAAK,IAAW,KAAK,IACrB,IAAK,IAAW,IAAI,IACjB;IACP;IACD;EAAC;EAAM;EAAM;EAAQ,CAAC,EAEnB,KAAc,MAAgB;AAClC,KAAS,MACP,GAAM,QAAQ,IAAM;GAAE;GAAK,KAAK,EAAK,QAAQ,QAAQ,SAAS;GAAO,GAAG;GAAE;GAAK,KAAK;GAAO,CAC5F;;AAGH,QACE,kBAAC,GAAD;EAAW,WAAU;EAAQ,WAAW,EAAG,mBAAmB,EAAU;YACtE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,SAAD;IAAO,WAAU;cAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;KAAI,WAAU;eACX,EAAQ,KAAK,MAAQ;MACpB,IAAM,IAAW,EAAQ,EAAI,WACvB,IAAS,GAAM,QAAQ,EAAI;AACjC,aACE,kBAAC,MAAD;OAEE,SAAS,UAAiB,EAAW,EAAI,IAAI,GAAG,KAAA;OAChD,aACE,IAAU,GAAM,QAAQ,QAAQ,cAAc,eAAgB,KAAA;OAEhE,WAAW,EACT,+DACA,EAAW,EAAI,SAAS,SACxB,EAAI,gBAAgB,wBACpB,KAAY,qDACb;iBAED,kBAAC,QAAD;QACE,WAAW,EACT,kCACA,EAAI,UAAU,WAAW,mBAC1B;kBAJH,CAMG,EAAI,QACJ,MACE,IACC,GAAM,QAAQ,QACZ,kBAAC,GAAD,EAAW,WAAU,2BAA4B,CAAA,GAEjD,kBAAC,GAAD,EAAa,WAAU,2BAA4B,CAAA,GAGrD,kBAAC,GAAD,EAAgB,WAAU,0BAA2B,CAAA,EAEpD;;OACJ,EA9BE,EAAI,IA8BN;OAEP;KACC,CAAA,EACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAW,KAAK,MACf,kBAAC,MAAD;KAEE,SAAS,UAAmB,EAAW,EAAI,GAAG,KAAA;KAC9C,WAAW,EACT,sDACA,KAAc,yDACf;eAEA,EAAQ,KAAK,MACZ,kBAAC,MAAD;MAEE,WAAW,EACT,4CACA,EAAW,EAAI,SAAS,SACxB,EAAI,gBAAgB,wBACpB,EAAI,UACL;gBAEA,EAAI,OAAO,EAAI;MACb,EATE,EAAI,IASN,CACL;KACC,EApBE,EAAO,EAAI,CAoBb,CACL,EACI,CAAA,CACF;;GACJ,CAAA;EACI,CAAA"}
1
+ {"version":3,"file":"DataTable.js","names":[],"sources":["../../../src/buildmyiq/components/DataTable.tsx"],"sourcesContent":["/**\n * DataTable — a lightweight, semantic-token table for list pages.\n * @module buildmyiq/components\n *\n * Deliberately minimal (no external table lib). Renders a responsive,\n * horizontally-scrollable table wrapped in a GlassCard. Columns declare a\n * header, a render fn, optional alignment, and optionally a `sortValue` to make\n * the column click-sortable.\n */\n\nimport { useMemo, useState, type ReactNode } from 'react';\nimport { ChevronUp, ChevronDown, ChevronsUpDown } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\nexport interface Column<T> {\n key: string;\n header: ReactNode;\n render: (row: T) => ReactNode;\n align?: 'left' | 'right' | 'center';\n className?: string;\n /** Hide below the `md` breakpoint for a mobile-friendly layout. */\n hideOnMobile?: boolean;\n /** Provide to make this column click-sortable (returns a comparable value). */\n sortValue?: (row: T) => string | number;\n}\n\ninterface DataTableProps<T> {\n columns: Column<T>[];\n rows: T[];\n rowKey: (row: T) => string;\n onRowClick?: (row: T) => void;\n className?: string;\n /** Default sort: a column key + direction. */\n defaultSort?: { key: string; dir: 'asc' | 'desc' };\n}\n\nconst alignClass = {\n left: 'text-left',\n right: 'text-right',\n center: 'text-center',\n} as const;\n\nexport function DataTable<T>({\n columns,\n rows,\n rowKey,\n onRowClick,\n className,\n defaultSort,\n}: DataTableProps<T>) {\n const [sort, setSort] = useState<{ key: string; dir: 'asc' | 'desc' } | null>(\n defaultSort ?? null\n );\n\n const sortedRows = useMemo(() => {\n if (!sort) return rows;\n const col = columns.find((c) => c.key === sort.key);\n if (!col?.sortValue) return rows;\n const dir = sort.dir === 'asc' ? 1 : -1;\n return [...rows].sort((a, b) => {\n const va = col.sortValue!(a);\n const vb = col.sortValue!(b);\n if (va < vb) return -1 * dir;\n if (va > vb) return 1 * dir;\n return 0;\n });\n }, [rows, sort, columns]);\n\n const toggleSort = (key: string) => {\n setSort((prev) =>\n prev?.key === key ? { key, dir: prev.dir === 'asc' ? 'desc' : 'asc' } : { key, dir: 'asc' }\n );\n };\n\n return (\n <GlassCard treatment=\"plain\" className={cn('overflow-hidden', className)}>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam\">\n {columns.map((col) => {\n const sortable = Boolean(col.sortValue);\n const active = sort?.key === col.key;\n return (\n <th\n key={col.key}\n onClick={sortable ? () => toggleSort(col.key) : undefined}\n aria-sort={\n active ? (sort?.dir === 'asc' ? 'ascending' : 'descending') : undefined\n }\n className={cn(\n 'px-4 py-3 font-medium text-text-secondary whitespace-nowrap',\n alignClass[col.align ?? 'left'],\n col.hideOnMobile && 'hidden md:table-cell',\n sortable && 'cursor-pointer select-none hover:text-text-primary'\n )}\n >\n <span\n className={cn(\n 'inline-flex items-center gap-1',\n col.align === 'right' && 'flex-row-reverse'\n )}\n >\n {col.header}\n {sortable &&\n (active ? (\n sort?.dir === 'asc' ? (\n <ChevronUp className=\"h-3.5 w-3.5 text-[var(--color-accent-primary)]\" />\n ) : (\n <ChevronDown className=\"h-3.5 w-3.5 text-[var(--color-accent-primary)]\" />\n )\n ) : (\n <ChevronsUpDown className=\"h-3.5 w-3.5 opacity-40\" />\n ))}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {sortedRows.map((row) => (\n <tr\n key={rowKey(row)}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={cn(\n 'group border-b border-border-seam/60 last:border-0',\n onRowClick && 'cursor-pointer transition-colors hover:bg-bg-sunken/60'\n )}\n >\n {columns.map((col) => (\n <td\n key={col.key}\n className={cn(\n 'px-4 py-3 text-text-primary align-middle',\n alignClass[col.align ?? 'left'],\n col.hideOnMobile && 'hidden md:table-cell',\n col.className\n )}\n >\n {col.render(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </GlassCard>\n );\n}\n"],"mappings":";;;;;;AAqCA,IAAM,IAAa;CACjB,MAAM;CACN,OAAO;CACP,QAAQ;CACT;AAED,SAAgB,EAAa,EAC3B,YACA,SACA,WACA,eACA,cACA,kBACoB;CACpB,IAAM,CAAC,GAAM,KAAW,EACtB,KAAe,KAChB,EAEK,IAAa,QAAc;AAC/B,MAAI,CAAC,EAAM,QAAO;EAClB,IAAM,IAAM,EAAQ,MAAM,MAAM,EAAE,QAAQ,EAAK,IAAI;AACnD,MAAI,CAAC,GAAK,UAAW,QAAO;EAC5B,IAAM,IAAM,EAAK,QAAQ,QAAQ,IAAI;AACrC,SAAO,CAAC,GAAG,EAAK,CAAC,MAAM,GAAG,MAAM;GAC9B,IAAM,IAAK,EAAI,UAAW,EAAE,EACtB,IAAK,EAAI,UAAW,EAAE;AAG5B,UAFI,IAAK,IAAW,KAAK,IACrB,IAAK,IAAW,IAAI,IACjB;IACP;IACD;EAAC;EAAM;EAAM;EAAQ,CAAC,EAEnB,KAAc,MAAgB;AAClC,KAAS,MACP,GAAM,QAAQ,IAAM;GAAE;GAAK,KAAK,EAAK,QAAQ,QAAQ,SAAS;GAAO,GAAG;GAAE;GAAK,KAAK;GAAO,CAC5F;;AAGH,QACE,kBAAC,GAAD;EAAW,WAAU;EAAQ,WAAW,EAAG,mBAAmB,EAAU;YACtE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,SAAD;IAAO,WAAU;cAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;KAAI,WAAU;eACX,EAAQ,KAAK,MAAQ;MACpB,IAAM,IAAW,EAAQ,EAAI,WACvB,IAAS,GAAM,QAAQ,EAAI;AACjC,aACE,kBAAC,MAAD;OAEE,SAAS,UAAiB,EAAW,EAAI,IAAI,GAAG,KAAA;OAChD,aACE,IAAU,GAAM,QAAQ,QAAQ,cAAc,eAAgB,KAAA;OAEhE,WAAW,EACT,+DACA,EAAW,EAAI,SAAS,SACxB,EAAI,gBAAgB,wBACpB,KAAY,qDACb;iBAED,kBAAC,QAAD;QACE,WAAW,EACT,kCACA,EAAI,UAAU,WAAW,mBAC1B;kBAJH,CAMG,EAAI,QACJ,MACE,IACC,GAAM,QAAQ,QACZ,kBAAC,GAAD,EAAW,WAAU,kDAAmD,CAAA,GAExE,kBAAC,GAAD,EAAa,WAAU,kDAAmD,CAAA,GAG5E,kBAAC,GAAD,EAAgB,WAAU,0BAA2B,CAAA,EAEpD;;OACJ,EA9BE,EAAI,IA8BN;OAEP;KACC,CAAA,EACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAW,KAAK,MACf,kBAAC,MAAD;KAEE,SAAS,UAAmB,EAAW,EAAI,GAAG,KAAA;KAC9C,WAAW,EACT,sDACA,KAAc,yDACf;eAEA,EAAQ,KAAK,MACZ,kBAAC,MAAD;MAEE,WAAW,EACT,4CACA,EAAW,EAAI,SAAS,SACxB,EAAI,gBAAgB,wBACpB,EAAI,UACL;gBAEA,EAAI,OAAO,EAAI;MACb,EATE,EAAI,IASN,CACL;KACC,EApBE,EAAO,EAAI,CAoBb,CACL,EACI,CAAA,CACF;;GACJ,CAAA;EACI,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { cn as e } from "../utils/cn.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/buildmyiq/components/MiniBar.tsx
4
- function n({ value: n, className: r, barClassName: i = "bg-accent", height: a = 6 }) {
4
+ function n({ value: n, className: r, barClassName: i = "bg-[var(--color-accent-primary)]", height: a = 6 }) {
5
5
  let o = Math.max(0, Math.min(100, n));
6
6
  return /* @__PURE__ */ t("div", {
7
7
  className: e("w-full overflow-hidden rounded-full bg-bg-sunken", r),
@@ -1 +1 @@
1
- {"version":3,"file":"MiniBar.js","names":[],"sources":["../../../src/buildmyiq/components/MiniBar.tsx"],"sourcesContent":["/**\n * MiniBar — a thin inline progress bar (target progress, completion, breach %).\n * @module buildmyiq/components\n */\n\nimport { cn } from '../utils/cn';\n\ninterface MiniBarProps {\n /** 0–100. */\n value: number;\n className?: string;\n /** Bar fill token class (defaults to accent). */\n barClassName?: string;\n /** Height in px. */\n height?: number;\n}\n\nexport function MiniBar({\n value,\n className,\n barClassName = 'bg-accent',\n height = 6,\n}: MiniBarProps) {\n const clamped = Math.max(0, Math.min(100, value));\n return (\n <div\n className={cn('w-full overflow-hidden rounded-full bg-bg-sunken', className)}\n style={{ height }}\n role=\"progressbar\"\n aria-valuenow={Math.round(clamped)}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n className={cn('h-full rounded-full transition-[width] duration-700 ease-out', barClassName)}\n style={{ width: `${clamped}%` }}\n />\n </div>\n );\n}\n"],"mappings":";;;AAiBA,SAAgB,EAAQ,EACtB,UACA,cACA,kBAAe,aACf,YAAS,KACM;CACf,IAAM,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,EAAM,CAAC;AACjD,QACE,kBAAC,OAAD;EACE,WAAW,EAAG,oDAAoD,EAAU;EAC5E,OAAO,EAAE,WAAQ;EACjB,MAAK;EACL,iBAAe,KAAK,MAAM,EAAQ;EAClC,iBAAe;EACf,iBAAe;YAEf,kBAAC,OAAD;GACE,WAAW,EAAG,gEAAgE,EAAa;GAC3F,OAAO,EAAE,OAAO,GAAG,EAAQ,IAAI;GAC/B,CAAA;EACE,CAAA"}
1
+ {"version":3,"file":"MiniBar.js","names":[],"sources":["../../../src/buildmyiq/components/MiniBar.tsx"],"sourcesContent":["/**\n * MiniBar — a thin inline progress bar (target progress, completion, breach %).\n * @module buildmyiq/components\n */\n\nimport { cn } from '../utils/cn';\n\ninterface MiniBarProps {\n /** 0–100. */\n value: number;\n className?: string;\n /** Bar fill token class (defaults to accent). */\n barClassName?: string;\n /** Height in px. */\n height?: number;\n}\n\nexport function MiniBar({\n value,\n className,\n barClassName = 'bg-[var(--color-accent-primary)]',\n height = 6,\n}: MiniBarProps) {\n const clamped = Math.max(0, Math.min(100, value));\n return (\n <div\n className={cn('w-full overflow-hidden rounded-full bg-bg-sunken', className)}\n style={{ height }}\n role=\"progressbar\"\n aria-valuenow={Math.round(clamped)}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n className={cn('h-full rounded-full transition-[width] duration-700 ease-out', barClassName)}\n style={{ width: `${clamped}%` }}\n />\n </div>\n );\n}\n"],"mappings":";;;AAiBA,SAAgB,EAAQ,EACtB,UACA,cACA,kBAAe,oCACf,YAAS,KACM;CACf,IAAM,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,EAAM,CAAC;AACjD,QACE,kBAAC,OAAD;EACE,WAAW,EAAG,oDAAoD,EAAU;EAC5E,OAAO,EAAE,WAAQ;EACjB,MAAK;EACL,iBAAe,KAAK,MAAM,EAAQ;EAClC,iBAAe;EACf,iBAAe;YAEf,kBAAC,OAAD;GACE,WAAW,EAAG,gEAAgE,EAAa;GAC3F,OAAO,EAAE,OAAO,GAAG,EAAQ,IAAI;GAC/B,CAAA;EACE,CAAA"}
@@ -96,7 +96,7 @@ var a = () => {
96
96
  enabled: u,
97
97
  queryFn: async () => (await o(`query BuiListCourses($level: BuiCourseLevel, $status: BuiCourseStatus, $pagination: PaginationInput) {
98
98
  buiListCourses(level: $level, status: $status, pagination: $pagination) {
99
- items { ${f} }
99
+ items { ${f} modules { id } lessons { id } }
100
100
  pageInfo { cursor hasMore }
101
101
  }
102
102
  }`, {
@@ -197,7 +197,7 @@ var a = () => {
197
197
  ],
198
198
  enabled: !!e,
199
199
  queryFn: async () => (await o(`query BuiListAssessments($courseId: ID!, $status: BuiAssessmentStatus) {
200
- buiListAssessments(courseId: $courseId, status: $status) { ${g} }
200
+ buiListAssessments(courseId: $courseId, status: $status) { ${g} questions { id } }
201
201
  }`, {
202
202
  courseId: e,
203
203
  status: t
@@ -266,6 +266,14 @@ var a = () => {
266
266
  }, t)).buiListSubmissions
267
267
  });
268
268
  }, V = () => {
269
+ let e = T(), n = r();
270
+ return t({
271
+ mutationFn: async (t) => (await o(`mutation BuiSubmitAssessment($input: BuiSubmitAssessmentInput!) {
272
+ buiSubmitAssessment(input: $input) { ${y} }
273
+ }`, { input: t }, e)).buiSubmitAssessment,
274
+ onSuccess: () => n.invalidateQueries({ queryKey: s.submissions })
275
+ });
276
+ }, H = () => {
269
277
  let e = T(), n = r();
270
278
  return t({
271
279
  mutationFn: async (t) => (await o(`mutation BuiGradeSubmission($id: ID!, $input: BuiGradeSubmissionInput!) {
@@ -273,7 +281,7 @@ var a = () => {
273
281
  }`, t, e)).buiGradeSubmission,
274
282
  onSuccess: () => n.invalidateQueries({ queryKey: s.submissions })
275
283
  });
276
- }, H = (e = {}) => {
284
+ }, U = (e = {}) => {
277
285
  let t = T(), { courseId: r, learnerId: i, status: a, cursor: c, limit: u, enabled: d = !0 } = e;
278
286
  return n({
279
287
  queryKey: [...s.enrollments, {
@@ -296,7 +304,7 @@ var a = () => {
296
304
  pagination: l(c, u)
297
305
  }, t)).buiListEnrollments
298
306
  });
299
- }, U = (e) => {
307
+ }, W = (e) => {
300
308
  let t = T();
301
309
  return n({
302
310
  queryKey: e ? s.enrollment(e) : [
@@ -309,7 +317,7 @@ var a = () => {
309
317
  buiEnrollment(id: $id) { ${C} }
310
318
  }`, { id: e }, t)).buiEnrollment
311
319
  });
312
- }, W = () => {
320
+ }, G = () => {
313
321
  let e = T(), n = r();
314
322
  return t({
315
323
  mutationFn: async (t) => (await o(`mutation BuiEnroll($input: BuiEnrollInput!) {
@@ -317,7 +325,7 @@ var a = () => {
317
325
  }`, { input: t }, e)).buiEnroll,
318
326
  onSuccess: () => n.invalidateQueries({ queryKey: s.enrollments })
319
327
  });
320
- }, G = () => {
328
+ }, K = () => {
321
329
  let e = T(), n = r();
322
330
  return t({
323
331
  mutationFn: async (t) => (await o(`mutation BuiTransitionEnrollment($id: ID!, $status: BuiEnrollmentStatus!) {
@@ -327,7 +335,7 @@ var a = () => {
327
335
  n.invalidateQueries({ queryKey: s.enrollments }), n.invalidateQueries({ queryKey: s.enrollment(e.id) });
328
336
  }
329
337
  });
330
- }, K = () => {
338
+ }, q = () => {
331
339
  let e = T(), n = r();
332
340
  return t({
333
341
  mutationFn: async (t) => (await o(`mutation BuiRecordLessonProgress($input: BuiRecordLessonProgressInput!) {
@@ -337,7 +345,7 @@ var a = () => {
337
345
  n.invalidateQueries({ queryKey: s.enrollment(e.enrollmentId) }), n.invalidateQueries({ queryKey: s.enrollments });
338
346
  }
339
347
  });
340
- }, q = (e, t) => {
348
+ }, J = (e, t) => {
341
349
  let r = T();
342
350
  return n({
343
351
  queryKey: [...s.cohorts, {
@@ -351,7 +359,7 @@ var a = () => {
351
359
  status: t
352
360
  }, r)).buiListCohorts
353
361
  });
354
- }, J = () => {
362
+ }, Y = () => {
355
363
  let e = T(), n = r();
356
364
  return t({
357
365
  mutationFn: async (t) => (await o(`mutation BuiCreateCohort($input: BuiCreateCohortInput!) {
@@ -359,7 +367,7 @@ var a = () => {
359
367
  }`, { input: t }, e)).buiCreateCohort,
360
368
  onSuccess: () => n.invalidateQueries({ queryKey: s.cohorts })
361
369
  });
362
- }, Y = (e) => {
370
+ }, X = (e) => {
363
371
  let t = T();
364
372
  return n({
365
373
  queryKey: [...s.skills, { category: e }],
@@ -367,7 +375,7 @@ var a = () => {
367
375
  buiListSkills(category: $category) { ${d} }
368
376
  }`, { category: e }, t)).buiListSkills
369
377
  });
370
- }, X = () => {
378
+ }, Z = () => {
371
379
  let e = T(), n = r();
372
380
  return t({
373
381
  mutationFn: async (t) => (await o(`mutation BuiCreateSkill($input: BuiCreateSkillInput!) {
@@ -375,7 +383,7 @@ var a = () => {
375
383
  }`, { input: t }, e)).buiCreateSkill,
376
384
  onSuccess: () => n.invalidateQueries({ queryKey: s.skills })
377
385
  });
378
- }, Z = (e, t) => {
386
+ }, Q = (e, t) => {
379
387
  let r = T();
380
388
  return n({
381
389
  queryKey: [...s.certificates, {
@@ -389,7 +397,7 @@ var a = () => {
389
397
  learnerId: t
390
398
  }, r)).buiListCertificates
391
399
  });
392
- }, Q = () => {
400
+ }, $ = () => {
393
401
  let e = T(), n = r();
394
402
  return t({
395
403
  mutationFn: async (t) => (await o(`mutation BuiIssueCertificate($input: BuiIssueCertificateInput!) {
@@ -397,7 +405,7 @@ var a = () => {
397
405
  }`, { input: t }, e)).buiIssueCertificate,
398
406
  onSuccess: () => n.invalidateQueries({ queryKey: s.certificates })
399
407
  });
400
- }, $ = () => {
408
+ }, ee = () => {
401
409
  let e = T(), n = r();
402
410
  return t({
403
411
  mutationFn: async (t) => (await o(`mutation BuiRevokeCertificate($id: ID!) {
@@ -407,6 +415,6 @@ var a = () => {
407
415
  });
408
416
  };
409
417
  //#endregion
410
- export { j as useBuiArchiveCourse, I as useBuiAssessment, F as useBuiAssessments, Z as useBuiCertificates, q as useBuiCohorts, D as useBuiCourse, E as useBuiCourses, L as useBuiCreateAssessment, J as useBuiCreateCohort, O as useBuiCreateCourse, P as useBuiCreateLesson, N as useBuiCreateModule, z as useBuiCreateQuestion, X as useBuiCreateSkill, W as useBuiEnroll, U as useBuiEnrollment, H as useBuiEnrollments, V as useBuiGradeSubmission, Q as useBuiIssueCertificate, M as useBuiModules, R as useBuiPublishAssessment, A as useBuiPublishCourse, K as useBuiRecordLessonProgress, $ as useBuiRevokeCertificate, Y as useBuiSkills, B as useBuiSubmissions, G as useBuiTransitionEnrollment, k as useBuiUpdateCourse };
418
+ export { j as useBuiArchiveCourse, I as useBuiAssessment, F as useBuiAssessments, Q as useBuiCertificates, J as useBuiCohorts, D as useBuiCourse, E as useBuiCourses, L as useBuiCreateAssessment, Y as useBuiCreateCohort, O as useBuiCreateCourse, P as useBuiCreateLesson, N as useBuiCreateModule, z as useBuiCreateQuestion, Z as useBuiCreateSkill, G as useBuiEnroll, W as useBuiEnrollment, U as useBuiEnrollments, H as useBuiGradeSubmission, $ as useBuiIssueCertificate, M as useBuiModules, R as useBuiPublishAssessment, A as useBuiPublishCourse, q as useBuiRecordLessonProgress, ee as useBuiRevokeCertificate, X as useBuiSkills, B as useBuiSubmissions, V as useBuiSubmitAssessment, K as useBuiTransitionEnrollment, k as useBuiUpdateCourse };
411
419
 
412
420
  //# sourceMappingURL=useBuildmyiqApi.js.map