From a93718b455081d4e5617166dfc8a521053769f47 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 27 Feb 2026 01:24:59 +0100 Subject: [PATCH] Add Wakatime stats --- app/favicon.ico | Bin 25931 -> 370070 bytes app/layout.tsx | 4 +- app/page.tsx | 80 ++- components/bar-chart.tsx | 165 +++++ components/code-block.tsx | 36 + components/theme-provider.tsx | 6 +- components/ui/chart.tsx | 353 ++++++++++ components/ui/hover-card.tsx | 44 ++ components/ui/skeleton.tsx | 13 + components/wakatime-hint.tsx | 25 + components/wakatime.tsx | 37 ++ next.config.ts | 6 +- package-lock.json | 1174 ++++++++++++++++++++++++++++++++- package.json | 2 + public/file.svg | 1 - public/globe.svg | 1 - public/next.svg | 1 - public/uwu2x.jpg | Bin 172333 -> 229015 bytes public/vercel.svg | 1 - public/window.svg | 1 - 20 files changed, 1898 insertions(+), 52 deletions(-) create mode 100644 components/bar-chart.tsx create mode 100644 components/code-block.tsx create mode 100644 components/ui/chart.tsx create mode 100644 components/ui/hover-card.tsx create mode 100644 components/ui/skeleton.tsx create mode 100644 components/wakatime-hint.tsx create mode 100644 components/wakatime.tsx delete mode 100644 public/file.svg delete mode 100644 public/globe.svg delete mode 100644 public/next.svg delete mode 100644 public/vercel.svg delete mode 100644 public/window.svg diff --git a/app/favicon.ico b/app/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..b4d882dc829883d5ba01204062bf778163541b64 100644 GIT binary patch literal 370070 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 LrJugUA?W`A8`#=m diff --git a/app/layout.tsx b/app/layout.tsx index 04c01f0..c817cd3 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -16,8 +16,8 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "alixz.ovh", + description: "My editing and programming portfolio.", }; export default function RootLayout({ diff --git a/app/page.tsx b/app/page.tsx index a9bbaf4..c46f5b5 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,39 +1,53 @@ -import { H1, H2, H3, P } from "@/components/typography"; -import { Card, CardAction, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; +import { H1, H2, P } from "@/components/typography"; +import { Card, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; import Image from "next/image"; import Link from "next/link"; -import { Link2 } from "lucide-react"; +import { ExternalLink } from "lucide-react"; +import { Suspense } from "react"; +import { Wakatime } from "@/components/wakatime"; +import { MyBarChartSkeleton } from "@/components/bar-chart"; +import { WakatimeHint } from "@/components/wakatime-hint"; export default function Page() { - return <> -

alixz.ovh

-

Editing and programming are what makes my kokoro go dokidoki :-)

-

Projects

- - uwu2x cover - - uwu2x - - An After Effects extension that improves the quality and the smoothness of clips, similar to what Topaz and Flowframes do, but in one click ! -

- Used by 7000 people every month, and seen +300,000 times on Youtube. -
-
- - - - - - - - -
- ; + return <> +

alixz.ovh

+

Editing and programming are what makes my kokoro go dokidoki :-)

+ +

+ Monthly coding stats{" "} + + + +

+ }> + + + +

Projects

