diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 3e440464..a4bddae8 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -36,5 +36,11 @@ jobs: - name: Run linter run: npm run lint - - name: Build project + - name: Print environment variables + run: echo "Supabase URL: $NEXT_PUBLIC_SUPABASE_URL, Supabase Key: $NEXT_PUBLIC_SUPABASE_ANON_KEY" + env: + NEXT_PUBLIC_SUPABASE_URL: ${{ secrets.NEXT_PUBLIC_SUPABASE_URL }} + NEXT_PUBLIC_SUPABASE_ANON_KEY: ${{ secrets.NEXT_PUBLIC_SUPABASE_ANON_KEY }} + + - name: Build run: npm run build diff --git a/.storybook/main.ts b/.storybook/main.ts index 09ce1d34..91e73fc0 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -5,7 +5,11 @@ interface StorybookConfig extends BaseStorybookConfig { } const config: StorybookConfig = { - stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], + stories: [ + "../src/**/*.mdx", + "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)", + "../src/app/stories/**/*.stories.@(js|jsx|mjs|ts|tsx)", + ], addons: [ "@storybook/addon-links", "@storybook/addon-essentials", diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 2469e5aa..96332a81 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -4,6 +4,7 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import React from "react"; import { Decorator } from "@storybook/react"; import { useRouter } from "next/navigation"; +import "./storybook.css"; const queryClient = new QueryClient(); diff --git a/.storybook/storybook.css b/.storybook/storybook.css new file mode 100644 index 00000000..97b0236b --- /dev/null +++ b/.storybook/storybook.css @@ -0,0 +1,17 @@ +* { + cursor: auto !important; +} + +html, +body { + cursor: auto !important; +} + +a, +button, +[role="button"], +input, +select, +textarea { + cursor: auto !important; +} diff --git a/package-lock.json b/package-lock.json index 74240ac1..62edc017 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,26 +8,32 @@ "name": "fe9-workroot-project", "version": "1.0.0", "dependencies": { + "@channel.io/channel-web-sdk-loader": "^2.0.0", "@hookform/resolvers": "^3.9.0", "@lottiefiles/react-lottie-player": "^3.5.4", + "@studio-freight/lenis": "^1.0.42", + "@supabase/supabase-js": "^2.47.10", "@tanstack/react-query": "^5.59.19", "axios": "^1.7.7", "date-fns": "^4.1.0", "form-data": "^4.0.1", + "framer-motion": "^11.15.0", + "motion": "^11.15.0", "next": "14.2.15", "next-auth": "^4.24.10", "next-sitemap": "^4.2.3", "prettier": "^3.3.3", "react": "^18", + "react-beautiful-dnd": "^13.1.1", "react-datepicker": "^7.5.0", "react-dom": "^18", "react-hook-form": "^7.53.0", "react-hot-toast": "^2.4.1", "react-icons": "^5.3.0", - "react-intersection-observer": "^9.13.1", + "react-intersection-observer": "^9.14.0", "react-kakao-maps-sdk": "^1.1.27", "react-modal": "^3.16.1", - "react-spinners": "^0.14.1", + "react-responsive": "^10.0.0", "tailwind-merge": "^2.5.4", "zod": "^3.23.8", "zustand": "^5.0.1" @@ -51,6 +57,7 @@ "@tanstack/react-query-devtools": "^5.59.20", "@types/node": "^20", "@types/react": "^18.3.11", + "@types/react-beautiful-dnd": "^13.1.8", "@types/react-datepicker": "^6.2.0", "@types/react-dom": "^18", "@typescript-eslint/eslint-plugin": "^8.9.0", @@ -1920,10 +1927,16 @@ "node": ">=6.9.0" } }, + "node_modules/@channel.io/channel-web-sdk-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@channel.io/channel-web-sdk-loader/-/channel-web-sdk-loader-2.0.0.tgz", + "integrity": "sha512-Z8DDpf2lAaYr/3aAnwQtxg0L8MYWgi/hhGV8c5/SLCV6Fx5Gssj7mfyHHrCVC315B0icmLYqZsXBlmbf6cN8Jg==", + "license": "Apache-2.0" + }, "node_modules/@chromatic-com/storybook": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-3.2.2.tgz", - "integrity": "sha512-xmXt/GW0hAPbzNTrxYuVo43Adrtjue4DeVrsoIIEeJdGaPNNeNf+DHMlJKOBdlHmCnFUoe9R/0mLM9zUp5bKWw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-3.2.3.tgz", + "integrity": "sha512-3+hfANx79kIjP1qrOSLxpoAXOiYUA0S7A0WI0A24kASrv7USFNNW8etR5TjUilMb0LmqKUn3wDwUK2h6aceQ9g==", "dev": true, "license": "MIT", "dependencies": { @@ -1969,9 +1982,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -1986,9 +1999,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -2003,9 +2016,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -2020,9 +2033,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -2037,9 +2050,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -2054,9 +2067,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -2071,9 +2084,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -2088,9 +2101,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -2105,9 +2118,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -2122,9 +2135,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -2139,9 +2152,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -2156,9 +2169,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -2173,9 +2186,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -2190,9 +2203,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -2207,9 +2220,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -2224,9 +2237,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -2241,9 +2254,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -2257,10 +2270,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -2275,9 +2305,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -2292,9 +2322,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -2309,9 +2339,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -2326,9 +2356,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -2343,9 +2373,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -2360,9 +2390,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -4748,9 +4778,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", - "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz", + "integrity": "sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==", "cpu": [ "arm" ], @@ -4762,9 +4792,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", - "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz", + "integrity": "sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==", "cpu": [ "arm64" ], @@ -4776,9 +4806,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", - "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz", + "integrity": "sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==", "cpu": [ "arm64" ], @@ -4790,9 +4820,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", - "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz", + "integrity": "sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==", "cpu": [ "x64" ], @@ -4804,9 +4834,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", - "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz", + "integrity": "sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==", "cpu": [ "arm64" ], @@ -4818,9 +4848,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", - "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz", + "integrity": "sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==", "cpu": [ "x64" ], @@ -4832,9 +4862,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", - "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz", + "integrity": "sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==", "cpu": [ "arm" ], @@ -4846,9 +4876,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", - "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz", + "integrity": "sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==", "cpu": [ "arm" ], @@ -4860,9 +4890,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", - "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz", + "integrity": "sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==", "cpu": [ "arm64" ], @@ -4874,9 +4904,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", - "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz", + "integrity": "sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==", "cpu": [ "arm64" ], @@ -4888,9 +4918,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", - "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz", + "integrity": "sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==", "cpu": [ "loong64" ], @@ -4902,9 +4932,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", - "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz", + "integrity": "sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==", "cpu": [ "ppc64" ], @@ -4916,9 +4946,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", - "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz", + "integrity": "sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==", "cpu": [ "riscv64" ], @@ -4930,9 +4960,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", - "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz", + "integrity": "sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==", "cpu": [ "s390x" ], @@ -4944,9 +4974,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", - "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz", + "integrity": "sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==", "cpu": [ "x64" ], @@ -4958,9 +4988,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", - "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz", + "integrity": "sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==", "cpu": [ "x64" ], @@ -4972,9 +5002,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", - "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz", + "integrity": "sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==", "cpu": [ "arm64" ], @@ -4986,9 +5016,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", - "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz", + "integrity": "sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==", "cpu": [ "ia32" ], @@ -5000,9 +5030,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", - "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz", + "integrity": "sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==", "cpu": [ "x64" ], @@ -6343,6 +6373,87 @@ "url": "https://opencollective.com/storybook" } }, + "node_modules/@studio-freight/lenis": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/@studio-freight/lenis/-/lenis-1.0.42.tgz", + "integrity": "sha512-HJAGf2DeM+BTvKzHv752z6Z7zy6bA643nZM7W88Ft9tnw2GsJSp6iJ+3cekjyMIWH+cloL2U9X82dKXgdU8kPg==", + "deprecated": "'@studio-freight/lenis' has been renamed to just 'lenis', run 'npx @darkroom.engineering/codemods' to update your dependecies accordingly.", + "license": "MIT" + }, + "node_modules/@supabase/auth-js": { + "version": "2.67.3", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.67.3.tgz", + "integrity": "sha512-NJDaW8yXs49xMvWVOkSIr8j46jf+tYHV0wHhrwOaLLMZSFO4g6kKAf+MfzQ2RaD06OCUkUHIzctLAxjTgEVpzw==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/functions-js": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.4.4.tgz", + "integrity": "sha512-WL2p6r4AXNGwop7iwvul2BvOtuJ1YQy8EbOd0dhG1oN1q8el/BIRSFCFnWAMM/vJJlHWLi4ad22sKbKr9mvjoA==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/node-fetch": { + "version": "2.6.15", + "resolved": "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz", + "integrity": "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/@supabase/postgrest-js": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.17.7.tgz", + "integrity": "sha512-aOzOYaTADm/dVTNksyqv9KsbhVa1gHz1Hoxb2ZEF2Ed9H7qlWOfptECQWmkEmrrFjtNaiPrgiSaPECvzI/seDA==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/realtime-js": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.11.2.tgz", + "integrity": "sha512-u/XeuL2Y0QEhXSoIPZZwR6wMXgB+RQbJzG9VErA3VghVt7uRfSVsjeqd7m5GhX3JR6dM/WRmLbVR8URpDWG4+w==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.14", + "@types/phoenix": "^1.5.4", + "@types/ws": "^8.5.10", + "ws": "^8.18.0" + } + }, + "node_modules/@supabase/storage-js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.7.1.tgz", + "integrity": "sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/supabase-js": { + "version": "2.47.10", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.47.10.tgz", + "integrity": "sha512-vJfPF820Ho5WILYHfKiBykDQ1SB9odTHrRZ0JxHfuLMC8GRvv21YLkUZQK7/rSVCkLvD6/ZwMWaOAfdUd//guw==", + "license": "MIT", + "dependencies": { + "@supabase/auth-js": "2.67.3", + "@supabase/functions-js": "2.4.4", + "@supabase/node-fetch": "2.6.15", + "@supabase/postgrest-js": "1.17.7", + "@supabase/realtime-js": "2.11.2", + "@supabase/storage-js": "2.7.1" + } + }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", @@ -6631,9 +6742,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.62.7", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.62.7.tgz", - "integrity": "sha512-fgpfmwatsrUal6V+8EC2cxZIQVl9xvL7qYa03gsdsCy985UTUlS4N+/3hCzwR0PclYDqisca2AqR1BVgJGpUDA==", + "version": "5.62.8", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.62.8.tgz", + "integrity": "sha512-4fV31vDsUyvNGrKIOUNPrZztoyL187bThnoQOvAXEVlZbSiuPONpfx53634MKKdvsDir5NyOGm80ShFaoHS/mw==", "license": "MIT", "funding": { "type": "github", @@ -6652,12 +6763,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.62.7", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.62.7.tgz", - "integrity": "sha512-+xCtP4UAFDTlRTYyEjLx0sRtWyr5GIk7TZjZwBu4YaNahi3Rt2oMyRqfpfVrtwsqY2sayP4iXVCwmC+ZqqFmuw==", + "version": "5.62.8", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.62.8.tgz", + "integrity": "sha512-8TUstKxF/fysHonZsWg/hnlDVgasTdHx6Q+f1/s/oPKJBJbKUWPZEHwLTMOZgrZuroLMiqYKJ9w69Abm8mWP0Q==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.62.7" + "@tanstack/query-core": "5.62.8" }, "funding": { "type": "github", @@ -6668,9 +6779,9 @@ } }, "node_modules/@tanstack/react-query-devtools": { - "version": "5.62.7", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.62.7.tgz", - "integrity": "sha512-wxXsdTZJRs//hMtJMU5aNlUaTclRFPqLvDNeWbRj8YpGD3aoo4zyu53W55W2DY16+ycg3fti21uCW4N9oyj91w==", + "version": "5.62.8", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.62.8.tgz", + "integrity": "sha512-SwjXjQTRONd9WPeKVQQ9framG7YNqPV8PS+EGNVNXAyz2XThulMRCvZnh2+3DggnjcYM7YcpnuoZ4RH7q13p0g==", "dev": true, "license": "MIT", "dependencies": { @@ -6681,7 +6792,7 @@ "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/react-query": "^5.62.7", + "@tanstack/react-query": "^5.62.8", "react": "^18 || ^19" } }, @@ -6906,6 +7017,16 @@ "@types/send": "*" } }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", + "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -6952,7 +7073,6 @@ "version": "20.17.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.19.2" @@ -6965,11 +7085,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/phoenix": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.6.tgz", + "integrity": "sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==", + "license": "MIT" + }, "node_modules/@types/prop-types": { "version": "15.7.14", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "devOptional": true, "license": "MIT" }, "node_modules/@types/qs": { @@ -6987,16 +7112,25 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.17.tgz", - "integrity": "sha512-opAQ5no6LqJNo9TqnxBKsgnkIYHozW9KSTlFVoSUJYh1Fl/sswkEoqIugRSm7tbh6pABtYjGAjW+GOS23j8qbw==", - "devOptional": true, + "version": "18.3.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", + "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, + "node_modules/@types/react-beautiful-dnd": { + "version": "13.1.8", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.8.tgz", + "integrity": "sha512-E3TyFsro9pQuK4r8S/OL6G99eq7p8v29sX0PM7oT8Z+PJfZvSQTx4zTQbUJ+QZXioAF0e7TGBEcA1XhYhCweyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-datepicker": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/@types/react-datepicker/-/react-datepicker-6.2.0.tgz", @@ -7030,6 +7164,18 @@ "@types/react": "^18.0.0" } }, + "node_modules/@types/react-redux": { + "version": "7.1.34", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", + "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, "node_modules/@types/resolve": { "version": "1.20.6", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", @@ -7074,6 +7220,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/ws": { + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz", @@ -7823,14 +7978,14 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -8756,9 +8911,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001689", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001689.tgz", - "integrity": "sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==", + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", "funding": [ { "type": "opencollective", @@ -9235,6 +9390,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "license": "MIT", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, "node_modules/css-loader": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", @@ -9271,6 +9435,12 @@ } } }, + "node_modules/css-mediaquery": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", + "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==", + "license": "BSD" + }, "node_modules/css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", @@ -9385,15 +9555,15 @@ "license": "BSD-2-Clause" }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9403,31 +9573,31 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -9812,9 +9982,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.74", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.74.tgz", - "integrity": "sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==", + "version": "1.5.75", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz", + "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==", "dev": true, "license": "ISC" }, @@ -9871,9 +10041,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", + "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9928,28 +10098,28 @@ } }, "node_modules/es-abstract": { - "version": "1.23.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.6.tgz", - "integrity": "sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==", + "version": "1.23.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.7.tgz", + "integrity": "sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==", "dev": true, "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", + "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.7", + "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.2.6", - "get-symbol-description": "^1.0.2", + "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", @@ -9957,31 +10127,30 @@ "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.4", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.3", + "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", - "is-typed-array": "^1.1.13", + "is-typed-array": "^1.1.15", "is-weakref": "^1.1.0", - "math-intrinsics": "^1.0.0", + "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", + "object.assign": "^4.1.7", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", "safe-regex-test": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.3", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.16" + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" }, "engines": { "node": ">= 0.4" @@ -10011,27 +10180,28 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", - "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.3", - "safe-array-concat": "^1.1.2" + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -10101,9 +10271,9 @@ } }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -10114,30 +10284,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/esbuild-register": { @@ -11300,6 +11471,33 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/framer-motion": { + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.15.0.tgz", + "integrity": "sha512-MLk8IvZntxOMg7lDBLw2qgTHHv664bYoYmnFTmE0Gm/FW67aOJk0WM3ctMcG+Xhcv+vh5uyyXwxvxhSeJzSe+w==", + "license": "MIT", + "dependencies": { + "motion-dom": "^11.14.3", + "motion-utils": "^11.14.3", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fs-extra": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", @@ -11355,13 +11553,14 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.7.tgz", - "integrity": "sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", @@ -11430,15 +11629,15 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -11566,11 +11765,14 @@ "license": "MIT" }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11703,6 +11905,21 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/html-entities": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", @@ -11812,6 +12029,12 @@ "dev": true, "license": "MIT" }, + "node_modules/hyphenate-style-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", + "license": "BSD-3-Clause" + }, "node_modules/icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -11857,9 +12080,9 @@ } }, "node_modules/image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.0.tgz", + "integrity": "sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==", "dev": true, "license": "MIT", "dependencies": { @@ -12071,9 +12294,9 @@ } }, "node_modules/is-core-module": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", - "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { @@ -12230,19 +12453,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -12312,13 +12522,13 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -12363,13 +12573,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -12520,9 +12730,9 @@ } }, "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", "bin": { @@ -12875,10 +13085,19 @@ "dev": true, "license": "MIT" }, + "node_modules/matchmediaquery": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.4.2.tgz", + "integrity": "sha512-wrZpoT50ehYOudhDjt/YvUJc6eUzcdFPdmbizfgvswCKNHD1/OBOHYJpHie+HXpu6bSkEGieFMYk6VuutaiRfA==", + "license": "MIT", + "dependencies": { + "css-mediaquery": "^0.1.2" + } + }, "node_modules/math-intrinsics": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.0.0.tgz", - "integrity": "sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", "engines": { @@ -12917,6 +13136,12 @@ "node": ">= 4.0.0" } }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, "node_modules/memoizerific": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", @@ -13069,6 +13294,44 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/motion": { + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/motion/-/motion-11.15.0.tgz", + "integrity": "sha512-iZ7dwADQJWGsqsSkBhNHdI2LyYWU+hA1Nhy357wCLZq1yHxGImgt3l7Yv0HT/WOskcYDq9nxdedyl4zUv7UFFw==", + "license": "MIT", + "dependencies": { + "framer-motion": "^11.15.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "11.14.3", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.14.3.tgz", + "integrity": "sha512-lW+D2wBy5vxLJi6aCP0xyxTxlTfiu+b+zcpVbGVFUxotwThqhdpPRSmX8xztAgtZMPMeU0WGVn/k1w4I+TbPqA==", + "license": "MIT" + }, + "node_modules/motion-utils": { + "version": "11.14.3", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.14.3.tgz", + "integrity": "sha512-Xg+8xnqIJTpr0L/cidfTTBFkvRw26ZtGGuIhA94J9PQ2p4mEa06Xx7QVYZH0BP+EpMSaDlu+q0I0mmvwADPsaQ==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -13239,9 +13502,9 @@ } }, "node_modules/next-sitemap/node_modules/@next/env": { - "version": "13.5.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.7.tgz", - "integrity": "sha512-uVuRqoj28Ys/AI/5gVEgRAISd0KWI0HRjOO1CTpNgmX3ZsHb5mdn14Y59yk0IxizXdo7ZjsI2S7qbWnO+GNBcA==", + "version": "13.5.8", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.8.tgz", + "integrity": "sha512-YmiG58BqyZ2FjrF2+5uZExL2BrLr8RTQzLXNDJ8pJr0O+rPlOeDPXp1p1/4OrR3avDidzZo3D8QO2cuDv1KCkw==", "license": "MIT" }, "node_modules/next/node_modules/postcss": { @@ -13458,15 +13721,17 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -13526,13 +13791,14 @@ } }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -14266,9 +14532,9 @@ "license": "MIT" }, "node_modules/preact": { - "version": "10.25.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.2.tgz", - "integrity": "sha512-GEts1EH3oMnqdOIeXhlbBSddZ9nrINd070WBOiPO2ous1orrKGUM4SMDbwyjSWD1iMS2dBvaDjAa5qUhz3TXqw==", + "version": "10.25.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.3.tgz", + "integrity": "sha512-dzQmIFtM970z+fP9ziQ3yG4e3ULIbwZzJ734vaMVUTaKQ2+Ru1Ou/gjshOYVHCcd1rpAelC6ngjvjDXph98unQ==", "license": "MIT", "funding": { "type": "opencollective", @@ -14576,6 +14842,12 @@ ], "license": "MIT" }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", + "license": "MIT" + }, "node_modules/ramda": { "version": "0.29.0", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz", @@ -14630,6 +14902,26 @@ "node": ">=0.10.0" } }, + "node_modules/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "deprecated": "react-beautiful-dnd is now deprecated. Context and options: https://github.com/atlassian/react-beautiful-dnd/issues/2672", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-confetti": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.1.0.tgz", @@ -14718,9 +15010,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.54.1", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.1.tgz", - "integrity": "sha512-PUNzFwQeQ5oHiiTUO7GO/EJXGEtuun2Y1A59rLnZBBj+vNEOWt/3ERTiG1/zt7dVeJEM+4vDX/7XQ/qanuvPMg==", + "version": "7.54.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.2.tgz", + "integrity": "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -14777,7 +15069,6 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, "license": "MIT" }, "node_modules/react-kakao-maps-sdk": { @@ -14801,9 +15092,9 @@ "license": "MIT" }, "node_modules/react-modal": { - "version": "3.16.1", - "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", - "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", + "version": "3.16.3", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.3.tgz", + "integrity": "sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw==", "license": "MIT", "dependencies": { "exenv": "^1.2.0", @@ -14811,12 +15102,34 @@ "react-lifecycles-compat": "^3.0.0", "warning": "^4.0.3" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" }, "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", - "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18" + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } } }, "node_modules/react-refresh": { @@ -14878,14 +15191,22 @@ } } }, - "node_modules/react-spinners": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.14.1.tgz", - "integrity": "sha512-2Izq+qgQ08HTofCVEdcAQCXFEYfqTDdfeDQJeo/HHQiQJD4imOicNLhkfN2eh1NYEWVOX4D9ok2lhuDB0z3Aag==", + "node_modules/react-responsive": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-10.0.0.tgz", + "integrity": "sha512-N6/UiRLGQyGUqrarhBZmrSmHi2FXSD++N5VbSKsBBvWfG0ZV7asvUBluSv5lSzdMyEVjzZ6Y8DL4OHABiztDOg==", "license": "MIT", + "dependencies": { + "hyphenate-style-name": "^1.0.0", + "matchmediaquery": "^0.4.2", + "prop-types": "^15.6.1", + "shallow-equal": "^3.1.0" + }, + "engines": { + "node": ">=14" + }, "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + "react": ">=16.8.0" } }, "node_modules/react-style-singleton": { @@ -14922,9 +15243,9 @@ } }, "node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.6.0.tgz", + "integrity": "sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw==", "dev": true, "license": "MIT", "dependencies": { @@ -15018,21 +15339,30 @@ "node": ">=8" } }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, "node_modules/reflect.getprototypeof": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz", - "integrity": "sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", + "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "dunder-proto": "^1.0.0", - "es-abstract": "^1.23.5", + "dunder-proto": "^1.0.1", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", + "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", - "which-builtin-type": "^1.2.0" + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -15202,9 +15532,9 @@ } }, "node_modules/resolve": { - "version": "1.22.9", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.9.tgz", - "integrity": "sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { @@ -15215,6 +15545,9 @@ "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -15373,9 +15706,9 @@ } }, "node_modules/rollup": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", - "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz", + "integrity": "sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==", "dev": true, "license": "MIT", "dependencies": { @@ -15389,25 +15722,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.28.1", - "@rollup/rollup-android-arm64": "4.28.1", - "@rollup/rollup-darwin-arm64": "4.28.1", - "@rollup/rollup-darwin-x64": "4.28.1", - "@rollup/rollup-freebsd-arm64": "4.28.1", - "@rollup/rollup-freebsd-x64": "4.28.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", - "@rollup/rollup-linux-arm-musleabihf": "4.28.1", - "@rollup/rollup-linux-arm64-gnu": "4.28.1", - "@rollup/rollup-linux-arm64-musl": "4.28.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", - "@rollup/rollup-linux-riscv64-gnu": "4.28.1", - "@rollup/rollup-linux-s390x-gnu": "4.28.1", - "@rollup/rollup-linux-x64-gnu": "4.28.1", - "@rollup/rollup-linux-x64-musl": "4.28.1", - "@rollup/rollup-win32-arm64-msvc": "4.28.1", - "@rollup/rollup-win32-ia32-msvc": "4.28.1", - "@rollup/rollup-win32-x64-msvc": "4.28.1", + "@rollup/rollup-android-arm-eabi": "4.29.1", + "@rollup/rollup-android-arm64": "4.29.1", + "@rollup/rollup-darwin-arm64": "4.29.1", + "@rollup/rollup-darwin-x64": "4.29.1", + "@rollup/rollup-freebsd-arm64": "4.29.1", + "@rollup/rollup-freebsd-x64": "4.29.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.29.1", + "@rollup/rollup-linux-arm-musleabihf": "4.29.1", + "@rollup/rollup-linux-arm64-gnu": "4.29.1", + "@rollup/rollup-linux-arm64-musl": "4.29.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.29.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1", + "@rollup/rollup-linux-riscv64-gnu": "4.29.1", + "@rollup/rollup-linux-s390x-gnu": "4.29.1", + "@rollup/rollup-linux-x64-gnu": "4.29.1", + "@rollup/rollup-linux-x64-musl": "4.29.1", + "@rollup/rollup-win32-arm64-msvc": "4.29.1", + "@rollup/rollup-win32-ia32-msvc": "4.29.1", + "@rollup/rollup-win32-x64-msvc": "4.29.1", "fsevents": "~2.3.2" } }, @@ -15675,6 +16008,12 @@ "sha.js": "bin.js" } }, + "node_modules/shallow-equal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-3.1.0.tgz", + "integrity": "sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg==", + "license": "MIT" + }, "node_modules/sharp": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", @@ -16088,24 +16427,25 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -16513,9 +16853,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.16", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.16.tgz", - "integrity": "sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==", + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", "dev": true, "license": "MIT", "dependencies": { @@ -16702,7 +17042,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "dev": true, "license": "MIT" }, "node_modules/tinyrainbow": { @@ -16737,6 +17076,12 @@ "node": ">=8.0" } }, + "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/ts-api-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", @@ -16860,32 +17205,32 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -16895,19 +17240,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", - "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "reflect.getprototypeof": "^1.0.6" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -16974,7 +17319,6 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -17108,9 +17452,9 @@ "license": "MIT" }, "node_modules/use-callback-ref": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", - "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", "dev": true, "license": "MIT", "dependencies": { @@ -17120,8 +17464,8 @@ "node": ">=10" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -17129,6 +17473,15 @@ } } }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/use-resize-observer": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz", @@ -17728,6 +18081,12 @@ "node": ">=10.13.0" } }, + "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.97.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", @@ -17889,6 +18248,16 @@ "url": "https://opencollective.com/webpack" } }, + "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", @@ -17973,16 +18342,17 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", - "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "for-each": "^0.3.3", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -18098,7 +18468,6 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index 02cc1b90..a54f5992 100644 --- a/package.json +++ b/package.json @@ -14,25 +14,32 @@ "postbuild": "next-sitemap" }, "dependencies": { + "@channel.io/channel-web-sdk-loader": "^2.0.0", "@hookform/resolvers": "^3.9.0", "@lottiefiles/react-lottie-player": "^3.5.4", + "@studio-freight/lenis": "^1.0.42", + "@supabase/supabase-js": "^2.47.10", "@tanstack/react-query": "^5.59.19", "axios": "^1.7.7", "date-fns": "^4.1.0", "form-data": "^4.0.1", + "framer-motion": "^11.15.0", + "motion": "^11.15.0", "next": "14.2.15", "next-auth": "^4.24.10", "next-sitemap": "^4.2.3", "prettier": "^3.3.3", "react": "^18", + "react-beautiful-dnd": "^13.1.1", "react-datepicker": "^7.5.0", "react-dom": "^18", "react-hook-form": "^7.53.0", "react-hot-toast": "^2.4.1", "react-icons": "^5.3.0", - "react-intersection-observer": "^9.13.1", + "react-intersection-observer": "^9.14.0", "react-kakao-maps-sdk": "^1.1.27", "react-modal": "^3.16.1", + "react-responsive": "^10.0.0", "tailwind-merge": "^2.5.4", "zod": "^3.23.8", "zustand": "^5.0.1" @@ -56,6 +63,7 @@ "@tanstack/react-query-devtools": "^5.59.20", "@types/node": "^20", "@types/react": "^18.3.11", + "@types/react-beautiful-dnd": "^13.1.8", "@types/react-datepicker": "^6.2.0", "@types/react-dom": "^18", "@typescript-eslint/eslint-plugin": "^8.9.0", diff --git a/public/android-icon-192x192.png b/public/android-icon-192x192.png index cf453b6b..b1d19f64 100644 Binary files a/public/android-icon-192x192.png and b/public/android-icon-192x192.png differ diff --git a/public/apple-icon-180x180.png b/public/apple-icon-180x180.png index e93ec316..59b24195 100644 Binary files a/public/apple-icon-180x180.png and b/public/apple-icon-180x180.png differ diff --git a/public/facebook-icon-1024x1024.png b/public/facebook-icon-1024x1024.png new file mode 100644 index 00000000..72fa0f42 Binary files /dev/null and b/public/facebook-icon-1024x1024.png differ diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png index 29226b66..45239678 100644 Binary files a/public/favicon-16x16.png and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png index 414e3dad..760b18fc 100644 Binary files a/public/favicon-32x32.png and b/public/favicon-32x32.png differ diff --git a/public/favicon.ico b/public/favicon.ico index af64487a..291c2b94 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/favicon.svg b/public/favicon.svg deleted file mode 100644 index 7e69ad2b..00000000 --- a/public/favicon.svg +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/public/images/land/2.webp b/public/images/land/2.webp deleted file mode 100644 index 56f950bb..00000000 Binary files a/public/images/land/2.webp and /dev/null differ diff --git a/public/images/land/concept.jpg b/public/images/land/concept.jpg new file mode 100644 index 00000000..13588a73 Binary files /dev/null and b/public/images/land/concept.jpg differ diff --git a/public/images/land/s2.jpg b/public/images/land/s2.jpg new file mode 100644 index 00000000..86eb7dd4 Binary files /dev/null and b/public/images/land/s2.jpg differ diff --git a/public/images/land/s3.jpg b/public/images/land/s3.jpg new file mode 100644 index 00000000..fcf17e15 Binary files /dev/null and b/public/images/land/s3.jpg differ diff --git a/public/images/land/s4.jpg b/public/images/land/s4.jpg new file mode 100644 index 00000000..9ffee162 Binary files /dev/null and b/public/images/land/s4.jpg differ diff --git a/public/images/land/step1.jpg b/public/images/land/step1.jpg index f2e1c78d..96314234 100644 Binary files a/public/images/land/step1.jpg and b/public/images/land/step1.jpg differ diff --git a/public/images/land/step2-1.jpg b/public/images/land/step2-1.jpg new file mode 100644 index 00000000..60fffed8 Binary files /dev/null and b/public/images/land/step2-1.jpg differ diff --git a/public/images/land/step2-2.jpg b/public/images/land/step2-2.jpg new file mode 100644 index 00000000..0770538f Binary files /dev/null and b/public/images/land/step2-2.jpg differ diff --git a/public/images/land/step2.jpg b/public/images/land/step2.jpg deleted file mode 100644 index 026a8d65..00000000 Binary files a/public/images/land/step2.jpg and /dev/null differ diff --git a/public/images/land/step3-1.jpg b/public/images/land/step3-1.jpg new file mode 100644 index 00000000..b7bae13e Binary files /dev/null and b/public/images/land/step3-1.jpg differ diff --git a/public/images/land/step3-2.jpg b/public/images/land/step3-2.jpg new file mode 100644 index 00000000..619a7823 Binary files /dev/null and b/public/images/land/step3-2.jpg differ diff --git a/public/images/land/step3.jpg b/public/images/land/step3.jpg deleted file mode 100644 index 15d10109..00000000 Binary files a/public/images/land/step3.jpg and /dev/null differ diff --git a/public/images/land/step4.jpg b/public/images/land/step4.jpg deleted file mode 100644 index 3d46e066..00000000 Binary files a/public/images/land/step4.jpg and /dev/null differ diff --git a/public/logo.png b/public/logo.png index 1d14f98e..b3f97a5c 100644 Binary files a/public/logo.png and b/public/logo.png differ diff --git a/public/sitemap.xml b/public/sitemap.xml index 33850aec..536c613e 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -1,17 +1,19 @@ -https://www.workroot.life/signup/applicant2024-12-19T07:07:49.069Zdaily0.7 -https://www.workroot.life/addform2024-12-19T07:07:49.071Zdaily0.7 -https://www.workroot.life/login2024-12-19T07:07:49.071Zdaily0.7 -https://www.workroot.life/signup/owner2024-12-19T07:07:49.071Zdaily0.7 -https://www.workroot.life2024-12-19T07:07:49.071Zdaily0.7 -https://www.workroot.life/signup2024-12-19T07:07:49.071Zdaily0.7 -https://www.workroot.life/my-workform/applicant2024-12-19T07:07:49.071Zdaily0.7 -https://www.workroot.life/my-workform/owner2024-12-19T07:07:49.071Zdaily0.7 -https://www.workroot.life/my-workform2024-12-19T07:07:49.071Zdaily0.7 -https://www.workroot.life/work-list2024-12-19T07:07:49.071Zdaily0.7 -https://www.workroot.life/work-talk/add2024-12-19T07:07:49.071Zdaily0.7 -https://www.workroot.life/mypage2024-12-19T07:07:49.071Zdaily0.7 -https://www.workroot.life/work-talk2024-12-19T07:07:49.071Zdaily0.7 -https://www.workroot.life/stories/design-system/pages/albaList2024-12-19T07:07:49.071Zdaily0.7 +https://www.workroot.life/login2024-12-23T05:31:01.038Zdaily0.7 +https://www.workroot.life/signup/owner2024-12-23T05:31:01.040Zdaily0.7 +https://www.workroot.life/signup/applicant2024-12-23T05:31:01.040Zdaily0.7 +https://www.workroot.life/signup2024-12-23T05:31:01.040Zdaily0.7 +https://www.workroot.life2024-12-23T05:31:01.040Zdaily0.7 +https://www.workroot.life/my-workform/applicant2024-12-23T05:31:01.040Zdaily0.7 +https://www.workroot.life/my-workform/owner2024-12-23T05:31:01.040Zdaily0.7 +https://www.workroot.life/my-workform2024-12-23T05:31:01.040Zdaily0.7 +https://www.workroot.life/mypage2024-12-23T05:31:01.040Zdaily0.7 +https://www.workroot.life/addform2024-12-23T05:31:01.040Zdaily0.7 +https://www.workroot.life/work-list2024-12-23T05:31:01.040Zdaily0.7 +https://www.workroot.life/work-talk/add2024-12-23T05:31:01.040Zdaily0.7 +https://www.workroot.life/work-talk2024-12-23T05:31:01.040Zdaily0.7 +https://www.workroot.life/auth/callback2024-12-23T05:31:01.040Zdaily0.7 +https://www.workroot.life/stories/design-system/pages/albaList2024-12-23T05:31:01.040Zdaily0.7 +https://www.workroot.life/privacy2024-12-23T05:31:01.040Zdaily0.7 \ No newline at end of file diff --git a/src/app/(auth)/login/layout.tsx b/src/app/(auth)/login/layout.tsx index 2039a040..d663f5ac 100644 --- a/src/app/(auth)/login/layout.tsx +++ b/src/app/(auth)/login/layout.tsx @@ -1,4 +1,4 @@ -import Background from "../signup/(layout)/component/Background"; +import Background from "@/app/components/layout/auth/Background"; export default function AuthLayout({ children }: { children: React.ReactNode }) { return ( diff --git a/src/app/(auth)/login/page.tsx b/src/app/(auth)/login/page.tsx index 8cec3242..ecdbd3d9 100644 --- a/src/app/(auth)/login/page.tsx +++ b/src/app/(auth)/login/page.tsx @@ -1,4 +1,5 @@ "use client"; + import Button from "@/app/components/button/default/Button"; import DotLoadingSpinner from "@/app/components/loading-spinner/DotLoadingSpinner"; import { useLogin } from "@/hooks/queries/auth/useLogin"; @@ -9,10 +10,16 @@ import Link from "next/link"; import { useForm } from "react-hook-form"; import { UserRole, userRoles } from "@/constants/userRoles"; import AuthInput from "@/app/components/input/text/AuthInput"; +import { signInWithProvider } from "@/lib/supabaseUtils"; +import { toast } from "react-hot-toast"; +import { useState } from "react"; +import { OAuthProvider, oauthProviders } from "@/constants/oauthProviders"; export default function LoginPage() { // 로그인 훅과 로딩 상태 관리 const { login, isPending } = useLogin(); + const [isSocialLogin, setIsSocialLogin] = useState(false); + const [currentProvider, setCurrentProvider] = useState(oauthProviders.GOOGLE); // 폼 유효성 검사 및 상태 관리 const { @@ -20,12 +27,14 @@ export default function LoginPage() { handleSubmit, formState: { errors }, setValue, + reset, } = useForm({ resolver: zodResolver(loginSchema), }); // 일반 로그인 제출 핸들러 const onSubmit = (data: LoginSchema) => { + setIsSocialLogin(false); login(data); }; @@ -53,6 +62,24 @@ export default function LoginPage() { handleSubmit((data) => login(data))(); }; + // 소셜 로그인 핸들러 + const handleSocialLogin = async (provider: OAuthProvider) => { + try { + setIsSocialLogin(true); + setCurrentProvider(provider); + reset({ + email: "", + password: "", + }); + + // 소셜 로그인 + await signInWithProvider(provider); + } catch (error) { + console.error(`${provider} login failed:`, error); + toast.error(`${provider} 로그인에 실패했습니다.`); + } + }; + return ( <>
@@ -64,6 +91,8 @@ export default function LoginPage() {

+ + {/* 일반 로그인 폼 */}
@@ -72,7 +101,7 @@ export default function LoginPage() { type="email" name="email" placeholder="이메일" - errormessage={errors.email?.message} + errormessage={!isSocialLogin ? errors.email?.message : undefined} />
@@ -81,7 +110,7 @@ export default function LoginPage() { type="password" name="password" placeholder="비밀번호" - errormessage={errors.password?.message} + errormessage={!isSocialLogin ? errors.password?.message : undefined} />
@@ -91,27 +120,51 @@ export default function LoginPage() { {isPending ? : "로그인"} + + + {/* 소셜 로그인 섹션을 폼 밖으로 이동 */} +

SNS 계정으로 로그인하기
- { + setIsSocialLogin(true); + handleSocialLogin(oauthProviders.GOOGLE); + }} + className="flex items-center justify-center p-2 transition-transform hover:scale-105 focus:outline-none active:scale-95" > - 구글 로그인 - - + 구글 로그인 +
+ +
+ + + {/* 테스트 계정 섹션도 폼 밖으로 이동 */} +

테스트 계정으로 로그인하기 @@ -137,7 +190,7 @@ export default function LoginPage() { 사장님
- +
); } diff --git a/src/app/(auth)/signup/(layout)/applicant/page.tsx b/src/app/(auth)/signup/(layout)/applicant/page.tsx index 68ed0364..43e13965 100644 --- a/src/app/(auth)/signup/(layout)/applicant/page.tsx +++ b/src/app/(auth)/signup/(layout)/applicant/page.tsx @@ -6,13 +6,13 @@ import { userRoles } from "@/constants/userRoles"; import { zodResolver } from "@hookform/resolvers/zod"; import Link from "next/link"; import { useForm } from "react-hook-form"; -import Image from "next/image"; import DotLoadingSpinner from "@/app/components/loading-spinner/DotLoadingSpinner"; import Button from "@/app/components/button/default/Button"; import AuthInput from "@/app/components/input/text/AuthInput"; export default function ApplicantSignupPage() { const { signup, isPending } = useSignup(); + const { register, handleSubmit, @@ -22,11 +22,14 @@ export default function ApplicantSignupPage() { defaultValues: { role: userRoles.APPLICANT, phoneNumber: "", + email: "", + nickname: "", }, mode: "all", }); const onSubmit = (data: SignupSchema) => { + // 지원자 회원가입 signup(data); }; @@ -104,27 +107,6 @@ export default function ApplicantSignupPage() { {isPending ? : "회원가입"} -
-
- SNS 계정으로 회원가입하기 -
-
-
- - 구글 회원가입 - - - 카카오 회원가입 - -
); diff --git a/src/app/(auth)/signup/(layout)/layout.tsx b/src/app/(auth)/signup/(layout)/layout.tsx index 35f99b8e..bcaae355 100644 --- a/src/app/(auth)/signup/(layout)/layout.tsx +++ b/src/app/(auth)/signup/(layout)/layout.tsx @@ -1,6 +1,8 @@ -import Background from "./component/Background"; +"use client"; -export default function AuthLayout({ children }: { children: React.ReactNode }) { +import Background from "@/app/components/layout/auth/Background"; + +export default function SignupLayout({ children }: { children: React.ReactNode }) { return (
{children}
diff --git a/src/app/(auth)/signup/(layout)/owner/page.tsx b/src/app/(auth)/signup/(layout)/owner/page.tsx index a1622b72..da480334 100644 --- a/src/app/(auth)/signup/(layout)/owner/page.tsx +++ b/src/app/(auth)/signup/(layout)/owner/page.tsx @@ -6,13 +6,13 @@ import { userRoles } from "@/constants/userRoles"; import { zodResolver } from "@hookform/resolvers/zod"; import Link from "next/link"; import { useForm } from "react-hook-form"; -import Image from "next/image"; import DotLoadingSpinner from "@/app/components/loading-spinner/DotLoadingSpinner"; import Button from "@/app/components/button/default/Button"; import AuthInput from "@/app/components/input/text/AuthInput"; export default function OwnerSignupPage() { const { signup, isPending } = useSignup(); + const { register, handleSubmit, @@ -29,6 +29,7 @@ export default function OwnerSignupPage() { }); const onSubmit = (data: SignupSchema) => { + // 사장님 회원가입 signup(data); }; @@ -129,22 +130,6 @@ export default function OwnerSignupPage() { SNS 계정으로 회원가입하기
-
- - 구글 회원가입 - - - 카카오 회원가입 - -
); diff --git a/src/app/(home)/page.tsx b/src/app/(home)/page.tsx index 79143828..13146e7f 100644 --- a/src/app/(home)/page.tsx +++ b/src/app/(home)/page.tsx @@ -1,314 +1,344 @@ "use client"; -import { useEffect, useState, useRef } from "react"; +import React, { useEffect, useRef, useState } from "react"; +import { motion, AnimatePresence } from "framer-motion"; import Image from "next/image"; -import LinkBtn from "../components/button/default/LinkBtn"; -import { hakgyoFont } from "../fonts"; +import Lenis from "@studio-freight/lenis"; +import { useMediaQuery } from "react-responsive"; -export default function Home() { - const [visibleSections, setVisibleSections] = useState(new Set()); - const [contentOpacity, setContentOpacity] = useState(0); - const [footerOpacity, setFooterOpacity] = useState(0); - const observer = useRef(null); +const slides = [ + { + id: 1, + title: "쉽고 빨라요", + content: "1분만에 알바폼을 만들어 보세요!\n링크를 복사하여 어디서든지 사용하세요.", + image: "/images/land/s2.jpg", + }, + { + id: 2, + title: "한 곳에서 쉽게 관리하세요", + content: "워크폼 관리 페이지에서 지원 현황을 확인하고\n지원자별 상태를 관리할 수 있습니다.", + image: "/images/land/s3.jpg", + }, + { + id: 3, + title: "쉽고 빠르게 지원하세요", + content: "간단한 정보만 입력해도\n알바 지원이 가능합니다.", + image: "/images/land/s4.jpg", + }, + { + id: 4, + title: "workroot에 가입하세요", + content: "오늘의 선택이 내일의 열매가 됩니다.", + image: "/images/land/step1.jpg", + }, + { + id: 5, + title: "지원자 이용 방법", + content: "언제든 다시 볼 수 있게\n공고를 스크랩하세요", + image: "/images/land/step2-2.jpg", + blackAreaTitle: "사장님 이용 방법", + blackAreaContent: "워크채널 우측의 [폼 만들기] 버튼을 클릭하고\n인재 채용을 시작하세요", + blackAreaImage: "/images/land/step2-1.jpg", + }, + { + id: 6, + title: "", + content: "마이페이지에서 스크랩한 공고를 분석하고\n지원 계획을 세우세요", + image: "/images/land/step3-2.jpg", + blackAreaTitle: "", + blackAreaContent: "내 워크폼에서 작성한 공고를\n손쉽게 수정하고 삭제할 수 있어요", + blackAreaImage: "/images/land/step3-1.jpg", + }, +]; - useEffect(() => { - setContentOpacity(1); - if (typeof window !== "undefined" && typeof IntersectionObserver !== "undefined") { - observer.current = new IntersectionObserver( - (entries) => { - entries.forEach((entry) => { - const element = entry.target as HTMLElement; - const id = element.dataset.id ?? ""; - if (id) { - if (entry.isIntersecting) { - setVisibleSections((prev) => new Set(prev).add(id)); - } else { - setVisibleSections((prev) => { - const newSet = new Set(prev); - newSet.delete(id); - return newSet; - }); - } - } - }); - }, - { - threshold: 0.5, - rootMargin: "0px 0px -100px 0px", - } - ); +const bounceAnimation = { + y: [0, -10, 0], + transition: { + repeat: Infinity, + duration: 1.5, + ease: "easeInOut", + }, +}; - const targets = document.querySelectorAll("[data-id]"); - targets.forEach((target) => observer.current?.observe(target)); +export default function LandingPage() { + const isLargeScreen = useMediaQuery({ minWidth: 641 }); + const [currentSlide, setCurrentSlide] = useState(0); + const [isLoaded, setIsLoaded] = useState(false); + const containerRef = useRef(null); + const lenisRef = useRef(null); + const isScrollingRef = useRef(false); + + useEffect(() => { + setIsLoaded(true); + lenisRef.current = new Lenis({ + duration: 0.8, // 1.2에서 0.8로 변경 + easing: (t: number) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), + smoothWheel: true, + wheelMultiplier: 2, + touchMultiplier: 1.2, + infinite: false, + }); - return () => { - targets.forEach((target) => observer.current?.unobserve(target)); - }; + function raf(time: number) { + lenisRef.current?.raf(time); + requestAnimationFrame(raf); } - }, []); - useEffect(() => { - const footerObserver = new IntersectionObserver( - ([entry]) => { - if (entry.isIntersecting) { - setFooterOpacity(1); + requestAnimationFrame(raf); + + let lastScrollTime = 0; + const scrollThreshold = 500; // ms + + lenisRef.current.on("scroll", ({ progress }: { progress: number }) => { + const currentTime = Date.now(); + if (currentTime - lastScrollTime < scrollThreshold) return; + + if (!isScrollingRef.current) { + const totalSlides = slides.length; + const newSlideIndex = Math.min(slides.length - 1, Math.max(0, Math.round(progress * (totalSlides - 1)))); + + if (newSlideIndex !== currentSlide) { + setCurrentSlide(newSlideIndex); + isScrollingRef.current = true; + const targetScroll = + (newSlideIndex / (totalSlides - 1)) * + (isLargeScreen ? containerRef.current!.scrollHeight : containerRef.current!.scrollWidth); + + lenisRef.current?.scrollTo(targetScroll, { + immediate: false, + duration: 600, // 800에서 600으로 변경 + easing: (t: number) => t * (2 - t), + }); + + lastScrollTime = currentTime; + + setTimeout(() => { + isScrollingRef.current = false; + }, 600); // 800에서 600으로 변경 } - }, - { threshold: 0.8 } - ); + } + }); - const footerElement = document.querySelector("[data-id='footer-cta']"); - if (footerElement) { - footerObserver.observe(footerElement); - } + document.documentElement.style.scrollbarWidth = "none"; + document.documentElement.style.overflow = "auto"; + const style = document.createElement("style"); + style.textContent = ` + ::-webkit-scrollbar { + display: none; + } + body { + -ms-overflow-style: none; + } + `; + document.head.append(style); return () => { - if (footerElement) { - footerObserver.unobserve(footerElement); - } + lenisRef.current?.destroy(); + document.documentElement.style.overflow = ""; + style.remove(); }; - }, []); - - const features = [ - { - id: "feature-01", - number: "01", - title: "어디서든 지원받으세요", - description: "다양한 사이트, SNS, 문자까지 언제 어디서든 직원을 구해보세요", - imageSrc: "/images/land/2.webp", - }, - { - id: "feature-02", - number: "02", - title: "한 곳에서 쉽게 관리하세요", - description: "워크폼 관리 페이지에서 지원현황을 확인하고, 지원자별 상태를 관리할 수 있습니다", - imageSrc: "/images/land/3.webp", - }, - { - id: "feature-03", - number: "03", - title: "쉽고 빨라요", - description: "1분만에 워크폼을 만들어보세요! 링크를 복사하여 어디서든지 사용하세요", - imageSrc: "/images/land/4.webp", - }, - { - id: "feature-04", - number: "04", - title: "쉽고 빠르게 지원하세요", - description: "간단한 정보 입력만으로 지원이 가능합니다", - imageSrc: "/images/land/5.webp", - }, - ]; + }, [currentSlide, isLargeScreen]); return ( -
- {/* 히어로 섹션 */} -
- {/* Background image */} -
- Hero Background -
- {/* Content */} -
+ {isLoaded && ( + -

- WorkRoot -

-

- 뿌리를 내리며 성장하는 구인구직 플랫폼 -

-
- - 둘러보기 - - + - 회원가입 - -
-
-
- - {/* 특징 섹션 */} -
-
-
-
- {features.map((feature, index) => ( - - ))} -
-
-
- - {/* UI 섹션 */} -
-
-

- WorkRoot 사용 방법 -

-
- {[ - { step: 1, text: "워크루트에 가입해 꿈을 이루기 위한 뿌리를 내리세요" }, - { step: 2, text: "간단한 워크폼 등록으로 성장의 기회를 만드세요" }, - { step: 3, text: "당신의 싹을 틔울 일자리를 찾아보세요" }, - { step: 4, text: "간편하게 지원서를 작성하고 여러분들의 시작을 꽃피우세요 " }, - ].map(({ step, text }) => ( -
-
+ {currentSlide === 0 ? ( {`Step -
-
+ + {slides[currentSlide].blackAreaTitle} + + +
+ {slides[currentSlide].blackAreaTitle +
+
+ + {slides[currentSlide].blackAreaContent} + + + ) : ( + +
+ Brand Logo +
+
+ )} + + {currentSlide === 0 && ( + + + + + scroll + + )} + + + {currentSlide > 0 && ( + -
-

Step {step}

-

{text}

-
-
-
- ))} + + {slides[currentSlide].title} + + +
+ {slides[currentSlide].title +
+
+ + {slides[currentSlide].content} + + + )} +
-
-
- {/* Footer CTA 섹션 */} -
- {/* Background image */} -
- Footer CTA Background -
- - {/* Content */} -
-

지금 바로 시작하세요

-

- WorkRoot가 여러분의 성장의 길을 열어드립니다 -

-
- 0 && ( +
- 둘러보기 - - - 회원가입 - -
-
-
-
- ); -} - -interface FeatureCardProps { - id: string; - number: string; - title: string; - description: string; - imageSrc: string; - direction: "left" | "right"; - isVisible: boolean; -} - -function FeatureCard({ id, number, title, description, imageSrc, direction, isVisible }: FeatureCardProps) { - return ( -
-
- {title} -
-
- {number} -

- {title} -

-

{description}

-
-
+ {slides.slice(1).map((_, index) => ( +
+ ))} +
+ )} + + )} + ); } diff --git a/src/app/(pages)/(workform)/addform/page.tsx b/src/app/(pages)/(workform)/addform/page.tsx index c322fb43..5ebb55e5 100644 --- a/src/app/(pages)/(workform)/addform/page.tsx +++ b/src/app/(pages)/(workform)/addform/page.tsx @@ -1,5 +1,5 @@ "use client"; -import { useEffect, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { FormProvider, useForm } from "react-hook-form"; import axios from "axios"; @@ -25,6 +25,7 @@ export default function AddFormPage() { // 리액트 훅폼에서 관리할 데이터 타입 지정 및 메서드 호출 (상위 컴포넌트 = useForm 사용) const methods = useForm({ mode: "onChange", + shouldUnregister: false, defaultValues: { isPublic: true, hourlyWage: 0, @@ -51,12 +52,35 @@ export default function AddFormPage() { const { setValue, handleSubmit, + watch, formState: { isDirty, isValid }, } = methods; const queryClient = useQueryClient(); // 훅폼에서 관리하는 전체 데이터를 가져오는 함수 - const currentValues: SubmitFormDataType = methods.watch(); + const currentValues: SubmitFormDataType = watch(); + const isComplete = useMemo(() => { + // 작성이 완료된 필드들: 기본값에서 변경된 경우를 확인 + return ( + currentValues.title && + currentValues.description && + currentValues.location && + currentValues.workStartDate && + currentValues.workEndDate && + currentValues.recruitmentStartDate && + currentValues.recruitmentEndDate && + currentValues.workStartTime && + currentValues.workEndTime && + currentValues.age && + currentValues.preferred && + currentValues.education && + currentValues.gender && + currentValues.numberOfPositions >= 0 && + currentValues.imageUrls.length > 0 && + currentValues.hourlyWage >= 10_030 && + (currentValues.workDays.length > 0 || currentValues.isNegotiableWorkDays) + ); + }, [currentValues]); // 이미지 업로드 api 처리를 위해 별도 변수에 할당 const [showTempDataModal, setShowTempDataModal] = useState(false); @@ -94,7 +118,7 @@ export default function AddFormPage() { // 폼데이터 임시 저장 함수 const onTempSave = () => { - tempSave("addformData", currentValues); + tempSave("tempAddFormData", currentValues); }; const handleOptionChange = (option: string) => { @@ -193,7 +217,7 @@ export default function AddFormPage() { width="md" color="orange" className="lg: h-[58px] w-[320px] border bg-background-100 lg:h-[72px] lg:w-full lg:text-xl lg:leading-8" - onClick={() => tempSave("addformData", currentValues)} + onClick={() => tempSave("tempAddFormData", currentValues)} > 임시 저장 @@ -203,7 +227,7 @@ export default function AddFormPage() { width="md" color="orange" className="lg: h-[58px] w-[320px] lg:h-[72px] lg:w-full lg:text-xl lg:leading-8" - disabled={!isValid} + disabled={!isComplete} onClick={handleSubmit(() => mutation.mutate())} > {mutation.isPending ? : "작성 완료"} @@ -211,6 +235,7 @@ export default function AddFormPage() { {renderChildren()} + {/* 임시저장 데이터 확인 모달 */} { - let uploadedUrls: string[] = []; - //파일 선택 시 업로드 api 요청 - try { - uploadedUrls = await uploadImages(files); - } catch (err) { - console.log("이미지 파일 체인지 핸들러 - 이미지 업로드 실패"); - console.error(err); - } - // 선택한 이미지 업데이트 - const updatedImageList = - uploadedUrls.map((url) => ({ + const handleChangeImages = async (files: File[] | string[]) => { + // files가 File[] 타입인 경우 (새로운 이미지 업로드) + if (files.length > 0 && files[0] instanceof File) { + let uploadedUrls: string[] = []; + try { + uploadedUrls = await uploadImages(files as File[]); + } catch (err) { + console.log("이미지 파일 체인지 핸들러 - 이미지 업로드 실패"); + console.error(err); + } + + // 선택한 이미지 업데이트 + const updatedImageList = uploadedUrls.map((url) => ({ url, id: crypto.randomUUID(), - })) || []; + })); - // 기존 이미지 포함하기 - const originalImageList = - imageUrlsData.map((url) => ({ + // 기존 이미지 포함하기 + const originalImageList = imageUrlsData.map((url) => ({ url, id: crypto.randomUUID(), - })) || []; + })); - const allImageList = [...originalImageList, ...updatedImageList]; - const submitImageList = [...imageUrlsData, ...uploadedUrls]; + const allImageList = [...originalImageList, ...updatedImageList]; + const submitImageList = [...imageUrlsData, ...uploadedUrls]; - // prop으로 전달 - setInitialImageList(allImageList); - // 훅폼 데이터에 세팅 - setValue("imageUrls", submitImageList, { shouldDirty: true }); + // prop으로 전달 + setInitialImageList(allImageList); + // 훅폼 데이터에 세팅 + setValue("imageUrls", submitImageList, { shouldDirty: true }); + } + // files가 string[] 타입인 경우 (드래그 앤 드롭으로 순서 변경) + else { + const urls = files as string[]; + const newImageList = urls.map((url) => ({ + url, + id: crypto.randomUUID(), + })); + + setInitialImageList(newImageList); + setValue("imageUrls", urls, { shouldDirty: true }); + } }; const handleDeleteImage = (url: string) => { @@ -88,7 +101,7 @@ export default function RecruitContentSection() { // displayRange를 상위에서 관리 const displayDate = - recruitStartDate && !formatToLocaleDate(recruitEndDate).includes("NaN") + recruitEndDate && !formatToLocaleDate(recruitEndDate).includes("NaN") ? `${formatToLocaleDate(recruitStartDate)} ~ ${formatToLocaleDate(recruitEndDate)}` : ""; @@ -132,17 +145,17 @@ export default function RecruitContentSection() { endDate={endDate} onChange={handleRecruitmentDateChange} required={true} - errormessage={!startDate || !endDate} + errormessage={isDirty && !endDate} displayValue={displayDate} /> - {(!startDate || !endDate) &&

모집 기간은 필수입니다.

} + {isDirty && !endDate &&

모집 기간은 필수입니다.

}
{ + onChange={(files: File[] | string[]) => { handleChangeImages(files); }} onDelete={(id) => handleDeleteImage(id)} diff --git a/src/app/(pages)/(workform)/addform/section/WorkConditionSection.tsx b/src/app/(pages)/(workform)/addform/section/WorkConditionSection.tsx index ae5868d9..0f3b738c 100644 --- a/src/app/(pages)/(workform)/addform/section/WorkConditionSection.tsx +++ b/src/app/(pages)/(workform)/addform/section/WorkConditionSection.tsx @@ -1,7 +1,7 @@ "use client"; import { useFormContext, Controller } from "react-hook-form"; -import { useState, ChangeEvent, MouseEvent, useCallback } from "react"; +import { ChangeEvent, MouseEvent, useCallback } from "react"; import { cn } from "@/lib/tailwindUtil"; import DatePickerInput from "@/app/components/input/dateTimeDaypicker/DatePickerInput"; import TimePickerInput from "@/app/components/input/dateTimeDaypicker/TimePickerInput"; @@ -23,7 +23,7 @@ export default function WorkConditionSection() { watch, control, trigger, - formState: { errors }, + formState: { errors, isDirty }, } = useFormContext(); // 근무 기간 데이터 반영하기 @@ -35,7 +35,7 @@ export default function WorkConditionSection() { // displayRange를 상위에서 관리 const displayDate = - workStartDate && !formatToLocaleDate(workEndDate).includes("NaN") + workEndDate && !formatToLocaleDate(workEndDate).includes("NaN") ? `${formatToLocaleDate(workStartDate)} ~ ${formatToLocaleDate(workEndDate)}` : ""; @@ -80,6 +80,7 @@ export default function WorkConditionSection() { setValue("location", fullAddress); trigger("location"); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [setValue] ); @@ -105,10 +106,10 @@ export default function WorkConditionSection() { endDate={endDate} onChange={handleWorkDateChange} required={true} - errormessage={!startDate || !endDate} + errormessage={isDirty && !endDate} displayValue={displayDate} /> - {(!startDate || !endDate) &&

근무 기간은 필수입니다.

} + {isDirty && !endDate &&

근무 기간은 필수입니다.

}
@@ -146,7 +147,7 @@ export default function WorkConditionSection() { checked={watch("isNegotiableWorkDays")} {...register("isNegotiableWorkDays")} /> - {workdaysData.length === 0 && !isNegotiable && ( + {workdaysData.length === 0 && !isNegotiable && isDirty && (

근무 요일을 선택해주세요.

)} @@ -157,6 +158,7 @@ export default function WorkConditionSection() { name="hourlyWage" control={control} rules={{ + required: "시급을 입력해주세요.", min: { value: MINIMUM_WAGE, message: `최저시급(${MINIMUM_WAGE.toLocaleString()}원) 이상을 입력해주세요.`, diff --git a/src/app/(pages)/(workform)/work/[formId]/components/FormImage.tsx b/src/app/(pages)/(workform)/work/[formId]/components/FormImage.tsx index 37c211e9..62ecabd2 100644 --- a/src/app/(pages)/(workform)/work/[formId]/components/FormImage.tsx +++ b/src/app/(pages)/(workform)/work/[formId]/components/FormImage.tsx @@ -24,7 +24,7 @@ export default function FormImage({ imageUrls, currentPage, onPageChange }: Form alt={`알바 이미지 ${index + 1}`} className="h-full w-full rounded-lg object-cover" priority={index === 0} - layout="fill" + fill /> ))} diff --git a/src/app/(pages)/(workform)/work/[formId]/components/RecruitInformation.tsx b/src/app/(pages)/(workform)/work/[formId]/components/RecruitInformation.tsx index 1ea0f26e..7f613a80 100644 --- a/src/app/(pages)/(workform)/work/[formId]/components/RecruitInformation.tsx +++ b/src/app/(pages)/(workform)/work/[formId]/components/RecruitInformation.tsx @@ -4,7 +4,6 @@ import RecruitIcon from "@/app/components/card/cardList/RecruitIcon"; import RecruitCondition from "@/app/components/card/cardList/RecruitCondition"; import { FormDetailResponse } from "@/types/response/form"; import FormActions from "./FormActions"; -import { useUser } from "@/hooks/queries/user/me/useUser"; interface RecruitInformationProps { albaFormDetailData: FormDetailResponse; @@ -12,8 +11,6 @@ interface RecruitInformationProps { } export default function RecruitInformation({ albaFormDetailData, formId }: RecruitInformationProps) { - const { user } = useUser(); - const recruitmentDetails = { hourlyWage: albaFormDetailData.hourlyWage, recruitmentStartDate: new Date(albaFormDetailData.recruitmentStartDate), @@ -32,16 +29,14 @@ export default function RecruitInformation({ albaFormDetailData, formId }: Recru 모집 조건 - {user && ( -
-
- -
-
- -
+
+
+ +
+
+
- )} +
); } diff --git a/src/app/(pages)/(workform)/work/[formId]/edit/page.tsx b/src/app/(pages)/(workform)/work/[formId]/edit/page.tsx index c8e32313..1fa0e929 100644 --- a/src/app/(pages)/(workform)/work/[formId]/edit/page.tsx +++ b/src/app/(pages)/(workform)/work/[formId]/edit/page.tsx @@ -1,7 +1,7 @@ "use client"; // 워크폼 수정 페이지 (사장님) -import { useEffect, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { useParams, useRouter, useSearchParams } from "next/navigation"; import { FormProvider, useForm } from "react-hook-form"; import axios from "axios"; @@ -33,7 +33,7 @@ export default function EditFormPage() { const { reset, handleSubmit, - formState: { isDirty, isValid }, + formState: { isDirty }, } = methods; const queryClient = useQueryClient(); @@ -72,6 +72,29 @@ export default function EditFormPage() { } }, [albaFormDetailData, reset]); + const isComplete = useMemo(() => { + // 작성이 완료된 필드들: 기본값에서 변경된 경우를 확인 + return ( + currentValues.title && + currentValues.description && + currentValues.location && + currentValues.workStartDate && + currentValues.workEndDate && + currentValues.recruitmentStartDate && + currentValues.recruitmentEndDate && + currentValues.workStartTime && + currentValues.workEndTime && + currentValues.age && + currentValues.preferred && + currentValues.education && + currentValues.gender && + currentValues.numberOfPositions >= 0 && + currentValues.imageUrls.length > 0 && + currentValues.hourlyWage >= 10_030 && + (currentValues.workDays.length > 0 || currentValues.isNegotiableWorkDays) + ); + }, [currentValues]); + // 수정된 폼 제출 리액트쿼리 const mutation = useMutation({ mutationFn: async () => { @@ -170,7 +193,7 @@ export default function EditFormPage() { width="md" color="orange" className="h-[58px] w-full lg:h-[72px] lg:text-xl lg:leading-8" - disabled={!isDirty || !isValid} + disabled={!isDirty || !isComplete} onClick={handleSubmit(() => mutation.mutate())} > {mutation.isPending ? : "수정하기"} diff --git a/src/app/(pages)/my-workform/(role)/applicant/page.tsx b/src/app/(pages)/my-workform/(role)/applicant/page.tsx index 7b281ba3..edb35ca4 100644 --- a/src/app/(pages)/my-workform/(role)/applicant/page.tsx +++ b/src/app/(pages)/my-workform/(role)/applicant/page.tsx @@ -14,6 +14,7 @@ import Link from "next/link"; import MyApplicationListItem from "@/app/components/card/cardList/apply/MyApplicationListItem"; import ScrollTopButton from "@/app/components/button/default/ScrollTopButton"; import { useApplicationsList } from "@/hooks/queries/user/me/useApplicationsList"; +import SearchSpinner from "@/app/components/loading-spinner/SearchSpinner"; const APPLICATIONS_PER_PAGE = 10; @@ -67,14 +68,14 @@ export default function ApplicantPage() { // 에러 상태 처리 if (error) { return ( -
+

지원 내역을 불러오는데 실패했습니다.

); } // 로딩 상태 처리 - if (isUserLoading || isLoadingData) { + if ((isUserLoading || isLoadingData) && !keyword) { return ; } @@ -98,12 +99,14 @@ export default function ApplicantPage() {
{/* 메인 콘텐츠 영역 */} -
+
+ {keyword && isLoadingData && } + {/* ScrollTopButton 추가 */} {!data?.pages?.[0]?.data?.length ? ( -
+

지원 내역이 없습니다.

) : ( diff --git a/src/app/(pages)/my-workform/(role)/owner/page.tsx b/src/app/(pages)/my-workform/(role)/owner/page.tsx index 754b3f7a..ed2ea9f9 100644 --- a/src/app/(pages)/my-workform/(role)/owner/page.tsx +++ b/src/app/(pages)/my-workform/(role)/owner/page.tsx @@ -17,6 +17,7 @@ import FloatingBtn from "@/app/components/button/default/FloatingBtn"; import LoadingSpinner from "@/app/components/loading-spinner/LoadingSpinner"; import ContentSection from "@/app/components/layout/ContentSection"; import ScrollTopButton from "@/app/components/button/default/ScrollTopButton"; +import SearchSpinner from "@/app/components/loading-spinner/SearchSpinner"; const FORMS_PER_PAGE = 10; @@ -136,14 +137,14 @@ export default function AlbaList() { // 에러 상태 처리 if (error) { return ( -
+

워크 채널을 불러오는데 실패했습니다.

); } // 로딩 상태 처리 - if (isLoadingData) { + if (isLoadingData && !keyword) { return ; } @@ -183,7 +184,9 @@ export default function AlbaList() {
{/* 메인 콘텐츠 영역 */} -
+
+ {keyword && isLoadingData && } + {/* 폼 만들기 버튼 - 고정 위치 */} {isOwner && ( @@ -197,7 +200,7 @@ export default function AlbaList() { {!data?.pages?.[0]?.data?.length ? ( -
+

등록된 알바 공고가 없습니다.

) : ( diff --git a/src/app/(pages)/mypage/components/sections/CommentsSection.tsx b/src/app/(pages)/mypage/components/sections/CommentsSection.tsx index dcae0c59..00106efa 100644 --- a/src/app/(pages)/mypage/components/sections/CommentsSection.tsx +++ b/src/app/(pages)/mypage/components/sections/CommentsSection.tsx @@ -4,11 +4,11 @@ import React from "react"; import { useState, useEffect } from "react"; import { useMyComments } from "@/hooks/queries/user/me/useMyComments"; import Pagination from "@/app/components/pagination/Pagination"; -import LoadingSpinner from "@/app/components/loading-spinner/LoadingSpinner"; import BoardComment from "@/app/components/card/board/BoardComment"; import ContentSection from "@/app/components/layout/ContentSection"; import useWidth from "@/hooks/useWidth"; import ScrollTopButton from "@/app/components/button/default/ScrollTopButton"; +import SamllLoadingSpinner from "@/app/components/loading-spinner/SmallLoadingSpinner"; export default function CommentsSection() { const [currentPage, setCurrentPage] = useState(1); @@ -45,19 +45,15 @@ export default function CommentsSection() { if (error) { return ( -
+

댓글을 불러오는데 실패했습니다.

); } - if (isLoading) { - return ; - } - if (!data?.data?.length) { return ( -
+

작성한 댓글이 없습니다.

); @@ -66,6 +62,7 @@ export default function CommentsSection() { return (
+ {isLoading && SamllLoadingSpinner} {/* ScrollTopButton 추가 */} diff --git a/src/app/(pages)/mypage/components/sections/PostsSection.tsx b/src/app/(pages)/mypage/components/sections/PostsSection.tsx index 57442129..dc486fdf 100644 --- a/src/app/(pages)/mypage/components/sections/PostsSection.tsx +++ b/src/app/(pages)/mypage/components/sections/PostsSection.tsx @@ -5,12 +5,12 @@ import { useInView } from "react-intersection-observer"; import { useMyPosts } from "@/hooks/queries/user/me/useMyPosts"; import { useMySortStore } from "@/store/mySortStore"; import { useProfileStringValue } from "@/hooks/queries/user/me/useProfileStringValue"; -import LoadingSpinner from "@/app/components/loading-spinner/LoadingSpinner"; import ContentSection from "@/app/components/layout/ContentSection"; import useWidth from "@/hooks/useWidth"; import ScrollTopButton from "@/app/components/button/default/ScrollTopButton"; import BoardPostItem from "@/app/components/card/board/BoardPostItem"; import DotLoadingSpinner from "@/app/components/loading-spinner/DotLoadingSpinner"; +import SamllLoadingSpinner from "@/app/components/loading-spinner/SmallLoadingSpinner"; export default function PostsSection() { const { orderBy } = useMySortStore(); @@ -45,26 +45,23 @@ export default function PostsSection() { if (error) { return ( -
+

게시글을 불러오는데 실패했습니다.

); } - if (isLoading) { - return ; - } - return (
{/* 메인 콘텐츠 영역 */}
{!data?.pages?.[0]?.data?.length ? ( -
+

작성한 게시글이 없습니다.

) : (
+ {isLoading && SamllLoadingSpinner} {/* ScrollTopButton 추가 */} diff --git a/src/app/(pages)/mypage/components/sections/ScrapsSection.tsx b/src/app/(pages)/mypage/components/sections/ScrapsSection.tsx index 459ccec9..c5d3b6da 100644 --- a/src/app/(pages)/mypage/components/sections/ScrapsSection.tsx +++ b/src/app/(pages)/mypage/components/sections/ScrapsSection.tsx @@ -113,7 +113,7 @@ export default function ScrapsSection() { // 에러 상태 처리 if (error) { return ( -
+

스크랩을 불러오는데 실패했습니다.

); @@ -146,7 +146,7 @@ export default function ScrapsSection() { {/* 스크랩 목록 렌더링 */} {!data?.pages?.[0]?.data?.length ? ( -
+

스크랩한 공고가 없습니다.

) : ( diff --git a/src/app/(pages)/work-list/page.tsx b/src/app/(pages)/work-list/page.tsx index 7926c682..c8287f64 100644 --- a/src/app/(pages)/work-list/page.tsx +++ b/src/app/(pages)/work-list/page.tsx @@ -17,6 +17,7 @@ import FloatingBtn from "@/app/components/button/default/FloatingBtn"; import LoadingSpinner from "@/app/components/loading-spinner/LoadingSpinner"; import ContentSection from "@/app/components/layout/ContentSection"; import ScrollTopButton from "@/app/components/button/default/ScrollTopButton"; +import SearchSpinner from "@/app/components/loading-spinner/SearchSpinner"; const FORMS_PER_PAGE = 10; @@ -87,14 +88,15 @@ export default function AlbaList() { // 에러 상태 처리 if (error) { return ( -
+

워크 채널을 불러오는데 실패했습니다.

); } - // 로딩 중 처리 - if (isLoading) return ; + if (isLoading && !keyword) { + return ; + } // 리스트 아이템 클릭 시 로그인 여부 확인 후 이동 const handleFormClick = (formId: number) => { @@ -130,7 +132,8 @@ export default function AlbaList() {
{/* 메인 콘텐츠 영역 */} -
+
+ {keyword && isLoading && } {/* 폼 만들기 버튼 - 고정 위치 */} {isOwner && ( @@ -144,7 +147,7 @@ export default function AlbaList() { {!data?.pages?.[0]?.data?.length ? ( -
+

등록된 알바 공고가 없습니다.

) : ( diff --git a/src/app/(pages)/work-talk/page.tsx b/src/app/(pages)/work-talk/page.tsx index 5077e9c0..828010b0 100644 --- a/src/app/(pages)/work-talk/page.tsx +++ b/src/app/(pages)/work-talk/page.tsx @@ -17,6 +17,7 @@ import ContentSection from "@/app/components/layout/ContentSection"; import useModalStore from "@/store/modalStore"; import ScrollTopButton from "@/app/components/button/default/ScrollTopButton"; import DotLoadingSpinner from "@/app/components/loading-spinner/DotLoadingSpinner"; +import SearchSpinner from "@/app/components/loading-spinner/SearchSpinner"; const POSTS_PER_PAGE = 10; @@ -77,14 +78,14 @@ export default function AlbaTalk() { // 에러 상태 처리 if (error) { return ( -
+

게시글 목록을 불러오는데 실패했습니다.

); } // 로딩 상태 처리 - if (isLoading) { + if (isLoading && !keyword) { return ; } @@ -112,7 +113,9 @@ export default function AlbaTalk() {
{/* 메인 콘텐츠 영역 */} -
+
+ {keyword && isLoading && } + {/* 글쓰기 버튼 - 고정 위치 수정 */} {user && ( @@ -124,7 +127,7 @@ export default function AlbaTalk() { {!data?.pages?.[0]?.data?.length ? ( -
+

등록된 게시글이 없습니다.

) : ( diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts index 8e32c378..041d4276 100644 --- a/src/app/api/auth/login/route.ts +++ b/src/app/api/auth/login/route.ts @@ -15,7 +15,7 @@ export const POST = async (request: NextRequest): Promise => { httpOnly: true, secure: process.env.NODE_ENV === "production", sameSite: "strict", - maxAge: 60 * 60 * 30, // 30분 + maxAge: 60 * 60 * 60 * 24, // 1일 path: "/", }); diff --git a/src/app/api/auth/oauthlogin/route.ts b/src/app/api/auth/oauthlogin/route.ts new file mode 100644 index 00000000..4a42caad --- /dev/null +++ b/src/app/api/auth/oauthlogin/route.ts @@ -0,0 +1,57 @@ +import { AxiosError } from "axios"; +import { NextRequest, NextResponse } from "next/server"; +import apiClient from "@/lib/apiClient"; +import { cookies } from "next/headers"; + +export const POST = async (request: NextRequest): Promise => { + try { + const requestData = await request.json(); + const { email, password, isNewUser, ...userData } = requestData; + + let response; + + if (isNewUser) { + // 신규 사용자 회원가입 + response = await apiClient.post("/auth/sign-up", { + email, + password, + ...userData, + }); + } else { + // 기존 사용자 로그인 + response = await apiClient.post("/auth/sign-in", { + email, + password, + }); + } + + const { accessToken, refreshToken, user } = response.data; + + // 쿠키에 토큰 저장 + cookies().set("accessToken", accessToken, { + httpOnly: true, + secure: process.env.NODE_ENV === "production", + sameSite: "strict", + maxAge: 60 * 60 * 60 * 24, // 1일 + path: "/", + }); + + cookies().set("refreshToken", refreshToken, { + httpOnly: true, + secure: process.env.NODE_ENV === "production", + sameSite: "strict", + maxAge: 60 * 60 * 24 * 14, // 14일 + path: "/", + }); + + return NextResponse.json({ accessToken, refreshToken, user }, { status: 200 }); + } catch (error: unknown) { + if (error instanceof AxiosError) { + console.error("OAuth auth error:", error); + if (error.response) { + return NextResponse.json({ message: error.response.data.message }, { status: error.response.status }); + } + } + return NextResponse.json({ message: "인증 실패" }, { status: 500 }); + } +}; diff --git a/src/app/api/oauth/apps/route.ts b/src/app/api/oauth/apps/route.ts index ec1f8736..856f1b1e 100644 --- a/src/app/api/oauth/apps/route.ts +++ b/src/app/api/oauth/apps/route.ts @@ -25,7 +25,6 @@ export async function POST(request: NextRequest) { // 응답 데이터 처리 const responseData = response.data; - console.log("OAuth 앱 등록/수정 성공:", responseData); return NextResponse.json(responseData); } catch (error: unknown) { diff --git a/src/app/api/oauth/login/[provider]/route.ts b/src/app/api/oauth/login/[provider]/route.ts index 59289963..a4ae7a4e 100644 --- a/src/app/api/oauth/login/[provider]/route.ts +++ b/src/app/api/oauth/login/[provider]/route.ts @@ -1,11 +1,11 @@ import { AxiosError } from "axios"; +import { cookies } from "next/headers"; import { NextResponse } from "next/server"; import apiClient from "@/lib/apiClient"; // OAuth 로그인 API export async function POST(request: Request, { params }: { params: { provider: string } }) { try { - console.log("/api/oauth/login"); const provider = params.provider; // provider 유효성 검사 @@ -15,10 +15,30 @@ export async function POST(request: Request, { params }: { params: { provider: s // 요청 본문 파싱 const body = await request.json(); - console.log("Received body:", body); // 요청 본문 로그 출력 + // OAuth 로그인 요청 const response = await apiClient.post(`/oauth/sign-in/${provider}`, body); + // 응답에서 토큰 추출 + const { accessToken, refreshToken } = response.data; + + // 쿠키에 토큰 저장 + cookies().set("accessToken", accessToken, { + httpOnly: true, + secure: process.env.NODE_ENV === "production", + sameSite: "strict", + maxAge: 60 * 60 * 60 * 24, // 1일 + path: "/", + }); + + cookies().set("refreshToken", refreshToken, { + httpOnly: true, + secure: process.env.NODE_ENV === "production", + sameSite: "strict", + maxAge: 60 * 60 * 24 * 14, // 14일 + path: "/", + }); + return NextResponse.json(response.data); } catch (error: unknown) { if (error instanceof AxiosError) { @@ -27,6 +47,6 @@ export async function POST(request: Request, { params }: { params: { provider: s return NextResponse.json({ message: error.response.data.message }, { status: error.response.status }); } } - return NextResponse.json({ message: "서버오류" }, { status: 500 }); + return NextResponse.json({ message: "Internal Server Error" }, { status: 500 }); } } diff --git a/src/app/api/oauth/route.ts b/src/app/api/oauth/route.ts new file mode 100644 index 00000000..b8cc36d3 --- /dev/null +++ b/src/app/api/oauth/route.ts @@ -0,0 +1,52 @@ +import { AxiosError } from "axios"; +import { cookies } from "next/headers"; +import { NextResponse } from "next/server"; +import apiClient from "@/lib/apiClient"; + +// OAuth 회원가입 API +export async function POST(request: Request, { params }: { params: { provider: string } }) { + try { + const provider = params.provider; + + // provider 유효성 검사 + if (!["google", "kakao"].includes(provider)) { + return NextResponse.json({ message: "Invalid provider" }, { status: 400 }); + } + + // 요청 본문 파싱 + const body = await request.json(); + + // OAuth 회원가입 요청 + const response = await apiClient.post(`/auth/sign-up/${provider}`, body); + + // 응답에서 토큰 추출 + const { accessToken, refreshToken } = response.data; + + // 쿠키에 토큰 저장 + cookies().set("accessToken", accessToken, { + httpOnly: true, + secure: process.env.NODE_ENV === "production", + sameSite: "strict", + maxAge: 60 * 60 * 60 * 24, // 1일 + path: "/", + }); + + cookies().set("refreshToken", refreshToken, { + httpOnly: true, + secure: process.env.NODE_ENV === "production", + sameSite: "strict", + maxAge: 60 * 60 * 24 * 14, // 14일 + path: "/", + }); + + return NextResponse.json(response.data); + } catch (error: unknown) { + if (error instanceof AxiosError) { + console.error(`POST /api/oauth/sign-up/${params.provider} error:`, error); + if (error.response) { + return NextResponse.json({ message: error.response.data.message }, { status: error.response.status }); + } + } + return NextResponse.json({ message: "Internal Server Error" }, { status: 500 }); + } +} diff --git a/src/app/api/oauth/signup/[provider]/route.ts b/src/app/api/oauth/signup/[provider]/route.ts index 2156bd79..5b59431d 100644 --- a/src/app/api/oauth/signup/[provider]/route.ts +++ b/src/app/api/oauth/signup/[provider]/route.ts @@ -26,14 +26,16 @@ export async function POST(request: Request, { params }: { params: { provider: s cookies().set("accessToken", accessToken, { httpOnly: true, secure: process.env.NODE_ENV === "production", - sameSite: "lax", + sameSite: "strict", + maxAge: 60 * 60 * 60 * 24, // 1일 path: "/", }); cookies().set("refreshToken", refreshToken, { httpOnly: true, secure: process.env.NODE_ENV === "production", - sameSite: "lax", + sameSite: "strict", + maxAge: 60 * 60 * 24 * 14, // 14일 path: "/", }); diff --git a/src/app/auth/callback/page.tsx b/src/app/auth/callback/page.tsx new file mode 100644 index 00000000..763e8c23 --- /dev/null +++ b/src/app/auth/callback/page.tsx @@ -0,0 +1,49 @@ +"use client"; + +import { useEffect } from "react"; +import { useRouter } from "next/navigation"; +import LoadingSpinner from "@/app/components/loading-spinner/LoadingSpinner"; +import { useOAuth } from "@/hooks/queries/auth/useOAuth"; + +export default function AuthCallback() { + const router = useRouter(); + const { handleOAuthCallback, error, setError } = useOAuth(); + + useEffect(() => { + const processCallback = async () => { + try { + const hashParams = new URLSearchParams(window.location.hash.substring(1)); + const access_token = hashParams.get("access_token"); + + if (!access_token) { + setError("No access token found"); + return; + } + + await handleOAuthCallback(access_token); + } catch (error) { + console.error("Callback processing error:", error); + setError("인증 처리 중 문제가 발생했습니다."); + } + }; + + processCallback(); + }, []); + + if (error) { + return ( +
+

Error: {error}

+ +
+ ); + } + + return ( +
+ +
+ ); +} diff --git a/src/app/clientLayout.tsx b/src/app/clientLayout.tsx index 30305828..8f5ec7e4 100644 --- a/src/app/clientLayout.tsx +++ b/src/app/clientLayout.tsx @@ -4,7 +4,10 @@ import React, { useState } from "react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import dynamic from "next/dynamic"; import { Toaster } from "react-hot-toast"; +import { usePathname } from "next/navigation"; import ModalLayout from "@/app/components/modal/ModalLayout"; +import MouseTrail from "./components/mouseTrail/MouseTrail"; +import ChannelTalk from "./components/layout/ChannelTalk"; const ReactQueryDevtools = dynamic( () => import("@tanstack/react-query-devtools").then((mod) => mod.ReactQueryDevtools), @@ -12,6 +15,7 @@ const ReactQueryDevtools = dynamic( ); export default function ClientLayout({ children }: { children: React.ReactNode }) { + const pathname = usePathname(); const [queryClient] = useState( () => new QueryClient({ @@ -29,22 +33,31 @@ export default function ClientLayout({ children }: { children: React.ReactNode } }) ); + // 채널톡을 표시하지 않을 경로들 + const excludePaths = ["/login", "/signup", "/auth/callback"]; + const showChannelTalk = !excludePaths.some((path) => pathname.startsWith(path)); + return ( - {children} - - {process.env.NODE_ENV === "development" && } - +
+ {children} + + + {process.env.NODE_ENV === "development" && } + {showChannelTalk && } + +
); } diff --git a/src/app/components/card/cardList/AlbaListItem.tsx b/src/app/components/card/cardList/AlbaListItem.tsx index d2f73594..e4a8a762 100644 --- a/src/app/components/card/cardList/AlbaListItem.tsx +++ b/src/app/components/card/cardList/AlbaListItem.tsx @@ -12,9 +12,9 @@ import DotLoadingSpinner from "@/app/components/loading-spinner/DotLoadingSpinne import { isValidS3Url } from "@/utils/checkS3Url"; import { useUser } from "@/hooks/queries/user/me/useUser"; import { userRoles } from "@/constants/userRoles"; -import EmptyImage from "./EmptyImage"; import InfoItem from "./InfoItem"; import { useDeleteForm } from "@/hooks/queries/form/useDeleteForm"; +import EmptyImage from "./EmptyImage"; interface AlbaListItemProps extends FormListType { isMyForm?: boolean; @@ -153,10 +153,13 @@ const AlbaListItem = ({ isValidS3Url(imageUrls[0]) ? ( Recruit Image setImageError(true)} + priority + quality={75} /> ) : ( diff --git a/src/app/components/card/cardList/apply/ApplyStatusCard.tsx b/src/app/components/card/cardList/apply/ApplyStatusCard.tsx index a2d81de1..1313de62 100644 --- a/src/app/components/card/cardList/apply/ApplyStatusCard.tsx +++ b/src/app/components/card/cardList/apply/ApplyStatusCard.tsx @@ -1,11 +1,14 @@ "use client"; import React, { useState } from "react"; -import { useApplyStatus } from "@/hooks/queries/form/detail/useApplyStatus"; -import translateStatus from "@/utils/translateStatus"; import { SkeletonRow } from "./SkeletonRow"; import { Player } from "@lottiefiles/react-lottie-player"; import TableHeader from "./TableHeader"; -import { ApplicationStatusType } from "@/types/applicationStatus"; +import useModalStore from "@/store/modalStore"; +import { ApplicationResponse } from "@/types/response/application"; +import { APPLICATION_STATUS_MAP, ApplicationStatusType } from "@/types/applicationStatus"; +import { useApplicationStatus } from "@/hooks/queries/form/detail/useApplicationStatus"; +import { useUpdateApplicationStatus } from "@/hooks/queries/form/detail/useUpdateApplicationStatus"; +import FilterDropdown from "@/app/components/button/dropdown/FilterDropdown"; interface ApplyStatusCardProps { formId: number; @@ -13,10 +16,11 @@ interface ApplyStatusCardProps { // 지원현황 카드 컴포넌트 const ApplyStatusCard = ({ formId }: ApplyStatusCardProps) => { + const { openModal } = useModalStore(); const [experienceSort, setExperienceSort] = useState<"asc" | "desc">("asc"); const [statusSort, setStatusSort] = useState<"asc" | "desc">("desc"); - const { applyStatusData, isLoading } = useApplyStatus({ + const { applyStatusData, isLoading } = useApplicationStatus({ formId, limit: 30, cursor: 0, @@ -24,9 +28,37 @@ const ApplyStatusCard = ({ formId }: ApplyStatusCardProps) => { orderByStatus: statusSort, }); + const { mutate: updateStatus } = useUpdateApplicationStatus(); + const toggleExperienceSort = () => setExperienceSort((prev) => (prev === "asc" ? "desc" : "asc")); const toggleStatusSort = () => setStatusSort((prev) => (prev === "asc" ? "desc" : "asc")); + // 지원자 행 클릭 핸들러 추가 + const handleApplicationClick = (application: ApplicationResponse) => { + openModal("myApplication", { + formId, + isOpen: true, + initialData: application, // 선택된 지원자 데이터 전달 + }); + }; + + // 상태 변경 핸들러 추가 + const handleStatusChange = (applicationId: string, newStatus: string) => { + // APPLICATION_STATUS_MAP의 값과 키를 뒤집어서 매핑 + const reverseStatusMap = Object.entries(APPLICATION_STATUS_MAP).reduce( + (acc, [key, value]) => { + acc[value] = key as ApplicationStatusType; + return acc; + }, + {} as Record + ); + + updateStatus({ + applicationId, + status: reverseStatusMap[newStatus], + }); + }; + // 지원 현황 로딩 중 if (isLoading) { return ( @@ -67,13 +99,25 @@ const ApplyStatusCard = ({ formId }: ApplyStatusCardProps) => { {/* Tbody */}
{applyStatusData.data.map((application) => ( -
- {application.name} - {application.phoneNumber} - {application.experienceMonths}개월 - - {translateStatus(application.status as ApplicationStatusType)} - +
+ +
+ handleStatusChange(application.id.toString(), newStatus)} + className="w-24 md:w-28" + /> +
))}
diff --git a/src/app/components/card/cardList/apply/SkeletonRow.tsx b/src/app/components/card/cardList/apply/SkeletonRow.tsx index 1c6d6b41..c140eb0e 100644 --- a/src/app/components/card/cardList/apply/SkeletonRow.tsx +++ b/src/app/components/card/cardList/apply/SkeletonRow.tsx @@ -1,7 +1,7 @@ import React from "react"; export const SkeletonRow: React.FC = () => ( -
+
{[1, 2, 3, 4].map((index) => (
+
이름 전화번호
diff --git a/src/app/components/input/dateTimeDaypicker/DatePickerInput.tsx b/src/app/components/input/dateTimeDaypicker/DatePickerInput.tsx index c592c42e..eaa4b687 100644 --- a/src/app/components/input/dateTimeDaypicker/DatePickerInput.tsx +++ b/src/app/components/input/dateTimeDaypicker/DatePickerInput.tsx @@ -28,13 +28,8 @@ const DatePickerInput = ({ const handleClick = () => { if (endDate) { - console.log("endDate", endDate); - onChange([null, null]); - console.log("nullnull 핸들클릭 이벤트 발생"); - console.log("endDate", endDate); } - console.log("핸들클릭 이벤트 발생"); handleOpenDropdown(); }; const handleChange = (update: [Date | null, Date | null]) => { @@ -106,6 +101,7 @@ const DatePickerInput = ({ startDate={startDate} endDate={endDate} onChange={handleChange} + minDate={startDate} renderCustomHeader={(props) => } />
diff --git a/src/app/components/input/file/ImageInput/ImageInput.tsx b/src/app/components/input/file/ImageInput/ImageInput.tsx deleted file mode 100644 index 2956dc61..00000000 --- a/src/app/components/input/file/ImageInput/ImageInput.tsx +++ /dev/null @@ -1,98 +0,0 @@ -"use client"; -import { HiUpload } from "react-icons/hi"; -import { forwardRef, useState, useEffect } from "react"; -import { toast } from "react-hot-toast"; -import PreviewItem from "./PreviewItem"; -import { cn } from "@/lib/tailwindUtil"; -import { ImageInputType } from "@/types/addform"; - -interface ImageInputProps { - name: string; - onChange?: (files: File[]) => void; - onDelete?: (id: string) => void; - initialImageList: ImageInputType[]; -} - -const ImageInput = forwardRef((props, ref) => { - const [imageList, setImageList] = useState(props.initialImageList || []); - - useEffect(() => { - if (props.initialImageList?.length > 0) { - setImageList(props.initialImageList); - } - }, [props.initialImageList, imageList]); - - const handleFileChange = (selectedFile: File | null) => { - if (selectedFile) { - if (!selectedFile.type.startsWith("image/")) { - toast.error("이미지 파일만 업로드할 수 있습니다."); - return; - } else if (selectedFile && imageList.length >= 3) { - toast.error("이미지는 최대 3개까지 업로드할 수 있습니다."); - return; - } - props.onChange?.([selectedFile]); // 파일을 상위로 전달하면 url이 prop으로 내려옴 - } - }; - - const handleDeleteImage = (targetUrl: string) => { - // 삭제 했을때 다른 이미지 미리보기도 엑박뜨는 현상 있음 ! - const newImageList = imageList.filter((image) => image.url !== targetUrl); - setImageList(newImageList); - // 제거한 리스트를 상위에서 setValue - props.onDelete?.(targetUrl); - }; - - const handleOpenFileSelector = () => { - if (typeof ref === "function") { - // input 요소를 찾아서 클릭 - const fileInput = document.querySelector(`input[name="${props.name}"]`); - if (fileInput) { - (fileInput as HTMLInputElement).click(); - } - } else if (ref && "current" in ref) { - ref.current?.click(); - } - }; - - const colorStyle = { - bgColor: "bg-background-200", - borderColor: "border-[0.5px] border-transparent", - hoverColor: "hover:border-grayscale-200 hover:bg-background-300", - innerHoverColor: "hover:bg-background-300", - }; - - return ( - // 인풋 + 프리뷰 wrapper -
-
- handleFileChange(e.target.files?.[0] || null)} - className="hidden" - /> -
- -
-
- {imageList.map((image) => ( - - ))} -
- ); -}); - -ImageInput.displayName = "ImageInput"; - -export default ImageInput; diff --git a/src/app/components/layout/ChannelTalk.tsx b/src/app/components/layout/ChannelTalk.tsx new file mode 100644 index 00000000..c3767591 --- /dev/null +++ b/src/app/components/layout/ChannelTalk.tsx @@ -0,0 +1,39 @@ +"use client"; + +import { useEffect } from "react"; +import * as ChannelService from "@channel.io/channel-web-sdk-loader"; +import toast from "react-hot-toast"; + +const ChannelTalk = () => { + const pluginKey = process.env.NEXT_PUBLIC_CHANNEL_IO_PLUGIN_KEY || ""; + + useEffect(() => { + if (!pluginKey) { + toast.error("채널톡 플러그인 키가 없습니다!"); + return; + } + + const initChannelTalk = () => { + try { + ChannelService.loadScript(); + ChannelService.boot({ + pluginKey, + hideChannelButtonOnBoot: false, + }); + } catch (error) { + console.error("채널톡 초기화 오류:", error); + toast.error("채널톡 초기화 중 오류가 발생했습니다"); + } + }; + + initChannelTalk(); + + return () => { + ChannelService.shutdown(); + }; + }, [pluginKey]); + + return null; +}; + +export default ChannelTalk; diff --git a/src/app/components/layout/Header.tsx b/src/app/components/layout/Header.tsx index 7393b76d..82a55292 100644 --- a/src/app/components/layout/Header.tsx +++ b/src/app/components/layout/Header.tsx @@ -10,6 +10,8 @@ import { toast } from "react-hot-toast"; import { useUser } from "@/hooks/queries/user/me/useUser"; import LinkBtn from "../button/default/LinkBtn"; import { useRouter } from "next/navigation"; +import Spinner from "../loading-spinner/HamburgerSpinner"; +import { HiMiniBars3 } from "react-icons/hi2"; export default function Header() { const { logout } = useLogout(); @@ -19,15 +21,13 @@ export default function Header() { const router = useRouter(); // 인증이 필요없는 공개 경로들 - const handleLogout = (e: React.MouseEvent) => { + const handleLogout = async (e: React.MouseEvent) => { e.preventDefault(); try { - logout(); + await logout(); toast.success("로그아웃되었습니다."); setIsSideMenuOpen(false); - setTimeout(() => { - router.push("/login"); - }, 100); + router.push("/login"); } catch (error) { console.error("로그아웃 실패:", error); toast.error("로그아웃에 실패했습니다."); @@ -49,8 +49,6 @@ export default function Header() { "fixed left-0 right-0 top-0 z-40 shadow-sm bg-primary-orange-50 -tracking-widest md:tracking-normal"; const navStyle = "mx-auto flex h-16 min-w-[327px] items-center justify-between px-6 max-w-screen-xl "; const menuStyle = "ml-4 flex h-16 items-center gap-4 md:ml-8 md:gap-6 lg:ml-[46px]"; - const skeletonStyle = "w-16 animate-pulse bg-primary-orange-100"; - return (