diff --git a/app/_components/BubbleDiv.tsx b/app/_components/BubbleDiv.tsx
index 38f1d87..856af87 100644
--- a/app/_components/BubbleDiv.tsx
+++ b/app/_components/BubbleDiv.tsx
@@ -1,14 +1,33 @@
import Image from "next/image";
import React from "react";
-const BubbleDiv = () => {
+const BubbleDiv = ({
+ children,
+ w = 226,
+ h = 41.77,
+ typo = "typo-16-600",
+ top = 1,
+}: {
+ children?: React.ReactNode;
+ w?: number;
+ h?: number;
+ typo?: string;
+ top?: number;
+}) => {
return (
-
-
- 현재 775명
- 참여중이에요!
+
+
+ {children || (
+ <>
+ 현재 775명
+ 참여중이에요!
+ >
+ )}
-
+
);
};
diff --git a/app/_components/LoginActionSection.tsx b/app/_components/LoginActionSection.tsx
index d18909e..27b061b 100644
--- a/app/_components/LoginActionSection.tsx
+++ b/app/_components/LoginActionSection.tsx
@@ -1,6 +1,5 @@
"use client";
import BubbleDiv from "@/app/_components/BubbleDiv";
-import Button from "@/components/ui/Button";
import { KakaoLoginButton, GoogleLoginButton } from "./SocialButtonList";
import {
Drawer,
@@ -8,6 +7,7 @@ import {
DrawerTitle,
DrawerTrigger,
} from "@/components/ui/drawer";
+import Link from "next/link";
export default function ScreenLoginActionSection() {
const handleKakaoLogin = () => {
@@ -65,12 +65,12 @@ export default function ScreenLoginActionSection() {
혹은
-
+
diff --git a/app/login/_components/LocalLoginIntro.tsx b/app/login/_components/LocalLoginIntro.tsx
new file mode 100644
index 0000000..6e93978
--- /dev/null
+++ b/app/login/_components/LocalLoginIntro.tsx
@@ -0,0 +1,17 @@
+import React from "react";
+
+const LocalLoginIntro = () => {
+ return (
+
+
+ 이메일로
+
코매칭 시작하기
+
+
+ 로그인하거나 새로운 계정을 만들어보세요.
+
+
+ );
+};
+
+export default LocalLoginIntro;
diff --git a/app/login/_components/LoginForm.tsx b/app/login/_components/LoginForm.tsx
new file mode 100644
index 0000000..2d97e91
--- /dev/null
+++ b/app/login/_components/LoginForm.tsx
@@ -0,0 +1,90 @@
+"use client";
+import BubbleDiv from "@/app/_components/BubbleDiv";
+import Button from "@/components/ui/Button";
+import { User } from "lucide-react";
+import React, { useActionState } from "react";
+import Link from "next/link";
+import { loginAction } from "@/lib/actions/loginAction";
+
+const INPUT_STYLE = {
+ background:
+ "linear-gradient(180deg, rgba(248, 248, 248, 0.03) 0%, rgba(248, 248, 248, 0.24) 100%)",
+};
+const INPUT_CLASSNAME =
+ "all:unset box-border w-full border-b border-gray-300 px-2 py-[14.5px] leading-[19px] placeholder:text-[#B3B3B3]";
+
+export const LoginForm = () => {
+ // React 19: useActionState로 폼 상태 및 팬딩 처리 관리
+ const [state, formAction, isPending] = useActionState(loginAction, {
+ success: false,
+ message: "",
+ });
+
+ return (
+
+
+
+
+ 이메일 찾기
+
+ |
+
+ 비밀번호 변경
+
+
+
+
+
+ 아직 계정이 없으신가요?!
+
+
+
+
+ );
+};
diff --git a/app/login/_components/ScreenLocalLoginPage.tsx b/app/login/_components/ScreenLocalLoginPage.tsx
new file mode 100644
index 0000000..f5d5a9f
--- /dev/null
+++ b/app/login/_components/ScreenLocalLoginPage.tsx
@@ -0,0 +1,16 @@
+import React from "react";
+import { BackButton } from "@/components/ui/BackButton";
+import LocalLoginIntro from "./LocalLoginIntro";
+import { LoginForm } from "./LoginForm";
+
+const ScreenLocalLoginPage = () => {
+ return (
+
+
+
+
+
+ );
+};
+
+export default ScreenLocalLoginPage;
diff --git a/app/login/page.tsx b/app/login/page.tsx
new file mode 100644
index 0000000..5821d39
--- /dev/null
+++ b/app/login/page.tsx
@@ -0,0 +1,14 @@
+import React from "react";
+import { Metadata } from "next";
+import ScreenLocalLoginPage from "./_components/ScreenLocalLoginPage";
+
+export const metadata: Metadata = {
+ title: "로그인 | COMAtching",
+ description: "COMAtching 로그인 페이지",
+};
+
+const LoginPage = () => {
+ return ;
+};
+
+export default LoginPage;
diff --git a/components/ui/BackButton.tsx b/components/ui/BackButton.tsx
new file mode 100644
index 0000000..6ab4b30
--- /dev/null
+++ b/components/ui/BackButton.tsx
@@ -0,0 +1,36 @@
+"use client";
+import React from "react";
+import { useRouter } from "next/navigation";
+import { ChevronLeft } from "lucide-react";
+import { cn } from "@/lib/utils";
+
+type BackButtonProps = {
+ variant?: "absolute" | "static";
+ className?: string;
+ onClick?: () => void;
+};
+
+export const BackButton = ({
+ variant = "static",
+ className = "",
+ onClick,
+}: BackButtonProps) => {
+ const router = useRouter();
+ const positionClass = variant === "absolute" ? "absolute left-4 top-2" : "";
+ const handleClick = onClick ?? (() => router.back());
+
+ return (
+
+ );
+};
diff --git a/components/ui/Button.tsx b/components/ui/Button.tsx
index a0f4dda..a741f05 100644
--- a/components/ui/Button.tsx
+++ b/components/ui/Button.tsx
@@ -48,7 +48,7 @@ export default function Button({
disabled={disabled}
className={cn(
// 기본 스타일 (기본 높이 h-12, 너비 w-full, 폰트 등 복구)
- "typo-20-600 text-button-primary-text-default flex h-12 w-full items-center justify-center rounded-[12px] transition-colors duration-100",
+ "typo-20-600 text-button-primary-text-default bg-button-primary flex h-12 w-full items-center justify-center rounded-[16px] transition-colors duration-100",
fixed && "fixed z-50 mx-auto",
disabled ? "cursor-not-allowed" : "cursor-pointer",
// 1. 사용자 className 먼저 적용 (여기서 h-10 등을 넣으면 위 h-12가 덮어씌워짐)
diff --git a/lib/actions/loginAction.ts b/lib/actions/loginAction.ts
new file mode 100644
index 0000000..5260d69
--- /dev/null
+++ b/lib/actions/loginAction.ts
@@ -0,0 +1,31 @@
+"use server";
+
+type LoginState = {
+ success: boolean;
+ message: string;
+};
+
+export async function loginAction(
+ prevState: LoginState,
+ formData: FormData,
+): Promise {
+ const email = formData.get("email");
+ const password = formData.get("password");
+
+ // Mock delay
+ await new Promise((resolve) => setTimeout(resolve, 1000));
+
+ // TODO: 실제 백엔드 API 호출로 교체 필요
+ // const response = await fetch("https://api.comatching.com/login", {
+ // method: "POST",
+ // body: JSON.stringify({ email, password }),
+ // headers: { "Content-Type": "application/json" },
+ // });
+
+ // Mock logic
+ if (email === "test@test.com" && password === "1234") {
+ return { success: true, message: "" };
+ }
+
+ return { success: false, message: "이메일 혹은 비밀번호가 틀립니다" };
+}
diff --git a/lib/firebase.ts b/lib/firebase.ts
new file mode 100644
index 0000000..f0e5f4d
--- /dev/null
+++ b/lib/firebase.ts
@@ -0,0 +1,21 @@
+// Import the functions you need from the SDKs you need
+import { initializeApp } from "firebase/app";
+import { getAnalytics } from "firebase/analytics";
+// TODO: Add SDKs for Firebase products that you want to use
+// https://firebase.google.com/docs/web/setup#available-libraries
+
+// Your web app's Firebase configuration
+// For Firebase JS SDK v7.20.0 and later, measurementId is optional
+const firebaseConfig = {
+ apiKey: "AIzaSyDAE4IwNPU33dniaBSnHA7hjw33ByoQ-14",
+ authDomain: "comatching-59f3e.firebaseapp.com",
+ projectId: "comatching-59f3e",
+ storageBucket: "comatching-59f3e.firebasestorage.app",
+ messagingSenderId: "106298040488",
+ appId: "1:106298040488:web:e4e7b9c54d55dcaab4229d",
+ measurementId: "G-188J563VND",
+};
+
+// Initialize Firebase
+const app = initializeApp(firebaseConfig);
+const analytics = getAnalytics(app);
diff --git a/package.json b/package.json
index e0f24ec..fa1a882 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
"axios": "^1.13.4",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
+ "firebase": "^12.8.0",
"lucide-react": "^0.562.0",
"next": "16.1.3",
"react": "19.2.3",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f788a65..30f3040 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -26,6 +26,9 @@ importers:
clsx:
specifier: ^2.1.1
version: 2.1.1
+ firebase:
+ specifier: ^12.8.0
+ version: 12.8.0
lucide-react:
specifier: ^0.562.0
version: 0.562.0(react@19.2.3)
@@ -208,6 +211,225 @@ packages:
resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@firebase/ai@2.7.0':
+ resolution: {integrity: sha512-PwpCz+TtAMWICM7uQNO0mkSPpUKwrMV4NSwHkbVKDvPKoaQmSlO96vIz+Suw2Ao1EaUUsxYb5LGImHWt/fSnRQ==}
+ 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.7':
+ resolution: {integrity: sha512-MO+jfap8IBZQ+K8L2QCiHObyMgpYHrxo4Hc7iJgfb9hjGRW/z1y6LWVdT9wBBK+VJ7cRP2DjAiWQP+thu53hHA==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/app-types@0.9.3':
+ resolution: {integrity: sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==}
+
+ '@firebase/app@0.14.7':
+ resolution: {integrity: sha512-o3ZfnOx0AWBD5n/36p2zPoB0rDDxQP8H/A60zDLvvfRLtW8b3LfCyV97GKpJaAVV1JMMl/BC89EDzMyzxFZxTw==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/auth-compat@0.6.2':
+ resolution: {integrity: sha512-8UhCzF6pav9bw/eXA8Zy1QAKssPRYEYXaWagie1ewLTwHkXv6bKp/j6/IwzSYQP67sy/BMFXIFaCCsoXzFLr7A==}
+ 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.12.0':
+ resolution: {integrity: sha512-zkvLpsrxynWHk07qGrUDfCSqKf4AvfZGEqJ7mVCtYGjNNDbGE71k0Yn84rg8QEZu4hQw1BC0qDEHzpNVBcSVmA==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ '@firebase/app': 0.x
+ '@react-native-async-storage/async-storage': ^2.2.0
+ 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.12':
+ resolution: {integrity: sha512-baPddcoNLj/+vYo+HSJidJUdr5W4OkhT109c5qhR8T1dJoZcyJpkv/dFpYlw/VJ3dV66vI8GHQFrmAZw/xUS4g==}
+ 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.4':
+ resolution: {integrity: sha512-JvxxIgi+D5v9BecjLA1YomdyF7LA6CXhJuVK10b4GtRrB3m2O2hT1jJWbKYZYHUAjTaajkvnos+4U5VNxqkI2w==}
+ 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.10.0':
+ resolution: {integrity: sha512-fgF6EbpoagGWh5Vwfu/7/jYgBFwUCwTlPNVF/aSjHcoEDRXpRsIqVfAFTp1LD+dWAUcAKEK3h+osk8spMJXtxA==}
+ 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.21':
+ resolution: {integrity: sha512-9+lm0eUycxbu8GO25JfJe4s6R2xlDqlVt0CR6CvN9E6B4AFArEV4qfLoDVRgIEB7nHKwvH2nYRocPWfmjRQTnw==}
+ peerDependencies:
+ '@firebase/app-compat': 0.x
+
+ '@firebase/remote-config-types@0.5.0':
+ resolution: {integrity: sha512-vI3bqLoF14L/GchtgayMiFpZJF+Ao3uR8WCde0XpYNkSokDpAKca2DxvcfeZv7lZUqkUwQPL2wD83d3vQ4vvrg==}
+
+ '@firebase/remote-config@0.8.0':
+ resolution: {integrity: sha512-sJz7C2VACeE257Z/3kY9Ap2WXbFsgsDLfaGfZmmToKAK39ipXxFan+vzB9CSbF6mP7bzjyzEnqPcMXhAnYE6fQ==}
+ 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==}
+
+ '@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
+
'@humanfs/core@0.19.1':
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
engines: {node: '>=18.18.0'}
@@ -450,6 +672,36 @@ packages:
resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
engines: {node: '>=12.4.0'}
+ '@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==}
@@ -926,6 +1178,10 @@ packages:
resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==}
engines: {node: '>=18'}
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
ansi-regex@6.2.2:
resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
engines: {node: '>=12'}
@@ -1068,6 +1324,10 @@ 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'}
@@ -1171,6 +1431,9 @@ packages:
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
@@ -1357,6 +1620,10 @@ packages:
fastq@1.20.1:
resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
+ faye-websocket@0.11.4:
+ resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==}
+ engines: {node: '>=0.8.0'}
+
fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
engines: {node: '>=12.0.0'}
@@ -1378,6 +1645,9 @@ packages:
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
engines: {node: '>=10'}
+ firebase@12.8.0:
+ resolution: {integrity: sha512-S1tCIR3ENecee0tY2cfTHfMkXqkitHfbsvqpCtvsT0Zi9vDB7A4CodAjHfHCjVvu/XtGy1LHLjOasVcF10rCVw==}
+
flat-cache@4.0.1:
resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
engines: {node: '>=16'}
@@ -1420,6 +1690,10 @@ packages:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
get-east-asian-width@1.4.0:
resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==}
engines: {node: '>=18'}
@@ -1503,11 +1777,17 @@ packages:
hermes-parser@0.25.1:
resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
+ http-parser-js@0.5.10:
+ resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==}
+
husky@9.1.7:
resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==}
engines: {node: '>=18'}
hasBin: true
+ idb@7.1.1:
+ resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==}
+
ignore@5.3.2:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
@@ -1571,6 +1851,10 @@ packages:
resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
engines: {node: '>= 0.4'}
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
is-fullwidth-code-point@5.1.0:
resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==}
engines: {node: '>=18'}
@@ -1780,6 +2064,9 @@ packages:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
+ lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+
lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
@@ -1787,6 +2074,9 @@ packages:
resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
engines: {node: '>=18'}
+ long@5.3.2:
+ resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==}
+
loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
@@ -2042,6 +2332,10 @@ packages:
prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ protobufjs@7.5.4:
+ resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==}
+ engines: {node: '>=12.0.0'}
+
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
@@ -2102,6 +2396,10 @@ packages:
resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
engines: {node: '>= 0.4'}
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
@@ -2136,6 +2434,9 @@ packages:
resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
engines: {node: '>=0.4'}
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
safe-push-apply@1.0.0:
resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
engines: {node: '>= 0.4'}
@@ -2219,6 +2520,10 @@ packages:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
string-width@7.2.0:
resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
engines: {node: '>=18'}
@@ -2250,6 +2555,10 @@ packages:
resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
engines: {node: '>= 0.4'}
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
strip-ansi@7.1.2:
resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==}
engines: {node: '>=12'}
@@ -2393,6 +2702,17 @@ packages:
react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc
+ 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'}
+
which-boxed-primitive@1.1.1:
resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
engines: {node: '>= 0.4'}
@@ -2418,10 +2738,18 @@ packages:
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'}
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
wrap-ansi@9.0.2:
resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
engines: {node: '>=18'}
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
@@ -2430,6 +2758,14 @@ packages:
engines: {node: '>= 14.6'}
hasBin: true
+ 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'}
+
yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
@@ -2609,6 +2945,336 @@ snapshots:
'@eslint/core': 0.17.0
levn: 0.4.1
+ '@firebase/ai@2.7.0(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/app': 0.14.7
+ '@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.7)(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/analytics': 0.10.19(@firebase/app@0.14.7)
+ '@firebase/analytics-types': 0.8.3
+ '@firebase/app-compat': 0.5.7
+ '@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.7)':
+ dependencies:
+ '@firebase/app': 0.14.7
+ '@firebase/component': 0.7.0
+ '@firebase/installations': 0.6.19(@firebase/app@0.14.7)
+ '@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.7)(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/app-check': 0.11.0(@firebase/app@0.14.7)
+ '@firebase/app-check-types': 0.5.3
+ '@firebase/app-compat': 0.5.7
+ '@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.7)':
+ dependencies:
+ '@firebase/app': 0.14.7
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+
+ '@firebase/app-compat@0.5.7':
+ dependencies:
+ '@firebase/app': 0.14.7
+ '@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.7':
+ 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.2(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/app-compat': 0.5.7
+ '@firebase/auth': 1.12.0(@firebase/app@0.14.7)
+ '@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.12.0(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/app': 0.14.7
+ '@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.12(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/app': 0.14.7
+ '@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.4(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/app-compat': 0.5.7
+ '@firebase/component': 0.7.0
+ '@firebase/firestore': 4.10.0(@firebase/app@0.14.7)
+ '@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.10.0(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/app': 0.14.7
+ '@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.7)(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/app-compat': 0.5.7
+ '@firebase/component': 0.7.0
+ '@firebase/functions': 0.13.1(@firebase/app@0.14.7)
+ '@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.7)':
+ dependencies:
+ '@firebase/app': 0.14.7
+ '@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.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/app-compat': 0.5.7
+ '@firebase/component': 0.7.0
+ '@firebase/installations': 0.6.19(@firebase/app@0.14.7)
+ '@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.7)':
+ dependencies:
+ '@firebase/app': 0.14.7
+ '@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.7)(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/app-compat': 0.5.7
+ '@firebase/component': 0.7.0
+ '@firebase/messaging': 0.12.23(@firebase/app@0.14.7)
+ '@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.7)':
+ dependencies:
+ '@firebase/app': 0.14.7
+ '@firebase/component': 0.7.0
+ '@firebase/installations': 0.6.19(@firebase/app@0.14.7)
+ '@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.7)(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/app-compat': 0.5.7
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/performance': 0.7.9(@firebase/app@0.14.7)
+ '@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.7)':
+ dependencies:
+ '@firebase/app': 0.14.7
+ '@firebase/component': 0.7.0
+ '@firebase/installations': 0.6.19(@firebase/app@0.14.7)
+ '@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.21(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/app-compat': 0.5.7
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/remote-config': 0.8.0(@firebase/app@0.14.7)
+ '@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.8.0(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/app': 0.14.7
+ '@firebase/component': 0.7.0
+ '@firebase/installations': 0.6.19(@firebase/app@0.14.7)
+ '@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.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)':
+ dependencies:
+ '@firebase/app-compat': 0.5.7
+ '@firebase/component': 0.7.0
+ '@firebase/storage': 0.14.0(@firebase/app@0.14.7)
+ '@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.7)':
+ dependencies:
+ '@firebase/app': 0.14.7
+ '@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': {}
+
+ '@grpc/grpc-js@1.9.15':
+ dependencies:
+ '@grpc/proto-loader': 0.7.15
+ '@types/node': 20.19.30
+
+ '@grpc/proto-loader@0.7.15':
+ dependencies:
+ lodash.camelcase: 4.3.0
+ long: 5.3.2
+ protobufjs: 7.5.4
+ yargs: 17.7.2
+
'@humanfs/core@0.19.1': {}
'@humanfs/node@0.16.7':
@@ -2787,6 +3453,29 @@ snapshots:
'@nolyfill/is-core-module@1.0.39': {}
+ '@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-compose-refs@1.1.2(@types/react@19.2.10)(react@19.2.3)':
@@ -3210,6 +3899,8 @@ snapshots:
dependencies:
environment: 1.1.0
+ ansi-regex@5.0.1: {}
+
ansi-regex@6.2.2: {}
ansi-styles@4.3.0:
@@ -3385,6 +4076,12 @@ 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:
@@ -3475,6 +4172,8 @@ snapshots:
emoji-regex@10.6.0: {}
+ emoji-regex@8.0.0: {}
+
emoji-regex@9.2.2: {}
enhanced-resolve@5.18.4:
@@ -3812,6 +4511,10 @@ snapshots:
dependencies:
reusify: 1.1.0
+ faye-websocket@0.11.4:
+ dependencies:
+ websocket-driver: 0.7.4
+
fdir@6.5.0(picomatch@4.0.3):
optionalDependencies:
picomatch: 4.0.3
@@ -3829,6 +4532,39 @@ snapshots:
locate-path: 6.0.0
path-exists: 4.0.0
+ firebase@12.8.0:
+ dependencies:
+ '@firebase/ai': 2.7.0(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)
+ '@firebase/analytics': 0.10.19(@firebase/app@0.14.7)
+ '@firebase/analytics-compat': 0.2.25(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)
+ '@firebase/app': 0.14.7
+ '@firebase/app-check': 0.11.0(@firebase/app@0.14.7)
+ '@firebase/app-check-compat': 0.4.0(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)
+ '@firebase/app-compat': 0.5.7
+ '@firebase/app-types': 0.9.3
+ '@firebase/auth': 1.12.0(@firebase/app@0.14.7)
+ '@firebase/auth-compat': 0.6.2(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)
+ '@firebase/data-connect': 0.3.12(@firebase/app@0.14.7)
+ '@firebase/database': 1.1.0
+ '@firebase/database-compat': 2.1.0
+ '@firebase/firestore': 4.10.0(@firebase/app@0.14.7)
+ '@firebase/firestore-compat': 0.4.4(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)
+ '@firebase/functions': 0.13.1(@firebase/app@0.14.7)
+ '@firebase/functions-compat': 0.4.1(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)
+ '@firebase/installations': 0.6.19(@firebase/app@0.14.7)
+ '@firebase/installations-compat': 0.2.19(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)
+ '@firebase/messaging': 0.12.23(@firebase/app@0.14.7)
+ '@firebase/messaging-compat': 0.2.23(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)
+ '@firebase/performance': 0.7.9(@firebase/app@0.14.7)
+ '@firebase/performance-compat': 0.2.22(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)
+ '@firebase/remote-config': 0.8.0(@firebase/app@0.14.7)
+ '@firebase/remote-config-compat': 0.2.21(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)
+ '@firebase/storage': 0.14.0(@firebase/app@0.14.7)
+ '@firebase/storage-compat': 0.4.0(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)
+ '@firebase/util': 1.13.0
+ transitivePeerDependencies:
+ - '@react-native-async-storage/async-storage'
+
flat-cache@4.0.1:
dependencies:
flatted: 3.3.3
@@ -3867,6 +4603,8 @@ snapshots:
gensync@1.0.0-beta.2: {}
+ get-caller-file@2.0.5: {}
+
get-east-asian-width@1.4.0: {}
get-intrinsic@1.3.0:
@@ -3948,8 +4686,12 @@ snapshots:
dependencies:
hermes-estree: 0.25.1
+ http-parser-js@0.5.10: {}
+
husky@9.1.7: {}
+ idb@7.1.1: {}
+
ignore@5.3.2: {}
ignore@7.0.5: {}
@@ -4017,6 +4759,8 @@ snapshots:
dependencies:
call-bound: 1.0.4
+ is-fullwidth-code-point@3.0.0: {}
+
is-fullwidth-code-point@5.1.0:
dependencies:
get-east-asian-width: 1.4.0
@@ -4212,6 +4956,8 @@ snapshots:
dependencies:
p-locate: 5.0.0
+ lodash.camelcase@4.3.0: {}
+
lodash.merge@4.6.2: {}
log-update@6.1.0:
@@ -4222,6 +4968,8 @@ snapshots:
strip-ansi: 7.1.2
wrap-ansi: 9.0.2
+ long@5.3.2: {}
+
loose-envify@1.4.0:
dependencies:
js-tokens: 4.0.0
@@ -4417,6 +5165,21 @@ snapshots:
object-assign: 4.1.1
react-is: 16.13.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': 20.19.30
+ long: 5.3.2
+
proxy-from-env@1.1.0: {}
punycode@2.3.1: {}
@@ -4479,6 +5242,8 @@ snapshots:
gopd: 1.2.0
set-function-name: 2.0.2
+ require-directory@2.1.1: {}
+
resolve-from@4.0.0: {}
resolve-pkg-maps@1.0.0: {}
@@ -4516,6 +5281,8 @@ snapshots:
has-symbols: 1.1.0
isarray: 2.0.5
+ safe-buffer@5.2.1: {}
+
safe-push-apply@1.0.0:
dependencies:
es-errors: 1.3.0
@@ -4639,6 +5406,12 @@ snapshots:
string-argv@0.3.2: {}
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
string-width@7.2.0:
dependencies:
emoji-regex: 10.6.0
@@ -4700,6 +5473,10 @@ snapshots:
define-properties: 1.2.1
es-object-atoms: 1.1.1
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
strip-ansi@7.1.2:
dependencies:
ansi-regex: 6.2.2
@@ -4868,6 +5645,16 @@ snapshots:
- '@types/react'
- '@types/react-dom'
+ 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: {}
+
which-boxed-primitive@1.1.1:
dependencies:
is-bigint: 1.1.0
@@ -4915,16 +5702,36 @@ snapshots:
word-wrap@1.2.5: {}
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
wrap-ansi@9.0.2:
dependencies:
ansi-styles: 6.2.3
string-width: 7.2.0
strip-ansi: 7.1.2
+ y18n@5.0.8: {}
+
yallist@3.1.1: {}
yaml@2.8.2: {}
+ 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
+
yocto-queue@0.1.0: {}
zod-validation-error@4.0.2(zod@4.3.6):
diff --git a/public/firebase-messaging-sw.js b/public/firebase-messaging-sw.js
new file mode 100644
index 0000000..992f86c
--- /dev/null
+++ b/public/firebase-messaging-sw.js
@@ -0,0 +1,31 @@
+// public/firebase-messaging-sw.js
+
+// Firebase 라이브러리를 서비스 워커로 불러옵니다 (버전은 호환성을 위해 compat 사용 추천)
+importScripts(
+ "https://www.gstatic.com/firebasejs/9.23.0/firebase-app-compat.js",
+);
+importScripts(
+ "https://www.gstatic.com/firebasejs/9.23.0/firebase-messaging-compat.js",
+);
+
+// 1. 아까 복사한 firebaseConfig 내용을 여기에도 똑같이 한 번 더 넣어줍니다.
+// (서비스 워커는 메인 코드(firebase.ts)랑 별개로 돌아가서 설정이 또 필요해요)
+
+const firebaseConfig = {
+ apiKey: "AIzaSyCmwNjO2gXNy92-FBguQUXvPcQDaVk7lD0",
+ authDomain: "comatching5.firebaseapp.com",
+ projectId: "comatching5",
+ storageBucket: "comatching5.firebasestorage.app",
+ messagingSenderId: "179266935580",
+ appId: "1:179266935580:web:3b56e0f8cf763787f838d9",
+ measurementId: "G-P0WBX4VND7",
+};
+firebase.initializeApp(firebaseConfig);
+
+const messaging = firebase.messaging();
+
+// 백그라운드 알림 처리
+messaging.onBackgroundMessage((payload) => {
+ console.log("[Service Worker] 백그라운드 메시지 수신:", payload);
+ // 브라우저가 알아서 알림을 띄워주지만, 커스텀 하려면 여기에 작성
+});
diff --git a/tsconfig.json b/tsconfig.json
index 3a13f90..5d4792b 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -29,6 +29,6 @@
".next/types/**/*.ts",
".next/dev/types/**/*.ts",
"**/*.mts"
- ],
+, "public/firebase-messaging-sw.js" ],
"exclude": ["node_modules"]
}