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 (
+
+ );
+}
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) => (
+
+
+
+ ))}
+
+
+ );
+}
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 (
+
+
+
+ );
+};
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 (
+
+
+
+
+
+
+ {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!
+
+ ) : (
+
+
+
+
+ Contributor |
+ Lilybit Rewards |
+ {currentView === "openSource" && (
+ Contributions |
+ )}
+ Wallet ID |
+
+
+ {renderContributors()}
+
+
+ )}
+
+
+
+
+ );
+}
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