@burdenoff/microfe-buildmyiq 2026.706.11 → 2026.709.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.
- package/dist/buildmyiq/BuildmyiqRoutes.js +67 -49
- package/dist/buildmyiq/BuildmyiqRoutes.js.map +1 -1
- package/dist/buildmyiq/components/Avatar.js.map +1 -1
- package/dist/buildmyiq/components/BuiDiscussion.js +1 -1
- package/dist/buildmyiq/components/Viz.js.map +1 -1
- package/dist/buildmyiq/index.js +1 -1
- package/dist/buildmyiq/pages/DashboardPage.js +159 -122
- package/dist/buildmyiq/pages/DashboardPage.js.map +1 -1
- package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.js +1 -1
- package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.js.map +1 -1
- package/dist/buildmyiq/pages/assessments/AssessmentsPage.js +1 -1
- package/dist/buildmyiq/pages/assessments/TakeAssessmentPage.js +1 -1
- package/dist/buildmyiq/pages/assessments/TakeAssessmentPage.js.map +1 -1
- package/dist/buildmyiq/pages/authoring/AuthoringPage.js +1 -1
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.js +1 -1
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.js.map +1 -1
- package/dist/buildmyiq/pages/catalog/CatalogPage.js +1 -1
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.js +1 -1
- package/dist/buildmyiq/pages/certificates/CertificatesPage.js +1 -1
- package/dist/buildmyiq/pages/certificates/CertificatesPage.js.map +1 -1
- package/dist/buildmyiq/pages/cohorts/CohortsPage.js +1 -1
- package/dist/buildmyiq/pages/insights/InsightsPage.js.map +1 -1
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.js +1 -1
- package/dist/buildmyiq/pages/learning/MyLearningPage.js +1 -1
- package/dist/buildmyiq/pages/learning/MyLearningPage.js.map +1 -1
- package/dist/buildmyiq/pages/paths/PathsPage.js +1 -1
- package/dist/buildmyiq/pages/paths/PathsPage.js.map +1 -1
- package/dist/buildmyiq/pages/skills/SkillsPage.js.map +1 -1
- package/dist/buildmyiq/pages/submissions/SubmissionsPage.js +5 -9
- package/dist/buildmyiq/pages/submissions/SubmissionsPage.js.map +1 -1
- package/dist/buildmyiq/shared/hooks/useTr.js +14 -0
- package/dist/buildmyiq/shared/hooks/useTr.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,88 +1,106 @@
|
|
|
1
1
|
import { useBuildmyiq as e } from "./context/BuildmyiqContext.js";
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
2
|
+
import "./context/index.js";
|
|
3
|
+
import { useTr as t } from "./shared/hooks/useTr.js";
|
|
4
|
+
import { DashboardPage as n } from "./pages/DashboardPage.js";
|
|
5
|
+
import { Suspense as r, lazy as i } from "react";
|
|
6
|
+
import { FeatureGate as a } from "@burdenoff/fe-libs/shared/feature-flags";
|
|
7
|
+
import { Navigate as o, Route as s, Routes as c, useLocation as l } from "react-router-dom";
|
|
8
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
9
|
+
import { Spinner as f } from "@burdenoff/fe-libs/ui";
|
|
7
10
|
//#region src/buildmyiq/BuildmyiqRoutes.tsx
|
|
8
|
-
var
|
|
11
|
+
var p = i(() => import("./pages/catalog/CatalogPage.js").then((e) => ({ default: e.CatalogPage }))), m = i(() => import("./pages/catalog/CourseDetailPage.js").then((e) => ({ default: e.CourseDetailPage }))), h = i(() => import("./pages/learning/MyLearningPage.js").then((e) => ({ default: e.MyLearningPage }))), g = i(() => import("./pages/learning/LessonPlayerPage.js").then((e) => ({ default: e.LessonPlayerPage }))), _ = i(() => import("./pages/authoring/AuthoringPage.js").then((e) => ({ default: e.AuthoringPage }))), v = i(() => import("./pages/authoring/CourseBuilderPage.js").then((e) => ({ default: e.CourseBuilderPage }))), y = i(() => import("./pages/assessments/AssessmentsPage.js").then((e) => ({ default: e.AssessmentsPage }))), b = i(() => import("./pages/assessments/AssessmentDetailPage.js").then((e) => ({ default: e.AssessmentDetailPage }))), x = i(() => import("./pages/assessments/TakeAssessmentPage.js").then((e) => ({ default: e.TakeAssessmentPage }))), S = i(() => import("./pages/insights/InsightsPage.js").then((e) => ({ default: e.InsightsPage }))), C = i(() => import("./pages/paths/PathsPage.js").then((e) => ({ default: e.PathsPage }))), w = i(() => import("./pages/submissions/SubmissionsPage.js").then((e) => ({ default: e.SubmissionsPage }))), T = i(() => import("./pages/cohorts/CohortsPage.js").then((e) => ({ default: e.CohortsPage }))), E = i(() => import("./pages/skills/SkillsPage.js").then((e) => ({ default: e.SkillsPage }))), D = i(() => import("./pages/certificates/CertificatesPage.js").then((e) => ({ default: e.CertificatesPage }))), O = () => /* @__PURE__ */ u("div", {
|
|
9
12
|
className: "flex min-h-[400px] items-center justify-center",
|
|
10
|
-
children: /* @__PURE__ */
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
return
|
|
13
|
+
children: /* @__PURE__ */ u(f, { size: "lg" })
|
|
14
|
+
});
|
|
15
|
+
function k() {
|
|
16
|
+
return /* @__PURE__ */ u("div", {
|
|
17
|
+
className: "flex h-full min-h-[200px] items-center justify-center text-sm text-text-secondary",
|
|
18
|
+
children: t()("buildmyiq.pages.featureDisabled", "This feature is currently disabled. You can enable it from Feature Previews.")
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function A(e, t, n = !0) {
|
|
22
|
+
return /* @__PURE__ */ u(a, {
|
|
23
|
+
flag: e,
|
|
24
|
+
defaultValue: n,
|
|
25
|
+
fallback: /* @__PURE__ */ u(k, {}),
|
|
26
|
+
children: t
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
var j = () => {
|
|
30
|
+
let { basePath: t, isStandalone: i } = e(), a = l(), f = t === "/" ? "" : (t ?? "").replace(/\/$/, "");
|
|
31
|
+
return f && !i && !(a.pathname === f || a.pathname.startsWith(f + "/")) ? null : /* @__PURE__ */ u("div", {
|
|
14
32
|
className: "flex min-h-full flex-col",
|
|
15
|
-
children: /* @__PURE__ */
|
|
16
|
-
fallback: /* @__PURE__ */
|
|
17
|
-
children: /* @__PURE__ */
|
|
18
|
-
/* @__PURE__ */
|
|
33
|
+
children: /* @__PURE__ */ u(r, {
|
|
34
|
+
fallback: /* @__PURE__ */ u(O, {}),
|
|
35
|
+
children: /* @__PURE__ */ d(c, { children: [
|
|
36
|
+
/* @__PURE__ */ u(s, {
|
|
19
37
|
index: !0,
|
|
20
|
-
element: /* @__PURE__ */
|
|
38
|
+
element: A("buildmyiq.overview", /* @__PURE__ */ u(n, {}))
|
|
21
39
|
}),
|
|
22
|
-
/* @__PURE__ */
|
|
40
|
+
/* @__PURE__ */ u(s, {
|
|
23
41
|
path: "catalog",
|
|
24
|
-
element: /* @__PURE__ */
|
|
42
|
+
element: A("buildmyiq.catalog", /* @__PURE__ */ u(p, {}))
|
|
25
43
|
}),
|
|
26
|
-
/* @__PURE__ */
|
|
44
|
+
/* @__PURE__ */ u(s, {
|
|
27
45
|
path: "catalog/:courseId",
|
|
28
|
-
element: /* @__PURE__ */
|
|
46
|
+
element: A("buildmyiq.catalog", /* @__PURE__ */ u(m, {}))
|
|
29
47
|
}),
|
|
30
|
-
/* @__PURE__ */
|
|
48
|
+
/* @__PURE__ */ u(s, {
|
|
31
49
|
path: "learning",
|
|
32
|
-
element: /* @__PURE__ */
|
|
50
|
+
element: A("buildmyiq.learning", /* @__PURE__ */ u(h, {}))
|
|
33
51
|
}),
|
|
34
|
-
/* @__PURE__ */
|
|
52
|
+
/* @__PURE__ */ u(s, {
|
|
35
53
|
path: "learning/:enrollmentId",
|
|
36
|
-
element: /* @__PURE__ */
|
|
54
|
+
element: A("buildmyiq.learning", /* @__PURE__ */ u(g, {}))
|
|
37
55
|
}),
|
|
38
|
-
/* @__PURE__ */
|
|
56
|
+
/* @__PURE__ */ u(s, {
|
|
39
57
|
path: "paths",
|
|
40
|
-
element: /* @__PURE__ */
|
|
58
|
+
element: A("buildmyiq.paths", /* @__PURE__ */ u(C, {}))
|
|
41
59
|
}),
|
|
42
|
-
/* @__PURE__ */
|
|
60
|
+
/* @__PURE__ */ u(s, {
|
|
43
61
|
path: "authoring",
|
|
44
|
-
element: /* @__PURE__ */
|
|
62
|
+
element: A("buildmyiq.authoring", /* @__PURE__ */ u(_, {}))
|
|
45
63
|
}),
|
|
46
|
-
/* @__PURE__ */
|
|
64
|
+
/* @__PURE__ */ u(s, {
|
|
47
65
|
path: "authoring/:courseId",
|
|
48
|
-
element: /* @__PURE__ */
|
|
66
|
+
element: A("buildmyiq.authoring", /* @__PURE__ */ u(v, {}))
|
|
49
67
|
}),
|
|
50
|
-
/* @__PURE__ */
|
|
68
|
+
/* @__PURE__ */ u(s, {
|
|
51
69
|
path: "assessments",
|
|
52
|
-
element: /* @__PURE__ */
|
|
70
|
+
element: A("buildmyiq.assessments", /* @__PURE__ */ u(y, {}))
|
|
53
71
|
}),
|
|
54
|
-
/* @__PURE__ */
|
|
72
|
+
/* @__PURE__ */ u(s, {
|
|
55
73
|
path: "assessments/:assessmentId",
|
|
56
|
-
element: /* @__PURE__ */
|
|
74
|
+
element: A("buildmyiq.assessments", /* @__PURE__ */ u(b, {}))
|
|
57
75
|
}),
|
|
58
|
-
/* @__PURE__ */
|
|
76
|
+
/* @__PURE__ */ u(s, {
|
|
59
77
|
path: "assessments/:assessmentId/take",
|
|
60
|
-
element: /* @__PURE__ */
|
|
78
|
+
element: A("buildmyiq.assessments", /* @__PURE__ */ u(x, {}))
|
|
61
79
|
}),
|
|
62
|
-
/* @__PURE__ */
|
|
80
|
+
/* @__PURE__ */ u(s, {
|
|
63
81
|
path: "insights",
|
|
64
|
-
element: /* @__PURE__ */
|
|
82
|
+
element: A("buildmyiq.insights", /* @__PURE__ */ u(S, {}))
|
|
65
83
|
}),
|
|
66
|
-
/* @__PURE__ */
|
|
84
|
+
/* @__PURE__ */ u(s, {
|
|
67
85
|
path: "submissions",
|
|
68
|
-
element: /* @__PURE__ */
|
|
86
|
+
element: A("buildmyiq.submissions", /* @__PURE__ */ u(w, {}))
|
|
69
87
|
}),
|
|
70
|
-
/* @__PURE__ */
|
|
88
|
+
/* @__PURE__ */ u(s, {
|
|
71
89
|
path: "cohorts",
|
|
72
|
-
element: /* @__PURE__ */
|
|
90
|
+
element: A("buildmyiq.cohorts", /* @__PURE__ */ u(T, {}))
|
|
73
91
|
}),
|
|
74
|
-
/* @__PURE__ */
|
|
92
|
+
/* @__PURE__ */ u(s, {
|
|
75
93
|
path: "skills",
|
|
76
|
-
element: /* @__PURE__ */
|
|
94
|
+
element: A("buildmyiq.skills", /* @__PURE__ */ u(E, {}))
|
|
77
95
|
}),
|
|
78
|
-
/* @__PURE__ */
|
|
96
|
+
/* @__PURE__ */ u(s, {
|
|
79
97
|
path: "certificates",
|
|
80
|
-
element: /* @__PURE__ */
|
|
98
|
+
element: A("buildmyiq.certificates", /* @__PURE__ */ u(D, {}))
|
|
81
99
|
}),
|
|
82
|
-
/* @__PURE__ */
|
|
100
|
+
/* @__PURE__ */ u(s, {
|
|
83
101
|
path: "*",
|
|
84
|
-
element: /* @__PURE__ */
|
|
85
|
-
to:
|
|
102
|
+
element: /* @__PURE__ */ u(o, {
|
|
103
|
+
to: f || "/",
|
|
86
104
|
replace: !0
|
|
87
105
|
})
|
|
88
106
|
})
|
|
@@ -91,6 +109,6 @@ var d = r(() => import("./pages/catalog/CatalogPage.js").then((e) => ({ default:
|
|
|
91
109
|
});
|
|
92
110
|
};
|
|
93
111
|
//#endregion
|
|
94
|
-
export {
|
|
112
|
+
export { j as BuildmyiqRoutes };
|
|
95
113
|
|
|
96
114
|
//# 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/
|
|
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 * All product routes are gated by feature flags that default to enabled.\n */\n\nimport React, { type FC, lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router-dom';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { useBuildmyiq } from './context';\nimport { useTr } from './shared/hooks/useTr';\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// Skill Journeys (derived guided paths)\nconst PathsPage = lazy(() =>\n import('./pages/paths/PathsPage').then((m) => ({ default: m.PathsPage }))\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\nfunction FeatureDisabledFallback() {\n const tr = useTr();\n return (\n <div className=\"flex h-full min-h-[200px] items-center justify-center text-sm text-text-secondary\">\n {tr(\n 'buildmyiq.pages.featureDisabled',\n 'This feature is currently disabled. You can enable it from Feature Previews.'\n )}\n </div>\n );\n}\n\nfunction gated(flag: string, element: React.ReactNode, defaultValue = true): React.ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={defaultValue} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\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={gated('buildmyiq.overview', <DashboardPage />)} />\n\n <Route path=\"catalog\" element={gated('buildmyiq.catalog', <CatalogPage />)} />\n <Route\n path=\"catalog/:courseId\"\n element={gated('buildmyiq.catalog', <CourseDetailPage />)}\n />\n\n <Route path=\"learning\" element={gated('buildmyiq.learning', <MyLearningPage />)} />\n <Route\n path=\"learning/:enrollmentId\"\n element={gated('buildmyiq.learning', <LessonPlayerPage />)}\n />\n\n <Route path=\"paths\" element={gated('buildmyiq.paths', <PathsPage />)} />\n\n <Route path=\"authoring\" element={gated('buildmyiq.authoring', <AuthoringPage />)} />\n <Route\n path=\"authoring/:courseId\"\n element={gated('buildmyiq.authoring', <CourseBuilderPage />)}\n />\n\n <Route path=\"assessments\" element={gated('buildmyiq.assessments', <AssessmentsPage />)} />\n <Route\n path=\"assessments/:assessmentId\"\n element={gated('buildmyiq.assessments', <AssessmentDetailPage />)}\n />\n <Route\n path=\"assessments/:assessmentId/take\"\n element={gated('buildmyiq.assessments', <TakeAssessmentPage />)}\n />\n\n <Route path=\"insights\" element={gated('buildmyiq.insights', <InsightsPage />)} />\n\n <Route path=\"submissions\" element={gated('buildmyiq.submissions', <SubmissionsPage />)} />\n <Route path=\"cohorts\" element={gated('buildmyiq.cohorts', <CohortsPage />)} />\n <Route path=\"skills\" element={gated('buildmyiq.skills', <SkillsPage />)} />\n <Route\n path=\"certificates\"\n element={gated('buildmyiq.certificates', <CertificatesPage />)}\n />\n\n <Route path=\"*\" element={<Navigate to={normalizedBasePath || '/'} replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.js","names":[],"sources":["../../../src/buildmyiq/components/Avatar.tsx"],"sourcesContent":["/**\n * Avatar — a deterministic initials avatar (with optional real image).\n * @module buildmyiq/components\n *\n * HONEST BY DESIGN: when we have a real name/photo (the signed-in user) we show\n * it; for anyone we can only identify by id we render initials derived from the\n * id on a deterministic token-based tint — never a fabricated name or stock\n * photo. The colour is picked from a fixed set of semantic accent tints so it is\n * theme-safe and reproducible for the same seed.\n */\n\nimport type { FC } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface AvatarProps {\n /** Display name — its initials are shown when no image is provided. */\n name?: string | null;\n /** Stable seed (e.g. a user id) used for the tint + fallback initials. */\n seed?: string | null;\n /** Real image URL (only for the signed-in user / resolved members). */\n src?: string | null;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n className?: string;\n}\n\nconst SIZE: Record<NonNullable<AvatarProps['size']>, string> = {\n xs: 'h-6 w-6 text-[10px]',\n sm: 'h-8 w-8 text-xs',\n md: 'h-10 w-10 text-sm',\n lg: 'h-12 w-12 text-base',\n};\n\n// Theme-safe tint set (semantic CSS vars → always resolve in light/dark).\nconst TINTS = [\n 'bg-[var(--color-accent-soft)] text-text-primary',\n 'bg-status-success-bg-subtle text-status-success-text',\n 'bg-status-warning-bg-subtle text-status-warning-text',\n 'bg-[color-mix(in_srgb,var(--color-accent-teal)_18%,transparent)] text-[var(--color-accent-teal)]',\n 'bg-[color-mix(in_srgb,var(--color-accent-primary)_16%,transparent)] text-[var(--color-accent-primary)]',\n 'bg-bg-sunken text-text-secondary',\n];\n\nconst hash = (s: string): number => {\n let h = 0;\n for (let i = 0; i < s.length; i += 1) h = (h * 31 + s.charCodeAt(i)) | 0;\n return Math.abs(h);\n};\n\nconst initialsOf = (name?: string | null, seed?: string | null): string => {\n const src = (name ?? '').trim();\n if (src) {\n const parts = src.split(/\\s+/).filter(Boolean);\n if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n return src.slice(0, 2).toUpperCase();\n }\n return (seed ?? '?').replace(/[^a-zA-Z0-9]/g, '').slice(0, 2).toUpperCase() || '?';\n};\n\nexport const Avatar: FC<AvatarProps> = ({ name, seed, src, size = 'md', className }) => {\n const tint = TINTS[hash(seed ?? name ?? '?') % TINTS.length];\n if (src) {\n return (\n <img\n src={src}\n alt=\"\"\n className={cn('shrink-0 rounded-full object-cover', SIZE[size], className)}\n />\n );\n }\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'inline-flex shrink-0 select-none items-center justify-center rounded-full font-semibold',\n SIZE[size],\n tint,\n className\n )}\n >\n {initialsOf(name, seed)}\n </span>\n );\n};\n"],"mappings":";;;AAyBA,IAAM,IAAyD;CAC7D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACL,EAGK,IAAQ;CACZ;CACA;CACA;CACA;CACA;CACA;CACD,EAEK,KAAQ,MAAsB;CAClC,IAAI,IAAI;AACR,MAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,EAAG,KAAK,IAAI,KAAK,EAAE,WAAW,EAAE,GAAI;AACvE,QAAO,KAAK,IAAI,EAAE;GAGd,KAAc,GAAsB,MAAiC;CACzE,IAAM,KAAO,KAAQ,IAAI,MAAM;AAC/B,KAAI,GAAK;EACP,IAAM,IAAQ,EAAI,MAAM,MAAM,CAAC,OAAO,QAAQ;AAE9C,SADI,EAAM,UAAU,KAAW,EAAM,GAAG,KAAK,EAAM,EAAM,SAAS,GAAG,IAAI,aAAa,GAC/E,EAAI,MAAM,GAAG,EAAE,CAAC,aAAa;;AAEtC,
|
|
1
|
+
{"version":3,"file":"Avatar.js","names":[],"sources":["../../../src/buildmyiq/components/Avatar.tsx"],"sourcesContent":["/**\n * Avatar — a deterministic initials avatar (with optional real image).\n * @module buildmyiq/components\n *\n * HONEST BY DESIGN: when we have a real name/photo (the signed-in user) we show\n * it; for anyone we can only identify by id we render initials derived from the\n * id on a deterministic token-based tint — never a fabricated name or stock\n * photo. The colour is picked from a fixed set of semantic accent tints so it is\n * theme-safe and reproducible for the same seed.\n */\n\nimport type { FC } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface AvatarProps {\n /** Display name — its initials are shown when no image is provided. */\n name?: string | null;\n /** Stable seed (e.g. a user id) used for the tint + fallback initials. */\n seed?: string | null;\n /** Real image URL (only for the signed-in user / resolved members). */\n src?: string | null;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n className?: string;\n}\n\nconst SIZE: Record<NonNullable<AvatarProps['size']>, string> = {\n xs: 'h-6 w-6 text-[10px]',\n sm: 'h-8 w-8 text-xs',\n md: 'h-10 w-10 text-sm',\n lg: 'h-12 w-12 text-base',\n};\n\n// Theme-safe tint set (semantic CSS vars → always resolve in light/dark).\nconst TINTS = [\n 'bg-[var(--color-accent-soft)] text-text-primary',\n 'bg-status-success-bg-subtle text-status-success-text',\n 'bg-status-warning-bg-subtle text-status-warning-text',\n 'bg-[color-mix(in_srgb,var(--color-accent-teal)_18%,transparent)] text-[var(--color-accent-teal)]',\n 'bg-[color-mix(in_srgb,var(--color-accent-primary)_16%,transparent)] text-[var(--color-accent-primary)]',\n 'bg-bg-sunken text-text-secondary',\n];\n\nconst hash = (s: string): number => {\n let h = 0;\n for (let i = 0; i < s.length; i += 1) h = (h * 31 + s.charCodeAt(i)) | 0;\n return Math.abs(h);\n};\n\nconst initialsOf = (name?: string | null, seed?: string | null): string => {\n const src = (name ?? '').trim();\n if (src) {\n const parts = src.split(/\\s+/).filter(Boolean);\n if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n return src.slice(0, 2).toUpperCase();\n }\n return (\n (seed ?? '?')\n .replace(/[^a-zA-Z0-9]/g, '')\n .slice(0, 2)\n .toUpperCase() || '?'\n );\n};\n\nexport const Avatar: FC<AvatarProps> = ({ name, seed, src, size = 'md', className }) => {\n const tint = TINTS[hash(seed ?? name ?? '?') % TINTS.length];\n if (src) {\n return (\n <img\n src={src}\n alt=\"\"\n className={cn('shrink-0 rounded-full object-cover', SIZE[size], className)}\n />\n );\n }\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'inline-flex shrink-0 select-none items-center justify-center rounded-full font-semibold',\n SIZE[size],\n tint,\n className\n )}\n >\n {initialsOf(name, seed)}\n </span>\n );\n};\n"],"mappings":";;;AAyBA,IAAM,IAAyD;CAC7D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACL,EAGK,IAAQ;CACZ;CACA;CACA;CACA;CACA;CACA;CACD,EAEK,KAAQ,MAAsB;CAClC,IAAI,IAAI;AACR,MAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,EAAG,KAAK,IAAI,KAAK,EAAE,WAAW,EAAE,GAAI;AACvE,QAAO,KAAK,IAAI,EAAE;GAGd,KAAc,GAAsB,MAAiC;CACzE,IAAM,KAAO,KAAQ,IAAI,MAAM;AAC/B,KAAI,GAAK;EACP,IAAM,IAAQ,EAAI,MAAM,MAAM,CAAC,OAAO,QAAQ;AAE9C,SADI,EAAM,UAAU,KAAW,EAAM,GAAG,KAAK,EAAM,EAAM,SAAS,GAAG,IAAI,aAAa,GAC/E,EAAI,MAAM,GAAG,EAAE,CAAC,aAAa;;AAEtC,SACG,KAAQ,KACN,QAAQ,iBAAiB,GAAG,CAC5B,MAAM,GAAG,EAAE,CACX,aAAa,IAAI;GAIX,KAA2B,EAAE,SAAM,SAAM,QAAK,UAAO,MAAM,mBAAgB;CACtF,IAAM,IAAO,EAAM,EAAK,KAAQ,KAAQ,IAAI,GAAG,EAAM;AAUrD,QATI,IAEA,kBAAC,OAAD;EACO;EACL,KAAI;EACJ,WAAW,EAAG,sCAAsC,EAAK,IAAO,EAAU;EAC1E,CAAA,GAIJ,kBAAC,QAAD;EACE,eAAY;EACZ,WAAW,EACT,2FACA,EAAK,IACL,GACA,EACD;YAEA,EAAW,GAAM,EAAK;EAClB,CAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { useBuildmyiq as e } from "../context/BuildmyiqContext.js";
|
|
2
|
+
import "../context/index.js";
|
|
2
3
|
import { formatDateTime as t } from "../utils/formatters.js";
|
|
3
4
|
import { EmptyState as n } from "./EmptyState.js";
|
|
4
5
|
import { ErrorView as r, LoadingView as i, Section as a } from "./StateViews.js";
|
|
5
|
-
import "../context/index.js";
|
|
6
6
|
import { useBuiComments as o, useEcoCreateComment as s } from "../hooks/useBuiComments.js";
|
|
7
7
|
import "../hooks/index.js";
|
|
8
8
|
import { useState as c } from "react";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Viz.js","names":[],"sources":["../../../src/buildmyiq/components/Viz.tsx"],"sourcesContent":["/**\n * Viz — tiny self-contained tokenized SVG chart primitives.\n * @module buildmyiq/components\n *\n * ProgressRing (circular % meter) and Sparkline (trend line). Both are pure SVG,\n * driven by semantic CSS-variable colours (no raw hex), and take numeric data\n * only — the caller always passes REAL derived values.\n */\n\nimport type { FC } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface ProgressRingProps {\n /** 0–100. */\n value: number;\n size?: number;\n stroke?: number;\n /** CSS colour for the arc (defaults to the teal accent). */\n color?: string;\n /** Center label; when omitted the rounded percent is shown. */\n label?: string;\n className?: string;\n}\n\nexport const ProgressRing: FC<ProgressRingProps> = ({\n value,\n size = 64,\n stroke = 6,\n color = 'var(--color-accent-teal)',\n label,\n className,\n}) => {\n const clamped = Math.max(0, Math.min(100, value));\n const r = (size - stroke) / 2;\n const c = 2 * Math.PI * r;\n const offset = c - (clamped / 100) * c;\n return (\n <div
|
|
1
|
+
{"version":3,"file":"Viz.js","names":[],"sources":["../../../src/buildmyiq/components/Viz.tsx"],"sourcesContent":["/**\n * Viz — tiny self-contained tokenized SVG chart primitives.\n * @module buildmyiq/components\n *\n * ProgressRing (circular % meter) and Sparkline (trend line). Both are pure SVG,\n * driven by semantic CSS-variable colours (no raw hex), and take numeric data\n * only — the caller always passes REAL derived values.\n */\n\nimport type { FC } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface ProgressRingProps {\n /** 0–100. */\n value: number;\n size?: number;\n stroke?: number;\n /** CSS colour for the arc (defaults to the teal accent). */\n color?: string;\n /** Center label; when omitted the rounded percent is shown. */\n label?: string;\n className?: string;\n}\n\nexport const ProgressRing: FC<ProgressRingProps> = ({\n value,\n size = 64,\n stroke = 6,\n color = 'var(--color-accent-teal)',\n label,\n className,\n}) => {\n const clamped = Math.max(0, Math.min(100, value));\n const r = (size - stroke) / 2;\n const c = 2 * Math.PI * r;\n const offset = c - (clamped / 100) * c;\n return (\n <div\n className={cn('relative inline-flex items-center justify-center', className)}\n style={{ width: size, height: size }}\n >\n <svg width={size} height={size} className=\"-rotate-90\">\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke=\"var(--color-bg-sunken)\"\n strokeWidth={stroke}\n />\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={color}\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n strokeDasharray={c}\n strokeDashoffset={offset}\n className=\"transition-[stroke-dashoffset] duration-700 ease-out\"\n />\n </svg>\n <span className=\"absolute text-xs font-semibold tabular-nums text-text-primary\">\n {label ?? `${Math.round(clamped)}%`}\n </span>\n </div>\n );\n};\n\ninterface SparklineProps {\n /** Series of numbers; rendered as a smooth trend line. */\n data: number[];\n width?: number;\n height?: number;\n color?: string;\n className?: string;\n}\n\nexport const Sparkline: FC<SparklineProps> = ({\n data,\n width = 96,\n height = 28,\n color = 'var(--color-accent-teal)',\n className,\n}) => {\n if (data.length < 2) {\n return (\n <svg width={width} height={height} className={className} aria-hidden=\"true\">\n <line\n x1=\"0\"\n y1={height - 2}\n x2={width}\n y2={height - 2}\n stroke=\"var(--color-border-seam)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n }\n const min = Math.min(...data);\n const max = Math.max(...data);\n const span = max - min || 1;\n const stepX = width / (data.length - 1);\n const pts = data.map((v, i) => {\n const x = i * stepX;\n const y = height - 3 - ((v - min) / span) * (height - 6);\n return `${x.toFixed(1)},${y.toFixed(1)}`;\n });\n return (\n <svg width={width} height={height} className={className} aria-hidden=\"true\">\n <polyline\n points={pts.join(' ')}\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n"],"mappings":";;;AAwBA,IAAa,KAAuC,EAClD,UACA,UAAO,IACP,YAAS,GACT,WAAQ,4BACR,UACA,mBACI;CACJ,IAAM,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,EAAM,CAAC,EAC3C,KAAK,IAAO,KAAU,GACtB,IAAI,IAAI,KAAK,KAAK,GAClB,IAAS,IAAK,IAAU,MAAO;AACrC,QACE,kBAAC,OAAD;EACE,WAAW,EAAG,oDAAoD,EAAU;EAC5E,OAAO;GAAE,OAAO;GAAM,QAAQ;GAAM;YAFtC,CAIE,kBAAC,OAAD;GAAK,OAAO;GAAM,QAAQ;GAAM,WAAU;aAA1C,CACE,kBAAC,UAAD;IACE,IAAI,IAAO;IACX,IAAI,IAAO;IACR;IACH,MAAK;IACL,QAAO;IACP,aAAa;IACb,CAAA,EACF,kBAAC,UAAD;IACE,IAAI,IAAO;IACX,IAAI,IAAO;IACR;IACH,MAAK;IACL,QAAQ;IACR,aAAa;IACb,eAAc;IACd,iBAAiB;IACjB,kBAAkB;IAClB,WAAU;IACV,CAAA,CACE;MACN,kBAAC,QAAD;GAAM,WAAU;aACb,KAAS,GAAG,KAAK,MAAM,EAAQ,CAAC;GAC5B,CAAA,CACH;;GAaG,KAAiC,EAC5C,SACA,WAAQ,IACR,YAAS,IACT,WAAQ,4BACR,mBACI;AACJ,KAAI,EAAK,SAAS,EAChB,QACE,kBAAC,OAAD;EAAY;EAAe;EAAmB;EAAW,eAAY;YACnE,kBAAC,QAAD;GACE,IAAG;GACH,IAAI,IAAS;GACb,IAAI;GACJ,IAAI,IAAS;GACb,QAAO;GACP,aAAY;GACZ,eAAc;GACd,CAAA;EACE,CAAA;CAGV,IAAM,IAAM,KAAK,IAAI,GAAG,EAAK,EAEvB,IADM,KAAK,IAAI,GAAG,EAAK,GACV,KAAO,GACpB,IAAQ,KAAS,EAAK,SAAS;AAMrC,QACE,kBAAC,OAAD;EAAY;EAAe;EAAmB;EAAW,eAAY;YACnE,kBAAC,YAAD;GACE,QARM,EAAK,KAAK,GAAG,MAAM;IAC7B,IAAM,IAAI,IAAI,GACR,IAAI,IAAS,KAAM,IAAI,KAAO,KAAS,IAAS;AACtD,WAAO,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE;KACtC,CAIgB,KAAK,IAAI;GACrB,MAAK;GACL,QAAQ;GACR,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE,CAAA"}
|