@contractspec/example.learning-journey-ui-coaching 1.57.0 → 1.59.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 +58 -59
  2. package/.turbo/turbo-prebuild.log +1 -0
  3. package/CHANGELOG.md +35 -0
  4. package/dist/CoachingMiniApp.d.ts +4 -14
  5. package/dist/CoachingMiniApp.d.ts.map +1 -1
  6. package/dist/CoachingMiniApp.js +1056 -59
  7. package/dist/browser/CoachingMiniApp.js +1059 -0
  8. package/dist/browser/components/EngagementMeter.js +143 -0
  9. package/dist/browser/components/TipCard.js +89 -0
  10. package/dist/browser/components/TipFeed.js +90 -0
  11. package/dist/browser/components/index.js +320 -0
  12. package/dist/browser/docs/index.js +22 -0
  13. package/dist/browser/docs/learning-journey-ui-coaching.docblock.js +22 -0
  14. package/dist/browser/example.js +32 -0
  15. package/dist/browser/index.js +1118 -0
  16. package/dist/browser/views/Overview.js +303 -0
  17. package/dist/browser/views/Progress.js +344 -0
  18. package/dist/browser/views/Steps.js +159 -0
  19. package/dist/browser/views/Timeline.js +266 -0
  20. package/dist/browser/views/index.js +980 -0
  21. package/dist/components/EngagementMeter.d.ts +6 -15
  22. package/dist/components/EngagementMeter.d.ts.map +1 -1
  23. package/dist/components/EngagementMeter.js +143 -107
  24. package/dist/components/TipCard.d.ts +8 -18
  25. package/dist/components/TipCard.d.ts.map +1 -1
  26. package/dist/components/TipCard.js +86 -72
  27. package/dist/components/TipFeed.d.ts +7 -13
  28. package/dist/components/TipFeed.d.ts.map +1 -1
  29. package/dist/components/TipFeed.js +87 -62
  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 +320 -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-coaching.docblock.d.ts +2 -1
  37. package/dist/docs/learning-journey-ui-coaching.docblock.d.ts.map +1 -0
  38. package/dist/docs/learning-journey-ui-coaching.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 +31 -39
  42. package/dist/index.d.ts +6 -12
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +1119 -14
  45. package/dist/node/CoachingMiniApp.js +1059 -0
  46. package/dist/node/components/EngagementMeter.js +143 -0
  47. package/dist/node/components/TipCard.js +89 -0
  48. package/dist/node/components/TipFeed.js +90 -0
  49. package/dist/node/components/index.js +320 -0
  50. package/dist/node/docs/index.js +22 -0
  51. package/dist/node/docs/learning-journey-ui-coaching.docblock.js +22 -0
  52. package/dist/node/example.js +32 -0
  53. package/dist/node/index.js +1118 -0
  54. package/dist/node/views/Overview.js +303 -0
  55. package/dist/node/views/Progress.js +344 -0
  56. package/dist/node/views/Steps.js +159 -0
  57. package/dist/node/views/Timeline.js +266 -0
  58. package/dist/node/views/index.js +980 -0
  59. package/dist/views/Overview.d.ts +4 -13
  60. package/dist/views/Overview.d.ts.map +1 -1
  61. package/dist/views/Overview.js +301 -148
  62. package/dist/views/Progress.d.ts +3 -10
  63. package/dist/views/Progress.d.ts.map +1 -1
  64. package/dist/views/Progress.js +342 -112
  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 +157 -66
  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 +264 -110
  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 +980 -5
  74. package/package.json +154 -38
  75. package/tsdown.config.js +1 -2
  76. package/.turbo/turbo-build$colon$bundle.log +0 -62
  77. package/dist/CoachingMiniApp.js.map +0 -1
  78. package/dist/components/EngagementMeter.js.map +0 -1
  79. package/dist/components/TipCard.js.map +0 -1
  80. package/dist/components/TipFeed.js.map +0 -1
  81. package/dist/docs/learning-journey-ui-coaching.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
