@lssm/example.learning-journey-registry 0.0.0-canary-20251217060834 → 0.0.0-canary-20251217073102

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 (112) hide show
  1. package/.turbo/turbo-build$colon$bundle.log +410 -64
  2. package/.turbo/turbo-build.log +55 -65
  3. package/CHANGELOG.md +14 -12
  4. package/dist/api.js +170 -1
  5. package/dist/docs/index.js +1 -1
  6. package/dist/docs/learning-journey-registry.docblock.js +38 -1
  7. package/dist/example.js +34 -1
  8. package/dist/examples/learning-journey-ambient-coach/src/track.js +41 -0
  9. package/dist/examples/learning-journey-crm-onboarding/dist/track.js +98 -0
  10. package/dist/examples/learning-journey-duo-drills/src/track.js +65 -0
  11. package/dist/examples/learning-journey-platform-tour/dist/track.js +105 -0
  12. package/dist/examples/learning-journey-quest-challenges/src/track.js +35 -0
  13. package/dist/examples/learning-journey-studio-onboarding/dist/track.js +90 -0
  14. package/dist/examples/learning-journey-ui-coaching/src/CoachingMiniApp.js +64 -0
  15. package/dist/examples/learning-journey-ui-coaching/src/components/EngagementMeter.js +107 -0
  16. package/dist/examples/learning-journey-ui-coaching/src/components/TipCard.js +75 -0
  17. package/dist/examples/learning-journey-ui-coaching/src/components/TipFeed.js +65 -0
  18. package/dist/examples/learning-journey-ui-coaching/src/components/index.js +3 -0
  19. package/dist/examples/learning-journey-ui-coaching/src/docs/index.js +1 -0
  20. package/dist/examples/learning-journey-ui-coaching/src/docs/learning-journey-ui-coaching.docblock.js +20 -0
  21. package/dist/examples/learning-journey-ui-coaching/src/index.js +11 -0
  22. package/dist/examples/learning-journey-ui-coaching/src/views/Overview.js +152 -0
  23. package/dist/examples/learning-journey-ui-coaching/src/views/Progress.js +117 -0
  24. package/dist/examples/learning-journey-ui-coaching/src/views/Steps.js +68 -0
  25. package/dist/examples/learning-journey-ui-coaching/src/views/Timeline.js +112 -0
  26. package/dist/examples/learning-journey-ui-coaching/src/views/index.js +4 -0
  27. package/dist/examples/learning-journey-ui-gamified/src/GamifiedMiniApp.js +64 -0
  28. package/dist/examples/learning-journey-ui-gamified/src/components/DayCalendar.js +32 -0
  29. package/dist/examples/learning-journey-ui-gamified/src/components/FlashCard.js +79 -0
  30. package/dist/examples/learning-journey-ui-gamified/src/components/MasteryRing.js +81 -0
  31. package/dist/examples/learning-journey-ui-gamified/src/components/index.js +3 -0
  32. package/dist/examples/learning-journey-ui-gamified/src/docs/index.js +1 -0
  33. package/dist/examples/learning-journey-ui-gamified/src/docs/learning-journey-ui-gamified.docblock.js +20 -0
  34. package/dist/examples/learning-journey-ui-gamified/src/index.js +11 -0
  35. package/dist/examples/learning-journey-ui-gamified/src/views/Overview.js +163 -0
  36. package/dist/examples/learning-journey-ui-gamified/src/views/Progress.js +144 -0
  37. package/dist/examples/learning-journey-ui-gamified/src/views/Steps.js +55 -0
  38. package/dist/examples/learning-journey-ui-gamified/src/views/Timeline.js +132 -0
  39. package/dist/examples/learning-journey-ui-gamified/src/views/index.js +4 -0
  40. package/dist/examples/learning-journey-ui-onboarding/src/OnboardingMiniApp.js +64 -0
  41. package/dist/examples/learning-journey-ui-onboarding/src/components/CodeSnippet.js +4 -0
  42. package/dist/examples/learning-journey-ui-onboarding/src/components/JourneyMap.js +48 -0
  43. package/dist/examples/learning-journey-ui-onboarding/src/components/StepChecklist.js +79 -0
  44. package/dist/examples/learning-journey-ui-onboarding/src/components/index.js +3 -0
  45. package/dist/examples/learning-journey-ui-onboarding/src/docs/index.js +1 -0
  46. package/dist/examples/learning-journey-ui-onboarding/src/docs/learning-journey-ui-onboarding.docblock.js +20 -0
  47. package/dist/examples/learning-journey-ui-onboarding/src/index.js +10 -0
  48. package/dist/examples/learning-journey-ui-onboarding/src/views/Overview.js +180 -0
  49. package/dist/examples/learning-journey-ui-onboarding/src/views/Progress.js +162 -0
  50. package/dist/examples/learning-journey-ui-onboarding/src/views/Steps.js +91 -0
  51. package/dist/examples/learning-journey-ui-onboarding/src/views/Timeline.js +97 -0
  52. package/dist/examples/learning-journey-ui-onboarding/src/views/index.js +4 -0
  53. package/dist/examples/learning-journey-ui-shared/src/components/BadgeDisplay.js +44 -0
  54. package/dist/examples/learning-journey-ui-shared/src/components/StreakCounter.js +45 -0
  55. package/dist/examples/learning-journey-ui-shared/src/components/ViewTabs.js +48 -0
  56. package/dist/examples/learning-journey-ui-shared/src/components/XpBar.js +46 -0
  57. package/dist/examples/learning-journey-ui-shared/src/components/index.js +4 -0
  58. package/dist/examples/learning-journey-ui-shared/src/docs/index.js +1 -0
  59. package/dist/examples/learning-journey-ui-shared/src/docs/learning-journey-ui-shared.docblock.js +20 -0
  60. package/dist/examples/learning-journey-ui-shared/src/hooks/index.js +1 -0
  61. package/dist/examples/learning-journey-ui-shared/src/hooks/useLearningProgress.js +73 -0
  62. package/dist/examples/learning-journey-ui-shared/src/index.js +8 -0
  63. package/dist/index.js +13 -1
  64. package/dist/learning-journey-registry.feature.js +66 -1
  65. package/dist/libs/contracts/dist/docs/PUBLISHING.docblock.js +16 -76
  66. package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js +16 -350
  67. package/dist/libs/contracts/dist/docs/index.js +29 -1
  68. package/dist/libs/contracts/dist/docs/presentations.js +71 -1
  69. package/dist/libs/contracts/dist/docs/registry.js +44 -1
  70. package/dist/libs/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +16 -383
  71. package/dist/libs/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +16 -68
  72. package/dist/libs/contracts/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +16 -140
  73. package/dist/libs/contracts/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +16 -86
  74. package/dist/libs/contracts/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +16 -1
  75. package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js +24 -2
  76. package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js +21 -2
  77. package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js +16 -213
  78. package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js +73 -5
  79. package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js +37 -1
  80. package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js +16 -1
  81. package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js +20 -262
  82. package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js +48 -1
  83. package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js +24 -2
  84. package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js +23 -2
  85. package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js +25 -16
  86. package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js +67 -1
  87. package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js +22 -2
  88. package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js +40 -36
  89. package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js +47 -1
  90. package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js +23 -2
  91. package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js +36 -3
  92. package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js +20 -1
  93. package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js +36 -3
  94. package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js +20 -1
  95. package/dist/libs/design-system/dist/_virtual/rolldown_runtime.js +5 -0
  96. package/dist/libs/design-system/dist/components/atoms/Button.js +33 -0
  97. package/dist/libs/design-system/dist/ui-kit-web/dist/ui/button.js +55 -0
  98. package/dist/libs/design-system/dist/ui-kit-web/dist/ui-kit-core/dist/utils.js +13 -0
  99. package/dist/libs/ui-kit-core/dist/utils.js +10 -0
  100. package/dist/libs/ui-kit-web/dist/ui/card.js +36 -0
  101. package/dist/libs/ui-kit-web/dist/ui/progress.js +23 -0
  102. package/dist/libs/ui-kit-web/dist/ui/utils.js +10 -0
  103. package/dist/libs/ui-kit-web/dist/ui-kit-core/dist/utils.js +10 -0
  104. package/dist/presentations/index.js +64 -1
  105. package/dist/progress-store.js +30 -1
  106. package/dist/tracks.d.ts +1 -1
  107. package/dist/tracks.js +47 -1
  108. package/dist/ui/LearningMiniApp.d.ts +0 -1
  109. package/dist/ui/LearningMiniApp.js +82 -1
  110. package/dist/ui/index.js +3 -1
  111. package/package.json +16 -14
  112. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,152 @@
