@contractspec/example.learning-journey-ui-shared 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.
- package/.turbo/turbo-build.log +53 -49
- package/.turbo/turbo-prebuild.log +1 -0
- package/CHANGELOG.md +34 -0
- package/dist/browser/components/BadgeDisplay.js +54 -0
- package/dist/browser/components/StreakCounter.js +50 -0
- package/dist/browser/components/ViewTabs.js +46 -0
- package/dist/browser/components/XpBar.js +62 -0
- package/dist/browser/components/index.js +209 -0
- package/dist/browser/docs/index.js +21 -0
- package/dist/browser/docs/learning-journey-ui-shared.docblock.js +21 -0
- package/dist/browser/example.js +32 -0
- package/dist/browser/hooks/index.js +71 -0
- package/dist/browser/hooks/useLearningProgress.js +71 -0
- package/dist/browser/index.js +330 -0
- package/dist/browser/types.js +0 -0
- package/dist/components/BadgeDisplay.d.ts +2 -11
- package/dist/components/BadgeDisplay.d.ts.map +1 -1
- package/dist/components/BadgeDisplay.js +51 -41
- package/dist/components/StreakCounter.d.ts +2 -11
- package/dist/components/StreakCounter.d.ts.map +1 -1
- package/dist/components/StreakCounter.js +48 -43
- package/dist/components/ViewTabs.d.ts +2 -11
- package/dist/components/ViewTabs.d.ts.map +1 -1
- package/dist/components/ViewTabs.js +43 -45
- package/dist/components/XpBar.d.ts +2 -13
- package/dist/components/XpBar.d.ts.map +1 -1
- package/dist/components/XpBar.js +58 -42
- package/dist/components/index.d.ts +5 -5
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +209 -5
- package/dist/docs/index.d.ts +2 -1
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +22 -1
- package/dist/docs/learning-journey-ui-shared.docblock.d.ts +2 -1
- package/dist/docs/learning-journey-ui-shared.docblock.d.ts.map +1 -0
- package/dist/docs/learning-journey-ui-shared.docblock.js +20 -18
- package/dist/example.d.ts +2 -6
- package/dist/example.d.ts.map +1 -1
- package/dist/example.js +30 -39
- package/dist/hooks/index.d.ts +2 -2
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +72 -3
- package/dist/hooks/useLearningProgress.d.ts +15 -19
- package/dist/hooks/useLearningProgress.d.ts.map +1 -1
- package/dist/hooks/useLearningProgress.js +68 -70
- package/dist/index.d.ts +6 -9
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +331 -11
- package/dist/node/components/BadgeDisplay.js +54 -0
- package/dist/node/components/StreakCounter.js +50 -0
- package/dist/node/components/ViewTabs.js +46 -0
- package/dist/node/components/XpBar.js +62 -0
- package/dist/node/components/index.js +209 -0
- package/dist/node/docs/index.js +21 -0
- package/dist/node/docs/learning-journey-ui-shared.docblock.js +21 -0
- package/dist/node/example.js +32 -0
- package/dist/node/hooks/index.js +71 -0
- package/dist/node/hooks/useLearningProgress.js +71 -0
- package/dist/node/index.js +330 -0
- package/dist/node/types.js +0 -0
- package/dist/types.d.ts +38 -42
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/package.json +136 -35
- package/tsdown.config.js +1 -2
- package/.turbo/turbo-build$colon$bundle.log +0 -48
- package/dist/components/BadgeDisplay.js.map +0 -1
- package/dist/components/StreakCounter.js.map +0 -1
- package/dist/components/ViewTabs.js.map +0 -1
- package/dist/components/XpBar.js.map +0 -1
- package/dist/docs/learning-journey-ui-shared.docblock.js.map +0 -1
- package/dist/example.js.map +0 -1
- package/dist/hooks/useLearningProgress.js.map +0 -1
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
$ tsdown
|
|
2
|
-
[34mℹ[39m tsdown [2mv0.19.0[22m powered by rolldown [2mv1.0.0-beta.59[22m
|
|
3
|
-
[34mℹ[39m config file: [4m/home/runner/work/contractspec/contractspec/packages/examples/learning-journey-ui-shared/tsdown.config.js[24m
|
|
4
|
-
[34mℹ[39m entry: [34msrc/example.ts, src/index.ts, src/types.ts, src/components/BadgeDisplay.tsx, src/components/StreakCounter.tsx, src/components/ViewTabs.tsx, src/components/XpBar.tsx, src/components/index.ts, src/docs/index.ts, src/docs/learning-journey-ui-shared.docblock.ts, src/hooks/index.ts, src/hooks/useLearningProgress.ts[39m
|
|
5
|
-
[34mℹ[39m target: [34mesnext[39m
|
|
6
|
-
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
7
|
-
[34mℹ[39m Build start
|
|
8
|
-
[34mℹ[39m Cleaning 41 files
|
|
9
|
-
[34mℹ[39m [2mdist/[22m[1mhooks/useLearningProgress.js[22m [2m2.54 kB[22m [2m│ gzip: 0.90 kB[22m
|
|
10
|
-
[34mℹ[39m [2mdist/[22m[1mcomponents/BadgeDisplay.js[22m [2m1.51 kB[22m [2m│ gzip: 0.78 kB[22m
|
|
11
|
-
[34mℹ[39m [2mdist/[22m[1mcomponents/XpBar.js[22m [2m1.31 kB[22m [2m│ gzip: 0.63 kB[22m
|
|
12
|
-
[34mℹ[39m [2mdist/[22m[1mcomponents/StreakCounter.js[22m [2m1.11 kB[22m [2m│ gzip: 0.59 kB[22m
|
|
13
|
-
[34mℹ[39m [2mdist/[22m[1mcomponents/ViewTabs.js[22m [2m1.10 kB[22m [2m│ gzip: 0.59 kB[22m
|
|
14
|
-
[34mℹ[39m [2mdist/[22m[1mexample.js[22m [2m0.94 kB[22m [2m│ gzip: 0.51 kB[22m
|
|
15
|
-
[34mℹ[39m [2mdist/[22m[1mdocs/learning-journey-ui-shared.docblock.js[22m [2m0.77 kB[22m [2m│ gzip: 0.45 kB[22m
|
|
16
|
-
[34mℹ[39m [2mdist/[22m[1mindex.js[22m [2m0.53 kB[22m [2m│ gzip: 0.21 kB[22m
|
|
17
|
-
[34mℹ[39m [2mdist/[22m[1mcomponents/index.js[22m [2m0.24 kB[22m [2m│ gzip: 0.12 kB[22m
|
|
18
|
-
[34mℹ[39m [2mdist/[22m[1mhooks/index.js[22m [2m0.10 kB[22m [2m│ gzip: 0.07 kB[22m
|
|
19
|
-
[34mℹ[39m [2mdist/[22m[1mdocs/index.js[22m [2m0.05 kB[22m [2m│ gzip: 0.07 kB[22m
|
|
20
|
-
[34mℹ[39m [2mdist/[22m[1mtypes.js[22m [2m0.00 kB[22m [2m│ gzip: 0.02 kB[22m
|
|
21
|
-
[34mℹ[39m [2mdist/[22mhooks/useLearningProgress.js.map [2m4.65 kB[22m [2m│ gzip: 1.63 kB[22m
|
|
22
|
-
[34mℹ[39m [2mdist/[22mcomponents/BadgeDisplay.js.map [2m2.37 kB[22m [2m│ gzip: 1.14 kB[22m
|
|
23
|
-
[34mℹ[39m [2mdist/[22mcomponents/XpBar.js.map [2m1.92 kB[22m [2m│ gzip: 0.90 kB[22m
|
|
24
|
-
[34mℹ[39m [2mdist/[22mcomponents/ViewTabs.js.map [2m1.82 kB[22m [2m│ gzip: 0.87 kB[22m
|
|
25
|
-
[34mℹ[39m [2mdist/[22mcomponents/StreakCounter.js.map [2m1.64 kB[22m [2m│ gzip: 0.79 kB[22m
|
|
26
|
-
[34mℹ[39m [2mdist/[22mexample.js.map [2m1.37 kB[22m [2m│ gzip: 0.70 kB[22m
|
|
27
|
-
[34mℹ[39m [2mdist/[22mdocs/learning-journey-ui-shared.docblock.js.map [2m1.09 kB[22m [2m│ gzip: 0.60 kB[22m
|
|
28
|
-
[34mℹ[39m [2mdist/[22mtypes.d.ts.map [2m0.65 kB[22m [2m│ gzip: 0.33 kB[22m
|
|
29
|
-
[34mℹ[39m [2mdist/[22mhooks/useLearningProgress.d.ts.map [2m0.19 kB[22m [2m│ gzip: 0.16 kB[22m
|
|
30
|
-
[34mℹ[39m [2mdist/[22mcomponents/StreakCounter.d.ts.map [2m0.19 kB[22m [2m│ gzip: 0.16 kB[22m
|
|
31
|
-
[34mℹ[39m [2mdist/[22mcomponents/BadgeDisplay.d.ts.map [2m0.19 kB[22m [2m│ gzip: 0.16 kB[22m
|
|
32
|
-
[34mℹ[39m [2mdist/[22mcomponents/ViewTabs.d.ts.map [2m0.18 kB[22m [2m│ gzip: 0.16 kB[22m
|
|
33
|
-
[34mℹ[39m [2mdist/[22mcomponents/XpBar.d.ts.map [2m0.17 kB[22m [2m│ gzip: 0.15 kB[22m
|
|
34
|
-
[34mℹ[39m [2mdist/[22mexample.d.ts.map [2m0.14 kB[22m [2m│ gzip: 0.13 kB[22m
|
|
35
|
-
[34mℹ[39m [2mdist/[22m[32m[1mtypes.d.ts[22m[39m [2m1.70 kB[22m [2m│ gzip: 0.61 kB[22m
|
|
36
|
-
[34mℹ[39m [2mdist/[22m[32m[1mindex.d.ts[22m[39m [2m0.81 kB[22m [2m│ gzip: 0.25 kB[22m
|
|
37
|
-
[34mℹ[39m [2mdist/[22m[32m[1mhooks/useLearningProgress.d.ts[22m[39m [2m0.72 kB[22m [2m│ gzip: 0.35 kB[22m
|
|
38
|
-
[34mℹ[39m [2mdist/[22m[32m[1mcomponents/StreakCounter.d.ts[22m[39m [2m0.35 kB[22m [2m│ gzip: 0.23 kB[22m
|
|
39
|
-
[34mℹ[39m [2mdist/[22m[32m[1mcomponents/BadgeDisplay.d.ts[22m[39m [2m0.35 kB[22m [2m│ gzip: 0.23 kB[22m
|
|
40
|
-
[34mℹ[39m [2mdist/[22m[32m[1mcomponents/ViewTabs.d.ts[22m[39m [2m0.34 kB[22m [2m│ gzip: 0.23 kB[22m
|
|
41
|
-
[34mℹ[39m [2mdist/[22m[32m[1mcomponents/XpBar.d.ts[22m[39m [2m0.32 kB[22m [2m│ gzip: 0.23 kB[22m
|
|
42
|
-
[34mℹ[39m [2mdist/[22m[32m[1mexample.d.ts[22m[39m [2m0.25 kB[22m [2m│ gzip: 0.17 kB[22m
|
|
43
|
-
[34mℹ[39m [2mdist/[22m[32m[1mcomponents/index.d.ts[22m[39m [2m0.24 kB[22m [2m│ gzip: 0.12 kB[22m
|
|
44
|
-
[34mℹ[39m [2mdist/[22m[32m[1mhooks/index.d.ts[22m[39m [2m0.10 kB[22m [2m│ gzip: 0.07 kB[22m
|
|
45
|
-
[34mℹ[39m [2mdist/[22m[32m[1mdocs/index.d.ts[22m[39m [2m0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
46
|
-
[34mℹ[39m [2mdist/[22m[32m[1mdocs/learning-journey-ui-shared.docblock.d.ts[22m[39m [2m0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
47
|
-
[34mℹ[39m 38 files, total: 31.97 kB
|
|
48
|
-
[32m✔[39m Build complete in [32m27403ms[39m
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BadgeDisplay.js","names":[],"sources":["../../src/components/BadgeDisplay.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@contractspec/lib.ui-kit-web/ui/utils';\nimport type { BadgeDisplayProps } from '../types';\n\nconst BADGE_ICONS: Record<string, string> = {\n studio_first_30m: '🎯',\n platform_tour: '🗺️',\n crm_first_win: '🏆',\n drill_master: '🧠',\n coach_listener: '👂',\n quest_complete: '⭐',\n streak_7: '🔥',\n streak_30: '💎',\n default: '🏅',\n};\n\nconst sizeStyles = {\n sm: 'h-6 w-6 text-sm',\n md: 'h-8 w-8 text-base',\n lg: 'h-10 w-10 text-lg',\n};\n\nexport function BadgeDisplay({\n badges,\n maxVisible = 5,\n size = 'md',\n}: BadgeDisplayProps) {\n const visibleBadges = badges.slice(0, maxVisible);\n const hiddenCount = badges.length - maxVisible;\n\n if (badges.length === 0) {\n return (\n <div className=\"text-muted-foreground text-sm\">No badges earned yet</div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-1\">\n {visibleBadges.map((badge) => (\n <div\n key={badge}\n className={cn(\n 'flex items-center justify-center rounded-full bg-gradient-to-br from-amber-400/20 to-amber-600/20',\n sizeStyles[size]\n )}\n title={badge.replace(/_/g, ' ')}\n >\n {BADGE_ICONS[badge] ?? BADGE_ICONS.default}\n </div>\n ))}\n {hiddenCount > 0 && (\n <div\n className={cn(\n 'text-muted-foreground bg-muted flex items-center justify-center rounded-full',\n sizeStyles[size],\n 'text-xs font-medium'\n )}\n >\n +{hiddenCount}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;AAKA,MAAM,cAAsC;CAC1C,kBAAkB;CAClB,eAAe;CACf,eAAe;CACf,cAAc;CACd,gBAAgB;CAChB,gBAAgB;CAChB,UAAU;CACV,WAAW;CACX,SAAS;CACV;AAED,MAAM,aAAa;CACjB,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,SAAgB,aAAa,EAC3B,QACA,aAAa,GACb,OAAO,QACa;CACpB,MAAM,gBAAgB,OAAO,MAAM,GAAG,WAAW;CACjD,MAAM,cAAc,OAAO,SAAS;AAEpC,KAAI,OAAO,WAAW,EACpB,QACE,oBAAC;EAAI,WAAU;YAAgC;GAA0B;AAI7E,QACE,qBAAC;EAAI,WAAU;aACZ,cAAc,KAAK,UAClB,oBAAC;GAEC,WAAW,GACT,qGACA,WAAW,MACZ;GACD,OAAO,MAAM,QAAQ,MAAM,IAAI;aAE9B,YAAY,UAAU,YAAY;KAP9B,MAQD,CACN,EACD,cAAc,KACb,qBAAC;GACC,WAAW,GACT,gFACA,WAAW,OACX,sBACD;cACF,KACG;IACE;GAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StreakCounter.js","names":[],"sources":["../../src/components/StreakCounter.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@contractspec/lib.ui-kit-web/ui/utils';\nimport type { StreakCounterProps } from '../types';\n\nconst sizeStyles = {\n sm: {\n container: 'gap-1 px-2 py-1',\n icon: 'text-base',\n text: 'text-xs',\n },\n md: {\n container: 'gap-1.5 px-3 py-1.5',\n icon: 'text-lg',\n text: 'text-sm',\n },\n lg: {\n container: 'gap-2 px-4 py-2',\n icon: 'text-xl',\n text: 'text-base',\n },\n};\n\nexport function StreakCounter({\n days,\n isActive = true,\n size = 'md',\n}: StreakCounterProps) {\n const styles = sizeStyles[size];\n\n return (\n <div\n className={cn(\n 'inline-flex items-center rounded-full font-semibold',\n styles.container,\n isActive\n ? 'bg-orange-500/10 text-orange-500'\n : 'bg-muted text-muted-foreground'\n )}\n >\n <span className={styles.icon} role=\"img\" aria-label=\"streak\">\n 🔥\n </span>\n <span className={styles.text}>\n {days} {days === 1 ? 'day' : 'days'}\n </span>\n </div>\n );\n}\n"],"mappings":";;;;;;AAKA,MAAM,aAAa;CACjB,IAAI;EACF,WAAW;EACX,MAAM;EACN,MAAM;EACP;CACD,IAAI;EACF,WAAW;EACX,MAAM;EACN,MAAM;EACP;CACD,IAAI;EACF,WAAW;EACX,MAAM;EACN,MAAM;EACP;CACF;AAED,SAAgB,cAAc,EAC5B,MACA,WAAW,MACX,OAAO,QACc;CACrB,MAAM,SAAS,WAAW;AAE1B,QACE,qBAAC;EACC,WAAW,GACT,uDACA,OAAO,WACP,WACI,qCACA,iCACL;aAED,oBAAC;GAAK,WAAW,OAAO;GAAM,MAAK;GAAM,cAAW;aAAS;IAEtD,EACP,qBAAC;GAAK,WAAW,OAAO;;IACrB;IAAK;IAAE,SAAS,IAAI,QAAQ;;IACxB;GACH"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ViewTabs.js","names":[],"sources":["../../src/components/ViewTabs.tsx"],"sourcesContent":["'use client';\n\nimport { Button } from '@contractspec/lib.design-system';\nimport type { ViewTabsProps, LearningView } from '../types';\n\nconst VIEW_LABELS: Record<LearningView, { label: string; icon: string }> = {\n overview: { label: 'Overview', icon: '📊' },\n steps: { label: 'Steps', icon: '📝' },\n progress: { label: 'Progress', icon: '📈' },\n timeline: { label: 'Timeline', icon: '📅' },\n};\n\nconst DEFAULT_VIEWS: LearningView[] = [\n 'overview',\n 'steps',\n 'progress',\n 'timeline',\n];\n\nexport function ViewTabs({\n currentView,\n onViewChange,\n availableViews = DEFAULT_VIEWS,\n}: ViewTabsProps) {\n return (\n <div className=\"flex flex-wrap gap-2\">\n {availableViews.map((view) => {\n const { label, icon } = VIEW_LABELS[view];\n const isActive = currentView === view;\n\n return (\n <Button\n key={view}\n variant={isActive ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => onViewChange(view)}\n className=\"gap-1.5\"\n >\n <span>{icon}</span>\n <span>{label}</span>\n </Button>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;;;;;AAKA,MAAM,cAAqE;CACzE,UAAU;EAAE,OAAO;EAAY,MAAM;EAAM;CAC3C,OAAO;EAAE,OAAO;EAAS,MAAM;EAAM;CACrC,UAAU;EAAE,OAAO;EAAY,MAAM;EAAM;CAC3C,UAAU;EAAE,OAAO;EAAY,MAAM;EAAM;CAC5C;AAED,MAAM,gBAAgC;CACpC;CACA;CACA;CACA;CACD;AAED,SAAgB,SAAS,EACvB,aACA,cACA,iBAAiB,iBACD;AAChB,QACE,oBAAC;EAAI,WAAU;YACZ,eAAe,KAAK,SAAS;GAC5B,MAAM,EAAE,OAAO,SAAS,YAAY;AAGpC,UACE,qBAAC;IAEC,SALa,gBAAgB,OAKT,YAAY;IAChC,MAAK;IACL,eAAe,aAAa,KAAK;IACjC,WAAU;eAEV,oBAAC,oBAAM,OAAY,EACnB,oBAAC,oBAAM,QAAa;MAPf,KAQE;IAEX;GACE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"XpBar.js","names":[],"sources":["../../src/components/XpBar.tsx"],"sourcesContent":["'use client';\n\nimport { Progress } from '@contractspec/lib.ui-kit-web/ui/progress';\nimport { cn } from '@contractspec/lib.ui-kit-web/ui/utils';\nimport type { XpBarProps } from '../types';\n\nconst sizeStyles = {\n sm: 'h-2',\n md: 'h-3',\n lg: 'h-4',\n};\n\nconst labelSizeStyles = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n};\n\nexport function XpBar({\n current,\n max,\n level,\n showLabel = true,\n size = 'md',\n}: XpBarProps) {\n const percentage = max > 0 ? Math.min((current / max) * 100, 100) : 0;\n\n return (\n <div className=\"w-full space-y-1\">\n {showLabel && (\n <div\n className={cn(\n 'flex items-center justify-between',\n labelSizeStyles[size]\n )}\n >\n <span className=\"text-muted-foreground font-medium\">\n {level !== undefined && (\n <span className=\"text-primary mr-1\">Lvl {level}</span>\n )}\n XP\n </span>\n <span className=\"font-semibold\">\n {current.toLocaleString()} / {max.toLocaleString()}\n </span>\n </div>\n )}\n <Progress\n value={percentage}\n className={cn('bg-muted', sizeStyles[size])}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;AAMA,MAAM,aAAa;CACjB,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,MAAM,kBAAkB;CACtB,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,SAAgB,MAAM,EACpB,SACA,KACA,OACA,YAAY,MACZ,OAAO,QACM;CACb,MAAM,aAAa,MAAM,IAAI,KAAK,IAAK,UAAU,MAAO,KAAK,IAAI,GAAG;AAEpE,QACE,qBAAC;EAAI,WAAU;aACZ,aACC,qBAAC;GACC,WAAW,GACT,qCACA,gBAAgB,MACjB;cAED,qBAAC;IAAK,WAAU;eACb,UAAU,UACT,qBAAC;KAAK,WAAU;gBAAoB,QAAK;MAAa,EACtD;KAEG,EACP,qBAAC;IAAK,WAAU;;KACb,QAAQ,gBAAgB;KAAC;KAAI,IAAI,gBAAgB;;KAC7C;IACH,EAER,oBAAC;GACC,OAAO;GACP,WAAW,GAAG,YAAY,WAAW,MAAM;IAC3C;GACE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"learning-journey-ui-shared.docblock.js","names":[],"sources":["../../src/docs/learning-journey-ui-shared.docblock.ts"],"sourcesContent":["import type { DocBlock } from '@contractspec/lib.contracts/docs';\nimport { registerDocBlocks } from '@contractspec/lib.contracts/docs';\n\nconst blocks: DocBlock[] = [\n {\n id: 'docs.examples.learning-journey-ui-shared',\n title: 'Learning Journey UI — Shared',\n summary: 'Shared UI components and hooks for learning journey mini-apps.',\n kind: 'reference',\n visibility: 'public',\n route: '/docs/examples/learning-journey-ui-shared',\n tags: ['learning', 'ui', 'shared'],\n body: `## Includes\\n- Hooks: useLearningProgress\\n- Components: XpBar, StreakCounter, BadgeDisplay, ViewTabs\\n\\n## Notes\\n- Keep components accessible (labels, focus, contrast).\\n- Prefer design-system tokens and components.`,\n },\n];\n\nregisterDocBlocks(blocks);\n"],"mappings":";;;AAgBA,kBAb2B,CACzB;CACE,IAAI;CACJ,OAAO;CACP,SAAS;CACT,MAAM;CACN,YAAY;CACZ,OAAO;CACP,MAAM;EAAC;EAAY;EAAM;EAAS;CAClC,MAAM;CACP,CACF,CAEwB"}
|
package/dist/example.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"example.js","names":[],"sources":["../src/example.ts"],"sourcesContent":["import { defineExample } from '@contractspec/lib.contracts';\n\nconst example = defineExample({\n meta: {\n key: 'learning-journey-ui-shared',\n version: '1.0.0',\n title: 'Learning Journey UI — Shared',\n description:\n 'Shared UI components and hooks for learning journey mini-apps.',\n kind: 'ui',\n visibility: 'public',\n stability: 'experimental',\n owners: ['@platform.core'],\n tags: ['learning', 'ui', 'shared'],\n },\n docs: {\n rootDocId: 'docs.examples.learning-journey-ui-shared',\n },\n entrypoints: {\n packageName: '@contractspec/example.learning-journey-ui-shared',\n docs: './docs',\n },\n surfaces: {\n templates: true,\n sandbox: { enabled: true, modes: ['playground', 'markdown'] },\n studio: { enabled: true, installable: true },\n mcp: { enabled: true },\n },\n});\n\nexport default example;\n"],"mappings":";;;AAEA,MAAM,UAAU,cAAc;CAC5B,MAAM;EACJ,KAAK;EACL,SAAS;EACT,OAAO;EACP,aACE;EACF,MAAM;EACN,YAAY;EACZ,WAAW;EACX,QAAQ,CAAC,iBAAiB;EAC1B,MAAM;GAAC;GAAY;GAAM;GAAS;EACnC;CACD,MAAM,EACJ,WAAW,4CACZ;CACD,aAAa;EACX,aAAa;EACb,MAAM;EACP;CACD,UAAU;EACR,WAAW;EACX,SAAS;GAAE,SAAS;GAAM,OAAO,CAAC,cAAc,WAAW;GAAE;EAC7D,QAAQ;GAAE,SAAS;GAAM,aAAa;GAAM;EAC5C,KAAK,EAAE,SAAS,MAAM;EACvB;CACF,CAAC;AAEF,sBAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useLearningProgress.js","names":[],"sources":["../../src/hooks/useLearningProgress.ts"],"sourcesContent":["'use client';\n\nimport { useState, useCallback, useMemo } from 'react';\nimport type { LearningJourneyTrackSpec } from '@contractspec/module.learning-journey/track-spec';\nimport type { LearningProgressState } from '../types';\n\n/** Default progress state for a new track */\nfunction createDefaultProgress(trackId: string): LearningProgressState {\n return {\n trackId,\n completedStepIds: [],\n currentStepId: null,\n xpEarned: 0,\n streakDays: 0,\n lastActivityDate: null,\n badges: [],\n };\n}\n\n/** Hook for managing learning progress state */\nexport function useLearningProgress(track: LearningJourneyTrackSpec) {\n const [progress, setProgress] = useState<LearningProgressState>(() =>\n createDefaultProgress(track.id)\n );\n\n const completeStep = useCallback(\n (stepId: string) => {\n const step = track.steps.find((s) => s.id === stepId);\n if (!step || progress.completedStepIds.includes(stepId)) return;\n\n setProgress((prev) => {\n const newCompletedIds = [...prev.completedStepIds, stepId];\n const xpReward = step.xpReward ?? 0;\n\n // Find next incomplete step\n const nextStep = track.steps.find(\n (s) => !newCompletedIds.includes(s.id)\n );\n\n // Check if track is complete\n const isTrackComplete = newCompletedIds.length === track.steps.length;\n const completionBonus = isTrackComplete\n ? (track.completionRewards?.xpBonus ?? 0)\n : 0;\n\n return {\n ...prev,\n completedStepIds: newCompletedIds,\n currentStepId: nextStep?.id ?? null,\n xpEarned: prev.xpEarned + xpReward + completionBonus,\n lastActivityDate: new Date().toISOString(),\n badges:\n isTrackComplete && track.completionRewards?.badgeKey\n ? [...prev.badges, track.completionRewards.badgeKey]\n : prev.badges,\n };\n });\n },\n [track, progress.completedStepIds]\n );\n\n const resetProgress = useCallback(() => {\n setProgress(createDefaultProgress(track.id));\n }, [track.id]);\n\n const incrementStreak = useCallback(() => {\n setProgress((prev) => ({\n ...prev,\n streakDays: prev.streakDays + 1,\n lastActivityDate: new Date().toISOString(),\n }));\n }, []);\n\n const stats = useMemo(() => {\n const totalSteps = track.steps.length;\n const completedSteps = progress.completedStepIds.length;\n const percentComplete =\n totalSteps > 0 ? Math.round((completedSteps / totalSteps) * 100) : 0;\n const totalXp =\n track.totalXp ??\n track.steps.reduce((sum, s) => sum + (s.xpReward ?? 0), 0) +\n (track.completionRewards?.xpBonus ?? 0);\n\n return {\n totalSteps,\n completedSteps,\n remainingSteps: totalSteps - completedSteps,\n percentComplete,\n totalXp,\n isComplete: completedSteps === totalSteps,\n };\n }, [track, progress.completedStepIds]);\n\n return {\n progress,\n stats,\n completeStep,\n resetProgress,\n incrementStreak,\n };\n}\n"],"mappings":";;;;;;AAOA,SAAS,sBAAsB,SAAwC;AACrE,QAAO;EACL;EACA,kBAAkB,EAAE;EACpB,eAAe;EACf,UAAU;EACV,YAAY;EACZ,kBAAkB;EAClB,QAAQ,EAAE;EACX;;;AAIH,SAAgB,oBAAoB,OAAiC;CACnE,MAAM,CAAC,UAAU,eAAe,eAC9B,sBAAsB,MAAM,GAAG,CAChC;CAED,MAAM,eAAe,aAClB,WAAmB;EAClB,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM,EAAE,OAAO,OAAO;AACrD,MAAI,CAAC,QAAQ,SAAS,iBAAiB,SAAS,OAAO,CAAE;AAEzD,eAAa,SAAS;GACpB,MAAM,kBAAkB,CAAC,GAAG,KAAK,kBAAkB,OAAO;GAC1D,MAAM,WAAW,KAAK,YAAY;GAGlC,MAAM,WAAW,MAAM,MAAM,MAC1B,MAAM,CAAC,gBAAgB,SAAS,EAAE,GAAG,CACvC;GAGD,MAAM,kBAAkB,gBAAgB,WAAW,MAAM,MAAM;GAC/D,MAAM,kBAAkB,kBACnB,MAAM,mBAAmB,WAAW,IACrC;AAEJ,UAAO;IACL,GAAG;IACH,kBAAkB;IAClB,eAAe,UAAU,MAAM;IAC/B,UAAU,KAAK,WAAW,WAAW;IACrC,mCAAkB,IAAI,MAAM,EAAC,aAAa;IAC1C,QACE,mBAAmB,MAAM,mBAAmB,WACxC,CAAC,GAAG,KAAK,QAAQ,MAAM,kBAAkB,SAAS,GAClD,KAAK;IACZ;IACD;IAEJ,CAAC,OAAO,SAAS,iBAAiB,CACnC;CAED,MAAM,gBAAgB,kBAAkB;AACtC,cAAY,sBAAsB,MAAM,GAAG,CAAC;IAC3C,CAAC,MAAM,GAAG,CAAC;CAEd,MAAM,kBAAkB,kBAAkB;AACxC,eAAa,UAAU;GACrB,GAAG;GACH,YAAY,KAAK,aAAa;GAC9B,mCAAkB,IAAI,MAAM,EAAC,aAAa;GAC3C,EAAE;IACF,EAAE,CAAC;AAsBN,QAAO;EACL;EACA,OAtBY,cAAc;GAC1B,MAAM,aAAa,MAAM,MAAM;GAC/B,MAAM,iBAAiB,SAAS,iBAAiB;GACjD,MAAM,kBACJ,aAAa,IAAI,KAAK,MAAO,iBAAiB,aAAc,IAAI,GAAG;GACrE,MAAM,UACJ,MAAM,WACN,MAAM,MAAM,QAAQ,KAAK,MAAM,OAAO,EAAE,YAAY,IAAI,EAAE,IACvD,MAAM,mBAAmB,WAAW;AAEzC,UAAO;IACL;IACA;IACA,gBAAgB,aAAa;IAC7B;IACA;IACA,YAAY,mBAAmB;IAChC;KACA,CAAC,OAAO,SAAS,iBAAiB,CAAC;EAKpC;EACA;EACA;EACD"}
|