diff --git a/.github/workflows/rewards.yml b/.github/workflows/rewards.yml new file mode 100644 index 0000000..92f77af --- /dev/null +++ b/.github/workflows/rewards.yml @@ -0,0 +1,62 @@ +name: Build and Deploy Next.js to GCP + +on: + push: + branches: + - rewards-dashboard + - main + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Authenticate with Google Cloud + uses: google-github-actions/auth@v1 + with: + credentials_json: ${{ secrets.GCP_SA_KEY }} + + - name: Set up Google Cloud SDK + uses: google-github-actions/setup-gcloud@v1 + with: + project_id: ${{ secrets.GCP_PROJECT_ID }} + + - name: Install bun + uses: oven-sh/setup-bun@v1 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: "22" + + - name: Install pnpm + run: npm install -g pnpm + + - name: Install Doppler CLI + run: | + (curl -Ls --tlsv1.2 --proto "=https" --retry 3 https://cli.doppler.com/install.sh || wget -t 3 -qO- https://cli.doppler.com/install.sh) | sudo sh + + - name: Set up Doppler + run: doppler configure set token ${{ secrets.DEVDEPLOY_DOPPLER_TOKEN }} + + - name: Fetch secrets from Doppler and boot + run: doppler run -- npm run boot + env: + DOPPLER_TOKEN: ${{ secrets.DEVDEPLOY_DOPPLER_TOKEN }} + + - name: Build Next.js app + working-directory: ./apps/rewards-dashboard + run: pnpm run build + + # Step 11: Upload build output to GCS + - name: Upload build output to GCS + run: | + gsutil -m rsync -r -x "^\..*|README.md|gha-creds-.*\.json" ./apps/rewards-dashboard/out gs://${{ secrets.GCS_BUCKET_NAME }} + + # Step 12: Set public read access to files + - name: Set public read access to files + run: | + gsutil iam ch allUsers:objectViewer gs://${{ secrets.GCS_BUCKET_NAME }} diff --git a/README.md b/README.md index daedc39..072c4ce 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,9 @@ Each UI is seperated into it's own pnpm workspace, see details in `## Project st **Apps** - `/apps/info-dashboard`: The Lilypad network metrics UI hosted at https://info.lilypad.tech -- `/apps/website`: The Lilypad marketing site +- `/apps/website`: The Lilypad main site - `/apps/website-cms`: (WIP!) Payload CMS that will potentially power the info-dashboard and website +- `/apps/rewards-dashboard`: Community Rewards and Recognition site hosted at https://oss.lilypad.tech **Packages** diff --git a/apps/rewards-dashboard/.env.example b/apps/rewards-dashboard/.env.example new file mode 100644 index 0000000..8141df0 --- /dev/null +++ b/apps/rewards-dashboard/.env.example @@ -0,0 +1 @@ +DISCORD_TOKEN= \ No newline at end of file diff --git a/apps/rewards-dashboard/.eslintrc.json b/apps/rewards-dashboard/.eslintrc.json new file mode 100644 index 0000000..bffb357 --- /dev/null +++ b/apps/rewards-dashboard/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/apps/rewards-dashboard/.gitignore b/apps/rewards-dashboard/.gitignore new file mode 100644 index 0000000..fd3dbb5 --- /dev/null +++ b/apps/rewards-dashboard/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/apps/rewards-dashboard/README.md b/apps/rewards-dashboard/README.md new file mode 100644 index 0000000..066ff04 --- /dev/null +++ b/apps/rewards-dashboard/README.md @@ -0,0 +1,40 @@ +## Deployment + +The site is set up to automatically deploy to a bucket in GCP via a Github action found within this repository, to the rewards site project. Within the configuration is a cloud storage bucket called oss-contrib which is referenced by a load balancer named oss-contributions which has a GCP issued SSL cert. + +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/apps/rewards-dashboard/app/api/ambassador/route.js b/apps/rewards-dashboard/app/api/ambassador/route.js new file mode 100644 index 0000000..df9438b --- /dev/null +++ b/apps/rewards-dashboard/app/api/ambassador/route.js @@ -0,0 +1,91 @@ +import { promises as fs } from 'fs'; +import path from 'path'; + +const DISCORD_TOKEN = process.env.DISCORD_TOKEN; + +async function fetchDiscordUser(discordUserId) { + const discordAPIBase = 'https://discord.com/api/v10'; + + try { + const response = await fetch(`${discordAPIBase}/users/${discordUserId}`, { + headers: { + Authorization: `Bot ${DISCORD_TOKEN}`, + }, + }); + + if (!response.ok) { + const errorBody = await response.text(); + throw new Error(`Failed to fetch Discord user with ID: ${discordUserId}. Status: ${response.status}. Body: ${errorBody}`); + } + + const data = await response.json(); + return { + username: data?.global_name ?? data?.username, + avatar: data.avatar ? `https://cdn.discordapp.com/avatars/${data.id}/${data.avatar}.png` : null, + }; + } catch (error) { + console.error(`Error fetching Discord user with ID ${discordUserId}:`, error); + return null; + } +} + +async function parseCSVFile(filePath) { + try { + const data = await fs.readFile(filePath, 'utf8'); + const lines = data.trim().split('\n'); + const headers = lines[0].split(','); + return lines.slice(1).map(line => { + const values = line.split(','); + return headers.reduce((obj, header, index) => { + obj[header.trim()] = values[index] ? values[index].trim() : null; + return obj; + }, {}); + }); + } catch (error) { + console.error('Error reading or parsing CSV file:', error); + throw error; + } +} + +export async function GET(req) { + const csvFilePath = path.join(process.cwd(), 'public', 'ambassador_rewards.csv'); + + if (!DISCORD_TOKEN) { + console.error('Bot token not set in environment variables'); + return new Response('Server configuration error: Bot token not set', { status: 500 }); + } + + try { + const ambassadors = await parseCSVFile(csvFilePath); + + const enrichedAmbassadors = await Promise.all( + ambassadors.map(async (ambassador) => { + if (ambassador.id) { + const discordUser = await fetchDiscordUser(ambassador.id); + return { + id: ambassador.id, + username: discordUser?.username ?? 'Unknown', + avatar: discordUser?.avatar ?? null, + wallet_address: ambassador.wallet_address, + rewards: null, + contributions: null + }; + } else { + console.warn(`Ambassador ${ambassador.username} has no ID`); + return null; + } + }) + ); + + return new Response(JSON.stringify(enrichedAmbassadors), { + status: 200, + headers: { 'Content-Type': 'application/json' } + }); + } catch (error) { + console.error('Error processing ambassadors:', error); + return new Response(JSON.stringify({ error: 'Error processing ambassadors', details: error.message }), { + status: 500, + headers: { 'Content-Type': 'application/json' } + }); + } +} diff --git a/apps/rewards-dashboard/app/api/openSource/route.js b/apps/rewards-dashboard/app/api/openSource/route.js new file mode 100644 index 0000000..bf7925f --- /dev/null +++ b/apps/rewards-dashboard/app/api/openSource/route.js @@ -0,0 +1,35 @@ +import { promises as fs } from 'fs'; +import path from 'path'; + +export async function GET() { + try { + const csvFilePath = path.join(process.cwd(), 'public', 'community_rewards.csv'); + const data = await fs.readFile(csvFilePath, 'utf8'); + const lines = data.trim().split('\n'); + const headers = lines[0].split(','); + const contributors = lines.slice(1).map((line) => { + const values = line.split(','); + const contributor = {}; + headers.forEach((header, index) => { + contributor[header.trim()] = values[index] ? values[index].trim() : null; + }); + + // Map to unified structure + return { + username: contributor.username, + avatar: null, // Contributors don't have avatars, use a default if needed + wallet_address: contributor.wallet_address, + rewards: contributor.rewards, + contributions: contributor.contributions, + }; + }); + + return new Response(JSON.stringify(contributors), { + status: 200, + headers: { 'Content-Type': 'application/json' } + }); + } catch (error) { + console.error('Error reading CSV file:', error); + return new Response('Error reading CSV file', { status: 500 }); + } +} diff --git a/apps/rewards-dashboard/app/components/Navbar.js b/apps/rewards-dashboard/app/components/Navbar.js new file mode 100644 index 0000000..379ac4e --- /dev/null +++ b/apps/rewards-dashboard/app/components/Navbar.js @@ -0,0 +1,17 @@ +import { useState } from 'react'; + +export default function Navbar({ setView }) { + return ( +
+ Lilypad Logo + + setView('openSource')}> + Open Source Rewards + + setView('ambassador')}> + Ambassador Rewards + + +
+ ); +} diff --git a/apps/rewards-dashboard/app/components/SocialLinks.js b/apps/rewards-dashboard/app/components/SocialLinks.js new file mode 100644 index 0000000..0a9fdf6 --- /dev/null +++ b/apps/rewards-dashboard/app/components/SocialLinks.js @@ -0,0 +1,45 @@ +const socialLinks = [ + { href: "https://twitter.com/lilypad_tech", iconUrl: "/x.svg" }, + { href: "https://discord.gg/lilypad-network", iconUrl: "/discord.svg" }, + { href: "https://t.me/lilypadnetwork", iconUrl: "/telegram.svg" }, + { href: "https://github.com/Lilypad-Tech", iconUrl: "/github.svg" }, + { href: "https://www.linkedin.com/company/lilypad-network/", iconUrl: "/linkedin.svg" }, + { href: "https://www.youtube.com/@LilypadNetwork/featured", iconUrl: "/youtube.svg" } +]; + +export default function SocialLinks({currentView}) { + return ( +
+
+
+

Get involved!

+ {currentView === "openSource" ? +

Join the Lilypad open source initiative now.

+ : +

Explore the Lilypad ambassador program now.

+ } +
+ + Find out more! + +
+ +
+ {socialLinks.map((link, index) => ( + + social icon + + ))} +
+
+ ); +} diff --git a/apps/rewards-dashboard/app/components/loadingIcon.js b/apps/rewards-dashboard/app/components/loadingIcon.js new file mode 100644 index 0000000..bf34cf7 --- /dev/null +++ b/apps/rewards-dashboard/app/components/loadingIcon.js @@ -0,0 +1,13 @@ +import React from 'react'; + +export const LoadingIcon = () => { + return ( +
+ Loading Icon +
+ ); +}; diff --git a/apps/rewards-dashboard/app/fonts/GeistMonoVF.woff b/apps/rewards-dashboard/app/fonts/GeistMonoVF.woff new file mode 100644 index 0000000..f2ae185 Binary files /dev/null and b/apps/rewards-dashboard/app/fonts/GeistMonoVF.woff differ diff --git a/apps/rewards-dashboard/app/fonts/GeistVF.woff b/apps/rewards-dashboard/app/fonts/GeistVF.woff new file mode 100644 index 0000000..1b62daa Binary files /dev/null and b/apps/rewards-dashboard/app/fonts/GeistVF.woff differ diff --git a/apps/rewards-dashboard/app/globals.css b/apps/rewards-dashboard/app/globals.css new file mode 100644 index 0000000..fba360e --- /dev/null +++ b/apps/rewards-dashboard/app/globals.css @@ -0,0 +1,399 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --bg-color-dark: #000000; + --bg-color-light: #003d32; + --text-color: #e6f1ff; + --accent-color: #b8f4f3; + --card-bg: rgba(0, 61, 50, 0.5); + --hover-color: rgba(0, 61, 50, 0.8); + --border-color: #0c7471; +} + +body, +html { + margin: 0; + padding: 0; + background: #181c21; + color: var(--text-color); + font-family: 'Inter Variable', 'Inter', sans-serif; + line-height: 1.6; + min-height: 100vh; +} + +.container { + margin: 0 auto; + padding: 2rem 2rem .5rem 2rem; +} + +.table { + background: #181c21; + min-height: 60vh; +} + +.rounded-xl { + border-radius: 0.75rem; +} + +.overflow-hidden { + overflow: hidden; +} + +.border-secondary { + border: 1px solid var(--border-color); +} + +.header-container { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.5rem 2rem; + background-color: #181c21; + border-bottom: 1px solid var(--border-color); +} + +.header-content { + display: flex; + flex-direction: column; + justify-content: space-between; + text-align: center; +} + +.header-title { + font-family: 'Plus Jakarta Sans Variable', 'Plus Jakarta Sans', sans-serif; + font-size: 1.25rem; + font-weight: 600; + color: var(--accent-color); + margin: 0; +} + +.header-subtitle { + font-family: 'Inter Variable', 'Inter', sans-serif; + font-size: 0.875rem; + color: var(--text-color); + opacity: 0.8; +} + +.sort-select { + font-family: 'Inter Variable', 'Inter', sans-serif; + background-color: #181c21; + color: var(--text-color); + border: 1px solid #0c7471; + padding: 0.25rem; + font-size: 0.875rem; + border-radius: 0.25rem; + cursor: pointer; +} + +.table-container { + border-top: 1px solid #0c7471; + overflow: auto; + overflow-x: auto; +} + +@media (max-width: 768px) { + .contributors-table th, + .contributors-table td { + padding: 0.5rem; /* Reduce padding */ + font-size: 0.75rem; /* Smaller text size */ + } + + /* Adjust the contributor avatar size */ + .contributor-avatar { + width: 30px; + height: 30px; + } +} + +.cta-link { + margin: 0 auto; +} + +.cta-button { + border: 1px solid var(--border-color); + background-color: var(--accent-color); + border-radius: 0.5rem; + cursor: pointer; + padding: .2rem; + text-align: center; +} + +.card-title { + font-size: 1.125rem; + line-height: 1.75rem; + color: #E0FFF9; + font-weight: 600; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.card-subtitle { + font-size: 0.825rem; + line-height: 1.25rem; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-weight: 400; + color: #b8f4f3; +} + +.contributors-table { + width: 100%; + border-collapse: separate; + border-spacing: 0; + background: #181c21; +} + +.contributors-table th, +.contributors-table td { + padding: 1rem 1.5rem; + font-weight: 300; + text-align: left; + border-bottom: 1px solid var(--border-color); +} + +.contributors-table th { + font-family: 'Plus Jakarta Sans Variable', 'Plus Jakarta Sans', sans-serif; + background-color: #181c21; + font-weight: 400; + font-size: 0.75rem; + color: var(--accent-color); +} + +.contributor-info { + display: flex; + align-items: center; + gap: 1rem; +} + +.contributor-avatar { + width: 40px; + height: 40px; + border-radius: 50%; +} + +.contributor-name { + font-family: 'Plus Jakarta Sans Variable', 'Plus Jakarta Sans', sans-serif; + font-weight: 500; +} + +.github-link { + font-family: 'Inter Variable', 'Inter', sans-serif; + color: var(--accent-color); + text-decoration: none; + font-size: 0.875rem; +} + +.wallet-info { + display: flex; + align-items: center; + gap: 0.5rem; + font-family: 'Inter Variable', 'Inter', sans-serif; + background-color: #181c21; + color: var(--text-color); + border-radius: 0.5rem; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + float: left; +} + +.wallet-address { + font-family: monospace; + background-color: transparent; + -webkit-font-smoothing: antialiased; + border: 1px solid var(--border-color); + padding: 5px; + border-radius: 7px; +} + +.wallet-info { + border-radius: 0.5rem; + background-color: transparent; + font-family: 'Inter Variable', 'Inter', sans-serif; + font-size: 0.875rem; + cursor: pointer; + transition: all 0.2s ease; + display: flex; + align-items: center; + justify-content: center; +} + +.copy-button { + border: 1px solid var(--border-color); + background: none; + color: var(--accent-color); + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + padding: 7px; + border-radius: 7px; +} + +.copy-button:hover { + transform: scale(1.1); +} + +.copy-button.copied { + color: #4CAF50; +} + +.copy-button svg { + transition: all 0.2s ease; +} + +.checkmark-icon { + color: #4CAF50; +} + +/* Focus styles */ +.wallet-info:focus-visible, +.copy-button:focus-visible { + outline: none; + box-shadow: 0 0 0 2px var(--accent-color); +} + +/* Focus styles */ +.wallet-info:focus-visible, +.copy-button:focus-visible { + outline: none; + box-shadow: 0 0 0 2px var(--color-uui-brand-300); +} + +.pagination-controls { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + padding: 1rem; + background-color: #181c21; +} + +.pagination-controls button { + font-family: 'Inter Variable', 'Inter', sans-serif; + background-color: #181c21; + color: white; + border: 1px solid var(--border-color); + padding: 0.5rem 1rem; + border-radius: 0.25rem; + cursor: pointer; + font-weight: 600; +} + +.pagination-controls button:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +#page-info { + font-family: 'Inter Variable', 'Inter', sans-serif; + color: var(--text-color); +} + +.footer { + background-color: #181c21; + color: #E0FFF9; + padding: 10px 20px; + display: flex; + justify-content: space-between; + align-items: center; + border-top: 1px solid #095856; +} + +.social-link { + color: #b8f4f3; + text-decoration: none; +} + +.social-link:hover { + color: #E0FFF9; +} + +.cta { + display: flex; + align-items: center; + gap: 15px; +} + +.cta-text { + text-align: right; +} + +.cta-title { + font-size: 1rem; + font-weight: bold; + margin: 0; +} + +.cta-subtitle { + font-size: 0.8rem; + color: #b8f4f3; + margin: 0; +} + +.cta-button { + background-color: #095856; + color: #E0FFF9; + border: none; + padding: 8px 15px; + border-radius: 5px; + text-decoration: none; + font-size: 0.9rem; +} + +.cta-button:hover { + background-color: #0c7472; +} + +@media (max-width: 768px) { + .footer { + flex-direction: column; + gap: 15px; + padding: 15px; + } + + .cta { + flex-direction: column; + align-items: center; + } + + .cta-text { + text-align: center; + } +} + +.navbar { + display: flex; + align-items: center; + justify-content: space-between; + padding: 5px 0px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +/* Logo */ +.navbar-logo img { + width: 155px; + height: 32px; +} + +/* Nav links (for desktop) */ +.navbar-links { + display: flex; + gap: 20px; +} + +/* Mobile menu button (only visible on small screens) */ +.navbar-mobile { + display: none; +} + +/* Responsive behavior */ +@media (max-width: 768px) { + .navbar-links { + display: none; /* Hide links on mobile */ + } + + .navbar-mobile { + display: block; /* Show menu button on mobile */ + } +} \ No newline at end of file diff --git a/apps/rewards-dashboard/app/layout.js b/apps/rewards-dashboard/app/layout.js new file mode 100644 index 0000000..0bd90d3 --- /dev/null +++ b/apps/rewards-dashboard/app/layout.js @@ -0,0 +1,57 @@ +import localFont from "next/font/local"; +import "./globals.css"; +import Head from "next/head"; + +const geistSans = localFont({ + src: "./fonts/GeistVF.woff", + variable: "--font-geist-sans", + weight: "100 900", +}); +const geistMono = localFont({ + src: "./fonts/GeistMonoVF.woff", + variable: "--font-geist-mono", + weight: "100 900", +}); + +export const metadata = { + title: "Lilypad Community Rewards", + description: "Lilypad Community Rewards", +}; + +export default function RootLayout({ children }) { + return ( + + + + Lilypad Community Rewards + + + + + + + + + + + + + {children} + + + ); +} diff --git a/apps/rewards-dashboard/app/page.js b/apps/rewards-dashboard/app/page.js new file mode 100644 index 0000000..d8f1ded --- /dev/null +++ b/apps/rewards-dashboard/app/page.js @@ -0,0 +1,187 @@ +"use client"; +import { useState, useEffect } from "react"; +import SocialLinks from "./components/SocialLinks"; +import { LoadingIcon } from "./components/loadingIcon"; +import { sortByRewards, sortByContributions } from "./utils/sort"; + +export default function Home() { + const [contributors, setContributors] = useState([]); + const [currentView, setCurrentView] = useState("openSource"); + const [sortOption, setSortOption] = useState(""); + const [loading, setLoading] = useState(true); + + const fetchContributors = async (view) => { + setContributors([]); + setLoading(true); + try { + const res = await fetch(`/api/${view}`); + const data = await res.json(); + + setTimeout(() => { + setContributors(data); + setLoading(false); + }, 250); + } catch (error) { + console.error("Error fetching data:", error); + setLoading(false); + } + }; + + useEffect(() => { + fetchContributors(currentView); + }, [currentView]); + + const handleSortChange = (event) => { + const selectedOption = event.target.value; + setSortOption(selectedOption); + + if (selectedOption === "rewards") { + sortByRewards(contributors, setContributors); + } else if (selectedOption === "contributions") { + sortByContributions(contributors, setContributors); + } + }; + + const renderContributors = () => { + return contributors.map((contributor) => { + const isAmbassador = !contributor?.contributions; + return ( + + +
+ {`Avatar +
+
+ {contributor.username} +
+ {currentView === "openSource" && ( + + GitHub Profile + + )} +
+
+ + {contributor.rewards || "0"} + {currentView === "openSource" && ( + + {contributor.contributions + ?.split(";") + .filter((item) => item).length || "0"} + + )} + {contributor.wallet_address || "N/A"} + + ); + }); + }; + + return ( +
+
+ + +
+ {loading ? ( + + +

Loading entries

+

This might take a moment!

+
+ ) : ( +
+ + + + + + {currentView === "openSource" && ( + + )} + + + + {renderContributors()} +
ContributorLilybit RewardsContributionsWallet ID
+
+ )} +
+
+ +
+ ); +} diff --git a/apps/rewards-dashboard/app/utils/sort.js b/apps/rewards-dashboard/app/utils/sort.js new file mode 100644 index 0000000..c140c92 --- /dev/null +++ b/apps/rewards-dashboard/app/utils/sort.js @@ -0,0 +1,15 @@ +export const sortByRewards = (contributors, setContributors) => { + const sortedContributors = [...contributors].sort((a, b) => { + return parseInt(b.rewards, 10) - parseInt(a.rewards, 10); // Sort numerically by rewards + }); + setContributors(sortedContributors); +}; + +export const sortByContributions = (contributors, setContributors) => { + const sortedContributors = [...contributors].sort((a, b) => { + const aContributions = a.contributions.split(";").filter(Boolean).length; + const bContributions = b.contributions.split(";").filter(Boolean).length; + return bContributions - aContributions; // Sort by the number of contributions + }); + setContributors(sortedContributors); +}; \ No newline at end of file diff --git a/apps/rewards-dashboard/jsconfig.json b/apps/rewards-dashboard/jsconfig.json new file mode 100644 index 0000000..2a2e4b3 --- /dev/null +++ b/apps/rewards-dashboard/jsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./*"] + } + } +} diff --git a/apps/rewards-dashboard/next.config.mjs b/apps/rewards-dashboard/next.config.mjs new file mode 100644 index 0000000..bf221d3 --- /dev/null +++ b/apps/rewards-dashboard/next.config.mjs @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + output: 'export', +}; + +export default nextConfig; diff --git a/apps/rewards-dashboard/package.json b/apps/rewards-dashboard/package.json new file mode 100644 index 0000000..5268f60 --- /dev/null +++ b/apps/rewards-dashboard/package.json @@ -0,0 +1,26 @@ +{ + "name": "rewards-dashboard", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "daisyui": "^4.12.13", + "next": "14.2.14", + "papaparse": "^5.4.1", + "react": "^18", + "react-dom": "^18" + }, + "devDependencies": { + "@types/node": "22.7.5", + "eslint": "^8", + "eslint-config-next": "14.2.14", + "postcss": "^8", + "tailwindcss": "^3.4.1", + "typescript": "5.6.3" + } +} diff --git a/apps/rewards-dashboard/postcss.config.mjs b/apps/rewards-dashboard/postcss.config.mjs new file mode 100644 index 0000000..1a69fd2 --- /dev/null +++ b/apps/rewards-dashboard/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/apps/rewards-dashboard/public/LilypadIcon.svg b/apps/rewards-dashboard/public/LilypadIcon.svg new file mode 100644 index 0000000..b73bf12 --- /dev/null +++ b/apps/rewards-dashboard/public/LilypadIcon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/rewards-dashboard/public/LilypadLogoWord.png b/apps/rewards-dashboard/public/LilypadLogoWord.png new file mode 100644 index 0000000..87dd9dd Binary files /dev/null and b/apps/rewards-dashboard/public/LilypadLogoWord.png differ diff --git a/apps/rewards-dashboard/public/ambassador_rewards.csv b/apps/rewards-dashboard/public/ambassador_rewards.csv new file mode 100644 index 0000000..f37eead --- /dev/null +++ b/apps/rewards-dashboard/public/ambassador_rewards.csv @@ -0,0 +1,5 @@ +id,wallet_address,rewards +744340497207918603, +535162289633099786, +1213833931418378260, +884775127894601739, \ No newline at end of file diff --git a/apps/rewards-dashboard/public/community_rewards.csv b/apps/rewards-dashboard/public/community_rewards.csv new file mode 100644 index 0000000..b93134e --- /dev/null +++ b/apps/rewards-dashboard/public/community_rewards.csv @@ -0,0 +1,4 @@ +username,github,wallet_address,rewards,contributions +Rodebrechtd,https://github.com/Rodebrechtd,,32500,https://github.com/Lilypad-Tech/lilypad/pull/357;https://github.com/Lilypad-Tech/lilypad/pull/334;https://github.com/Lilypad-Tech/lilypad/issues/379;https://github.com/Lilypad-Tech/lilypad/issues/358;https://github.com/Lilypad-Tech/lilypad/issues/352; +rhochmayr,https://github.com/rhochmayr,,12500,https://github.com/Lilypad-Tech/lilypad/pull/260 +sigmundxyz, https://github.com/sigmundxyz,,15000,https://github.com/Lilypad-Tech/lilypad/pull/374 \ No newline at end of file diff --git a/apps/rewards-dashboard/public/discord.svg b/apps/rewards-dashboard/public/discord.svg new file mode 100644 index 0000000..4238cf0 --- /dev/null +++ b/apps/rewards-dashboard/public/discord.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/rewards-dashboard/public/github.svg b/apps/rewards-dashboard/public/github.svg new file mode 100644 index 0000000..e46eb95 --- /dev/null +++ b/apps/rewards-dashboard/public/github.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/rewards-dashboard/public/lilypad-logo copy.svg b/apps/rewards-dashboard/public/lilypad-logo copy.svg new file mode 100644 index 0000000..4f5358f --- /dev/null +++ b/apps/rewards-dashboard/public/lilypad-logo copy.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/apps/rewards-dashboard/public/lilypad-logo.svg b/apps/rewards-dashboard/public/lilypad-logo.svg new file mode 100644 index 0000000..4f5358f --- /dev/null +++ b/apps/rewards-dashboard/public/lilypad-logo.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/apps/rewards-dashboard/public/linkedin.svg b/apps/rewards-dashboard/public/linkedin.svg new file mode 100644 index 0000000..cdf7c43 --- /dev/null +++ b/apps/rewards-dashboard/public/linkedin.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/rewards-dashboard/public/loading-icon.svg b/apps/rewards-dashboard/public/loading-icon.svg new file mode 100644 index 0000000..38faeed --- /dev/null +++ b/apps/rewards-dashboard/public/loading-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/rewards-dashboard/public/next.svg b/apps/rewards-dashboard/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/apps/rewards-dashboard/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/rewards-dashboard/public/telegram.svg b/apps/rewards-dashboard/public/telegram.svg new file mode 100644 index 0000000..d967764 --- /dev/null +++ b/apps/rewards-dashboard/public/telegram.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/rewards-dashboard/public/vercel.svg b/apps/rewards-dashboard/public/vercel.svg new file mode 100644 index 0000000..d2f8422 --- /dev/null +++ b/apps/rewards-dashboard/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/rewards-dashboard/public/x-social-icon.svg b/apps/rewards-dashboard/public/x-social-icon.svg new file mode 100644 index 0000000..25630a0 --- /dev/null +++ b/apps/rewards-dashboard/public/x-social-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/rewards-dashboard/public/x.svg b/apps/rewards-dashboard/public/x.svg new file mode 100644 index 0000000..fa46b44 --- /dev/null +++ b/apps/rewards-dashboard/public/x.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/rewards-dashboard/public/youtube.svg b/apps/rewards-dashboard/public/youtube.svg new file mode 100644 index 0000000..a3d79f8 --- /dev/null +++ b/apps/rewards-dashboard/public/youtube.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/rewards-dashboard/tailwind.config.js b/apps/rewards-dashboard/tailwind.config.js new file mode 100644 index 0000000..e8243e7 --- /dev/null +++ b/apps/rewards-dashboard/tailwind.config.js @@ -0,0 +1,20 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./pages/**/*.{js,ts,jsx,tsx,mdx}", + "./components/**/*.{js,ts,jsx,tsx,mdx}", + "./app/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + colors: { + background: "var(--background)", + foreground: "var(--foreground)", + }, + animation: { + 'spin-slow': 'spin 3s linear infinite', + } + }, + }, + plugins: [require('daisyui')], +}; diff --git a/apps/rewards-dashboard/tsconfig.json b/apps/rewards-dashboard/tsconfig.json new file mode 100644 index 0000000..ccb2ed9 --- /dev/null +++ b/apps/rewards-dashboard/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "noEmit": true, + "incremental": true, + "module": "esnext", + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "plugins": [ + { + "name": "next" + } + ] + }, + "include": [ + "next-env.d.ts", + ".next/types/**/*.ts", + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bda3d3e..e3042e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -114,6 +114,43 @@ importers: specifier: ^1.6.0 version: 1.6.0(@types/node@20.12.12)(jsdom@24.1.0)(terser@5.31.1) + apps/rewards-dashboard: + dependencies: + daisyui: + specifier: ^4.12.13 + version: 4.12.13(postcss@8.4.38) + next: + specifier: 14.2.14 + version: 14.2.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + papaparse: + specifier: ^5.4.1 + version: 5.4.1 + react: + specifier: ^18 + version: 18.3.1 + react-dom: + specifier: ^18 + version: 18.3.1(react@18.3.1) + devDependencies: + '@types/node': + specifier: 22.7.5 + version: 22.7.5 + eslint: + specifier: ^8 + version: 8.57.0 + eslint-config-next: + specifier: 14.2.14 + version: 14.2.14(eslint@8.57.0)(typescript@5.6.3) + postcss: + specifier: ^8 + version: 8.4.38 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.3 + typescript: + specifier: 5.6.3 + version: 5.6.3 + apps/website: dependencies: '@lilypad/shared-components': @@ -205,13 +242,13 @@ importers: version: 5.4.5 vite: specifier: ^5.2.0 - version: 5.2.12(@types/node@20.12.12)(terser@5.31.1) + version: 5.2.12(@types/node@22.7.5)(terser@5.31.1) vite-plugin-dts: specifier: ^3.9.1 - version: 3.9.1(@types/node@20.12.12)(rollup@4.18.0)(typescript@5.4.5)(vite@5.2.12(@types/node@20.12.12)(terser@5.31.1)) + version: 3.9.1(@types/node@22.7.5)(rollup@4.18.0)(typescript@5.4.5)(vite@5.2.12(@types/node@22.7.5)(terser@5.31.1)) vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@20.12.12)(jsdom@24.1.0)(terser@5.31.1) + version: 1.6.0(@types/node@22.7.5)(jsdom@24.1.0)(terser@5.31.1) packages: @@ -647,18 +684,30 @@ packages: '@microsoft/tsdoc@0.14.2': resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + '@next/env@14.2.14': + resolution: {integrity: sha512-/0hWQfiaD5//LvGNgc8PjvyqV50vGK0cADYzaoOOGN8fxzBn3iAiaq3S0tCRnFBldq0LVveLcxCTi41ZoYgAgg==} + '@next/env@14.2.3': resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} '@next/env@14.2.4': resolution: {integrity: sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg==} + '@next/eslint-plugin-next@14.2.14': + resolution: {integrity: sha512-kV+OsZ56xhj0rnTn6HegyTGkoa16Mxjrpk7pjWumyB2P8JVQb8S9qtkjy/ye0GnTr4JWtWG4x/2qN40lKZ3iVQ==} + '@next/eslint-plugin-next@14.2.3': resolution: {integrity: sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==} '@next/eslint-plugin-next@14.2.4': resolution: {integrity: sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA==} + '@next/swc-darwin-arm64@14.2.14': + resolution: {integrity: sha512-bsxbSAUodM1cjYeA4o6y7sp9wslvwjSkWw57t8DtC8Zig8aG8V6r+Yc05/9mDzLKcybb6EN85k1rJDnMKBd9Gw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@next/swc-darwin-arm64@14.2.3': resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} engines: {node: '>= 10'} @@ -671,6 +720,12 @@ packages: cpu: [arm64] os: [darwin] + '@next/swc-darwin-x64@14.2.14': + resolution: {integrity: sha512-cC9/I+0+SK5L1k9J8CInahduTVWGMXhQoXFeNvF0uNs3Bt1Ub0Azb8JzTU9vNCr0hnaMqiWu/Z0S1hfKc3+dww==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@next/swc-darwin-x64@14.2.3': resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} engines: {node: '>= 10'} @@ -683,6 +738,12 @@ packages: cpu: [x64] os: [darwin] + '@next/swc-linux-arm64-gnu@14.2.14': + resolution: {integrity: sha512-RMLOdA2NU4O7w1PQ3Z9ft3PxD6Htl4uB2TJpocm+4jcllHySPkFaUIFacQ3Jekcg6w+LBaFvjSPthZHiPmiAUg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-gnu@14.2.3': resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} engines: {node: '>= 10'} @@ -695,6 +756,12 @@ packages: cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-musl@14.2.14': + resolution: {integrity: sha512-WgLOA4hT9EIP7jhlkPnvz49iSOMdZgDJVvbpb8WWzJv5wBD07M2wdJXLkDYIpZmCFfo/wPqFsFR4JS4V9KkQ2A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-musl@14.2.3': resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} engines: {node: '>= 10'} @@ -707,6 +774,12 @@ packages: cpu: [arm64] os: [linux] + '@next/swc-linux-x64-gnu@14.2.14': + resolution: {integrity: sha512-lbn7svjUps1kmCettV/R9oAvEW+eUI0lo0LJNFOXoQM5NGNxloAyFRNByYeZKL3+1bF5YE0h0irIJfzXBq9Y6w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-linux-x64-gnu@14.2.3': resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} engines: {node: '>= 10'} @@ -719,6 +792,12 @@ packages: cpu: [x64] os: [linux] + '@next/swc-linux-x64-musl@14.2.14': + resolution: {integrity: sha512-7TcQCvLQ/hKfQRgjxMN4TZ2BRB0P7HwrGAYL+p+m3u3XcKTraUFerVbV3jkNZNwDeQDa8zdxkKkw2els/S5onQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-linux-x64-musl@14.2.3': resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} engines: {node: '>= 10'} @@ -731,6 +810,12 @@ packages: cpu: [x64] os: [linux] + '@next/swc-win32-arm64-msvc@14.2.14': + resolution: {integrity: sha512-8i0Ou5XjTLEje0oj0JiI0Xo9L/93ghFtAUYZ24jARSeTMXLUx8yFIdhS55mTExq5Tj4/dC2fJuaT4e3ySvXU1A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@next/swc-win32-arm64-msvc@14.2.3': resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} engines: {node: '>= 10'} @@ -743,6 +828,12 @@ packages: cpu: [arm64] os: [win32] + '@next/swc-win32-ia32-msvc@14.2.14': + resolution: {integrity: sha512-2u2XcSaDEOj+96eXpyjHjtVPLhkAFw2nlaz83EPeuK4obF+HmtDJHqgR1dZB7Gb6V/d55FL26/lYVd0TwMgcOQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + '@next/swc-win32-ia32-msvc@14.2.3': resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} engines: {node: '>= 10'} @@ -755,6 +846,12 @@ packages: cpu: [ia32] os: [win32] + '@next/swc-win32-x64-msvc@14.2.14': + resolution: {integrity: sha512-MZom+OvZ1NZxuRovKt1ApevjiUJTcU2PmdJKL66xUPaJeRywnbGGRWUlaAOwunD6dX+pm83vj979NTC8QXjGWg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@next/swc-win32-x64-msvc@14.2.3': resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} engines: {node: '>= 10'} @@ -1099,6 +1196,9 @@ packages: '@types/node@20.12.12': resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + '@types/pbf@3.0.5': resolution: {integrity: sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==} @@ -1120,6 +1220,17 @@ packages: '@types/ws@8.5.10': resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + '@typescript-eslint/eslint-plugin@8.8.1': + resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/parser@7.2.0': resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1134,10 +1245,27 @@ packages: resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@8.8.1': + resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.8.1': + resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/types@7.2.0': resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/types@8.8.1': + resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@7.2.0': resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1147,10 +1275,29 @@ packages: typescript: optional: true + '@typescript-eslint/typescript-estree@8.8.1': + resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.8.1': + resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + '@typescript-eslint/visitor-keys@7.2.0': resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@8.8.1': + resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -1498,6 +1645,9 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + css-selector-tokenizer@0.8.0: + resolution: {integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -1510,6 +1660,10 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + culori@3.3.0: + resolution: {integrity: sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} engines: {node: '>=12'} @@ -1637,6 +1791,10 @@ packages: resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} engines: {node: '>=12'} + daisyui@4.12.13: + resolution: {integrity: sha512-BnXyQoOByUF/7wSdIKubyhXxbtL8gxwY3u2cNMkxGP39TSVJqMmlItqtpY903fQnLI/NokC+bc+ZV+PEPsppPw==} + engines: {node: '>=16.9.0'} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -1815,6 +1973,15 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + eslint-config-next@14.2.14: + resolution: {integrity: sha512-TXwyjGICAlWC9O0OufS3koTsBKQH8l1xt3SY/aDuvtKHIwjTHplJKWVb1WOEX0OsDaxGbFXmfD2EY1sNfG0Y/w==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + eslint-config-next@14.2.3: resolution: {integrity: sha512-ZkNztm3Q7hjqvB1rRlOX8P9E/cXRL9ajRcs8jufEtwMfTVYRqnmtnaSu57QqHyBlovMuiB8LEzfLBkh5RYV6Fg==} peerDependencies: @@ -1963,6 +2130,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fastparse@1.1.2: + resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -2595,6 +2765,24 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + next@14.2.14: + resolution: {integrity: sha512-Q1coZG17MW0Ly5x76shJ4dkC23woLAhhnDnw+DfTc7EpZSGuWrlsZ3bZaO8t6u1Yu8FVfhkqJE+U8GC7E0GLPQ==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + next@14.2.3: resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} engines: {node: '>=18.17.0'} @@ -2711,6 +2899,9 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + papaparse@5.4.1: + resolution: {integrity: sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3316,6 +3507,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + typewise-core@1.2.0: resolution: {integrity: sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==} @@ -3331,6 +3527,9 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} @@ -3992,23 +4191,23 @@ snapshots: sort-object: 3.0.3 tinyqueue: 2.0.3 - '@microsoft/api-extractor-model@7.28.13(@types/node@20.12.12)': + '@microsoft/api-extractor-model@7.28.13(@types/node@22.7.5)': dependencies: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.12.12) + '@rushstack/node-core-library': 4.0.2(@types/node@22.7.5) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.43.0(@types/node@20.12.12)': + '@microsoft/api-extractor@7.43.0(@types/node@22.7.5)': dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@20.12.12) + '@microsoft/api-extractor-model': 7.28.13(@types/node@22.7.5) '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.12.12) + '@rushstack/node-core-library': 4.0.2(@types/node@22.7.5) '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@20.12.12) - '@rushstack/ts-command-line': 4.19.1(@types/node@20.12.12) + '@rushstack/terminal': 0.10.0(@types/node@22.7.5) + '@rushstack/ts-command-line': 4.19.1(@types/node@22.7.5) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -4027,10 +4226,16 @@ snapshots: '@microsoft/tsdoc@0.14.2': {} + '@next/env@14.2.14': {} + '@next/env@14.2.3': {} '@next/env@14.2.4': {} + '@next/eslint-plugin-next@14.2.14': + dependencies: + glob: 10.3.10 + '@next/eslint-plugin-next@14.2.3': dependencies: glob: 10.3.10 @@ -4039,54 +4244,81 @@ snapshots: dependencies: glob: 10.3.10 + '@next/swc-darwin-arm64@14.2.14': + optional: true + '@next/swc-darwin-arm64@14.2.3': optional: true '@next/swc-darwin-arm64@14.2.4': optional: true + '@next/swc-darwin-x64@14.2.14': + optional: true + '@next/swc-darwin-x64@14.2.3': optional: true '@next/swc-darwin-x64@14.2.4': optional: true + '@next/swc-linux-arm64-gnu@14.2.14': + optional: true + '@next/swc-linux-arm64-gnu@14.2.3': optional: true '@next/swc-linux-arm64-gnu@14.2.4': optional: true + '@next/swc-linux-arm64-musl@14.2.14': + optional: true + '@next/swc-linux-arm64-musl@14.2.3': optional: true '@next/swc-linux-arm64-musl@14.2.4': optional: true + '@next/swc-linux-x64-gnu@14.2.14': + optional: true + '@next/swc-linux-x64-gnu@14.2.3': optional: true '@next/swc-linux-x64-gnu@14.2.4': optional: true + '@next/swc-linux-x64-musl@14.2.14': + optional: true + '@next/swc-linux-x64-musl@14.2.3': optional: true '@next/swc-linux-x64-musl@14.2.4': optional: true + '@next/swc-win32-arm64-msvc@14.2.14': + optional: true + '@next/swc-win32-arm64-msvc@14.2.3': optional: true '@next/swc-win32-arm64-msvc@14.2.4': optional: true + '@next/swc-win32-ia32-msvc@14.2.14': + optional: true + '@next/swc-win32-ia32-msvc@14.2.3': optional: true '@next/swc-win32-ia32-msvc@14.2.4': optional: true + '@next/swc-win32-x64-msvc@14.2.14': + optional: true + '@next/swc-win32-x64-msvc@14.2.3': optional: true @@ -4172,7 +4404,7 @@ snapshots: '@rushstack/eslint-patch@1.10.3': {} - '@rushstack/node-core-library@4.0.2(@types/node@20.12.12)': + '@rushstack/node-core-library@4.0.2(@types/node@22.7.5)': dependencies: fs-extra: 7.0.1 import-lazy: 4.0.0 @@ -4181,23 +4413,23 @@ snapshots: semver: 7.5.4 z-schema: 5.0.5 optionalDependencies: - '@types/node': 20.12.12 + '@types/node': 22.7.5 '@rushstack/rig-package@0.5.2': dependencies: resolve: 1.22.8 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.10.0(@types/node@20.12.12)': + '@rushstack/terminal@0.10.0(@types/node@22.7.5)': dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@20.12.12) + '@rushstack/node-core-library': 4.0.2(@types/node@22.7.5) supports-color: 8.1.1 optionalDependencies: - '@types/node': 20.12.12 + '@types/node': 22.7.5 - '@rushstack/ts-command-line@4.19.1(@types/node@20.12.12)': + '@rushstack/ts-command-line@4.19.1(@types/node@22.7.5)': dependencies: - '@rushstack/terminal': 0.10.0(@types/node@20.12.12) + '@rushstack/terminal': 0.10.0(@types/node@22.7.5) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -4436,6 +4668,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@22.7.5': + dependencies: + undici-types: 6.19.8 + '@types/pbf@3.0.5': {} '@types/prop-types@15.7.12': {} @@ -4461,6 +4697,24 @@ snapshots: dependencies: '@types/node': 20.12.12 + '@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.8.1 + '@typescript-eslint/type-utils': 8.8.1(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.8.1(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.8.1 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/scope-manager': 7.2.0 @@ -4474,13 +4728,45 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.2.0 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.3.4 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@7.2.0': dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 + '@typescript-eslint/scope-manager@8.8.1': + dependencies: + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/visitor-keys': 8.8.1 + + '@typescript-eslint/type-utils@8.8.1(eslint@8.57.0)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) + '@typescript-eslint/utils': 8.8.1(eslint@8.57.0)(typescript@5.6.3) + debug: 4.3.4 + ts-api-utils: 1.3.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - eslint + - supports-color + '@typescript-eslint/types@7.2.0': {} + '@typescript-eslint/types@8.8.1': {} + '@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.5)': dependencies: '@typescript-eslint/types': 7.2.0 @@ -4496,11 +4782,57 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@7.2.0(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.8.1(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/visitor-keys': 8.8.1 + debug: 4.3.4 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.8.1(eslint@8.57.0)(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@typescript-eslint/scope-manager': 8.8.1 + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/visitor-keys@7.2.0': dependencies: '@typescript-eslint/types': 7.2.0 eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.8.1': + dependencies: + '@typescript-eslint/types': 8.8.1 + eslint-visitor-keys: 3.4.3 + '@ungap/structured-clone@1.2.0': {} '@vitejs/plugin-react@4.3.1(vite@5.2.12(@types/node@20.12.12)(terser@5.31.1))': @@ -4907,6 +5239,11 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-selector-tokenizer@0.8.0: + dependencies: + cssesc: 3.0.0 + fastparse: 1.1.2 + cssesc@3.0.0: {} cssstyle@4.0.1: @@ -4915,6 +5252,8 @@ snapshots: csstype@3.1.3: {} + culori@3.3.0: {} + d3-array@3.2.4: dependencies: internmap: 2.0.3 @@ -5067,6 +5406,15 @@ snapshots: d3-transition: 3.0.1(d3-selection@3.0.0) d3-zoom: 3.0.0 + daisyui@4.12.13(postcss@8.4.38): + dependencies: + css-selector-tokenizer: 0.8.0 + culori: 3.3.0 + picocolors: 1.0.1 + postcss-js: 4.0.1(postcss@8.4.38) + transitivePeerDependencies: + - postcss + damerau-levenshtein@1.0.8: {} data-urls@5.0.0: @@ -5300,6 +5648,25 @@ snapshots: escape-string-regexp@4.0.0: {} + eslint-config-next@14.2.14(eslint@8.57.0)(typescript@5.6.3): + dependencies: + '@next/eslint-plugin-next': 14.2.14 + '@rushstack/eslint-patch': 1.10.3 + '@typescript-eslint/eslint-plugin': 8.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.3) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) + eslint-plugin-react: 7.34.2(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + eslint-config-next@14.2.3(eslint@8.57.0)(typescript@5.4.5): dependencies: '@next/eslint-plugin-next': 14.2.3 @@ -5361,6 +5728,23 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.16.1 + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.5 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 @@ -5372,6 +5756,17 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.3) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: array-includes: 3.1.8 @@ -5399,6 +5794,33 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): dependencies: '@babel/runtime': 7.24.6 @@ -5558,6 +5980,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fastparse@1.1.2: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -6182,6 +6606,31 @@ snapshots: natural-compare@1.4.0: {} + next@14.2.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 14.2.14 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001634 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.7)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.14 + '@next/swc-darwin-x64': 14.2.14 + '@next/swc-linux-arm64-gnu': 14.2.14 + '@next/swc-linux-arm64-musl': 14.2.14 + '@next/swc-linux-x64-gnu': 14.2.14 + '@next/swc-linux-x64-musl': 14.2.14 + '@next/swc-win32-arm64-msvc': 14.2.14 + '@next/swc-win32-ia32-msvc': 14.2.14 + '@next/swc-win32-x64-msvc': 14.2.14 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + next@14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.3 @@ -6319,6 +6768,8 @@ snapshots: dependencies: p-limit: 3.1.0 + papaparse@5.4.1: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -6911,6 +7362,10 @@ snapshots: dependencies: typescript: 5.4.5 + ts-api-utils@1.3.0(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + ts-interface-checker@0.1.13: {} tsconfig-paths@3.15.0: @@ -6966,6 +7421,8 @@ snapshots: typescript@5.4.5: {} + typescript@5.6.3: {} + typewise-core@1.2.0: {} typewise@1.0.3: @@ -6983,6 +7440,8 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.19.8: {} + union-value@1.0.1: dependencies: arr-union: 3.1.0 @@ -7064,9 +7523,26 @@ snapshots: - supports-color - terser - vite-plugin-dts@3.9.1(@types/node@20.12.12)(rollup@4.18.0)(typescript@5.4.5)(vite@5.2.12(@types/node@20.12.12)(terser@5.31.1)): + vite-node@1.6.0(@types/node@22.7.5)(terser@5.31.1): + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.1 + vite: 5.2.12(@types/node@22.7.5)(terser@5.31.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite-plugin-dts@3.9.1(@types/node@22.7.5)(rollup@4.18.0)(typescript@5.4.5)(vite@5.2.12(@types/node@22.7.5)(terser@5.31.1)): dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@20.12.12) + '@microsoft/api-extractor': 7.43.0(@types/node@22.7.5) '@rollup/pluginutils': 5.1.0(rollup@4.18.0) '@vue/language-core': 1.8.27(typescript@5.4.5) debug: 4.3.4 @@ -7075,7 +7551,7 @@ snapshots: typescript: 5.4.5 vue-tsc: 1.8.27(typescript@5.4.5) optionalDependencies: - vite: 5.2.12(@types/node@20.12.12)(terser@5.31.1) + vite: 5.2.12(@types/node@22.7.5)(terser@5.31.1) transitivePeerDependencies: - '@types/node' - rollup @@ -7091,6 +7567,16 @@ snapshots: fsevents: 2.3.3 terser: 5.31.1 + vite@5.2.12(@types/node@22.7.5)(terser@5.31.1): + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.18.0 + optionalDependencies: + '@types/node': 22.7.5 + fsevents: 2.3.3 + terser: 5.31.1 + vitest@1.6.0(@types/node@20.12.12)(jsdom@24.1.0)(terser@5.31.1): dependencies: '@vitest/expect': 1.6.0 @@ -7125,6 +7611,40 @@ snapshots: - supports-color - terser + vitest@1.6.0(@types/node@22.7.5)(jsdom@24.1.0)(terser@5.31.1): + dependencies: + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.10 + pathe: 1.1.2 + picocolors: 1.0.1 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.8.0 + tinypool: 0.8.4 + vite: 5.2.12(@types/node@22.7.5)(terser@5.31.1) + vite-node: 1.6.0(@types/node@22.7.5)(terser@5.31.1) + why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 22.7.5 + jsdom: 24.1.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + vt-pbf@3.1.3: dependencies: '@mapbox/point-geometry': 0.1.0