+ + uwu2x cover + + uwu2x + + An After Effects extension that improves the quality and the smoothness of clips, similar to what Topaz and Flowframes do, but in one click ! +
+ Used by 7000 people every month, and seen +300,000 times on Youtube. +
+
+ + + + + + + + +
+ ; } \ No newline at end of file diff --git a/components/bar-chart.tsx b/components/bar-chart.tsx new file mode 100644 index 0000000..c4d1070 --- /dev/null +++ b/components/bar-chart.tsx @@ -0,0 +1,165 @@ +"use client" + +import { Bar, BarChart, LabelList, XAxis, YAxis, Cell } from "recharts" +import { cn } from "@/lib/utils" + +import { + ChartContainer, + type ChartConfig, +} from "@/components/ui/chart" + +const COLORS = [ + "#4ade80", + "#60a5fa", + "#f87171", + "#fb923c", + "#c084fc", +] + +const chartConfig = { + total_seconds: { + label: "Seconds", + }, +} satisfies ChartConfig + +type ChartData = { + language: string + total_seconds: number + label: string +} + +interface MyBarChartProps { + data: ChartData[] + className?: string +} + +interface MyBarChartSkeletonProps { + className?: string +} + +export function MyBarChart({ data, className }: MyBarChartProps) { + return ( + + + + + + {data.map((_, index) => ( + + ))} + ( + + {String(value)} + + )} + /> + + + + ) +} + +export function MyBarChartSkeleton({ className }: MyBarChartSkeletonProps) { + const fakeData = [ + { language: "a", total_seconds: 102000 }, + { language: "b", total_seconds: 59000 }, + { language: "c", total_seconds: 41000 }, + { language: "d", total_seconds: 28000 }, + { language: "e", total_seconds: 17000 }, + ] + + return ( + + + + + + + + ) +} + +export function MyBarChartError({ className }: MyBarChartSkeletonProps) { + const fakeData = [ + { language: "a", total_seconds: 102000 }, + { language: "b", total_seconds: 59000 }, + { language: "c", total_seconds: 41000 }, + { language: "d", total_seconds: 28000 }, + { language: "e", total_seconds: 17000 }, + ] + + return ( +
+ + + + + + + +
+ + Failed to fetch Wakatime stats :/ + +
+
+ ) +} \ No newline at end of file diff --git a/components/code-block.tsx b/components/code-block.tsx new file mode 100644 index 0000000..780b338 --- /dev/null +++ b/components/code-block.tsx @@ -0,0 +1,36 @@ +import * as React from 'react' +import CodeEditorPrimitive from '@uiw/react-textarea-code-editor' + +import { cn } from '@/lib/utils' + +function CodeEditor({ + className, + ...props +}: React.ComponentProps) { + return ( + .w-tc-editor-preview]:px-3! [&>.w-tc-editor-preview]:py-2! [&>.w-tc-editor-preview]:m-0! [&>.w-tc-editor-preview]:min-h-16!', + '[&>.w-tc-editor-preview]:rounded-md! [&>.w-tc-editor-preview]:bg-transparent! [&>.w-tc-editor-preview]:dark:bg-input/30! [&>.w-tc-editor-preview]:shadow-xs! [&>.w-tc-editor-preview]:transition-[color,box-shadow]!', + '[&>.w-tc-editor-preview]:text-base! [&>.w-tc-editor-preview]:md:text-sm! [&>.w-tc-editor-preview]:field-sizing-content!', + '[&>.w-tc-editor-preview]:text-foreground! [&>.w-tc-editor-preview]:placeholder:text-muted-foreground!', + '[&>.w-tc-editor-preview]:outline-none!', + '[&>.w-tc-editor-preview]:border! [&>.w-tc-editor-preview]:border-input!', + '[&>.w-tc-editor-text]:px-3! [&>.w-tc-editor-text]:py-2! [&>.w-tc-editor-text]:m-0!', + '[&>.w-tc-editor-text]:text-base! [&>.w-tc-editor-text]:md:text-sm! [&>.w-tc-editor-text]:field-sizing-content!', + '[&>.w-tc-editor-text]:text-foreground! [&>.w-tc-editor-text]:placeholder:text-muted-foreground! [&>.w-tc-editor-text]:opacity-100!', + '[&>.w-tc-editor-text]:subpixel-antialiased!', + '[&>.w-tc-editor-text]:disabled:cursor-not-allowed! [&:has(>.w-tc-editor-text:disabled)]:opacity-50!', + '[&:has(>.w-tc-editor-text[aria-invalid="true"])]:[&>.w-tc-editor-preview]:ring-destructive/20! dark:[&:has(>.w-tc-editor-text[aria-invalid="true"])]:[&>.w-tc-editor-preview]:ring-destructive/40! [&:has(>.w-tc-editor-text[aria-invalid="true"])]:[&>.w-tc-editor-preview]:border-destructive!', + className, + )} + {...props} + /> + ) +} + +export { CodeEditor } \ No newline at end of file diff --git a/components/theme-provider.tsx b/components/theme-provider.tsx index e018a73..13d013b 100644 --- a/components/theme-provider.tsx +++ b/components/theme-provider.tsx @@ -4,8 +4,8 @@ import * as React from "react" import { ThemeProvider as NextThemesProvider } from "next-themes" export function ThemeProvider({ - children, - ...props + children, + ...props }: React.ComponentProps) { - return {children} + return {children} } \ No newline at end of file diff --git a/components/ui/chart.tsx b/components/ui/chart.tsx new file mode 100644 index 0000000..5f31f72 --- /dev/null +++ b/components/ui/chart.tsx @@ -0,0 +1,353 @@ +"use client" + +import * as React from "react" +import * as RechartsPrimitive from "recharts" + +import { cn } from "@/lib/utils" + +// Format: { THEME_NAME: CSS_SELECTOR } +const THEMES = { light: "", dark: ".dark" } as const + +export type ChartConfig = { + [k in string]: { + label?: React.ReactNode + icon?: React.ComponentType + } & ( + | { color?: string; theme?: never } + | { color?: never; theme: Record } + ) +} + +type ChartContextProps = { + config: ChartConfig +} + +const ChartContext = React.createContext(null) + +function useChart() { + const context = React.useContext(ChartContext) + + if (!context) { + throw new Error("useChart must be used within a ") + } + + return context +} + +function ChartContainer({ + id, + className, + children, + config, + ...props +}: React.ComponentProps<"div"> & { + config: ChartConfig + children: React.ComponentProps< + typeof RechartsPrimitive.ResponsiveContainer + >["children"] +}) { + const uniqueId = React.useId() + const chartId = `chart-${id || uniqueId.replace(/:/g, "")}` + + return ( + +
+ + + {children} + +
+
+ ) +} + +const ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => { + const colorConfig = Object.entries(config).filter( + ([, config]) => config.theme || config.color + ) + + if (!colorConfig.length) { + return null + } + + return ( +