@@ -1,69 +1,160 @@
1
- 'use client';
2
-
3
- import { TipCard } from "../components/TipCard.js";
4
- import { jsx, jsxs } from "react/jsx-runtime";
1
+ // @bun
2
+ // src/components/TipCard.tsx
3
+ import { Button } from "@contractspec/lib.design-system";
4
+ import { Card, CardContent } from "@contractspec/lib.ui-kit-web/ui/card";
5
+ import { cn } from "@contractspec/lib.ui-kit-web/ui/utils";
6
+ import { jsxDEV } from "react/jsx-dev-runtime";
7
+ "use client";
8
+ var TIP_ICONS = {
9
+ cash_buffer_too_high: "\uD83D\uDCB0",
10
+ no_savings_goal: "\uD83C\uDFAF",
11
+ irregular_savings: "\uD83D\uDCC5",
12
+ noise_late_evening: "\uD83D\uDD07",
13
+ guest_frequency_high: "\uD83D\uDC65",
14
+ shared_space_conflicts: "\uD83C\uDFE0",
15
+ default: "\uD83D\uDCA1"
16
+ };
17
+ function TipCard({
18
+ step,
19
+ isCompleted,
20
+ isCurrent,
21
+ onComplete,
22
+ onDismiss
23
+ }) {
24
+ const tipId = step.metadata?.tipId ?? "default";
25
+ const icon = TIP_ICONS[tipId] ?? TIP_ICONS.default;
26
+ return /* @__PURE__ */ jsxDEV(Card, {
27
+ className: cn("transition-all", isCompleted && "opacity-60", isCurrent && "ring-2 ring-amber-500"),
28
+ children: /* @__PURE__ */ jsxDEV(CardContent, {
29
+ className: "p-4",
30
+ children: /* @__PURE__ */ jsxDEV("div", {
31
+ className: "flex gap-4",
32
+ children: [
33
+ /* @__PURE__ */ jsxDEV("div", {
34
+ className: cn("flex h-12 w-12 shrink-0 items-center justify-center rounded-xl text-2xl", isCompleted ? "bg-green-500/10" : isCurrent ? "bg-amber-500/10" : "bg-muted"),
35
+ children: isCompleted ? "\u2713" : icon
36
+ }, undefined, false, undefined, this),
37
+ /* @__PURE__ */ jsxDEV("div", {
38
+ className: "min-w-0 flex-1",
39
+ children: [
40
+ /* @__PURE__ */ jsxDEV("div", {
41
+ className: "flex items-start justify-between gap-2",
42
+ children: [
43
+ /* @__PURE__ */ jsxDEV("h4", {
44
+ className: "font-semibold",
45
+ children: step.title
46
+ }, undefined, false, undefined, this),
47
+ step.xpReward && /* @__PURE__ */ jsxDEV("span", {
48
+ className: cn("shrink-0 rounded-full px-2 py-0.5 text-xs font-semibold", isCompleted ? "bg-green-500/10 text-green-500" : "bg-amber-500/10 text-amber-500"),
49
+ children: [
50
+ "+",
51
+ step.xpReward,
52
+ " XP"
53
+ ]
54
+ }, undefined, true, undefined, this)
55
+ ]
56
+ }, undefined, true, undefined, this),
57
+ /* @__PURE__ */ jsxDEV("p", {
58
+ className: "text-muted-foreground mt-1 text-sm",
59
+ children: step.description
60
+ }, undefined, false, undefined, this),
61
+ !isCompleted && /* @__PURE__ */ jsxDEV("div", {
62
+ className: "mt-3 flex flex-wrap gap-2",
63
+ children: [
64
+ /* @__PURE__ */ jsxDEV(Button, {
65
+ size: "sm",
66
+ onClick: onComplete,
67
+ children: "Take Action"
68
+ }, undefined, false, undefined, this),
69
+ /* @__PURE__ */ jsxDEV(Button, {
70
+ variant: "outline",
71
+ size: "sm",
72
+ onClick: onDismiss,
73
+ children: "Dismiss"
74
+ }, undefined, false, undefined, this)
75
+ ]
76
+ }, undefined, true, undefined, this),
77
+ isCompleted && /* @__PURE__ */ jsxDEV("p", {
78
+ className: "mt-2 text-sm text-green-500",
79
+ children: "\u2713 Tip acknowledged"
80
+ }, undefined, false, undefined, this)
81
+ ]
82
+ }, undefined, true, undefined, this)
83
+ ]
84
+ }, undefined, true, undefined, this)
85
+ }, undefined, false, undefined, this)
86
+ }, undefined, false, undefined, this);
87
+ }
5
88
 
6
- //#region src/views/Steps.tsx
89
+ // src/views/Steps.tsx
90
+ import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
91
+ "use client";
7
92
  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
