From 0a215ee98fdec1414ae5eba36700e6890f863e31 Mon Sep 17 00:00:00 2001 From: highperfocused Date: Sun, 25 May 2025 01:24:09 +0200 Subject: [PATCH] feat: add Progress component using Radix UI and update dependencies - Implemented a new Progress component in `components/ui/progress.tsx` utilizing Radix UI's progress primitives. - Added `@radix-ui/react-progress` as a dependency in `package.json`. - Updated `package-lock.json` to include new dependencies, including `recharts` and its related packages. --- bun.lockb | Bin 366293 -> 381728 bytes components/dashboard/Statistics.tsx | 646 +++++++++++++++++++++++++--- components/ui/progress.tsx | 28 ++ package-lock.json | 323 +++++++++++++- package.json | 2 + 5 files changed, 938 insertions(+), 61 deletions(-) create mode 100644 components/ui/progress.tsx diff --git a/bun.lockb b/bun.lockb index 8163ac5f1b02001c5ad28b5b55d204cb816b5fb3..9c6d04779d58a2f107daff22f84c903737aeec39 100755 GIT binary patch delta 79567 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 delta 70545 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 F{|~iP$E^SW diff --git a/components/dashboard/Statistics.tsx b/components/dashboard/Statistics.tsx index 132986f..413682c 100644 --- a/components/dashboard/Statistics.tsx +++ b/components/dashboard/Statistics.tsx @@ -1,120 +1,646 @@ -import React from 'react'; +import React, { useState, useMemo } from 'react'; import { useNostrEvents, useProfile } from "nostr-react"; import { Card, CardHeader, CardTitle, CardContent, CardFooter, CardDescription } from '@/components/ui/card'; import { Skeleton } from '@/components/ui/skeleton'; import { AvatarImage } from '@radix-ui/react-avatar'; -import { Avatar } from '@/components/ui/avatar'; +import { Avatar, AvatarFallback } from '@/components/ui/avatar'; import NIP05 from '@/components/nip05'; import { RecentFollowerCard } from './RecentFollowerCard'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { Progress } from "@/components/ui/progress"; import { nip19, } from "nostr-tools"; import { RecentZapsCard } from './RecentZapsCard'; +import { + Users, Zap, Activity, TrendingUp, Calendar, CircleUser, + MessageCircle, Share2, ThumbsUp, + Network, LineChart, BarChart4, PieChart, Medal, Trophy, + Heart, Gift, Sparkles +} from "lucide-react"; +import Link from "next/link"; interface ProfileInfoCardProps { pubkey: string; } -const ProfileInfoCard: React.FC = ({ pubkey }) => { +interface ZapStat { + totalReceived: number; + count: number; + topZappers: {pubkey: string; amount: number}[]; +} + +interface FollowStat { + totalFollowers: number; + totalFollowing: number; + recentFollowers: any[]; + mutualFollows: number; +} + +interface NostrActivityStat { + totalPosts: number; + totalReplies: number; + totalReactions: number; + mostActiveMonth: string; + postsPerDay: number; +} + +const NostrInsights: React.FC = ({ pubkey }) => { const { data: userData, isLoading: userDataLoading } = useProfile({ pubkey, }); - const { events: followers, isLoading: followersLoading } = useNostrEvents({ + // Fetch followers (kind 3 events that include the user's pubkey) + const { events: followerEvents, isLoading: followersLoading } = useNostrEvents({ filter: { kinds: [3], '#p': [pubkey], }, }); - const { events: zaps, isLoading: zapsLoading } = useNostrEvents({ - filter: { - kinds: [9735], - '#p': [pubkey], - limit: 50, - }, - }); - - const { events: following, isLoading: followingLoading } = useNostrEvents({ + // Fetch user's follow list (kind 3 events authored by the user) + const { events: followingEvents, isLoading: followingLoading } = useNostrEvents({ filter: { kinds: [3], authors: [pubkey], - limit: 1, }, }); - // filter for only new followings (latest in a users followers list) - const filteredFollowers = followers.filter(follower => { - const lastPTag = follower.tags[follower.tags.length - 1]; - if (lastPTag[0] === "p" && lastPTag[1] === pubkey.toString()) { - // console.log(follower.tags[follower.tags.length - 1]); - return true; - } + // Fetch zaps (kind 9735 - zap receipts) + const { events: zapEvents, isLoading: zapsLoading } = useNostrEvents({ + filter: { + kinds: [9735], + '#p': [pubkey], + limit: 100, + }, }); + // Fetch user's posts (kind 1 - text notes) + const { events: postEvents, isLoading: postsLoading } = useNostrEvents({ + filter: { + kinds: [1], + authors: [pubkey], + limit: 200, + }, + }); + + // Fetch reactions to user's posts (kind 7 - reactions) + const { events: reactionEvents, isLoading: reactionsLoading } = useNostrEvents({ + filter: { + kinds: [7], + '#p': [pubkey], + limit: 100, + }, + }); + + // Calculate follower stats + const followerStats: FollowStat = useMemo(() => { + if (followersLoading || followingLoading) { + return { + totalFollowers: 0, + totalFollowing: 0, + recentFollowers: [], + mutualFollows: 0 + }; + } + + // Get all pubkeys the user is following + const followingPubkeys = followingEvents.length > 0 + ? followingEvents[0]?.tags + .filter(tag => tag[0] === 'p') + .map(tag => tag[1]) + : []; + + // Get all follower pubkeys + const followerPubkeys = followerEvents.map(event => event.pubkey); + + // Find mutual follows (intersection of followingPubkeys and followerPubkeys) + const mutualFollows = followingPubkeys.filter(pk => followerPubkeys.includes(pk)).length; + + // Filter for only recent followers (latest in a users followers list) + const filteredFollowers = followerEvents.filter(follower => { + const lastPTag = follower.tags[follower.tags.length - 1]; + if (lastPTag[0] === "p" && lastPTag[1] === pubkey) { + return true; + } + return false; + }); + + return { + totalFollowers: followerEvents.length, + totalFollowing: followingPubkeys.length, + recentFollowers: filteredFollowers.slice(-5).reverse(), + mutualFollows + }; + }, [followerEvents, followingEvents, followersLoading, followingLoading, pubkey]); + + // Calculate zap stats + const zapStats: ZapStat = useMemo(() => { + if (zapsLoading) { + return { + totalReceived: 0, + count: 0, + topZappers: [] + }; + } + + let totalSats = 0; + const zapperMap = new Map(); + + zapEvents.forEach(zap => { + // Extract zap amount from bolt11 tag + const bolt11Tag = zap.tags.find(tag => tag[0] === 'bolt11'); + if (!bolt11Tag || !bolt11Tag[1]) return; + + // Extract zapper pubkey from P tag + const zapperTag = zap.tags.find(tag => tag[0] === 'P'); + const zapperPubkey = zapperTag ? zapperTag[1] : zap.pubkey; + + // Try to extract amount from description tag + const descriptionTag = zap.tags.find(tag => tag[0] === 'description'); + if (descriptionTag && descriptionTag[1]) { + try { + const zapRequest = JSON.parse(descriptionTag[1]); + const amountTag = zapRequest.tags.find((tag: string[]) => tag[0] === 'amount'); + if (amountTag && amountTag[1]) { + const sats = parseInt(amountTag[1], 10) / 1000; // Convert msats to sats + totalSats += sats; + + // Track zapper amounts + zapperMap.set( + zapperPubkey, + (zapperMap.get(zapperPubkey) || 0) + sats + ); + } + } catch (e) { + // Invalid JSON in description tag + } + } + }); + + // Get top zappers + const topZappers = Array.from(zapperMap.entries()) + .map(([pubkey, amount]) => ({ pubkey, amount })) + .sort((a, b) => b.amount - a.amount) + .slice(0, 5); + + return { + totalReceived: totalSats, + count: zapEvents.length, + topZappers + }; + }, [zapEvents, zapsLoading]); + + // Calculate post activity stats + const activityStats: NostrActivityStat = useMemo(() => { + if (postsLoading || reactionsLoading) { + return { + totalPosts: 0, + totalReplies: 0, + totalReactions: 0, + mostActiveMonth: '', + postsPerDay: 0 + }; + } + + // Count replies (posts with e tags) + const replies = postEvents.filter(post => + post.tags.some(tag => tag[0] === 'e') + ); + + // Count reactions received + const reactionsReceived = reactionEvents.length; + + // Calculate most active month + const postsByMonth = postEvents.reduce((acc: Record, post) => { + const date = new Date(post.created_at * 1000); + const monthYear = `${date.toLocaleString('default', { month: 'long' })} ${date.getFullYear()}`; + acc[monthYear] = (acc[monthYear] || 0) + 1; + return acc; + }, {}); + + // Find month with most posts + let mostActiveMonth = ''; + let maxPosts = 0; + Object.entries(postsByMonth).forEach(([month, count]) => { + if (count > maxPosts) { + mostActiveMonth = month; + maxPosts = count; + } + }); + + // Calculate average posts per day (over last 30 days) + const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000; + const recentPosts = postEvents.filter(post => post.created_at * 1000 > thirtyDaysAgo); + const postsPerDay = recentPosts.length / 30; + + return { + totalPosts: postEvents.length, + totalReplies: replies.length, + totalReactions: reactionsReceived, + mostActiveMonth, + postsPerDay + }; + }, [postEvents, reactionEvents, postsLoading, reactionsLoading]); + + // Format profile info let encoded = nip19.npubEncode(pubkey); let parts = encoded.split('npub'); let npubShortened = 'npub' + parts[1].slice(0, 4) + ':' + parts[1].slice(-3); + const title = userData?.username || userData?.display_name || userData?.name || userData?.npub || npubShortened; const description = userData?.about?.replace(/(?:\r\n|\r|\n)/g, '
'); - const nip05 = userData?.nip05 - let profileImageSrc = userData?.picture || "https://robohash.org/" + pubkey; + const nip05 = userData?.nip05; + const profileImageSrc = userData?.picture || "https://robohash.org/" + pubkey; + + const isLoading = userDataLoading || followersLoading || followingLoading || zapsLoading || postsLoading || reactionsLoading; + + // Calculate engagement score (a fun metric based on activity) + const engagementScore = Math.min(100, Math.round( + (followerStats.totalFollowers * 2) + + (activityStats.totalPosts * 3) + + (zapStats.totalReceived * 0.5) + + (activityStats.totalReactions * 1.5) + ) / 10); + return ( <>
- {/* */} - - - {/* Profile */} - - + {/* Profile Card */} + +
- + + {title.slice(0, 2)}
-

{title}

+

{title}

- +
+ + Nostr Engagement: {engagementScore}% +
-
-
- - - Total Followers - - -
{followers.length}
- {/*

- +20.1% from last month -

*/} -
-
- - - Total Following - - -
- {followingLoading ? "Loading.." : (following.length > 0 ? following[0]?.tags.length : "-")} + + {/* Tabs for different insights */} + + + + + Overview + + + + Network + + + + Zaps + + + + {/* Overview Tab */} + +
+ {/* Engagement Stats */} + + + + + Engagement + + + +
+
+ Engagement Score + {engagementScore}% +
+ + +
+
+
+ + {activityStats.totalPosts} posts +
+
+ + {activityStats.totalReplies} replies +
+
+ + {activityStats.totalReactions} reactions +
+
+ + {zapStats.count} zaps +
+
+
+
+
+
+ + {/* Network Stats */} + + + + + Network + + + +
+
+ Followers + {followerStats.totalFollowers} +
+
+ Following + {followerStats.totalFollowing} +
+
+ Mutual Follows + {followerStats.mutualFollows} +
+
+
Follow Ratio
+ 0 + ? Math.min(100, (followerStats.totalFollowers / followerStats.totalFollowing) * 50) + : 0 + } + className="h-2 mt-1" + /> +
+
+
+
+ + {/* Zap Stats */} + + + + + Zap Stats + + + +
+
+ Total Received + {zapStats.totalReceived.toLocaleString()} sats +
+
+ Zap Count + {zapStats.count} +
+
+ Avg. per Zap + + {zapStats.count > 0 + ? Math.round(zapStats.totalReceived / zapStats.count).toLocaleString() + : 0} sats + +
+
+
+
- {/*

- +20.1% from last month -

*/} - - - - + + {/* Activity Timeline */} + + + + + Activity Insights + + + Stats based on {activityStats.totalPosts} posts and {activityStats.totalReactions} reactions + + + +
+
+
Most Active Time
+
{activityStats.mostActiveMonth || "No data"}
+
+
+
Avg. Posts per Day
+
{activityStats.postsPerDay.toFixed(1)}
+
+
+
Engagement Ratio
+
+ {activityStats.totalPosts > 0 + ? (activityStats.totalReactions / activityStats.totalPosts).toFixed(1) + : "0"} reactions/post +
+
+
+
+
+
+ + {/* Network Tab */} + +
+ {/* Recent Followers */} + + + {/* Network Stats Card */} + + + + + Network Metrics + + + +
+
+
Mutual Follows Ratio
+
+
+ 0 + ? (followerStats.mutualFollows / followerStats.totalFollowing) * 100 + : 0 + } + className="h-2" + /> +
+
+ {followerStats.totalFollowing > 0 + ? Math.round((followerStats.mutualFollows / followerStats.totalFollowing) * 100) + : 0}% +
+
+
+ {followerStats.mutualFollows} out of {followerStats.totalFollowing} follows are mutual +
+
+ +
+
Network Stats
+
+
+ Followers + {followerStats.totalFollowers} +
+
+ Following + {followerStats.totalFollowing} +
+
+ Ratio + + {followerStats.totalFollowing > 0 + ? (followerStats.totalFollowers / followerStats.totalFollowing).toFixed(2) + : "∞"} + +
+
+ Mutuals + {followerStats.mutualFollows} +
+
+
+
+
+
+
+
+ + {/* Zaps Tab */} + +
+ {/* Zap Summary */} + + + + + Zap Summary + + + +
+
+
{zapStats.totalReceived.toLocaleString()}
+
Total Sats Received
+
+ +
+
+
{zapStats.count}
+
Total Zaps
+
+
+
+ {zapStats.count > 0 + ? Math.round(zapStats.totalReceived / zapStats.count).toLocaleString() + : 0} +
+
Avg Sats/Zap
+
+
+
+ {zapStats.topZappers.length > 0 + ? zapStats.topZappers[0].amount.toLocaleString() + : 0} +
+
Largest Zap
+
+
+
+
+
+ + {/* Recent Zaps */} + +
+ + {/* Top Zappers */} + {zapStats.topZappers.length > 0 && ( + + + + + Top Supporters + + + +
+ {zapStats.topZappers.map((zapper, index) => ( + + ))} +
+
+
+ )} +
+
); } -export default ProfileInfoCard; \ No newline at end of file +// Component for displaying top zapper +const TopZapperItem: React.FC<{pubkey: string; amount: number; rank: number}> = ({ pubkey, amount, rank }) => { + const { data: userData } = useProfile({ + pubkey, + }); + + // Format the pubkey for display + let encoded = nip19.npubEncode(pubkey); + let parts = encoded.split('npub'); + let npubShortened = 'npub' + parts[1].slice(0, 4) + ':' + parts[1].slice(-3); + + // Get user display name + const name = userData?.username || userData?.display_name || userData?.name || userData?.npub || npubShortened; + const profileImageSrc = userData?.picture || "https://robohash.org/" + pubkey; + + return ( +
+
+
+ {rank} +
+ +
+ + + {name.slice(0, 2)} + +
{name}
+
+ +
+
+
{amount.toLocaleString()}
+
sats
+
+
+ ); +}; + +export default NostrInsights; \ No newline at end of file diff --git a/components/ui/progress.tsx b/components/ui/progress.tsx new file mode 100644 index 0000000..5c87ea4 --- /dev/null +++ b/components/ui/progress.tsx @@ -0,0 +1,28 @@ +"use client" + +import * as React from "react" +import * as ProgressPrimitive from "@radix-ui/react-progress" + +import { cn } from "@/lib/utils" + +const Progress = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, value, ...props }, ref) => ( + + + +)) +Progress.displayName = ProgressPrimitive.Root.displayName + +export { Progress } diff --git a/package-lock.json b/package-lock.json index d5ddbf6..24b1aea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,7 @@ "react-hook-form": "^7.51.4", "react-icons": "^5.1.0", "react-qr-code": "^2.0.15", + "recharts": "^2.15.3", "sharp": "^0.33.5", "tailwind-merge": "^3.0.1", "tailwindcss-animate": "^1.0.7", @@ -4730,6 +4731,69 @@ "@types/node": "*" } }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", @@ -6026,9 +6090,129 @@ }, "node_modules/csstype": { "version": "3.1.3", - "devOptional": true, "license": "MIT" }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "dev": true, @@ -6059,6 +6243,12 @@ } } }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, "node_modules/deep-is": { "version": "0.1.4", "dev": true, @@ -6238,6 +6428,16 @@ "node": ">=6.0.0" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "license": "MIT" @@ -6841,6 +7041,12 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -6855,6 +7061,15 @@ "version": "3.1.3", "license": "MIT" }, + "node_modules/fast-equals": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/fast-glob": { "version": "3.3.2", "license": "MIT", @@ -7444,6 +7659,15 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "license": "MIT", @@ -9236,6 +9460,21 @@ } } }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react-style-singleton": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", @@ -9257,6 +9496,22 @@ } } }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "license": "MIT", @@ -9287,6 +9542,44 @@ "node": ">=8.10.0" } }, + "node_modules/recharts": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.3.tgz", + "integrity": "sha512-EdOPzTwcFSuqtvkDoaM5ws/Km1+WTAO2eizL7rqiG0V2UVhTnz0m7J2i0CjVPUCdEkZImaWvXLbZDS2H5t6GFQ==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/recharts/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, "node_modules/reflect.getprototypeof": { "version": "1.0.4", "dev": true, @@ -10274,6 +10567,12 @@ "node": ">=0.8" } }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -10600,6 +10899,28 @@ "react-dom": "^16.8 || ^17.0 || ^18.0" } }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", diff --git a/package.json b/package.json index c504ffc..e7aa125 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-navigation-menu": "^1.1.4", + "@radix-ui/react-progress": "^1.1.7", "@radix-ui/react-scroll-area": "^1.0.5", "@radix-ui/react-select": "^2.1.6", "@radix-ui/react-separator": "^1.1.4", @@ -45,6 +46,7 @@ "react-hook-form": "^7.51.4", "react-icons": "^5.1.0", "react-qr-code": "^2.0.15", + "recharts": "^2.15.3", "sharp": "^0.33.5", "tailwind-merge": "^3.0.1", "tailwindcss-animate": "^1.0.7",