@contractspec/example.learning-journey-ui-gamified 1.56.1 → 1.58.0

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 (87) hide show
  1. package/.turbo/turbo-build.log +59 -58
  2. package/.turbo/turbo-prebuild.log +1 -0
  3. package/CHANGELOG.md +40 -0
  4. package/dist/GamifiedMiniApp.d.ts +4 -14
  5. package/dist/GamifiedMiniApp.d.ts.map +1 -1
  6. package/dist/GamifiedMiniApp.js +995 -59
  7. package/dist/browser/GamifiedMiniApp.js +998 -0
  8. package/dist/browser/components/DayCalendar.js +42 -0
  9. package/dist/browser/components/FlashCard.js +102 -0
  10. package/dist/browser/components/MasteryRing.js +75 -0
  11. package/dist/browser/components/index.js +217 -0
  12. package/dist/browser/docs/index.js +22 -0
  13. package/dist/browser/docs/learning-journey-ui-gamified.docblock.js +22 -0
  14. package/dist/browser/example.js +32 -0
  15. package/dist/browser/index.js +1057 -0
  16. package/dist/browser/views/Overview.js +236 -0
  17. package/dist/browser/views/Progress.js +294 -0
  18. package/dist/browser/views/Steps.js +157 -0
  19. package/dist/browser/views/Timeline.js +235 -0
  20. package/dist/browser/views/index.js +919 -0
  21. package/dist/components/DayCalendar.d.ts +5 -13
  22. package/dist/components/DayCalendar.d.ts.map +1 -1
  23. package/dist/components/DayCalendar.js +41 -31
  24. package/dist/components/FlashCard.d.ts +7 -16
  25. package/dist/components/FlashCard.d.ts.map +1 -1
  26. package/dist/components/FlashCard.js +99 -76
  27. package/dist/components/MasteryRing.d.ts +6 -15
  28. package/dist/components/MasteryRing.d.ts.map +1 -1
  29. package/dist/components/MasteryRing.js +72 -78
  30. package/dist/components/index.d.ts +4 -4
  31. package/dist/components/index.d.ts.map +1 -0
  32. package/dist/components/index.js +217 -4
  33. package/dist/docs/index.d.ts +2 -1
  34. package/dist/docs/index.d.ts.map +1 -0
  35. package/dist/docs/index.js +23 -1
  36. package/dist/docs/learning-journey-ui-gamified.docblock.d.ts +2 -1
  37. package/dist/docs/learning-journey-ui-gamified.docblock.d.ts.map +1 -0
  38. package/dist/docs/learning-journey-ui-gamified.docblock.js +21 -18
  39. package/dist/example.d.ts +2 -6
  40. package/dist/example.d.ts.map +1 -1
  41. package/dist/example.js +30 -39
  42. package/dist/index.d.ts +6 -12
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +1058 -14
  45. package/dist/node/GamifiedMiniApp.js +998 -0
  46. package/dist/node/components/DayCalendar.js +42 -0
  47. package/dist/node/components/FlashCard.js +102 -0
  48. package/dist/node/components/MasteryRing.js +75 -0
  49. package/dist/node/components/index.js +217 -0
  50. package/dist/node/docs/index.js +22 -0
  51. package/dist/node/docs/learning-journey-ui-gamified.docblock.js +22 -0
  52. package/dist/node/example.js +32 -0
  53. package/dist/node/index.js +1057 -0
  54. package/dist/node/views/Overview.js +236 -0
  55. package/dist/node/views/Progress.js +294 -0
  56. package/dist/node/views/Steps.js +157 -0
  57. package/dist/node/views/Timeline.js +235 -0
  58. package/dist/node/views/index.js +919 -0
  59. package/dist/views/Overview.d.ts +4 -12
  60. package/dist/views/Overview.d.ts.map +1 -1
  61. package/dist/views/Overview.js +234 -158
  62. package/dist/views/Progress.d.ts +2 -10
  63. package/dist/views/Progress.d.ts.map +1 -1
  64. package/dist/views/Progress.js +292 -140
  65. package/dist/views/Steps.d.ts +2 -11
  66. package/dist/views/Steps.d.ts.map +1 -1
  67. package/dist/views/Steps.js +155 -53
  68. package/dist/views/Timeline.d.ts +2 -10
  69. package/dist/views/Timeline.d.ts.map +1 -1
  70. package/dist/views/Timeline.js +233 -130
  71. package/dist/views/index.d.ts +5 -5
  72. package/dist/views/index.d.ts.map +1 -0
  73. package/dist/views/index.js +919 -5
  74. package/package.json +155 -39
  75. package/tsdown.config.js +1 -2
  76. package/.turbo/turbo-build$colon$bundle.log +0 -57
  77. package/dist/GamifiedMiniApp.js.map +0 -1
  78. package/dist/components/DayCalendar.js.map +0 -1
  79. package/dist/components/FlashCard.js.map +0 -1
  80. package/dist/components/MasteryRing.js.map +0 -1
  81. package/dist/docs/learning-journey-ui-gamified.docblock.js.map +0 -1
  82. package/dist/example.js.map +0 -1
  83. package/dist/views/Overview.js.map +0 -1
  84. package/dist/views/Progress.js.map +0 -1
  85. package/dist/views/Steps.js.map +0 -1
  86. package/dist/views/Timeline.js.map +0 -1
  87. package/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,235 @@