- });
93
+ const completedSteps = progress.completedStepIds.length;
94
+ const totalSteps = track.steps.length;
95
+ const sortedSteps = [...track.steps].sort((a, b) => {
96
+ const aCompleted = progress.completedStepIds.includes(a.id);
97
+ const bCompleted = progress.completedStepIds.includes(b.id);
98
+ if (aCompleted === bCompleted)
99
+ return 0;
100
+ return aCompleted ? 1 : -1;
101
+ });
102
+ const currentStepId = track.steps.find((s) => !progress.completedStepIds.includes(s.id))?.id;
103
+ return /* @__PURE__ */ jsxDEV2("div", {
104
+ className: "space-y-6",
105
+ children: [
106
+ /* @__PURE__ */ jsxDEV2("div", {
107
+ className: "text-center",
108
+ children: [
109
+ /* @__PURE__ */ jsxDEV2("h2", {
110
+ className: "text-xl font-bold",
111
+ children: "Coaching Tips"
112
+ }, undefined, false, undefined, this),
113
+ /* @__PURE__ */ jsxDEV2("p", {
114
+ className: "text-muted-foreground",
115
+ children: "Review and take action on personalized tips"
116
+ }, undefined, false, undefined, this),
117
+ /* @__PURE__ */ jsxDEV2("p", {
118
+ className: "text-muted-foreground mt-2 text-sm",
119
+ children: [
120
+ completedSteps,
121
+ " of ",
122
+ totalSteps,
123
+ " tips actioned"
124
+ ]
125
+ }, undefined, true, undefined, this)
126
+ ]
127
+ }, undefined, true, undefined, this),
128
+ /* @__PURE__ */ jsxDEV2("div", {
129
+ className: "space-y-3",
130
+ children: sortedSteps.map((step) => {
131
+ const isCompleted = progress.completedStepIds.includes(step.id);
132
+ const isCurrent = step.id === currentStepId;
133
+ return /* @__PURE__ */ jsxDEV2(TipCard, {
134
+ step,
135
+ isCompleted,
136
+ isCurrent,
137
+ onComplete: () => onStepComplete?.(step.id),
138
+ onDismiss: () => onStepComplete?.(step.id)
139
+ }, step.id, false, undefined, this);
140
+ })
141
+ }, undefined, false, undefined, this),
142
+ completedSteps === totalSteps && /* @__PURE__ */ jsxDEV2("div", {
143
+ className: "text-muted-foreground text-center",
144
+ children: [
145
+ /* @__PURE__ */ jsxDEV2("span", {
146
+ className: "text-2xl",
147
+ children: "\u2728"
148
+ }, undefined, false, undefined, this),
149
+ /* @__PURE__ */ jsxDEV2("p", {
150
+ className: "mt-2",
151
+ children: "All tips have been addressed!"
152
+ }, undefined, false, undefined, this)
153
+ ]
154
+ }, undefined, true, undefined, this)
155
+ ]
156
+ }, undefined, true, undefined, this);
65
157
  }
66
-
67
- //#endregion
68
- export { Steps };
69
- //# sourceMappingURL=Steps.js.map
158
+ export {
159
+ Steps
160
+ };
@@ -1,11 +1,3 @@
1
- import { LearningViewProps } from "@contractspec/example.learning-journey-ui-shared";
2
- import * as react_jsx_runtime0 from "react/jsx-runtime";
3
-
4
- //#region src/views/Timeline.d.ts
5
- declare function Timeline({
6
- track,
7
- progress
8
- }: LearningViewProps): react_jsx_runtime0.JSX.Element;
9
- //#endregion
10
- export { Timeline };
1
+ import type { LearningViewProps } from '@contractspec/example.learning-journey-ui-shared';
2
+ export declare function Timeline({ track, progress }: LearningViewProps): import("react/jsx-runtime").JSX.Element;
11
3
  //# sourceMappingURL=Timeline.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Timeline.d.ts","names":[],"sources":["../../src/views/Timeline.tsx"],"mappings":";;;;iBAWgB,QAAA,CAAA;EAAW,KAAA;EAAO;AAAA,GAAY,iBAAA,GAAiB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"Timeline.d.ts","sourceRoot":"","sources":["../../src/views/Timeline.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AAE1F,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CAsG9D"}
