-
Welcome to {appName}
+
Welcome to {appName}
Get started by building out your dashboard.
diff --git a/lib/const.ts b/lib/const.ts
index eb566d2..6fc0e63 100644
--- a/lib/const.ts
+++ b/lib/const.ts
@@ -1 +1,30 @@
-export const appName = "AuthFire Admin"
\ No newline at end of file
+export const appName = process.env.NEXT_PUBLIC_APP_NAME || "AuthFire Admin";
+export const baseUrl = `https://${process.env.NEXT_PUBLIC_HOSTNAME}`;
+export const emailLinkLoginUrl = `${baseUrl}/email-link-login`;
+export const logoImageUrl = process.env.NEXT_PUBLIC_LOGO_IMAGE_URL || `${baseUrl}/images/logo.png`;
+export const logoDarkImageUrl = process.env.NEXT_PUBLIC_LOGO_DARK_IMAGE_URL || `${baseUrl}/images/logo-dark.png`;
+export const privacyPolicyUrl = process.env.NEXT_PUBLIC_PRIVACY_POLICY_URL || `${baseUrl}/privacy-policy`;
+export const termsOfServiceUrl = process.env.NEXT_PUBLIC_TERMS_OF_SERVICE_URL || `${baseUrl}/terms-of-service`;
+export const idTokenVerificationUrl = process.env.NEXT_PUBLIC_ID_TOKEN_VERIFICATION_URL || "";
+export const serverSignOutUrl = process.env.NEXT_PUBLIC_SERVER_SIGN_OUT_URL || "";
+export const serverTokenUrl = process.env.NEXT_PUBLIC_SERVER_TOKEN_URL || "";
+export const primaryColor = process.env.NEXT_THEME_PRIMARY_COLOR || "#171717";
+export const primaryForegroundColor = process.env.NEXT_THEME_PRIMARY_FOREGROUND_COLOR || "#fafafa";
+export const legalBusinessName = process.env.NEXT_PUBLIC_LEGAL_BUSINESS_NAME || appName;
+export const recaptchaSiteKey = process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY;
+
+export const firebaseConfig = {
+ apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
+ authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
+ projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
+ storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
+ messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
+ appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
+ measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,
+}
+
+export const openIdConfig = {
+ providerId: process.env.NEXT_PUBLIC_OPENID_CONNECT_PROVIDER_ID,
+ name: process.env.NEXT_PUBLIC_OPENID_CONNECT_NAME,
+ logoUrl: process.env.NEXT_PUBLIC_OPENID_CONNECT_LOGO_URL,
+}
\ No newline at end of file
diff --git a/lib/firebase/index.ts b/lib/firebase/index.ts
new file mode 100644
index 0000000..6d68bc3
--- /dev/null
+++ b/lib/firebase/index.ts
@@ -0,0 +1,106 @@
+import { getApp, initializeApp } from "firebase/app";
+import { getAuth } from "firebase/auth";
+import { getFirestore } from "firebase/firestore";
+import { getStorage } from "firebase/storage";
+import { getToken, initializeAppCheck, ReCaptchaV3Provider } from "firebase/app-check";
+import { getAnalytics, logEvent as _logEvent } from "firebase/analytics";
+import { useStore } from '@nanostores/react';
+import { $analytics, $app, $appCheck, $auth, $firestore, $loading, $storage, setAnalytics, setApp, setAppCheck, setAuth, setFirestore, setLoading, setStorage } from "./store";
+import { baseUrl, firebaseConfig, idTokenVerificationUrl, recaptchaSiteKey, serverSignOutUrl, serverTokenUrl } from "../const";
+import { initialize } from "@authfire/core"
+import { useEffect } from "react";
+
+const useFirebase = () => {
+ let isLoading = useStore($loading);
+ let app = useStore($app);
+ let appCheck = useStore($appCheck);
+ let auth = useStore($auth);
+ let firestore = useStore($firestore);
+ let storage = useStore($storage);
+ let analytics = useStore($analytics);
+
+ useEffect(() => {
+ if (!app) {
+ try {
+ app = getApp() || initializeApp(firebaseConfig)
+ } catch {
+ app = initializeApp(firebaseConfig)
+ }
+ setApp(app);
+ }
+
+ if (!appCheck && recaptchaSiteKey) {
+ appCheck = initializeAppCheck(app, {
+ provider: new ReCaptchaV3Provider(recaptchaSiteKey),
+ isTokenAutoRefreshEnabled: true
+ });
+ setAppCheck(appCheck);
+ }
+
+ if (!auth) {
+ auth = getAuth(app);
+ setAuth(auth);
+ }
+
+ if (!firestore) {
+ firestore = getFirestore(app);
+ setFirestore(firestore);
+ }
+
+ if (!storage) {
+ storage = getStorage(app);
+ setStorage(storage);
+ }
+
+ if (!analytics) {
+ analytics = getAnalytics(app);
+ setAnalytics(analytics);
+ }
+
+ isLoading = false;
+ setLoading(isLoading);
+ }, [app])
+
+ return {
+ isLoading,
+ app,
+ appCheck,
+ auth,
+ firestore,
+ storage,
+ analytics
+ }
+}
+
+const getAppCheckToken = async (forceRefresh: boolean = false) => {
+ const appCheck = $appCheck.get();
+ if (typeof window === 'undefined') {
+ throw new Error("App Check is not available on the server side.");
+ } else if (!appCheck) {
+ throw new Error("App Check is not initialized. Ensure recaptchaSiteKey is set.");
+ }
+ const result = await getToken(appCheck, forceRefresh);
+ return result.token;
+}
+
+/* eslint-disable @typescript-eslint/no-explicit-any */
+const logEvent = (eventName: string, eventParams?: Record
) => {
+ const analytics = $analytics.get();
+ if (!analytics) {
+ console.warn("Analytics is not available in this environment.");
+ return;
+ }
+ _logEvent(analytics, eventName, eventParams);
+}
+
+initialize({
+ baseUrl,
+ idTokenVerificationUrl,
+ serverTokenUrl,
+ serverSignOutUrl,
+ useFirebase,
+ getAppCheckToken,
+ logEvent
+})
+
+export { useFirebase, getAppCheckToken, logEvent };
\ No newline at end of file
diff --git a/lib/firebase/store.ts b/lib/firebase/store.ts
new file mode 100644
index 0000000..a9bd07d
--- /dev/null
+++ b/lib/firebase/store.ts
@@ -0,0 +1,52 @@
+import { Analytics } from 'firebase/analytics';
+import { FirebaseApp } from 'firebase/app'
+import { AppCheck } from 'firebase/app-check';
+import { Auth } from 'firebase/auth';
+import { Firestore } from 'firebase/firestore';
+import { FirebaseStorage } from 'firebase/storage';
+import { atom } from 'nanostores'
+
+const $loading = atom(true)
+const setLoading = (loading: boolean) => {
+ $loading.set(loading);
+}
+
+const $app = atom()
+
+const setApp = (app: FirebaseApp) => {
+ $app.set(app);
+}
+
+const $appCheck = atom(undefined)
+
+const setAppCheck = (appCheck: AppCheck) => {
+ $appCheck.set(appCheck);
+}
+
+const $auth = atom(undefined)
+
+const setAuth = (auth: Auth) => {
+ $auth.set(auth);
+}
+
+const $firestore = atom(undefined)
+
+const setFirestore = (firestore: Firestore) => {
+ $firestore.set(firestore);
+}
+
+const $storage = atom(undefined)
+
+const setStorage = (storage: FirebaseStorage) => {
+ $storage.set(storage);
+}
+
+const $analytics = atom(undefined)
+
+const setAnalytics = (analytics: Analytics) => {
+ $analytics.set(analytics);
+}
+
+export {
+ $app, setApp, $appCheck, setAppCheck, $auth, setAuth, $firestore, setFirestore, $storage, setStorage, $analytics, setAnalytics, $loading, setLoading
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index 8a78e08..1a93877 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,8 @@
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
+ "@authfire/core": "^1.0.3",
+ "@nanostores/react": "^1.0.0",
"@radix-ui/react-avatar": "^1.1.10",
"@radix-ui/react-collapsible": "^1.1.12",
"@radix-ui/react-dialog": "^1.1.15",
@@ -20,7 +22,9 @@
"@tailwindcss/postcss": "^4.1.14",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
+ "firebase": "^12.4.0",
"lucide-react": "^0.545.0",
+ "nanostores": "^1.0.1",
"next": "^15.5.4",
"next-themes": "^0.4.6",
"postcss": "^8.5.6",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 96379e9..79cfdab 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,6 +8,12 @@ importers:
.:
dependencies:
+ '@authfire/core':
+ specifier: ^1.0.3
+ version: 1.0.3(firebase@12.4.0)
+ '@nanostores/react':
+ specifier: ^1.0.0
+ version: 1.0.0(nanostores@1.0.1)(react@19.2.0)
'@radix-ui/react-avatar':
specifier: ^1.1.10
version: 1.1.10(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
@@ -38,9 +44,15 @@ importers:
clsx:
specifier: ^2.1.1
version: 2.1.1
+ firebase:
+ specifier: ^12.4.0
+ version: 12.4.0
lucide-react:
specifier: ^0.545.0
version: 0.545.0(react@19.2.0)
+ nanostores:
+ specifier: ^1.0.1
+ version: 1.0.1
next:
specifier: ^15.5.4
version: 15.5.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
@@ -82,9 +94,224 @@ packages:
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
+ '@authfire/core@1.0.3':
+ resolution: {integrity: sha512-OryAo7BsEDhq+NI+vHXTb44IwB8fFhG2Jxqc6aPgtINyU8NX+AY810NZUFB5WMNbFbhyczsHJfIIVOi0nc/unA==}
+ peerDependencies:
+ firebase: ^12.2.1
+
'@emnapi/runtime@1.5.0':
resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==}
+ '@firebase/ai@2.4.0':
+ resolution: {integrity: sha512-YilG6AJ/nYpCKtxZyvEzBRAQv5bU+2tBOKX4Ps0rNNSdxN39aT37kGhjATbk1kq1z5Lq7mkWglw/ajAF3lOWUg==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ '@firebase/app': 0.x
+ '@firebase/app-types': 0.x
+
+ '@firebase/analytics-compat@0.2.25':
+ resolution: {integrity: sha512-fdzoaG0BEKbqksRDhmf4JoyZf16Wosrl0Y7tbZtJyVDOOwziE0vrFjmZuTdviL0yhak+Nco6rMsUUbkbD+qb6Q==}
+ peerDependencies:
+ '@firebase/app-compat': 0.x
+
+ '@firebase/analytics-types@0.8.3':
+ resolution: {integrity: sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==}
+
+ '@firebase/analytics@0.10.19':
+ resolution: {integrity: sha512-3wU676fh60gaiVYQEEXsbGS4HbF2XsiBphyvvqDbtC1U4/dO4coshbYktcCHq+HFaGIK07iHOh4pME0hEq1fcg==}
+ peerDependencies:
+ '@firebase/app': 0.x
+
+ '@firebase/app-check-compat@0.4.0':
+ resolution: {integrity: sha512-UfK2Q8RJNjYM/8MFORltZRG9lJj11k0nW84rrffiKvcJxLf1jf6IEjCIkCamykHE73C6BwqhVfhIBs69GXQV0g==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ '@firebase/app-compat': 0.x
+
+ '@firebase/app-check-interop-types@0.3.3':
+ resolution: {integrity: sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==}
+
+ '@firebase/app-check-types@0.5.3':
+ resolution: {integrity: sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==}
+
+ '@firebase/app-check@0.11.0':
+ resolution: {integrity: sha512-XAvALQayUMBJo58U/rxW02IhsesaxxfWVmVkauZvGEz3vOAjMEQnzFlyblqkc2iAaO82uJ2ZVyZv9XzPfxjJ6w==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ '@firebase/app': 0.x
+
+ '@firebase/app-compat@0.5.4':
+ resolution: {integrity: sha512-T7ifGmb+awJEcp542Ek4HtNfBxcBrnuk1ggUdqyFEdsXHdq7+wVlhvE6YukTL7NS8hIkEfL7TMAPx/uCNqt30g==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/app-types@0.9.3':
+ resolution: {integrity: sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==}
+
+ '@firebase/app@0.14.4':
+ resolution: {integrity: sha512-pUxEGmR+uu21OG/icAovjlu1fcYJzyVhhT0rsCrn+zi+nHtrS43Bp9KPn9KGa4NMspCUE++nkyiqziuIvJdwzw==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/auth-compat@0.6.0':
+ resolution: {integrity: sha512-J0lGSxXlG/lYVi45wbpPhcWiWUMXevY4fvLZsN1GHh+po7TZVng+figdHBVhFheaiipU8HZyc7ljw1jNojM2nw==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ '@firebase/app-compat': 0.x
+
+ '@firebase/auth-interop-types@0.2.4':
+ resolution: {integrity: sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==}
+
+ '@firebase/auth-types@0.13.0':
+ resolution: {integrity: sha512-S/PuIjni0AQRLF+l9ck0YpsMOdE8GO2KU6ubmBB7P+7TJUCQDa3R1dlgYm9UzGbbePMZsp0xzB93f2b/CgxMOg==}
+ peerDependencies:
+ '@firebase/app-types': 0.x
+ '@firebase/util': 1.x
+
+ '@firebase/auth@1.11.0':
+ resolution: {integrity: sha512-5j7+ua93X+IRcJ1oMDTClTo85l7Xe40WSkoJ+shzPrX7OISlVWLdE1mKC57PSD+/LfAbdhJmvKixINBw2ESK6w==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ '@firebase/app': 0.x
+ '@react-native-async-storage/async-storage': ^1.18.1
+ peerDependenciesMeta:
+ '@react-native-async-storage/async-storage':
+ optional: true
+
+ '@firebase/component@0.7.0':
+ resolution: {integrity: sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/data-connect@0.3.11':
+ resolution: {integrity: sha512-G258eLzAD6im9Bsw+Qm1Z+P4x0PGNQ45yeUuuqe5M9B1rn0RJvvsQCRHXgE52Z+n9+WX1OJd/crcuunvOGc7Vw==}
+ peerDependencies:
+ '@firebase/app': 0.x
+
+ '@firebase/database-compat@2.1.0':
+ resolution: {integrity: sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/database-types@1.0.16':
+ resolution: {integrity: sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==}
+
+ '@firebase/database@1.1.0':
+ resolution: {integrity: sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/firestore-compat@0.4.2':
+ resolution: {integrity: sha512-cy7ov6SpFBx+PHwFdOOjbI7kH00uNKmIFurAn560WiPCZXy9EMnil1SOG7VF4hHZKdenC+AHtL4r3fNpirpm0w==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ '@firebase/app-compat': 0.x
+
+ '@firebase/firestore-types@3.0.3':
+ resolution: {integrity: sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q==}
+ peerDependencies:
+ '@firebase/app-types': 0.x
+ '@firebase/util': 1.x
+
+ '@firebase/firestore@4.9.2':
+ resolution: {integrity: sha512-iuA5+nVr/IV/Thm0Luoqf2mERUvK9g791FZpUJV1ZGXO6RL2/i/WFJUj5ZTVXy5pRjpWYO+ZzPcReNrlilmztA==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ '@firebase/app': 0.x
+
+ '@firebase/functions-compat@0.4.1':
+ resolution: {integrity: sha512-AxxUBXKuPrWaVNQ8o1cG1GaCAtXT8a0eaTDfqgS5VsRYLAR0ALcfqDLwo/QyijZj1w8Qf8n3Qrfy/+Im245hOQ==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ '@firebase/app-compat': 0.x
+
+ '@firebase/functions-types@0.6.3':
+ resolution: {integrity: sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==}
+
+ '@firebase/functions@0.13.1':
+ resolution: {integrity: sha512-sUeWSb0rw5T+6wuV2o9XNmh9yHxjFI9zVGFnjFi+n7drTEWpl7ZTz1nROgGrSu472r+LAaj+2YaSicD4R8wfbw==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ '@firebase/app': 0.x
+
+ '@firebase/installations-compat@0.2.19':
+ resolution: {integrity: sha512-khfzIY3EI5LePePo7vT19/VEIH1E3iYsHknI/6ek9T8QCozAZshWT9CjlwOzZrKvTHMeNcbpo/VSOSIWDSjWdQ==}
+ peerDependencies:
+ '@firebase/app-compat': 0.x
+
+ '@firebase/installations-types@0.5.3':
+ resolution: {integrity: sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA==}
+ peerDependencies:
+ '@firebase/app-types': 0.x
+
+ '@firebase/installations@0.6.19':
+ resolution: {integrity: sha512-nGDmiwKLI1lerhwfwSHvMR9RZuIH5/8E3kgUWnVRqqL7kGVSktjLTWEMva7oh5yxQ3zXfIlIwJwMcaM5bK5j8Q==}
+ peerDependencies:
+ '@firebase/app': 0.x
+
+ '@firebase/logger@0.5.0':
+ resolution: {integrity: sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/messaging-compat@0.2.23':
+ resolution: {integrity: sha512-SN857v/kBUvlQ9X/UjAqBoQ2FEaL1ZozpnmL1ByTe57iXkmnVVFm9KqAsTfmf+OEwWI4kJJe9NObtN/w22lUgg==}
+ peerDependencies:
+ '@firebase/app-compat': 0.x
+
+ '@firebase/messaging-interop-types@0.2.3':
+ resolution: {integrity: sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==}
+
+ '@firebase/messaging@0.12.23':
+ resolution: {integrity: sha512-cfuzv47XxqW4HH/OcR5rM+AlQd1xL/VhuaeW/wzMW1LFrsFcTn0GND/hak1vkQc2th8UisBcrkVcQAnOnKwYxg==}
+ peerDependencies:
+ '@firebase/app': 0.x
+
+ '@firebase/performance-compat@0.2.22':
+ resolution: {integrity: sha512-xLKxaSAl/FVi10wDX/CHIYEUP13jXUjinL+UaNXT9ByIvxII5Ne5150mx6IgM8G6Q3V+sPiw9C8/kygkyHUVxg==}
+ peerDependencies:
+ '@firebase/app-compat': 0.x
+
+ '@firebase/performance-types@0.2.3':
+ resolution: {integrity: sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==}
+
+ '@firebase/performance@0.7.9':
+ resolution: {integrity: sha512-UzybENl1EdM2I1sjYm74xGt/0JzRnU/0VmfMAKo2LSpHJzaj77FCLZXmYQ4oOuE+Pxtt8Wy2BVJEENiZkaZAzQ==}
+ peerDependencies:
+ '@firebase/app': 0.x
+
+ '@firebase/remote-config-compat@0.2.20':
+ resolution: {integrity: sha512-P/ULS9vU35EL9maG7xp66uljkZgcPMQOxLj3Zx2F289baTKSInE6+YIkgHEi1TwHoddC/AFePXPpshPlEFkbgg==}
+ peerDependencies:
+ '@firebase/app-compat': 0.x
+
+ '@firebase/remote-config-types@0.5.0':
+ resolution: {integrity: sha512-vI3bqLoF14L/GchtgayMiFpZJF+Ao3uR8WCde0XpYNkSokDpAKca2DxvcfeZv7lZUqkUwQPL2wD83d3vQ4vvrg==}
+
+ '@firebase/remote-config@0.7.0':
+ resolution: {integrity: sha512-dX95X6WlW7QlgNd7aaGdjAIZUiQkgWgNS+aKNu4Wv92H1T8Ue/NDUjZHd9xb8fHxLXIHNZeco9/qbZzr500MjQ==}
+ peerDependencies:
+ '@firebase/app': 0.x
+
+ '@firebase/storage-compat@0.4.0':
+ resolution: {integrity: sha512-vDzhgGczr1OfcOy285YAPur5pWDEvD67w4thyeCUh6Ys0izN9fNYtA1MJERmNBfqjqu0lg0FM5GLbw0Il21M+g==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ '@firebase/app-compat': 0.x
+
+ '@firebase/storage-types@0.8.3':
+ resolution: {integrity: sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg==}
+ peerDependencies:
+ '@firebase/app-types': 0.x
+ '@firebase/util': 1.x
+
+ '@firebase/storage@0.14.0':
+ resolution: {integrity: sha512-xWWbb15o6/pWEw8H01UQ1dC5U3rf8QTAzOChYyCpafV6Xki7KVp3Yaw2nSklUwHEziSWE9KoZJS7iYeyqWnYFA==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ '@firebase/app': 0.x
+
+ '@firebase/util@1.13.0':
+ resolution: {integrity: sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/webchannel-wrapper@1.0.5':
+ resolution: {integrity: sha512-+uGNN7rkfn41HLO0vekTFhTxk61eKa8mTpRGLO0QSqlQdKvIoGAvLp3ppdVIWbTGYJWM6Kp0iN+PjMIOcnVqTw==}
+
'@floating-ui/core@1.7.3':
resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
@@ -100,6 +327,15 @@ packages:
'@floating-ui/utils@0.2.10':
resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
+ '@grpc/grpc-js@1.9.15':
+ resolution: {integrity: sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==}
+ engines: {node: ^8.13.0 || >=10.10.0}
+
+ '@grpc/proto-loader@0.7.15':
+ resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==}
+ engines: {node: '>=6'}
+ hasBin: true
+
'@img/colour@1.0.0':
resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
engines: {node: '>=18'}
@@ -246,6 +482,13 @@ packages:
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+ '@nanostores/react@1.0.0':
+ resolution: {integrity: sha512-eDduyNy+lbQJMg6XxZ/YssQqF6b4OXMFEZMYKPJCCmBevp1lg0g+4ZRi94qGHirMtsNfAWKNwsjOhC+q1gvC+A==}
+ engines: {node: ^20.0.0 || >=22.0.0}
+ peerDependencies:
+ nanostores: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^1.0.0
+ react: '>=18.0.0'
+
'@next/env@15.5.4':
resolution: {integrity: sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A==}
@@ -297,6 +540,36 @@ packages:
cpu: [x64]
os: [win32]
+ '@protobufjs/aspromise@1.1.2':
+ resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
+
+ '@protobufjs/base64@1.1.2':
+ resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==}
+
+ '@protobufjs/codegen@2.0.4':
+ resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==}
+
+ '@protobufjs/eventemitter@1.1.0':
+ resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==}
+
+ '@protobufjs/fetch@1.1.0':
+ resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==}
+
+ '@protobufjs/float@1.0.2':
+ resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==}
+
+ '@protobufjs/inquire@1.1.0':
+ resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==}
+
+ '@protobufjs/path@1.1.2':
+ resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==}
+
+ '@protobufjs/pool@1.1.0':
+ resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==}
+
+ '@protobufjs/utf8@1.1.0':
+ resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
+
'@radix-ui/primitive@1.1.3':
resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==}
@@ -747,6 +1020,14 @@ packages:
'@types/react@19.2.2':
resolution: {integrity: sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==}
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
aria-hidden@1.2.6:
resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
engines: {node: '>=10'}
@@ -764,10 +1045,21 @@ packages:
client-only@0.0.1:
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+ cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+
clsx@2.1.1:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
@@ -778,10 +1070,28 @@ packages:
detect-node-es@1.1.0:
resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
enhanced-resolve@5.18.3:
resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==}
engines: {node: '>=10.13.0'}
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ faye-websocket@0.11.4:
+ resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==}
+ engines: {node: '>=0.8.0'}
+
+ firebase@12.4.0:
+ resolution: {integrity: sha512-/chNgDQ6ppPPGOQO4jctxOa/5JeQxuhaxA7Y90K0I+n/wPfoO8mRveedhVUdo7ExLcWUivnnow/ouSLYSI5Icw==}
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
get-nonce@1.0.1:
resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
engines: {node: '>=6'}
@@ -789,6 +1099,16 @@ packages:
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ http-parser-js@0.5.10:
+ resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==}
+
+ idb@7.1.1:
+ resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
jiti@2.6.1:
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
hasBin: true
@@ -857,6 +1177,12 @@ packages:
resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==}
engines: {node: '>= 12.0.0'}
+ lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+
+ long@5.3.2:
+ resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==}
+
lucide-react@0.545.0:
resolution: {integrity: sha512-7r1/yUuflQDSt4f1bpn5ZAocyIxcTyVyBBChSVtBKn5M+392cPmI5YJMWOJKk/HUWGm5wg83chlAZtCcGbEZtw==}
peerDependencies:
@@ -878,6 +1204,10 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ nanostores@1.0.1:
+ resolution: {integrity: sha512-kNZ9xnoJYKg/AfxjrVL4SS0fKX++4awQReGqWnwTRHxeHGZ1FJFVgTqr/eMrNQdp0Tz7M7tG/TDaX8QfHDwVCw==}
+ engines: {node: ^20.0.0 || >=22.0.0}
+
next-themes@0.4.6:
resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==}
peerDependencies:
@@ -916,6 +1246,10 @@ packages:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
+ protobufjs@7.5.4:
+ resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==}
+ engines: {node: '>=12.0.0'}
+
react-dom@19.2.0:
resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==}
peerDependencies:
@@ -955,6 +1289,13 @@ packages:
resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==}
engines: {node: '>=0.10.0'}
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
scheduler@0.27.0:
resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
@@ -971,6 +1312,14 @@ packages:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
styled-jsx@5.1.6:
resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
engines: {node: '>= 12.0.0'}
@@ -1037,19 +1386,368 @@ packages:
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ web-vitals@4.2.4:
+ resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==}
+
+ websocket-driver@0.7.4:
+ resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==}
+ engines: {node: '>=0.8.0'}
+
+ websocket-extensions@0.1.4:
+ resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==}
+ engines: {node: '>=0.8.0'}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
yallist@5.0.0:
resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
engines: {node: '>=18'}
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+
snapshots:
'@alloc/quick-lru@5.2.0': {}
+ '@authfire/core@1.0.3(firebase@12.4.0)':
+ dependencies:
+ firebase: 12.4.0
+
'@emnapi/runtime@1.5.0':
dependencies:
tslib: 2.8.1
optional: true
+ '@firebase/ai@2.4.0(@firebase/app-types@0.9.3)(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app': 0.14.4
+ '@firebase/app-check-interop-types': 0.3.3
+ '@firebase/app-types': 0.9.3
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+
+ '@firebase/analytics-compat@0.2.25(@firebase/app-compat@0.5.4)(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/analytics': 0.10.19(@firebase/app@0.14.4)
+ '@firebase/analytics-types': 0.8.3
+ '@firebase/app-compat': 0.5.4
+ '@firebase/component': 0.7.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@firebase/app'
+
+ '@firebase/analytics-types@0.8.3': {}
+
+ '@firebase/analytics@0.10.19(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app': 0.14.4
+ '@firebase/component': 0.7.0
+ '@firebase/installations': 0.6.19(@firebase/app@0.14.4)
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+
+ '@firebase/app-check-compat@0.4.0(@firebase/app-compat@0.5.4)(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app-check': 0.11.0(@firebase/app@0.14.4)
+ '@firebase/app-check-types': 0.5.3
+ '@firebase/app-compat': 0.5.4
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@firebase/app'
+
+ '@firebase/app-check-interop-types@0.3.3': {}
+
+ '@firebase/app-check-types@0.5.3': {}
+
+ '@firebase/app-check@0.11.0(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app': 0.14.4
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+
+ '@firebase/app-compat@0.5.4':
+ dependencies:
+ '@firebase/app': 0.14.4
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+
+ '@firebase/app-types@0.9.3': {}
+
+ '@firebase/app@0.14.4':
+ dependencies:
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ idb: 7.1.1
+ tslib: 2.8.1
+
+ '@firebase/auth-compat@0.6.0(@firebase/app-compat@0.5.4)(@firebase/app-types@0.9.3)(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app-compat': 0.5.4
+ '@firebase/auth': 1.11.0(@firebase/app@0.14.4)
+ '@firebase/auth-types': 0.13.0(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)
+ '@firebase/component': 0.7.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@firebase/app'
+ - '@firebase/app-types'
+ - '@react-native-async-storage/async-storage'
+
+ '@firebase/auth-interop-types@0.2.4': {}
+
+ '@firebase/auth-types@0.13.0(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)':
+ dependencies:
+ '@firebase/app-types': 0.9.3
+ '@firebase/util': 1.13.0
+
+ '@firebase/auth@1.11.0(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app': 0.14.4
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+
+ '@firebase/component@0.7.0':
+ dependencies:
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+
+ '@firebase/data-connect@0.3.11(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app': 0.14.4
+ '@firebase/auth-interop-types': 0.2.4
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+
+ '@firebase/database-compat@2.1.0':
+ dependencies:
+ '@firebase/component': 0.7.0
+ '@firebase/database': 1.1.0
+ '@firebase/database-types': 1.0.16
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+
+ '@firebase/database-types@1.0.16':
+ dependencies:
+ '@firebase/app-types': 0.9.3
+ '@firebase/util': 1.13.0
+
+ '@firebase/database@1.1.0':
+ dependencies:
+ '@firebase/app-check-interop-types': 0.3.3
+ '@firebase/auth-interop-types': 0.2.4
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ faye-websocket: 0.11.4
+ tslib: 2.8.1
+
+ '@firebase/firestore-compat@0.4.2(@firebase/app-compat@0.5.4)(@firebase/app-types@0.9.3)(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app-compat': 0.5.4
+ '@firebase/component': 0.7.0
+ '@firebase/firestore': 4.9.2(@firebase/app@0.14.4)
+ '@firebase/firestore-types': 3.0.3(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@firebase/app'
+ - '@firebase/app-types'
+
+ '@firebase/firestore-types@3.0.3(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)':
+ dependencies:
+ '@firebase/app-types': 0.9.3
+ '@firebase/util': 1.13.0
+
+ '@firebase/firestore@4.9.2(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app': 0.14.4
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ '@firebase/webchannel-wrapper': 1.0.5
+ '@grpc/grpc-js': 1.9.15
+ '@grpc/proto-loader': 0.7.15
+ tslib: 2.8.1
+
+ '@firebase/functions-compat@0.4.1(@firebase/app-compat@0.5.4)(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app-compat': 0.5.4
+ '@firebase/component': 0.7.0
+ '@firebase/functions': 0.13.1(@firebase/app@0.14.4)
+ '@firebase/functions-types': 0.6.3
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@firebase/app'
+
+ '@firebase/functions-types@0.6.3': {}
+
+ '@firebase/functions@0.13.1(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app': 0.14.4
+ '@firebase/app-check-interop-types': 0.3.3
+ '@firebase/auth-interop-types': 0.2.4
+ '@firebase/component': 0.7.0
+ '@firebase/messaging-interop-types': 0.2.3
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+
+ '@firebase/installations-compat@0.2.19(@firebase/app-compat@0.5.4)(@firebase/app-types@0.9.3)(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app-compat': 0.5.4
+ '@firebase/component': 0.7.0
+ '@firebase/installations': 0.6.19(@firebase/app@0.14.4)
+ '@firebase/installations-types': 0.5.3(@firebase/app-types@0.9.3)
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@firebase/app'
+ - '@firebase/app-types'
+
+ '@firebase/installations-types@0.5.3(@firebase/app-types@0.9.3)':
+ dependencies:
+ '@firebase/app-types': 0.9.3
+
+ '@firebase/installations@0.6.19(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app': 0.14.4
+ '@firebase/component': 0.7.0
+ '@firebase/util': 1.13.0
+ idb: 7.1.1
+ tslib: 2.8.1
+
+ '@firebase/logger@0.5.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@firebase/messaging-compat@0.2.23(@firebase/app-compat@0.5.4)(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app-compat': 0.5.4
+ '@firebase/component': 0.7.0
+ '@firebase/messaging': 0.12.23(@firebase/app@0.14.4)
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@firebase/app'
+
+ '@firebase/messaging-interop-types@0.2.3': {}
+
+ '@firebase/messaging@0.12.23(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app': 0.14.4
+ '@firebase/component': 0.7.0
+ '@firebase/installations': 0.6.19(@firebase/app@0.14.4)
+ '@firebase/messaging-interop-types': 0.2.3
+ '@firebase/util': 1.13.0
+ idb: 7.1.1
+ tslib: 2.8.1
+
+ '@firebase/performance-compat@0.2.22(@firebase/app-compat@0.5.4)(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app-compat': 0.5.4
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/performance': 0.7.9(@firebase/app@0.14.4)
+ '@firebase/performance-types': 0.2.3
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@firebase/app'
+
+ '@firebase/performance-types@0.2.3': {}
+
+ '@firebase/performance@0.7.9(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app': 0.14.4
+ '@firebase/component': 0.7.0
+ '@firebase/installations': 0.6.19(@firebase/app@0.14.4)
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+ web-vitals: 4.2.4
+
+ '@firebase/remote-config-compat@0.2.20(@firebase/app-compat@0.5.4)(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app-compat': 0.5.4
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/remote-config': 0.7.0(@firebase/app@0.14.4)
+ '@firebase/remote-config-types': 0.5.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@firebase/app'
+
+ '@firebase/remote-config-types@0.5.0': {}
+
+ '@firebase/remote-config@0.7.0(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app': 0.14.4
+ '@firebase/component': 0.7.0
+ '@firebase/installations': 0.6.19(@firebase/app@0.14.4)
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+
+ '@firebase/storage-compat@0.4.0(@firebase/app-compat@0.5.4)(@firebase/app-types@0.9.3)(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app-compat': 0.5.4
+ '@firebase/component': 0.7.0
+ '@firebase/storage': 0.14.0(@firebase/app@0.14.4)
+ '@firebase/storage-types': 0.8.3(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@firebase/app'
+ - '@firebase/app-types'
+
+ '@firebase/storage-types@0.8.3(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)':
+ dependencies:
+ '@firebase/app-types': 0.9.3
+ '@firebase/util': 1.13.0
+
+ '@firebase/storage@0.14.0(@firebase/app@0.14.4)':
+ dependencies:
+ '@firebase/app': 0.14.4
+ '@firebase/component': 0.7.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+
+ '@firebase/util@1.13.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@firebase/webchannel-wrapper@1.0.5': {}
+
'@floating-ui/core@1.7.3':
dependencies:
'@floating-ui/utils': 0.2.10
@@ -1067,6 +1765,18 @@ snapshots:
'@floating-ui/utils@0.2.10': {}
+ '@grpc/grpc-js@1.9.15':
+ dependencies:
+ '@grpc/proto-loader': 0.7.15
+ '@types/node': 24.7.1
+
+ '@grpc/proto-loader@0.7.15':
+ dependencies:
+ lodash.camelcase: 4.3.0
+ long: 5.3.2
+ protobufjs: 7.5.4
+ yargs: 17.7.2
+
'@img/colour@1.0.0':
optional: true
@@ -1179,6 +1889,11 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
+ '@nanostores/react@1.0.0(nanostores@1.0.1)(react@19.2.0)':
+ dependencies:
+ nanostores: 1.0.1
+ react: 19.2.0
+
'@next/env@15.5.4': {}
'@next/swc-darwin-arm64@15.5.4':
@@ -1205,6 +1920,29 @@ snapshots:
'@next/swc-win32-x64-msvc@15.5.4':
optional: true
+ '@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':
+ dependencies:
+ '@protobufjs/aspromise': 1.1.2
+ '@protobufjs/inquire': 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': {}
+
'@radix-ui/primitive@1.1.3': {}
'@radix-ui/react-arrow@1.1.7(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
@@ -1608,6 +2346,12 @@ snapshots:
dependencies:
csstype: 3.1.3
+ ansi-regex@5.0.1: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
aria-hidden@1.2.6:
dependencies:
tslib: 2.8.1
@@ -1622,23 +2366,84 @@ snapshots:
client-only@0.0.1: {}
+ cliui@8.0.1:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
clsx@2.1.1: {}
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
csstype@3.1.3: {}
detect-libc@2.1.2: {}
detect-node-es@1.1.0: {}
+ emoji-regex@8.0.0: {}
+
enhanced-resolve@5.18.3:
dependencies:
graceful-fs: 4.2.11
tapable: 2.3.0
+ escalade@3.2.0: {}
+
+ faye-websocket@0.11.4:
+ dependencies:
+ websocket-driver: 0.7.4
+
+ firebase@12.4.0:
+ dependencies:
+ '@firebase/ai': 2.4.0(@firebase/app-types@0.9.3)(@firebase/app@0.14.4)
+ '@firebase/analytics': 0.10.19(@firebase/app@0.14.4)
+ '@firebase/analytics-compat': 0.2.25(@firebase/app-compat@0.5.4)(@firebase/app@0.14.4)
+ '@firebase/app': 0.14.4
+ '@firebase/app-check': 0.11.0(@firebase/app@0.14.4)
+ '@firebase/app-check-compat': 0.4.0(@firebase/app-compat@0.5.4)(@firebase/app@0.14.4)
+ '@firebase/app-compat': 0.5.4
+ '@firebase/app-types': 0.9.3
+ '@firebase/auth': 1.11.0(@firebase/app@0.14.4)
+ '@firebase/auth-compat': 0.6.0(@firebase/app-compat@0.5.4)(@firebase/app-types@0.9.3)(@firebase/app@0.14.4)
+ '@firebase/data-connect': 0.3.11(@firebase/app@0.14.4)
+ '@firebase/database': 1.1.0
+ '@firebase/database-compat': 2.1.0
+ '@firebase/firestore': 4.9.2(@firebase/app@0.14.4)
+ '@firebase/firestore-compat': 0.4.2(@firebase/app-compat@0.5.4)(@firebase/app-types@0.9.3)(@firebase/app@0.14.4)
+ '@firebase/functions': 0.13.1(@firebase/app@0.14.4)
+ '@firebase/functions-compat': 0.4.1(@firebase/app-compat@0.5.4)(@firebase/app@0.14.4)
+ '@firebase/installations': 0.6.19(@firebase/app@0.14.4)
+ '@firebase/installations-compat': 0.2.19(@firebase/app-compat@0.5.4)(@firebase/app-types@0.9.3)(@firebase/app@0.14.4)
+ '@firebase/messaging': 0.12.23(@firebase/app@0.14.4)
+ '@firebase/messaging-compat': 0.2.23(@firebase/app-compat@0.5.4)(@firebase/app@0.14.4)
+ '@firebase/performance': 0.7.9(@firebase/app@0.14.4)
+ '@firebase/performance-compat': 0.2.22(@firebase/app-compat@0.5.4)(@firebase/app@0.14.4)
+ '@firebase/remote-config': 0.7.0(@firebase/app@0.14.4)
+ '@firebase/remote-config-compat': 0.2.20(@firebase/app-compat@0.5.4)(@firebase/app@0.14.4)
+ '@firebase/storage': 0.14.0(@firebase/app@0.14.4)
+ '@firebase/storage-compat': 0.4.0(@firebase/app-compat@0.5.4)(@firebase/app-types@0.9.3)(@firebase/app@0.14.4)
+ '@firebase/util': 1.13.0
+ transitivePeerDependencies:
+ - '@react-native-async-storage/async-storage'
+
+ get-caller-file@2.0.5: {}
+
get-nonce@1.0.1: {}
graceful-fs@4.2.11: {}
+ http-parser-js@0.5.10: {}
+
+ idb@7.1.1: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
jiti@2.6.1: {}
lightningcss-darwin-arm64@1.30.1:
@@ -1686,6 +2491,10 @@ snapshots:
lightningcss-win32-arm64-msvc: 1.30.1
lightningcss-win32-x64-msvc: 1.30.1
+ lodash.camelcase@4.3.0: {}
+
+ long@5.3.2: {}
+
lucide-react@0.545.0(react@19.2.0):
dependencies:
react: 19.2.0
@@ -1702,6 +2511,8 @@ snapshots:
nanoid@3.3.11: {}
+ nanostores@1.0.1: {}
+
next-themes@0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0):
dependencies:
react: 19.2.0
@@ -1744,6 +2555,21 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
+ protobufjs@7.5.4:
+ 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': 24.7.1
+ long: 5.3.2
+
react-dom@19.2.0(react@19.2.0):
dependencies:
react: 19.2.0
@@ -1778,6 +2604,10 @@ snapshots:
react@19.2.0: {}
+ require-directory@2.1.1: {}
+
+ safe-buffer@5.2.1: {}
+
scheduler@0.27.0: {}
semver@7.7.3:
@@ -1815,6 +2645,16 @@ snapshots:
source-map-js@1.2.1: {}
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
styled-jsx@5.1.6(react@19.2.0):
dependencies:
client-only: 0.0.1
@@ -1861,4 +2701,34 @@ snapshots:
dependencies:
react: 19.2.0
+ web-vitals@4.2.4: {}
+
+ websocket-driver@0.7.4:
+ dependencies:
+ http-parser-js: 0.5.10
+ safe-buffer: 5.2.1
+ websocket-extensions: 0.1.4
+
+ websocket-extensions@0.1.4: {}
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ y18n@5.0.8: {}
+
yallist@5.0.0: {}
+
+ yargs-parser@21.1.1: {}
+
+ yargs@17.7.2:
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1