1
+ // src/components/DayCalendar.tsx
2
+ import { cn } from "@contractspec/lib.ui-kit-web/ui/utils";
3
+ import { jsxDEV, Fragment } from "react/jsx-dev-runtime";
4
+ "use client";
5
+ function DayCalendar({
6
+ totalDays,
7
+ currentDay,
8
+ completedDays
9
+ }) {
10
+ const days = Array.from({ length: totalDays }, (_, i) => i + 1);
11
+ return /* @__PURE__ */ jsxDEV("div", {
12
+ className: "grid grid-cols-7 gap-2",
13
+ children: days.map((day) => {
14
+ const isCompleted = completedDays.includes(day);
15
+ const isCurrent = day === currentDay;
16
+ const isLocked = day > currentDay;
17
+ return /* @__PURE__ */ jsxDEV("div", {
18
+ 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"),
19
+ children: isCompleted ? /* @__PURE__ */ jsxDEV("span", {
20
+ className: "text-lg",
21
+ children: "✓"
22
+ }, undefined, false, undefined, this) : isLocked ? /* @__PURE__ */ jsxDEV("span", {
23
+ className: "text-lg",
24
+ children: "\uD83D\uDD12"
25
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV(Fragment, {
26
+ children: [
27
+ /* @__PURE__ */ jsxDEV("span", {
28
+ className: "text-muted-foreground text-xs",
29
+ children: "Day"
30
+ }, undefined, false, undefined, this),
31
+ /* @__PURE__ */ jsxDEV("span", {
32
+ children: day
33
+ }, undefined, false, undefined, this)
34
+ ]
35
+ }, undefined, true, undefined, this)
36
+ }, day, false, undefined, this);
37
+ })
38
+ }, undefined, false, undefined, this);
39
+ }
40
+
41
+ // src/views/Timeline.tsx
42
+ import {
43
+ Card,
44
+ CardContent,
45
+ CardHeader,
46
+ CardTitle
47
+ } from "@contractspec/lib.ui-kit-web/ui/card";
48
+ import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
49
+ "use client";
50
+ function Timeline({ track, progress }) {
51
+ const hasQuestDays = track.steps.some((s) => s.availability?.unlockOnDay !== undefined);
52
+ if (hasQuestDays) {
53
+ const totalDays = Math.max(...track.steps.map((s) => s.availability?.unlockOnDay ?? 1), 7);
54
+ const completedDays = track.steps.filter((s) => progress.completedStepIds.includes(s.id)).map((s) => s.availability?.unlockOnDay ?? 1);
55
+ const currentDay = track.steps.find((s) => !progress.completedStepIds.includes(s.id))?.availability?.unlockOnDay ?? 1;
56
+ return /* @__PURE__ */ jsxDEV2("div", {
57
+ className: "space-y-6",
58
+ children: [
59
+ /* @__PURE__ */ jsxDEV2("div", {
60
+ className: "text-center",
61
+ children: [
62
+ /* @__PURE__ */ jsxDEV2("h2", {
63
+ className: "text-xl font-bold",
64
+ children: track.name
65
+ }, undefined, false, undefined, this),
66
+ /* @__PURE__ */ jsxDEV2("p", {
67
+ className: "text-muted-foreground",
68
+ children: "Complete each day's challenge to progress"
69
+ }, undefined, false, undefined, this)
70
+ ]
71
+ }, undefined, true, undefined, this),
72
+ /* @__PURE__ */ jsxDEV2(Card, {
73
+ children: [
74
+ /* @__PURE__ */ jsxDEV2(CardHeader, {
75
+ children: /* @__PURE__ */ jsxDEV2(CardTitle, {
76
+ className: "flex items-center gap-2",
77
+ children: [
78
+ /* @__PURE__ */ jsxDEV2("span", {
79
+ children: "\uD83D\uDCC5"
80
+ }, undefined, false, undefined, this),
81
+ /* @__PURE__ */ jsxDEV2("span", {
82
+ children: "Your Journey"
83
+ }, undefined, false, undefined, this)
84
+ ]
85
+ }, undefined, true, undefined, this)
86
+ }, undefined, false, undefined, this),
87
+ /* @__PURE__ */ jsxDEV2(CardContent, {
88
+ className: "flex justify-center",
89
+ children: /* @__PURE__ */ jsxDEV2(DayCalendar, {
90
+ totalDays,
91
+ currentDay,
92
+ completedDays
93
+ }, undefined, false, undefined, this)
94
+ }, undefined, false, undefined, this)
95
+ ]
96
+ }, undefined, true, undefined, this),
97
+ /* @__PURE__ */ jsxDEV2(Card, {
98
+ children: [
99
+ /* @__PURE__ */ jsxDEV2(CardHeader, {
100
+ children: /* @__PURE__ */ jsxDEV2(CardTitle, {
101
+ className: "flex items-center gap-2",
102
+ children: [
103
+ /* @__PURE__ */ jsxDEV2("span", {
104
+ children: "\uD83D\uDCDD"
105
+ }, undefined, false, undefined, this),
106
+ /* @__PURE__ */ jsxDEV2("span", {
107
+ children: "Daily Challenges"
108
+ }, undefined, false, undefined, this)
109
+ ]
110
+ }, undefined, true, undefined, this)
111
+ }, undefined, false, undefined, this),
112
+ /* @__PURE__ */ jsxDEV2(CardContent, {
113
+ children: /* @__PURE__ */ jsxDEV2("div", {
114
+ className: "space-y-3",
115
+ children: track.steps.map((step) => {
116
+ const day = step.availability?.unlockOnDay ?? 1;
117
+ const isCompleted = progress.completedStepIds.includes(step.id);
118
+ const isLocked = day > currentDay;
119
+ return /* @__PURE__ */ jsxDEV2("div", {
120
+ className: `flex items-start gap-4 rounded-lg border p-4 ${isLocked ? "opacity-50" : ""}`,
121
+ children: [
122
+ /* @__PURE__ */ jsxDEV2("div", {
123
+ className: "bg-muted flex h-10 w-10 shrink-0 items-center justify-center rounded-lg font-semibold",
124
+ children: isCompleted ? "✓" : isLocked ? "\uD83D\uDD12" : day
125
+ }, undefined, false, undefined, this),
126
+ /* @__PURE__ */ jsxDEV2("div", {
127
+ className: "flex-1",
128
+ children: [
129
+ /* @__PURE__ */ jsxDEV2("h4", {
130
+ className: "font-semibold",
131
+ children: step.title
132
+ }, undefined, false, undefined, this),
133
+ /* @__PURE__ */ jsxDEV2("p", {
134
+ className: "text-muted-foreground text-sm",
135
+ children: step.description
136
+ }, undefined, false, undefined, this)
137
+ ]
138
+ }, undefined, true, undefined, this),
139
+ step.xpReward && /* @__PURE__ */ jsxDEV2("span", {
140
+ className: `text-sm font-medium ${isCompleted ? "text-green-500" : "text-muted-foreground"}`,
141
+ children: [
142
+ "+",
143
+ step.xpReward,
144
+ " XP"
145
+ ]
146
+ }, undefined, true, undefined, this)
147
+ ]
148
+ }, step.id, true, undefined, this);
149
+ })
150
+ }, undefined, false, undefined, this)
151
+ }, undefined, false, undefined, this)
152
+ ]
153
+ }, undefined, true, undefined, this)
154
+ ]
155
+ }, undefined, true, undefined, this);
156
+ }
157
+ return /* @__PURE__ */ jsxDEV2("div", {
158
+ className: "space-y-6",
159
+ children: [
160
+ /* @__PURE__ */ jsxDEV2("div", {
161
+ className: "text-center",
162
+ children: [
163
+ /* @__PURE__ */ jsxDEV2("h2", {
164
+ className: "text-xl font-bold",
165
+ children: "Learning Path"
166
+ }, undefined, false, undefined, this),
167
+ /* @__PURE__ */ jsxDEV2("p", {
168
+ className: "text-muted-foreground",
169
+ children: "Follow the steps to master this skill"
170
+ }, undefined, false, undefined, this)
171
+ ]
172
+ }, undefined, true, undefined, this),
173
+ /* @__PURE__ */ jsxDEV2(Card, {
174
+ children: /* @__PURE__ */ jsxDEV2(CardContent, {
175
+ className: "p-6",
176
+ children: /* @__PURE__ */ jsxDEV2("div", {
177
+ className: "relative",
178
+ children: [
179
+ /* @__PURE__ */ jsxDEV2("div", {
180
+ className: "bg-border absolute top-0 left-5 h-full w-0.5"
181
+ }, undefined, false, undefined, this),
182
+ /* @__PURE__ */ jsxDEV2("div", {
183
+ className: "space-y-6",
184
+ children: track.steps.map((step, index) => {
185
+ const isCompleted = progress.completedStepIds.includes(step.id);
186
+ const isCurrent = !isCompleted && track.steps.slice(0, index).every((s) => progress.completedStepIds.includes(s.id));
187
+ return /* @__PURE__ */ jsxDEV2("div", {
188
+ className: "relative flex gap-4 pl-2",
189
+ children: [
190
+ /* @__PURE__ */ jsxDEV2("div", {
191
+ className: `relative z-10 flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 ${isCompleted ? "border-green-500 bg-green-500 text-white" : isCurrent ? "border-violet-500 bg-violet-500 text-white" : "border-border bg-background"}`,
192
+ children: isCompleted ? "✓" : index + 1
193
+ }, undefined, false, undefined, this),
194
+ /* @__PURE__ */ jsxDEV2("div", {
195
+ className: "flex-1 pb-4",
196
+ children: /* @__PURE__ */ jsxDEV2("div", {
197
+ className: "flex items-start justify-between gap-2",
198
+ children: [
199
+ /* @__PURE__ */ jsxDEV2("div", {
200
+ children: [
201
+ /* @__PURE__ */ jsxDEV2("h4", {
202
+ className: `font-semibold ${isCompleted ? "text-foreground" : isCurrent ? "text-violet-500" : "text-muted-foreground"}`,
203
+ children: step.title
204
+ }, undefined, false, undefined, this),
205
+ /* @__PURE__ */ jsxDEV2("p", {
206
+ className: "text-muted-foreground mt-1 text-sm",
207
+ children: step.description
208
+ }, undefined, false, undefined, this)
209
+ ]
210
+ }, undefined, true, undefined, this),
211
+ step.xpReward && /* @__PURE__ */ jsxDEV2("span", {
212
+ className: `shrink-0 rounded-full px-2 py-1 text-xs font-semibold ${isCompleted ? "bg-green-500/10 text-green-500" : "bg-muted text-muted-foreground"}`,
213
+ children: [
214
+ "+",
215
+ step.xpReward,
216
+ " XP"
217
+ ]
218
+ }, undefined, true, undefined, this)
219
+ ]
220
+ }, undefined, true, undefined, this)
221
+ }, undefined, false, undefined, this)
222
+ ]
223
+ }, step.id, true, undefined, this);
224
+ })
225
+ }, undefined, false, undefined, this)
226
+ ]
227
+ }, undefined, true, undefined, this)
228
+ }, undefined, false, undefined, this)
229
+ }, undefined, false, undefined, this)
230
+ ]
231
+ }, undefined, true, undefined, this);
232
+ }
233
+ export {
234
+ Timeline
235
+ };