Open Source Team Metrics based on PRs
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

light mode

+84 -27
+13 -25
app/page.tsx
··· 6 6 import { IconArrowRight, IconCode, IconChartBar, IconClock, IconReportAnalytics, IconTargetArrow, IconSpeakerphone, IconUsers, IconTrendingUp, IconBrandGithub, IconHeart, IconPresentation, IconSchool, IconBuildingStore } from "@tabler/icons-react"; 7 7 import { Button } from "@/components/ui/button"; 8 8 import { PrcatLogo } from "@/components/ui/prcat-logo"; 9 + import { ModeToggle } from "@/components/ui/mode-toggle"; 9 10 import { cn } from "@/lib/utils"; 10 11 11 12 export default function Home() { ··· 33 34 </Link> 34 35 35 36 <div className="flex items-center gap-3"> 37 + <ModeToggle /> 36 38 <Button 37 39 asChild 38 40 variant="outline" ··· 74 76 </div> 75 77 <h1 className="text-4xl md:text-6xl font-bold tracking-tight mb-6"> 76 78 Engineering Analytics<br /> 77 - <span className="text-muted-foreground">You Can Actually Trust</span> 79 + <span className="text-yellow-600 dark:text-yellow-400">You Can Actually Trust</span> 78 80 </h1> 79 81 <p className="text-xl text-muted-foreground max-w-3xl mx-auto mb-8"> 80 82 Self-hosted GitHub PR analytics for engineering leaders who want transparency, control, and insights that actually help their teams grow. No vendor lock-in, no hidden algorithms. ··· 109 111 </div> 110 112 </div> 111 113 112 - {/* 3D Dashboard Image with Advanced Masking */} 113 - <div className="mx-auto -mt-16 max-w-7xl" style={{ maskImage: 'linear-gradient(to bottom, black 60%, transparent 100%)' }}> 114 - <div 115 - className="mr-0 pl-8 lg:mr-0 lg:pl-16" 116 - style={{ 117 - perspective: '1200px', 118 - maskImage: 'linear-gradient(to right, black 80%, transparent 100%)' 119 - }} 120 - > 114 + {/* 3D Dashboard Image */} 115 + <div className="mx-auto -mt-16 max-w-7xl"> 116 + <div className="mr-0 pl-8 lg:mr-0 lg:pl-16" style={{ perspective: '1200px' }}> 121 117 <div style={{ transform: 'rotateX(20deg)' }}> 122 118 <div className="lg:h-[44rem] relative" style={{ transform: 'skewX(0.36rad)' }}> 123 119 <Image 124 - className="rounded-lg z-[2] relative border border-border/20 dark:hidden" 125 - src="/dashboard.png" 126 - alt="PR Cat Dashboard Screenshot" 127 - width={2880} 128 - height={2074} 129 - priority 130 - /> 131 - <Image 132 - className="rounded-lg z-[2] relative border border-border/20 hidden dark:block" 120 + className="rounded-lg z-[2] relative border border-border/20" 133 121 src="/dashboard2.png" 134 122 alt="PR Cat Dashboard Screenshot" 135 123 width={2880} ··· 206 194 </div> 207 195 208 196 {/* Company logos */} 209 - <div className="flex flex-wrap items-center justify-center gap-8 md:gap-12 mb-12"> 197 + <div className="flex flex-wrap items-center justify-center gap-8 md:gap-12 mb-12 p-6 rounded-xl bg-gray-50 dark:bg-gray-900/20"> 210 198 {/* Vercel */} 211 199 <Link 212 200 href="https://vercel.com/" ··· 214 202 rel="noopener noreferrer" 215 203 className="flex items-center justify-center h-12 grayscale hover:grayscale-0 transition-all duration-300" 216 204 > 217 - <svg aria-label="Vercel logotype" className="h-8 w-auto" role="img" viewBox="0 0 262 52" xmlns="http://www.w3.org/2000/svg"> 205 + <svg aria-label="Vercel logotype" className="h-8 w-auto text-gray-800 dark:text-white" role="img" viewBox="0 0 262 52" xmlns="http://www.w3.org/2000/svg"> 218 206 <path d="M59.8019 52L29.9019 0L0.00190544 52H59.8019ZM89.9593 49.6328L114.947 2.36365H104.139L86.9018 36.6921L69.6647 2.36365H58.8564L83.8442 49.6328H89.9593ZM260.25 2.36365V49.6329H251.302V2.36365H260.25ZM210.442 31.99C210.442 28.3062 211.211 25.0661 212.749 22.2699C214.287 19.4737 216.431 17.321 219.181 15.812C221.93 14.3029 225.146 13.5484 228.828 13.5484C232.09 13.5484 235.026 14.2585 237.636 15.6788C240.245 17.0991 242.319 19.2074 243.857 22.0036C245.395 24.7998 246.187 28.2174 246.234 32.2564V34.3202H219.88C220.066 37.2496 220.928 39.5576 222.466 41.2442C224.051 42.8864 226.171 43.7075 228.828 43.7075C230.505 43.7075 232.043 43.2637 233.441 42.376C234.839 41.4883 235.888 40.2899 236.587 38.7808L245.745 39.4466C244.626 42.7754 242.529 45.4385 239.453 47.4358C236.377 49.4331 232.835 50.4317 228.828 50.4317C225.146 50.4317 221.93 49.6772 219.181 48.1681C216.431 46.6591 214.287 44.5064 212.749 41.7102C211.211 38.914 210.442 35.6739 210.442 31.99ZM237.006 28.6612C236.68 25.7762 235.771 23.668 234.28 22.3365C232.789 20.9606 230.971 20.2726 228.828 20.2726C226.358 20.2726 224.354 21.0049 222.816 22.4696C221.278 23.9343 220.322 25.9982 219.95 28.6612H237.006ZM195.347 22.3365C196.838 23.5348 197.77 25.1993 198.143 27.3297L207.371 26.8637C207.044 24.1562 206.089 21.8039 204.505 19.8066C202.92 17.8093 200.869 16.278 198.353 15.2128C195.883 14.1032 193.157 13.5484 190.174 13.5484C186.492 13.5484 183.277 14.3029 180.527 15.812C177.777 17.321 175.634 19.4737 174.096 22.2699C172.558 25.0661 171.789 28.3062 171.789 31.99C171.789 35.6739 172.558 38.914 174.096 41.7102C175.634 44.5064 177.777 46.6591 180.527 48.1681C183.277 49.6772 186.492 50.4317 190.174 50.4317C193.25 50.4317 196.046 49.8769 198.563 48.7673C201.079 47.6133 203.13 45.9933 204.714 43.9072C206.299 41.8212 207.254 39.38 207.58 36.5838L198.283 36.1844C197.957 38.5367 197.048 40.3565 195.557 41.6436C194.065 42.8864 192.271 43.5078 190.174 43.5078C187.285 43.5078 185.048 42.5091 183.463 40.5118C181.879 38.5145 181.086 35.6739 181.086 31.99C181.086 28.3062 181.879 25.4656 183.463 23.4683C185.048 21.471 187.285 20.4723 190.174 20.4723C192.178 20.4723 193.902 21.0937 195.347 22.3365ZM149.955 14.3457H158.281L158.522 21.1369C159.113 19.2146 159.935 17.7218 160.988 16.6585C162.514 15.1166 164.642 14.3457 167.371 14.3457H170.771V21.6146H167.302C165.359 21.6146 163.763 21.8789 162.514 22.4075C161.311 22.9362 160.386 23.7732 159.739 24.9186C159.137 26.064 158.837 27.5178 158.837 29.2799V49.6328H149.955V14.3457ZM111.548 22.2699C110.01 25.0661 109.241 28.3062 109.241 31.99C109.241 35.6739 110.01 38.914 111.548 41.7102C113.086 44.5064 115.229 46.6591 117.979 48.1681C120.729 49.6772 123.944 50.4317 127.626 50.4317C131.634 50.4317 135.176 49.4331 138.252 47.4358C141.327 45.4385 143.425 42.7754 144.543 39.4466L135.385 38.7808C134.686 40.2899 133.638 41.4883 132.24 42.376C130.842 43.2637 129.304 43.7075 127.626 43.7075C124.97 43.7075 122.849 42.8864 121.265 41.2442C119.727 39.5576 118.865 37.2496 118.678 34.3202H145.032V32.2564C144.986 28.2174 144.194 24.7998 142.656 22.0036C141.118 19.2074 139.044 17.0991 136.434 15.6788C133.824 14.2585 130.888 13.5484 127.626 13.5484C123.944 13.5484 120.729 14.3029 117.979 15.812C115.229 17.321 113.086 19.4737 111.548 22.2699ZM133.079 22.3365C134.57 23.668 135.479 25.7762 135.805 28.6612H118.748C119.121 25.9982 120.076 23.9343 121.614 22.4696C123.152 21.0049 125.156 20.2726 127.626 20.2726C129.77 20.2726 131.587 20.9606 133.079 22.3365Z" fill="currentColor"/> 219 207 </svg> 220 208 </Link> ··· 231 219 alt="Turso" 232 220 width={120} 233 221 height={48} 234 - className="h-10 w-auto" 222 + className="h-10 w-auto filter dark:filter-none invert dark:invert-0" 235 223 /> 236 224 </Link> 237 225 238 226 {/* Meiro */} 239 227 <Link 240 - href="https://www.meiro.io/" 228 + href="https://meiro.io/" 241 229 target="_blank" 242 230 rel="noopener noreferrer" 243 - className="flex items-center justify-center h-12 grayscale hover:grayscale-0 transition-all duration-300" 231 + className="flex items-center justify-center h-12 grayscale" 244 232 > 245 233 <Image 246 234 src="/meiro.svg" 247 235 alt="Meiro" 248 236 width={120} 249 237 height={48} 250 - className="h-10 w-auto" 238 + className="h-10 w-auto filter dark:filter-none invert dark:invert-0" 251 239 /> 252 240 </Link> 253 241
+31 -2
components/nav-user.tsx
··· 1 1 "use client" 2 2 3 3 import { signIn, signOut, useSession } from "next-auth/react" 4 + import { useTheme } from "next-themes" 4 5 import { 5 6 SidebarMenu, 6 7 SidebarMenuItem, ··· 14 15 DropdownMenuItem, 15 16 DropdownMenuLabel, 16 17 DropdownMenuSeparator, 17 - DropdownMenuTrigger 18 + DropdownMenuTrigger, 19 + DropdownMenuSub, 20 + DropdownMenuSubContent, 21 + DropdownMenuSubTrigger, 22 + DropdownMenuPortal 18 23 } from "@/components/ui/dropdown-menu" 19 - import { IconBrandGithub } from "@tabler/icons-react" 24 + import { IconBrandGithub, IconMoon, IconSun, IconDeviceDesktop } from "@tabler/icons-react" 20 25 21 26 export function NavUser() { 22 27 const { } = useSidebar() 23 28 const { data: session } = useSession() 29 + const { setTheme, theme } = useTheme() 24 30 25 31 // If not authenticated, show GitHub login button 26 32 if (!session) { ··· 70 76 <DropdownMenuLabel> 71 77 {session?.user?.name || session?.user?.email || "Account"} 72 78 </DropdownMenuLabel> 79 + <DropdownMenuSeparator /> 80 + <DropdownMenuSub> 81 + <DropdownMenuSubTrigger> 82 + <IconSun className="h-4 w-4 mr-2" /> 83 + Theme 84 + </DropdownMenuSubTrigger> 85 + <DropdownMenuPortal> 86 + <DropdownMenuSubContent> 87 + <DropdownMenuItem onClick={() => setTheme("light")}> 88 + <IconSun className="h-4 w-4 mr-2" /> 89 + Light 90 + </DropdownMenuItem> 91 + <DropdownMenuItem onClick={() => setTheme("dark")}> 92 + <IconMoon className="h-4 w-4 mr-2" /> 93 + Dark 94 + </DropdownMenuItem> 95 + <DropdownMenuItem onClick={() => setTheme("system")}> 96 + <IconDeviceDesktop className="h-4 w-4 mr-2" /> 97 + System 98 + </DropdownMenuItem> 99 + </DropdownMenuSubContent> 100 + </DropdownMenuPortal> 101 + </DropdownMenuSub> 73 102 <DropdownMenuSeparator /> 74 103 <DropdownMenuItem onClick={() => signOut({ callbackUrl: "/" })}> 75 104 Sign out
+40
components/ui/mode-toggle.tsx
··· 1 + "use client" 2 + 3 + import * as React from "react" 4 + import { Moon, Sun } from "lucide-react" 5 + import { useTheme } from "next-themes" 6 + 7 + import { Button } from "@/components/ui/button" 8 + import { 9 + DropdownMenu, 10 + DropdownMenuContent, 11 + DropdownMenuItem, 12 + DropdownMenuTrigger, 13 + } from "@/components/ui/dropdown-menu" 14 + 15 + export function ModeToggle() { 16 + const { setTheme } = useTheme() 17 + 18 + return ( 19 + <DropdownMenu> 20 + <DropdownMenuTrigger asChild> 21 + <Button variant="outline" size="icon"> 22 + <Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" /> 23 + <Moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" /> 24 + <span className="sr-only">Toggle theme</span> 25 + </Button> 26 + </DropdownMenuTrigger> 27 + <DropdownMenuContent align="end"> 28 + <DropdownMenuItem onClick={() => setTheme("light")}> 29 + Light 30 + </DropdownMenuItem> 31 + <DropdownMenuItem onClick={() => setTheme("dark")}> 32 + Dark 33 + </DropdownMenuItem> 34 + <DropdownMenuItem onClick={() => setTheme("system")}> 35 + System 36 + </DropdownMenuItem> 37 + </DropdownMenuContent> 38 + </DropdownMenu> 39 + ) 40 + }