1
+ 'use client';
2
+
3
+ import { Card, CardContent, CardHeader, CardTitle } from "../../../../libs/ui-kit-web/dist/ui/card.js";
4
+ import { XpBar } from "../../../learning-journey-ui-shared/src/components/XpBar.js";
5
+ import { StreakCounter } from "../../../learning-journey-ui-shared/src/components/StreakCounter.js";
6
+ import { Button$1 } from "../../../../libs/design-system/dist/components/atoms/Button.js";
7
+ import "../../../learning-journey-ui-shared/src/index.js";
8
+ import { TipCard } from "../components/TipCard.js";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+
11
+ //#region ../learning-journey-ui-coaching/src/views/Overview.tsx
12
+ function Overview({ track, progress, onStepComplete, onStart }) {
13
+ const totalXp = track.totalXp ?? track.steps.reduce((sum, s) => sum + (s.xpReward ?? 0), 0);
14
+ const completedSteps = progress.completedStepIds.length;
15
+ const totalSteps = track.steps.length;
16
+ const pendingSteps = totalSteps - completedSteps;
17
+ const activeTips = track.steps.filter((s) => !progress.completedStepIds.includes(s.id)).slice(0, 3);
18
+ return /* @__PURE__ */ jsxs("div", {
19
+ className: "space-y-6",
20
+ children: [
21
+ /* @__PURE__ */ jsx(Card, {
22
+ className: "overflow-hidden bg-gradient-to-br from-amber-500/10 via-orange-500/10 to-red-500/10",
23
+ children: /* @__PURE__ */ jsx(CardContent, {
24
+ className: "p-6",
25
+ children: /* @__PURE__ */ jsxs("div", {
26
+ className: "flex flex-col items-center gap-4 text-center md:flex-row md:text-left",
27
+ children: [
28
+ /* @__PURE__ */ jsx("div", {
29
+ className: "flex h-16 w-16 items-center justify-center rounded-2xl bg-gradient-to-br from-amber-500 to-orange-600 text-3xl shadow-lg",
30
+ children: "💡"
31
+ }),
32
+ /* @__PURE__ */ jsxs("div", {
33
+ className: "flex-1",
34
+ children: [/* @__PURE__ */ jsx("h1", {
35
+ className: "text-2xl font-bold",
36
+ children: track.name
37
+ }), /* @__PURE__ */ jsx("p", {
38
+ className: "text-muted-foreground mt-1",
39
+ children: track.description
40
+ })]
41
+ }),
42
+ /* @__PURE__ */ jsx("div", {
43
+ className: "flex items-center gap-4",
44
+ children: /* @__PURE__ */ jsx(StreakCounter, {
45
+ days: progress.streakDays,
46
+ size: "lg"
47
+ })
48
+ })
49
+ ]
50
+ })
51
+ })
52
+ }),
53
+ /* @__PURE__ */ jsxs("div", {
54
+ className: "grid gap-4 md:grid-cols-3",
55
+ children: [
56
+ /* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsx(CardHeader, {
57
+ className: "pb-2",
58
+ children: /* @__PURE__ */ jsx(CardTitle, {
59
+ className: "text-muted-foreground text-sm font-medium",
60
+ children: "Active Tips"
61
+ })
62
+ }), /* @__PURE__ */ jsxs(CardContent, { children: [/* @__PURE__ */ jsx("div", {
63
+ className: "text-3xl font-bold text-amber-500",
64
+ children: pendingSteps
65
+ }), /* @__PURE__ */ jsx("p", {
66
+ className: "text-muted-foreground text-sm",
67
+ children: "tips for you today"
68
+ })] })] }),
69
+ /* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsx(CardHeader, {
70
+ className: "pb-2",
71
+ children: /* @__PURE__ */ jsx(CardTitle, {
72
+ className: "text-muted-foreground text-sm font-medium",
73
+ children: "Tips Actioned"
74
+ })
75
+ }), /* @__PURE__ */ jsxs(CardContent, { children: [/* @__PURE__ */ jsx("div", {
76
+ className: "text-3xl font-bold text-green-500",
77
+ children: completedSteps
78
+ }), /* @__PURE__ */ jsxs("p", {
79
+ className: "text-muted-foreground text-sm",
80
+ children: [
81
+ "out of ",
82
+ totalSteps,
83
+ " total"
84
+ ]
85
+ })] })] }),
86
+ /* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsx(CardHeader, {
87
+ className: "pb-2",
88
+ children: /* @__PURE__ */ jsx(CardTitle, {
89
+ className: "text-muted-foreground text-sm font-medium",
90
+ children: "XP Earned"
91
+ })
92
+ }), /* @__PURE__ */ jsxs(CardContent, { children: [/* @__PURE__ */ jsx("div", {
93
+ className: "text-3xl font-bold text-orange-500",
94
+ children: progress.xpEarned
95
+ }), /* @__PURE__ */ jsx(XpBar, {
96
+ current: progress.xpEarned,
97
+ max: totalXp,
98
+ showLabel: false,
99
+ size: "sm"
100
+ })] })] })
101
+ ]
102
+ }),
103
+ activeTips.length > 0 && /* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsxs(CardHeader, {
104
+ className: "flex flex-row items-center justify-between",
105
+ children: [/* @__PURE__ */ jsxs(CardTitle, {
106
+ className: "flex items-center gap-2",
107
+ children: [/* @__PURE__ */ jsx("span", { children: "💡" }), /* @__PURE__ */ jsx("span", { children: "Tips for You" })]
108
+ }), activeTips.length < pendingSteps && /* @__PURE__ */ jsxs(Button$1, {
109
+ variant: "outline",
110
+ size: "sm",
111
+ onClick: onStart,
112
+ children: [
113
+ "View All (",
114
+ pendingSteps,
115
+ ")"
116
+ ]
117
+ })]
118
+ }), /* @__PURE__ */ jsx(CardContent, {
119
+ className: "space-y-3",
120
+ children: activeTips.map((step) => /* @__PURE__ */ jsx(TipCard, {
121
+ step,
122
+ isCompleted: false,
123
+ isCurrent: step.id === activeTips[0]?.id,
124
+ onComplete: () => onStepComplete?.(step.id)
125
+ }, step.id))
126
+ })] }),
127
+ pendingSteps === 0 && /* @__PURE__ */ jsx(Card, {
128
+ className: "border-green-500/50 bg-green-500/5",
129
+ children: /* @__PURE__ */ jsxs(CardContent, {
130
+ className: "flex items-center gap-4 p-6",
131
+ children: [/* @__PURE__ */ jsx("div", {
132
+ className: "text-4xl",
133
+ children: "🎉"
134
+ }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
135
+ className: "text-lg font-semibold text-green-500",
136
+ children: "All Tips Actioned!"
137
+ }), /* @__PURE__ */ jsxs("p", {
138
+ className: "text-muted-foreground",
139
+ children: [
140
+ "Great job! You've addressed all ",
141
+ totalSteps,
142
+ " coaching tips."
143
+ ]
144
+ })] })]
145
+ })
146
+ })
147
+ ]
148
+ });
149
+ }
150
+
151
+ //#endregion
152
+ export { Overview };
@@ -0,0 +1,117 @@
1
+ 'use client';
2
+
3
+ import { Card, CardContent, CardHeader, CardTitle } from "../../../../libs/ui-kit-web/dist/ui/card.js";
4
+ import { XpBar } from "../../../learning-journey-ui-shared/src/components/XpBar.js";
5
+ import { StreakCounter } from "../../../learning-journey-ui-shared/src/components/StreakCounter.js";
6
+ import { BadgeDisplay } from "../../../learning-journey-ui-shared/src/components/BadgeDisplay.js";
7
+ import "../../../learning-journey-ui-shared/src/index.js";
8
+ import { EngagementMeter } from "../components/EngagementMeter.js";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+
11
+ //#region ../learning-journey-ui-coaching/src/views/Progress.tsx
12
+ function ProgressView({ track, progress }) {
13
+ const totalXp = track.totalXp ?? track.steps.reduce((sum, s) => sum + (s.xpReward ?? 0), 0);
14
+ const completedSteps = progress.completedStepIds.length;
15
+ const pendingSteps = track.steps.length - completedSteps;
16
+ const actioned = Math.floor(completedSteps * .7);
17
+ const acknowledged = completedSteps - actioned;
18
+ return /* @__PURE__ */ jsxs("div", {
19
+ className: "space-y-6",
20
+ children: [
21
+ /* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, {
22
+ className: "flex items-center gap-2",
23
+ children: [/* @__PURE__ */ jsx("span", { children: "📊" }), /* @__PURE__ */ jsx("span", { children: "Engagement Overview" })]
24
+ }) }), /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(EngagementMeter, {
25
+ actioned,
26
+ acknowledged,
27
+ pending: pendingSteps,
28
+ streak: progress.streakDays
29
+ }) })] }),
30
+ /* @__PURE__ */ jsxs("div", {
31
+ className: "grid gap-4 md:grid-cols-2",
32
+ children: [/* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsx(CardHeader, {
33
+ className: "pb-2",
34
+ children: /* @__PURE__ */ jsx(CardTitle, {
35
+ className: "text-muted-foreground text-sm font-medium",
36
+ children: "XP Earned"
37
+ })
38
+ }), /* @__PURE__ */ jsxs(CardContent, {
39
+ className: "space-y-3",
40
+ children: [/* @__PURE__ */ jsxs("div", {
41
+ className: "flex items-baseline gap-2",
42
+ children: [/* @__PURE__ */ jsx("span", {
43
+ className: "text-3xl font-bold text-orange-500",
44
+ children: progress.xpEarned
45
+ }), /* @__PURE__ */ jsxs("span", {
46
+ className: "text-muted-foreground",
47
+ children: [
48
+ "/ ",
49
+ totalXp,
50
+ " XP"
51
+ ]
52
+ })]
53
+ }), /* @__PURE__ */ jsx(XpBar, {
54
+ current: progress.xpEarned,
55
+ max: totalXp,
56
+ showLabel: false,
57
+ size: "lg"
58
+ })]
59
+ })] }), /* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsx(CardHeader, {
60
+ className: "pb-2",
61
+ children: /* @__PURE__ */ jsx(CardTitle, {
62
+ className: "text-muted-foreground text-sm font-medium",
63
+ children: "Engagement Streak"
64
+ })
65
+ }), /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs("div", {
66
+ className: "flex items-center gap-4",
67
+ children: [/* @__PURE__ */ jsx(StreakCounter, {
68
+ days: progress.streakDays,
69
+ size: "lg"
70
+ }), /* @__PURE__ */ jsx("div", {
71
+ className: "text-muted-foreground text-sm",
72
+ children: progress.streakDays > 0 ? "Keep going!" : "Start your streak today!"
73
+ })]
74
+ }) })] })]
75
+ }),
76
+ /* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, {
77
+ className: "flex items-center gap-2",
78
+ children: [/* @__PURE__ */ jsx("span", { children: "🏅" }), /* @__PURE__ */ jsx("span", { children: "Achievements" })]
79
+ }) }), /* @__PURE__ */ jsxs(CardContent, { children: [/* @__PURE__ */ jsx(BadgeDisplay, {
80
+ badges: progress.badges,
81
+ size: "lg",
82
+ maxVisible: 10
83
+ }), progress.badges.length === 0 && /* @__PURE__ */ jsx("p", {
84
+ className: "text-muted-foreground text-sm",
85
+ children: "Action tips to unlock achievements!"
86
+ })] })] }),
87
+ /* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, {
88
+ className: "flex items-center gap-2",
89
+ children: [/* @__PURE__ */ jsx("span", { children: "💡" }), /* @__PURE__ */ jsx("span", { children: "Tip Status" })]
90
+ }) }), /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx("div", {
91
+ className: "space-y-3",
92
+ children: track.steps.map((step) => {
93
+ const isCompleted = progress.completedStepIds.includes(step.id);
94
+ return /* @__PURE__ */ jsxs("div", {
95
+ className: "flex items-center justify-between rounded-lg border p-3",
96
+ children: [/* @__PURE__ */ jsxs("div", {
97
+ className: "flex items-center gap-3",
98
+ children: [/* @__PURE__ */ jsx("span", {
99
+ className: isCompleted ? "text-green-500" : "text-amber-500",
100
+ children: isCompleted ? "✓" : "○"
101
+ }), /* @__PURE__ */ jsx("span", {
102
+ className: isCompleted ? "text-muted-foreground" : "text-foreground",
103
+ children: step.title
104
+ })]
105
+ }), /* @__PURE__ */ jsx("span", {
106
+ className: `text-sm ${isCompleted ? "text-green-500" : "text-muted-foreground"}`,
107
+ children: isCompleted ? "Actioned" : "Pending"
108
+ })]
109
+ }, step.id);
110
+ })
111
+ }) })] })
112
+ ]
113
+ });
114
+ }
115
+
116
+ //#endregion
117
+ export { ProgressView };
@@ -0,0 +1,68 @@
1
+ 'use client';
2
+
3
+ import { TipCard } from "../components/TipCard.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+
6
+ //#region ../learning-journey-ui-coaching/src/views/Steps.tsx
7
+ function Steps({ track, progress, onStepComplete }) {
8
+ const completedSteps = progress.completedStepIds.length;
9
+ const totalSteps = track.steps.length;
10
+ const sortedSteps = [...track.steps].sort((a, b) => {
11
+ const aCompleted = progress.completedStepIds.includes(a.id);
12
+ if (aCompleted === progress.completedStepIds.includes(b.id)) return 0;
13
+ return aCompleted ? 1 : -1;
14
+ });
15
+ const currentStepId = track.steps.find((s) => !progress.completedStepIds.includes(s.id))?.id;
16
+ return /* @__PURE__ */ jsxs("div", {
17
+ className: "space-y-6",
18
+ children: [
19
+ /* @__PURE__ */ jsxs("div", {
20
+ className: "text-center",
21
+ children: [
22
+ /* @__PURE__ */ jsx("h2", {
23
+ className: "text-xl font-bold",
24
+ children: "Coaching Tips"
25
+ }),
26
+ /* @__PURE__ */ jsx("p", {
27
+ className: "text-muted-foreground",
28
+ children: "Review and take action on personalized tips"
29
+ }),
30
+ /* @__PURE__ */ jsxs("p", {
31
+ className: "text-muted-foreground mt-2 text-sm",
32
+ children: [
33
+ completedSteps,
34
+ " of ",
35
+ totalSteps,
36
+ " tips actioned"
37
+ ]
38
+ })
39
+ ]
40
+ }),
41
+ /* @__PURE__ */ jsx("div", {
42
+ className: "space-y-3",
43
+ children: sortedSteps.map((step) => {
44
+ return /* @__PURE__ */ jsx(TipCard, {
45
+ step,
46
+ isCompleted: progress.completedStepIds.includes(step.id),
47
+ isCurrent: step.id === currentStepId,
48
+ onComplete: () => onStepComplete?.(step.id),
49
+ onDismiss: () => onStepComplete?.(step.id)
50
+ }, step.id);
51
+ })
52
+ }),
53
+ completedSteps === totalSteps && /* @__PURE__ */ jsxs("div", {
54
+ className: "text-muted-foreground text-center",
55
+ children: [/* @__PURE__ */ jsx("span", {
56
+ className: "text-2xl",
57
+ children: "✨"
58
+ }), /* @__PURE__ */ jsx("p", {
59
+ className: "mt-2",
60
+ children: "All tips have been addressed!"
61
+ })]
62
+ })
63
+ ]
64
+ });
65
+ }
66
+
67
+ //#endregion
68
+ export { Steps };
@@ -0,0 +1,112 @@
1
+ 'use client';
2
+
3
+ import { Card, CardContent, CardHeader, CardTitle } from "../../../../libs/ui-kit-web/dist/ui/card.js";
4
+ import { TipFeed } from "../components/TipFeed.js";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+
7
+ //#region ../learning-journey-ui-coaching/src/views/Timeline.tsx
8
+ function Timeline({ track, progress }) {
9
+ const feedItems = track.steps.map((step) => ({
10
+ step,
11
+ isCompleted: progress.completedStepIds.includes(step.id),
12
+ completedAt: progress.completedStepIds.includes(step.id) ? "Recently" : void 0
13
+ })).sort((a, b) => {
14
+ if (a.isCompleted && !b.isCompleted) return -1;
15
+ if (!a.isCompleted && b.isCompleted) return 1;
16
+ return 0;
17
+ });
18
+ const completedCount = feedItems.filter((f) => f.isCompleted).length;
19
+ const pendingCount = feedItems.length - completedCount;
20
+ return /* @__PURE__ */ jsxs("div", {
21
+ className: "space-y-6",
22
+ children: [
23
+ /* @__PURE__ */ jsxs("div", {
24
+ className: "text-center",
25
+ children: [/* @__PURE__ */ jsx("h2", {
26
+ className: "text-xl font-bold",
27
+ children: "Activity Timeline"
28
+ }), /* @__PURE__ */ jsx("p", {
29
+ className: "text-muted-foreground",
30
+ children: "Your coaching journey and tip history"
31
+ })]
32
+ }),
33
+ /* @__PURE__ */ jsxs("div", {
34
+ className: "grid grid-cols-2 gap-4",
35
+ children: [/* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, {
36
+ className: "p-4 text-center",
37
+ children: [/* @__PURE__ */ jsx("div", {
38
+ className: "text-2xl font-bold text-green-500",
39
+ children: completedCount
40
+ }), /* @__PURE__ */ jsx("div", {
41
+ className: "text-muted-foreground text-sm",
42
+ children: "Tips Actioned"
43
+ })]
44
+ }) }), /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, {
45
+ className: "p-4 text-center",
46
+ children: [/* @__PURE__ */ jsx("div", {
47
+ className: "text-2xl font-bold text-amber-500",
48
+ children: pendingCount
49
+ }), /* @__PURE__ */ jsx("div", {
50
+ className: "text-muted-foreground text-sm",
51
+ children: "Tips Pending"
52
+ })]
53
+ }) })]
54
+ }),
55
+ /* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, {
56
+ className: "flex items-center gap-2",
57
+ children: [/* @__PURE__ */ jsx("span", { children: "📝" }), /* @__PURE__ */ jsx("span", { children: "Coaching Feed" })]
58
+ }) }), /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(TipFeed, { items: feedItems }) })] }),
59
+ /* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, {
60
+ className: "flex items-center gap-2",
61
+ children: [/* @__PURE__ */ jsx("span", { children: "📈" }), /* @__PURE__ */ jsx("span", { children: "Journey Stats" })]
62
+ }) }), /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs("div", {
63
+ className: "space-y-4",
64
+ children: [
65
+ /* @__PURE__ */ jsxs("div", {
66
+ className: "flex items-center justify-between",
67
+ children: [/* @__PURE__ */ jsx("span", {
68
+ className: "text-muted-foreground",
69
+ children: "Total Tips"
70
+ }), /* @__PURE__ */ jsx("span", {
71
+ className: "font-semibold",
72
+ children: track.steps.length
73
+ })]
74
+ }),
75
+ /* @__PURE__ */ jsxs("div", {
76
+ className: "flex items-center justify-between",
77
+ children: [/* @__PURE__ */ jsx("span", {
78
+ className: "text-muted-foreground",
79
+ children: "Completed"
80
+ }), /* @__PURE__ */ jsx("span", {
81
+ className: "font-semibold text-green-500",
82
+ children: completedCount
83
+ })]
84
+ }),
85
+ /* @__PURE__ */ jsxs("div", {
86
+ className: "flex items-center justify-between",
87
+ children: [/* @__PURE__ */ jsx("span", {
88
+ className: "text-muted-foreground",
89
+ children: "XP Earned"
90
+ }), /* @__PURE__ */ jsx("span", {
91
+ className: "font-semibold text-orange-500",
92
+ children: progress.xpEarned
93
+ })]
94
+ }),
95
+ /* @__PURE__ */ jsxs("div", {
96
+ className: "flex items-center justify-between",
97
+ children: [/* @__PURE__ */ jsx("span", {
98
+ className: "text-muted-foreground",
99
+ children: "Current Streak"
100
+ }), /* @__PURE__ */ jsx("span", {
101
+ className: "font-semibold",
102
+ children: progress.streakDays > 0 ? `🔥 ${progress.streakDays} days` : "Start today!"
103
+ })]
104
+ })
105
+ ]
106
+ }) })] })
107
+ ]
108
+ });
109
+ }
110
+
111
+ //#endregion
112
+ export { Timeline };
@@ -0,0 +1,4 @@
1
+ import { Overview } from "./Overview.js";
2
+ import { Steps } from "./Steps.js";
3
+ import { ProgressView } from "./Progress.js";
4
+ import { Timeline } from "./Timeline.js";
@@ -0,0 +1,64 @@
1
+ 'use client';
2
+
3
+ import { Card, CardContent } from "../../../libs/ui-kit-web/dist/ui/card.js";
4
+ import { useLearningProgress } from "../../learning-journey-ui-shared/src/hooks/useLearningProgress.js";
5
+ import { ViewTabs } from "../../learning-journey-ui-shared/src/components/ViewTabs.js";
6
+ import "../../learning-journey-ui-shared/src/index.js";
7
+ import { Overview } from "./views/Overview.js";
8
+ import { Steps } from "./views/Steps.js";
9
+ import { Progress } from "./views/Progress.js";
10
+ import { Timeline } from "./views/Timeline.js";
11
+ import { useCallback, useState } from "react";
12
+ import { jsx, jsxs } from "react/jsx-runtime";
13
+
14
+ //#region ../learning-journey-ui-gamified/src/GamifiedMiniApp.tsx
15
+ function GamifiedMiniApp({ track, progress: externalProgress, onStepComplete: externalOnStepComplete, onViewChange, initialView = "overview" }) {
16
+ const [currentView, setCurrentView] = useState(initialView);
17
+ const { progress: internalProgress, completeStep: internalCompleteStep } = useLearningProgress(track);
18
+ const progress = externalProgress ?? internalProgress;
19
+ const handleViewChange = useCallback((view) => {
20
+ setCurrentView(view);
21
+ onViewChange?.(view);
22
+ }, [onViewChange]);
23
+ const handleStepComplete = useCallback((stepId) => {
24
+ if (externalOnStepComplete) externalOnStepComplete(stepId);
25
+ else internalCompleteStep(stepId);
26
+ }, [externalOnStepComplete, internalCompleteStep]);
27
+ const handleStartFromOverview = useCallback(() => {
28
+ setCurrentView("steps");
29
+ onViewChange?.("steps");
30
+ }, [onViewChange]);
31
+ const renderView = () => {
32
+ const viewProps = {
33
+ track,
34
+ progress,
35
+ onStepComplete: handleStepComplete
36
+ };
37
+ switch (currentView) {
38
+ case "overview": return /* @__PURE__ */ jsx(Overview, {
39
+ ...viewProps,
40
+ onStart: handleStartFromOverview
41
+ });
42
+ case "steps": return /* @__PURE__ */ jsx(Steps, { ...viewProps });
43
+ case "progress": return /* @__PURE__ */ jsx(Progress, { ...viewProps });
44
+ case "timeline": return /* @__PURE__ */ jsx(Timeline, { ...viewProps });
45
+ default: return /* @__PURE__ */ jsx(Overview, {
46
+ ...viewProps,
47
+ onStart: handleStartFromOverview
48
+ });
49
+ }
50
+ };
51
+ return /* @__PURE__ */ jsxs("div", {
52
+ className: "space-y-6",
53
+ children: [/* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx(CardContent, {
54
+ className: "p-4",
55
+ children: /* @__PURE__ */ jsx(ViewTabs, {
56
+ currentView,
57
+ onViewChange: handleViewChange
58
+ })
59
+ }) }), renderView()]
60
+ });
61
+ }
62
+
63
+ //#endregion
64
+ export { GamifiedMiniApp };
@@ -0,0 +1,32 @@
1
+ 'use client';
2
+
3
+ import { cn } from "../../../../libs/ui-kit-web/dist/ui/utils.js";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+
6
+ //#region ../learning-journey-ui-gamified/src/components/DayCalendar.tsx
7
+ function DayCalendar({ totalDays, currentDay, completedDays }) {
8
+ return /* @__PURE__ */ jsx("div", {
9
+ className: "grid grid-cols-7 gap-2",
10
+ children: Array.from({ length: totalDays }, (_, i) => i + 1).map((day) => {
11
+ const isCompleted = completedDays.includes(day);
12
+ const isCurrent = day === currentDay;
13
+ const isLocked = day > currentDay;
14
+ return /* @__PURE__ */ jsx("div", {
15
+ className: cn("flex h-12 w-12 flex-col items-center justify-center rounded-lg border text-sm font-medium transition-all", isCompleted && "border-green-500 bg-green-500/10 text-green-500", isCurrent && !isCompleted && "border-violet-500 bg-violet-500/10 text-violet-500 ring-2 ring-violet-500/50", isLocked && "border-muted bg-muted/50 text-muted-foreground", !isCompleted && !isCurrent && !isLocked && "border-border bg-card"),
16
+ children: isCompleted ? /* @__PURE__ */ jsx("span", {
17
+ className: "text-lg",
18
+ children: "✓"
19
+ }) : isLocked ? /* @__PURE__ */ jsx("span", {
20
+ className: "text-lg",
21
+ children: "🔒"
22
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
23
+ className: "text-muted-foreground text-xs",
24
+ children: "Day"
25
+ }), /* @__PURE__ */ jsx("span", { children: day })] })
26
+ }, day);
27
+ })
28
+ });
29
+ }
30
+
31
+ //#endregion
32
+ export { DayCalendar };
@@ -0,0 +1,79 @@
1
+ 'use client';
2
+
3
+ import { Card, CardContent } from "../../../../libs/ui-kit-web/dist/ui/card.js";
4
+ import { cn } from "../../../../libs/ui-kit-web/dist/ui/utils.js";
5
+ import { Button$1 } from "../../../../libs/design-system/dist/components/atoms/Button.js";
6
+ import { useState } from "react";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+
9
+ //#region ../learning-journey-ui-gamified/src/components/FlashCard.tsx
10
+ function FlashCard({ step, isCompleted, isCurrent, onComplete }) {
11
+ const [isFlipped, setIsFlipped] = useState(false);
12
+ return /* @__PURE__ */ jsx(Card, {
13
+ className: cn("relative cursor-pointer overflow-hidden transition-all duration-300", isCurrent && "ring-primary ring-2", isCompleted && "opacity-60"),
14
+ onClick: () => !isCompleted && setIsFlipped(!isFlipped),
15
+ children: /* @__PURE__ */ jsxs(CardContent, {
16
+ className: "p-6",
17
+ children: [/* @__PURE__ */ jsxs("div", {
18
+ className: cn("space-y-4 transition-opacity duration-200", isFlipped ? "opacity-0" : "opacity-100"),
19
+ children: [
20
+ /* @__PURE__ */ jsxs("div", {
21
+ className: "flex items-start justify-between",
22
+ children: [/* @__PURE__ */ jsxs("div", {
23
+ className: "flex-1",
24
+ children: [/* @__PURE__ */ jsx("h3", {
25
+ className: "text-lg font-semibold",
26
+ children: step.title
27
+ }), step.description && /* @__PURE__ */ jsx("p", {
28
+ className: "text-muted-foreground mt-1 text-sm",
29
+ children: step.description
30
+ })]
31
+ }), step.xpReward && /* @__PURE__ */ jsxs("span", {
32
+ className: "rounded-full bg-green-500/10 px-2 py-1 text-xs font-semibold text-green-500",
33
+ children: [
34
+ "+",
35
+ step.xpReward,
36
+ " XP"
37
+ ]
38
+ })]
39
+ }),
40
+ isCompleted && /* @__PURE__ */ jsxs("div", {
41
+ className: "flex items-center gap-2 text-green-500",
42
+ children: [/* @__PURE__ */ jsx("span", { children: "✓" }), /* @__PURE__ */ jsx("span", {
43
+ className: "text-sm font-medium",
44
+ children: "Completed"
45
+ })]
46
+ }),
47
+ isCurrent && !isCompleted && /* @__PURE__ */ jsx("p", {
48
+ className: "text-muted-foreground text-xs",
49
+ children: "Tap to reveal action"
50
+ })
51
+ ]
52
+ }), isFlipped && !isCompleted && /* @__PURE__ */ jsxs("div", {
53
+ className: "absolute inset-0 flex flex-col items-center justify-center gap-4 bg-gradient-to-br from-violet-500/10 to-violet-600/10 p-6",
54
+ children: [/* @__PURE__ */ jsx("p", {
55
+ className: "text-center text-sm",
56
+ children: step.instructions ?? "Complete this step to earn XP"
57
+ }), /* @__PURE__ */ jsxs("div", {
58
+ className: "flex gap-2",
59
+ children: [/* @__PURE__ */ jsx(Button$1, {
60
+ variant: "outline",
61
+ size: "sm",
62
+ onClick: () => setIsFlipped(false),
63
+ children: "Back"
64
+ }), /* @__PURE__ */ jsx(Button$1, {
65
+ size: "sm",
66
+ onClick: (e) => {
67
+ e.stopPropagation();
68
+ onComplete?.();
69
+ },
70
+ children: "Mark Complete"
71
+ })]
72
+ })]
73
+ })]
74
+ })
75
+ });
76
+ }
77
+
78
+ //#endregion
79
+ export { FlashCard };