diff --git a/apps/web/src/app.css b/apps/web/src/app.css
index 0f9e8bb0..c9df8aec 100644
--- a/apps/web/src/app.css
+++ b/apps/web/src/app.css
@@ -203,4 +203,43 @@ html {
:root:not(.dark) .btn-secondary {
border-color: var(--border);
background: rgba(0, 0, 0, 0.04);
+}
+
+/* ---------- Premium Animation & Interaction Pass ---------- */
+
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ transform: translateY(22px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.animate-fade-in {
+ animation: fadeInUp 0.75s cubic-bezier(0.16, 1, 0.3, 1) both;
+ will-change: transform, opacity;
+}
+
+.glass {
+ transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.3s cubic-bezier(0.16, 1, 0.3, 1), border-color 0.3s cubic-bezier(0.16, 1, 0.3, 1);
+}
+
+.glass:hover {
+ transform: translateY(-4px);
+ box-shadow: 0 20px 40px -15px rgba(99, 102, 241, 0.15), var(--shadow-nav);
+ border-color: rgba(99, 102, 241, 0.35);
+}
+
+/* Specific section scale-ups on hover */
+.kpi-grid > *, .reputation-widgets > *, .velocity-widgets > *, .networking-widgets > *, .match-widgets > *, .event-widgets > *, .ranking-widgets > *, .monetization-widgets > *, .mentor-widgets > *, .team-widgets > *, .web3-widgets > *, .export-widgets > * {
+ transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.3s cubic-bezier(0.16, 1, 0.3, 1), border-color 0.3s cubic-bezier(0.16, 1, 0.3, 1);
+}
+
+.kpi-grid > *:hover, .reputation-widgets > *:hover, .velocity-widgets > *:hover, .networking-widgets > *:hover, .match-widgets > *:hover, .event-widgets > *:hover, .ranking-widgets > *:hover, .monetization-widgets > *:hover, .mentor-widgets > *:hover, .team-widgets > *:hover, .web3-widgets > *:hover, .export-widgets > *:hover {
+ transform: translateY(-3px) scale(1.01);
+ box-shadow: 0 15px 30px -10px rgba(99, 102, 241, 0.12), var(--shadow-nav);
+ border-color: rgba(99, 102, 241, 0.3);
}
\ No newline at end of file
diff --git a/apps/web/src/lib/components/AIEngagementInsights.svelte b/apps/web/src/lib/components/AIEngagementInsights.svelte
new file mode 100644
index 00000000..0f41e1f6
--- /dev/null
+++ b/apps/web/src/lib/components/AIEngagementInsights.svelte
@@ -0,0 +1,15 @@
+
+
+
diff --git a/apps/web/src/lib/components/AISkillMatcher.svelte b/apps/web/src/lib/components/AISkillMatcher.svelte
new file mode 100644
index 00000000..3c1a7984
--- /dev/null
+++ b/apps/web/src/lib/components/AISkillMatcher.svelte
@@ -0,0 +1,20 @@
+
+
+
diff --git a/apps/web/src/lib/components/AchievementBadges.svelte b/apps/web/src/lib/components/AchievementBadges.svelte
new file mode 100644
index 00000000..5072ed77
--- /dev/null
+++ b/apps/web/src/lib/components/AchievementBadges.svelte
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+ {#each badges as badge}
+
+
+
{badge.title}
+ {#if badge.locked}
+
+ {/if}
+
+ {/each}
+
+
+
+
diff --git a/apps/web/src/lib/components/ActiveWorkloadDistribution.svelte b/apps/web/src/lib/components/ActiveWorkloadDistribution.svelte
new file mode 100644
index 00000000..e53dd6d0
--- /dev/null
+++ b/apps/web/src/lib/components/ActiveWorkloadDistribution.svelte
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
+ {#each projects as project}
+
hoveredProject = project.id}
+ onmouseleave={() => hoveredProject = null}
+ >
+ {/each}
+
+
+
+
+ {#each projects as project}
+
hoveredProject = project.id}
+ onmouseleave={() => hoveredProject = null}
+ >
+
+
+
+ {project.name}
+ {project.count}
+
+
+
+
+ {project.allocation}%
+
+ {project.status}
+
+
+
+ {/each}
+
+
+
+
diff --git a/apps/web/src/lib/components/ActivityHeatmap.svelte b/apps/web/src/lib/components/ActivityHeatmap.svelte
new file mode 100644
index 00000000..f4b4ffb1
--- /dev/null
+++ b/apps/web/src/lib/components/ActivityHeatmap.svelte
@@ -0,0 +1,197 @@
+
+
+
+
+
+
+
+
+
Less
+
+
+
+
+
+
More
+
+
+
+
diff --git a/apps/web/src/lib/components/AnalyticsWidget.svelte b/apps/web/src/lib/components/AnalyticsWidget.svelte
new file mode 100644
index 00000000..17d25bfe
--- /dev/null
+++ b/apps/web/src/lib/components/AnalyticsWidget.svelte
@@ -0,0 +1,126 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/BaseForecastChart.svelte b/apps/web/src/lib/components/BaseForecastChart.svelte
new file mode 100644
index 00000000..00ebae6c
--- /dev/null
+++ b/apps/web/src/lib/components/BaseForecastChart.svelte
@@ -0,0 +1,270 @@
+
+
+
+
+
+
+
+
+
+ {#each labels as label}
+ {label}
+ {/each}
+
+
+
+
+
diff --git a/apps/web/src/lib/components/BaseRadarChart.svelte b/apps/web/src/lib/components/BaseRadarChart.svelte
new file mode 100644
index 00000000..03a0dd15
--- /dev/null
+++ b/apps/web/src/lib/components/BaseRadarChart.svelte
@@ -0,0 +1,260 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/lib/components/BountyBoard.svelte b/apps/web/src/lib/components/BountyBoard.svelte
new file mode 100644
index 00000000..d2c82fb2
--- /dev/null
+++ b/apps/web/src/lib/components/BountyBoard.svelte
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+ {#each bounties as bounty}
+
+
+
+
{bounty.issue}
+
+ {#each bounty.tags as tag}
+ {tag}
+ {/each}
+
+
+
+
+
+ {/each}
+
+
+
+
diff --git a/apps/web/src/lib/components/BountyEarningsChart.svelte b/apps/web/src/lib/components/BountyEarningsChart.svelte
new file mode 100644
index 00000000..dd1ed44e
--- /dev/null
+++ b/apps/web/src/lib/components/BountyEarningsChart.svelte
@@ -0,0 +1,80 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/BountyRadar.svelte b/apps/web/src/lib/components/BountyRadar.svelte
new file mode 100644
index 00000000..ecbb17fc
--- /dev/null
+++ b/apps/web/src/lib/components/BountyRadar.svelte
@@ -0,0 +1,26 @@
+
+
+
diff --git a/apps/web/src/lib/components/CodeReviewInsights.svelte b/apps/web/src/lib/components/CodeReviewInsights.svelte
new file mode 100644
index 00000000..8bb3ebde
--- /dev/null
+++ b/apps/web/src/lib/components/CodeReviewInsights.svelte
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+ {#each insights as insight}
+
+
+ {#if insight.type === 'positive'}
+
+ {:else if insight.type === 'improvement'}
+
+ {:else}
+
+ {/if}
+
+
+
{insight.message}
+
{insight.file}
+
+
+ {/each}
+
+
+
+
diff --git a/apps/web/src/lib/components/CompatibilityRadar.svelte b/apps/web/src/lib/components/CompatibilityRadar.svelte
new file mode 100644
index 00000000..b0af5866
--- /dev/null
+++ b/apps/web/src/lib/components/CompatibilityRadar.svelte
@@ -0,0 +1,39 @@
+
+
+
diff --git a/apps/web/src/lib/components/ContributionForecastChart.svelte b/apps/web/src/lib/components/ContributionForecastChart.svelte
new file mode 100644
index 00000000..48c921cd
--- /dev/null
+++ b/apps/web/src/lib/components/ContributionForecastChart.svelte
@@ -0,0 +1,28 @@
+
+
+
diff --git a/apps/web/src/lib/components/ContributionRadar.svelte b/apps/web/src/lib/components/ContributionRadar.svelte
new file mode 100644
index 00000000..f2cec9a8
--- /dev/null
+++ b/apps/web/src/lib/components/ContributionRadar.svelte
@@ -0,0 +1,26 @@
+
+
+
diff --git a/apps/web/src/lib/components/DecentralizedReputation.svelte b/apps/web/src/lib/components/DecentralizedReputation.svelte
new file mode 100644
index 00000000..3c5c50aa
--- /dev/null
+++ b/apps/web/src/lib/components/DecentralizedReputation.svelte
@@ -0,0 +1,306 @@
+
+
+
+
+
+
+
+
+
+ {totalScore}
+ / {maxScore}
+
+
+
+
+ {reputationTier}
+ Percentile: {percentile}
+
+
+
+
+
+
+
+ {#each reputationMetrics as metric}
+
+
+
{metric.icon}
+
+
{metric.name}
+ {#if showBreakdown}
+
{metric.desc}
+ {:else}
+
{metric.count} verified events
+ {/if}
+
+
+
+{metric.pts} XP
+
+ {/each}
+
+
+
+
+
diff --git a/apps/web/src/lib/components/DeveloperMatchCard.svelte b/apps/web/src/lib/components/DeveloperMatchCard.svelte
new file mode 100644
index 00000000..f3ac53c8
--- /dev/null
+++ b/apps/web/src/lib/components/DeveloperMatchCard.svelte
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+
+

+
{matchProfile.matchScore}%
+
+
+
+
{matchProfile.name}
+
{matchProfile.handle}
+
{matchProfile.role}
+
+
+
+
+
Shared Stack:
+
+ {#each commonSkills as skill}
+ {skill}
+ {/each}
+
+
+
+
+
+
+
diff --git a/apps/web/src/lib/components/EmbedCodeGenerator.svelte b/apps/web/src/lib/components/EmbedCodeGenerator.svelte
new file mode 100644
index 00000000..2b03c0ff
--- /dev/null
+++ b/apps/web/src/lib/components/EmbedCodeGenerator.svelte
@@ -0,0 +1,150 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/EventInteractionHeatmap.svelte b/apps/web/src/lib/components/EventInteractionHeatmap.svelte
new file mode 100644
index 00000000..73f895d8
--- /dev/null
+++ b/apps/web/src/lib/components/EventInteractionHeatmap.svelte
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+ {#each heatmapData as intensity, i}
+
handleKeydown(e, intensity, i)}
+ >
+ {/each}
+
+
+
+
+
+
diff --git a/apps/web/src/lib/components/EventRadar.svelte b/apps/web/src/lib/components/EventRadar.svelte
new file mode 100644
index 00000000..3bb515d5
--- /dev/null
+++ b/apps/web/src/lib/components/EventRadar.svelte
@@ -0,0 +1,26 @@
+
+
+
diff --git a/apps/web/src/lib/components/EventTimeline.svelte b/apps/web/src/lib/components/EventTimeline.svelte
new file mode 100644
index 00000000..47dc14ad
--- /dev/null
+++ b/apps/web/src/lib/components/EventTimeline.svelte
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+ {#each events as event, i}
+
+
+
+ {#if i < events.length - 1}
+
+ {/if}
+
+
+
+ {event.date}
+ {event.type}
+
+
{event.title}
+
+
+ {/each}
+
+
+
+
diff --git a/apps/web/src/lib/components/GlobalLeaderboard.svelte b/apps/web/src/lib/components/GlobalLeaderboard.svelte
new file mode 100644
index 00000000..c2c7e87e
--- /dev/null
+++ b/apps/web/src/lib/components/GlobalLeaderboard.svelte
@@ -0,0 +1,214 @@
+
+
+
+
+
+
+
+
+
+ | Rank |
+ Developer |
+ Score |
+ Trend |
+
+
+
+ {#each leaderboard as user}
+
+ |
+ {user.rank}
+ |
+
+
+ 
+
+ {user.name}
+ {user.handle}
+
+
+ |
+ {user.score.toLocaleString()} |
+
+ {#if user.trend === 'up'}
+
+ {:else if user.trend === 'down'}
+
+ {:else}
+
+ {/if}
+ |
+
+ {/each}
+
+
+
+
+
+
diff --git a/apps/web/src/lib/components/GrowthRadar.svelte b/apps/web/src/lib/components/GrowthRadar.svelte
new file mode 100644
index 00000000..21e729e8
--- /dev/null
+++ b/apps/web/src/lib/components/GrowthRadar.svelte
@@ -0,0 +1,26 @@
+
+
+
diff --git a/apps/web/src/lib/components/InsightFeed.svelte b/apps/web/src/lib/components/InsightFeed.svelte
new file mode 100644
index 00000000..513c5a5c
--- /dev/null
+++ b/apps/web/src/lib/components/InsightFeed.svelte
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+ {#each items as item}
+ -
+
+
+
{item.text}
+
+ {/each}
+
+
+
+
diff --git a/apps/web/src/lib/components/LearningPathTimeline.svelte b/apps/web/src/lib/components/LearningPathTimeline.svelte
new file mode 100644
index 00000000..48efb144
--- /dev/null
+++ b/apps/web/src/lib/components/LearningPathTimeline.svelte
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+ {#each paths as path, i}
+
+
+
+ {#if path.status === 'completed'}
+
+ {:else if path.status === 'in-progress'}
+
+ {/if}
+
+ {#if i < paths.length - 1}
+
+ {/if}
+
+
+
+
{path.title}
+ {path.duration}
+
+
+ {/each}
+
+
+
+
diff --git a/apps/web/src/lib/components/LiveActivityFeed.svelte b/apps/web/src/lib/components/LiveActivityFeed.svelte
new file mode 100644
index 00000000..03809898
--- /dev/null
+++ b/apps/web/src/lib/components/LiveActivityFeed.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/apps/web/src/lib/components/LivePreviewPane.svelte b/apps/web/src/lib/components/LivePreviewPane.svelte
new file mode 100644
index 00000000..b99fcbb4
--- /dev/null
+++ b/apps/web/src/lib/components/LivePreviewPane.svelte
@@ -0,0 +1,170 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/MentorshipMatch.svelte b/apps/web/src/lib/components/MentorshipMatch.svelte
new file mode 100644
index 00000000..5ce7415b
--- /dev/null
+++ b/apps/web/src/lib/components/MentorshipMatch.svelte
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+ {#each mentors as mentor}
+
+
+
+
+
{mentor.name}
+ {mentor.role} @ {mentor.company}
+
+
+
+
+ {/each}
+
+
+
+
diff --git a/apps/web/src/lib/components/MomentumInsights.svelte b/apps/web/src/lib/components/MomentumInsights.svelte
new file mode 100644
index 00000000..4e603a3a
--- /dev/null
+++ b/apps/web/src/lib/components/MomentumInsights.svelte
@@ -0,0 +1,15 @@
+
+
+
diff --git a/apps/web/src/lib/components/NFTBadgeShowcase.svelte b/apps/web/src/lib/components/NFTBadgeShowcase.svelte
new file mode 100644
index 00000000..cacc32a6
--- /dev/null
+++ b/apps/web/src/lib/components/NFTBadgeShowcase.svelte
@@ -0,0 +1,401 @@
+
+
+
+
+
+
+ {#each badges as badge}
+
+ {/each}
+
+
+ {#if selectedBadge}
+
+
e.stopPropagation()}>
+
+
+
+
{selectedBadge.emoji}
+
+
+
+
{selectedBadge.title}
+
{selectedBadge.desc}
+
+
+
+ Token Standard
+ {selectedBadge.standard}
+
+
+ Token ID
+ {selectedBadge.tokenId}
+
+
+ Contract Address
+ {selectedBadge.contract}
+
+
+ Minted On
+ {selectedBadge.mintDate}
+
+
+
+
+
+
+ {/if}
+
+
+
diff --git a/apps/web/src/lib/components/NetworkingGrowthForecast.svelte b/apps/web/src/lib/components/NetworkingGrowthForecast.svelte
new file mode 100644
index 00000000..97a6e137
--- /dev/null
+++ b/apps/web/src/lib/components/NetworkingGrowthForecast.svelte
@@ -0,0 +1,23 @@
+
+
+
diff --git a/apps/web/src/lib/components/NetworkingPulseCard.svelte b/apps/web/src/lib/components/NetworkingPulseCard.svelte
new file mode 100644
index 00000000..864676a5
--- /dev/null
+++ b/apps/web/src/lib/components/NetworkingPulseCard.svelte
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+ {scansPerHour}
+ /hr
+
+
QR Scan Velocity
+
+
+
+
+
+
+ {totalConnections}
+
+
Total Connections
+
+
+
+
+
+
+
diff --git a/apps/web/src/lib/components/NetworkingRecommendationPanel.svelte b/apps/web/src/lib/components/NetworkingRecommendationPanel.svelte
new file mode 100644
index 00000000..02c74209
--- /dev/null
+++ b/apps/web/src/lib/components/NetworkingRecommendationPanel.svelte
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+ {#each events as event (event.id)}
+
+
+
{event.name}
+
+ {event.type}
+ •
+ {event.date}
+
+
+
+
+ {event.matchScore}% Match
+
+
+ {/each}
+
+
+
+
diff --git a/apps/web/src/lib/components/OSSImpactGraph.svelte b/apps/web/src/lib/components/OSSImpactGraph.svelte
new file mode 100644
index 00000000..3a068bc9
--- /dev/null
+++ b/apps/web/src/lib/components/OSSImpactGraph.svelte
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+ {maxVal}
+ {Math.round(maxVal / 2)}
+ 0
+
+
+
+ {#each data as item}
+
+ {/each}
+
+
+
+
+
diff --git a/apps/web/src/lib/components/OrgHierarchyTree.svelte b/apps/web/src/lib/components/OrgHierarchyTree.svelte
new file mode 100644
index 00000000..e222ce7d
--- /dev/null
+++ b/apps/web/src/lib/components/OrgHierarchyTree.svelte
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+ {#each hierarchyNodes as node, index}
+
+ {#if index > 0}
+
+ {/if}
+
+
+
+ {/each}
+
+
+
+
+ {#if selectedNode}
+
+
+
+
+ Department:
+ {selectedNode.department}
+
+
+ Level:
+ L{selectedNode.level} (Org tier)
+
+
+
+ {:else}
+
Select a node in the org tree to inspect staff profile details.
+ {/if}
+
+
+
+
diff --git a/apps/web/src/lib/components/PeerReviewFeedback.svelte b/apps/web/src/lib/components/PeerReviewFeedback.svelte
new file mode 100644
index 00000000..0819288a
--- /dev/null
+++ b/apps/web/src/lib/components/PeerReviewFeedback.svelte
@@ -0,0 +1,382 @@
+
+
+
+
+
+
+
+
{avgRating}
+
+ ⭐⭐⭐⭐⭐
+ Avg rating ({reviews.length} reviews)
+
+
+
+
+
+
+ {#each reviews as review}
+
+
+
+ {'★'.repeat(review.rating)}{'☆'.repeat(5 - review.rating)}
+
+
+
+ {/each}
+
+
+
+ {#if !showForm}
+
+ {:else}
+
+ {/if}
+
+
+
+
diff --git a/apps/web/src/lib/components/PortfolioThemeSelector.svelte b/apps/web/src/lib/components/PortfolioThemeSelector.svelte
new file mode 100644
index 00000000..b26c89ee
--- /dev/null
+++ b/apps/web/src/lib/components/PortfolioThemeSelector.svelte
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+ {#each themes as theme}
+
+ {/each}
+
+
+
+
diff --git a/apps/web/src/lib/components/RSVPTracker.svelte b/apps/web/src/lib/components/RSVPTracker.svelte
new file mode 100644
index 00000000..c9adf8df
--- /dev/null
+++ b/apps/web/src/lib/components/RSVPTracker.svelte
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
+
+ {#each event.checklist as item}
+ -
+
+ {#if item.done}
+
+ {/if}
+
+ {item.label}
+
+ {/each}
+
+
+
+
diff --git a/apps/web/src/lib/components/RankingTierCard.svelte b/apps/web/src/lib/components/RankingTierCard.svelte
new file mode 100644
index 00000000..4ea51271
--- /dev/null
+++ b/apps/web/src/lib/components/RankingTierCard.svelte
@@ -0,0 +1,201 @@
+
+
+
+
+
+
+
+
+
+ {tier}
+ #{rank}
+
+
+
+
+
+
+ Total Points
+ {points.toLocaleString()}
+
+
+ Next Tier
+ {nextTierPoints.toLocaleString()}
+
+
+
+
+ {nextTierPoints - points} points to reach Master Tier
+
+
+
+
diff --git a/apps/web/src/lib/components/RealtimeConnectionStream.svelte b/apps/web/src/lib/components/RealtimeConnectionStream.svelte
new file mode 100644
index 00000000..d2874d42
--- /dev/null
+++ b/apps/web/src/lib/components/RealtimeConnectionStream.svelte
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+ {#each stream as item (item.id)}
+
+
+ {#if item.type === 'scan'}
+
+ {:else if item.type === 'view'}
+
+ {:else}
+
+ {/if}
+
+
+
{item.user} {item.action}
+
{item.time}
+
+
+ {/each}
+
+
+
+
diff --git a/apps/web/src/lib/components/ReputationScoreCard.svelte b/apps/web/src/lib/components/ReputationScoreCard.svelte
new file mode 100644
index 00000000..f59f4133
--- /dev/null
+++ b/apps/web/src/lib/components/ReputationScoreCard.svelte
@@ -0,0 +1,204 @@
+
+
+
+
+
+
+
+
+ {score}
+ / 1000
+
+
+
+
+
+
+
diff --git a/apps/web/src/lib/components/SkillGapAnalyzer.svelte b/apps/web/src/lib/components/SkillGapAnalyzer.svelte
new file mode 100644
index 00000000..0a3d9526
--- /dev/null
+++ b/apps/web/src/lib/components/SkillGapAnalyzer.svelte
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/lib/components/SponsorshipGraph.svelte b/apps/web/src/lib/components/SponsorshipGraph.svelte
new file mode 100644
index 00000000..73e8ac43
--- /dev/null
+++ b/apps/web/src/lib/components/SponsorshipGraph.svelte
@@ -0,0 +1,193 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/TeamCompatibilityMatrix.svelte b/apps/web/src/lib/components/TeamCompatibilityMatrix.svelte
new file mode 100644
index 00000000..54162eb5
--- /dev/null
+++ b/apps/web/src/lib/components/TeamCompatibilityMatrix.svelte
@@ -0,0 +1,273 @@
+
+
+
+
+
+
+ {#each teamMembers as member}
+
+ {/each}
+
+
+
+ {#if selectedMember}
+
+
Trait Breakdown: {selectedMember.name}
+
+
+
+ Technical
+ {selectedMember.traits.technical}%
+
+
+ Communication
+ {selectedMember.traits.communication}%
+
+
+ Culture
+ {selectedMember.traits.culture}%
+
+
+ Execution Speed
+ {selectedMember.traits.speed}%
+
+
+
+
💡 {selectedMember.notes}
+
+ {:else}
+
+
Select a team member above to analyze granular alignment metrics.
+
+ {/if}
+
+
+
+
diff --git a/apps/web/src/lib/components/TopContributorsFeed.svelte b/apps/web/src/lib/components/TopContributorsFeed.svelte
new file mode 100644
index 00000000..799ad7ae
--- /dev/null
+++ b/apps/web/src/lib/components/TopContributorsFeed.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/apps/web/src/lib/components/VelocityScoreCard.svelte b/apps/web/src/lib/components/VelocityScoreCard.svelte
new file mode 100644
index 00000000..cc8971cd
--- /dev/null
+++ b/apps/web/src/lib/components/VelocityScoreCard.svelte
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+ {velocityScore}
+ Current Momentum
+
+
+
+
+
+ {predictedScore}
+ Predicted (30d)
+
+
+
+
+
+
+
diff --git a/apps/web/src/lib/components/VerifiableCredentials.svelte b/apps/web/src/lib/components/VerifiableCredentials.svelte
new file mode 100644
index 00000000..aca3d2f0
--- /dev/null
+++ b/apps/web/src/lib/components/VerifiableCredentials.svelte
@@ -0,0 +1,418 @@
+
+
+
+
+
+
+ {#each credentials as cred}
+
+
+
+
{cred.title}
+ {cred.issuer} • {cred.type}
+
+
+ 🛡️
+ Verified
+
+
+
+
+
+ {/each}
+
+
+ {#if showProofModal && selectedCredential}
+
+
e.stopPropagation()}>
+
+
+
+
+
+
+
{JSON.stringify(selectedCredential.details, null, 2)}
+
+
+
+
+ {/if}
+
+
+
diff --git a/apps/web/src/lib/components/Web3WalletConnect.svelte b/apps/web/src/lib/components/Web3WalletConnect.svelte
new file mode 100644
index 00000000..0601f2a1
--- /dev/null
+++ b/apps/web/src/lib/components/Web3WalletConnect.svelte
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+ {#if !isConnected && !isConnecting}
+
Link your crypto wallet to anchor your developer identity and showcase ZK skills & NFTs.
+
+
+ {#each wallets as wallet}
+
+ {/each}
+
+ {:else if isConnecting}
+
+
+
Connecting to {selectedWallet}...
+
Awaiting signature approval in your wallet extension.
+
+ {:else}
+
+
+
+
+ 🧬
+
+
+
{ensName || 'No ENS Domain'}
+
+ {walletAddress.slice(0, 6)}...{walletAddress.slice(-4)}
+
+
+
+
+
+
+
Active Network
+
+
+ {#if showDropdown}
+
+ {#each networks as net}
+
+ {/each}
+
+ {/if}
+
+
+
+
+ Account Balance
+
{balance}
+
+
+
+
+ {/if}
+
+
+
+
diff --git a/apps/web/src/lib/components/WidgetCustomizer.svelte b/apps/web/src/lib/components/WidgetCustomizer.svelte
new file mode 100644
index 00000000..f773e4c6
--- /dev/null
+++ b/apps/web/src/lib/components/WidgetCustomizer.svelte
@@ -0,0 +1,117 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/utils/analyticsHelpers.ts b/apps/web/src/lib/utils/analyticsHelpers.ts
new file mode 100644
index 00000000..5e7c5a25
--- /dev/null
+++ b/apps/web/src/lib/utils/analyticsHelpers.ts
@@ -0,0 +1,86 @@
+/**
+ * Utility functions for metrics, trends, and analytical calculations
+ */
+
+/**
+ * Calculates percentage change between two values
+ */
+export function calculateTrend(current: number, previous: number): {
+ percentage: string;
+ isPositive: boolean;
+ formatted: string;
+} {
+ if (previous === 0) {
+ return {
+ percentage: '0%',
+ isPositive: true,
+ formatted: '0%'
+ };
+ }
+
+ const diff = current - previous;
+ const pct = (diff / previous) * 100;
+ const isPositive = pct >= 0;
+ const absPct = Math.abs(pct).toFixed(1);
+
+ return {
+ percentage: `${absPct}%`,
+ isPositive,
+ formatted: `${isPositive ? '↑' : '↓'} ${absPct}%`
+ };
+}
+
+/**
+ * Formats values to localized currency or compact formats
+ */
+export function formatMetric(value: number, type: 'currency' | 'number' | 'percent' | 'compact' = 'number'): string {
+ if (type === 'currency') {
+ return new Intl.NumberFormat('en-US', {
+ style: 'currency',
+ currency: 'USD',
+ maximumFractionDigits: 0
+ }).format(value);
+ }
+
+ if (type === 'percent') {
+ return `${value.toFixed(1)}%`;
+ }
+
+ if (type === 'compact') {
+ return new Intl.NumberFormat('en-US', {
+ notation: 'compact',
+ compactDisplay: 'short'
+ }).format(value);
+ }
+
+ return new Intl.NumberFormat('en-US').format(value);
+}
+
+/**
+ * Generates standard tooltip content based on axis label, value, and unit
+ */
+export function generateTooltipText(label: string, value: number | string, unit: string = ''): string {
+ const formattedVal = typeof value === 'number' ? formatMetric(value) : value;
+ return `${label}: ${formattedVal}${unit ? ' ' + unit : ''}`;
+}
+
+/**
+ * Determines ranking tier based on score
+ */
+export function calculateRankTier(score: number): {
+ tier: string;
+ color: string;
+} {
+ if (score >= 900) return { tier: 'Diamond', color: '#818cf8' };
+ if (score >= 750) return { tier: 'Gold', color: '#facc15' };
+ if (score >= 500) return { tier: 'Silver', color: '#94a3b8' };
+ return { tier: 'Bronze', color: '#b45309' };
+}
+
+/**
+ * Computes average of an array of numbers safely
+ */
+export function calculateAverage(data: number[]): number {
+ if (!data || data.length === 0) return 0;
+ return data.reduce((sum, val) => sum + val, 0) / data.length;
+}
diff --git a/apps/web/src/lib/utils/chartMath.ts b/apps/web/src/lib/utils/chartMath.ts
new file mode 100644
index 00000000..270eadab
--- /dev/null
+++ b/apps/web/src/lib/utils/chartMath.ts
@@ -0,0 +1,84 @@
+export interface Coordinate {
+ x: number;
+ y: number;
+}
+
+/**
+ * Calculates X/Y coordinates for a point on a radar chart
+ */
+export function getRadarCoordinates(
+ value: number,
+ index: number,
+ sides: number,
+ center: number,
+ radius: number
+): Coordinate {
+ // Handle edge case of 0 sides
+ if (sides === 0) return { x: center, y: center };
+
+ const angle = (Math.PI * 2) / sides;
+ const r = (value / 100) * radius;
+ // -Math.PI/2 to start drawing from the top
+ const theta = index * angle - Math.PI / 2;
+
+ return {
+ x: center + r * Math.cos(theta),
+ y: center + r * Math.sin(theta)
+ };
+}
+
+/**
+ * Generates an SVG polygon points string for a data series
+ */
+export function generateRadarPoints(
+ dataValues: number[],
+ center: number,
+ radius: number
+): string {
+ const sides = dataValues.length;
+ if (sides === 0) return '';
+
+ return dataValues
+ .map((val, i) => {
+ const { x, y } = getRadarCoordinates(val, i, sides, center, radius);
+ return `${x},${y}`;
+ })
+ .join(' ');
+}
+
+/**
+ * Generates an SVG polygon points string for a background grid level
+ */
+export function getGridPolygon(
+ level: number,
+ sides: number,
+ center: number,
+ radius: number
+): string {
+ if (sides === 0) return '';
+
+ return Array.from({ length: sides })
+ .map((_, i) => {
+ const { x, y } = getRadarCoordinates(level, i, sides, center, radius);
+ return `${x},${y}`;
+ })
+ .join(' ');
+}
+
+/**
+ * Generates label coordinates pushed further out from the radar edges
+ */
+export function generateLabelCoordinates(
+ data: { label: string; value: number }[],
+ center: number,
+ radius: number,
+ pushFactor: number = 120
+): (Coordinate & { text: string })[] {
+ const sides = data.length;
+ if (sides === 0) return [];
+
+ return data.map((d, i) => {
+ const { x, y } = getRadarCoordinates(pushFactor, i, sides, center, radius);
+ return { x, y, text: d.label };
+ });
+}
diff --git a/apps/web/src/lib/utils/visualizationEngine.ts b/apps/web/src/lib/utils/visualizationEngine.ts
new file mode 100644
index 00000000..f491a531
--- /dev/null
+++ b/apps/web/src/lib/utils/visualizationEngine.ts
@@ -0,0 +1,70 @@
+/**
+ * Generates an SVG line path string for sequential data
+ */
+export function getPathData(
+ data: number[],
+ maxVal: number,
+ width: number,
+ height: number
+): string {
+ if (!data || data.length === 0) return '';
+ // Avoid division by zero
+ if (data.length === 1) return `M 0 ${height - (data[0] / maxVal) * height}`;
+
+ const stepX = width / (data.length - 1);
+ const safeMax = maxVal > 0 ? maxVal : 1; // Prevent division by zero
+
+ return data.map((val, i) => {
+ const x = i * stepX;
+ const y = height - (val / safeMax) * height;
+ return `${i === 0 ? 'M' : 'L'} ${x} ${y}`;
+ }).join(' ');
+}
+
+/**
+ * Generates an SVG area path string (filled down to baseline) for sequential data
+ */
+export function getAreaPathData(
+ data: number[],
+ maxVal: number,
+ width: number,
+ height: number
+): string {
+ if (!data || data.length === 0) return '';
+ const linePath = getPathData(data, maxVal, width, height);
+ // Complete the path by drawing to bottom right, then bottom left, then close
+ return `${linePath} L ${width} ${height} L 0 ${height} Z`;
+}
+
+/**
+ * Generates an array of coordinates for interactive points
+ */
+export function generatePointCoordinates(
+ data: number[],
+ maxVal: number,
+ width: number,
+ height: number
+): { cx: number; cy: number }[] {
+ if (!data || data.length === 0) return [];
+ if (data.length === 1) return [{ cx: 0, cy: height - (data[0] / maxVal) * height }];
+
+ const stepX = width / (data.length - 1);
+ const safeMax = maxVal > 0 ? maxVal : 1;
+
+ return data.map((val, i) => ({
+ cx: i * stepX,
+ cy: height - (val / safeMax) * height
+ }));
+}
+
+/**
+ * Calculates Y-axis grid values
+ */
+export function calculateYAxisGrid(
+ data: number[],
+ numLines: number
+): number[] {
+ const maxVal = Math.max(...data, 1);
+ const step = maxVal / numLines;
+ return Array.from({ length: numLines + 1 }, (_, i) => Math.round(i * step));
+}
diff --git a/apps/web/src/routes/dashboard/+page.svelte b/apps/web/src/routes/dashboard/+page.svelte
new file mode 100644
index 00000000..0a906b8b
--- /dev/null
+++ b/apps/web/src/routes/dashboard/+page.svelte
@@ -0,0 +1,761 @@
+
+
+
+ Analytics Command Center | DevCard
+
+
+
+
+
+
+
+ {#each stats as stat}
+
+ {/each}
+
+
+
+
+
+
+
+
+ -
+
+
High merge probability detected for your recent frontend PRs based on historical maintainer behavior.
+
+ -
+
+
Your PR review time is slightly above average today. Consider smaller, isolated commits.
+
+ -
+
+
Found 3 open issues matching your React/Next.js skillset with "critical" priority.
+
+
+
+
+
+
+
+
AI Reputation & Impact
+
+
+
+
+
+
Contribution Velocity Predictor
+
+
+
+
+
+
Networking & Event Intelligence
+
+
+
+
+
+
AI Smart Developer Match Engine
+
+
+
+
+
+
Event Intelligence Command Center
+
+
+
+
+
+
Global Rankings & Achievements
+
+
+
+
+
+
Monetization & Bounties
+
+
+
+
+
+
AI Mentor & Career Growth
+
+
+
+
+
+
Team & Organization Dynamics
+
+
+
+
+
+
Web3 & Decentralized Identity
+
+
+
+
+
+
Export & Portfolio
+
+
+
+
+
+
+
diff --git a/apps/web/src/routes/devcard/[id]/+page.server.ts b/apps/web/src/routes/devcard/[id]/+page.server.ts
index a93fbc75..952fd31f 100644
--- a/apps/web/src/routes/devcard/[id]/+page.server.ts
+++ b/apps/web/src/routes/devcard/[id]/+page.server.ts
@@ -19,9 +19,9 @@ export const load: PageServerLoad = async ({ params, fetch }) => {
const card = await res.json();
return { card };
- } catch (error) {
- if (error && typeof error === 'object' && 'status' in error) {
- throw error;
+ } catch (err) {
+ if (err && typeof err === 'object' && 'status' in err) {
+ throw err;
}
throw error(500, 'Failed to connect to backend');
}
diff --git a/apps/web/src/routes/u/[username]/+page.svelte b/apps/web/src/routes/u/[username]/+page.svelte
index 50cb4226..90837b8a 100644
--- a/apps/web/src/routes/u/[username]/+page.svelte
+++ b/apps/web/src/routes/u/[username]/+page.svelte
@@ -17,7 +17,7 @@
let mounted = $state(false);
let copyMessage = $state('');
let copyStatus = $state<'success' | 'error'>('success');
- let copyMessageTimeout: ReturnType;
+ let copyMessageTimeout: ReturnType | undefined = undefined;
onMount(() => {
mounted = true;
@@ -37,9 +37,7 @@
clearTimeout(copyMessageTimeout);
}
- clearTimeout(copyTimeout);
-
- copyTimeout = setTimeout(() => {
+ copyMessageTimeout = setTimeout(() => {
copyMessage = '';
}, 3000);
}