Remove the light mode.

This commit is contained in:
2025-12-12 23:07:29 +00:00
parent a5d69ccb86
commit 4aab8af16f
33 changed files with 501 additions and 548 deletions
+63 -63
View File
@@ -103,23 +103,23 @@ watch(globalData, loadContributor)
/>
<div class="text-center md:text-left">
<h1 class="text-4xl font-bold bg-gradient-to-r from-primary-600 to-accent-600 dark:from-primary-400 dark:to-accent-400 bg-clip-text text-transparent">
<h1 class="text-4xl font-bold bg-gradient-to-r from-primary-400 to-accent-400 bg-clip-text text-transparent">
{{ contributor.name || contributor.login }}
</h1>
<p class="text-xl text-gray-600 dark:text-gray-400 mt-1">
<p class="text-xl text-gray-400 mt-1">
<GithubLink :url="`https://github.com/${contributor.login}`">
@{{ contributor.login }}
</GithubLink>
</p>
<div class="flex items-center justify-center md:justify-start space-x-4 mt-4">
<div class="bg-gradient-to-r from-pink-400/10 to-purple-400/10 dark:from-pink-400/5 dark:to-purple-400/5 border border-pink-400/20 dark:border-pink-400/10 rounded-lg px-4 py-2">
<span class="text-sm text-gray-600 dark:text-gray-400">Score:</span>
<span class="text-2xl font-bold bg-gradient-to-r from-primary-600 to-accent-600 dark:from-primary-400 dark:to-accent-400 bg-clip-text text-transparent ml-2">
<div class="bg-gradient-to-r from-pink-400/5 to-purple-400/5 border border-pink-400/10 rounded-lg px-4 py-2">
<span class="text-sm text-gray-400">Score:</span>
<span class="text-2xl font-bold bg-gradient-to-r from-primary-400 to-accent-400 bg-clip-text text-transparent ml-2">
{{ formatNumber(contributor.score?.total || contributor.score || 0) }}
</span>
</div>
<div v-if="contributor.score?.rank" class="text-sm text-gray-600 dark:text-gray-400">
<div v-if="contributor.score?.rank" class="text-sm text-gray-400">
Rank #{{ contributor.score.rank }}
<span v-if="contributor.score?.percentile_rank">
(Top {{ formatPercent(contributor.score.percentile_rank) }})
@@ -179,56 +179,56 @@ watch(globalData, loadContributor)
<div class="grid md:grid-cols-2 gap-6">
<!-- Code Stats -->
<Card>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">
<h3 class="text-lg font-semibold text-white mb-4">
<i class="fas fa-code text-green-500 mr-2"></i>Code Contributions
</h3>
<div class="space-y-4">
<div class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Lines Added</span>
<span class="text-gray-300">Lines Added</span>
<span class="text-green-500 font-semibold">
+{{ formatNumber(contributor.lines_added || 0) }}
</span>
</div>
<div class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Lines Deleted</span>
<span class="text-gray-300">Lines Deleted</span>
<span class="text-red-500 font-semibold">
-{{ formatNumber(contributor.lines_deleted || 0) }}
</span>
</div>
<div v-if="contributor.meaningful_lines_added !== undefined" class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Meaningful Lines Added</span>
<span class="text-gray-300">Meaningful Lines Added</span>
<span class="text-emerald-500 font-semibold">
+{{ formatNumber(contributor.meaningful_lines_added || 0) }}
</span>
</div>
<div v-if="contributor.meaningful_lines_deleted !== undefined" class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Meaningful Lines Deleted</span>
<span class="text-gray-300">Meaningful Lines Deleted</span>
<span class="text-rose-500 font-semibold">
-{{ formatNumber(contributor.meaningful_lines_deleted || 0) }}
</span>
</div>
<div v-if="contributor.comment_lines_added !== undefined" class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Comment Lines Added</span>
<span class="text-gray-300">Comment Lines Added</span>
<span class="text-cyan-500 font-semibold">
+{{ formatNumber(contributor.comment_lines_added || 0) }}
</span>
</div>
<div v-if="contributor.comment_lines_deleted !== undefined" class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Comment Lines Deleted</span>
<span class="text-gray-300">Comment Lines Deleted</span>
<span class="text-amber-500 font-semibold">
-{{ formatNumber(contributor.comment_lines_deleted || 0) }}
</span>
</div>
<div class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Files Changed</span>
<span class="text-gray-900 dark:text-white font-semibold">
<span class="text-gray-300">Files Changed</span>
<span class="text-white font-semibold">
{{ formatNumber(contributor.files_changed || 0) }}
</span>
</div>
<div v-if="contributor.avg_pr_size" class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Avg PR Size</span>
<span class="text-gray-900 dark:text-white font-semibold">
<span class="text-gray-300">Avg PR Size</span>
<span class="text-white font-semibold">
{{ formatNumber(Math.round(contributor.avg_pr_size)) }} lines
</span>
</div>
@@ -237,38 +237,38 @@ watch(globalData, loadContributor)
<!-- Review Stats -->
<Card>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">
<h3 class="text-lg font-semibold text-white mb-4">
<i class="fas fa-comments text-purple-500 mr-2"></i>Review Activity
</h3>
<div class="space-y-4">
<div class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Reviews Given</span>
<span class="text-gray-900 dark:text-white font-semibold">
<span class="text-gray-300">Reviews Given</span>
<span class="text-white font-semibold">
{{ formatNumber(contributor.reviews_given || 0) }}
</span>
</div>
<div class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Approvals</span>
<span class="text-gray-300">Approvals</span>
<span class="text-green-500 font-semibold">
{{ formatNumber(contributor.approvals_given || 0) }}
</span>
</div>
<div class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Changes Requested</span>
<span class="text-gray-300">Changes Requested</span>
<span class="text-orange-500 font-semibold">
{{ formatNumber(contributor.changes_requested || 0) }}
</span>
</div>
<div class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Review Comments</span>
<span class="text-gray-900 dark:text-white font-semibold">
<span class="text-gray-300">Review Comments</span>
<span class="text-white font-semibold">
{{ formatNumber(contributor.review_comments || 0) }}
</span>
</div>
<div v-if="contributor.avg_review_time_hours" class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Avg Review Time</span>
<span class="text-gray-900 dark:text-white font-semibold">
<span class="text-gray-300">Avg Review Time</span>
<span class="text-white font-semibold">
{{ formatDuration(contributor.avg_review_time_hours) }}
</span>
</div>
@@ -277,31 +277,31 @@ watch(globalData, loadContributor)
<!-- Issue Stats -->
<Card v-if="contributor.issues_opened || contributor.issues_closed || contributor.issue_comments || contributor.issue_references_in_commits">
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">
<h3 class="text-lg font-semibold text-white mb-4">
<i class="fas fa-bug text-red-500 mr-2"></i>Issue Activity
</h3>
<div class="space-y-4">
<div class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Issues Opened</span>
<span class="text-gray-300">Issues Opened</span>
<span class="text-red-500 font-semibold">
{{ formatNumber(contributor.issues_opened || 0) }}
</span>
</div>
<div class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Issues Closed</span>
<span class="text-gray-300">Issues Closed</span>
<span class="text-green-500 font-semibold">
{{ formatNumber(contributor.issues_closed || 0) }}
</span>
</div>
<div class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Issue Comments</span>
<span class="text-gray-300">Issue Comments</span>
<span class="text-blue-500 font-semibold">
{{ formatNumber(contributor.issue_comments || 0) }}
</span>
</div>
<div class="flex items-center justify-between">
<span class="text-gray-700 dark:text-gray-300">Issue References in Commits</span>
<span class="text-gray-300">Issue References in Commits</span>
<span class="text-purple-500 font-semibold">
{{ formatNumber(contributor.issue_references_in_commits || 0) }}
</span>
@@ -316,66 +316,66 @@ watch(globalData, loadContributor)
<section v-if="contributor.score?.breakdown" class="py-8 px-4">
<div class="container mx-auto">
<Card>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">
<i class="fas fa-chart-pie bg-gradient-to-r from-primary-600 to-accent-600 dark:from-primary-400 dark:to-accent-400 bg-clip-text text-transparent mr-2"></i>Score Breakdown
<h3 class="text-lg font-semibold text-white mb-4">
<i class="fas fa-chart-pie bg-gradient-to-r from-primary-400 to-accent-400 bg-clip-text text-transparent mr-2"></i>Score Breakdown
</h3>
<div class="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-8 gap-4">
<div class="text-center p-4 rounded-lg bg-gray-50 dark:bg-gray-800/50">
<div class="text-center p-4 rounded-lg bg-gray-800/50">
<div class="text-2xl font-bold text-green-500">
{{ formatNumber(contributor.score.breakdown.commits || 0) }}
</div>
<div class="text-xs text-gray-600 dark:text-gray-400 mt-1">Commits</div>
<div class="text-xs text-gray-600 dark:text-gray-400">{{ contributor.commit_count || 0 }} × 10 pts</div>
<div class="text-xs text-gray-400 mt-1">Commits</div>
<div class="text-xs text-gray-400">{{ contributor.commit_count || 0 }} × 10 pts</div>
</div>
<div class="text-center p-4 rounded-lg bg-gray-50 dark:bg-gray-800/50">
<div class="text-center p-4 rounded-lg bg-gray-800/50">
<div class="text-2xl font-bold text-blue-500">
{{ formatNumber(contributor.score.breakdown.prs || 0) }}
</div>
<div class="text-xs text-gray-600 dark:text-gray-400 mt-1">PRs</div>
<div class="text-xs text-gray-600 dark:text-gray-400">{{ contributor.prs_opened || 0 }} opened + {{ contributor.prs_merged || 0 }} merged</div>
<div class="text-xs text-gray-400 mt-1">PRs</div>
<div class="text-xs text-gray-400">{{ contributor.prs_opened || 0 }} opened + {{ contributor.prs_merged || 0 }} merged</div>
</div>
<div class="text-center p-4 rounded-lg bg-gray-50 dark:bg-gray-800/50">
<div class="text-center p-4 rounded-lg bg-gray-800/50">
<div class="text-2xl font-bold text-purple-500">
{{ formatNumber(contributor.score.breakdown.reviews || 0) }}
</div>
<div class="text-xs text-gray-600 dark:text-gray-400 mt-1">Reviews</div>
<div class="text-xs text-gray-600 dark:text-gray-400">{{ contributor.reviews_given || 0 }} × 30 pts</div>
<div class="text-xs text-gray-400 mt-1">Reviews</div>
<div class="text-xs text-gray-400">{{ contributor.reviews_given || 0 }} × 30 pts</div>
</div>
<div class="text-center p-4 rounded-lg bg-gray-50 dark:bg-gray-800/50">
<div class="text-center p-4 rounded-lg bg-gray-800/50">
<div class="text-2xl font-bold text-pink-500">
{{ formatNumber(contributor.score.breakdown.comments || 0) }}
</div>
<div class="text-xs text-gray-600 dark:text-gray-400 mt-1">Comments</div>
<div class="text-xs text-gray-600 dark:text-gray-400">{{ contributor.review_comments || 0 }} × 5 pts</div>
<div class="text-xs text-gray-400 mt-1">Comments</div>
<div class="text-xs text-gray-400">{{ contributor.review_comments || 0 }} × 5 pts</div>
</div>
<div class="text-center p-4 rounded-lg bg-gray-50 dark:bg-gray-800/50">
<div class="text-center p-4 rounded-lg bg-gray-800/50">
<div class="text-2xl font-bold text-red-500">
{{ formatNumber(contributor.score.breakdown.issues || 0) }}
</div>
<div class="text-xs text-gray-600 dark:text-gray-400 mt-1">Issues</div>
<div class="text-xs text-gray-600 dark:text-gray-400">opened, closed, comments, refs</div>
<div class="text-xs text-gray-400 mt-1">Issues</div>
<div class="text-xs text-gray-400">opened, closed, comments, refs</div>
</div>
<div class="text-center p-4 rounded-lg bg-gray-50 dark:bg-gray-800/50">
<div class="text-center p-4 rounded-lg bg-gray-800/50">
<div class="text-2xl font-bold text-orange-500">
{{ formatNumber(contributor.score.breakdown.line_changes || 0) }}
</div>
<div class="text-xs text-gray-600 dark:text-gray-400 mt-1">Line Changes</div>
<div class="text-xs text-gray-600 dark:text-gray-400">meaningful lines × 0.1 pts</div>
<div class="text-xs text-gray-400 mt-1">Line Changes</div>
<div class="text-xs text-gray-400">meaningful lines × 0.1 pts</div>
</div>
<div class="text-center p-4 rounded-lg bg-gray-50 dark:bg-gray-800/50">
<div class="text-center p-4 rounded-lg bg-gray-800/50">
<div class="text-2xl font-bold text-yellow-500">
{{ formatNumber(contributor.score.breakdown.response_bonus || 0) }}
</div>
<div class="text-xs text-gray-600 dark:text-gray-400 mt-1">Response Bonus</div>
<div class="text-xs text-gray-600 dark:text-gray-400">fast review bonus</div>
<div class="text-xs text-gray-400 mt-1">Response Bonus</div>
<div class="text-xs text-gray-400">fast review bonus</div>
</div>
<div class="text-center p-4 rounded-lg bg-gray-50 dark:bg-gray-800/50">
<div class="text-center p-4 rounded-lg bg-gray-800/50">
<div class="text-2xl font-bold text-indigo-500">
{{ formatNumber(contributor.score.breakdown.out_of_hours || 0) }}
</div>
<div class="text-xs text-gray-600 dark:text-gray-400 mt-1">Out of Hours</div>
<div class="text-xs text-gray-600 dark:text-gray-400">{{ contributor.out_of_hours_count || 0 }} × 2 pts</div>
<div class="text-xs text-gray-400 mt-1">Out of Hours</div>
<div class="text-xs text-gray-400">{{ contributor.out_of_hours_count || 0 }} × 2 pts</div>
</div>
</div>
</Card>
@@ -389,8 +389,8 @@ watch(globalData, loadContributor)
<!-- Earned Achievements -->
<Card v-if="contributor.achievements?.length">
<div class="flex items-center justify-between mb-6">
<h3 class="text-lg font-semibold text-gray-900 dark:text-white">
<i class="fas fa-award bg-gradient-to-r from-primary-600 to-accent-600 dark:from-primary-400 dark:to-accent-400 bg-clip-text text-transparent mr-2"></i>Achievements Earned
<h3 class="text-lg font-semibold text-white">
<i class="fas fa-award bg-gradient-to-r from-primary-400 to-accent-400 bg-clip-text text-transparent mr-2"></i>Achievements Earned
</h3>
<span class="px-2.5 py-1 rounded-full bg-gradient-to-r from-yellow-400 to-amber-500 text-white text-sm font-bold shadow-md">
{{ contributor.achievements.length }}
@@ -401,7 +401,7 @@ watch(globalData, loadContributor)
<div
v-for="achievement in contributor.achievements"
:key="achievement"
class="flex flex-col items-center p-2 rounded-xl bg-gray-50 dark:bg-gray-800/50 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"
class="flex flex-col items-center p-2 rounded-xl bg-gray-800/50 hover:bg-gray-800 transition-colors"
>
<AchievementBadge
:achievement-id="achievement"
@@ -414,7 +414,7 @@ watch(globalData, loadContributor)
<!-- Progress to Next Achievements -->
<Card>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-6">
<h3 class="text-lg font-semibold text-white mb-6">
<i class="fas fa-chart-line text-primary-500 mr-2"></i>Next Achievements
</h3>
@@ -441,9 +441,9 @@ watch(globalData, loadContributor)
v-for="repo in contributor.repositories_contributed"
:key="repo"
:to="`/repos/${repo}`"
class="inline-flex items-center px-3 py-1.5 rounded-full text-sm bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-primary-100 dark:hover:bg-primary-900/30 hover:text-primary-700 dark:hover:text-primary-300 transition-colors"
class="inline-flex items-center px-3 py-1.5 rounded-full text-sm bg-gray-800 text-gray-300 hover:bg-primary-900/30 hover:text-primary-300 transition-colors"
>
<i class="fas fa-code-branch text-gray-600 dark:text-gray-400 mr-2"></i>
<i class="fas fa-code-branch text-gray-400 mr-2"></i>
{{ repo }}
</RouterLink>
</div>
+5 -5
View File
@@ -27,13 +27,13 @@ const showScoreInChart = ref(false)
<header class="py-10 sm:py-16 px-4">
<div class="container mx-auto text-center animate-[fadeInUp_0.6s_ease-out]">
<h1 class="text-3xl sm:text-4xl md:text-6xl font-bold mb-3 sm:mb-4">
<span class="bg-gradient-to-r from-primary-600 to-accent-600 dark:from-primary-400 dark:to-accent-400 bg-clip-text text-transparent">Git Velocity</span>
<span class="bg-gradient-to-r from-primary-400 to-accent-400 bg-clip-text text-transparent">Git Velocity</span>
</h1>
<p class="text-base sm:text-xl text-gray-600 dark:text-gray-300 max-w-2xl mx-auto px-2">
<p class="text-base sm:text-xl text-gray-300 max-w-2xl mx-auto px-2">
Celebrate your team's achievements and contributions with beautiful insights.
</p>
<!-- Period and Generation Info -->
<div class="flex flex-col items-center space-y-2 mt-4 text-sm text-gray-600 dark:text-gray-400">
<div class="flex flex-col items-center space-y-2 mt-4 text-sm text-gray-400">
<p v-if="metrics.period?.start || metrics.period?.end">
<i class="fas fa-calendar-alt mr-1 text-primary-500"></i>
<span class="font-medium">Period:</span>
@@ -55,11 +55,11 @@ const showScoreInChart = ref(false)
<Card>
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 mb-4 sm:mb-6">
<SectionHeader title="Velocity Timeline" icon="fas fa-chart-line" icon-color="text-primary-500" />
<label class="flex items-center space-x-2 text-sm text-gray-700 dark:text-gray-400 cursor-pointer">
<label class="flex items-center space-x-2 text-sm text-gray-400 cursor-pointer">
<input
type="checkbox"
v-model="showScoreInChart"
class="rounded border-gray-300 dark:border-gray-600 text-primary-500 focus:ring-primary-500"
class="rounded border-gray-600 text-primary-500 focus:ring-primary-500"
/>
<span>Show Score</span>
</label>
File diff suppressed because it is too large Load Diff
+16 -16
View File
@@ -67,17 +67,17 @@ const categoryIcon = (category) => {
v-model="searchQuery"
type="text"
placeholder="Search contributors..."
class="w-full pl-10 pr-10 py-2.5 rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent transition text-sm sm:text-base"
class="w-full pl-10 pr-10 py-2.5 rounded-lg border border-gray-700 bg-gray-800 text-gray-100 placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent transition text-sm sm:text-base"
/>
<button
v-if="searchQuery"
@click="searchQuery = ''"
class="absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200"
class="absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-200"
>
<i class="fas fa-times"></i>
</button>
</div>
<p v-if="searchQuery && leaderboard.length !== allContributors.length" class="mt-2 text-sm text-gray-600 dark:text-gray-400">
<p v-if="searchQuery && leaderboard.length !== allContributors.length" class="mt-2 text-sm text-gray-400">
Showing {{ leaderboard.length }} of {{ allContributors.length }} contributors
</p>
</div>
@@ -100,25 +100,25 @@ const categoryIcon = (category) => {
<!-- Info -->
<div class="flex-1 min-w-0">
<div class="font-semibold text-gray-900 dark:text-white truncate">
<div class="font-semibold text-white truncate">
{{ item.name || item.login }}
</div>
<div class="text-xs text-gray-500 dark:text-gray-400 truncate">
<div class="text-xs text-gray-400 truncate">
@{{ item.login }}
</div>
</div>
<!-- Score -->
<div class="text-right">
<div class="text-lg font-bold bg-gradient-to-r from-primary-600 to-accent-600 dark:from-primary-400 dark:to-accent-400 bg-clip-text text-transparent">
<div class="text-lg font-bold bg-gradient-to-r from-primary-400 to-accent-400 bg-clip-text text-transparent">
{{ formatNumber(item.score) }}
</div>
<div class="text-xs text-gray-500 dark:text-gray-400">pts</div>
<div class="text-xs text-gray-400">pts</div>
</div>
</div>
<!-- Achievements row -->
<div v-if="item.achievements?.length" class="mt-3 pt-3 border-t border-gray-100 dark:border-gray-700">
<div v-if="item.achievements?.length" class="mt-3 pt-3 border-t border-gray-700">
<div class="flex flex-wrap gap-1.5">
<AchievementBadge
v-for="achievement in getHighestTierAchievements(item.achievements).slice(0, 6)"
@@ -128,7 +128,7 @@ const categoryIcon = (category) => {
/>
<span
v-if="getHighestTierAchievements(item.achievements).length > 6"
class="inline-flex items-center justify-center px-2 h-7 rounded-lg bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300 text-xs font-bold"
class="inline-flex items-center justify-center px-2 h-7 rounded-lg bg-gray-700 text-gray-300 text-xs font-bold"
>
+{{ getHighestTierAchievements(item.achievements).length - 6 }}
</span>
@@ -139,8 +139,8 @@ const categoryIcon = (category) => {
<!-- Empty State -->
<div v-if="!leaderboard.length" class="text-center py-12">
<i class="fas fa-users text-4xl text-gray-400 dark:text-gray-600 mb-4"></i>
<p class="text-gray-600 dark:text-gray-400">No contributors found</p>
<i class="fas fa-users text-4xl text-gray-500 mb-4"></i>
<p class="text-gray-400">No contributors found</p>
</div>
</div>
@@ -151,7 +151,7 @@ const categoryIcon = (category) => {
:items="leaderboard"
empty-icon="fas fa-users"
empty-message="No contributors found"
row-class="hover:bg-gray-50 dark:hover:bg-gray-800/30 transition group"
row-class="hover:bg-gray-800/30 transition group"
>
<template #rank="{ item }">
<RankBadge :rank="item.rank" />
@@ -170,7 +170,7 @@ const categoryIcon = (category) => {
:achievement-id="achievement"
size="sm"
/>
<span v-if="!(item.achievements || []).length" class="text-gray-600 dark:text-gray-400 text-sm">-</span>
<span v-if="!(item.achievements || []).length" class="text-gray-400 text-sm">-</span>
</div>
</td>
</template>
@@ -179,16 +179,16 @@ const categoryIcon = (category) => {
<td class="hidden xl:table-cell">
<span
v-if="item.team"
class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-purple-100 dark:bg-purple-900/30 text-purple-800 dark:text-purple-300"
class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-purple-900/30 text-purple-300"
>
{{ item.team }}
</span>
<span v-else class="text-gray-600 dark:text-gray-400">-</span>
<span v-else class="text-gray-400">-</span>
</td>
</template>
<template #score="{ item }">
<span class="text-lg font-bold bg-gradient-to-r from-primary-600 to-accent-600 dark:from-primary-400 dark:to-accent-400 bg-clip-text text-transparent">
<span class="text-lg font-bold bg-gradient-to-r from-primary-400 to-accent-400 bg-clip-text text-transparent">
{{ formatNumber(item.score) }}
</span>
</template>
+9 -9
View File
@@ -128,19 +128,19 @@ watch(() => route.params, loadRepository)
v-model="searchQuery"
type="text"
placeholder="Search contributors..."
class="w-full pl-10 pr-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent transition text-sm"
class="w-full pl-10 pr-4 py-2 rounded-lg border border-gray-700 bg-gray-800 text-gray-100 placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent transition text-sm"
/>
<button
v-if="searchQuery"
@click="searchQuery = ''"
class="absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200"
class="absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-200"
>
<i class="fas fa-times"></i>
</button>
</div>
</div>
<p v-if="searchQuery && filteredContributors.length !== allContributors.length" class="mb-4 text-sm text-gray-600 dark:text-gray-400">
<p v-if="searchQuery && filteredContributors.length !== allContributors.length" class="mb-4 text-sm text-gray-400">
Showing {{ filteredContributors.length }} of {{ allContributors.length }} contributors
</p>
@@ -149,27 +149,27 @@ watch(() => route.params, loadRepository)
:items="filteredContributors"
empty-icon="fas fa-users"
empty-message="No contributors found"
row-class="hover:bg-gray-50 dark:hover:bg-gray-800/30 transition group"
row-class="hover:bg-gray-800/30 transition group"
>
<template #contributor="{ item }">
<ContributorRow :contributor="item" />
</template>
<template #commits="{ item }">
<span class="text-gray-900 dark:text-white">{{ formatNumber(item.commit_count) }}</span>
<span class="text-white">{{ formatNumber(item.commit_count) }}</span>
</template>
<template #prs="{ item }">
<span class="text-gray-900 dark:text-white">{{ formatNumber(item.prs_opened) }}</span>
<span class="text-white">{{ formatNumber(item.prs_opened) }}</span>
</template>
<template #reviews="{ item }">
<span class="text-gray-900 dark:text-white">{{ formatNumber(item.reviews_given) }}</span>
<span class="text-white">{{ formatNumber(item.reviews_given) }}</span>
</template>
<template #lines="{ item }">
<span class="text-green-500">+{{ formatNumber(item.lines_added) }}</span>
<span class="text-gray-600 dark:text-gray-400 mx-1">/</span>
<span class="text-gray-400 mx-1">/</span>
<span class="text-red-500">-{{ formatNumber(item.lines_deleted) }}</span>
</template>
<template #score="{ item }">
<span class="text-lg font-bold bg-gradient-to-r from-primary-600 to-accent-600 dark:from-primary-400 dark:to-accent-400 bg-clip-text text-transparent">
<span class="text-lg font-bold bg-gradient-to-r from-primary-400 to-accent-400 bg-clip-text text-transparent">
{{ formatNumber(item.score?.total || 0) }}
</span>
</template>