@@ -1,113 +1,267 @@
1
- 'use client';
2
-
3
- import { TipFeed } from "../components/TipFeed.js";
4
- import { Card, CardContent, CardHeader, CardTitle } from "@contractspec/lib.ui-kit-web/ui/card";
5
- import { jsx, jsxs } from "react/jsx-runtime";
1
+ // @bun
2
+ // src/components/TipFeed.tsx
3
+ import { cn } from "@contractspec/lib.ui-kit-web/ui/utils";
4
+ import { jsxDEV } from "react/jsx-dev-runtime";
5
+ "use client";
6
+ var TIP_ICONS = {
7
+ cash_buffer_too_high: "\uD83D\uDCB0",
8
+ no_savings_goal: "\uD83C\uDFAF",
9
+ irregular_savings: "\uD83D\uDCC5",
10
+ noise_late_evening: "\uD83D\uDD07",
11
+ guest_frequency_high: "\uD83D\uDC65",
12
+ shared_space_conflicts: "\uD83C\uDFE0",
13
+ default: "\uD83D\uDCA1"
14
+ };
15
+ function TipFeed({ items }) {
16
+ if (items.length === 0) {
17
+ return /* @__PURE__ */ jsxDEV("div", {
18
+ className: "text-muted-foreground py-8 text-center",
19
+ children: "No tips yet. Start engaging with coaching tips!"
20
+ }, undefined, false, undefined, this);
21
+ }
22
+ return /* @__PURE__ */ jsxDEV("div", {
23
+ className: "relative",
24
+ children: [
25
+ /* @__PURE__ */ jsxDEV("div", {
26
+ className: "bg-border absolute top-0 left-4 h-full w-0.5"
27
+ }, undefined, false, undefined, this),
28
+ /* @__PURE__ */ jsxDEV("div", {
29
+ className: "space-y-4",
30
+ children: items.map((item) => {
31
+ const tipId = item.step.metadata?.tipId ?? "default";
32
+ const icon = TIP_ICONS[tipId] ?? TIP_ICONS.default;
33
+ return /* @__PURE__ */ jsxDEV("div", {
34
+ className: "relative flex gap-4 pl-2",
35
+ children: [
36
+ /* @__PURE__ */ jsxDEV("div", {
37
+ className: cn("relative z-10 flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-sm", item.isCompleted ? "bg-green-500 text-white" : "bg-muted text-muted-foreground"),
38
+ children: item.isCompleted ? "\u2713" : icon
39
+ }, undefined, false, undefined, this),
40
+ /* @__PURE__ */ jsxDEV("div", {
41
+ className: "bg-card flex-1 rounded-lg border p-3",
42
+ children: [
43
+ /* @__PURE__ */ jsxDEV("div", {
44
+ className: "flex items-start justify-between gap-2",
45
+ children: [
46
+ /* @__PURE__ */ jsxDEV("div", {
47
+ children: [
48
+ /* @__PURE__ */ jsxDEV("p", {
49
+ className: "font-medium",
50
+ children: item.step.title
51
+ }, undefined, false, undefined, this),
52
+ /* @__PURE__ */ jsxDEV("p", {
53
+ className: "text-muted-foreground mt-0.5 text-sm",
54
+ children: item.step.description
55
+ }, undefined, false, undefined, this)
56
+ ]
57
+ }, undefined, true, undefined, this),
58
+ item.step.xpReward && /* @__PURE__ */ jsxDEV("span", {
59
+ className: cn("shrink-0 text-xs font-medium", item.isCompleted ? "text-green-500" : "text-muted-foreground"),
60
+ children: [
61
+ "+",
62
+ item.step.xpReward,
63
+ " XP"
64
+ ]
65
+ }, undefined, true, undefined, this)
66
+ ]
67
+ }, undefined, true, undefined, this),
68
+ /* @__PURE__ */ jsxDEV("div", {
69
+ className: "text-muted-foreground mt-2 flex items-center gap-2 text-xs",
70
+ children: item.isCompleted ? /* @__PURE__ */ jsxDEV("span", {
71
+ className: "text-green-500",
72
+ children: [
73
+ "\u2713 Completed",
74
+ item.completedAt && ` \u2022 ${item.completedAt}`
75
+ ]
76
+ }, undefined, true, undefined, this) : /* @__PURE__ */ jsxDEV("span", {
77
+ children: "Pending action"
78
+ }, undefined, false, undefined, this)
79
+ }, undefined, false, undefined, this)
80
+ ]
81
+ }, undefined, true, undefined, this)
82
+ ]
83
+ }, item.step.id, true, undefined, this);
84
+ })
85
+ }, undefined, false, undefined, this)
86
+ ]
87
+ }, undefined, true, undefined, this);
88
+ }
6
89
 
