From de678691805dad7a087621e011d14cf4a71fc9b4 Mon Sep 17 00:00:00 2001 From: Abhash Chakraborty Date: Fri, 15 May 2026 12:49:30 +0530 Subject: [PATCH 1/5] chore: remove legacy firebase auth files --- src/components/ui/FirebaseAuthGithub.tsx | 115 ------------------ .../ui/NavbarFirebaseAuthGithub.tsx | 15 --- src/lib/firebase.ts | 19 --- 3 files changed, 149 deletions(-) delete mode 100644 src/components/ui/FirebaseAuthGithub.tsx delete mode 100644 src/components/ui/NavbarFirebaseAuthGithub.tsx delete mode 100644 src/lib/firebase.ts diff --git a/src/components/ui/FirebaseAuthGithub.tsx b/src/components/ui/FirebaseAuthGithub.tsx deleted file mode 100644 index 436c2c0d..00000000 --- a/src/components/ui/FirebaseAuthGithub.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { auth } from "../../lib/firebase"; -import { GithubAuthProvider, signInWithPopup, User } from "firebase/auth"; - -const uiConfig = { - signInFlow: "popup", - signInOptions: [ - { - provider: GithubAuthProvider.PROVIDER_ID, - // You can add scopes and custom parameters here if needed - }, - ], - callbacks: { - signInSuccessWithAuthResult: () => false, // Prevents redirect - }, -}; - -const FirebaseAuthGithub: React.FC = () => { - const [user, setUser] = useState(null); - const [githubText, setGithubText] = useState("Sign in with GitHub"); // ✅ new state - - useEffect(() => { - const unregisterAuthObserver = auth.onAuthStateChanged((user) => - setUser(user as User), - ); - - // ✅ new effect to change text on resize - const handleResize = () => { - if (window.innerWidth <= 1110) { - setGithubText("Sign in"); - } else { - setGithubText("Sign in with GitHub"); - } - }; - - handleResize(); // initial call - window.addEventListener("resize", handleResize); - - return () => { - unregisterAuthObserver(); - window.removeEventListener("resize", handleResize); - }; - }, []); - - if (user) { - return ( -
- avatar -
- -
- ); - } - - const handleGithubSignIn = async () => { - const provider = new GithubAuthProvider(); - try { - await signInWithPopup(auth, provider); - } catch (error) { - console.error("GitHub sign-in error:", error); - } - }; - - return ( -
- -
- ); -}; - -export default FirebaseAuthGithub; diff --git a/src/components/ui/NavbarFirebaseAuthGithub.tsx b/src/components/ui/NavbarFirebaseAuthGithub.tsx deleted file mode 100644 index 831912ee..00000000 --- a/src/components/ui/NavbarFirebaseAuthGithub.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { createPortal } from "react-dom"; -import FirebaseAuthGithub from "./FirebaseAuthGithub"; - -const NavbarFirebaseAuthGithub: React.FC = () => { - const [container, setContainer] = useState(null); - - useEffect(() => { - setContainer(document.getElementById("firebase-auth-github-navbar")); - }, []); - - return container ? createPortal(, container) : null; -}; - -export default NavbarFirebaseAuthGithub; diff --git a/src/lib/firebase.ts b/src/lib/firebase.ts deleted file mode 100644 index 5a67fb4f..00000000 --- a/src/lib/firebase.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { initializeApp, getApps, getApp } from "firebase/app"; -import { getAuth } from "firebase/auth"; -import { getAnalytics } from "firebase/analytics"; - -const firebaseConfig = { - apiKey: "AIzaSyBSiO9d5tHuyyAeUCt37pxDWTT7jPSigaU", - authDomain: "awesome-github-profiles.firebaseapp.com", - databaseURL: "https://awesome-github-profiles-default-rtdb.firebaseio.com", - projectId: "awesome-github-profiles", - storageBucket: "awesome-github-profiles.firebasestorage.app", - messagingSenderId: "490821849262", - appId: "1:490821849262:web:7e97984d98f578b81f9d3f", - measurementId: "G-WM33JZYEV0", -}; - -const app = getApps().length ? getApp() : initializeApp(firebaseConfig); -const auth = getAuth(app); - -export { app, auth }; From 1021c1dc0b92243d1329b61387ac0fd024a33cd4 Mon Sep 17 00:00:00 2001 From: Abhash Chakraborty Date: Fri, 15 May 2026 12:49:48 +0530 Subject: [PATCH 2/5] feat: replace firebase login with clerk auth --- .env.example | 9 +- docusaurus.config.ts | 14 +- package-lock.json | 1210 ++----------------------- package.json | 7 +- src/components/ui/NavbarClerkAuth.tsx | 38 + src/css/custom.css | 33 +- src/pages/dashboard/dashboard.css | 59 +- src/pages/dashboard/index.tsx | 35 +- src/theme/Layout.tsx | 4 +- src/theme/Root.tsx | 93 +- 10 files changed, 353 insertions(+), 1149 deletions(-) create mode 100644 src/components/ui/NavbarClerkAuth.tsx diff --git a/.env.example b/.env.example index e5bad031..041f8be8 100644 --- a/.env.example +++ b/.env.example @@ -23,10 +23,11 @@ ALGOLIA_INDEX_NAME=your_algolia_index_name SHOPIFY_STORE_DOMAIN=your-store.myshopify.com SHOPIFY_STOREFRONT_ACCESS_TOKEN=your_storefront_access_token_here -# Firebase Configuration (if needed) -# FIREBASE_API_KEY=your_firebase_api_key -# FIREBASE_AUTH_DOMAIN=your_firebase_auth_domain -# FIREBASE_PROJECT_ID=your_firebase_project_id +# Clerk Authentication Configuration +# Browser-safe publishable key used by the frontend +VITE_CLERK_PUBLISHABLE_KEY=your_clerk_publishable_key_here +# Server-side secret key used by Clerk tooling only. Do not expose this in browser code. +CLERK_SECRET_KEY=your_clerk_secret_key_here # EmailJS Configuration (for Contact Us page) # Sign up at https://www.emailjs.com and create a service + template diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 0a8ce5a0..f0e92856 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -3,6 +3,7 @@ import type { Config } from "@docusaurus/types"; import type * as Preset from "@docusaurus/preset-classic"; import * as dotenv from "dotenv"; import giscusInjector from "./src/plugins/giscus-injector"; +dotenv.config({ path: ".env.local" }); dotenv.config(); // This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) @@ -38,7 +39,7 @@ const config: Config = { onBrokenLinks: "throw", // onBrokenMarkdownLinks moved to markdown.hooks - + // Google Analytics and Theme Scripts scripts: [ { @@ -247,7 +248,7 @@ const config: Config = { { type: "html", position: "right", - value: '
', + value: '
', }, ], }, @@ -286,6 +287,7 @@ const config: Config = { // ✅ Add this customFields object to expose the token to the client-side customFields: { gitToken: process.env.DOCUSAURUS_GIT_TOKEN, + clerkPublishableKey: process.env.VITE_CLERK_PUBLISHABLE_KEY || "", // Shopify credentials for merch store SHOPIFY_STORE_DOMAIN: process.env.SHOPIFY_STORE_DOMAIN || "junh9v-gw.myshopify.com", @@ -298,10 +300,10 @@ const config: Config = { EMAILJS_TEMPLATE_ID: process.env.EMAILJS_TEMPLATE_ID || "", algoliaSiteSearch: hasAlgoliaSiteSearch ? { - applicationId: algoliaAppId, - apiKey: algoliaSearchApiKey, - indexName: algoliaIndexName, - } + applicationId: algoliaAppId, + apiKey: algoliaSearchApiKey, + indexName: algoliaIndexName, + } : null, hooks: { onBrokenMarkdownLinks: "warn", diff --git a/package-lock.json b/package-lock.json index 0365e371..1473b727 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "recodehive", "version": "0.0.0", "dependencies": { + "@clerk/react": "^6.6.3", "@docusaurus/core": "^3.9.1", "@docusaurus/plugin-content-docs": "3.10.1", "@docusaurus/plugin-google-analytics": "^3.10.0", @@ -35,8 +36,6 @@ "dotenv": "^17.4.2", "embla-carousel-autoplay": "^8.6.0", "embla-carousel-react": "^8.6.0", - "firebase": "^9.22.2", - "firebaseui": "6.1.0", "framer-motion": "^12.38.0", "lucide-react": "^0.503.0", "prism-react-renderer": "^2.3.0", @@ -74,7 +73,7 @@ "typescript": "~5.3" }, "engines": { - "node": ">=18.0" + "node": ">=20.9.0" } }, "node_modules/@algolia/abtesting": { @@ -2090,6 +2089,52 @@ "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", "license": "Apache-2.0" }, + "node_modules/@clerk/react": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@clerk/react/-/react-6.6.3.tgz", + "integrity": "sha512-u4dU7rRjOx5/IcZAjIvPHLPDhaut9Oa9wTOvIJLJ54z1kNR5m+Qnmap++dD9mH8orIPUmW7VlJrF5wVVc2FHdA==", + "license": "MIT", + "dependencies": { + "@clerk/shared": "^4.11.0", + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0", + "react-dom": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0" + } + }, + "node_modules/@clerk/shared": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@clerk/shared/-/shared-4.11.0.tgz", + "integrity": "sha512-QnduIRldVe+16w+pU24si0TZjbToGCIJI8Hsd0jGNMaloLsjQGA6XLO455JGIN8FFzQYCPS0x+bugjlvM8PGYQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "^5.100.6", + "dequal": "2.0.3", + "glob-to-regexp": "0.4.1", + "js-cookie": "3.0.5", + "std-env": "^3.9.0" + }, + "engines": { + "node": ">=20.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0", + "react-dom": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -6488,538 +6533,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@firebase/analytics": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", - "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/analytics-compat": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", - "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-types": "0.8.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/analytics-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", - "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/app": { - "version": "0.9.13", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.13.tgz", - "integrity": "sha512-GfiI1JxJ7ecluEmDjPzseRXk/PX31hS7+tjgBopL7XjB2hLUdR+0FTMXy2Q3/hXezypDvU6or7gVFizDESrkXw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "idb": "7.1.1", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/app-check": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.0.tgz", - "integrity": "sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/app-check-compat": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.7.tgz", - "integrity": "sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check": "0.8.0", - "@firebase/app-check-types": "0.5.0", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", - "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/app-check-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", - "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/app-compat": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.13.tgz", - "integrity": "sha512-j6ANZaWjeVy5zg6X7uiqh6lM6o3n3LD1+/SJFNs9V781xyryyZWXe+tmnWNWPkP086QfJoNkWN9pMQRqSG4vMg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app": "0.9.13", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/app-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", - "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/auth": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.23.2.tgz", - "integrity": "sha512-dM9iJ0R6tI1JczuGSxXmQbXAgtYie0K4WvKcuyuSTCu9V8eEDiz4tfa1sO3txsfvwg7nOY3AjoCyMYEdqZ8hdg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/auth-compat": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.4.2.tgz", - "integrity": "sha512-Q30e77DWXFmXEt5dg5JbqEDpjw9y3/PcP9LslDPR7fARmAOTIY9MM6HXzm9KC+dlrKH/+p6l8g9ifJiam9mc4A==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/auth": "0.23.2", - "@firebase/auth-types": "0.12.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", - "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/auth-types": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", - "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/component": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", - "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.14.4.tgz", - "integrity": "sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.3.4.tgz", - "integrity": "sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/database": "0.14.4", - "@firebase/database-types": "0.10.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-types": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.10.4.tgz", - "integrity": "sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-types": "0.9.0", - "@firebase/util": "1.9.3" - } - }, - "node_modules/@firebase/firestore": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.13.0.tgz", - "integrity": "sha512-NwcnU+madJXQ4fbLkGx1bWvL612IJN/qO6bZ6dlPmyf7QRyu5azUosijdAN675r+bOOJxMtP1Bv981bHBXAbUg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "@firebase/webchannel-wrapper": "0.10.1", - "@grpc/grpc-js": "~1.7.0", - "@grpc/proto-loader": "^0.6.13", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=10.10.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/firestore-compat": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.12.tgz", - "integrity": "sha512-mazuNGAx5Kt9Nph0pm6ULJFp/+j7GSsx+Ncw1GrnKl+ft1CQ4q2LcUssXnjqkX2Ry0fNGqUzC1mfIUrk9bYtjQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/firestore": "3.13.0", - "@firebase/firestore-types": "2.5.1", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/firestore-types": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.1.tgz", - "integrity": "sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/functions": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.10.0.tgz", - "integrity": "sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.0", - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/functions-compat": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.5.tgz", - "integrity": "sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/functions": "0.10.0", - "@firebase/functions-types": "0.6.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/functions-types": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", - "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/installations": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", - "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "idb": "7.0.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/installations-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", - "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/installations-types": "0.5.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/installations-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", - "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/installations/node_modules/idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==", - "license": "ISC" - }, - "node_modules/@firebase/logger": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", - "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/messaging": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.4.tgz", - "integrity": "sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", - "idb": "7.0.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/messaging-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz", - "integrity": "sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/messaging": "0.12.4", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/messaging-interop-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", - "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/messaging/node_modules/idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==", - "license": "ISC" - }, - "node_modules/@firebase/performance": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", - "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/performance-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", - "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/performance": "0.6.4", - "@firebase/performance-types": "0.2.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/performance-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", - "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/remote-config": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", - "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/remote-config-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", - "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-types": "0.3.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/remote-config-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", - "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/storage": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.11.2.tgz", - "integrity": "sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/storage-compat": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.2.tgz", - "integrity": "sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/storage": "0.11.2", - "@firebase/storage-types": "0.8.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/storage-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", - "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/util": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", - "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/webchannel-wrapper": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.1.tgz", - "integrity": "sha512-Dq5rYfEpdeel0bLVN+nfD1VWmzCkK+pJbSjIawGE+RY4+NIJqhbUDDQjvV0NUK84fMfwxvtFoCtEe70HfZjFcw==", - "license": "Apache-2.0" - }, "node_modules/@floating-ui/core": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", @@ -7049,207 +6562,40 @@ "@floating-ui/utils": "^0.2.10", "tabbable": "^6.0.0" }, - "peerDependencies": { - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", - "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.7.4" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", - "license": "MIT" - }, - "node_modules/@giscus/react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@giscus/react/-/react-3.1.0.tgz", - "integrity": "sha512-0TCO2TvL43+oOdyVVGHDItwxD1UMKP2ZYpT6gXmhFOqfAJtZxTzJ9hkn34iAF/b6YzyJ4Um89QIt9z/ajmAEeg==", - "dependencies": { - "giscus": "^1.6.0" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18 || ^19", - "react-dom": "^16 || ^17 || ^18 || ^19" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.3.tgz", - "integrity": "sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog==", - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", - "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@grpc/grpc-js/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@grpc/grpc-js/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/@grpc/grpc-js/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@grpc/grpc-js/node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, - "node_modules/@grpc/grpc-js/node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@grpc/grpc-js/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@grpc/grpc-js/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependencies": { + "react": ">=17.0.0", + "react-dom": ">=17.0.0" } }, - "node_modules/@grpc/grpc-js/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/@floating-ui/react-dom": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "@floating-ui/dom": "^1.7.4" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@grpc/grpc-js/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" }, - "node_modules/@grpc/proto-loader": { - "version": "0.6.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz", - "integrity": "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==", - "license": "Apache-2.0", + "node_modules/@giscus/react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@giscus/react/-/react-3.1.0.tgz", + "integrity": "sha512-0TCO2TvL43+oOdyVVGHDItwxD1UMKP2ZYpT6gXmhFOqfAJtZxTzJ9hkn34iAF/b6YzyJ4Um89QIt9z/ajmAEeg==", "dependencies": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^6.11.3", - "yargs": "^16.2.0" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + "giscus": "^1.6.0" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "react": "^16 || ^17 || ^18 || ^19", + "react-dom": "^16 || ^17 || ^18 || ^19" } }, "node_modules/@hapi/hoek": { @@ -7749,70 +7095,6 @@ "url": "https://opencollective.com/popperjs" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, "node_modules/@radix-ui/primitive": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", @@ -8740,6 +8022,16 @@ "tailwindcss": "4.3.0" } }, + "node_modules/@tanstack/query-core": { + "version": "5.100.10", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.100.10.tgz", + "integrity": "sha512-8UR0yJR+GiQ40m3lPhUr0xbfAupe6GSQiksSBSa9SM2NjezFyxXCIA69/lz8cSoNKZLrw1/PktIyQBJcVeMi3w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -9669,12 +8961,6 @@ "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", "license": "MIT" }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "license": "MIT" - }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -9751,7 +9037,7 @@ "version": "19.2.1", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.1.tgz", "integrity": "sha512-/EEvYBdT3BflCWvTMO7YkYBHVE9Ci6XdqZciZANQgKpaiDRGOLIlRo91jbTNRQjgPFWVaRxcYc0luVNFitz57A==", - "devOptional": true, + "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" @@ -11865,63 +11151,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -13680,12 +12909,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/dialog-polyfill": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/dialog-polyfill/-/dialog-polyfill-0.4.10.tgz", - "integrity": "sha512-j5yGMkP8T00UFgyO+78OxiN5vC5dzRQF3BEio+LhNvDbyfxWBsi3sfPArDm54VloaJwy2hm3erEiDWqHRC8rzw==", - "license": "BSD" - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -15202,53 +14425,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/firebase": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.23.0.tgz", - "integrity": "sha512-/4lUVY0lUvBDIaeY1q6dUYhS8Sd18Qb9CgWkPZICUo9IXpJNCEagfNZXBBFCkMTTN5L5gx2Hjr27y21a9NzUcA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-compat": "0.2.6", - "@firebase/app": "0.9.13", - "@firebase/app-check": "0.8.0", - "@firebase/app-check-compat": "0.3.7", - "@firebase/app-compat": "0.2.13", - "@firebase/app-types": "0.9.0", - "@firebase/auth": "0.23.2", - "@firebase/auth-compat": "0.4.2", - "@firebase/database": "0.14.4", - "@firebase/database-compat": "0.3.4", - "@firebase/firestore": "3.13.0", - "@firebase/firestore-compat": "0.3.12", - "@firebase/functions": "0.10.0", - "@firebase/functions-compat": "0.3.5", - "@firebase/installations": "0.6.4", - "@firebase/installations-compat": "0.2.4", - "@firebase/messaging": "0.12.4", - "@firebase/messaging-compat": "0.2.4", - "@firebase/performance": "0.6.4", - "@firebase/performance-compat": "0.2.4", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-compat": "0.2.4", - "@firebase/storage": "0.11.2", - "@firebase/storage-compat": "0.3.2", - "@firebase/util": "1.9.3" - } - }, - "node_modules/firebaseui": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/firebaseui/-/firebaseui-6.1.0.tgz", - "integrity": "sha512-5WiVYVxPGMANuZKxg6KLyU1tyqIsbqf/59Zm4HrdFYwPtM5lxxB0THvgaIk4ix+hCgF0qmY89sKiktcifKzGIA==", - "license": "Apache-2.0", - "dependencies": { - "dialog-polyfill": "^0.4.7", - "material-design-lite": "^1.2.0" - }, - "peerDependencies": { - "firebase": "^9.1.3 || ^10.0.0" - } - }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -15483,15 +14659,6 @@ "node": ">=6.9.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/get-east-asian-width": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", @@ -16567,12 +15734,6 @@ "postcss": "^8.1.0" } }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "license": "ISC" - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -17503,6 +16664,15 @@ "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -18263,12 +17433,6 @@ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "license": "MIT" }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" - }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -18432,12 +17596,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "license": "Apache-2.0" - }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -18543,15 +17701,6 @@ "node": ">= 20" } }, - "node_modules/material-design-lite": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/material-design-lite/-/material-design-lite-1.3.0.tgz", - "integrity": "sha512-ao76b0bqSTKcEMt7Pui+J/S3eVF0b3GWfuKUwfe2lP5DKlLZOwBq37e0/bXEzxrw7/SuHAuYAdoCwY6mAYhrsg==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -21101,30 +20250,6 @@ "pathe": "^2.0.1" } }, - "node_modules/monaco-editor": { - "version": "0.55.1", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", - "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", - "license": "MIT", - "peer": true, - "dependencies": { - "dompurify": "3.2.7", - "marked": "14.0.0" - } - }, - "node_modules/monaco-editor/node_modules/marked": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", - "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", - "license": "MIT", - "peer": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/motion-dom": { "version": "12.38.0", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz", @@ -21257,26 +20382,6 @@ "node": ">=18" } }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -23828,32 +22933,6 @@ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "license": "ISC" }, - "node_modules/protobufjs": { - "version": "6.11.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", - "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -24742,15 +23821,6 @@ "node": ">=0.10" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -25105,13 +24175,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "license": "MIT", - "peer": true - }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -26601,12 +25664,6 @@ "node": ">=6" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, "node_modules/tree-dump": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", @@ -26842,7 +25899,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -27499,12 +26556,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, "node_modules/webpack": { "version": "5.102.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", @@ -27925,16 +26976,6 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -28226,15 +27267,6 @@ "xml-js": "bin/cli.js" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -28257,62 +27289,6 @@ "url": "https://github.com/sponsors/eemeli" } }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index ceb53b0c..837b3dcf 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ ] }, "dependencies": { + "@clerk/react": "^6.6.3", "@docusaurus/core": "^3.9.1", "@docusaurus/plugin-content-docs": "3.10.1", "@docusaurus/plugin-google-analytics": "^3.10.0", @@ -54,8 +55,6 @@ "dotenv": "^17.4.2", "embla-carousel-autoplay": "^8.6.0", "embla-carousel-react": "^8.6.0", - "firebase": "^9.22.2", - "firebaseui": "6.1.0", "framer-motion": "^12.38.0", "lucide-react": "^0.503.0", "prism-react-renderer": "^2.3.0", @@ -105,6 +104,6 @@ ] }, "engines": { - "node": ">=18.0" + "node": ">=20.9.0" } -} \ No newline at end of file +} diff --git a/src/components/ui/NavbarClerkAuth.tsx b/src/components/ui/NavbarClerkAuth.tsx new file mode 100644 index 00000000..f2878b29 --- /dev/null +++ b/src/components/ui/NavbarClerkAuth.tsx @@ -0,0 +1,38 @@ +import React, { useEffect, useState } from "react"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { Show, SignInButton, UserButton } from "@clerk/react"; +import { createPortal } from "react-dom"; + +const NavbarClerkAuthContent: React.FC = () => { + return ( +
+ + + + + + + + +
+ ); +}; + +const NavbarClerkAuth: React.FC = () => { + const { + siteConfig: { customFields }, + } = useDocusaurusContext(); + const [container, setContainer] = useState(null); + + useEffect(() => { + setContainer(document.getElementById("clerk-auth-navbar")); + }, []); + + if (!customFields?.clerkPublishableKey || !container) { + return null; + } + + return createPortal(, container); +}; + +export default NavbarClerkAuth; diff --git a/src/css/custom.css b/src/css/custom.css index b60e9371..4db8f170 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -477,12 +477,12 @@ body { /* Hide TOP navbar items on mobile (not sidebar) */ /* - * This hides all navbar items on small screens, *except* for the - * toggle, brand, and the item :has() the GitHub auth button. + * Hide all navbar items on small screens except the toggle, brand, + * and the Clerk auth control. */ .navbar__items .navbar__item:not(.navbar__toggle):not(.navbar__brand):not( - :has(#firebase-auth-github-navbar) + :has(#clerk-auth-navbar) ) { display: none !important; } @@ -1378,7 +1378,7 @@ html { } .DocSearch-Button, -#firebase-auth-github-navbar button, +#clerk-auth-navbar button, .colorModeToggle { height: 36px !important; display: flex !important; @@ -1387,6 +1387,31 @@ html { box-sizing: border-box !important; } +.clerk-navbar-auth { + display: flex; + align-items: center; +} + +.clerk-navbar-sign-in { + border: 0; + border-radius: 6px; + background: var(--ifm-color-primary); + color: #ffffff; + cursor: pointer; + font-weight: 600; + padding: 0 0.8rem; + transition: + background-color 0.2s ease, + color 0.2s ease, + box-shadow 0.2s ease; +} + +.clerk-navbar-sign-in:hover { + background: var(--ifm-color-primary-dark); + color: #ffffff; + box-shadow: 0 6px 18px rgba(46, 133, 85, 0.24); +} + .algolia-sitesearch-navbar { display: flex !important; align-items: center !important; diff --git a/src/pages/dashboard/dashboard.css b/src/pages/dashboard/dashboard.css index a2102a49..ca67777f 100644 --- a/src/pages/dashboard/dashboard.css +++ b/src/pages/dashboard/dashboard.css @@ -7,8 +7,16 @@ display: flex; min-height: 100vh; background: - radial-gradient(circle at 10% 0%, var(--dashboard-accent-softer), transparent 42%), - radial-gradient(circle at 90% 100%, rgba(102, 126, 234, 0.08), transparent 40%), + radial-gradient( + circle at 10% 0%, + var(--dashboard-accent-softer), + transparent 42% + ), + radial-gradient( + circle at 90% 100%, + rgba(102, 126, 234, 0.08), + transparent 40% + ), var(--ifm-background-color); position: relative; } @@ -148,11 +156,7 @@ /* Sidebar Styles */ .dashboard-sidebar { width: 280px; - background: color-mix( - in srgb, - var(--ifm-background-color) 97%, - #8b5cf6 3% - ); + background: color-mix(in srgb, var(--ifm-background-color) 97%, #8b5cf6 3%); border-right: 1px solid var(--ifm-color-emphasis-200); padding: 20px; flex-shrink: 0; @@ -249,7 +253,11 @@ .dashboard-home-container { max-width: 1200px; margin: 0 auto; - background: color-mix(in srgb, var(--ifm-background-surface-color) 88%, transparent); + background: color-mix( + in srgb, + var(--ifm-background-surface-color) 88%, + transparent + ); border: 1px solid var(--ifm-color-emphasis-200); border-radius: 24px; padding: 2.25rem; @@ -583,6 +591,35 @@ margin: 0 auto; } +.leaderboard-auth-state { + display: flex; + min-height: 320px; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 12px; + text-align: center; +} + +.leaderboard-auth-state h1, +.leaderboard-auth-state p { + margin: 0; +} + +.leaderboard-auth-button { + border: 0; + border-radius: 8px; + background: var(--dashboard-accent); + color: #ffffff; + cursor: pointer; + font-weight: 600; + padding: 10px 18px; +} + +.leaderboard-auth-button:hover { + background: var(--dashboard-accent-dark); +} + /* Giveaway Section */ .giveaway-section { text-align: center; @@ -729,7 +766,11 @@ } [data-theme="dark"] .dashboard-home-container { - background: color-mix(in srgb, var(--ifm-background-surface-color) 92%, transparent); + background: color-mix( + in srgb, + var(--ifm-background-surface-color) 92%, + transparent + ); border-color: var(--ifm-color-emphasis-300); box-shadow: 0 14px 32px rgba(0, 0, 0, 0.35); } diff --git a/src/pages/dashboard/index.tsx b/src/pages/dashboard/index.tsx index fdb55cc9..a9269e92 100644 --- a/src/pages/dashboard/index.tsx +++ b/src/pages/dashboard/index.tsx @@ -1,7 +1,8 @@ -import React, { JSX, useEffect, useState } from "react"; +import React, { useEffect, useState } from "react"; import Layout from "@theme/Layout"; import Head from "@docusaurus/Head"; import BrowserOnly from "@docusaurus/BrowserOnly"; +import { SignInButton, useAuth } from "@clerk/react"; import { motion } from "framer-motion"; import { useCommunityStatsContext, @@ -54,12 +55,35 @@ const categories: Category[] = [ "general", ]; +const LeaderboardAuthGate: React.FC = () => { + const { isLoaded, isSignedIn } = useAuth(); + + if (!isLoaded) { + return
Loading leaderboard...
; + } + + if (!isSignedIn) { + return ( +
+

Leaderboard

+

Sign in to view the leaderboard.

+ + + +
+ ); + } + + return ; +}; + const DashboardContent: React.FC = () => { const location = useLocation(); const history = useHistory(); const { siteConfig: { customFields }, } = useDocusaurusContext(); + const isClerkConfigured = Boolean(customFields?.clerkPublishableKey); const [activeTab, setActiveTab] = useState< "home" | "discuss" | "giveaway" | "contributors" >("home"); @@ -653,7 +677,14 @@ const DashboardContent: React.FC = () => { animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.5 }} > - + {isClerkConfigured ? ( + + ) : ( +
+

Leaderboard

+

Leaderboard access is unavailable right now.

+
+ )} )} diff --git a/src/theme/Layout.tsx b/src/theme/Layout.tsx index 87e4f2c8..3a6e2d6c 100644 --- a/src/theme/Layout.tsx +++ b/src/theme/Layout.tsx @@ -1,13 +1,13 @@ import React from "react"; import Layout from "@theme-original/Layout"; -import NavbarFirebaseAuthGithub from "@site/src/components/ui/NavbarFirebaseAuthGithub"; +import NavbarClerkAuth from "@site/src/components/ui/NavbarClerkAuth"; import NewsletterPopup from "../components/NewsLetterPopup"; export default function CustomLayout({ children, ...props }) { return ( <> - + {children} diff --git a/src/theme/Root.tsx b/src/theme/Root.tsx index cfba8cab..803ca317 100644 --- a/src/theme/Root.tsx +++ b/src/theme/Root.tsx @@ -1,9 +1,11 @@ import React, { useEffect, useState, useRef } from "react"; import Link from "@docusaurus/Link"; import { Analytics } from "@vercel/analytics/react"; +import { ClerkProvider } from "@clerk/react"; import clsx from "clsx"; // Import clsx for conditional classes import styles from "./Root.module.css"; // Import the CSS module import { useLocation } from "@docusaurus/router"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; // A simple Trophy SVG icon component function TrophyIcon() { @@ -31,11 +33,86 @@ function TrophyIcon() { } export default function Root({ children }: { children: React.ReactNode }) { + const { + siteConfig: { customFields }, + } = useDocusaurusContext(); const [showToast, setShowToast] = useState(false); const [isDark, setIsDark] = useState(false); const timerRef = useRef(null); const location = useLocation(); const [isInitialLoad, setIsInitialLoad] = useState(true); + const clerkPublishableKey = customFields?.clerkPublishableKey as + | string + | undefined; + const clerkAppearance = { + variables: { + colorPrimary: "var(--ifm-color-primary)", + colorBackground: "var(--ifm-background-surface-color)", + colorForeground: "var(--ifm-color-content)", + colorMutedForeground: "var(--ifm-color-content-secondary)", + colorInputBackground: "var(--ifm-background-color)", + colorInputForeground: "var(--ifm-color-content)", + colorRing: "rgba(56, 161, 105, 0.24)", + colorModalBackdrop: "rgba(15, 23, 42, 0.62)", + borderRadius: "0.75rem", + fontFamily: "var(--ifm-font-family-base)", + }, + layout: { + logoImageUrl: "/img/logo.png", + socialButtonsPlacement: "top" as const, + socialButtonsVariant: "blockButton" as const, + }, + elements: { + cardBox: { + border: "1px solid var(--ifm-color-emphasis-200)", + boxShadow: "0 24px 80px rgba(15, 23, 42, 0.24)", + }, + card: { + backgroundColor: "var(--ifm-background-surface-color)", + }, + logoBox: { + marginBottom: "0.75rem", + }, + logoImage: { + height: "2rem", + }, + headerTitle: { + color: "var(--ifm-color-content)", + fontWeight: 700, + letterSpacing: "0", + }, + headerSubtitle: { + color: "var(--ifm-color-content-secondary)", + }, + socialButtonsBlockButton: { + border: "1px solid var(--ifm-color-emphasis-300)", + backgroundColor: "var(--ifm-background-color)", + color: "var(--ifm-color-content)", + boxShadow: "none", + "&:hover, &:focus, &:active": { + backgroundColor: "var(--ifm-color-emphasis-100)", + borderColor: "var(--ifm-color-primary)", + }, + }, + socialButtonsBlockButtonText: { + fontWeight: 600, + }, + footer: { + borderTop: "1px solid var(--ifm-color-emphasis-200)", + backgroundColor: "var(--ifm-background-surface-color)", + }, + footerActionText: { + color: "var(--ifm-color-content-secondary)", + }, + footerActionLink: { + color: "var(--ifm-color-primary)", + fontWeight: 600, + }, + modalBackdrop: { + backdropFilter: "blur(4px)", + }, + }, + }; // Check if current page is sponsors page const isSponsorsPage = @@ -110,7 +187,7 @@ export default function Root({ children }: { children: React.ReactNode }) { } }; - return ( + const content = ( <> {children} @@ -155,4 +232,18 @@ export default function Root({ children }: { children: React.ReactNode }) { {process.env.NODE_ENV === "production" && } ); + + if (!clerkPublishableKey) { + return content; + } + + return ( + + {content} + + ); } From c55abb49a723a89fc30cd0b857a62b6558472a0d Mon Sep 17 00:00:00 2001 From: Abhash Chakraborty Date: Fri, 15 May 2026 12:49:58 +0530 Subject: [PATCH 3/5] fix: resolve existing typecheck errors --- src/components/blogCarousel/blogCard.tsx | 3 +- src/components/discussions/DiscussionCard.tsx | 3 +- src/pages/blogs/index.tsx | 3 +- src/pages/merch/index.tsx | 6 +-- src/theme/Navbar/Content/index.tsx | 18 ++++--- src/types/global.d.ts | 49 ++++++++++++------- 6 files changed, 52 insertions(+), 30 deletions(-) diff --git a/src/components/blogCarousel/blogCard.tsx b/src/components/blogCarousel/blogCard.tsx index a3c130fa..4220c68d 100644 --- a/src/components/blogCarousel/blogCard.tsx +++ b/src/components/blogCarousel/blogCard.tsx @@ -85,7 +85,8 @@ const BlogCard = ({ type, date, title, content, imageUrl, id, authors }) => { onError={(e) => { const target = e.currentTarget; target.style.display = "none"; - const fallback = target.nextElementSibling; + const fallback = + target.nextElementSibling as HTMLElement | null; if (fallback) fallback.style.display = "flex"; }} /> diff --git a/src/components/discussions/DiscussionCard.tsx b/src/components/discussions/DiscussionCard.tsx index 58983939..b86124e2 100644 --- a/src/components/discussions/DiscussionCard.tsx +++ b/src/components/discussions/DiscussionCard.tsx @@ -129,7 +129,8 @@ export default function DiscussionCard({ onError={(e) => { const target = e.currentTarget; target.style.display = "none"; - const fallback = target.nextElementSibling; + const fallback = + target.nextElementSibling as HTMLElement | null; if (fallback) fallback.style.display = "flex"; }} /> diff --git a/src/pages/blogs/index.tsx b/src/pages/blogs/index.tsx index 946e9660..bf4d19a9 100644 --- a/src/pages/blogs/index.tsx +++ b/src/pages/blogs/index.tsx @@ -297,7 +297,8 @@ const BlogCard = ({ blog, index }) => { onError={(e) => { const target = e.currentTarget; target.style.display = "none"; - const fallback = target.nextElementSibling; + const fallback = + target.nextElementSibling as HTMLElement | null; if (fallback) fallback.style.display = "flex"; }} /> diff --git a/src/pages/merch/index.tsx b/src/pages/merch/index.tsx index 49d94a37..354c6d38 100644 --- a/src/pages/merch/index.tsx +++ b/src/pages/merch/index.tsx @@ -1,7 +1,7 @@ import React, { useState, useEffect } from "react"; import type { ReactNode } from "react"; import Layout from "@theme/Layout"; -import { motion } from "framer-motion"; +import { motion, type Variants } from "framer-motion"; import ProductGrid from "../../components/merch/ProductGrid"; import FilterBar from "../../components/merch/FilterBar"; import ShoppingCart from "../../components/merch/ShoppingCart"; @@ -83,7 +83,7 @@ const sampleProducts: Product[] = [ }, ]; -const containerVariants = { +const containerVariants: Variants = { hidden: { opacity: 0 }, show: { opacity: 1, @@ -91,7 +91,7 @@ const containerVariants = { } }; -const itemVariants = { +const itemVariants: Variants = { hidden: { opacity: 0, y: 20 }, show: { opacity: 1, y: 0, transition: { duration: 0.5, ease: "easeOut" } } }; diff --git a/src/theme/Navbar/Content/index.tsx b/src/theme/Navbar/Content/index.tsx index 8816967f..445eb99e 100644 --- a/src/theme/Navbar/Content/index.tsx +++ b/src/theme/Navbar/Content/index.tsx @@ -38,18 +38,24 @@ function NavbarItems({ items }: { items: NavbarItemConfig[] }): ReactNode { return ( <> {items.map((item, i) => { - const key = `${item.label || item.to || item.href || "item"}-${i}`; + const itemKey = + ("label" in item && item.label) || + ("to" in item && item.to) || + ("href" in item && item.href) || + "item"; + const key = `${itemKey}-${i}`; return ( - new Error( + onError={(error) => { + const boundaryError = new Error( `A theme navbar item failed to render. Please double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config: ${JSON.stringify(item, null, 2)}`, - { cause: error }, - ) - } + ); + (boundaryError as Error & { cause?: unknown }).cause = error; + return boundaryError; + }} > diff --git a/src/types/global.d.ts b/src/types/global.d.ts index 58e7830a..86d778b2 100644 --- a/src/types/global.d.ts +++ b/src/types/global.d.ts @@ -34,7 +34,7 @@ declare module "@docusaurus/theme-common" { export function useThemeConfig(): any; export function usePluralForm(): any; - export function isMultiColumnFooterLinks(): any; + export function isMultiColumnFooterLinks(links: any): any; export const ThemeClassNames: any; export const ErrorCauseBoundary: any; } @@ -90,7 +90,10 @@ declare module "@site/src/lib/utils" { } declare module "@site/src/utils/jsUtils" { - export function sortBy(array: any[], key: string): any[]; + export function sortBy( + array: T[], + getter: (item: T) => string | number | boolean, + ): T[]; } declare module "@site/src/services/github" { @@ -100,6 +103,24 @@ declare module "@site/src/services/github" { } } +declare module "@site/src/services/githubService" { + export const githubService: { + setToken(token: string): void; + fetchDiscussions(limit?: number, signal?: AbortSignal): Promise; + }; + export interface GitHubDiscussion { + [key: string]: any; + } +} + +declare module "@site/src/utils/useSafeColorMode" { + export function useSafeColorMode(): { + colorMode: "light" | "dark"; + isDark: boolean; + mounted: boolean; + }; +} + declare module "@site/src/components/ui/button" { export const Button: any; } @@ -108,25 +129,17 @@ declare module "@site/src/database/sponsors" { export interface Sponsor { [key: string]: any; } + const sponsors: Sponsor[]; + export default sponsors; } declare module "@site/src/data/users" { - export interface Tag { - [key: string]: any; - } - export interface TagList { - [key: string]: any; - } - export interface Tags { - [key: string]: any; - } - export interface TagType { - [key: string]: any; - } - export interface User { - [key: string]: any; - } - export const sortedUsers: any; + export type Tag = import("../data/users").Tag; + export type TagType = import("../data/users").TagType; + export type User = import("../data/users").User; + export const Tags: { [type in TagType]: Tag }; + export const TagList: TagType[]; + export const sortedUsers: User[]; } // Catch-all for any missing modules From ae4ac3d7b386fea5d3f0e48ef712c3114fb02620 Mon Sep 17 00:00:00 2001 From: Abhash Chakraborty Date: Fri, 15 May 2026 12:56:31 +0530 Subject: [PATCH 4/5] fix: clean lint warnings in touched files --- src/components/blogCarousel/blogCard.tsx | 34 +++++++---- src/components/discussions/DiscussionCard.tsx | 2 +- src/pages/blogs/index.tsx | 59 ++++++++++--------- src/theme/Navbar/Content/index.tsx | 9 +-- src/types/global.d.ts | 1 + 5 files changed, 55 insertions(+), 50 deletions(-) diff --git a/src/components/blogCarousel/blogCard.tsx b/src/components/blogCarousel/blogCard.tsx index 4220c68d..480544d9 100644 --- a/src/components/blogCarousel/blogCard.tsx +++ b/src/components/blogCarousel/blogCard.tsx @@ -1,13 +1,26 @@ "use client"; +import React from "react"; import Link from "@docusaurus/Link"; -import { Card, CardContent } from "../ui/card"; import { getAuthorProfiles, getAuthorTooltip } from "../../utils/authors"; -declare const require: any; -const React = require("react"); +interface BlogCardProps { + type: string; + date?: string; + title: string; + content: string; + imageUrl: string; + id: string; + authors?: string[]; +} -const BlogCard = ({ type, date, title, content, imageUrl, id, authors }) => { - const [isHovered, setIsHovered] = React.useState(false); +const BlogCard = ({ + type, + title, + content, + imageUrl, + id, + authors, +}: BlogCardProps) => { const authorProfiles = getAuthorProfiles(authors || []); if (!id || !type) { @@ -37,11 +50,7 @@ const BlogCard = ({ type, date, title, content, imageUrl, id, authors }) => { const category = getCategory(title); return ( -
setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} - className="relative h-full overflow-hidden transition-all duration-300" - > +
{/* Category Badge */}
{category}
@@ -64,7 +73,7 @@ const BlogCard = ({ type, date, title, content, imageUrl, id, authors }) => {
{/* Stacked Author Avatars */} - {authorProfiles.length > 0 && ( + {authorProfiles.length > 0 && (() => { const max = 3; const visible = authorProfiles.slice(0, max); @@ -102,8 +111,7 @@ const BlogCard = ({ type, date, title, content, imageUrl, id, authors }) => { )}
); - })() - )} + })()} {/* Author Names */}
diff --git a/src/components/discussions/DiscussionCard.tsx b/src/components/discussions/DiscussionCard.tsx index b86124e2..be1c3692 100644 --- a/src/components/discussions/DiscussionCard.tsx +++ b/src/components/discussions/DiscussionCard.tsx @@ -1,6 +1,6 @@ import React from "react"; import { motion } from "framer-motion"; -import { MessageCircle, ThumbsUp, Calendar, Tag, User } from "lucide-react"; +import { MessageCircle, ThumbsUp, Calendar, Tag } from "lucide-react"; export interface Discussion { id: string; diff --git a/src/pages/blogs/index.tsx b/src/pages/blogs/index.tsx index bf4d19a9..b50894c5 100644 --- a/src/pages/blogs/index.tsx +++ b/src/pages/blogs/index.tsx @@ -1,5 +1,4 @@ -declare const require: any; -const React = require("react"); +import React, { type ChangeEvent } from "react"; import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; import Layout from "@theme/Layout"; import Link from "@docusaurus/Link"; @@ -47,7 +46,7 @@ export default function Blogs() { setFilteredBlogs(filtered); }, [searchTerm, selectedCategory]); - const handleSearchChange = (e: any) => { + const handleSearchChange = (e: ChangeEvent) => { setSearchTerm(e.target.value); }; @@ -146,7 +145,11 @@ export default function Blogs() { onClick={() => setSearchTerm("")} aria-label="Clear search" > - + @@ -219,8 +222,7 @@ export default function Blogs() { {filteredBlogs.length > 0 ? `Found ${filteredBlogs.length} article${filteredBlogs.length !== 1 ? "s" : ""}` : `No articles found`} - {selectedCategory !== "All" && - ` in ${selectedCategory}`} + {selectedCategory !== "All" && ` in ${selectedCategory}`} {searchTerm && ` for "${searchTerm}"`}

@@ -228,8 +230,8 @@ export default function Blogs() {
{filteredBlogs.length > 0 ? ( - filteredBlogs.map((blog, index) => ( - + filteredBlogs.map((blog) => ( + )) ) : (
@@ -257,7 +259,7 @@ export default function Blogs() { ); } -const BlogCard = ({ blog, index }) => { +const BlogCard = ({ blog }: { blog: (typeof blogs)[number] }) => { const authors = getAuthorProfiles(blog.authors || []); return ( @@ -276,7 +278,7 @@ const BlogCard = ({ blog, index }) => {
{/* Stacked Author Avatars */} - {authors.length > 0 && ( + {authors.length > 0 && (() => { const max = 3; const visible = authors.slice(0, max); @@ -314,28 +316,27 @@ const BlogCard = ({ blog, index }) => { )}
); - })() - )} + })()} {/* Author Names */}
- {authors.map((author, authorIndex) => ( - - {authorIndex > 0 && ( - & - )} - - {author.name} - - - ))} + {authors.map((author, authorIndex) => ( + + {authorIndex > 0 && ( + & + )} + + {author.name} + + + ))}
5 min read diff --git a/src/theme/Navbar/Content/index.tsx b/src/theme/Navbar/Content/index.tsx index 445eb99e..86e71479 100644 --- a/src/theme/Navbar/Content/index.tsx +++ b/src/theme/Navbar/Content/index.tsx @@ -1,9 +1,4 @@ -import React, { - type ReactNode, - useMemo, - Component, - type ReactElement, -} from "react"; +import React, { type ReactNode, useMemo } from "react"; import { useThemeConfig, ErrorCauseBoundary } from "@docusaurus/theme-common"; import { splitNavbarItems } from "@docusaurus/theme-common/internal"; import NavbarItem, { type Props as NavbarItemConfig } from "@theme/NavbarItem"; @@ -23,7 +18,7 @@ function SafeMobileSidebarToggle(): ReactNode { // If it fails, the error will be caught by Docusaurus's error boundary try { return ; - } catch (error) { + } catch { // This won't catch hook errors, but it's here for other potential errors console.warn("Mobile sidebar toggle unavailable"); return null; diff --git a/src/types/global.d.ts b/src/types/global.d.ts index 86d778b2..54cf9492 100644 --- a/src/types/global.d.ts +++ b/src/types/global.d.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ // Global type declarations for better TypeScript compatibility // CSS modules and side-effect imports From 4bcbcf2a80a7f64179d3e8081bb77647dcac99d6 Mon Sep 17 00:00:00 2001 From: Abhash Chakraborty Date: Fri, 15 May 2026 12:59:22 +0530 Subject: [PATCH 5/5] fix: restore lockfile peer entries for ci --- package-lock.json | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/package-lock.json b/package-lock.json index 1473b727..8d5e6c63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20250,6 +20250,30 @@ "pathe": "^2.0.1" } }, + "node_modules/monaco-editor": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", + "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", + "license": "MIT", + "peer": true, + "dependencies": { + "dompurify": "3.2.7", + "marked": "14.0.0" + } + }, + "node_modules/monaco-editor/node_modules/marked": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", + "license": "MIT", + "peer": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/motion-dom": { "version": "12.38.0", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz", @@ -24175,6 +24199,13 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", + "peer": true + }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",