7
- //#region src/views/Timeline.tsx
90
+ // src/views/Timeline.tsx
91
+ import {
92
+ Card,
93
+ CardContent,
94
+ CardHeader,
95
+ CardTitle
96
+ } from "@contractspec/lib.ui-kit-web/ui/card";
97
+ import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
98
+ "use client";
8
99
  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
- });
100
+ const feedItems = track.steps.map((step) => ({
101
+ step,
102
+ isCompleted: progress.completedStepIds.includes(step.id),
103
+ completedAt: progress.completedStepIds.includes(step.id) ? "Recently" : undefined
104
+ })).sort((a, b) => {
105
+ if (a.isCompleted && !b.isCompleted)
106
+ return -1;
107
+ if (!a.isCompleted && b.isCompleted)
108
+ return 1;
109
+ return 0;
110
+ });
111
+ const completedCount = feedItems.filter((f) => f.isCompleted).length;
112
+ const pendingCount = feedItems.length - completedCount;
113
+ return /* @__PURE__ */ jsxDEV2("div", {
114
+ className: "space-y-6",
115
+ children: [
116
+ /* @__PURE__ */ jsxDEV2("div", {
117
+ className: "text-center",
118
+ children: [
119
+ /* @__PURE__ */ jsxDEV2("h2", {
120
+ className: "text-xl font-bold",
121
+ children: "Activity Timeline"
122
+ }, undefined, false, undefined, this),
123
+ /* @__PURE__ */ jsxDEV2("p", {
124
+ className: "text-muted-foreground",
125
+ children: "Your coaching journey and tip history"
126
+ }, undefined, false, undefined, this)
127
+ ]
128
+ }, undefined, true, undefined, this),
129
+ /* @__PURE__ */ jsxDEV2("div", {
130
+ className: "grid grid-cols-2 gap-4",
131
+ children: [
132
+ /* @__PURE__ */ jsxDEV2(Card, {
133
+ children: /* @__PURE__ */ jsxDEV2(CardContent, {
134
+ className: "p-4 text-center",
135
+ children: [
136
+ /* @__PURE__ */ jsxDEV2("div", {
137
+ className: "text-2xl font-bold text-green-500",
138
+ children: completedCount
139
+ }, undefined, false, undefined, this),
140
+ /* @__PURE__ */ jsxDEV2("div", {
141
+ className: "text-muted-foreground text-sm",
142
+ children: "Tips Actioned"
143
+ }, undefined, false, undefined, this)
144
+ ]
145
+ }, undefined, true, undefined, this)
146
+ }, undefined, false, undefined, this),
147
+ /* @__PURE__ */ jsxDEV2(Card, {
148
+ children: /* @__PURE__ */ jsxDEV2(CardContent, {
149
+ className: "p-4 text-center",
150
+ children: [
151
+ /* @__PURE__ */ jsxDEV2("div", {
152
+ className: "text-2xl font-bold text-amber-500",
153
+ children: pendingCount
154
+ }, undefined, false, undefined, this),
155
+ /* @__PURE__ */ jsxDEV2("div", {
156
+ className: "text-muted-foreground text-sm",
157
+ children: "Tips Pending"
158
+ }, undefined, false, undefined, this)
159
+ ]
160
+ }, undefined, true, undefined, this)
161
+ }, undefined, false, undefined, this)
162
+ ]
163
+ }, undefined, true, undefined, this),
164
+ /* @__PURE__ */ jsxDEV2(Card, {
165
+ children: [
166
+ /* @__PURE__ */ jsxDEV2(CardHeader, {
167
+ children: /* @__PURE__ */ jsxDEV2(CardTitle, {
168
+ className: "flex items-center gap-2",
169
+ children: [
170
+ /* @__PURE__ */ jsxDEV2("span", {
171
+ children: "\uD83D\uDCDD"
172
+ }, undefined, false, undefined, this),
173
+ /* @__PURE__ */ jsxDEV2("span", {
174
+ children: "Coaching Feed"
175
+ }, undefined, false, undefined, this)
176
+ ]
177
+ }, undefined, true, undefined, this)
178
+ }, undefined, false, undefined, this),
179
+ /* @__PURE__ */ jsxDEV2(CardContent, {
180
+ children: /* @__PURE__ */ jsxDEV2(TipFeed, {
181
+ items: feedItems
182
+ }, undefined, false, undefined, this)
183
+ }, undefined, false, undefined, this)
184
+ ]
185
+ }, undefined, true, undefined, this),
186
+ /* @__PURE__ */ jsxDEV2(Card, {
187
+ children: [
188
+ /* @__PURE__ */ jsxDEV2(CardHeader, {
189
+ children: /* @__PURE__ */ jsxDEV2(CardTitle, {
190
+ className: "flex items-center gap-2",
191
+ children: [
192
+ /* @__PURE__ */ jsxDEV2("span", {
193
+ children: "\uD83D\uDCC8"
194
+ }, undefined, false, undefined, this),
195
+ /* @__PURE__ */ jsxDEV2("span", {
196
+ children: "Journey Stats"
197
+ }, undefined, false, undefined, this)
198
+ ]
199
+ }, undefined, true, undefined, this)
200
+ }, undefined, false, undefined, this),
201
+ /* @__PURE__ */ jsxDEV2(CardContent, {
202
+ children: /* @__PURE__ */ jsxDEV2("div", {
203
+ className: "space-y-4",
204
+ children: [
205
+ /* @__PURE__ */ jsxDEV2("div", {
206
+ className: "flex items-center justify-between",
207
+ children: [
208
+ /* @__PURE__ */ jsxDEV2("span", {
209
+ className: "text-muted-foreground",
210
+ children: "Total Tips"
211
+ }, undefined, false, undefined, this),
212
+ /* @__PURE__ */ jsxDEV2("span", {
213
+ className: "font-semibold",
214
+ children: track.steps.length
215
+ }, undefined, false, undefined, this)
216
+ ]
217
+ }, undefined, true, undefined, this),
218
+ /* @__PURE__ */ jsxDEV2("div", {
219
+ className: "flex items-center justify-between",
220
+ children: [
221
+ /* @__PURE__ */ jsxDEV2("span", {
222
+ className: "text-muted-foreground",
223
+ children: "Completed"
224
+ }, undefined, false, undefined, this),
225
+ /* @__PURE__ */ jsxDEV2("span", {
226
+ className: "font-semibold text-green-500",
227
+ children: completedCount
228
+ }, undefined, false, undefined, this)
229
+ ]
230
+ }, undefined, true, undefined, this),
231
+ /* @__PURE__ */ jsxDEV2("div", {
232
+ className: "flex items-center justify-between",
233
+ children: [
234
+ /* @__PURE__ */ jsxDEV2("span", {
235
+ className: "text-muted-foreground",
236
+ children: "XP Earned"
237
+ }, undefined, false, undefined, this),
238
+ /* @__PURE__ */ jsxDEV2("span", {
239
+ className: "font-semibold text-orange-500",
240
+ children: progress.xpEarned
241
+ }, undefined, false, undefined, this)
242
+ ]
243
+ }, undefined, true, undefined, this),
244
+ /* @__PURE__ */ jsxDEV2("div", {
245
+ className: "flex items-center justify-between",
246
+ children: [
247
+ /* @__PURE__ */ jsxDEV2("span", {
248
+ className: "text-muted-foreground",
249
+ children: "Current Streak"
250
+ }, undefined, false, undefined, this),
251
+ /* @__PURE__ */ jsxDEV2("span", {
252
+ className: "font-semibold",
253
+ children: progress.streakDays > 0 ? `\uD83D\uDD25 ${progress.streakDays} days` : "Start today!"
254
+ }, undefined, false, undefined, this)
255
+ ]
256
+ }, undefined, true, undefined, this)
257
+ ]
258
+ }, undefined, true, undefined, this)
259
+ }, undefined, false, undefined, this)
260
+ ]
261
+ }, undefined, true, undefined, this)
262
+ ]
263
+ }, undefined, true, undefined, this);
109
264
  }
110
-
111
- //#endregion
112
- export { Timeline };
113
- //# sourceMappingURL=Timeline.js.map
265
+ export {
266
+ Timeline
267
+ };
@@ -1,5 +1,5 @@
1
- import { Overview } from "./Overview.js";
2
- import { Steps } from "./Steps.js";
3
- import { Progress as ProgressView } from "./Progress.js";
4
- import { Timeline } from "./Timeline.js";
5
- export { Overview, ProgressView as Progress, Steps, Timeline };
1
+ export { Overview } from './Overview';
2
+ export { Steps } from './Steps';
3
+ export { Progress } from './Progress';
4
+ export { Timeline } from './Timeline';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/views/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}