From 19f52e4f13bbb1a343ce5d82b093e829d659b300 Mon Sep 17 00:00:00 2001 From: dietken1 Date: Fri, 2 May 2025 14:51:40 +0900 Subject: [PATCH 01/44] =?UTF-8?q?=EB=B0=B1=EC=97=94=EB=93=9C=20=EC=84=B8?= =?UTF-8?q?=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/pirocheck/.gitattributes | 3 + backend/pirocheck/.gitignore | 37 +++ backend/pirocheck/build.gradle | 36 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43705 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + backend/pirocheck/gradlew | 251 ++++++++++++++++++ backend/pirocheck/gradlew.bat | 94 +++++++ backend/pirocheck/settings.gradle | 1 + .../pirocheck/PirocheckApplication.java | 13 + .../src/main/resources/application.properties | 1 + .../pirocheck/PirocheckApplicationTests.java | 13 + 11 files changed, 456 insertions(+) create mode 100644 backend/pirocheck/.gitattributes create mode 100644 backend/pirocheck/.gitignore create mode 100644 backend/pirocheck/build.gradle create mode 100644 backend/pirocheck/gradle/wrapper/gradle-wrapper.jar create mode 100644 backend/pirocheck/gradle/wrapper/gradle-wrapper.properties create mode 100644 backend/pirocheck/gradlew create mode 100644 backend/pirocheck/gradlew.bat create mode 100644 backend/pirocheck/settings.gradle create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/PirocheckApplication.java create mode 100644 backend/pirocheck/src/main/resources/application.properties create mode 100644 backend/pirocheck/src/test/java/backend/pirocheck/PirocheckApplicationTests.java diff --git a/backend/pirocheck/.gitattributes b/backend/pirocheck/.gitattributes new file mode 100644 index 0000000..8af972c --- /dev/null +++ b/backend/pirocheck/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/backend/pirocheck/.gitignore b/backend/pirocheck/.gitignore new file mode 100644 index 0000000..c2065bc --- /dev/null +++ b/backend/pirocheck/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/backend/pirocheck/build.gradle b/backend/pirocheck/build.gradle new file mode 100644 index 0000000..d57d42b --- /dev/null +++ b/backend/pirocheck/build.gradle @@ -0,0 +1,36 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.4.5' + id 'io.spring.dependency-management' version '1.1.7' +} + +group = 'backend' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/backend/pirocheck/gradle/wrapper/gradle-wrapper.jar b/backend/pirocheck/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..9bbc975c742b298b441bfb90dbc124400a3751b9 GIT binary patch literal 43705 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 DHx0+F literal 0 HcmV?d00001 diff --git a/backend/pirocheck/gradle/wrapper/gradle-wrapper.properties b/backend/pirocheck/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..37f853b --- /dev/null +++ b/backend/pirocheck/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/backend/pirocheck/gradlew b/backend/pirocheck/gradlew new file mode 100644 index 0000000..faf9300 --- /dev/null +++ b/backend/pirocheck/gradlew @@ -0,0 +1,251 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/backend/pirocheck/gradlew.bat b/backend/pirocheck/gradlew.bat new file mode 100644 index 0000000..9d21a21 --- /dev/null +++ b/backend/pirocheck/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/backend/pirocheck/settings.gradle b/backend/pirocheck/settings.gradle new file mode 100644 index 0000000..6789af9 --- /dev/null +++ b/backend/pirocheck/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'pirocheck' diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/PirocheckApplication.java b/backend/pirocheck/src/main/java/backend/pirocheck/PirocheckApplication.java new file mode 100644 index 0000000..96ad2c4 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/PirocheckApplication.java @@ -0,0 +1,13 @@ +package backend.pirocheck; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class PirocheckApplication { + + public static void main(String[] args) { + SpringApplication.run(PirocheckApplication.class, args); + } + +} diff --git a/backend/pirocheck/src/main/resources/application.properties b/backend/pirocheck/src/main/resources/application.properties new file mode 100644 index 0000000..5aa603d --- /dev/null +++ b/backend/pirocheck/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=pirocheck diff --git a/backend/pirocheck/src/test/java/backend/pirocheck/PirocheckApplicationTests.java b/backend/pirocheck/src/test/java/backend/pirocheck/PirocheckApplicationTests.java new file mode 100644 index 0000000..ed24e06 --- /dev/null +++ b/backend/pirocheck/src/test/java/backend/pirocheck/PirocheckApplicationTests.java @@ -0,0 +1,13 @@ +package backend.pirocheck; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class PirocheckApplicationTests { + + @Test + void contextLoads() { + } + +} From 162d833536d3c7ab054856df18a0985a7ddeae94 Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Fri, 2 May 2025 17:59:57 +0900 Subject: [PATCH 02/44] =?UTF-8?q?[add]:=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EC=B4=88=EA=B8=B0=20=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/public/vite.svg | 1 - frontend/src/App.jsx | 40 +- frontend/src/assets/react.svg | 1 - frontend/src/assets/root.css | 27 + frontend/src/components/InfoBlock.jsx | 12 + frontend/src/components/InputBlock.jsx | 18 + frontend/src/components/PageBtn.jsx | 15 + .../components/componentsCss/InfoBlock.css | 10 + frontend/src/main.jsx | 15 +- frontend/src/root.module.css | 27 - frontend/yarn.lock | 1327 +++++++++++++++++ 11 files changed, 1431 insertions(+), 62 deletions(-) delete mode 100644 frontend/public/vite.svg delete mode 100644 frontend/src/assets/react.svg create mode 100644 frontend/src/assets/root.css create mode 100644 frontend/src/components/InfoBlock.jsx create mode 100644 frontend/src/components/InputBlock.jsx create mode 100644 frontend/src/components/PageBtn.jsx create mode 100644 frontend/src/components/componentsCss/InfoBlock.css delete mode 100644 frontend/src/root.module.css create mode 100644 frontend/yarn.lock diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/frontend/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index f67355a..d535b0e 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,35 +1,23 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from '/vite.svg' -import './App.css' +import React from "react"; +import InputBlock from "./components/InputBlock"; +import InfoBlock from "./components/InfoBlock"; +import PageBtn from "./components/PageBtn"; function App() { - const [count, setCount] = useState(0) - return ( <> -

Vite + React

-
- -

- Edit src/App.jsx and save to test HMR -

+ + +
-

- Click on the Vite and React logos to learn more -

- ) + ); } -export default App +export default App; diff --git a/frontend/src/assets/react.svg b/frontend/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/frontend/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/assets/root.css b/frontend/src/assets/root.css new file mode 100644 index 0000000..03f70a6 --- /dev/null +++ b/frontend/src/assets/root.css @@ -0,0 +1,27 @@ +@font-face { + font-family: "Cafe24Moyamoya-Regular-v1.0"; + src: url("https://fastly.jsdelivr.net/gh/projectnoonnu/noonfonts_231029@1.1/Cafe24Moyamoya-Regular-v1.0.woff2") + format("woff2"); + font-weight: normal; + font-style: normal; +} +:root { + --main-green: #49ff24; + --card-toggle-green: #2aff00; + --card-detail-green: #2d791d; + --icon-top-green: #14ae5c; + --icon-detail-green: #14ae5c; + --icon-detail-yellow: #ffcd29; + --icon-detail-red: #ff2c2c; + --background-black: #000000; + --fill-gray: #d9d9d9; + --warn-red: #ff5858; + --text-white: #ffffff; + --border-gray: #c7c7c7; +} +.noto-sans-kr-context { + font-family: "Noto Sans KR", sans-serif; + font-optical-sizing: auto; + font-weight: 400; + font-style: normal; +} diff --git a/frontend/src/components/InfoBlock.jsx b/frontend/src/components/InfoBlock.jsx new file mode 100644 index 0000000..2f66b2c --- /dev/null +++ b/frontend/src/components/InfoBlock.jsx @@ -0,0 +1,12 @@ +import React from "react"; + +const InfoBlock = () => { + return ( +
+

+

+
+ ); +}; + +export default InfoBlock; diff --git a/frontend/src/components/InputBlock.jsx b/frontend/src/components/InputBlock.jsx new file mode 100644 index 0000000..6aaf0bb --- /dev/null +++ b/frontend/src/components/InputBlock.jsx @@ -0,0 +1,18 @@ +import React from "react"; +import "./componentsCss/InfoBlock.css"; + +const InputBlock = () => { + return ( +
+ + + +
+ ); +}; + +export default InputBlock; diff --git a/frontend/src/components/PageBtn.jsx b/frontend/src/components/PageBtn.jsx new file mode 100644 index 0000000..678b3cc --- /dev/null +++ b/frontend/src/components/PageBtn.jsx @@ -0,0 +1,15 @@ +import React from "react"; + +const PageBtn = ({ buttons }) => { + return ( +
+ {buttons.map((btn, index) => ( + + ))} +
+ ); +}; + +export default PageBtn; diff --git a/frontend/src/components/componentsCss/InfoBlock.css b/frontend/src/components/componentsCss/InfoBlock.css new file mode 100644 index 0000000..cc36177 --- /dev/null +++ b/frontend/src/components/componentsCss/InfoBlock.css @@ -0,0 +1,10 @@ +.inputTag { + width: 309px; + height: 47px; + border-radius: 14px; + background-color: var(--border-gray); + color: var(--text-white); + font-weight: 400; + font-size: 16px; + font-family: "Noto Sans KR", sans-serif; +} diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index b9a1a6d..bafbc51 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -1,10 +1,11 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import './index.css' -import App from './App.jsx' +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import "./index.css"; +import App from "./App.jsx"; +import "./assets/root.css"; -createRoot(document.getElementById('root')).render( +createRoot(document.getElementById("root")).render( - , -) + +); diff --git a/frontend/src/root.module.css b/frontend/src/root.module.css deleted file mode 100644 index 14354e4..0000000 --- a/frontend/src/root.module.css +++ /dev/null @@ -1,27 +0,0 @@ -:root { - .noto-sans-kr-context { - font-family: "Noto Sans KR", sans-serif; - font-optical-sizing: auto; - font-weight: 400; - font-style: normal; - } - @font-face { - font-family: "Cafe24Moyamoya-Regular-v1.0"; - src: url("https://fastly.jsdelivr.net/gh/projectnoonnu/noonfonts_231029@1.1/Cafe24Moyamoya-Regular-v1.0.woff2") - format("woff2"); - font-weight: normal; - font-style: normal; - } - --main-green: #49ff24; - --card-toggle-green: #2aff00; - --card-detail-green: #2d791d; - --icon-top-green: #14ae5c; - --icon-detail-green: #14ae5c; - --icon-detail-yellow: #ffcd29; - --icon-detail-red: #ff2c2c; - --background-black: #000000; - --fill-gray: #d9d9d9; - --warn-red: #ff5858; - --text-white: #ffffff; - --border-gray: #c7c7c7; -} diff --git a/frontend/yarn.lock b/frontend/yarn.lock new file mode 100644 index 0000000..0755fbc --- /dev/null +++ b/frontend/yarn.lock @@ -0,0 +1,1327 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.1.tgz#db7cf122745e0a332c44e847ddc4f5e5221a43f6" + integrity sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A== + +"@babel/core@^7.26.10": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.27.1.tgz#89de51e86bd12246003e3524704c49541b16c3e6" + integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.1" + "@babel/helper-compilation-targets" "^7.27.1" + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helpers" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/template" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.1.tgz#862d4fad858f7208edd487c28b58144036b76230" + integrity sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w== + dependencies: + "@babel/parser" "^7.27.1" + "@babel/types" "^7.27.1" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz#eac1096c7374f161e4f33fc8ae38f4ddf122087a" + integrity sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g== + dependencies: + "@babel/compat-data" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz#e1663b8b71d2de948da5c4fb2a20ca4f3ec27a6f" + integrity sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-plugin-utils@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.1.tgz#ffc27013038607cdba3288e692c3611c06a18aa4" + integrity sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ== + dependencies: + "@babel/template" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.1.tgz#c55d5bed74449d1223701f1869b9ee345cc94cc9" + integrity sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ== + dependencies: + "@babel/types" "^7.27.1" + +"@babel/plugin-transform-react-jsx-self@^7.25.9": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" + integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-react-jsx-source@^7.25.9": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" + integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/template@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.1.tgz#b9e4f55c17a92312774dfbdde1b3c01c547bbae2" + integrity sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.1.tgz#4db772902b133bbddd1c4f7a7ee47761c1b9f291" + integrity sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/template" "^7.27.1" + "@babel/types" "^7.27.1" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.1.tgz#9defc53c16fc899e46941fc6901a9eea1c9d8560" + integrity sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@esbuild/aix-ppc64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz#014180d9a149cffd95aaeead37179433f5ea5437" + integrity sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ== + +"@esbuild/android-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz#649e47e04ddb24a27dc05c395724bc5f4c55cbfe" + integrity sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ== + +"@esbuild/android-arm@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.3.tgz#8a0f719c8dc28a4a6567ef7328c36ea85f568ff4" + integrity sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A== + +"@esbuild/android-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.3.tgz#e2ab182d1fd06da9bef0784a13c28a7602d78009" + integrity sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ== + +"@esbuild/darwin-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz#c7f3166fcece4d158a73dcfe71b2672ca0b1668b" + integrity sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w== + +"@esbuild/darwin-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz#d8c5342ec1a4bf4b1915643dfe031ba4b173a87a" + integrity sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A== + +"@esbuild/freebsd-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz#9f7d789e2eb7747d4868817417cc968ffa84f35b" + integrity sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw== + +"@esbuild/freebsd-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz#8ad35c51d084184a8e9e76bb4356e95350a64709" + integrity sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q== + +"@esbuild/linux-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz#3af0da3d9186092a9edd4e28fa342f57d9e3cd30" + integrity sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A== + +"@esbuild/linux-arm@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz#e91cafa95e4474b3ae3d54da12e006b782e57225" + integrity sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ== + +"@esbuild/linux-ia32@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz#81025732d85b68ee510161b94acdf7e3007ea177" + integrity sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw== + +"@esbuild/linux-loong64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz#3c744e4c8d5e1148cbe60a71a11b58ed8ee5deb8" + integrity sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g== + +"@esbuild/linux-mips64el@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz#1dfe2a5d63702db9034cc6b10b3087cc0424ec26" + integrity sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag== + +"@esbuild/linux-ppc64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz#2e85d9764c04a1ebb346dc0813ea05952c9a5c56" + integrity sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg== + +"@esbuild/linux-riscv64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz#a9ea3334556b09f85ccbfead58c803d305092415" + integrity sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA== + +"@esbuild/linux-s390x@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz#f6a7cb67969222b200974de58f105dfe8e99448d" + integrity sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ== + +"@esbuild/linux-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz#a237d3578ecdd184a3066b1f425e314ade0f8033" + integrity sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA== + +"@esbuild/netbsd-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz#4c15c68d8149614ddb6a56f9c85ae62ccca08259" + integrity sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA== + +"@esbuild/netbsd-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz#12f6856f8c54c2d7d0a8a64a9711c01a743878d5" + integrity sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g== + +"@esbuild/openbsd-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz#ca078dad4a34df192c60233b058db2ca3d94bc5c" + integrity sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ== + +"@esbuild/openbsd-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz#c9178adb60e140e03a881d0791248489c79f95b2" + integrity sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w== + +"@esbuild/sunos-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz#03765eb6d4214ff27e5230af779e80790d1ee09f" + integrity sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA== + +"@esbuild/win32-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz#f1c867bd1730a9b8dfc461785ec6462e349411ea" + integrity sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ== + +"@esbuild/win32-ia32@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz#77491f59ef6c9ddf41df70670d5678beb3acc322" + integrity sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew== + +"@esbuild/win32-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz#b17a2171f9074df9e91bfb07ef99a892ac06412a" + integrity sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" + integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/config-array@^0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.0.tgz#7a1232e82376712d3340012a2f561a2764d1988f" + integrity sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ== + dependencies: + "@eslint/object-schema" "^2.1.6" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/config-helpers@^0.2.1": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.2.tgz#3779f76b894de3a8ec4763b79660e6d54d5b1010" + integrity sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg== + +"@eslint/core@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.13.0.tgz#bf02f209846d3bf996f9e8009db62df2739b458c" + integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" + integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.25.1", "@eslint/js@^9.22.0": + version "9.25.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.25.1.tgz#25f5c930c2b68b5ebe7ac857f754cbd61ef6d117" + integrity sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg== + +"@eslint/object-schema@^2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" + integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== + +"@eslint/plugin-kit@^0.2.8": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz#47488d8f8171b5d4613e833313f3ce708e3525f8" + integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA== + dependencies: + "@eslint/core" "^0.13.0" + levn "^0.4.1" + +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.2.tgz#1860473de7dfa1546767448f333db80cb0ff2161" + integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ== + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@rollup/rollup-android-arm-eabi@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz#e1562d360bca73c7bef6feef86098de3a2f1d442" + integrity sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw== + +"@rollup/rollup-android-arm64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz#37ba63940211673e15dcc5f469a78e34276dbca7" + integrity sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw== + +"@rollup/rollup-darwin-arm64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz#58b1eb86d997d71dabc5b78903233a3c27438ca0" + integrity sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA== + +"@rollup/rollup-darwin-x64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz#5e22dab3232b1e575d930ce891abb18fe19c58c9" + integrity sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw== + +"@rollup/rollup-freebsd-arm64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz#04c892d9ff864d66e31419634726ab0bebb33707" + integrity sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw== + +"@rollup/rollup-freebsd-x64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz#f4b1e091f7cf5afc9e3a029d70128ad56409ecfb" + integrity sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q== + +"@rollup/rollup-linux-arm-gnueabihf@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz#c8814bb5ce047a81b1fe4a33628dfd4ac52bd864" + integrity sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg== + +"@rollup/rollup-linux-arm-musleabihf@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz#5b4e7bd83cbebbf5ffe958802dcfd4ee34bf73a3" + integrity sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg== + +"@rollup/rollup-linux-arm64-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz#141c848e53cee011e82a11777b8a51f1b3e8d77c" + integrity sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg== + +"@rollup/rollup-linux-arm64-musl@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz#22ebeaf2fa301aa4aa6c84b760e6cd1d1ac7eb1e" + integrity sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ== + +"@rollup/rollup-linux-loongarch64-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz#20b77dc78e622f5814ff8e90c14c938ceb8043bc" + integrity sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz#2c90f99c987ef1198d4f8d15d754c286e1f07b13" + integrity sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg== + +"@rollup/rollup-linux-riscv64-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz#9336fd5e47d7f4760d02aa85f76976176eef53ca" + integrity sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ== + +"@rollup/rollup-linux-riscv64-musl@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz#d75b4d54d46439bb5c6c13762788f57e798f5670" + integrity sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA== + +"@rollup/rollup-linux-s390x-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz#e9f09b802f1291839247399028beaef9ce034c81" + integrity sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg== + +"@rollup/rollup-linux-x64-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz#0413169dc00470667dea8575c1129d4e7a73eb29" + integrity sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ== + +"@rollup/rollup-linux-x64-musl@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz#c76fd593323c60ea219439a00da6c6d33ffd0ea6" + integrity sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ== + +"@rollup/rollup-win32-arm64-msvc@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz#c7724c386eed0bda5ae7143e4081c1910cab349b" + integrity sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg== + +"@rollup/rollup-win32-ia32-msvc@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz#7749e1b65cb64fe6d41ad1ad9e970a0ccc8ac350" + integrity sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA== + +"@rollup/rollup-win32-x64-msvc@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz#8078b71fe0d5825dcbf83d52a7dc858b39da165c" + integrity sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA== + +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" + integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.7.tgz#968cdc2366ec3da159f61166428ee40f370e56c2" + integrity sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng== + dependencies: + "@babel/types" "^7.20.7" + +"@types/estree@1.0.7", "@types/estree@^1.0.6": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" + integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/react-dom@^19.0.4": + version "19.1.3" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.1.3.tgz#3f0c60804441bf34d19f8dd0d44405c0c0e21bfa" + integrity sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg== + +"@types/react@^19.0.10": + version "19.1.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.2.tgz#11df86f66f188f212c90ecb537327ec68bfd593f" + integrity sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw== + dependencies: + csstype "^3.0.2" + +"@vitejs/plugin-react@^4.3.4": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz#d7d1e9c9616d7536b0953637edfee7c6cbe2fe0f" + integrity sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w== + dependencies: + "@babel/core" "^7.26.10" + "@babel/plugin-transform-react-jsx-self" "^7.25.9" + "@babel/plugin-transform-react-jsx-source" "^7.25.9" + "@types/babel__core" "^7.20.5" + react-refresh "^0.17.0" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.14.0: + version "8.14.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" + integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +browserslist@^4.24.0: + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== + dependencies: + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001688: + version "1.0.30001716" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz#39220dfbc58c85d9d4519e7090b656aa11ca4b85" + integrity sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.0.2.tgz#27360701532116bd3f1f9416929d176afe1e4610" + integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== + +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +debug@^4.1.0, debug@^4.3.1, debug@^4.3.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +electron-to-chromium@^1.5.73: + version "1.5.149" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz#b6d1a468b9537165e2494d0b5b82e9b3392d0ddb" + integrity sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ== + +esbuild@^0.25.0: + version "0.25.3" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.3.tgz#371f7cb41283e5b2191a96047a7a89562965a285" + integrity sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.3" + "@esbuild/android-arm" "0.25.3" + "@esbuild/android-arm64" "0.25.3" + "@esbuild/android-x64" "0.25.3" + "@esbuild/darwin-arm64" "0.25.3" + "@esbuild/darwin-x64" "0.25.3" + "@esbuild/freebsd-arm64" "0.25.3" + "@esbuild/freebsd-x64" "0.25.3" + "@esbuild/linux-arm" "0.25.3" + "@esbuild/linux-arm64" "0.25.3" + "@esbuild/linux-ia32" "0.25.3" + "@esbuild/linux-loong64" "0.25.3" + "@esbuild/linux-mips64el" "0.25.3" + "@esbuild/linux-ppc64" "0.25.3" + "@esbuild/linux-riscv64" "0.25.3" + "@esbuild/linux-s390x" "0.25.3" + "@esbuild/linux-x64" "0.25.3" + "@esbuild/netbsd-arm64" "0.25.3" + "@esbuild/netbsd-x64" "0.25.3" + "@esbuild/openbsd-arm64" "0.25.3" + "@esbuild/openbsd-x64" "0.25.3" + "@esbuild/sunos-x64" "0.25.3" + "@esbuild/win32-arm64" "0.25.3" + "@esbuild/win32-ia32" "0.25.3" + "@esbuild/win32-x64" "0.25.3" + +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-plugin-react-hooks@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz#1be0080901e6ac31ce7971beed3d3ec0a423d9e3" + integrity sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg== + +eslint-plugin-react-refresh@^0.4.19: + version "0.4.20" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz#3bbfb5c8637e28d19ce3443686445e502ecd18ba" + integrity sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA== + +eslint-scope@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d" + integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +eslint@^9.22.0: + version "9.25.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.25.1.tgz#8a7cf8dd0e6acb858f86029720adb1785ee57580" + integrity sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.20.0" + "@eslint/config-helpers" "^0.2.1" + "@eslint/core" "^0.13.0" + "@eslint/eslintrc" "^3.3.1" + "@eslint/js" "9.25.1" + "@eslint/plugin-kit" "^0.2.8" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.3.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== + dependencies: + acorn "^8.14.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.0" + +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fdir@^6.4.4: + version "6.4.4" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9" + integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-16.0.0.tgz#3d7684652c5c4fbd086ec82f9448214da49382d8" + integrity sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +ignore@^5.2.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.0, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.8: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +postcss@^8.5.3: + version "8.5.3" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" + integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== + dependencies: + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +react-dom@^19.0.0: + version "19.1.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.1.0.tgz#133558deca37fa1d682708df8904b25186793623" + integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== + dependencies: + scheduler "^0.26.0" + +react-refresh@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53" + integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== + +react-router-dom@^7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.5.3.tgz#496e9f6d90f731703c7772668b41747028e0a2d5" + integrity sha512-cK0jSaTyW4jV9SRKAItMIQfWZ/D6WEZafgHuuCb9g+SjhLolY78qc+De4w/Cz9ybjvLzShAmaIMEXt8iF1Cm+A== + dependencies: + react-router "7.5.3" + +react-router@7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.5.3.tgz#9e5420832af8c3690740c1797d4fa54613fea06d" + integrity sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw== + dependencies: + cookie "^1.0.1" + set-cookie-parser "^2.6.0" + turbo-stream "2.4.0" + +react@^19.0.0: + version "19.1.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.1.0.tgz#926864b6c48da7627f004795d6cce50e90793b75" + integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +rollup@^4.34.9: + version "4.40.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.1.tgz#03d6c53ebb6a9c2c060ae686a61e72a2472b366f" + integrity sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw== + dependencies: + "@types/estree" "1.0.7" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.40.1" + "@rollup/rollup-android-arm64" "4.40.1" + "@rollup/rollup-darwin-arm64" "4.40.1" + "@rollup/rollup-darwin-x64" "4.40.1" + "@rollup/rollup-freebsd-arm64" "4.40.1" + "@rollup/rollup-freebsd-x64" "4.40.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.40.1" + "@rollup/rollup-linux-arm-musleabihf" "4.40.1" + "@rollup/rollup-linux-arm64-gnu" "4.40.1" + "@rollup/rollup-linux-arm64-musl" "4.40.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.40.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.40.1" + "@rollup/rollup-linux-riscv64-gnu" "4.40.1" + "@rollup/rollup-linux-riscv64-musl" "4.40.1" + "@rollup/rollup-linux-s390x-gnu" "4.40.1" + "@rollup/rollup-linux-x64-gnu" "4.40.1" + "@rollup/rollup-linux-x64-musl" "4.40.1" + "@rollup/rollup-win32-arm64-msvc" "4.40.1" + "@rollup/rollup-win32-ia32-msvc" "4.40.1" + "@rollup/rollup-win32-x64-msvc" "4.40.1" + fsevents "~2.3.2" + +scheduler@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337" + integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +set-cookie-parser@^2.6.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943" + integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +tinyglobby@^0.2.13: + version "0.2.13" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e" + integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== + dependencies: + fdir "^6.4.4" + picomatch "^4.0.2" + +turbo-stream@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/turbo-stream/-/turbo-stream-2.4.0.tgz#1e4fca6725e90fa14ac4adb782f2d3759a5695f0" + integrity sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +update-browserslist-db@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +vite@^6.3.1: + version "6.3.4" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.3.4.tgz#d441a72c7cd9a93b719bb851250a4e6c119c9cff" + integrity sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw== + dependencies: + esbuild "^0.25.0" + fdir "^6.4.4" + picomatch "^4.0.2" + postcss "^8.5.3" + rollup "^4.34.9" + tinyglobby "^0.2.13" + optionalDependencies: + fsevents "~2.3.3" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From c628b9b01a0438ee1c138ce8c30bdf05a973ca2b Mon Sep 17 00:00:00 2001 From: l-wanderer01 Date: Sun, 4 May 2025 20:51:55 +0900 Subject: [PATCH 03/44] =?UTF-8?q?[feat]=20PostgreSQL=20=EC=97=B0=EA=B2=B0?= =?UTF-8?q?=20=EB=B0=8F=20application.yml,=20build.gradle=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/pirocheck/.gitignore | 3 +++ backend/pirocheck/build.gradle | 15 +++++++++++++++ .../backend/pirocheck/PirocheckApplication.java | 12 ++++++++++++ .../src/main/resources/application.properties | 1 - .../pirocheck/src/main/resources/application.yml | 12 ++++++++++++ 5 files changed, 42 insertions(+), 1 deletion(-) delete mode 100644 backend/pirocheck/src/main/resources/application.properties create mode 100644 backend/pirocheck/src/main/resources/application.yml diff --git a/backend/pirocheck/.gitignore b/backend/pirocheck/.gitignore index c2065bc..768f475 100644 --- a/backend/pirocheck/.gitignore +++ b/backend/pirocheck/.gitignore @@ -35,3 +35,6 @@ out/ ### VS Code ### .vscode/ + +### 환경 변수 ### +.env \ No newline at end of file diff --git a/backend/pirocheck/build.gradle b/backend/pirocheck/build.gradle index d57d42b..db75dba 100644 --- a/backend/pirocheck/build.gradle +++ b/backend/pirocheck/build.gradle @@ -29,6 +29,21 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + + // REST API 사용을 위해 반드시 필요 + implementation 'org.springframework.boot:spring-boot-starter-web' + + // DTO에서 @Valid 사용 시 필요 + implementation 'org.springframework.boot:spring-boot-starter-validation' + + // PostgreSQL + runtimeOnly 'org.postgresql:postgresql' + + // 환경변수 관리 + implementation 'io.github.cdimascio:java-dotenv:5.2.2' + + // Swagger + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.6' } tasks.named('test') { diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/PirocheckApplication.java b/backend/pirocheck/src/main/java/backend/pirocheck/PirocheckApplication.java index 96ad2c4..b7e39e5 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/PirocheckApplication.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/PirocheckApplication.java @@ -2,11 +2,23 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import io.github.cdimascio.dotenv.Dotenv; @SpringBootApplication public class PirocheckApplication { public static void main(String[] args) { + + // .env 파일 로드 + Dotenv dotenv = Dotenv.configure() + .directory("./") // .env 파일 경로 설정 (기본: 프로젝트 루트) + .load(); + + // 환경변수를 시스템 프로퍼티에 추가 + dotenv.entries().forEach(entry -> + System.setProperty(entry.getKey(), entry.getValue()) + ); + SpringApplication.run(PirocheckApplication.class, args); } diff --git a/backend/pirocheck/src/main/resources/application.properties b/backend/pirocheck/src/main/resources/application.properties deleted file mode 100644 index 5aa603d..0000000 --- a/backend/pirocheck/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=pirocheck diff --git a/backend/pirocheck/src/main/resources/application.yml b/backend/pirocheck/src/main/resources/application.yml new file mode 100644 index 0000000..656f19b --- /dev/null +++ b/backend/pirocheck/src/main/resources/application.yml @@ -0,0 +1,12 @@ +spring: + datasource: + url: jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME} + username: ${DB_USER} + password: ${DB_PASSWORD} + jpa: + hibernate: + ddl-auto: update + show-sql: true + properties: + hibernate: + format_sql: true \ No newline at end of file From 627e060bf4130ab3bd28e501b7b32fd715fcecdb Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 4 May 2025 21:49:16 +0900 Subject: [PATCH 04/44] [Feat] add Header component --- .gitignore | 3 +- README.md | 2 +- frontend/.gitignore | 3 +- frontend/package-lock.json | 10 + frontend/package.json | 1 + frontend/src/App.jsx | 2 + frontend/src/assets/img/arrowicon.png | Bin 0 -> 195 bytes frontend/src/assets/img/moneyicon.png | Bin 0 -> 695 bytes frontend/src/components/Header.jsx | 34 ++ .../src/components/componentsCss/Header.css | 27 ++ frontend/src/index.css | 2 + frontend/src/main.jsx | 8 +- frontend/yarn.lock | 457 +++++++++--------- 13 files changed, 318 insertions(+), 231 deletions(-) create mode 100644 frontend/src/assets/img/arrowicon.png create mode 100644 frontend/src/assets/img/moneyicon.png create mode 100644 frontend/src/components/Header.jsx create mode 100644 frontend/src/components/componentsCss/Header.css diff --git a/.gitignore b/.gitignore index 01b6b1f..1007647 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ # Common .DS_Store *.log -.env \ No newline at end of file +.env +*.pem \ No newline at end of file diff --git a/README.md b/README.md index 49b5a71..b89f01f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# PiroCheck +# 🏫 PiroCheck 피로그래밍 과제/출석/보증금 관리 서비스 diff --git a/frontend/.gitignore b/frontend/.gitignore index d823d0d..4f48545 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -24,4 +24,5 @@ dist-ssr *.sw? -.env \ No newline at end of file +*.env +*.pem \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e8fb4e4..b2c7481 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,6 +8,7 @@ "name": "frontend", "version": "0.0.0", "dependencies": { + "lucide-react": "^0.507.0", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router-dom": "^7.5.3" @@ -2234,6 +2235,15 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "0.507.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.507.0.tgz", + "integrity": "sha512-XfgE6gvAHwAtnbUvWiTTHx4S3VGR+cUJHEc0vrh9Ogu672I1Tue2+Cp/8JJqpytgcBHAB1FVI297W4XGNwc2dQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 5baabb2..261de3d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "lucide-react": "^0.507.0", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router-dom": "^7.5.3" diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index d535b0e..b728e54 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -2,10 +2,12 @@ import React from "react"; import InputBlock from "./components/InputBlock"; import InfoBlock from "./components/InfoBlock"; import PageBtn from "./components/PageBtn"; +import Header from "./components/Header"; function App() { return ( <> +
diff --git a/frontend/src/assets/img/arrowicon.png b/frontend/src/assets/img/arrowicon.png new file mode 100644 index 0000000000000000000000000000000000000000..01e2334a7566d18228675e3e8b15a59ae2c04108 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBeuSrsV@L(#+p8Nn859LvE2uXzBn=cOQc0~VfQ_g mnf9iS-#z|2`GCEG&&jg4QC5wz?c|3kI-@I>r03Ik#yXIs$hj34kz`6X(lLV8>^eR`5JU`lYUco)Y z`S!kO@7R3;DkA5m@^PEZ?lvC_GD_iRy`py1Zw@TMFW3|@My=32`n1h26Geqy{TK*Z zGY<@7usxMbn}Bp8K=I$WtduGef-`v+gqZ;rd=pYr8>aAOd>FKrz-RS7zbb}H6kn-5 zvo0HJVDim*M3j&>ISfLfiizDv#OCZ@+Re^i*ZA#ky@3v5Lr)xp@0;n3r!2M4rz`1< z85pR82q7d?V)}%#!T4=Z-3XB4TMG^OSZQ6*u^SAQsrQJ5g7cJ)?pDZCAR-6j0+M4vOQDM};Pj}VjUe9AWf5d0ds{xFpp&%>gt zxc7Z7T4#1qXz5!SGICFcMAR{DcP=~i!mcfXkKC`G=(}fi#)QV4vcWe0%tcO;#Ly|L zTZVOQ;ZV|*)$qD|Bs3yg*wD^aF1*v-{NN#L?Ed&zGHrUWxTi%IkVSA=e5=i%eUaX5 z1dv@%%IZ7qW~$X>U=*r7&fv3t5US=@6_I8T-}G8pPm!Zu#h1K_Q^uI$|BHq6s)j7` d { + const navigate = useNavigate(); + const location = useLocation(); + const path = location.pathname; + + let title = "ATTENDANCE CHECK"; + if (path.includes('assignment')) title = "ASSIGNMENT CHECK"; + else if (path.includes('deposit')) title = "DEPOSIT"; + + const showRightButton = !path.includes('deposit'); + + return ( +
+ +

{title}

+ {showRightButton ? ( + + ) : ( +
// 오른쪽 공백 유지 + )} +
+ ); +}; + +export default Header; \ No newline at end of file diff --git a/frontend/src/components/componentsCss/Header.css b/frontend/src/components/componentsCss/Header.css new file mode 100644 index 0000000..a679d01 --- /dev/null +++ b/frontend/src/components/componentsCss/Header.css @@ -0,0 +1,27 @@ +.header-container { + background-color: var(--background-black); + color: var(--main-green); + font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; + display: flex; + align-items: center; + justify-content: space-between; + padding: 1rem; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} + +.header-title { + font-size: 1.25rem; + font-weight: bold; + color: var(--main-green); +} + +.icon-button { + background: none; + border: none; + cursor: pointer; + padding: 0; +} + +.icon-button svg { + color: var(--main-green); +} diff --git a/frontend/src/index.css b/frontend/src/index.css index 08a3ac9..0e256a2 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -66,3 +66,5 @@ button:focus-visible { background-color: #f9f9f9; } } + + diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index bafbc51..ca12f49 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -3,9 +3,13 @@ import { createRoot } from "react-dom/client"; import "./index.css"; import App from "./App.jsx"; import "./assets/root.css"; +import { BrowserRouter } from 'react-router-dom'; createRoot(document.getElementById("root")).render( - + /* - + */ + + + ); diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 0755fbc..736512a 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -4,7 +4,7 @@ "@ampproject/remapping@^2.2.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -12,7 +12,7 @@ "@babel/code-frame@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: "@babel/helper-validator-identifier" "^7.27.1" @@ -21,12 +21,12 @@ "@babel/compat-data@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.1.tgz#db7cf122745e0a332c44e847ddc4f5e5221a43f6" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz" integrity sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A== -"@babel/core@^7.26.10": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.26.10": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.27.1.tgz#89de51e86bd12246003e3524704c49541b16c3e6" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz" integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ== dependencies: "@ampproject/remapping" "^2.2.0" @@ -47,7 +47,7 @@ "@babel/generator@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.1.tgz#862d4fad858f7208edd487c28b58144036b76230" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz" integrity sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w== dependencies: "@babel/parser" "^7.27.1" @@ -58,7 +58,7 @@ "@babel/helper-compilation-targets@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz#eac1096c7374f161e4f33fc8ae38f4ddf122087a" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz" integrity sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g== dependencies: "@babel/compat-data" "^7.27.1" @@ -69,7 +69,7 @@ "@babel/helper-module-imports@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== dependencies: "@babel/traverse" "^7.27.1" @@ -77,7 +77,7 @@ "@babel/helper-module-transforms@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz#e1663b8b71d2de948da5c4fb2a20ca4f3ec27a6f" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz" integrity sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g== dependencies: "@babel/helper-module-imports" "^7.27.1" @@ -86,27 +86,27 @@ "@babel/helper-plugin-utils@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz" integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== "@babel/helper-string-parser@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== "@babel/helper-validator-identifier@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== "@babel/helper-validator-option@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== "@babel/helpers@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.1.tgz#ffc27013038607cdba3288e692c3611c06a18aa4" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz" integrity sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ== dependencies: "@babel/template" "^7.27.1" @@ -114,28 +114,28 @@ "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.1.tgz#c55d5bed74449d1223701f1869b9ee345cc94cc9" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz" integrity sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ== dependencies: "@babel/types" "^7.27.1" "@babel/plugin-transform-react-jsx-self@^7.25.9": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz" integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-react-jsx-source@^7.25.9": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz" integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/template@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.1.tgz#b9e4f55c17a92312774dfbdde1b3c01c547bbae2" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz" integrity sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg== dependencies: "@babel/code-frame" "^7.27.1" @@ -144,7 +144,7 @@ "@babel/traverse@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.1.tgz#4db772902b133bbddd1c4f7a7ee47761c1b9f291" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz" integrity sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg== dependencies: "@babel/code-frame" "^7.27.1" @@ -157,7 +157,7 @@ "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.1.tgz#9defc53c16fc899e46941fc6901a9eea1c9d8560" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz" integrity sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q== dependencies: "@babel/helper-string-parser" "^7.27.1" @@ -165,144 +165,144 @@ "@esbuild/aix-ppc64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz#014180d9a149cffd95aaeead37179433f5ea5437" + resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz" integrity sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ== -"@esbuild/android-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz#649e47e04ddb24a27dc05c395724bc5f4c55cbfe" - integrity sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ== - "@esbuild/android-arm@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.3.tgz#8a0f719c8dc28a4a6567ef7328c36ea85f568ff4" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz" integrity sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A== +"@esbuild/android-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz" + integrity sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ== + "@esbuild/android-x64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.3.tgz#e2ab182d1fd06da9bef0784a13c28a7602d78009" + resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz" integrity sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ== "@esbuild/darwin-arm64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz#c7f3166fcece4d158a73dcfe71b2672ca0b1668b" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz" integrity sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w== "@esbuild/darwin-x64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz#d8c5342ec1a4bf4b1915643dfe031ba4b173a87a" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz" integrity sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A== "@esbuild/freebsd-arm64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz#9f7d789e2eb7747d4868817417cc968ffa84f35b" + resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz" integrity sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw== "@esbuild/freebsd-x64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz#8ad35c51d084184a8e9e76bb4356e95350a64709" + resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz" integrity sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q== -"@esbuild/linux-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz#3af0da3d9186092a9edd4e28fa342f57d9e3cd30" - integrity sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A== - "@esbuild/linux-arm@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz#e91cafa95e4474b3ae3d54da12e006b782e57225" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz" integrity sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ== +"@esbuild/linux-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz" + integrity sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A== + "@esbuild/linux-ia32@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz#81025732d85b68ee510161b94acdf7e3007ea177" + resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz" integrity sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw== "@esbuild/linux-loong64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz#3c744e4c8d5e1148cbe60a71a11b58ed8ee5deb8" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz" integrity sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g== "@esbuild/linux-mips64el@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz#1dfe2a5d63702db9034cc6b10b3087cc0424ec26" + resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz" integrity sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag== "@esbuild/linux-ppc64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz#2e85d9764c04a1ebb346dc0813ea05952c9a5c56" + resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz" integrity sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg== "@esbuild/linux-riscv64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz#a9ea3334556b09f85ccbfead58c803d305092415" + resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz" integrity sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA== "@esbuild/linux-s390x@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz#f6a7cb67969222b200974de58f105dfe8e99448d" + resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz" integrity sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ== "@esbuild/linux-x64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz#a237d3578ecdd184a3066b1f425e314ade0f8033" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz" integrity sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA== "@esbuild/netbsd-arm64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz#4c15c68d8149614ddb6a56f9c85ae62ccca08259" + resolved "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz" integrity sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA== "@esbuild/netbsd-x64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz#12f6856f8c54c2d7d0a8a64a9711c01a743878d5" + resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz" integrity sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g== "@esbuild/openbsd-arm64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz#ca078dad4a34df192c60233b058db2ca3d94bc5c" + resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz" integrity sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ== "@esbuild/openbsd-x64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz#c9178adb60e140e03a881d0791248489c79f95b2" + resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz" integrity sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w== "@esbuild/sunos-x64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz#03765eb6d4214ff27e5230af779e80790d1ee09f" + resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz" integrity sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA== "@esbuild/win32-arm64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz#f1c867bd1730a9b8dfc461785ec6462e349411ea" + resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz" integrity sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ== "@esbuild/win32-ia32@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz#77491f59ef6c9ddf41df70670d5678beb3acc322" + resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz" integrity sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew== "@esbuild/win32-x64@0.25.3": version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz#b17a2171f9074df9e91bfb07ef99a892ac06412a" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz" integrity sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg== "@eslint-community/eslint-utils@^4.2.0": - version "4.7.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" - integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== + version "4.6.1" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz" + integrity sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw== dependencies: eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.12.1": version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/config-array@^0.20.0": version "0.20.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.0.tgz#7a1232e82376712d3340012a2f561a2764d1988f" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz" integrity sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ== dependencies: "@eslint/object-schema" "^2.1.6" @@ -310,20 +310,20 @@ minimatch "^3.1.2" "@eslint/config-helpers@^0.2.1": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.2.tgz#3779f76b894de3a8ec4763b79660e6d54d5b1010" - integrity sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg== + version "0.2.1" + resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz" + integrity sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw== "@eslint/core@^0.13.0": version "0.13.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.13.0.tgz#bf02f209846d3bf996f9e8009db62df2739b458c" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz" integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw== dependencies: "@types/json-schema" "^7.0.15" "@eslint/eslintrc@^3.3.1": version "3.3.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz" integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== dependencies: ajv "^6.12.4" @@ -336,19 +336,19 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.25.1", "@eslint/js@^9.22.0": +"@eslint/js@^9.22.0", "@eslint/js@9.25.1": version "9.25.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.25.1.tgz#25f5c930c2b68b5ebe7ac857f754cbd61ef6d117" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz" integrity sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg== "@eslint/object-schema@^2.1.6": version "2.1.6" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz" integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== "@eslint/plugin-kit@^0.2.8": version "0.2.8" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz#47488d8f8171b5d4613e833313f3ce708e3525f8" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz" integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA== dependencies: "@eslint/core" "^0.13.0" @@ -356,12 +356,12 @@ "@humanfs/core@^0.19.1": version "0.19.1" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== "@humanfs/node@^0.16.6": version "0.16.6" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz" integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== dependencies: "@humanfs/core" "^0.19.1" @@ -369,22 +369,22 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/retry@^0.3.0": version "0.3.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz" integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== "@humanwhocodes/retry@^0.4.2": version "0.4.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.2.tgz#1860473de7dfa1546767448f333db80cb0ff2161" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz" integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ== "@jridgewell/gen-mapping@^0.3.5": version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -393,22 +393,22 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -416,107 +416,107 @@ "@rollup/rollup-android-arm-eabi@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz#e1562d360bca73c7bef6feef86098de3a2f1d442" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz" integrity sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw== "@rollup/rollup-android-arm64@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz#37ba63940211673e15dcc5f469a78e34276dbca7" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz" integrity sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw== "@rollup/rollup-darwin-arm64@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz#58b1eb86d997d71dabc5b78903233a3c27438ca0" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz" integrity sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA== "@rollup/rollup-darwin-x64@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz#5e22dab3232b1e575d930ce891abb18fe19c58c9" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz" integrity sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw== "@rollup/rollup-freebsd-arm64@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz#04c892d9ff864d66e31419634726ab0bebb33707" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz" integrity sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw== "@rollup/rollup-freebsd-x64@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz#f4b1e091f7cf5afc9e3a029d70128ad56409ecfb" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz" integrity sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q== "@rollup/rollup-linux-arm-gnueabihf@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz#c8814bb5ce047a81b1fe4a33628dfd4ac52bd864" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz" integrity sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg== "@rollup/rollup-linux-arm-musleabihf@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz#5b4e7bd83cbebbf5ffe958802dcfd4ee34bf73a3" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz" integrity sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg== "@rollup/rollup-linux-arm64-gnu@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz#141c848e53cee011e82a11777b8a51f1b3e8d77c" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz" integrity sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg== "@rollup/rollup-linux-arm64-musl@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz#22ebeaf2fa301aa4aa6c84b760e6cd1d1ac7eb1e" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz" integrity sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ== "@rollup/rollup-linux-loongarch64-gnu@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz#20b77dc78e622f5814ff8e90c14c938ceb8043bc" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz" integrity sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ== "@rollup/rollup-linux-powerpc64le-gnu@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz#2c90f99c987ef1198d4f8d15d754c286e1f07b13" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz" integrity sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg== "@rollup/rollup-linux-riscv64-gnu@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz#9336fd5e47d7f4760d02aa85f76976176eef53ca" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz" integrity sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ== "@rollup/rollup-linux-riscv64-musl@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz#d75b4d54d46439bb5c6c13762788f57e798f5670" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz" integrity sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA== "@rollup/rollup-linux-s390x-gnu@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz#e9f09b802f1291839247399028beaef9ce034c81" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz" integrity sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg== "@rollup/rollup-linux-x64-gnu@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz#0413169dc00470667dea8575c1129d4e7a73eb29" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz" integrity sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ== "@rollup/rollup-linux-x64-musl@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz#c76fd593323c60ea219439a00da6c6d33ffd0ea6" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz" integrity sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ== "@rollup/rollup-win32-arm64-msvc@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz#c7724c386eed0bda5ae7143e4081c1910cab349b" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz" integrity sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg== "@rollup/rollup-win32-ia32-msvc@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz#7749e1b65cb64fe6d41ad1ad9e970a0ccc8ac350" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz" integrity sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA== "@rollup/rollup-win32-x64-msvc@4.40.1": version "4.40.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz#8078b71fe0d5825dcbf83d52a7dc858b39da165c" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz" integrity sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA== "@types/babel__core@^7.20.5": version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" @@ -527,14 +527,14 @@ "@types/babel__generator@*": version "7.27.0" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz" integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" @@ -542,36 +542,36 @@ "@types/babel__traverse@*": version "7.20.7" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.7.tgz#968cdc2366ec3da159f61166428ee40f370e56c2" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz" integrity sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng== dependencies: "@babel/types" "^7.20.7" -"@types/estree@1.0.7", "@types/estree@^1.0.6": +"@types/estree@^1.0.6", "@types/estree@1.0.7": version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz" integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== "@types/json-schema@^7.0.15": version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/react-dom@^19.0.4": version "19.1.3" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.1.3.tgz#3f0c60804441bf34d19f8dd0d44405c0c0e21bfa" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.3.tgz" integrity sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg== -"@types/react@^19.0.10": +"@types/react@^19.0.0", "@types/react@^19.0.10": version "19.1.2" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.2.tgz#11df86f66f188f212c90ecb537327ec68bfd593f" + resolved "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz" integrity sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw== dependencies: csstype "^3.0.2" "@vitejs/plugin-react@^4.3.4": version "4.4.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz#d7d1e9c9616d7536b0953637edfee7c6cbe2fe0f" + resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz" integrity sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w== dependencies: "@babel/core" "^7.26.10" @@ -582,17 +582,17 @@ acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.14.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0: version "8.14.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz" integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -602,32 +602,32 @@ ajv@^6.12.4: ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" -browserslist@^4.24.0: +browserslist@^4.24.0, "browserslist@>= 4.21.0": version "4.24.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz" integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== dependencies: caniuse-lite "^1.0.30001688" @@ -637,17 +637,17 @@ browserslist@^4.24.0: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caniuse-lite@^1.0.30001688: version "1.0.30001716" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz#39220dfbc58c85d9d4519e7090b656aa11ca4b85" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz" integrity sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw== chalk@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -655,34 +655,34 @@ chalk@^4.0.0: color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.0.2.tgz#27360701532116bd3f1f9416929d176afe1e4610" + resolved "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz" integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== cross-spawn@^7.0.6: version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -691,29 +691,29 @@ cross-spawn@^7.0.6: csstype@^3.0.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== debug@^4.1.0, debug@^4.3.1, debug@^4.3.2: version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== electron-to-chromium@^1.5.73: - version "1.5.149" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz#b6d1a468b9537165e2494d0b5b82e9b3392d0ddb" - integrity sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ== + version "1.5.148" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.148.tgz" + integrity sha512-8uc1QXwwqayD4mblcsQYZqoi+cOc97A2XmKSBOIRbEAvbp6vrqmSYs4dHD2qVygUgn7Mi0qdKgPaJ9WC8cv63A== esbuild@^0.25.0: version "0.25.3" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.3.tgz#371f7cb41283e5b2191a96047a7a89562965a285" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz" integrity sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q== optionalDependencies: "@esbuild/aix-ppc64" "0.25.3" @@ -744,27 +744,27 @@ esbuild@^0.25.0: escalade@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-plugin-react-hooks@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz#1be0080901e6ac31ce7971beed3d3ec0a423d9e3" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz" integrity sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg== eslint-plugin-react-refresh@^0.4.19: version "0.4.20" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz#3bbfb5c8637e28d19ce3443686445e502ecd18ba" + resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz" integrity sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA== eslint-scope@^8.3.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz" integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== dependencies: esrecurse "^4.3.0" @@ -772,17 +772,17 @@ eslint-scope@^8.3.0: eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint-visitor-keys@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz" integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== -eslint@^9.22.0: +"eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^9.22.0, eslint@>=8.40: version "9.25.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.25.1.tgz#8a7cf8dd0e6acb858f86029720adb1785ee57580" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz" integrity sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -823,7 +823,7 @@ eslint@^9.22.0: espree@^10.0.1, espree@^10.3.0: version "10.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + resolved "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz" integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== dependencies: acorn "^8.14.0" @@ -832,58 +832,58 @@ espree@^10.0.1, espree@^10.3.0: esquery@^1.5.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fdir@^6.4.4: version "6.4.4" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz" integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== file-entry-cache@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: flat-cache "^4.0.0" find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -891,7 +891,7 @@ find-up@^5.0.0: flat-cache@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" @@ -899,54 +899,54 @@ flat-cache@^4.0.0: flatted@^3.2.9: version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^14.0.0: version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== globals@^16.0.0: version "16.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-16.0.0.tgz#3d7684652c5c4fbd086ec82f9448214da49382d8" + resolved "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz" integrity sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== ignore@^5.2.0: version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" @@ -954,73 +954,73 @@ import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-glob@^4.0.0, is-glob@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsesc@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== keyv@^4.5.4: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -1028,53 +1028,58 @@ levn@^0.4.1: locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" +lucide-react@^0.507.0: + version "0.507.0" + resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.507.0.tgz" + integrity sha512-XfgE6gvAHwAtnbUvWiTTHx4S3VGR+cUJHEc0vrh9Ogu672I1Tue2+Cp/8JJqpytgcBHAB1FVI297W4XGNwc2dQ== + minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== nanoid@^3.3.8: version "3.3.11" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== node-releases@^2.0.19: version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== optionator@^0.9.3: version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -1086,48 +1091,48 @@ optionator@^0.9.3: p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^4.0.2: +"picomatch@^3 || ^4", picomatch@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== postcss@^8.5.3: version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz" integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== dependencies: nanoid "^3.3.8" @@ -1136,55 +1141,55 @@ postcss@^8.5.3: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -react-dom@^19.0.0: +react-dom@^19.0.0, react-dom@>=18: version "19.1.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.1.0.tgz#133558deca37fa1d682708df8904b25186793623" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz" integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== dependencies: scheduler "^0.26.0" react-refresh@^0.17.0: version "0.17.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz" integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== react-router-dom@^7.5.3: version "7.5.3" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.5.3.tgz#496e9f6d90f731703c7772668b41747028e0a2d5" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.3.tgz" integrity sha512-cK0jSaTyW4jV9SRKAItMIQfWZ/D6WEZafgHuuCb9g+SjhLolY78qc+De4w/Cz9ybjvLzShAmaIMEXt8iF1Cm+A== dependencies: react-router "7.5.3" react-router@7.5.3: version "7.5.3" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.5.3.tgz#9e5420832af8c3690740c1797d4fa54613fea06d" + resolved "https://registry.npmjs.org/react-router/-/react-router-7.5.3.tgz" integrity sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw== dependencies: cookie "^1.0.1" set-cookie-parser "^2.6.0" turbo-stream "2.4.0" -react@^19.0.0: +"react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", react@^19.0.0, react@^19.1.0, react@>=18: version "19.1.0" - resolved "https://registry.yarnpkg.com/react/-/react-19.1.0.tgz#926864b6c48da7627f004795d6cce50e90793b75" + resolved "https://registry.npmjs.org/react/-/react-19.1.0.tgz" integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== rollup@^4.34.9: version "4.40.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.1.tgz#03d6c53ebb6a9c2c060ae686a61e72a2472b366f" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz" integrity sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw== dependencies: "@types/estree" "1.0.7" @@ -1213,51 +1218,51 @@ rollup@^4.34.9: scheduler@^0.26.0: version "0.26.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz" integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== set-cookie-parser@^2.6.0: version "2.7.1" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz" integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== source-map-js@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" tinyglobby@^0.2.13: version "0.2.13" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz" integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== dependencies: fdir "^6.4.4" @@ -1265,19 +1270,19 @@ tinyglobby@^0.2.13: turbo-stream@2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/turbo-stream/-/turbo-stream-2.4.0.tgz#1e4fca6725e90fa14ac4adb782f2d3759a5695f0" + resolved "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz" integrity sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" update-browserslist-db@^1.1.1: version "1.1.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== dependencies: escalade "^3.2.0" @@ -1285,14 +1290,14 @@ update-browserslist-db@^1.1.1: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" -vite@^6.3.1: +"vite@^4.2.0 || ^5.0.0 || ^6.0.0", vite@^6.3.1: version "6.3.4" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.3.4.tgz#d441a72c7cd9a93b719bb851250a4e6c119c9cff" + resolved "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz" integrity sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw== dependencies: esbuild "^0.25.0" @@ -1306,22 +1311,22 @@ vite@^6.3.1: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 674a141db8d9fc8869ce43371cb37fdc21a9f77e Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 4 May 2025 21:52:25 +0900 Subject: [PATCH 05/44] [Fix] switch icons --- frontend/src/assets/img/arrowicon.svg | 3 +++ frontend/src/assets/img/moneyicon.svg | 4 ++++ frontend/src/components/Header.jsx | 9 +++++---- 3 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 frontend/src/assets/img/arrowicon.svg create mode 100644 frontend/src/assets/img/moneyicon.svg diff --git a/frontend/src/assets/img/arrowicon.svg b/frontend/src/assets/img/arrowicon.svg new file mode 100644 index 0000000..8df3309 --- /dev/null +++ b/frontend/src/assets/img/arrowicon.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/img/moneyicon.svg b/frontend/src/assets/img/moneyicon.svg new file mode 100644 index 0000000..35c8a6f --- /dev/null +++ b/frontend/src/assets/img/moneyicon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/src/components/Header.jsx b/frontend/src/components/Header.jsx index 7abaa84..a545470 100644 --- a/frontend/src/components/Header.jsx +++ b/frontend/src/components/Header.jsx @@ -2,7 +2,8 @@ import React from 'react'; import { useNavigate, useLocation } from 'react-router-dom'; import { ArrowLeft, Wallet } from 'lucide-react'; import './componentsCss/Header.css'; - +import arrowIcon from '../assets/img/arrowicon.svg'; +import moneyIcon from '../assets/img/moneyicon.svg'; const Header = () => { const navigate = useNavigate(); const location = useLocation(); @@ -17,12 +18,12 @@ const Header = () => { return (

{title}

{showRightButton ? ( - ) : (
// 오른쪽 공백 유지 From bacaf3b2aa0dd239f58c7957f9cddeeb7ffade05 Mon Sep 17 00:00:00 2001 From: seonjuuu Date: Sun, 4 May 2025 21:55:23 +0900 Subject: [PATCH 06/44] Setting --- .idea/.gitignore | 8 ++ .idea/compiler.xml | 14 +++ .idea/gradle.xml | 15 +++ .idea/inspectionProfiles/Project_Default.xml | 6 + .idea/misc.xml | 5 + .idea/modules.xml | 8 ++ .idea/vcs.xml | 7 ++ .idea/workspace.xml | 107 ++++++++++++++++++ ...4\353\241\234\354\262\264\355\201\254.iml" | 9 ++ backend/pirocheck/.gitignore | 2 +- 10 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 ".idea/\355\224\274\353\241\234\354\262\264\355\201\254.iml" diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..dcd73c7 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 디폴트 무시된 파일 +/../../피로체크/.idea/shelf/ +/../../피로체크/.idea/workspace.xml +# 에디터 기반 HTTP 클라이언트 요청 +/../../피로체크/.idea/httpRequests/ +# Datasource local storage ignored files +/../../피로체크/.idea/dataSources/ +/../../피로체크/.idea/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..aa0b0f1 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..9a34d32 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..03d9549 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..722604f --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..e30031f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..0fcafb0 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..11678f4 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + - - + {inputs.map((input, index) => ( + + ))}
); }; diff --git a/frontend/src/components/componentsCss/InfoBlock.css b/frontend/src/components/componentsCss/InfoBlock.css index cc36177..73b7438 100644 --- a/frontend/src/components/componentsCss/InfoBlock.css +++ b/frontend/src/components/componentsCss/InfoBlock.css @@ -7,4 +7,9 @@ font-weight: 400; font-size: 16px; font-family: "Noto Sans KR", sans-serif; + border: 1px var(--background-black) solid; + padding: 10px; +} +.inputTag:focus { + border: 1px var(--main-green) solid; } diff --git a/frontend/src/index.css b/frontend/src/index.css deleted file mode 100644 index 08a3ac9..0000000 --- a/frontend/src/index.css +++ /dev/null @@ -1,68 +0,0 @@ -:root { - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index bafbc51..ac0c4ce 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -1,8 +1,8 @@ import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; -import "./index.css"; import App from "./App.jsx"; import "./assets/root.css"; +import "./assets/reset.css"; createRoot(document.getElementById("root")).render( From 531ffc2ecbaf032304458673bcc3c86b9b317b5f Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Mon, 5 May 2025 01:22:57 +0900 Subject: [PATCH 08/44] resolve conflict: keep index.css, App.css deleted --- frontend/src/index.css | 70 ------------------------------------------ 1 file changed, 70 deletions(-) delete mode 100644 frontend/src/index.css diff --git a/frontend/src/index.css b/frontend/src/index.css deleted file mode 100644 index 0e256a2..0000000 --- a/frontend/src/index.css +++ /dev/null @@ -1,70 +0,0 @@ -:root { - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} - - From 6d17b99d3a504a4dec89c8e3212d3d77c0aabec5 Mon Sep 17 00:00:00 2001 From: seonjuuu Date: Mon, 5 May 2025 17:08:18 +0900 Subject: [PATCH 09/44] =?UTF-8?q?[feat]=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/gradle.xml | 1 + .idea/workspace.xml | 75 ++++++++++++------- .../User/controller/UserController.java | 44 +++++++++++ .../User/dto/request/LoginRequest.java | 12 +++ .../User/dto/response/LoginResponse.java | 19 +++++ .../backend/pirocheck/User/entity/Role.java | 6 ++ .../backend/pirocheck/User/entity/User.java | 35 +++++++++ .../User/repository/UserRepository.java | 11 +++ .../pirocheck/User/service/UserService.java | 19 +++++ 9 files changed, 196 insertions(+), 26 deletions(-) create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/User/controller/UserController.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/User/dto/request/LoginRequest.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/User/dto/response/LoginResponse.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/User/entity/Role.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/User/entity/User.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/User/repository/UserRepository.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/User/service/UserService.java diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 9a34d32..29f2e28 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,5 +1,6 @@ + - + + + + + + + + + + + + @@ -37,35 +54,38 @@ "associatedIndex": 2 } + + + - { + "keyToString": { + "ASKED_MARK_IGNORED_FILES_AS_EXCLUDED": "true", + "Gradle./Users/seonju/Documents/플젝/피로체크/backend/pirocheck/build.gradle.executor": "Run", + "Gradle.pirocheck 빌드.executor": "Run", + "RequestMappingsPanelOrder0": "0", + "RequestMappingsPanelOrder1": "1", + "RequestMappingsPanelWidth0": "75", + "RequestMappingsPanelWidth1": "75", + "RunOnceActivity.ShowReadmeOnStart": "true", + "RunOnceActivity.git.unshallow": "true", + "Spring Boot.PirocheckApplication.executor": "Run", + "git-widget-placeholder": "backend__sj", + "kotlin-language-version-configured": "true", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)", + "nodejs_package_manager_path": "npm", + "project.structure.last.edited": "모듈", + "project.structure.proportion": "0.23046875", + "project.structure.side.proportion": "0.40229884", + "vue.rearranger.settings.migration": "true" } -}]]> +} @@ -97,7 +117,10 @@ diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/controller/UserController.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/controller/UserController.java new file mode 100644 index 0000000..9f8239d --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/controller/UserController.java @@ -0,0 +1,44 @@ +package backend.pirocheck.User.controller; + +import backend.pirocheck.User.dto.request.LoginRequest; +import backend.pirocheck.User.dto.response.LoginResponse; +import backend.pirocheck.User.entity.User; +import backend.pirocheck.User.repository.UserRepository; +import backend.pirocheck.User.service.UserService; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api") +@RequiredArgsConstructor +public class UserController { + + private final UserService userService; + + // 로그인 + @PostMapping("/login") + public ResponseEntity login(@RequestBody LoginRequest request, HttpSession session) { + User user = userService.login(request.getName(), request.getPassword()); + + //세션에 로그인 정보 저장 + session.setAttribute("loginUser", user); + + // 사용자 정보 응답 + return ResponseEntity.ok(new LoginResponse(user)); + } + + // 로그아웃 + @PostMapping("/logout") + public ResponseEntity logout(HttpSession session) { + session.invalidate(); // 세션 종료 (메모리에서 삭제) + return ResponseEntity.ok().build(); // 본문은 없음 (void) + } + + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/dto/request/LoginRequest.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/dto/request/LoginRequest.java new file mode 100644 index 0000000..a530d8a --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/dto/request/LoginRequest.java @@ -0,0 +1,12 @@ +package backend.pirocheck.User.dto.request; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class LoginRequest { + + private String name; + private String password; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/dto/response/LoginResponse.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/dto/response/LoginResponse.java new file mode 100644 index 0000000..ec9d65a --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/dto/response/LoginResponse.java @@ -0,0 +1,19 @@ +package backend.pirocheck.User.dto.response; + + +import backend.pirocheck.User.entity.User; +import lombok.Getter; + +@Getter +public class LoginResponse { + + private Long id; + private String name; + private String role; + + public LoginResponse(User user) { + this.id = user.getId(); + this.name = user.getName(); + this.role = user.getRole().name(); // MEMBER or ADMIN + } +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/Role.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/Role.java new file mode 100644 index 0000000..ce1c180 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/Role.java @@ -0,0 +1,6 @@ +package backend.pirocheck.User.entity; + +public enum Role { + ADMIN, + MEMBER +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/User.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/User.java new file mode 100644 index 0000000..e2b88d0 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/User.java @@ -0,0 +1,35 @@ +package backend.pirocheck.User.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Table(name="users") +@NoArgsConstructor +@AllArgsConstructor +@Builder + +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String password; // 전화번호 일부 + + private String name; + + private String email; + + private String phone; + + @Enumerated(EnumType.STRING) + private Role role; // MEMBER or ADMIN + + private Integer generation; + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/repository/UserRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/repository/UserRepository.java new file mode 100644 index 0000000..675aca1 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/repository/UserRepository.java @@ -0,0 +1,11 @@ +package backend.pirocheck.User.repository; + +import backend.pirocheck.User.entity.User; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + Optional findByName(String name); +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/service/UserService.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/service/UserService.java new file mode 100644 index 0000000..304edd8 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/service/UserService.java @@ -0,0 +1,19 @@ +package backend.pirocheck.User.service; + +import backend.pirocheck.User.entity.User; +import backend.pirocheck.User.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class UserService { + + private final UserRepository userRepository; + + public User login(String name, String password) { + return userRepository.findByName(name) + .filter(user -> user.getPassword().equals(password)) + .orElseThrow(() -> new IllegalArgumentException("이름 또는 비밀번호가 일치하지 않습니다.")); + } +} From 906cf8cc2d8a212269465873ee178f562d5d68ba Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Mon, 5 May 2025 20:44:42 +0900 Subject: [PATCH 10/44] [feat]add Assignment, deposit, Home, Login page/Initial setup: routing with react-router-dom --- frontend/src/App.jsx | 36 ++++----- frontend/src/Assignment.jsx | 9 +++ frontend/src/Deposit.jsx | 9 +++ frontend/src/Home.jsx | 26 +++++++ frontend/src/Login.jsx | 14 ++++ frontend/src/assets/img/home.svg | 9 +++ frontend/src/main.jsx | 5 +- frontend/yarn.lock | 126 +++++++++++++++---------------- 8 files changed, 146 insertions(+), 88 deletions(-) create mode 100644 frontend/src/Assignment.jsx create mode 100644 frontend/src/Deposit.jsx create mode 100644 frontend/src/Home.jsx create mode 100644 frontend/src/Login.jsx create mode 100644 frontend/src/assets/img/home.svg diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 533a5f5..8c8abc6 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,30 +1,20 @@ import React from "react"; -import InputBlock from "./components/InputBlock"; -import InfoBlock from "./components/InfoBlock"; -import PageBtn from "./components/PageBtn"; -import Header from "./components/Header"; +import { BrowserRouter, Routes, Route } from "react-router-dom"; +import Login from "./Login"; +import Home from "./Home"; +import Assignment from "./Assignment"; +import Deposit from "./Deposit"; function App() { return ( - <> -
-
- - - -
- + + + } /> + } /> + } /> + } /> + + ); } diff --git a/frontend/src/Assignment.jsx b/frontend/src/Assignment.jsx new file mode 100644 index 0000000..581f00a --- /dev/null +++ b/frontend/src/Assignment.jsx @@ -0,0 +1,9 @@ +const Assignment = () => { + return ( +
+

Assignment

+

This is the assignment page.

+
+ ); +}; +export default Assignment; diff --git a/frontend/src/Deposit.jsx b/frontend/src/Deposit.jsx new file mode 100644 index 0000000..295c538 --- /dev/null +++ b/frontend/src/Deposit.jsx @@ -0,0 +1,9 @@ +const Deposit = () => { + return ( +
+

Deposit Page

+

This is the deposit page.

+
+ ); +}; +export default Deposit; diff --git a/frontend/src/Home.jsx b/frontend/src/Home.jsx new file mode 100644 index 0000000..db58368 --- /dev/null +++ b/frontend/src/Home.jsx @@ -0,0 +1,26 @@ +import React, { useEffect } from "react"; +import { useNavigate } from "react-router-dom"; +import homeLogo from "./assets/img/home.svg"; + +const Home = () => { + const navigate = useNavigate(); + + useEffect(() => { + const timer = setTimeout(() => { + navigate("/login"); + }, 2000); + + return () => clearTimeout(timer); + }, [navigate]); + + return ( +
+
+

PIROCHECK

+ PiroCheck Logo +
+
+ ); +}; + +export default Home; diff --git a/frontend/src/Login.jsx b/frontend/src/Login.jsx new file mode 100644 index 0000000..06d3ddb --- /dev/null +++ b/frontend/src/Login.jsx @@ -0,0 +1,14 @@ +import React from "react"; + +const Login = ({ onLogin }) => { + return ( +
+

로그인 페이지

+ + + +
+ ); +}; + +export default Login; diff --git a/frontend/src/assets/img/home.svg b/frontend/src/assets/img/home.svg new file mode 100644 index 0000000..9b5895e --- /dev/null +++ b/frontend/src/assets/img/home.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index f6015f1..0b2945d 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -3,9 +3,10 @@ import App from "./App.jsx"; import "./assets/root.css"; import { BrowserRouter } from "react-router-dom"; import "./assets/reset.css"; +import { StrictMode } from "react"; createRoot(document.getElementById("root")).render( - + - + ); diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 736512a..9b621ab 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -24,7 +24,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz" integrity sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.26.10": +"@babel/core@^7.26.10": version "7.27.1" resolved "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz" integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ== @@ -165,22 +165,22 @@ "@esbuild/aix-ppc64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz#014180d9a149cffd95aaeead37179433f5ea5437" integrity sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ== -"@esbuild/android-arm@0.25.3": - version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz" - integrity sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A== - "@esbuild/android-arm64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz#649e47e04ddb24a27dc05c395724bc5f4c55cbfe" integrity sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ== +"@esbuild/android-arm@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.3.tgz#8a0f719c8dc28a4a6567ef7328c36ea85f568ff4" + integrity sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A== + "@esbuild/android-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.3.tgz#e2ab182d1fd06da9bef0784a13c28a7602d78009" integrity sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ== "@esbuild/darwin-arm64@0.25.3": @@ -190,102 +190,102 @@ "@esbuild/darwin-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz#d8c5342ec1a4bf4b1915643dfe031ba4b173a87a" integrity sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A== "@esbuild/freebsd-arm64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz#9f7d789e2eb7747d4868817417cc968ffa84f35b" integrity sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw== "@esbuild/freebsd-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz#8ad35c51d084184a8e9e76bb4356e95350a64709" integrity sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q== -"@esbuild/linux-arm@0.25.3": - version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz" - integrity sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ== - "@esbuild/linux-arm64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz#3af0da3d9186092a9edd4e28fa342f57d9e3cd30" integrity sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A== +"@esbuild/linux-arm@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz#e91cafa95e4474b3ae3d54da12e006b782e57225" + integrity sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ== + "@esbuild/linux-ia32@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz#81025732d85b68ee510161b94acdf7e3007ea177" integrity sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw== "@esbuild/linux-loong64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz#3c744e4c8d5e1148cbe60a71a11b58ed8ee5deb8" integrity sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g== "@esbuild/linux-mips64el@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz#1dfe2a5d63702db9034cc6b10b3087cc0424ec26" integrity sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag== "@esbuild/linux-ppc64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz#2e85d9764c04a1ebb346dc0813ea05952c9a5c56" integrity sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg== "@esbuild/linux-riscv64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz#a9ea3334556b09f85ccbfead58c803d305092415" integrity sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA== "@esbuild/linux-s390x@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz#f6a7cb67969222b200974de58f105dfe8e99448d" integrity sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ== "@esbuild/linux-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz#a237d3578ecdd184a3066b1f425e314ade0f8033" integrity sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA== "@esbuild/netbsd-arm64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz#4c15c68d8149614ddb6a56f9c85ae62ccca08259" integrity sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA== "@esbuild/netbsd-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz#12f6856f8c54c2d7d0a8a64a9711c01a743878d5" integrity sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g== "@esbuild/openbsd-arm64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz#ca078dad4a34df192c60233b058db2ca3d94bc5c" integrity sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ== "@esbuild/openbsd-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz#c9178adb60e140e03a881d0791248489c79f95b2" integrity sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w== "@esbuild/sunos-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz#03765eb6d4214ff27e5230af779e80790d1ee09f" integrity sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA== "@esbuild/win32-arm64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz#f1c867bd1730a9b8dfc461785ec6462e349411ea" integrity sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ== "@esbuild/win32-ia32@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz#77491f59ef6c9ddf41df70670d5678beb3acc322" integrity sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew== "@esbuild/win32-x64@0.25.3": version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz#b17a2171f9074df9e91bfb07ef99a892ac06412a" integrity sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg== "@eslint-community/eslint-utils@^4.2.0": @@ -336,7 +336,7 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@^9.22.0", "@eslint/js@9.25.1": +"@eslint/js@9.25.1", "@eslint/js@^9.22.0": version "9.25.1" resolved "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz" integrity sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg== @@ -416,12 +416,12 @@ "@rollup/rollup-android-arm-eabi@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz#e1562d360bca73c7bef6feef86098de3a2f1d442" integrity sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw== "@rollup/rollup-android-arm64@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz#37ba63940211673e15dcc5f469a78e34276dbca7" integrity sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw== "@rollup/rollup-darwin-arm64@4.40.1": @@ -431,87 +431,87 @@ "@rollup/rollup-darwin-x64@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz#5e22dab3232b1e575d930ce891abb18fe19c58c9" integrity sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw== "@rollup/rollup-freebsd-arm64@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz#04c892d9ff864d66e31419634726ab0bebb33707" integrity sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw== "@rollup/rollup-freebsd-x64@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz#f4b1e091f7cf5afc9e3a029d70128ad56409ecfb" integrity sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q== "@rollup/rollup-linux-arm-gnueabihf@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz#c8814bb5ce047a81b1fe4a33628dfd4ac52bd864" integrity sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg== "@rollup/rollup-linux-arm-musleabihf@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz#5b4e7bd83cbebbf5ffe958802dcfd4ee34bf73a3" integrity sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg== "@rollup/rollup-linux-arm64-gnu@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz#141c848e53cee011e82a11777b8a51f1b3e8d77c" integrity sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg== "@rollup/rollup-linux-arm64-musl@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz#22ebeaf2fa301aa4aa6c84b760e6cd1d1ac7eb1e" integrity sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ== "@rollup/rollup-linux-loongarch64-gnu@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz#20b77dc78e622f5814ff8e90c14c938ceb8043bc" integrity sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ== "@rollup/rollup-linux-powerpc64le-gnu@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz#2c90f99c987ef1198d4f8d15d754c286e1f07b13" integrity sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg== "@rollup/rollup-linux-riscv64-gnu@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz#9336fd5e47d7f4760d02aa85f76976176eef53ca" integrity sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ== "@rollup/rollup-linux-riscv64-musl@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz#d75b4d54d46439bb5c6c13762788f57e798f5670" integrity sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA== "@rollup/rollup-linux-s390x-gnu@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz#e9f09b802f1291839247399028beaef9ce034c81" integrity sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg== "@rollup/rollup-linux-x64-gnu@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz#0413169dc00470667dea8575c1129d4e7a73eb29" integrity sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ== "@rollup/rollup-linux-x64-musl@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz#c76fd593323c60ea219439a00da6c6d33ffd0ea6" integrity sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ== "@rollup/rollup-win32-arm64-msvc@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz#c7724c386eed0bda5ae7143e4081c1910cab349b" integrity sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg== "@rollup/rollup-win32-ia32-msvc@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz#7749e1b65cb64fe6d41ad1ad9e970a0ccc8ac350" integrity sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA== "@rollup/rollup-win32-x64-msvc@4.40.1": version "4.40.1" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz#8078b71fe0d5825dcbf83d52a7dc858b39da165c" integrity sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA== "@types/babel__core@^7.20.5": @@ -547,7 +547,7 @@ dependencies: "@babel/types" "^7.20.7" -"@types/estree@^1.0.6", "@types/estree@1.0.7": +"@types/estree@1.0.7", "@types/estree@^1.0.6": version "1.0.7" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz" integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== @@ -562,7 +562,7 @@ resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.3.tgz" integrity sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg== -"@types/react@^19.0.0", "@types/react@^19.0.10": +"@types/react@^19.0.10": version "19.1.2" resolved "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz" integrity sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw== @@ -585,7 +585,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0: +acorn@^8.14.0: version "8.14.1" resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz" integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== @@ -625,7 +625,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -browserslist@^4.24.0, "browserslist@>= 4.21.0": +browserslist@^4.24.0: version "4.24.4" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz" integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== @@ -780,7 +780,7 @@ eslint-visitor-keys@^4.2.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz" integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== -"eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^9.22.0, eslint@>=8.40: +eslint@^9.22.0: version "9.25.1" resolved "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz" integrity sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ== @@ -1125,7 +1125,7 @@ picocolors@^1.1.1: resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -"picomatch@^3 || ^4", picomatch@^4.0.2: +picomatch@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== @@ -1149,7 +1149,7 @@ punycode@^2.1.0: resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -react-dom@^19.0.0, react-dom@>=18: +react-dom@^19.0.0: version "19.1.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz" integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== @@ -1163,7 +1163,7 @@ react-refresh@^0.17.0: react-router-dom@^7.5.3: version "7.5.3" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.3.tgz" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.5.3.tgz#496e9f6d90f731703c7772668b41747028e0a2d5" integrity sha512-cK0jSaTyW4jV9SRKAItMIQfWZ/D6WEZafgHuuCb9g+SjhLolY78qc+De4w/Cz9ybjvLzShAmaIMEXt8iF1Cm+A== dependencies: react-router "7.5.3" @@ -1177,7 +1177,7 @@ react-router@7.5.3: set-cookie-parser "^2.6.0" turbo-stream "2.4.0" -"react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", react@^19.0.0, react@^19.1.0, react@>=18: +react@^19.0.0: version "19.1.0" resolved "https://registry.npmjs.org/react/-/react-19.1.0.tgz" integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== @@ -1295,7 +1295,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -"vite@^4.2.0 || ^5.0.0 || ^6.0.0", vite@^6.3.1: +vite@^6.3.1: version "6.3.4" resolved "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz" integrity sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw== From 2b7a3330c10a828c31c98e524304d643572d939b Mon Sep 17 00:00:00 2001 From: dietken1 Date: Mon, 5 May 2025 20:59:02 +0900 Subject: [PATCH 11/44] =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +++- backend/pirocheck/.gitignore | 4 +++- .../pirocheck/attendence/entity/Attendence.java | 16 ++++++++++++++++ .../attendence/entity/AttendenceCode.java | 17 +++++++++++++++++ 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendence.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendenceCode.java diff --git a/.gitignore b/.gitignore index 01b6b1f..4d570a7 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,6 @@ # Common .DS_Store *.log -.env \ No newline at end of file +.env + +.idea/ \ No newline at end of file diff --git a/backend/pirocheck/.gitignore b/backend/pirocheck/.gitignore index c2065bc..49fee8b 100644 --- a/backend/pirocheck/.gitignore +++ b/backend/pirocheck/.gitignore @@ -5,6 +5,9 @@ build/ !**/src/main/**/build/ !**/src/test/**/build/ +.idea +.idea/ + ### STS ### .apt_generated .classpath @@ -18,7 +21,6 @@ bin/ !**/src/test/**/bin/ ### IntelliJ IDEA ### -.idea *.iws *.iml *.ipr diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendence.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendence.java new file mode 100644 index 0000000..d05267f --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendence.java @@ -0,0 +1,16 @@ +package backend.pirocheck.attendence.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +@Entity +@Table(name = "attendence") +public class Attendence { + @Id + private Long id; + + private Long userId; + private int week; + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendenceCode.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendenceCode.java new file mode 100644 index 0000000..59a5d8e --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendenceCode.java @@ -0,0 +1,17 @@ +package backend.pirocheck.attendence.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "attendence_code") +@Getter @Setter +public class AttendenceCode { + @Id + private Long id; + + private String code; +} From 07a1ca2444e8e51a89fdd5f25ef4f583d871a755 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Mon, 5 May 2025 21:22:43 +0900 Subject: [PATCH 12/44] [feat]intro page --- frontend/src/App.jsx | 4 +++- frontend/src/Home.jsx | 21 ++------------------- frontend/src/Home.module.css | 0 frontend/src/Intro.jsx | 25 +++++++++++++++++++++++++ frontend/src/Intro.module.css | 21 +++++++++++++++++++++ 5 files changed, 51 insertions(+), 20 deletions(-) create mode 100644 frontend/src/Home.module.css create mode 100644 frontend/src/Intro.jsx create mode 100644 frontend/src/Intro.module.css diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 8c8abc6..b168902 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -4,13 +4,15 @@ import Login from "./Login"; import Home from "./Home"; import Assignment from "./Assignment"; import Deposit from "./Deposit"; +import Intro from "./Intro"; function App() { return ( - } /> + } /> } /> + } /> } /> } /> diff --git a/frontend/src/Home.jsx b/frontend/src/Home.jsx index db58368..8ac2af7 100644 --- a/frontend/src/Home.jsx +++ b/frontend/src/Home.jsx @@ -1,26 +1,9 @@ import React, { useEffect } from "react"; import { useNavigate } from "react-router-dom"; -import homeLogo from "./assets/img/home.svg"; +import styles from "./Home.module.css"; const Home = () => { - const navigate = useNavigate(); - - useEffect(() => { - const timer = setTimeout(() => { - navigate("/login"); - }, 2000); - - return () => clearTimeout(timer); - }, [navigate]); - - return ( -
-
-

PIROCHECK

- PiroCheck Logo -
-
- ); + return
; }; export default Home; diff --git a/frontend/src/Home.module.css b/frontend/src/Home.module.css new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/Intro.jsx b/frontend/src/Intro.jsx new file mode 100644 index 0000000..0419c6a --- /dev/null +++ b/frontend/src/Intro.jsx @@ -0,0 +1,25 @@ +import React, { useEffect } from "react"; +import { useNavigate } from "react-router-dom"; +import styles from "./Intro.module.css"; + +const Intro = () => { + const navigate = useNavigate(); + + useEffect(() => { + const timer = setTimeout(() => { + navigate("/login"); + }, 2000); + + return () => clearTimeout(timer); + }, [navigate]); + + return ( +
+
+

PIROCHECK

+
+
+ ); +}; + +export default Intro; diff --git a/frontend/src/Intro.module.css b/frontend/src/Intro.module.css new file mode 100644 index 0000000..1344aaa --- /dev/null +++ b/frontend/src/Intro.module.css @@ -0,0 +1,21 @@ +.intro { + background-image: url("./assets/img/home.svg"); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; +} +.pirocheck { + font-size: 1.25rem; + transform: scaleX(1.5); +} +.intro_container { + background-color: var(--background-black); + color: var(--main-green); + font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; + padding: 1rem; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} From 56f9aeaa6048939ff38fd2a30617b2a65f47d5bf Mon Sep 17 00:00:00 2001 From: dietken1 Date: Mon, 5 May 2025 21:51:52 +0900 Subject: [PATCH 13/44] =?UTF-8?q?=EC=A4=91=EA=B0=84=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AttendanceController.java | 25 +++++++++ .../dto/request/GetAttendanceByDateReq.java | 11 ++++ .../response/GetAttendanceByUserIdRes.java | 13 +++++ .../attendence/entity/Attendance.java | 29 ++++++++++ ...ttendenceCode.java => AttendanceCode.java} | 4 +- .../attendence/entity/Attendence.java | 16 ------ .../repository/AttendanceCodeRepository.java | 9 ++++ .../repository/AttendanceRepository.java | 13 +++++ .../attendence/service/AttendanceService.java | 54 +++++++++++++++++++ 9 files changed, 156 insertions(+), 18 deletions(-) create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/GetAttendanceByDateReq.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/GetAttendanceByUserIdRes.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendance.java rename backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/{AttendenceCode.java => AttendanceCode.java} (81%) delete mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendence.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceCodeRepository.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceRepository.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/attendence/service/AttendanceService.java diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java new file mode 100644 index 0000000..ddb4406 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java @@ -0,0 +1,25 @@ +package backend.pirocheck.attendence.controller; + +import backend.pirocheck.attendence.entity.AttendanceCode; +import backend.pirocheck.attendence.service.AttendanceService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/attendance") +public class AttendanceController { + private final AttendanceService attendanceService; + + // 특정 유저의 출석 정보 + @GetMapping("/{userId}") + public AttendanceCode getAttendance() { + + } + + // 특정 유저의 특정 일자 출석 정보 + @GetMapping("") + public +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/GetAttendanceByDateReq.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/GetAttendanceByDateReq.java new file mode 100644 index 0000000..d731fb4 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/GetAttendanceByDateReq.java @@ -0,0 +1,11 @@ +package backend.pirocheck.attendence.dto.request; + +import lombok.Getter; + +import java.time.LocalDate; + +@Getter +public class GetAttendanceByDateReq { + private Long userId; + private LocalDate date; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/GetAttendanceByUserIdRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/GetAttendanceByUserIdRes.java new file mode 100644 index 0000000..50fd6a4 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/GetAttendanceByUserIdRes.java @@ -0,0 +1,13 @@ +package backend.pirocheck.attendence.dto.response; + +import lombok.Getter; + +import java.time.LocalDate; + +@Getter +public class GetAttendanceByUserIdRes { + private Long userId; + private LocalDate date; + private int order; + private boolean status; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendance.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendance.java new file mode 100644 index 0000000..8eedd37 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendance.java @@ -0,0 +1,29 @@ +package backend.pirocheck.attendence.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDate; + +@Entity +@Table( + name = "attendance", + uniqueConstraints = @UniqueConstraint(columnNames = {"user_id", "date", "order"}) +) +@Getter @Setter +public class Attendance { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "user_id", nullable = false) + private User user; + + private LocalDate date; + + private int order; + + private boolean status; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendenceCode.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendanceCode.java similarity index 81% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendenceCode.java rename to backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendanceCode.java index 59a5d8e..98c709d 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendenceCode.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendanceCode.java @@ -7,9 +7,9 @@ import lombok.Setter; @Entity -@Table(name = "attendence_code") +@Table(name = "attendance_code") @Getter @Setter -public class AttendenceCode { +public class AttendanceCode { @Id private Long id; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendence.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendence.java deleted file mode 100644 index d05267f..0000000 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendence.java +++ /dev/null @@ -1,16 +0,0 @@ -package backend.pirocheck.attendence.entity; - -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; - -@Entity -@Table(name = "attendence") -public class Attendence { - @Id - private Long id; - - private Long userId; - private int week; - -} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceCodeRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceCodeRepository.java new file mode 100644 index 0000000..b535f56 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceCodeRepository.java @@ -0,0 +1,9 @@ +package backend.pirocheck.attendence.repository; + +import backend.pirocheck.attendence.entity.AttendanceCode; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface AttendanceCodeRepository extends JpaRepository { +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceRepository.java new file mode 100644 index 0000000..3e5786d --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceRepository.java @@ -0,0 +1,13 @@ +package backend.pirocheck.attendence.repository; + +import backend.pirocheck.attendence.entity.Attendance; +import backend.pirocheck.attendence.entity.AttendanceCode; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface AttendanceRepository extends JpaRepository { + List findByUserId(Long userId); +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/service/AttendanceService.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/service/AttendanceService.java new file mode 100644 index 0000000..b9d1fd2 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/service/AttendanceService.java @@ -0,0 +1,54 @@ +package backend.pirocheck.attendence.service; + +import backend.pirocheck.attendence.entity.Attendance; +import backend.pirocheck.attendence.entity.AttendanceCode; +import backend.pirocheck.attendence.repository.AttendanceCodeRepository; +import backend.pirocheck.attendence.repository.AttendanceRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.util.concurrent.ThreadLocalRandom; + +@Service +@RequiredArgsConstructor +public class AttendanceService { + + private final AttendanceRepository attendanceRepository; + private final AttendanceCodeRepository attendanceCodeRepository; + + // 출석코드 생성 함수 + @Transactional + public AttendanceCode generateCodeAndCreateAttendances(Long classId, int order) { + // 1. 출석 코드 생성 + String code = String.valueOf(ThreadLocalRandom.current().nextInt(1000, 10000)); + + AttendanceCode attendanceCode = new AttendanceCode(); + attendanceCode.setCode(code); + attendanceCodeRepository.save(attendanceCode); + + // 2. user 권한을 가진 학생 리스트 조회 + List users = userRepository.findAllByRole(Role.USER); + + // 3. 각 학생에 대해 출석 데이터 미리 생성 + for (User user : users) { + Attendance attendance = new Attendance(); + attendance.setUser(user); + attendance.setDate(LocalDate.now()); + attendance.setOrder(order); + attendance.setStatus(false); // 기본은 false + attendanceRepository.save(attendance); + } + + return attendanceCode; + } + + + // 출석코드 삭제 함수 + + // 유저 id로 출석 조회하는 함수 + public Attendance findByUserId(Long userId) { + + } +} From ecee2f31dc5f616d371519b3bdca30f4bc665e85 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Tue, 6 May 2025 01:14:34 +0900 Subject: [PATCH 14/44] =?UTF-8?q?[feat]=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Admin.jsx | 9 ++ frontend/src/App.jsx | 2 + frontend/src/Login.jsx | 96 +++++++++++++++++-- frontend/src/Login.module.css | 44 +++++++++ frontend/src/assets/root.css | 2 +- frontend/src/components/InputBlock.jsx | 7 +- .../components/componentsCss/InfoBlock.css | 7 ++ frontend/vite.config.js | 16 +++- 8 files changed, 168 insertions(+), 15 deletions(-) create mode 100644 frontend/src/Admin.jsx create mode 100644 frontend/src/Login.module.css diff --git a/frontend/src/Admin.jsx b/frontend/src/Admin.jsx new file mode 100644 index 0000000..1eb01d0 --- /dev/null +++ b/frontend/src/Admin.jsx @@ -0,0 +1,9 @@ +const Admin = () => { + return ( +
+

Admin Page

+

This is the admin page.

+
+ ); +}; +export default Admin; diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index b168902..a8edf28 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -5,6 +5,7 @@ import Home from "./Home"; import Assignment from "./Assignment"; import Deposit from "./Deposit"; import Intro from "./Intro"; +import Admin from "./Admin"; function App() { return ( @@ -15,6 +16,7 @@ function App() { } /> } /> } /> + } />
); diff --git a/frontend/src/Login.jsx b/frontend/src/Login.jsx index 06d3ddb..166e8a9 100644 --- a/frontend/src/Login.jsx +++ b/frontend/src/Login.jsx @@ -1,14 +1,96 @@ import React from "react"; +import { useState } from "react"; +import InputBlock from "./components/InputBlock"; +import { useNavigate } from "react-router-dom"; +import styles from "./Login.module.css"; + +const Login = () => { + const [name, setName] = useState(""); + const [password, setPassword] = useState(""); + const [responseMessage, setResponseMessage] = useState(""); + + const navigate = useNavigate(); + + const handleChange = (index, value) => { + if (index === 0) setName(value); + else if (index === 1) setPassword(value); + }; + + const handleLogin = async () => { + try { + const res = await fetch("/api/login", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + credentials: "include", + body: JSON.stringify({ name, password }), + }); + + if (!res.ok) { + const data = await res.json(); + + if (res.status === 401) { + setResponseMessage( + data?.message || "이름 또는 비밀번호를 다시 확인해주세요." + ); + } else { + setResponseMessage( + data?.message || + "알 수 없는 오류가 발생했습니다. 다시 시도해주세요." + ); + } + + return; + } + + const data = await res.json(); // { id, name, role } + + localStorage.setItem("user", JSON.stringify(data)); + + if (data.role === "ADMIN") { + navigate("/admin"); + } else if (data.role === "MEMBER") { + navigate("/home"); + } else { + setResponseMessage("알 수 없는 사용자 유형입니다."); + } + } catch (error) { + console.error(error); + setResponseMessage("서버 연결에 실패했습니다. 다시 시도해주세요."); + } + }; -const Login = ({ onLogin }) => { return ( -
-

로그인 페이지

- - - +
+
+

PIROCHECK

+ + +
+ {responseMessage} +
+ +
); }; - export default Login; diff --git a/frontend/src/Login.module.css b/frontend/src/Login.module.css new file mode 100644 index 0000000..ece282e --- /dev/null +++ b/frontend/src/Login.module.css @@ -0,0 +1,44 @@ +.login { + height: 100vh; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} +.pirocheck { + font-size: 1.25rem; + transform: scaleX(1.5); + margin-bottom: 65px; +} +.login_container { + background-color: var(--background-black); + color: var(--main-green); + font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; + padding: 1rem; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} +.button { + background-color: var(--main-green); + color: white; + width: 309px; + height: 47px; + border-radius: 14px; + margin-top: 15px; + font-size: 16px; +} +button:disabled { + opacity: 0.6; + cursor: default; +} +.errorWrapper { + width: 309px; + display: flex; + justify-content: flex-start; + margin-left: 8px; +} +.errormessage { + font-family: "Noto Sans", sans-serif; + color: #ff5858; + font-size: 10px; + margin-top: 10px; +} diff --git a/frontend/src/assets/root.css b/frontend/src/assets/root.css index 03f70a6..0b747e1 100644 --- a/frontend/src/assets/root.css +++ b/frontend/src/assets/root.css @@ -17,7 +17,7 @@ --fill-gray: #d9d9d9; --warn-red: #ff5858; --text-white: #ffffff; - --border-gray: #c7c7c7; + --border-gray: rgba(204, 204, 204, 0.4); } .noto-sans-kr-context { font-family: "Noto Sans KR", sans-serif; diff --git a/frontend/src/components/InputBlock.jsx b/frontend/src/components/InputBlock.jsx index 18acb60..a6ff2d4 100644 --- a/frontend/src/components/InputBlock.jsx +++ b/frontend/src/components/InputBlock.jsx @@ -1,15 +1,16 @@ import React from "react"; import "./componentsCss/InfoBlock.css"; -const InputBlock = ({ inputs }) => { +const InputBlock = ({ inputs, onChange }) => { return ( -
+
{inputs.map((input, index) => ( onChange && onChange(index, e.target.value)} /> ))}
diff --git a/frontend/src/components/componentsCss/InfoBlock.css b/frontend/src/components/componentsCss/InfoBlock.css index 73b7438..82aa409 100644 --- a/frontend/src/components/componentsCss/InfoBlock.css +++ b/frontend/src/components/componentsCss/InfoBlock.css @@ -9,7 +9,14 @@ font-family: "Noto Sans KR", sans-serif; border: 1px var(--background-black) solid; padding: 10px; + margin-top: 11px; } .inputTag:focus { border: 1px var(--main-green) solid; } +.inputBlock { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 8b0f57b..6b46dee 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -1,7 +1,15 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; -// https://vite.dev/config/ +// https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], -}) + server: { + proxy: { + "/api": { + target: "http://localhost:8080", + changeOrigin: true, + }, + }, + }, +}); From 48e32345b2a12c10c920a8e276f2d7dfa7e54be6 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Tue, 6 May 2025 01:27:51 +0900 Subject: [PATCH 15/44] =?UTF-8?q?[refactor]=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=20API=20fetch=20=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC=20(api?= =?UTF-8?q?/user.js)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Login.jsx | 10 ++-------- frontend/src/api/user.js | 0 2 files changed, 2 insertions(+), 8 deletions(-) create mode 100644 frontend/src/api/user.js diff --git a/frontend/src/Login.jsx b/frontend/src/Login.jsx index 166e8a9..e74413a 100644 --- a/frontend/src/Login.jsx +++ b/frontend/src/Login.jsx @@ -3,6 +3,7 @@ import { useState } from "react"; import InputBlock from "./components/InputBlock"; import { useNavigate } from "react-router-dom"; import styles from "./Login.module.css"; +import { loginUser } from "./api/user"; const Login = () => { const [name, setName] = useState(""); @@ -18,14 +19,7 @@ const Login = () => { const handleLogin = async () => { try { - const res = await fetch("/api/login", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - credentials: "include", - body: JSON.stringify({ name, password }), - }); + const res = await loginUser({ name, password }); if (!res.ok) { const data = await res.json(); diff --git a/frontend/src/api/user.js b/frontend/src/api/user.js new file mode 100644 index 0000000..e69de29 From cbe7dfb5c06819893b581b4212aa2ba957666b94 Mon Sep 17 00:00:00 2001 From: dietken1 Date: Tue, 6 May 2025 01:39:29 +0900 Subject: [PATCH 16/44] =?UTF-8?q?=EC=A0=84=EC=B2=B4=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EA=B5=AC=EC=84=B1=EC=99=84=EB=A3=8C=20(=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EB=B3=B4=EC=99=84=ED=95=A0=20=EC=82=AC=ED=95=AD=20=EC=A1=B4?= =?UTF-8?q?=EC=9E=AC=ED=95=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../User/repository/UserRepository.java | 4 + .../controller/AttendanceController.java | 46 ++++++-- .../dto/request/MarkAttendanceReq.java | 9 ++ .../dto/response/AttendanceSlotRes.java | 14 +++ .../dto/response/AttendanceStatusRes.java | 15 +++ .../attendence/entity/Attendance.java | 4 +- .../attendence/entity/AttendanceCode.java | 15 ++- .../repository/AttendanceCodeRepository.java | 5 + .../repository/AttendanceRepository.java | 6 +- .../attendence/service/AttendanceService.java | 103 ++++++++++++++++-- 10 files changed, 200 insertions(+), 21 deletions(-) create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/MarkAttendanceReq.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceSlotRes.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceStatusRes.java diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/repository/UserRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/repository/UserRepository.java index 675aca1..9f80d25 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/User/repository/UserRepository.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/repository/UserRepository.java @@ -1,11 +1,15 @@ package backend.pirocheck.User.repository; +import backend.pirocheck.User.entity.Role; import backend.pirocheck.User.entity.User; import io.swagger.v3.oas.annotations.Operation; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; import java.util.Optional; public interface UserRepository extends JpaRepository { Optional findByName(String name); + + List findByRole(Role role); } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java index ddb4406..ac5847a 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java @@ -1,25 +1,55 @@ package backend.pirocheck.attendence.controller; +import backend.pirocheck.attendence.dto.request.GetAttendanceByDateReq; +import backend.pirocheck.attendence.dto.request.MarkAttendanceReq; +import backend.pirocheck.attendence.dto.response.AttendanceSlotRes; +import backend.pirocheck.attendence.dto.response.AttendanceStatusRes; import backend.pirocheck.attendence.entity.AttendanceCode; import backend.pirocheck.attendence.service.AttendanceService; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; +import java.util.List; @RestController @RequiredArgsConstructor @RequestMapping("/api/attendance") public class AttendanceController { + private final AttendanceService attendanceService; // 특정 유저의 출석 정보 - @GetMapping("/{userId}") - public AttendanceCode getAttendance() { - + @GetMapping("/user") + public List getAttendanceByUserId(@RequestParam Long userId) { + return attendanceService.findByUserId(userId); } // 특정 유저의 특정 일자 출석 정보 - @GetMapping("") - public + @GetMapping("/user/date") + public List getAttendanceByUserIdAndDate( + @RequestParam Long userId, + @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date + ) { + return attendanceService.findByUserIdAndDate(userId, LocalDate.now()); + } + + // 출석체크 시작 + @PostMapping("/start") + public AttendanceCode postAttendance() { + return attendanceService.generateCodeAndCreateAttendances(); + } + + // 출석코드 비교 + @PostMapping("/mark") + public boolean markAttendance(@RequestBody MarkAttendanceReq req) { + return attendanceService.markAttendance(req.getUserId(), req.getCode()); + } + + // 출석체크 종료 + @PutMapping("/expire") + public boolean expireAttendance(@RequestParam String code) { + return attendanceService.exprireAttendanceCode(code); + } } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/MarkAttendanceReq.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/MarkAttendanceReq.java new file mode 100644 index 0000000..a6aad92 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/MarkAttendanceReq.java @@ -0,0 +1,9 @@ +package backend.pirocheck.attendence.dto.request; + +import lombok.Getter; + +@Getter +public class MarkAttendanceReq { + private Long userId; + private String code; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceSlotRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceSlotRes.java new file mode 100644 index 0000000..81f0bbf --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceSlotRes.java @@ -0,0 +1,14 @@ +package backend.pirocheck.attendence.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class AttendanceSlotRes { + private int order; + private boolean status; + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceStatusRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceStatusRes.java new file mode 100644 index 0000000..2a965ac --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceStatusRes.java @@ -0,0 +1,15 @@ +package backend.pirocheck.attendence.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDate; +import java.util.List; + +@Getter +@Setter +public class AttendanceStatusRes { + private LocalDate date; + private List slots; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendance.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendance.java index 8eedd37..af9ce56 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendance.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendance.java @@ -1,5 +1,6 @@ package backend.pirocheck.attendence.entity; +import backend.pirocheck.User.entity.User; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -9,7 +10,7 @@ @Entity @Table( name = "attendance", - uniqueConstraints = @UniqueConstraint(columnNames = {"user_id", "date", "order"}) + uniqueConstraints = @UniqueConstraint(columnNames = {"user_id", "date", "order_number"}) ) @Getter @Setter public class Attendance { @@ -23,6 +24,7 @@ public class Attendance { private LocalDate date; + @Column(name = "order_number") private int order; private boolean status; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendanceCode.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendanceCode.java index 98c709d..358bf29 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendanceCode.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendanceCode.java @@ -1,17 +1,24 @@ package backend.pirocheck.attendence.entity; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; +import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; +import java.time.LocalDate; + @Entity @Table(name = "attendance_code") @Getter @Setter public class AttendanceCode { - @Id + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String code; + + private LocalDate date; + + @Column(name = "order_number") + private int order; + + private boolean isExpired = false; } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceCodeRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceCodeRepository.java index b535f56..2c30b55 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceCodeRepository.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceCodeRepository.java @@ -4,6 +4,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.time.LocalDate; +import java.util.Optional; + @Repository public interface AttendanceCodeRepository extends JpaRepository { + int countByDate(LocalDate date); + Optional findByCodeAndDate(String code, LocalDate date); } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceRepository.java index 3e5786d..445f157 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceRepository.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceRepository.java @@ -5,9 +5,13 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.time.LocalDate; import java.util.List; +import java.util.Optional; @Repository -public interface AttendanceRepository extends JpaRepository { +public interface AttendanceRepository extends JpaRepository { List findByUserId(Long userId); + List findByUserIdAndDate(Long userId, LocalDate date); + Optional findByUserIdAndDateAndOrder(Long userId, LocalDate date, int order); } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/service/AttendanceService.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/service/AttendanceService.java index b9d1fd2..42ffe8f 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/service/AttendanceService.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/service/AttendanceService.java @@ -1,5 +1,10 @@ package backend.pirocheck.attendence.service; +import backend.pirocheck.User.entity.Role; +import backend.pirocheck.User.entity.User; +import backend.pirocheck.User.repository.UserRepository; +import backend.pirocheck.attendence.dto.response.AttendanceSlotRes; +import backend.pirocheck.attendence.dto.response.AttendanceStatusRes; import backend.pirocheck.attendence.entity.Attendance; import backend.pirocheck.attendence.entity.AttendanceCode; import backend.pirocheck.attendence.repository.AttendanceCodeRepository; @@ -9,7 +14,12 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -17,38 +27,117 @@ public class AttendanceService { private final AttendanceRepository attendanceRepository; private final AttendanceCodeRepository attendanceCodeRepository; + private final UserRepository userRepository; // 출석코드 생성 함수 @Transactional - public AttendanceCode generateCodeAndCreateAttendances(Long classId, int order) { + public AttendanceCode generateCodeAndCreateAttendances() { + LocalDate today = LocalDate.now(); + + // 오늘 생성된 출석코드 개수 = 현재까지 생성된 차시 수 + 1 (MAX=3) + int currentOrder = attendanceCodeRepository.countByDate(today) + 1; + // 1. 출석 코드 생성 String code = String.valueOf(ThreadLocalRandom.current().nextInt(1000, 10000)); AttendanceCode attendanceCode = new AttendanceCode(); attendanceCode.setCode(code); + attendanceCode.setDate(today); + attendanceCode.setOrder(currentOrder); attendanceCodeRepository.save(attendanceCode); // 2. user 권한을 가진 학생 리스트 조회 - List users = userRepository.findAllByRole(Role.USER); + List users = userRepository.findByRole(Role.MEMBER); // 3. 각 학생에 대해 출석 데이터 미리 생성 for (User user : users) { Attendance attendance = new Attendance(); attendance.setUser(user); attendance.setDate(LocalDate.now()); - attendance.setOrder(order); + attendance.setOrder(currentOrder); attendance.setStatus(false); // 기본은 false attendanceRepository.save(attendance); } - return attendanceCode; } + // 출석코드 만료처리 함수 + @Transactional + public boolean exprireAttendanceCode(String code) { + Optional codeOpt = attendanceCodeRepository.findByCodeAndDate(code, LocalDate.now()); + + if (codeOpt.isEmpty()) { + return false; + } + + AttendanceCode attendanceCode = codeOpt.get(); + + if (attendanceCode.isExpired()) { + return false; + } + + attendanceCode.setExpired(true); + attendanceCodeRepository.save(attendanceCode); + + return true; + } + + // 출석처리 함수 + @Transactional + public boolean markAttendance(Long userId, String inputCode) { + // 1. 출석코드 일치 비교 + Optional validCodeOpt = attendanceCodeRepository.findByCodeAndDate(inputCode, LocalDate.now()); + + if (validCodeOpt.isEmpty()) return false; + + AttendanceCode code = validCodeOpt.get(); + + // 2. 해당 유저의 출석 레코드 조회 + Optional attendanceOpt = attendanceRepository.findByUserIdAndDateAndOrder(userId, code.getDate(), code.getOrder()); + + if (attendanceOpt.isEmpty()) return false; + + // 3. 출석 처리 + Attendance attendance = attendanceOpt.get(); + attendance.setStatus(true); + attendanceRepository.save(attendance); - // 출석코드 삭제 함수 + return true; + } + + // 유저의 전체 출석 현황을 조회하는 함수 + public List findByUserId(Long userId) { + List attendances = attendanceRepository.findByUserId(userId); + + // 날짜별로 그룹화 + Map> grouped = attendances.stream() + .collect(Collectors.groupingBy(Attendance::getDate)); + + // 날짜별로 DTO 변환 + return grouped.entrySet().stream() + .map(entry -> { + LocalDate date = entry.getKey(); + List slots = entry.getValue().stream() + .map(a -> new AttendanceSlotRes(a.getOrder(), a.isStatus())) + .sorted(Comparator.comparingInt(AttendanceSlotRes::getOrder)) + .toList(); + + AttendanceStatusRes dto = new AttendanceStatusRes(); + dto.setDate(date); + dto.setSlots(slots); + return dto; + }) + .sorted(Comparator.comparing(AttendanceStatusRes::getDate).reversed()) + .toList(); + } - // 유저 id로 출석 조회하는 함수 - public Attendance findByUserId(Long userId) { + // 유저의 특정 날짜의 출석 현황을 조회하는 함수 + public List findByUserIdAndDate(Long userId, LocalDate date) { + List attendances = attendanceRepository.findByUserIdAndDate(userId, date); + return attendances.stream() + .map(a -> new AttendanceSlotRes(a.getOrder(), a.isStatus())) + .sorted(Comparator.comparingInt(AttendanceSlotRes::getOrder)) + .toList(); } } From 2ac7f4a7f18d903ac2504512ffcad81e6ec3cdd9 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Tue, 6 May 2025 02:49:03 +0900 Subject: [PATCH 17/44] =?UTF-8?q?[feat]Home=20page=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/App.jsx | 2 + frontend/src/Attendance.jsx | 9 ++++ frontend/src/Home.jsx | 27 +++++++++- frontend/src/Home.module.css | 49 +++++++++++++++++++ frontend/src/Intro.module.css | 23 +++++++-- frontend/src/Login.module.css | 1 - frontend/src/api/user.js | 14 ++++++ .../src/assets/img/{home.svg => logo.svg} | 2 +- 8 files changed, 118 insertions(+), 9 deletions(-) create mode 100644 frontend/src/Attendance.jsx rename frontend/src/assets/img/{home.svg => logo.svg} (99%) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index a8edf28..db217ff 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -6,6 +6,7 @@ import Assignment from "./Assignment"; import Deposit from "./Deposit"; import Intro from "./Intro"; import Admin from "./Admin"; +import Attendance from "./Attendance"; function App() { return ( @@ -15,6 +16,7 @@ function App() { } /> } /> } /> + } /> } /> } /> diff --git a/frontend/src/Attendance.jsx b/frontend/src/Attendance.jsx new file mode 100644 index 0000000..13dedd9 --- /dev/null +++ b/frontend/src/Attendance.jsx @@ -0,0 +1,9 @@ +const Attendance = () => { + return ( +
+

Attendance

+

Attendance page content goes here.

+
+ ); +}; +export default Attendance; diff --git a/frontend/src/Home.jsx b/frontend/src/Home.jsx index 8ac2af7..d8b1c7c 100644 --- a/frontend/src/Home.jsx +++ b/frontend/src/Home.jsx @@ -1,9 +1,32 @@ -import React, { useEffect } from "react"; +import React from "react"; import { useNavigate } from "react-router-dom"; import styles from "./Home.module.css"; +import logo from "./assets/img/logo.svg"; const Home = () => { - return
; + const navigate = useNavigate(); + return ( +
+
+

PIROCHECK

+ + + 로고 +
+
+ ); }; export default Home; diff --git a/frontend/src/Home.module.css b/frontend/src/Home.module.css index e69de29..4165919 100644 --- a/frontend/src/Home.module.css +++ b/frontend/src/Home.module.css @@ -0,0 +1,49 @@ +.home { + height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + overflow: hidden; +} +.pirocheck { + margin-top: 43px; + font-size: 1.25rem; + transform: scaleX(1.5); + margin-bottom: 103px; +} +.home_container { + background-color: var(--background-black); + color: var(--main-green); + font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} +.button { + width: 309px; + height: 81px; + border-radius: 14px; + background-color: var(--border-gray); + color: var(--text-white); + font-weight: 400; + font-size: 20px; + border: 1px var(--background-black) solid; + padding: 15px; + font-weight: bold; + margin-bottom: 26px; + z-index: 1; +} +.button p { + text-align: start; + transform: scale(1.3, 0.9); + margin-left: 40px; +} +.button:hover { + background-color: var(--card-toggle-green); + color: var(--text-white); +} +.home img { + position: relative; + opacity: 0.8; + top: -92px; + z-index: 0; +} diff --git a/frontend/src/Intro.module.css b/frontend/src/Intro.module.css index 1344aaa..9fc44ae 100644 --- a/frontend/src/Intro.module.css +++ b/frontend/src/Intro.module.css @@ -1,12 +1,24 @@ .intro { - background-image: url("./assets/img/home.svg"); - background-repeat: no-repeat; - background-size: contain; - background-position: center; + width: 390px; + position: relative; height: 100vh; display: flex; justify-content: center; align-items: center; + z-index: 0; + overflow: hidden; +} + +.intro::before { + content: ""; + position: absolute; + inset: 0; + background-image: url("./assets/img/logo.svg"); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + opacity: 0.5; + z-index: -1; } .pirocheck { font-size: 1.25rem; @@ -16,6 +28,7 @@ background-color: var(--background-black); color: var(--main-green); font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; - padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + display: flex; + justify-content: center; } diff --git a/frontend/src/Login.module.css b/frontend/src/Login.module.css index ece282e..6bb5f64 100644 --- a/frontend/src/Login.module.css +++ b/frontend/src/Login.module.css @@ -14,7 +14,6 @@ background-color: var(--background-black); color: var(--main-green); font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; - padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .button { diff --git a/frontend/src/api/user.js b/frontend/src/api/user.js index e69de29..3964bac 100644 --- a/frontend/src/api/user.js +++ b/frontend/src/api/user.js @@ -0,0 +1,14 @@ +export const loginUser = async ({ name, password }) => { + const res = await fetch("/api/login", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + credentials: "include", + body: JSON.stringify({ name, password }), + }); + + return res; +}; + +export default loginUser; diff --git a/frontend/src/assets/img/home.svg b/frontend/src/assets/img/logo.svg similarity index 99% rename from frontend/src/assets/img/home.svg rename to frontend/src/assets/img/logo.svg index 9b5895e..62a3683 100644 --- a/frontend/src/assets/img/home.svg +++ b/frontend/src/assets/img/logo.svg @@ -1,5 +1,5 @@ - + From ae8a94320e97dba27875db41576850ba1b5c5cd0 Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Wed, 7 May 2025 05:36:33 +0900 Subject: [PATCH 18/44] [Feat] WeeklyListBlock component --- frontend/src/App.jsx | 35 +++++++++++++ frontend/src/assets/root.css | 6 +++ frontend/src/components/Header.jsx | 4 +- frontend/src/components/WeeklyListBlock.jsx | 39 ++++++++++++++ frontend/src/components/WeeklyOpenBlock.jsx | 0 .../componentsCss/WeeklyListBlock.css | 51 +++++++++++++++++++ .../componentsCss/WeeklyOpenBlock.css | 0 7 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 frontend/src/components/WeeklyListBlock.jsx create mode 100644 frontend/src/components/WeeklyOpenBlock.jsx create mode 100644 frontend/src/components/componentsCss/WeeklyListBlock.css create mode 100644 frontend/src/components/componentsCss/WeeklyOpenBlock.css diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index b728e54..963cf41 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -3,12 +3,15 @@ import InputBlock from "./components/InputBlock"; import InfoBlock from "./components/InfoBlock"; import PageBtn from "./components/PageBtn"; import Header from "./components/Header"; +import WeeklyListBlock from "./components/WeeklyListBlock"; +/* function App() { return ( <>
+ ); } +*/ +function App() { + + const weeks = [ + { + label: "1주차 Git/ HTML/CSS", + details: ["제로초 인강", "깃허브 클론 코딩"], + }, + { + label: "2주차 JS개론/웹개론", + details: ["React 기초", "JS 문법"], + }, + { + label: "3주차 JS개론/웹개론", + details: ["Comming soon~"], + }, + { + label: "4주차 Comming soon~", + details: [], + }, + { + label: "5주차 Comming soon~", + details: [], + }, + ]; + + return ( +
+ +
+ ); +} export default App; diff --git a/frontend/src/assets/root.css b/frontend/src/assets/root.css index 03f70a6..50dbd3e 100644 --- a/frontend/src/assets/root.css +++ b/frontend/src/assets/root.css @@ -5,6 +5,8 @@ font-weight: normal; font-style: normal; } + + :root { --main-green: #49ff24; --card-toggle-green: #2aff00; @@ -25,3 +27,7 @@ font-weight: 400; font-style: normal; } + +.inter{ + font-family: "Inter", sans-serif; +} \ No newline at end of file diff --git a/frontend/src/components/Header.jsx b/frontend/src/components/Header.jsx index a545470..3b9d2a0 100644 --- a/frontend/src/components/Header.jsx +++ b/frontend/src/components/Header.jsx @@ -9,8 +9,8 @@ const Header = () => { const location = useLocation(); const path = location.pathname; - let title = "ATTENDANCE CHECK"; - if (path.includes('assignment')) title = "ASSIGNMENT CHECK"; + let title = "ATTENDANCE\nCHECK"; + if (path.includes('assignment')) title = "ASSIGNMENT\nCHECK"; else if (path.includes('deposit')) title = "DEPOSIT"; const showRightButton = !path.includes('deposit'); diff --git a/frontend/src/components/WeeklyListBlock.jsx b/frontend/src/components/WeeklyListBlock.jsx new file mode 100644 index 0000000..3e4b429 --- /dev/null +++ b/frontend/src/components/WeeklyListBlock.jsx @@ -0,0 +1,39 @@ +import React, { useState } from "react"; +import "./componentsCss/WeeklyListBlock.css"; + +const WeeklyListBlock = ({ weeks }) => { + const [openIndex, setOpenIndex] = useState(null); + + const toggleOpen = (index) => { + setOpenIndex(index === openIndex ? null : index); + }; + + return ( +
+ {weeks.map((week, index) => ( +
+ + {openIndex === index && ( +
+ {week.details?.map((detail, i) => ( +
+ {detail} +
+ ))} +
+ )} +
+ ))} +
+ ); +}; + +export default WeeklyListBlock; diff --git a/frontend/src/components/WeeklyOpenBlock.jsx b/frontend/src/components/WeeklyOpenBlock.jsx new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/components/componentsCss/WeeklyListBlock.css b/frontend/src/components/componentsCss/WeeklyListBlock.css new file mode 100644 index 0000000..f1a966c --- /dev/null +++ b/frontend/src/components/componentsCss/WeeklyListBlock.css @@ -0,0 +1,51 @@ +.weekly-list { + display: flex; + flex-direction: column; + gap: 12px; + font-family: "Inter", sans-serif; + width: 371px; + +} + +.weekly-button { + background-color: rgba(217, 217, 217, 0.4); + color: white; + border: 2px solid transparent; + border-radius: 8px; + padding: 12px 20px; + font-size: 15px; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + text-align: left; + cursor: pointer; +} + +.weekly-button:hover{ + border: 1px solid var(--card-toggle-green) +} + + + +.arrow { + font-size: 20px; + transition: transform 0.2s ease; + transform: rotate(30deg); +} + +.arrow.rotate { + transform: rotate(0deg); +} + +.week-details { + background-color: rgba(255, 255, 255, 0.05); + padding: 10px 20px; + border-radius: 0 0 12px 12px; + color: white; + font-size: 16px; +} + +.detail-item { + margin-top: 6px; +} diff --git a/frontend/src/components/componentsCss/WeeklyOpenBlock.css b/frontend/src/components/componentsCss/WeeklyOpenBlock.css new file mode 100644 index 0000000..e69de29 From ee2a87c2099bbc419d47d041392b98fcfef86a66 Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Wed, 7 May 2025 07:19:32 +0900 Subject: [PATCH 19/44] git commit -m"[Feat] add Daily Open Block component" --- frontend/src/App.jsx | 58 ++++++++++------ frontend/src/components/DailyOpenBlock.jsx | 43 ++++++++++++ frontend/src/components/WeeklyListBlock.jsx | 10 ++- frontend/src/components/WeeklyOpenBlock.jsx | 0 .../componentsCss/DailyOpenBlock.css | 67 +++++++++++++++++++ .../componentsCss/WeeklyOpenBlock.css | 0 6 files changed, 153 insertions(+), 25 deletions(-) create mode 100644 frontend/src/components/DailyOpenBlock.jsx delete mode 100644 frontend/src/components/WeeklyOpenBlock.jsx create mode 100644 frontend/src/components/componentsCss/DailyOpenBlock.css delete mode 100644 frontend/src/components/componentsCss/WeeklyOpenBlock.css diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 963cf41..9c91762 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -28,32 +28,46 @@ function App() { function App() { - const weeks = [ - { - label: "1주차 Git/ HTML/CSS", - details: ["제로초 인강", "깃허브 클론 코딩"], - }, - { - label: "2주차 JS개론/웹개론", - details: ["React 기초", "JS 문법"], - }, - { - label: "3주차 JS개론/웹개론", - details: ["Comming soon~"], - }, - { - label: "4주차 Comming soon~", - details: [], - }, - { - label: "5주차 Comming soon~", - details: [], - }, - ]; +const weeks = [ + { + label: "2주차 JS개론/웹개론", + details: [ + { + day: "화", + subject: "Git HTML CSS", + tasks: [ + { label: "제로초 인강", status: "done" }, + { label: "깃허브 클론 코딩", status: "progress" }, + ], + }, + { + day: "목", + subject: "Git HTML CSS", + tasks: [ + { label: "제로초 인강", status: "fail" }, + { label: "깃허브 클론 코딩", status: "progress" }, + ], + }, + ], + }, + { + label: "3주차 JS개론/웹개론", + details: [ + { + day: "화", + subject: "Git HTML CSS", + tasks: [], + }, + ], + }, +]; + return (
+ +
); } diff --git a/frontend/src/components/DailyOpenBlock.jsx b/frontend/src/components/DailyOpenBlock.jsx new file mode 100644 index 0000000..0714901 --- /dev/null +++ b/frontend/src/components/DailyOpenBlock.jsx @@ -0,0 +1,43 @@ +import React, { useState } from "react"; +import "./componentsCss/DailyOpenBlock.css"; + +const DailyOpenBlock = ({ day, subject, tasks }) => { + const [open, setOpen] = useState(false); + + const toggleOpen = () => { + setOpen(!open); + }; + + + return ( +
+ + + {open && ( +
+ {tasks.map((task, index) => ( +
+ {task.label} + + {task.status === "done" && "◯"} + {task.status === "progress" && "△"} + {task.status === "fail" && "✕"} + +
+ ))} +
+ )} +
+ ); +}; + +export default DailyOpenBlock; \ No newline at end of file diff --git a/frontend/src/components/WeeklyListBlock.jsx b/frontend/src/components/WeeklyListBlock.jsx index 3e4b429..088988c 100644 --- a/frontend/src/components/WeeklyListBlock.jsx +++ b/frontend/src/components/WeeklyListBlock.jsx @@ -1,5 +1,6 @@ import React, { useState } from "react"; import "./componentsCss/WeeklyListBlock.css"; +import DailyOpenBlock from "./DailyOpenBlock"; const WeeklyListBlock = ({ weeks }) => { const [openIndex, setOpenIndex] = useState(null); @@ -24,9 +25,12 @@ const WeeklyListBlock = ({ weeks }) => { {openIndex === index && (
{week.details?.map((detail, i) => ( -
- {detail} -
+ ))}
)} diff --git a/frontend/src/components/WeeklyOpenBlock.jsx b/frontend/src/components/WeeklyOpenBlock.jsx deleted file mode 100644 index e69de29..0000000 diff --git a/frontend/src/components/componentsCss/DailyOpenBlock.css b/frontend/src/components/componentsCss/DailyOpenBlock.css new file mode 100644 index 0000000..793735d --- /dev/null +++ b/frontend/src/components/componentsCss/DailyOpenBlock.css @@ -0,0 +1,67 @@ +.daily-open-block { + background-color: #045E07; + padding: 5px 0px 2px 2px; + border-radius: 8px; + margin-bottom: 8px; + +} + +.daily-open-header { + display: flex; + justify-content: start; + align-items: center; + gap: 12px; + color: white; + font-weight: 400; + margin-bottom: 10px; + font-size: 14px; +} + +.task-list { + display: flex; + flex-direction: column; + gap: 8px; + font-family: "Noto Sans KR", sans-serif; + font-size: 13px; + font-weight: 400; + margin: 10px; +} + +.task-item { + display: flex; + justify-content: space-between; + align-items: center; + background-color: rgba(217, 217, 217, 0.4); + border: 1px solid rgba(217, 217, 217, 0.4); + border-radius: 30px; + padding: 10px 18px; + color: white; + height: 9px; +} + + +.task-icon { + font-size: 20px; + +} + +.arrow { + font-size: 20px; + transition: transform 0.2s ease; + transform: rotate(30deg); +} + +.arrow.rotate { + transform: rotate(0deg); +} + +.daily-button { + + background-color: transparent; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + text-align: left; + cursor: pointer; +} \ No newline at end of file diff --git a/frontend/src/components/componentsCss/WeeklyOpenBlock.css b/frontend/src/components/componentsCss/WeeklyOpenBlock.css deleted file mode 100644 index e69de29..0000000 From 68d8553df7331b28d379962468d2361f556c7665 Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Wed, 7 May 2025 13:29:34 +0900 Subject: [PATCH 20/44] [Fix] fix assignmnet card component(weekly&daily) css --- frontend/src/components/DailyOpenBlock.jsx | 1 - frontend/src/components/WeeklyListBlock.jsx | 1 + frontend/src/components/WeeklyOpenBlock.jsx | 41 +++++++++++++++++++ .../componentsCss/DailyOpenBlock.css | 2 +- .../componentsCss/WeeklyListBlock.css | 20 +++++++-- frontend/src/index.css | 2 +- 6 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 frontend/src/components/WeeklyOpenBlock.jsx diff --git a/frontend/src/components/DailyOpenBlock.jsx b/frontend/src/components/DailyOpenBlock.jsx index 0714901..c0cec72 100644 --- a/frontend/src/components/DailyOpenBlock.jsx +++ b/frontend/src/components/DailyOpenBlock.jsx @@ -7,7 +7,6 @@ const DailyOpenBlock = ({ day, subject, tasks }) => { const toggleOpen = () => { setOpen(!open); }; - return (
diff --git a/frontend/src/components/WeeklyListBlock.jsx b/frontend/src/components/WeeklyListBlock.jsx index 088988c..8f8a7ee 100644 --- a/frontend/src/components/WeeklyListBlock.jsx +++ b/frontend/src/components/WeeklyListBlock.jsx @@ -23,6 +23,7 @@ const WeeklyListBlock = ({ weeks }) => { {openIndex === index && ( +
{week.details?.map((detail, i) => ( { + const [isOpen, setIsOpen] = useState(false); + + const toggleOpen = () => { + setIsOpen(!isOpen); + }; + + return ( +
+
+ + {isOpen && ( + + )} +
+ + {isOpen && ( +
+ {days.map((dayData, index) => ( + + ))} +
+ )} +
+ ); +}; + +export default WeeklyOpenBlock; \ No newline at end of file diff --git a/frontend/src/components/componentsCss/DailyOpenBlock.css b/frontend/src/components/componentsCss/DailyOpenBlock.css index 793735d..fe64020 100644 --- a/frontend/src/components/componentsCss/DailyOpenBlock.css +++ b/frontend/src/components/componentsCss/DailyOpenBlock.css @@ -1,5 +1,5 @@ .daily-open-block { - background-color: #045E07; + background-color:#045E07; padding: 5px 0px 2px 2px; border-radius: 8px; margin-bottom: 8px; diff --git a/frontend/src/components/componentsCss/WeeklyListBlock.css b/frontend/src/components/componentsCss/WeeklyListBlock.css index f1a966c..7b09485 100644 --- a/frontend/src/components/componentsCss/WeeklyListBlock.css +++ b/frontend/src/components/componentsCss/WeeklyListBlock.css @@ -7,10 +7,14 @@ } +.weekly-item{ + background-color: #045E07; +} + .weekly-button { - background-color: rgba(217, 217, 217, 0.4); + background-color: #575757; color: white; - border: 2px solid transparent; + border: 1px solid rgba(217, 217, 217, 0.4); border-radius: 8px; padding: 12px 20px; font-size: 15px; @@ -26,7 +30,10 @@ border: 1px solid var(--card-toggle-green) } - +.weekly-button.active{ + background-color: #045E07; + border: none; +} .arrow { font-size: 20px; @@ -39,13 +46,18 @@ } .week-details { - background-color: rgba(255, 255, 255, 0.05); + /*background-color: rgba(255, 255, 255, 0.05);*/ padding: 10px 20px; border-radius: 0 0 12px 12px; color: white; font-size: 16px; + } .detail-item { margin-top: 6px; } + +.daily-open-block-wrapper{ + background-color:#045E07; +} \ No newline at end of file diff --git a/frontend/src/index.css b/frontend/src/index.css index 0e256a2..2de4eee 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -47,7 +47,7 @@ button { transition: border-color 0.25s; } button:hover { - border-color: #646cff; + border-color: #2aff00; } button:focus, button:focus-visible { From d92e55894e99cf90d98b1bd58978639d4598e4df Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Wed, 7 May 2025 13:33:49 +0900 Subject: [PATCH 21/44] [Fix] App.jsx&main.jsx --- frontend/src/App.jsx | 88 +++++++--------------------- frontend/src/main.jsx | 13 ++-- frontend/src/test/AssignmentTest.jsx | 53 +++++++++++++++++ 3 files changed, 78 insertions(+), 76 deletions(-) create mode 100644 frontend/src/test/AssignmentTest.jsx diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 9c91762..993fb09 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,74 +1,26 @@ import React from "react"; -import InputBlock from "./components/InputBlock"; -import InfoBlock from "./components/InfoBlock"; -import PageBtn from "./components/PageBtn"; -import Header from "./components/Header"; -import WeeklyListBlock from "./components/WeeklyListBlock"; - -/* +import { BrowserRouter, Routes, Route } from "react-router-dom"; +import Login from "./Login"; +import Home from "./Home"; +import Assignment from "./Assignment"; +import Deposit from "./Deposit"; +import Intro from "./Intro"; +import Admin from "./Admin"; +import Attendance from "./Attendance"; function App() { return ( - <> -
-
- - - - -
- + + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + ); } -*/ - -function App() { - -const weeks = [ - { - label: "2주차 JS개론/웹개론", - details: [ - { - day: "화", - subject: "Git HTML CSS", - tasks: [ - { label: "제로초 인강", status: "done" }, - { label: "깃허브 클론 코딩", status: "progress" }, - ], - }, - { - day: "목", - subject: "Git HTML CSS", - tasks: [ - { label: "제로초 인강", status: "fail" }, - { label: "깃허브 클론 코딩", status: "progress" }, - ], - }, - ], - }, - { - label: "3주차 JS개론/웹개론", - details: [ - { - day: "화", - subject: "Git HTML CSS", - tasks: [], - }, - ], - }, -]; - - return ( -
- - - -
- ); -} -export default App; +export default App; \ No newline at end of file diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index ca12f49..0b2945d 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -1,15 +1,12 @@ -import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; -import "./index.css"; import App from "./App.jsx"; import "./assets/root.css"; -import { BrowserRouter } from 'react-router-dom'; +import { BrowserRouter } from "react-router-dom"; +import "./assets/reset.css"; +import { StrictMode } from "react"; createRoot(document.getElementById("root")).render( - /* - - */ - + - + ); diff --git a/frontend/src/test/AssignmentTest.jsx b/frontend/src/test/AssignmentTest.jsx new file mode 100644 index 0000000..b9c7e83 --- /dev/null +++ b/frontend/src/test/AssignmentTest.jsx @@ -0,0 +1,53 @@ +import React from "react"; +import InputBlock from "./components/InputBlock"; +import InfoBlock from "./components/InfoBlock"; +import PageBtn from "./components/PageBtn"; +import Header from "./components/Header"; +import WeeklyListBlock from "./components/WeeklyListBlock"; + +function AssignmnetTest() { + +const weeks = [ + { + label: "2주차 JS개론/웹개론", + details: [ + { + day: "화", + subject: "Git HTML CSS", + tasks: [ + { label: "제로초 인강", status: "done" }, + { label: "깃허브 클론 코딩", status: "progress" }, + ], + }, + { + day: "목", + subject: "Git HTML CSS", + tasks: [ + { label: "제로초 인강", status: "fail" }, + { label: "깃허브 클론 코딩", status: "progress" }, + ], + }, + ], + }, + { + label: "3주차 JS개론/웹개론", + details: [ + { + day: "화", + subject: "Git HTML CSS", + tasks: [], + }, + ], + }, +]; + + + return ( +
+ + + +
+ ); +} +export default AssignmnetTest; From f760f93be7412e975734b511648b4ee516e9ce5e Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Wed, 7 May 2025 14:49:26 +0900 Subject: [PATCH 22/44] [Fix] header component & home page title font --- frontend/src/Assignment.jsx | 45 ++++++++++++++++-- frontend/src/Home.module.css | 9 ++-- .../src/assets/fonts/Akira Expanded Demo.otf | Bin 0 -> 26320 bytes frontend/src/assets/root.css | 15 ++++++ .../componentsCss/DailyOpenBlock.css | 2 +- .../src/components/componentsCss/Header.css | 7 ++- .../componentsCss/WeeklyListBlock.css | 1 + 7 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 frontend/src/assets/fonts/Akira Expanded Demo.otf diff --git a/frontend/src/Assignment.jsx b/frontend/src/Assignment.jsx index 581f00a..24b0150 100644 --- a/frontend/src/Assignment.jsx +++ b/frontend/src/Assignment.jsx @@ -1,9 +1,48 @@ +import React from "react"; +import WeeklyListBlock from "./components/WeeklyListBlock"; +import Header from "./components/Header"; const Assignment = () => { + const weeks = [ + { + label: "2주차 JS개론/웹개론", + details: [ + { + day: "화", + subject: "Git HTML CSS", + tasks: [ + { label: "제로초 인강", status: "done" }, + { label: "깃허브 클론 코딩", status: "progress" }, + ], + }, + { + day: "목", + subject: "Git HTML CSS", + tasks: [ + { label: "제로초 인강", status: "fail" }, + { label: "깃허브 클론 코딩", status: "progress" }, + ], + }, + ], + }, + { + label: "3주차 JS개론/웹개론", + details: [ + { + day: "화", + subject: "Git HTML CSS", + tasks: [], + }, + ], + }, + ]; + return ( -
-

Assignment

-

This is the assignment page.

+ +
+
+
); }; + export default Assignment; diff --git a/frontend/src/Home.module.css b/frontend/src/Home.module.css index 4165919..9cdf1de 100644 --- a/frontend/src/Home.module.css +++ b/frontend/src/Home.module.css @@ -5,11 +5,11 @@ align-items: center; justify-content: flex-start; overflow: hidden; + font-family: 'Akira Expanded'; } .pirocheck { margin-top: 43px; font-size: 1.25rem; - transform: scaleX(1.5); margin-bottom: 103px; } .home_container { @@ -21,11 +21,12 @@ .button { width: 309px; height: 81px; - border-radius: 14px; + border-radius: 8px; background-color: var(--border-gray); color: var(--text-white); + font-family: 'Akira Expanded'; font-weight: 400; - font-size: 20px; + font-size: 16px; border: 1px var(--background-black) solid; padding: 15px; font-weight: bold; @@ -34,8 +35,6 @@ } .button p { text-align: start; - transform: scale(1.3, 0.9); - margin-left: 40px; } .button:hover { background-color: var(--card-toggle-green); diff --git a/frontend/src/assets/fonts/Akira Expanded Demo.otf b/frontend/src/assets/fonts/Akira Expanded Demo.otf new file mode 100644 index 0000000000000000000000000000000000000000..c75fdb37ecc06afa3fe17248e1f742e07c43f36c GIT binary patch literal 26320 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/root.css b/frontend/src/assets/root.css index b98cab1..a01e08f 100644 --- a/frontend/src/assets/root.css +++ b/frontend/src/assets/root.css @@ -30,4 +30,19 @@ .inter{ font-family: "Inter", sans-serif; +} + +@font-face { + font-family: 'Akira Expanded'; + src: url('../assets/fonts/Akira Expanded Demo.otf') format('truetype'); +} + +body{ + height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + overflow: hidden; + background-color: #000000; } \ No newline at end of file diff --git a/frontend/src/components/componentsCss/DailyOpenBlock.css b/frontend/src/components/componentsCss/DailyOpenBlock.css index fe64020..5a44722 100644 --- a/frontend/src/components/componentsCss/DailyOpenBlock.css +++ b/frontend/src/components/componentsCss/DailyOpenBlock.css @@ -41,7 +41,7 @@ .task-icon { - font-size: 20px; + font-size: 15px; } diff --git a/frontend/src/components/componentsCss/Header.css b/frontend/src/components/componentsCss/Header.css index a679d01..b35be0a 100644 --- a/frontend/src/components/componentsCss/Header.css +++ b/frontend/src/components/componentsCss/Header.css @@ -7,12 +7,17 @@ justify-content: space-between; padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + margin: 10px; } .header-title { - font-size: 1.25rem; + font-size: 18px; font-weight: bold; color: var(--main-green); + white-space: pre-line; + align-items: center; + text-align: center; + font-family: 'Akira Expanded'; } .icon-button { diff --git a/frontend/src/components/componentsCss/WeeklyListBlock.css b/frontend/src/components/componentsCss/WeeklyListBlock.css index 64fd605..6d29b37 100644 --- a/frontend/src/components/componentsCss/WeeklyListBlock.css +++ b/frontend/src/components/componentsCss/WeeklyListBlock.css @@ -9,6 +9,7 @@ .weekly-item{ background-color: #045E07; + border-radius: 8px; } .weekly-button { From 6fa40beab861f4c21f27260748b012b0995ed018 Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Wed, 7 May 2025 15:23:17 +0900 Subject: [PATCH 23/44] [Feat] add AssignmentInfoBlock component& create Assignment Check page --- frontend/src/Assignment.jsx | 14 +++++++++ .../src/components/AssignmentInfoBlock.jsx | 16 ++++++++++ .../componentsCss/AssignmentInfoBlock.css | 29 +++++++++++++++++++ .../componentsCss/WeeklyListBlock.css | 3 +- 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 frontend/src/components/AssignmentInfoBlock.jsx create mode 100644 frontend/src/components/componentsCss/AssignmentInfoBlock.css diff --git a/frontend/src/Assignment.jsx b/frontend/src/Assignment.jsx index 24b0150..eca3012 100644 --- a/frontend/src/Assignment.jsx +++ b/frontend/src/Assignment.jsx @@ -1,6 +1,7 @@ import React from "react"; import WeeklyListBlock from "./components/WeeklyListBlock"; import Header from "./components/Header"; +import AssignmentInfoBlock from "./components/AssignmentInfoBlock"; const Assignment = () => { const weeks = [ { @@ -36,10 +37,23 @@ const Assignment = () => { }, ]; +//Assignment-Info-Block(형광 초록색카드 더미데이터) + const cardData = { + weekLabel: "3주차", + day: "화", + tasks: [ + { label: "Django girls 과제" }, + { label: "Django girls 과제" }, + ], + }; + return (
+
+ +
); diff --git a/frontend/src/components/AssignmentInfoBlock.jsx b/frontend/src/components/AssignmentInfoBlock.jsx new file mode 100644 index 0000000..4fe77b1 --- /dev/null +++ b/frontend/src/components/AssignmentInfoBlock.jsx @@ -0,0 +1,16 @@ +import React from "react"; +import "./componentsCss/AssignmentInfoBlock.css" + +const AssignmentInfoBlock = ({ weekLabel, day, tasks }) => { + return ( +
+

{weekLabel} ({day})

+
    + {tasks.map((task, idx) => ( +
  • {task.label}
  • + ))} +
+
+ ); +}; +export default AssignmentInfoBlock; \ No newline at end of file diff --git a/frontend/src/components/componentsCss/AssignmentInfoBlock.css b/frontend/src/components/componentsCss/AssignmentInfoBlock.css new file mode 100644 index 0000000..ead854f --- /dev/null +++ b/frontend/src/components/componentsCss/AssignmentInfoBlock.css @@ -0,0 +1,29 @@ +.assignment-info-block { + background-color: var(--main-green); + padding: 16px; + margin: 12px auto; + border-radius: 10px; + max-width: 350px; + + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3); + color: black; + font-family: "Noto Sans KR", sans-serif; +} + +.week-day { + font-weight: bold; + font-size: 18px; + margin-bottom: 12px; +} + +.task-list { + list-style: none; + font-weight: 500; + padding: 0; + margin: 0; +} + +.task-list li { + margin-bottom: 6px; + font-size: 16px; +} \ No newline at end of file diff --git a/frontend/src/components/componentsCss/WeeklyListBlock.css b/frontend/src/components/componentsCss/WeeklyListBlock.css index 6d29b37..4f7970d 100644 --- a/frontend/src/components/componentsCss/WeeklyListBlock.css +++ b/frontend/src/components/componentsCss/WeeklyListBlock.css @@ -3,8 +3,7 @@ flex-direction: column; gap: 12px; font-family: "Inter", sans-serif; - width: 371px; - + width: 350px; } .weekly-item{ From 2cec2c2c0d4568b1c1a3ef1470f488df3dd5a60d Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Wed, 7 May 2025 15:28:43 +0900 Subject: [PATCH 24/44] [Fix] login page title font --- frontend/src/Login.module.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/Login.module.css b/frontend/src/Login.module.css index 6bb5f64..170420b 100644 --- a/frontend/src/Login.module.css +++ b/frontend/src/Login.module.css @@ -7,13 +7,13 @@ } .pirocheck { font-size: 1.25rem; - transform: scaleX(1.5); + transform: scaleX(1.1); margin-bottom: 65px; } .login_container { background-color: var(--background-black); color: var(--main-green); - font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; + font-family: 'Akira Expanded'; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .button { From 67525c962d53c3cf8a4df8cb3931bef385bb04b9 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Wed, 7 May 2025 18:11:32 +0900 Subject: [PATCH 25/44] [feat]deposit page --- frontend/package.json | 1 + frontend/src/App.jsx | 2 +- frontend/src/Deposit.jsx | 43 ++++- frontend/src/Deposit.module.css | 41 +++++ .../src/components/componentsCss/Header.css | 7 +- frontend/yarn.lock | 160 ++++++++++++++++++ 6 files changed, 247 insertions(+), 7 deletions(-) create mode 100644 frontend/src/Deposit.module.css diff --git a/frontend/package.json b/frontend/package.json index 261de3d..aac2c62 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "axios": "^1.9.0", "lucide-react": "^0.507.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index b5d2fc4..db217ff 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -24,4 +24,4 @@ function App() { ); } -export default App; \ No newline at end of file +export default App; diff --git a/frontend/src/Deposit.jsx b/frontend/src/Deposit.jsx index 295c538..ce2198c 100644 --- a/frontend/src/Deposit.jsx +++ b/frontend/src/Deposit.jsx @@ -1,8 +1,45 @@ +import Header from "./components/Header"; +import styles from "./Deposit.module.css"; +import axios from "axios"; +import { useEffect, useState } from "react"; + const Deposit = () => { + const [deposit, setDeposit] = useState(null); + useEffect(() => { + const user = JSON.parse(localStorage.getItem("user")); + const userId = user?.id; + + if (!userId) return; + + axios + .get(`/api/deposit/${userId}`) + .then((res) => setDeposit(res.data)) + .catch((err) => { + alert("보증금 정보를 불러오지 못했습니다."); + }); + }, []); + + if (!deposit) return
loagin...
; + return ( -
-

Deposit Page

-

This is the deposit page.

+
+
+
+ 잔여 보증금 + {deposit.amount}원 +
+
+ 과제 차감 + {deposit.descentAssignment}원 +
+
+ 출석 차감 + {deposit.descentAttendance}원 +
+
+ 보증금 방어권 + {deposit.ascentDefence}원 +
); }; diff --git a/frontend/src/Deposit.module.css b/frontend/src/Deposit.module.css new file mode 100644 index 0000000..3f83c5d --- /dev/null +++ b/frontend/src/Deposit.module.css @@ -0,0 +1,41 @@ +.deposit_container { + width: 390px; + display: flex; + flex-direction: column; + align-items: center; +} +.deposit { + background-color: var(--main-green); + width: 309px; + padding-top: 26px; + padding-bottom: 30px; + display: flex; + flex-direction: column; + align-items: center; + gap: 17px; + border-radius: 9px; + margin-top: 80px; + margin-bottom: 87px; +} +.deposit > span:nth-child(1) { + font-weight: bold; + font-size: 16px; +} +.deposit > span:nth-child(2) { + font-weight: bold; + font-size: 20px; +} +.deposit_detail { + background-color: #575757; + color: white; + border: 1px solid rgba(217, 217, 217, 0.4); + border-radius: 8px; + padding: 12px 20px; + font-size: 15px; + display: flex; + justify-content: space-between; + align-items: center; + width: 309px; + height: 47px; + margin-bottom: 15px; +} diff --git a/frontend/src/components/componentsCss/Header.css b/frontend/src/components/componentsCss/Header.css index b35be0a..1c8b660 100644 --- a/frontend/src/components/componentsCss/Header.css +++ b/frontend/src/components/componentsCss/Header.css @@ -4,6 +4,7 @@ font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; display: flex; align-items: center; + width: 390px; justify-content: space-between; padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); @@ -15,9 +16,9 @@ font-weight: bold; color: var(--main-green); white-space: pre-line; - align-items: center; - text-align: center; - font-family: 'Akira Expanded'; + align-items: center; + text-align: center; + font-family: "Akira Expanded"; } .icon-button { diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 9b621ab..16365bc 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -612,6 +612,20 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.9.0.tgz#25534e3b72b54540077d33046f77e3b8d7081901" + integrity sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -635,6 +649,14 @@ browserslist@^4.24.0: node-releases "^2.0.19" update-browserslist-db "^1.1.1" +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" @@ -665,6 +687,13 @@ color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" @@ -706,11 +735,52 @@ deep-is@^0.1.3: resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + electron-to-chromium@^1.5.73: version "1.5.148" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.148.tgz" integrity sha512-8uc1QXwwqayD4mblcsQYZqoi+cOc97A2XmKSBOIRbEAvbp6vrqmSYs4dHD2qVygUgn7Mi0qdKgPaJ9WC8cv63A== +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + esbuild@^0.25.0: version "0.25.3" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz" @@ -902,16 +972,60 @@ flatted@^3.2.9: resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +form-data@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" + integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + mime-types "^2.1.12" + fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-intrinsic@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" @@ -934,11 +1048,35 @@ globals@^16.0.0: resolved "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz" integrity sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A== +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + ignore@^5.2.0: version "5.3.2" resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" @@ -1050,6 +1188,23 @@ lucide-react@^0.507.0: resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.507.0.tgz" integrity sha512-XfgE6gvAHwAtnbUvWiTTHx4S3VGR+cUJHEc0vrh9Ogu672I1Tue2+Cp/8JJqpytgcBHAB1FVI297W4XGNwc2dQ== +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -1144,6 +1299,11 @@ prelude-ls@^1.2.1: resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + punycode@^2.1.0: version "2.3.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" From f51993d75c305133098e73ab0abd91f8cb11fd11 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Wed, 7 May 2025 18:30:18 +0900 Subject: [PATCH 26/44] [fix]Assignment page --- frontend/src/Assignment.jsx | 19 +++++++-------- frontend/src/Assignment.module.css | 13 ++++++++++ .../componentsCss/AssignmentInfoBlock.css | 4 ++-- .../componentsCss/WeeklyListBlock.css | 24 +++++++++---------- 4 files changed, 35 insertions(+), 25 deletions(-) create mode 100644 frontend/src/Assignment.module.css diff --git a/frontend/src/Assignment.jsx b/frontend/src/Assignment.jsx index eca3012..bad9e46 100644 --- a/frontend/src/Assignment.jsx +++ b/frontend/src/Assignment.jsx @@ -2,6 +2,8 @@ import React from "react"; import WeeklyListBlock from "./components/WeeklyListBlock"; import Header from "./components/Header"; import AssignmentInfoBlock from "./components/AssignmentInfoBlock"; +import styles from "./Assignment.module.css"; + const Assignment = () => { const weeks = [ { @@ -37,22 +39,19 @@ const Assignment = () => { }, ]; -//Assignment-Info-Block(형광 초록색카드 더미데이터) + //Assignment-Info-Block(형광 초록색카드 더미데이터) const cardData = { weekLabel: "3주차", day: "화", - tasks: [ - { label: "Django girls 과제" }, - { label: "Django girls 과제" }, - ], + tasks: [{ label: "Django girls 과제" }, { label: "Django girls 과제" }], }; return ( - -
- -
- +
+
+
+ +
diff --git a/frontend/src/Assignment.module.css b/frontend/src/Assignment.module.css new file mode 100644 index 0000000..ef95f36 --- /dev/null +++ b/frontend/src/Assignment.module.css @@ -0,0 +1,13 @@ +.info { + margin-top: 28px; + margin-bottom: 54px; +} + +.assignment_page { + background-color: "black"; + min-height: "100vh"; + color: "white"; + display: flex; + flex-direction: column; + align-items: center; +} diff --git a/frontend/src/components/componentsCss/AssignmentInfoBlock.css b/frontend/src/components/componentsCss/AssignmentInfoBlock.css index ead854f..404c79d 100644 --- a/frontend/src/components/componentsCss/AssignmentInfoBlock.css +++ b/frontend/src/components/componentsCss/AssignmentInfoBlock.css @@ -3,7 +3,7 @@ padding: 16px; margin: 12px auto; border-radius: 10px; - max-width: 350px; + width: 309px; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3); color: black; @@ -26,4 +26,4 @@ .task-list li { margin-bottom: 6px; font-size: 16px; -} \ No newline at end of file +} diff --git a/frontend/src/components/componentsCss/WeeklyListBlock.css b/frontend/src/components/componentsCss/WeeklyListBlock.css index 4f7970d..b7b1bca 100644 --- a/frontend/src/components/componentsCss/WeeklyListBlock.css +++ b/frontend/src/components/componentsCss/WeeklyListBlock.css @@ -3,18 +3,18 @@ flex-direction: column; gap: 12px; font-family: "Inter", sans-serif; - width: 350px; + width: 309px; } -.weekly-item{ - background-color: #045E07; +.weekly-item { + background-color: #045e07; border-radius: 8px; } .weekly-button { background-color: #575757; color: white; - border: 1px solid rgba(217, 217, 217, 0.4); + border: 1px solid rgba(217, 217, 217, 0.4); border-radius: 8px; padding: 12px 20px; font-size: 15px; @@ -26,12 +26,12 @@ cursor: pointer; } -.weekly-button:hover{ - border: 1px solid var(--card-toggle-green) +.weekly-button:hover { + border: 1px solid var(--card-toggle-green); } -.weekly-button.active{ - background-color: #045E07; +.weekly-button.active { + background-color: #045e07; border: none; } @@ -51,14 +51,12 @@ border-radius: 0 0 12px 12px; color: white; font-size: 16px; - } - .detail-item { margin-top: 6px; } -.daily-open-block-wrapper{ - background-color:#045E07; -} \ No newline at end of file +.daily-open-block-wrapper { + background-color: #045e07; +} From f1f7c7a8a63b68fa0f3fd486cf909a397441ea6f Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Wed, 7 May 2025 20:36:45 +0900 Subject: [PATCH 27/44] Merge frontend into frontend_km and resolve conflict --- frontend/src/components/InputBlock.jsx | 2 +- .../components/componentsCss/{InfoBlock.css => InputBlock.css} | 0 frontend/yarn.lock | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename frontend/src/components/componentsCss/{InfoBlock.css => InputBlock.css} (100%) diff --git a/frontend/src/components/InputBlock.jsx b/frontend/src/components/InputBlock.jsx index 18acb60..63a1607 100644 --- a/frontend/src/components/InputBlock.jsx +++ b/frontend/src/components/InputBlock.jsx @@ -1,5 +1,5 @@ import React from "react"; -import "./componentsCss/InfoBlock.css"; +import "./componentsCss/InputBlock.css"; const InputBlock = ({ inputs }) => { return ( diff --git a/frontend/src/components/componentsCss/InfoBlock.css b/frontend/src/components/componentsCss/InputBlock.css similarity index 100% rename from frontend/src/components/componentsCss/InfoBlock.css rename to frontend/src/components/componentsCss/InputBlock.css diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 736512a..57037e2 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1047,7 +1047,7 @@ lru-cache@^5.1.1: lucide-react@^0.507.0: version "0.507.0" - resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.507.0.tgz" + resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.507.0.tgz#d93a75ed130bd530a368fe1dd4ea009ea90a772b" integrity sha512-XfgE6gvAHwAtnbUvWiTTHx4S3VGR+cUJHEc0vrh9Ogu672I1Tue2+Cp/8JJqpytgcBHAB1FVI297W4XGNwc2dQ== minimatch@^3.1.2: From e5e75a1801caf4d7c8e2e5862d2331559ae805bb Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Wed, 7 May 2025 22:27:45 +0900 Subject: [PATCH 28/44] =?UTF-8?q?[add]:=20Attendacne=20page,=20InputBlock?= =?UTF-8?q?=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Attendance.jsx | 40 ++++++++++++++++++++++++-- frontend/src/Attendance.module.css | 17 +++++++++++ frontend/src/components/Header.jsx | 37 +++++++++++++++--------- frontend/src/components/InputBlock.jsx | 3 +- 4 files changed, 79 insertions(+), 18 deletions(-) create mode 100644 frontend/src/Attendance.module.css diff --git a/frontend/src/Attendance.jsx b/frontend/src/Attendance.jsx index 13dedd9..b45887c 100644 --- a/frontend/src/Attendance.jsx +++ b/frontend/src/Attendance.jsx @@ -1,9 +1,43 @@ +import { useState } from "react"; +import Header from "./components/Header"; +import InputBlock from "./components/InputBlock"; +import styles from "./Attendance.module.css"; + const Attendance = () => { + const [attendanceCode, setAttendanceCode] = useState([""]); + const handleChange = (index, value) => { + // 숫자만 입력 허용 + if (/^\d*$/.test(value)) { + const userCodes = [...attendanceCode]; + userCodes[index] = value; + setAttendanceCode(userCodes); + } + }; + const handleSubmit = () => { + console.log("제출된 출석 코드: ", attendanceCode[0]); + // 서버 요청 등 추가 작업 + }; + return ( -
-

Attendance

-

Attendance page content goes here.

+
+
+ + {attendanceCode[0].length === 4 && ( + + )}
); }; + export default Attendance; diff --git a/frontend/src/Attendance.module.css b/frontend/src/Attendance.module.css new file mode 100644 index 0000000..cebb0b5 --- /dev/null +++ b/frontend/src/Attendance.module.css @@ -0,0 +1,17 @@ +.attendance_page { + background-color: "black"; + height: "100vh"; + display: flex; + flex-direction: column; + align-items: center; + position: relative; +} +.submitBtn { + background-color: #ffffff; + opacity: 42%; + border-radius: 10px; + position: absolute; + top: 109px; + right: 63px; + padding: 7px; +} diff --git a/frontend/src/components/Header.jsx b/frontend/src/components/Header.jsx index 3b9d2a0..c9ec60e 100644 --- a/frontend/src/components/Header.jsx +++ b/frontend/src/components/Header.jsx @@ -1,35 +1,44 @@ -import React from 'react'; -import { useNavigate, useLocation } from 'react-router-dom'; -import { ArrowLeft, Wallet } from 'lucide-react'; -import './componentsCss/Header.css'; -import arrowIcon from '../assets/img/arrowicon.svg'; -import moneyIcon from '../assets/img/moneyicon.svg'; +import React from "react"; +import { useNavigate, useLocation } from "react-router-dom"; +import { ArrowLeft, Wallet } from "lucide-react"; +import "./componentsCss/Header.css"; +import arrowIcon from "../assets/img/arrowicon.svg"; +import moneyIcon from "../assets/img/moneyicon.svg"; const Header = () => { const navigate = useNavigate(); const location = useLocation(); const path = location.pathname; let title = "ATTENDANCE\nCHECK"; - if (path.includes('assignment')) title = "ASSIGNMENT\nCHECK"; - else if (path.includes('deposit')) title = "DEPOSIT"; + if (path.includes("assignment")) title = "ASSIGNMENT\nCHECK"; + else if (path.includes("deposit")) title = "DEPOSIT"; + else if (path.includes("attendance")) title = "ATTENDANCE\nCHECK"; - const showRightButton = !path.includes('deposit'); + const showRightButton = !path.includes("deposit"); return (
-

{title}

{showRightButton ? ( - ) : ( -
// 오른쪽 공백 유지 +
// 오른쪽 공백 유지 )}
); }; -export default Header; \ No newline at end of file +export default Header; diff --git a/frontend/src/components/InputBlock.jsx b/frontend/src/components/InputBlock.jsx index e4d515e..5caf6cc 100644 --- a/frontend/src/components/InputBlock.jsx +++ b/frontend/src/components/InputBlock.jsx @@ -1,7 +1,7 @@ import React from "react"; import "./componentsCss/InputBlock.css"; -const InputBlock = ({ inputs, onChange }) => { +const InputBlock = ({ inputs, onChange, values }) => { return (
{inputs.map((input, index) => ( @@ -10,6 +10,7 @@ const InputBlock = ({ inputs, onChange }) => { className="inputTag" type={input.type} placeholder={input.placeholder} + value={values[index] || ""} onChange={(e) => onChange && onChange(index, e.target.value)} /> ))} From af238d082f71f485cde3af949eade282db4e26f1 Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Wed, 7 May 2025 22:35:22 +0900 Subject: [PATCH 29/44] =?UTF-8?q?[fix]:=20InputBlock=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20values=20=EC=97=86=EB=8A=94=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/InputBlock.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/InputBlock.jsx b/frontend/src/components/InputBlock.jsx index 5caf6cc..65ae0ab 100644 --- a/frontend/src/components/InputBlock.jsx +++ b/frontend/src/components/InputBlock.jsx @@ -10,7 +10,7 @@ const InputBlock = ({ inputs, onChange, values }) => { className="inputTag" type={input.type} placeholder={input.placeholder} - value={values[index] || ""} + value={values?.[index] || ""} onChange={(e) => onChange && onChange(index, e.target.value)} /> ))} From dffff68d61755514722a217ac1896b9fe89a3c4e Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Wed, 7 May 2025 22:55:42 +0900 Subject: [PATCH 30/44] [add]: boom img --- frontend/src/Attendance.jsx | 6 ++++++ frontend/src/assets/img/tabler--boom.svg | 1 + 2 files changed, 7 insertions(+) create mode 100644 frontend/src/assets/img/tabler--boom.svg diff --git a/frontend/src/Attendance.jsx b/frontend/src/Attendance.jsx index b45887c..b9ad764 100644 --- a/frontend/src/Attendance.jsx +++ b/frontend/src/Attendance.jsx @@ -36,6 +36,12 @@ const Attendance = () => { Submit )} +
+ + + + +
); }; diff --git a/frontend/src/assets/img/tabler--boom.svg b/frontend/src/assets/img/tabler--boom.svg new file mode 100644 index 0000000..8c6b2eb --- /dev/null +++ b/frontend/src/assets/img/tabler--boom.svg @@ -0,0 +1 @@ + \ No newline at end of file From 29f6ccde471a92409ae9d8061be548a34ebcb5fc Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Wed, 7 May 2025 22:58:42 +0900 Subject: [PATCH 31/44] [add]: boom img --- frontend/src/Attendance.jsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/frontend/src/Attendance.jsx b/frontend/src/Attendance.jsx index b9ad764..5581dfd 100644 --- a/frontend/src/Attendance.jsx +++ b/frontend/src/Attendance.jsx @@ -36,12 +36,7 @@ const Attendance = () => { Submit )} -
- - - - -
+
); }; From 6bfd0c28c3b8d7cf8872cccce3ddc9fcf837b65d Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Wed, 7 May 2025 23:23:09 +0900 Subject: [PATCH 32/44] =?UTF-8?q?[add]:=20boom.png=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/public/img/tabler--boom.png | Bin 0 -> 20512 bytes .../{src/assets => public}/img/tabler--boom.svg | 0 frontend/src/Attendance.jsx | 12 +++++++++++- frontend/src/Attendance.module.css | 15 +++++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 frontend/public/img/tabler--boom.png rename frontend/{src/assets => public}/img/tabler--boom.svg (100%) diff --git a/frontend/public/img/tabler--boom.png b/frontend/public/img/tabler--boom.png new file mode 100644 index 0000000000000000000000000000000000000000..23126cfb9a890d5f14be5a83f5c636d747e97190 GIT binary patch literal 20512 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 Kb6Mw<&;$S~3^A<$ literal 0 HcmV?d00001 diff --git a/frontend/src/assets/img/tabler--boom.svg b/frontend/public/img/tabler--boom.svg similarity index 100% rename from frontend/src/assets/img/tabler--boom.svg rename to frontend/public/img/tabler--boom.svg diff --git a/frontend/src/Attendance.jsx b/frontend/src/Attendance.jsx index 5581dfd..5d256c5 100644 --- a/frontend/src/Attendance.jsx +++ b/frontend/src/Attendance.jsx @@ -36,7 +36,17 @@ const Attendance = () => { Submit )} -
+
+
+ +
+
+ +
+
+ +
+
); }; diff --git a/frontend/src/Attendance.module.css b/frontend/src/Attendance.module.css index cebb0b5..ea7f9d4 100644 --- a/frontend/src/Attendance.module.css +++ b/frontend/src/Attendance.module.css @@ -15,3 +15,18 @@ right: 63px; padding: 7px; } +.attend_img_container { + display: flex; + gap: 22px; + width: 100%; + padding-block: 40px; + justify-content: center; +} +.boom_icon { + width: 70px; + height: 65px; +} +.boom_icon > img { + width: 100%; + height: 100%; +} From 7344416c1a12b18aa815515ab12bc3fdc8e39dce Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Wed, 7 May 2025 23:26:01 +0900 Subject: [PATCH 33/44] =?UTF-8?q?[add]:=20boom=5Ffilled=5Fcolor=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/public/img/boom-filled-green.png | Bin 0 -> 16289 bytes frontend/public/img/boom-filled-red.png | Bin 0 -> 16879 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 frontend/public/img/boom-filled-green.png create mode 100644 frontend/public/img/boom-filled-red.png diff --git a/frontend/public/img/boom-filled-green.png b/frontend/public/img/boom-filled-green.png new file mode 100644 index 0000000000000000000000000000000000000000..6416093059824996f574981553f5705819c56466 GIT binary patch literal 16289 zcmeIZ`9IXr`!_zjZIH4PHHu`-t|XNuStGj`WnU*t5iwIr$SzCPN|uDlPL>xcB1>g0 z%ZQXECM|YzpPAnG`~Lh1-|yq`@e2>}zv1X&@reD}br%a4=U1_7{Q(Qrx#2%2n_IWOH}MDva8aKU5v)h@iHI?l z$R!08Cp5RI797nDVIU*$PcWi&7oh?Z;GIb2VGNMr1Wx+rtVa?b5!tow>ZrQ>o8k={ zM=};-bv}YeCOW-0vH|OWIYO|t|7;<^Itp{P4m7ux=y{cAua3~U%kdyB)dJ3WB$iPc4*JBoM$&kGPt!%sD4Z? zTEkOBDx62H1{>xs(s|<^P?iBfxDatTwQ?fbn``Xyu_l~x>&Dbg<}n9YSeGuIIobFT z5up#%stFlUp-=vdEVgW6}0g3Z>koTI)Cu>+v>(rXT@X?L#DdMJ}8RKu zBF@RoGq3FDY?7|2kF%ol;u5f;JEmDsWf#XjYR)Hw^=P|^46;bZn>B%MWf$nz-LJXz zAhs)3Ja2Q2#C;IAO*k98geD1@-=E5e5+f^BZs0~``?gW*GSr9^N1>fomUWxR9tle4 zDb{U&HL2sVhz_s{f9_Mo-V6EngimcGxO5kNNRUQWtwJkI>V3ypFG>QTcv>D%VV=KF{RGq}sfZqZ%BObXtML7s@+6!; z%y0+$yRbFhrUIcUJbinH7^$DCg=PQkONn4tC`>)^8z$d5WF-N`Y|G z{EAZf9hN{`KL>T;VAId3V~HiY`PilqC$1aSh+lxFX;fGH8N(tbwdZ_Cq#QcudFpeB>_nl*yd>Nzhx^dCZ*r1nAMz;; zSHkyNR|~0^M9dU%-ML{wJbQzbqF0^Ua|C>yl@Gr5H>TY^UL)<$`*#6J`}RlX^ri_j zu1PhK!oI`}vwSlkc;`cM!i<0cT88(zm&A`C58036{0|YVCnU9lKLt|;8)pbR*Xa8C zvL)_axlo85tu9*^qne%HB!X9q7t3++aQ=2o@YjRBuLhK>lXCb1y8|y@d&4TFLUvfL zi#aAx*EhvVq!ATN#rJC)qhr;AyuLL*vvcxQWC}KsBMgkk`&T1wgY~h#U%L)6d+%%b zoR@h6LD4;%QU1a__@veqgQ_=BOjkhu)r621<@VYc5|4+6pwCgdQeAv@`06#B2|M*` zT7jaSpaZ9TmML;K{AJe-)wVTal*)nZ6L+cQ3e<;~H!kO7_K@N3r@73}KN3aS}qnOEsJB31gdHE(Fb~(`YhxedJi|)%#~o8j@;&p{!TeJ!+~gi>MWtfBZ*w z?howGW<|gsm!wb=L)za~{o5VY(cXlsW*ohk178;o^M-O2O|EaTYgtz8KDo`;CL)Ds z?K}DtmHb0@Qe>Llh(j5A+YGfB#lIi@z)gmqtMb*?orrEa3LVqOv_kpFuoAxDH;AI2 z)Ptq&Rh+XluE=0HR8QvvF`5!x3rtjvN{`lA>L=JC^Jmq_-lfHeDxSr+E|k(L_SKcrecyGB+VAS0{$FD>5tUcaz*`ph8&NNOuPQM{5$(v#q?JE&?6 zj9}Yq4+Hm!uKARyJ5x_&Hn55bu&6%>J@x?OZ?;uXT2iYWdg|Oy-HSV+`uCYce0_NM z3xWE}E9Wfwp&FCQ#KLcSq?Nre7x>VCJ2~XzpdF8N$aUXNPa~D>jhi3~0k<+R&|ZD` zIc}AgV&wC-=$S@0<)r$v${+oo<1`f8B`wM?{2WhzKzhnkG5tG}1q7m&)C)y++Op`h zxEm9wk(V{t=jr(IIL?sLt~YhYd7CRLnxi#L>s1P5kM^HJH;{DCYn@sfskA}KD>4k9 zyy0oLDsWmvHI;NC0iW|c?Fep#$ss%VL+erGnvn)mhhGM`f)3UXg@oftDTt+!!ff5d zo*Ea5h?uoR?BT|wn_^*w=(mk>wx+KNp91QuW2z73K24HA+H>PC7?=sV2wFWLZN>Sw zsg&1*%!bEKds7a|bggW@wL3TU6djUr<~H!ff*0?r-1!hKyq}V<@>QwZ91IqW1y{qny}n#xraMgjwkIP zvIh$XY0N?n0`(X`=3K$ZV&*7*muZmJGe-sqvI`^(08YhoOcDw#8n;zUH8dVWGN zx=bDfeZbB`7UgqHFO~cgGN*P$2e#c)qN!UhlnZaQ?XKjnC3us$vN@J)ukb&R-aqXz z)8;pH@mAJ+feI{>x8+%NY*#6XR_wWZ|J#nMz^MAnHq-g$d**8!D^n}2aTQi34$SMz zD&nrjf0#jBFf-Y00nAmB8LcYfR9$&tdwM!K6?*1bXc9VXJX;3mFgXz$q`M+Uva=sQ zZdL^^KHL1%i#Lf6F6!=a!$^N|_?UGgj+#=48jMtHOp1u3J`#UrW`TwGEunKwhqn8& z^1!`?D_0zvk-=TJL47+M{&MKN_p=NosJvM|DD?A^<3v{qE=(DDFE5S63yPq5m*1D$QXOVBRI1pkn+hUEtr!b0 z>vwj#Y2~+85D_Ef0b5by$hx>Fjl9}=8|Np7sZqmxAvGuoKd+{ZU`nU@SMTy6z~zf> zS-tOcvNy+DX&bE-f+$4Ts-+sW5(-k5cI-*c(pzre4>#}mqAYtH6I#xkec=kT>;w+n zJ1s%3AUh6V?UJfRbWm=uwWbSY1%`6JESkAB1EiS7`o?vB54BY5IuhH zGM4w%#ue%t9#RFTN|V5oG~H|bx6exW$?c@NY7gE&;#&SII8^cRv6xh#@Mh%>>@WQG z+C+5Bo6{1WJB6g%XFztiY&DVk%T6CJhW=Jbdbty_8Aq#utZPaSt8el3K#D2%$Mb~_ z1C1{BS2~sPmT9+XU+|@0V#@6`%=T>A{L?c=VYS=u?mXR5rMXxV$`I-4q^R#tpfg}U z-lG}sf97=g?l2`gr}}4^H@g&aeb3`scbJF$paQAE_u$qX&{^?q z;#?{}XsA){QKRuktlN45g)K7E2BZ+60q2#dy%8@p6jXZDS+^Ue_P|>6 zHmYa>;k3B$C+dAO)D4#3-ITh+b9&z{+@wPgZ6L~43lg%a=)RV4WWbcf68xq6l`nPB zv|GBP65dt0R3-6aZO2X3KN1ndhEl8L3$~cJS|9$9E~3L_ABs;T@nO~pPh-^@5Ukj< zly3(3#jj2aSNI)S-{}MOH@5#FIv%Z|X&ABG>abO%d=~wIkC|HOKxv+LyNr3l3lyp* z`1Xh$@4O*o1Kku7E(9qEsKW!!7ItmR7@EWktc`T>dJ@gfiIYQJoMqkMAus`+D~_n z5F@F5;Ebc)5IVEK>)}}tWbq>|cbf;|Bv5MdAo9KhM;D^vWsyT$lK>@2-%$L z9!?jGB;81ka(AOH?X6dELj{Q1gMA65mT^nklR}iIW#_w{xx4HSv>%%x-Bxsy-+==W z#6)_2B;!^?C^kObZ|y;1V~a;zvldV@;Y7RALvf>Gmx!t8?EUy}X-{2_vmT*Zk<7a( ziW=j4sz8YO&Uf%3myR=fz{lu}_+ui%Yv1TgY&I?dvACBE?{ba^#Eqcpt;FXa79twh zvaK-Jy7sqij{u7^u)4pJ?iznSqok#e{pMa5BEgu}5S{0qK%W3ZY@1Y%Clwh@ep)k- zF@8S?$ohe>D!M`T+~Mo3uoJWgx8PhF0(9wEz`tb{U9~bOk`tcbu7AD|B>5ft)S9tN%1!gxCG7O^;xDsS+YW*hA85iZ zFEhQp)_o&rjHEIPO@$39cm;0~&FrF<@Z2cpbHS>tW3M7%1eALHUYe*Fsi}x)V zoSpQov!tDU%p-evOb@Wb{r0Bn<{XXvfXP?*G;KH@Ei6b;hE7H)KB=Okgb`f91_HrV zA|b#EC{-^{bU9qztlQl$B>30~WZ-NloW@NJ>Q~-^%d7z)?9LFg9_lzb;aEfdC6y2D zMtY`Co5Zed3(zs{vp_nB`CkNkHOOwF`LwE_*FEaZU=w*mk{7X~Sr(sB(3{zV$$xAcC}t8v zHlayC7#^9KYC2N!6~Sd}i;AjX-hRCL+8*x=s5x6Od9?Cp*~ixTwTLEC{~n*5^8mg9 zxKq1OCo-?}8q^ZH^!-O{Dvl1{07trT=TO|j|6D&+T2xZp*vEC5_y zz8BQvPTJ+!u5143r`hkJVF<8;a~CKQT=62DO>(a(aUr%q%Q;Rwx)*2_`Y~cqm?Nl| z4k#TbF@L+?cB~n)vQ4+gu#Capna$!V*~wC5A!-5kZ=@t0t_k2-zZiMt4U(_#k5=c1 z1RhDoZ23B;uaBsPt$eVW+6@E<@i{$;D3Y`EwKyfj?Pxd&SIw@Y+gHKknL)nDhP&xA&I#lnN1D zl1_?KVEF#IM4@PK#>5IOqM`)l-EN)>KBQ&uAGgVF48SP@SO31$8|wE$f$Je67Wb_0 z`mnbJQ|zDWN)0^2;60pEU=o-bAtVR0y)~?UtdkEB(Bb z2w(Z_8(70PXq5A&*0VM%mo<-cf$x_ay zNQ=OhzZBS2gO6Mi`99Tje!QoIUyr$q{3)2?T!=Uw-q^~0tB7sok? zv2T#A57%Br3ukyEO|^5;VVYcS9T({|pF4M;UE&R;z=0yfa_3}`sktvKoY`Bo$a_B> z@B;*oql^;>lP@$T-JbB- z4EBprOE{-XdB(E-?ExtuIXZYhNqhtrJnbk{o1;!=`8=y3H1lZyRWJ(sZPMzUxjcM~ ze)C$SL0}ge`PPlQLku8buuS;L-Vn-08wm+S$njeUN7-?qAr^Ob)y zE3}@8q7Qw9Nymd;`+fQG)}iE0=KQ?NTpN0n*17a@ zy?24Gs^}knn^|eWC+P2Nou!(;lyLj1}h;UB9p?+lzd!+CqJ1%?s>$@QDlX_B*iih z{#{}uPUBd6M3F7`e^j6es_TJ_;}ZP$!)uqZkWT||(plp5r}n~E{@JENErD~pJBk~q z;Tq+bu4w4j!-kvpfzJWfR)-|ybUP2dn|gVvjK)lQgk*qQ#TwwFR(DMmof=LC~S_{W@MxVybC@f6wAeN{4r< z4ooF7zSz6R8f_rQW}l{2jEu_ALCSwbh3)y!Xz~lP2+U_3@BxBT2FYj9ptV21?IX;a ztD)!d{35)z0{Kaqq5sL;qb1m|6K}iRSdM35@N?2oIb`D_U7*g8G_2KucD7EW=>FyB zy_qtl7|sPy0g0vk0|!SJM!N~~2ayH;zX z&TJ5LqN=!BpK<-q4JZ#>DD~O*Dt%$D4~Z+tgszhBa|~-iI6;z2CAocdO}>d7h}KYr zB>bhCHW;%ES+ejt|7F;mxPD{F}|}` zxmy0m2Rl7bbmrHvmw`So%b6oMQDko3ue9dg_{D&q5W*hpr>4P@BA)~15ysbj{ z2r!!e8Zm-QkVNv;sCAM6fK!i589`vH{e%kuhYOBUHx&rZ&)PT@eT9f8++|}mZX#OL z44uExy&|`JBvjW8T@mEcN8TdCtL7H`W-8c+1Ri0-5f5dy3g1!Nj^4?=UHQ#CRx5nZN?*(jvv6U47R=uf6U$q}(>xfVYBY9%RM>UVGO)1%fM;>HvIV-4lQ0%iuo5mI>=`Muk0*tVN7iMr)=JSRX|C zBFP-XxK$r~=lR*3i*yykb0d0spxP(aduwh!hrvWm=)C|(YLo$;6R;+ZU^h=4Wd{Zk zt;|i0*e1J#R**4Tca~f8j(H+vugx&T=a3}f2R}E!wv81wV{X^NGtl+-ve8SnSNCT- zFm_o-*qmCvu3{`iw25p?x{VV)DO3=_P~ZVI(zjHSiK^_gyC`R*yuraVT@}&WJ%VO( zjJh2+zaixljB_4czTZ1I{0T_;ibJ?;;DJp13ws!3xiSZDMx-4F1q1Sh*sgDon;xgu zSNc%CBqDdW4sN~fu%ye8Kpno*Kl@Mc#P-z7LgKl*j&;>;FwAIl4=&UYnnz-T==IWk ztsR70I_c5^=aVrmu&8OC@vJ7iTo7M;mSHOv_|_8?2<|&hN+%FPMEIh)b~wxUb!eJ{ z;irmC@OcW^N#HUvLXj=KGG@z~LeVoRLcDMi1 zb^|qOikY!6jpJba>=ANZc`_B094?(2M`dS}%gj;kZa}M6Z)lcnF~TJTMJ% z?FN|tE8Gv!h_C{_^^u1i?%S(?veaTmA@jfUcMyDOq#ys0)purjy|^`7#E8<%`??IT zKyK6`M*T*lmsVZ_sk+TIJ&Dy1u$7>Fj0-z-m>Q!%2s7hKP_qVuP;8eKNg}RZR`%ai zc~V6hNkYy$=9;Jvk{rL;m%ZD{YCXQ}gTF@Ck}cFWKYl{F25uc?!c`=)`!Rw!@!wVa zrjP7bu7X=L8B45Y!nO+QzQtM7#T!Pw0uv%O(4y!q0Mlpi-phKSjA%{kEUH!p*(0>q z;7L0b3k=)^dYNUi*i+y>U3Q^t6t2llgD{ZI(d|qICX%&T$2nH#W9yDz##>E!Bf5N) zAzG2OlE_njUblYr0*AuxuQNME8hOVzG{cauhhlpuM$ORYhx;xl;$Fb(&+b2-6v0e@ z6B1lgyN)nE;XOi4u^|6&AuaN%nUr$W!Ph@yC;->@vv^>nOQ)am)rEo**aamY@+aR> zh1Gluf(ZFVmNr9mEf9Qg;5K0#=(v6pb*$kGEQRN(Db2-8WS={hy?vfA@ z=PyrP=8koH$B@}y`|c4w1XDtOooL*z=Q05c#3is0#K{HwzbdgY6zVh@*F?~m-RfHN z79#!-6WSK(VR#OIKlqm_ zaRhy1O%Uu%bfx1oWQuTErHrFJM--(UtXRAITo86@E$`1M7!%zGjj{d%Pi0|aN-&+- zJ(Nog+`}4-=xpvVbwOeFs$T}k)p5oXGp!L75sr+FSl@}0O$64ry>FY*wuV(<24bHR z+615pbGfvij1d36Hsuq`=oJ@AQ_^$GkGL{lSelNAJiG{LH!{0e$ymdK)n0>M^w`Gr zQr!|7hX8EguNyhx=0^BWCQ=6g*}P^*#3#tZ2RRUz&F$1$%iGt)xY%cW_o!n(p;H#E zAHG|;yMO>Hdk+PAAJF)iVYJ!Mnhu!UsoEyn5s*S%M^t#(J$gs)?=a1`BypyZ_(lZV z68ZcrkfyInRCmLX6o4gybxBTa!j2e+V@vvr4=Vr?pz4p0+_!Km@DgKC8pR=r)T=xA z(NYPP(-jUk_B?y~-D$?6V+eTe7+ctju?u}7msZ(9Rb?IKn0L}bkKyHy$P1HT6At;p zecpfGB?ltO^lqJ^sqMP5sD29ur~P@(HM5*+goCIH{kK2pS7sgK7-fiNSZL7=@dINR z&;o%~YZ?CVvYs)rjBq@H>_5+S@GU(@KL*O5Q}Q~2|H*(8w1~(XB+jC=3&{XVP)7&5 zdXBzfqMjt+!ntRoZm94MzUSt7zLsR%h~Od619Rb6Ojj?I98-ARmM#HsG%xrs`9MnzC>>;rQk-~Z`*?qbh91N8lkA=sW>!k+ynldT|yspnG@=SeOQgyF8B?U}uESjqok z)Il<{NSFtusKhzT5-ET41jP#0S%~od5AT_?9WZ~-OMc`Ak+mQU7;5^hC16otEd*O1@@o3u~_FoyH_WY=Fszn&0YzJZr*i?)nQna+yK4cix+HKKbu1Zg7*T&>l$NLJj*YoRGRS?F*{ST57a`s! zsu<{2v0Xma!{KaQqunMu3;;53`NOau8qilJvPJ-Y46bPIFu_4!)X70lWhoyhYF*|v zoL@$RIK`MfKt-5wfLCaou%d{X+E1n3z2Wqf-BM>ZX-E7(`?8N@atPx(2PO7U0-&GG z(DjAb%j;5g234hfQ?kS`4# zUNk6vJhjLfGo!}XunDzkwZ>GBN3_%{5FE0q{B9x%onK_)mW1((u+Q>4A0sO9*EoD8 z2j@V%I>tKAI?g;!{?z|tHzHE#4du;l9@j3+UTFH$ZeGN#l^tnnk^S$mnXHy{tyY#% z*Dn=ur)jjQlj%nITtJl;5*^NF&ogZWFGqwA(P;2+p6Q3XLhD~zTau;-isOV3${c3y z{b(XcRLmaYR-w!)l${BrqDb319amOBqK7yhtiPwK!M!AAt?I{dm1sutjLF`OXTLq?$NT zwTN;$>#G>*Q?~X&o{bhk5O|oHJ2fWtiWjaJkPR}z@3u{iaL4q}HI$9_9zmD*q#LT^ z)5zR+UmKw6hu&4meTddz9hHQPcN9@=30POX0N|4bW%p1bW_}CNn7laOz~+D{ke4Wb zk981i=;U7#aO!`1!t4jjbJd3rF6jU=GE$(Qb?q1EJ$c4@>h)Z}%)}k(_;h;|S2_Q9 zUL4dL>^eG>HPGB$+6UTOIC9;pqNmeC02THw626kAQAT>T^zWZYot^$i5d9g2qnQW5b zi>fu$*xzBLMZ&P5>hzuaB9t5MBAojme9oql?&QKCx~iT zr*rh8#x3s;N{XVK!g#TPf@l1(2z|DuQf!m>JQlm_$0*rJdZTRZ?aj^c+6XSqVEbo!t;yrBxRU^n~5UaX!4P>Tein#eRGeM0mizPIN=GY6ZoVMn-qymum2Z;;{cx=4AhKwUQs=$G{oA}*cR3~kq$y{$#FYzKz(fE{K@K*YNEXhrRW#+(`hmn;H!ilONjiP6>1pT=p5s$b)e8TTe+-y({hs=Pv*@ zzkU{{HfKD0&}s7taVsI%BRwk%(t*pOWMc^70_$z#92M6BX^qK;$v^lt;^y<1F1~zR z)qfg*?S+EMjsl<>>3nhNPJyjrU6ls z$xeyrRYKC#Lgp^7!8i>xAHCXpkNV*!w6%}zGl37htsrYb*&L3%V^UpKeZ zeifeLa6CwUcKQXoa_Z-Ya6BjeVrF%KLt6)Pz677et5W?iBNeh=L-n=c!(}+3 zDb{p^P@U%3v_!B|2Aim)9;cngO6`_xq*?@h%KFD8vwP66CUa20tTsAZ+jvjM{4Hw6lF|9+P`3jhFY ztmgC7blqCftQMZKiZS$N!syB8*f9LxNAcFhAl5IIzo|kI5IojuHAlQQ!SrbL(JQpfMrBZS1Cf6<@u?#C!a&K>7{Q!KeubH%Aj2W z@;^Bke$tWN&(9H}U3ReV+l;IR#2@? zuf28)OarvR6{YNaT)-M^5rkS~u0-P42y?w%)pJJOD zdRZO{1&Y1YUeBwwLj?!QQFCg)d4zibz7pK9M)~)C`>||4d}K7*6y0Kq$sKAU-!Enb z4bCUe6%Q44c2cGtAlui=`d0vythA7-ojTE#%hi&sO%A~NuU;-O5SL3^^^FP$G`JZI zV5!sq&xMfZGP^9Jo-ULRwR3I`i}Zb>utxZoU6=fBO>z3P&lv`~2n1^dv>!{pz{;J} zOzMyG@4Zl_47UsJS-9Y#>bGBrI5%`?{$5Pid3~fh$*Dq-%aLuB_OON1r=s zhm>G>?E0mE__is~f6-X}=TaU0<;RU3ySf_^tKC{BmZL-|F3nJ=oznAx6Z4a7wmPySvg4phvDZ;I4G ziJSFztbYSd74oN46KtcjxNJB)!d+w`iBQsxG#OFFQccmn6(Nnho+D#IYoYh-{wVYD z$qW(`jXo4oI{u3&kxE+h>Ij%FKpjuohY-%VI1s`9*Ubh0QTvMO(m`NlvGDhjzH*7* zn+Iu1zvgH%izT3)48Xc_JDt5>Gw$ARCS$!v60NaMFn}w91D{)*xyJ6!>y;M%zTqOE zCi|2aSECN15>LuxZ?ya0bBM48zTnLzvHkBY!S}V6wR24|T`R>nf>Mj|`UhPHgjNWN))xd!fj{;(~t9+x`%s1&I>jV6!_G7MFgSDyFS zd5_={Fv%OtZ$HCSgB9bBCTSQJ@Ry=Yf01zP zC}_psby@YeB3j{1+As+lduO#9u1S;BFeBBl0hnWCZ=ndTCg@}KX1~JsJI*VY29){= zW?sP0HHP(awg{<B{w{IJXgv2m9q|CXZb@Jz$dVmgV&C2TQu>B+ObT%-bL)}F zdlfooEvlV1Kr8ntm7N62m%EXF=M<=EcVAuRm*E4IrzbDA61sd}^;GOCKgPzfv}5v* zJ$3gxV6>sDMLYJo89M#rfl8G)tC9;1S(Hj@&T@A){MTKbJMoO(L-@Dk*v|(p`Q|g5 zvNCfwAPO0P9#<@z`;y(=_e&=`Zii&(roz9!yxgYwD31T%%}F9 ze1Tm$wTilAN(y2&)KvTaI)#(tM#RuLxaKFeCh|g1_NhzY(2Pcbrm8zd}HhES7_~fo?s*%x4n*E<+qX&&?XGhVj_>`e9&G5qAq(!6MCm~z}U+_$1 zFzmhosR7t*y}R=}Q#AMIv;f*r{0i;v6s@;~_I)8wXMJu~tWFL~a1y8wmt9n|B!Tx* z#4UOi6d;fPd`hF_zXl0<$26k`Z+hTg0OH&I4`%{W%fvvUxV!$Dr7T9Bnh4CuGGie) zS^->R7x{bPziuC}Md<%-0qpnxGV1?75(UwiGR}ymyDav8g@GS^9b@hCGx%Ho2OnXq A#sB~S literal 0 HcmV?d00001 diff --git a/frontend/public/img/boom-filled-red.png b/frontend/public/img/boom-filled-red.png new file mode 100644 index 0000000000000000000000000000000000000000..ef5bb3b1d467a98c48a0b7990526fe5f0b75af1b GIT binary patch literal 16879 zcmeIaWmuG5*EfF75Dp?R0)hg7bo-XJr^(XDi8yY{=%cl zq13O1p6G10-Mpm12>X_8#x$a%`>PS6)HqExU9fohr5WwZ(~Z!izj4r+1`L(;thaMG zZq#HV272I#h>N^3kfO_M$s6!9_y-uq z{@*W=Qy?HJ+N7A%qz|AV7aG#@sEAYuhWh%U>l*2KI63s?-_7V5QP9PkPYmynK7fI6 z!o=^RFfz~JV7QBR+{o=?e6{V zT{2;G{Kgmt6z>$!Mj@HIF)X#1d_y-L$Kh?pN@=CegBk3nz1W_)_g0oWhh8bIR78yq z0R|+%VwGsL_UhG0_X1XK4tvvK!3sA^xB4RKhcbAUP7=` z&gZFbSWkK;kI8lJL^=t}CcZ-lK3AyVFyaLEQA&k`>^@ol7NGKs$%_~mOb8sc;?x!t zT_u`~p@0lzv+4QUzQbc=(|ypXTC-ESTNgWUPdBEyyG)vuXkc7GquxOA0=vws5=YO{ znz#I$euhc>l-+LoscUUcq|yqwj&?G$y#)%1R=}Z$aKoSS$No`n)nm?zl2HLf*=YmW zX{a$7W#SeS4~OwdI}V3QOjS+D4)Gz`erv=+(M8}1G^znJTc;)l1P#o zASr2gQIdaL{!!rY*r+}&p(}65v7VKIRpquh5Pk{}er9(qo z^qO0bqLPZ4;fNAI^3Tq%O`S2!jU!WsU5I(?{Ra=|%BZhwKO!&Hya4DeP= BCl?m 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 Date: Wed, 7 May 2025 23:40:56 +0900 Subject: [PATCH 34/44] chore: ignore .env file --- backend/pirocheck/.gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/pirocheck/.gitignore b/backend/pirocheck/.gitignore index 8f30de9..3fac0c4 100644 --- a/backend/pirocheck/.gitignore +++ b/backend/pirocheck/.gitignore @@ -39,4 +39,5 @@ out/ .vscode/ ### 환경 변수 ### -../../.env \ No newline at end of file +../../.env +.env \ No newline at end of file From 34ac7be5be2976eb0fdf872cceea02d35151e9b5 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Wed, 7 May 2025 23:47:24 +0900 Subject: [PATCH 35/44] =?UTF-8?q?public=EA=B5=AC=EC=A1=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/fonts/Akira Expanded Demo.otf | Bin .../{src => public}/assets/img/arrowicon.png | Bin .../{src => public}/assets/img/arrowicon.svg | 0 frontend/{src => public}/assets/img/logo.svg | 0 .../{src => public}/assets/img/moneyicon.png | Bin .../{src => public}/assets/img/moneyicon.svg | 0 .../assets/img/tabler--boom.svg | 0 frontend/src/Home.jsx | 3 +-- frontend/src/components/Header.jsx | 18 +++++++++++++----- frontend/src/main.jsx | 4 ++-- frontend/src/{assets => }/reset.css | 0 frontend/src/{assets => }/root.css | 0 12 files changed, 16 insertions(+), 9 deletions(-) rename frontend/{src => public}/assets/fonts/Akira Expanded Demo.otf (100%) rename frontend/{src => public}/assets/img/arrowicon.png (100%) rename frontend/{src => public}/assets/img/arrowicon.svg (100%) rename frontend/{src => public}/assets/img/logo.svg (100%) rename frontend/{src => public}/assets/img/moneyicon.png (100%) rename frontend/{src => public}/assets/img/moneyicon.svg (100%) rename frontend/{src => public}/assets/img/tabler--boom.svg (100%) rename frontend/src/{assets => }/reset.css (100%) rename frontend/src/{assets => }/root.css (100%) diff --git a/frontend/src/assets/fonts/Akira Expanded Demo.otf b/frontend/public/assets/fonts/Akira Expanded Demo.otf similarity index 100% rename from frontend/src/assets/fonts/Akira Expanded Demo.otf rename to frontend/public/assets/fonts/Akira Expanded Demo.otf diff --git a/frontend/src/assets/img/arrowicon.png b/frontend/public/assets/img/arrowicon.png similarity index 100% rename from frontend/src/assets/img/arrowicon.png rename to frontend/public/assets/img/arrowicon.png diff --git a/frontend/src/assets/img/arrowicon.svg b/frontend/public/assets/img/arrowicon.svg similarity index 100% rename from frontend/src/assets/img/arrowicon.svg rename to frontend/public/assets/img/arrowicon.svg diff --git a/frontend/src/assets/img/logo.svg b/frontend/public/assets/img/logo.svg similarity index 100% rename from frontend/src/assets/img/logo.svg rename to frontend/public/assets/img/logo.svg diff --git a/frontend/src/assets/img/moneyicon.png b/frontend/public/assets/img/moneyicon.png similarity index 100% rename from frontend/src/assets/img/moneyicon.png rename to frontend/public/assets/img/moneyicon.png diff --git a/frontend/src/assets/img/moneyicon.svg b/frontend/public/assets/img/moneyicon.svg similarity index 100% rename from frontend/src/assets/img/moneyicon.svg rename to frontend/public/assets/img/moneyicon.svg diff --git a/frontend/src/assets/img/tabler--boom.svg b/frontend/public/assets/img/tabler--boom.svg similarity index 100% rename from frontend/src/assets/img/tabler--boom.svg rename to frontend/public/assets/img/tabler--boom.svg diff --git a/frontend/src/Home.jsx b/frontend/src/Home.jsx index d8b1c7c..f1fe4fa 100644 --- a/frontend/src/Home.jsx +++ b/frontend/src/Home.jsx @@ -1,7 +1,6 @@ import React from "react"; import { useNavigate } from "react-router-dom"; import styles from "./Home.module.css"; -import logo from "./assets/img/logo.svg"; const Home = () => { const navigate = useNavigate(); @@ -23,7 +22,7 @@ const Home = () => {

ATTENDANCE

CHECK

- 로고 + 로고
); diff --git a/frontend/src/components/Header.jsx b/frontend/src/components/Header.jsx index c9ec60e..4ac3367 100644 --- a/frontend/src/components/Header.jsx +++ b/frontend/src/components/Header.jsx @@ -2,8 +2,6 @@ import React from "react"; import { useNavigate, useLocation } from "react-router-dom"; import { ArrowLeft, Wallet } from "lucide-react"; import "./componentsCss/Header.css"; -import arrowIcon from "../assets/img/arrowicon.svg"; -import moneyIcon from "../assets/img/moneyicon.svg"; const Header = () => { const navigate = useNavigate(); const location = useLocation(); @@ -23,7 +21,12 @@ const Header = () => { onClick={() => navigate(-1)} aria-label="뒤로가기" > - Back + Back

{title}

{showRightButton ? ( @@ -32,10 +35,15 @@ const Header = () => { onClick={() => navigate("/deposit")} aria-label="보증금 페이지 이동" > - Deposit + Deposit ) : ( -
// 오른쪽 공백 유지 +
)}
); diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index 0b2945d..1725ce4 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -1,8 +1,8 @@ import { createRoot } from "react-dom/client"; import App from "./App.jsx"; -import "./assets/root.css"; +import "./root.css"; import { BrowserRouter } from "react-router-dom"; -import "./assets/reset.css"; +import "./reset.css"; import { StrictMode } from "react"; createRoot(document.getElementById("root")).render( diff --git a/frontend/src/assets/reset.css b/frontend/src/reset.css similarity index 100% rename from frontend/src/assets/reset.css rename to frontend/src/reset.css diff --git a/frontend/src/assets/root.css b/frontend/src/root.css similarity index 100% rename from frontend/src/assets/root.css rename to frontend/src/root.css From a16e51b99c786ad0d4c0490233f4297aa0306d53 Mon Sep 17 00:00:00 2001 From: dietken1 Date: Wed, 7 May 2025 23:48:11 +0900 Subject: [PATCH 36/44] =?UTF-8?q?=EC=A4=91=EA=B0=84=EB=B3=91=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AttendanceController.java | 94 +++++++++++++++++++ .../dto/request/GetAttendanceByDateReq.java | 2 +- .../dto/request/MarkAttendanceReq.java | 2 +- .../Attendance/dto/response/ApiResponse.java | 38 ++++++++ .../dto/response/AttendanceCodeResponse.java | 29 ++++++ .../dto/response/AttendanceSlotRes.java | 2 +- .../dto/response/AttendanceStatusRes.java | 3 +- .../response/GetAttendanceByUserIdRes.java | 2 +- .../entity/Attendance.java | 2 +- .../entity/AttendanceCode.java | 2 +- .../repository/AttendanceCodeRepository.java | 6 +- .../repository/AttendanceRepository.java | 9 +- .../service/AttendanceService.java | 79 +++++++++++++--- .../Deposit/controller/DepositController.java | 23 +++++ .../pirocheck/Deposit/dto/DepositResDto.java | 19 ++++ .../pirocheck/Deposit/entity/Deposit.java | 40 ++++++++ .../Deposit/init/DepositInitRunner.java | 37 ++++++++ .../Deposit/repository/DepositRepository.java | 12 +++ .../Deposit/service/DepositService.java | 56 +++++++++++ .../backend/pirocheck/User/entity/Role.java | 2 +- .../backend/pirocheck/User/entity/User.java | 2 +- .../controller/AssignmentController.java | 36 +++++++ .../assignment/dto/request/AssignmentReq.java | 16 ++++ .../dto/response/AssignmentDayRes.java | 13 +++ .../dto/response/AssignmentDetailRes.java | 12 +++ .../dto/response/AssignmentRes.java | 18 ++++ .../dto/response/AssignmentWeekRes.java | 14 +++ .../assignment/entity/Assignment.java | 49 ++++++++++ .../assignment/entity/AssignmentStatus.java | 5 + .../repository/AssignmentRepository.java | 20 ++++ .../assignment/service/AssignmentService.java | 83 ++++++++++++++++ .../controller/AttendanceController.java | 55 ----------- .../src/main/resources/application.yml | 4 +- .../pirocheck/PirocheckApplicationTests.java | 13 +++ 34 files changed, 713 insertions(+), 86 deletions(-) create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/Attendance/controller/AttendanceController.java rename backend/pirocheck/src/main/java/backend/pirocheck/{attendence => Attendance}/dto/request/GetAttendanceByDateReq.java (75%) rename backend/pirocheck/src/main/java/backend/pirocheck/{attendence => Attendance}/dto/request/MarkAttendanceReq.java (70%) create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/ApiResponse.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceCodeResponse.java rename backend/pirocheck/src/main/java/backend/pirocheck/{attendence => Attendance}/dto/response/AttendanceSlotRes.java (79%) rename backend/pirocheck/src/main/java/backend/pirocheck/{attendence => Attendance}/dto/response/AttendanceStatusRes.java (72%) rename backend/pirocheck/src/main/java/backend/pirocheck/{attendence => Attendance}/dto/response/GetAttendanceByUserIdRes.java (80%) rename backend/pirocheck/src/main/java/backend/pirocheck/{attendence => Attendance}/entity/Attendance.java (93%) rename backend/pirocheck/src/main/java/backend/pirocheck/{attendence => Attendance}/entity/AttendanceCode.java (90%) rename backend/pirocheck/src/main/java/backend/pirocheck/{attendence => Attendance}/repository/AttendanceCodeRepository.java (65%) rename backend/pirocheck/src/main/java/backend/pirocheck/{attendence => Attendance}/repository/AttendanceRepository.java (69%) rename backend/pirocheck/src/main/java/backend/pirocheck/{attendence => Attendance}/service/AttendanceService.java (63%) create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/Deposit/controller/DepositController.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/Deposit/dto/DepositResDto.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/Deposit/entity/Deposit.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/Deposit/init/DepositInitRunner.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/Deposit/repository/DepositRepository.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/controller/AssignmentController.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/request/AssignmentReq.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDayRes.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDetailRes.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentRes.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentWeekRes.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/Assignment.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/AssignmentStatus.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/repository/AssignmentRepository.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/service/AssignmentService.java delete mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java create mode 100644 backend/pirocheck/test/java/backend/pirocheck/PirocheckApplicationTests.java diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/controller/AttendanceController.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/controller/AttendanceController.java new file mode 100644 index 0000000..2401afb --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/controller/AttendanceController.java @@ -0,0 +1,94 @@ +package backend.pirocheck.Attendance.controller; + +import backend.pirocheck.Attendance.dto.request.MarkAttendanceReq; +import backend.pirocheck.Attendance.dto.response.ApiResponse; +import backend.pirocheck.Attendance.dto.response.AttendanceCodeResponse; +import backend.pirocheck.Attendance.dto.response.AttendanceSlotRes; +import backend.pirocheck.Attendance.dto.response.AttendanceStatusRes; +import backend.pirocheck.Attendance.entity.AttendanceCode; +import backend.pirocheck.Attendance.service.AttendanceService; +import lombok.RequiredArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/attendance") +public class AttendanceController { + + private final AttendanceService attendanceService; + + // 특정 유저의 출석 정보 + @GetMapping("/user") + public ApiResponse> getAttendanceByUserId(@RequestParam Long userId) { + return ApiResponse.success(attendanceService.findByUserId(userId)); + } + + // 특정 유저의 특정 일자 출석 정보 + @GetMapping("/user/date") + public ApiResponse> getAttendanceByUserIdAndDate( + @RequestParam Long userId, + @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date + ) { + return ApiResponse.success(attendanceService.findByUserIdAndDate(userId, date)); + } + + // 출석체크 시작 + @PostMapping("/start") + public ApiResponse postAttendance() { + AttendanceCode code = attendanceService.generateCodeAndCreateAttendances(); + return ApiResponse.success(AttendanceCodeResponse.from(code)); + } + + // 현재 활성화된 출석코드 조회 + @GetMapping("/active-code") + public ApiResponse getActiveCode() { + Optional codeOpt = attendanceService.getActiveAttendanceCode(); + + if (codeOpt.isEmpty()) { + return ApiResponse.error("현재 활성화된 출석코드가 없습니다"); + } + + return ApiResponse.success(AttendanceCodeResponse.from(codeOpt.get())); + } + + // 출석코드 비교 + @PostMapping("/mark") + public ApiResponse markAttendance(@RequestBody MarkAttendanceReq req) { + String result = attendanceService.markAttendance(req.getUserId(), req.getCode()); + + if (result.equals("출석이 성공적으로 처리되었습니다")) { + return ApiResponse.success(result, null); + } else { + return ApiResponse.error(result); + } + } + + // 출석체크 종료 (코드 직접 전달) + @PutMapping("/expire") + public ApiResponse expireAttendance(@RequestParam String code) { + String result = attendanceService.exprireAttendanceCode(code); + + if (result.equals("출석 코드가 성공적으로 만료되었습니다")) { + return ApiResponse.success(result, null); + } else { + return ApiResponse.error(result); + } + } + + // 출석체크 종료 (가장 최근 활성화된 코드 자동 만료) + @PutMapping("/expire-latest") + public ApiResponse expireLatestAttendance() { + String result = attendanceService.expireLatestAttendanceCode(); + + if (result.equals("출석 코드가 성공적으로 만료되었습니다")) { + return ApiResponse.success(result, null); + } else { + return ApiResponse.error(result); + } + } +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/GetAttendanceByDateReq.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/request/GetAttendanceByDateReq.java similarity index 75% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/GetAttendanceByDateReq.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/request/GetAttendanceByDateReq.java index d731fb4..456f384 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/GetAttendanceByDateReq.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/request/GetAttendanceByDateReq.java @@ -1,4 +1,4 @@ -package backend.pirocheck.attendence.dto.request; +package backend.pirocheck.Attendance.dto.request; import lombok.Getter; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/MarkAttendanceReq.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/request/MarkAttendanceReq.java similarity index 70% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/MarkAttendanceReq.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/request/MarkAttendanceReq.java index a6aad92..779ead3 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/MarkAttendanceReq.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/request/MarkAttendanceReq.java @@ -1,4 +1,4 @@ -package backend.pirocheck.attendence.dto.request; +package backend.pirocheck.Attendance.dto.request; import lombok.Getter; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/ApiResponse.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/ApiResponse.java new file mode 100644 index 0000000..7cb7e9b --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/ApiResponse.java @@ -0,0 +1,38 @@ +package backend.pirocheck.Attendance.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ApiResponse { + private boolean success; + private String message; + private T data; + + public static ApiResponse success(T data) { + return ApiResponse.builder() + .success(true) + .data(data) + .build(); + } + + public static ApiResponse success(String message, T data) { + return ApiResponse.builder() + .success(true) + .message(message) + .data(data) + .build(); + } + + public static ApiResponse error(String message) { + return ApiResponse.builder() + .success(false) + .message(message) + .build(); + } +} \ No newline at end of file diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceCodeResponse.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceCodeResponse.java new file mode 100644 index 0000000..4fe0b37 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceCodeResponse.java @@ -0,0 +1,29 @@ +package backend.pirocheck.Attendance.dto.response; + +import backend.pirocheck.Attendance.entity.AttendanceCode; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AttendanceCodeResponse { + private String code; + private LocalDate date; + private int order; + private boolean isExpired; + + public static AttendanceCodeResponse from(AttendanceCode attendanceCode) { + return AttendanceCodeResponse.builder() + .code(attendanceCode.getCode()) + .date(attendanceCode.getDate()) + .order(attendanceCode.getOrder()) + .isExpired(attendanceCode.isExpired()) + .build(); + } +} \ No newline at end of file diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceSlotRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceSlotRes.java similarity index 79% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceSlotRes.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceSlotRes.java index 81f0bbf..aa1a5cc 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceSlotRes.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceSlotRes.java @@ -1,4 +1,4 @@ -package backend.pirocheck.attendence.dto.response; +package backend.pirocheck.Attendance.dto.response; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceStatusRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceStatusRes.java similarity index 72% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceStatusRes.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceStatusRes.java index 2a965ac..7a0cfa4 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceStatusRes.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceStatusRes.java @@ -1,6 +1,5 @@ -package backend.pirocheck.attendence.dto.response; +package backend.pirocheck.Attendance.dto.response; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/GetAttendanceByUserIdRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/GetAttendanceByUserIdRes.java similarity index 80% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/GetAttendanceByUserIdRes.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/GetAttendanceByUserIdRes.java index 50fd6a4..7c4a1fa 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/GetAttendanceByUserIdRes.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/GetAttendanceByUserIdRes.java @@ -1,4 +1,4 @@ -package backend.pirocheck.attendence.dto.response; +package backend.pirocheck.Attendance.dto.response; import lombok.Getter; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendance.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/entity/Attendance.java similarity index 93% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendance.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/entity/Attendance.java index af9ce56..6c63eb7 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendance.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/entity/Attendance.java @@ -1,4 +1,4 @@ -package backend.pirocheck.attendence.entity; +package backend.pirocheck.Attendance.entity; import backend.pirocheck.User.entity.User; import jakarta.persistence.*; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendanceCode.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/entity/AttendanceCode.java similarity index 90% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendanceCode.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/entity/AttendanceCode.java index 358bf29..92812eb 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendanceCode.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/entity/AttendanceCode.java @@ -1,4 +1,4 @@ -package backend.pirocheck.attendence.entity; +package backend.pirocheck.Attendance.entity; import jakarta.persistence.*; import lombok.Getter; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceCodeRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceCodeRepository.java similarity index 65% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceCodeRepository.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceCodeRepository.java index 2c30b55..edf9aac 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceCodeRepository.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceCodeRepository.java @@ -1,14 +1,16 @@ -package backend.pirocheck.attendence.repository; +package backend.pirocheck.Attendance.repository; -import backend.pirocheck.attendence.entity.AttendanceCode; +import backend.pirocheck.Attendance.entity.AttendanceCode; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.time.LocalDate; +import java.util.List; import java.util.Optional; @Repository public interface AttendanceCodeRepository extends JpaRepository { int countByDate(LocalDate date); Optional findByCodeAndDate(String code, LocalDate date); + List findByDateAndIsExpiredFalse(LocalDate date); } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceRepository.java similarity index 69% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceRepository.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceRepository.java index 445f157..e06f6e9 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceRepository.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceRepository.java @@ -1,7 +1,7 @@ -package backend.pirocheck.attendence.repository; +package backend.pirocheck.Attendance.repository; -import backend.pirocheck.attendence.entity.Attendance; -import backend.pirocheck.attendence.entity.AttendanceCode; +import backend.pirocheck.User.entity.User; +import backend.pirocheck.Attendance.entity.Attendance; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -14,4 +14,7 @@ public interface AttendanceRepository extends JpaRepository { List findByUserId(Long userId); List findByUserIdAndDate(Long userId, LocalDate date); Optional findByUserIdAndDateAndOrder(Long userId, LocalDate date, int order); + + // 출석 실패 + int countByUserAndStatusFalse(User user); } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/service/AttendanceService.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/service/AttendanceService.java similarity index 63% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/service/AttendanceService.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/service/AttendanceService.java index 42ffe8f..de65f49 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/service/AttendanceService.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/service/AttendanceService.java @@ -1,14 +1,14 @@ -package backend.pirocheck.attendence.service; +package backend.pirocheck.Attendance.service; import backend.pirocheck.User.entity.Role; import backend.pirocheck.User.entity.User; import backend.pirocheck.User.repository.UserRepository; -import backend.pirocheck.attendence.dto.response.AttendanceSlotRes; -import backend.pirocheck.attendence.dto.response.AttendanceStatusRes; -import backend.pirocheck.attendence.entity.Attendance; -import backend.pirocheck.attendence.entity.AttendanceCode; -import backend.pirocheck.attendence.repository.AttendanceCodeRepository; -import backend.pirocheck.attendence.repository.AttendanceRepository; +import backend.pirocheck.Attendance.dto.response.AttendanceSlotRes; +import backend.pirocheck.Attendance.dto.response.AttendanceStatusRes; +import backend.pirocheck.Attendance.entity.Attendance; +import backend.pirocheck.Attendance.entity.AttendanceCode; +import backend.pirocheck.Attendance.repository.AttendanceCodeRepository; +import backend.pirocheck.Attendance.repository.AttendanceRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,6 +34,13 @@ public class AttendanceService { public AttendanceCode generateCodeAndCreateAttendances() { LocalDate today = LocalDate.now(); + // 만료되지 않은 출석 코드가 있는지 확인 + List activeAttendanceCodes = attendanceCodeRepository.findByDateAndIsExpiredFalse(today); + if (!activeAttendanceCodes.isEmpty()) { + // 만료되지 않은 코드가 있으면 해당 코드 반환 + return activeAttendanceCodes.get(0); + } + // 오늘 생성된 출석코드 개수 = 현재까지 생성된 차시 수 + 1 (MAX=3) int currentOrder = attendanceCodeRepository.countByDate(today) + 1; @@ -61,48 +68,90 @@ public AttendanceCode generateCodeAndCreateAttendances() { return attendanceCode; } + // 현재 활성화된 출석코드 조회 함수 + public Optional getActiveAttendanceCode() { + LocalDate today = LocalDate.now(); + List activeCodes = attendanceCodeRepository.findByDateAndIsExpiredFalse(today); + + if (activeCodes.isEmpty()) { + return Optional.empty(); + } + + return Optional.of(activeCodes.get(0)); + } + + // 가장 최근 활성화된 출석코드 만료처리 함수 + @Transactional + public String expireLatestAttendanceCode() { + Optional activeCodeOpt = getActiveAttendanceCode(); + + if (activeCodeOpt.isEmpty()) { + return "현재 활성화된 출석코드가 없습니다"; + } + + AttendanceCode code = activeCodeOpt.get(); + code.setExpired(true); + attendanceCodeRepository.save(code); + + return "출석 코드가 성공적으로 만료되었습니다"; + } + // 출석코드 만료처리 함수 @Transactional - public boolean exprireAttendanceCode(String code) { + public String exprireAttendanceCode(String code) { Optional codeOpt = attendanceCodeRepository.findByCodeAndDate(code, LocalDate.now()); if (codeOpt.isEmpty()) { - return false; + return "존재하지 않는 출석 코드입니다"; } AttendanceCode attendanceCode = codeOpt.get(); if (attendanceCode.isExpired()) { - return false; + return "이미 만료된 출석 코드입니다"; } attendanceCode.setExpired(true); attendanceCodeRepository.save(attendanceCode); - return true; + return "출석 코드가 성공적으로 만료되었습니다"; } // 출석처리 함수 @Transactional - public boolean markAttendance(Long userId, String inputCode) { + public String markAttendance(Long userId, String inputCode) { // 1. 출석코드 일치 비교 Optional validCodeOpt = attendanceCodeRepository.findByCodeAndDate(inputCode, LocalDate.now()); - if (validCodeOpt.isEmpty()) return false; + if (validCodeOpt.isEmpty()) { + return "출석 코드가 존재하지 않습니다. 현재 출석 체크가 진행중이 아닙니다"; + } AttendanceCode code = validCodeOpt.get(); + + if (code.isExpired()) { + return "출석 코드가 만료되었습니다"; + } // 2. 해당 유저의 출석 레코드 조회 Optional attendanceOpt = attendanceRepository.findByUserIdAndDateAndOrder(userId, code.getDate(), code.getOrder()); - if (attendanceOpt.isEmpty()) return false; + if (attendanceOpt.isEmpty()) { + return "출석 정보를 찾을 수 없습니다"; + } // 3. 출석 처리 Attendance attendance = attendanceOpt.get(); + + // 이미 출석한 경우 + if (attendance.isStatus()) { + return "이미 출석처리가 완료되었습니다"; + } + attendance.setStatus(true); attendanceRepository.save(attendance); - return true; + return "출석이 성공적으로 처리되었습니다"; } // 유저의 전체 출석 현황을 조회하는 함수 diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/controller/DepositController.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/controller/DepositController.java new file mode 100644 index 0000000..f4a5f63 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/controller/DepositController.java @@ -0,0 +1,23 @@ +package backend.pirocheck.Deposit.controller; + + +import backend.pirocheck.Deposit.dto.DepositResDto; +import backend.pirocheck.Deposit.service.DepositService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/deposit") +@RequiredArgsConstructor +public class DepositController { + + private final DepositService depositService; + + @GetMapping("/{userId}") + public DepositResDto getDeposit(@PathVariable Long userId) { + return depositService.getDeposit(userId); + } +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/dto/DepositResDto.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/dto/DepositResDto.java new file mode 100644 index 0000000..d05dcdc --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/dto/DepositResDto.java @@ -0,0 +1,19 @@ +package backend.pirocheck.Deposit.dto; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DepositResDto { + private int amount; + private int descentAssignment; + private int descentAttendance; + private int ascentDefence; + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/entity/Deposit.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/entity/Deposit.java new file mode 100644 index 0000000..139e385 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/entity/Deposit.java @@ -0,0 +1,40 @@ +package backend.pirocheck.Deposit.entity; + +import backend.pirocheck.User.entity.User; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class Deposit { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", unique = true) + private User user; + + private int amount; // 현재 보증금 + private int descentAssignment; // 과제 차감 총합 + private int descentAttendance; // 출석 차감 총합 + private int ascentDefence; // 방어권 + + // 보증금 계산 + public void updateAmounts(int descentAssignment, int descentAttendance, int ascentDefence) { + this.descentAssignment = descentAssignment; + this.descentAttendance = descentAttendance; + this.ascentDefence = ascentDefence; + + int calculateAmount = 120000 - descentAssignment - descentAttendance + ascentDefence; + this.amount = Math.min(calculateAmount, 120000); // 12만원 넘어가지 않도록 + } + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/init/DepositInitRunner.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/init/DepositInitRunner.java new file mode 100644 index 0000000..f077db6 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/init/DepositInitRunner.java @@ -0,0 +1,37 @@ +package backend.pirocheck.Deposit.init; + +import backend.pirocheck.Deposit.entity.Deposit; +import backend.pirocheck.Deposit.repository.DepositRepository; +import backend.pirocheck.User.entity.User; +import backend.pirocheck.User.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class DepositInitRunner implements CommandLineRunner { + + private final DepositRepository depositRepository; + private final UserRepository userRepository; + + @Override + public void run(String... args) { + for (User user : userRepository.findAll()) { + if (!depositRepository.existsByUser(user)) { + // 보증금 레코드가 없으면 새로 생성 + Deposit deposit = Deposit.builder() + .user(user) + .amount(120000) + .descentAssignment(0) + .descentAttendance(0) + .ascentDefence(0) + .build(); + + depositRepository.save(deposit); + } + } + } + + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/repository/DepositRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/repository/DepositRepository.java new file mode 100644 index 0000000..d487b03 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/repository/DepositRepository.java @@ -0,0 +1,12 @@ +package backend.pirocheck.Deposit.repository; + +import backend.pirocheck.Deposit.entity.Deposit; +import backend.pirocheck.User.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface DepositRepository extends JpaRepository { + Deposit findByUser(User user); + boolean existsByUser(User user); // 중복 방지를 위한 존재 여부 확인 +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java new file mode 100644 index 0000000..f8cd876 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java @@ -0,0 +1,56 @@ +package backend.pirocheck.Deposit.service; + + +import backend.pirocheck.Deposit.dto.DepositResDto; +import backend.pirocheck.Deposit.entity.Deposit; +import backend.pirocheck.Deposit.repository.DepositRepository; +import backend.pirocheck.User.entity.User; +import backend.pirocheck.User.repository.UserRepository; +import backend.pirocheck.assignment.entity.AssignmentStatus; +import backend.pirocheck.assignment.repository.AssignmentRepository; +import backend.pirocheck.Attendance.repository.AttendanceRepository; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class DepositService { + + private final DepositRepository depositRepository; + private final UserRepository userRepository; + private final AttendanceRepository attendanceRepository; + private final AssignmentRepository assignmentRepository; // 확인 + + @Transactional + public DepositResDto getDeposit(Long userId) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 유저입니다.")); + + Deposit deposit = depositRepository.findByUser(user); + + // 출석 실패 + int failAttendanceCount = attendanceRepository.countByUserAndStatusFalse(user); + int descentAttendance = failAttendanceCount * 10000; + + // 과제 실패 + int failAssignmentCount = assignmentRepository.countByUserAndSubmitted(user, AssignmentStatus.FAILURE); // 확인 + int weakAssignmentCount = assignmentRepository.countByUserAndSubmitted(user, AssignmentStatus.INSUFFICIENT); // 확인 + int descentAssignment = failAssignmentCount * 10_000 + weakAssignmentCount * 5_000; + + // 방어권 + int ascentDefence = deposit.getAscentDefence(); + + // 보증금 업데이트 + deposit.updateAmounts(descentAssignment, descentAttendance, ascentDefence); + depositRepository.save(deposit); + + return DepositResDto.builder() + .amount(deposit.getAmount()) + .descentAssignment(deposit.getDescentAssignment()) + .descentAttendance(deposit.getDescentAttendance()) + .ascentDefence(deposit.getAscentDefence()) + .build(); + + } +} \ No newline at end of file diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/Role.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/Role.java index ce1c180..5bb97bb 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/Role.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/Role.java @@ -3,4 +3,4 @@ public enum Role { ADMIN, MEMBER -} +} \ No newline at end of file diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/User.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/User.java index e2b88d0..ad215b0 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/User.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/User.java @@ -32,4 +32,4 @@ public class User { private Integer generation; -} +} \ No newline at end of file diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/controller/AssignmentController.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/controller/AssignmentController.java new file mode 100644 index 0000000..3552b44 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/controller/AssignmentController.java @@ -0,0 +1,36 @@ +package backend.pirocheck.assignment.controller; + +import backend.pirocheck.assignment.dto.request.AssignmentReq; +import backend.pirocheck.assignment.dto.response.AssignmentRes; +import backend.pirocheck.assignment.dto.response.AssignmentWeekRes; +import backend.pirocheck.assignment.service.AssignmentService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/assignment") +@RequiredArgsConstructor +public class AssignmentController { + + private final AssignmentService assignmentService; + + // 과제 결과 확인 API +// @GetMapping("/{userId}") +// public List getAssignment(@PathVariable("userId") Long userId) { +// // 주차별 과제 제목, 요일별 과제 제목, 과제 상태 반환 +// return assignmentService.search(userId); +// } + // 과제 주차별, 요일별 그룹화 JSON + @GetMapping("/grouped/{userId}") + public List getGroupedAssignments(@PathVariable Long userId) { + return assignmentService.search(userId); + } + + // 과제 생성 API + @PostMapping("/signup") + public String signupAssignment(@RequestBody AssignmentReq assignmentReq) { + return assignmentService.create(assignmentReq); + } +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/request/AssignmentReq.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/request/AssignmentReq.java new file mode 100644 index 0000000..3d1cfd6 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/request/AssignmentReq.java @@ -0,0 +1,16 @@ +package backend.pirocheck.assignment.dto.request; + +import backend.pirocheck.assignment.entity.AssignmentStatus; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class AssignmentReq { + + private String assignmentName; + private Long week; + private Long section; + private Long orderNumber; + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDayRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDayRes.java new file mode 100644 index 0000000..be325e6 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDayRes.java @@ -0,0 +1,13 @@ +package backend.pirocheck.assignment.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; + +@Getter +@AllArgsConstructor +public class AssignmentDayRes { + private String day; // 화, 목, 토 + private List details; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDetailRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDetailRes.java new file mode 100644 index 0000000..5a40dad --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDetailRes.java @@ -0,0 +1,12 @@ +package backend.pirocheck.assignment.dto.response; + +import backend.pirocheck.assignment.entity.AssignmentStatus; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class AssignmentDetailRes { + private String assignmentName; + private AssignmentStatus status; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentRes.java new file mode 100644 index 0000000..c924848 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentRes.java @@ -0,0 +1,18 @@ +package backend.pirocheck.assignment.dto.response; + +import backend.pirocheck.assignment.entity.AssignmentStatus; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class AssignmentRes { + +// private Long userId; + private String assignmentName; + private Long week; + private Long section; + private Long orderNumber; + private AssignmentStatus submitted; + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentWeekRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentWeekRes.java new file mode 100644 index 0000000..4be2d26 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentWeekRes.java @@ -0,0 +1,14 @@ +package backend.pirocheck.assignment.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; + +@Getter +@AllArgsConstructor +public class AssignmentWeekRes { + private Long week; + private String title; // 각 주차 주제 (e.g, Git / HTML / CSS) + private List days; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/Assignment.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/Assignment.java new file mode 100644 index 0000000..62aa724 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/Assignment.java @@ -0,0 +1,49 @@ +package backend.pirocheck.assignment.entity; + +import backend.pirocheck.User.entity.User; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Builder(access = AccessLevel.PRIVATE) +@NoArgsConstructor +@AllArgsConstructor +public class Assignment { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + // user 정보와 과제 정보를 연결해 저장 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; // user를 생성했을 때의 해당 user 엔티티 + + // 과제명 + private String assignmentName; + + // 주차 + private Long week; + + // 요일 + private Long section; + + // 과제 번호 + private Long orderNumber; + + // 과제 결과 + @Enumerated(EnumType.STRING) + @Column(length = 100) + private AssignmentStatus submitted; + + // 관리자가 생성 + public static Assignment create(String assignmentName, Long week, Long section, Long orderNumber) { + return Assignment.builder() + .assignmentName(assignmentName) + .week(week) + .section(section) + .orderNumber(orderNumber) + .build(); + } +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/AssignmentStatus.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/AssignmentStatus.java new file mode 100644 index 0000000..dcc9466 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/AssignmentStatus.java @@ -0,0 +1,5 @@ +package backend.pirocheck.assignment.entity; + +public enum AssignmentStatus { + SUCCESS, INSUFFICIENT, FAILURE; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/repository/AssignmentRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/repository/AssignmentRepository.java new file mode 100644 index 0000000..c0048f9 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/repository/AssignmentRepository.java @@ -0,0 +1,20 @@ +package backend.pirocheck.assignment.repository; + +import backend.pirocheck.User.entity.User; +import backend.pirocheck.assignment.entity.Assignment; +import backend.pirocheck.assignment.entity.AssignmentStatus; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface AssignmentRepository extends JpaRepository { + + // 유저별 과제 목록 조회 + List findByUserId(Long userId); + + // 보증금 + int countByUserAndSubmitted(User user, AssignmentStatus status); + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/service/AssignmentService.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/service/AssignmentService.java new file mode 100644 index 0000000..d98b74b --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/service/AssignmentService.java @@ -0,0 +1,83 @@ +package backend.pirocheck.assignment.service; + +import backend.pirocheck.assignment.dto.request.AssignmentReq; +import backend.pirocheck.assignment.dto.response.AssignmentDayRes; +import backend.pirocheck.assignment.dto.response.AssignmentDetailRes; +import backend.pirocheck.assignment.dto.response.AssignmentRes; +import backend.pirocheck.assignment.dto.response.AssignmentWeekRes; +import backend.pirocheck.assignment.entity.Assignment; +import backend.pirocheck.assignment.repository.AssignmentRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +@Transactional +@RequiredArgsConstructor +public class AssignmentService { + + private final AssignmentRepository assignmentRepository; + + // 그룹화 되지 않은 JSON 형식 +// public List search(Long userId) { +// // 각 유저별 전체 과제 목록 조회 (userId를 어떻게 넘길 것인가?) search의 인자로 넘긴다... +// List assignments = assignmentRepository.findByUserId(userId); +// +// return assignments.stream() +// .map(assignment -> new AssignmentRes(assignment.getAssignmentName(), assignment.getWeek(), assignment.getSection(), assignment.getOrderNumber(), assignment.getSubmitted())) +// .toList(); +// } + public List search(Long userId) { + + List assignments = assignmentRepository.findByUserId(userId); + // week 기준으로 그룹화 + Map> weekGroup = assignments.stream() + .collect(Collectors.groupingBy(Assignment::getWeek)); // assignments를 week 별로 그룹핑 + + List assignmentResponses = new ArrayList<>(); + + for (Map.Entry> entry : weekGroup.entrySet()) { + Long week = entry.getKey(); + List assignmentList = entry.getValue(); + + // day를 기준으로 그룹핑 + Map> dayGroup = assignments.stream() + .collect(Collectors.groupingBy(Assignment::getSection)); + + List assignmentDayResList = new ArrayList<>(); + + for (Map.Entry> dayEntry : dayGroup.entrySet()) { + Long day = dayEntry.getKey(); + List dayAssignmentList = dayEntry.getValue(); + + // 세부 과제명과 과제 결과를 리스트 형태로 + List assignmentDetailResList = dayAssignmentList.stream() + .map(assignment -> new AssignmentDetailRes( + assignment.getAssignmentName(), + assignment.getSubmitted() + )) + .toList(); + } + } + + return assignmentResponses; + } + + public String create(AssignmentReq assignmentReq) { + + Assignment assignment = Assignment.create( + assignmentReq.getAssignmentName(), + assignmentReq.getWeek(), + assignmentReq.getSection(), + assignmentReq.getOrderNumber()); + + assignment = assignmentRepository.save(assignment); + + return assignment.getAssignmentName(); + } +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java b/backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java deleted file mode 100644 index ac5847a..0000000 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java +++ /dev/null @@ -1,55 +0,0 @@ -package backend.pirocheck.attendence.controller; - -import backend.pirocheck.attendence.dto.request.GetAttendanceByDateReq; -import backend.pirocheck.attendence.dto.request.MarkAttendanceReq; -import backend.pirocheck.attendence.dto.response.AttendanceSlotRes; -import backend.pirocheck.attendence.dto.response.AttendanceStatusRes; -import backend.pirocheck.attendence.entity.AttendanceCode; -import backend.pirocheck.attendence.service.AttendanceService; -import lombok.RequiredArgsConstructor; -import org.springframework.format.annotation.DateTimeFormat; -import org.springframework.web.bind.annotation.*; - -import java.time.LocalDate; -import java.util.List; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/api/attendance") -public class AttendanceController { - - private final AttendanceService attendanceService; - - // 특정 유저의 출석 정보 - @GetMapping("/user") - public List getAttendanceByUserId(@RequestParam Long userId) { - return attendanceService.findByUserId(userId); - } - - // 특정 유저의 특정 일자 출석 정보 - @GetMapping("/user/date") - public List getAttendanceByUserIdAndDate( - @RequestParam Long userId, - @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date - ) { - return attendanceService.findByUserIdAndDate(userId, LocalDate.now()); - } - - // 출석체크 시작 - @PostMapping("/start") - public AttendanceCode postAttendance() { - return attendanceService.generateCodeAndCreateAttendances(); - } - - // 출석코드 비교 - @PostMapping("/mark") - public boolean markAttendance(@RequestBody MarkAttendanceReq req) { - return attendanceService.markAttendance(req.getUserId(), req.getCode()); - } - - // 출석체크 종료 - @PutMapping("/expire") - public boolean expireAttendance(@RequestParam String code) { - return attendanceService.exprireAttendanceCode(code); - } -} diff --git a/backend/pirocheck/src/main/resources/application.yml b/backend/pirocheck/src/main/resources/application.yml index 656f19b..1416bb4 100644 --- a/backend/pirocheck/src/main/resources/application.yml +++ b/backend/pirocheck/src/main/resources/application.yml @@ -3,10 +3,12 @@ spring: url: jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME} username: ${DB_USER} password: ${DB_PASSWORD} + driver-class-name: org.postgresql.Driver jpa: hibernate: ddl-auto: update show-sql: true properties: hibernate: - format_sql: true \ No newline at end of file + format_sql: true + open-in-view: false \ No newline at end of file diff --git a/backend/pirocheck/test/java/backend/pirocheck/PirocheckApplicationTests.java b/backend/pirocheck/test/java/backend/pirocheck/PirocheckApplicationTests.java new file mode 100644 index 0000000..ed24e06 --- /dev/null +++ b/backend/pirocheck/test/java/backend/pirocheck/PirocheckApplicationTests.java @@ -0,0 +1,13 @@ +package backend.pirocheck; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class PirocheckApplicationTests { + + @Test + void contextLoads() { + } + +} From 1b6272b2b58d9eb4aadd99f26a1c32d638a4ba0c Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Wed, 7 May 2025 23:52:38 +0900 Subject: [PATCH 37/44] [Feat] Connect backend and frontend for Assignment section --- frontend/src/Assignment.jsx | 96 +++++++++++---------- frontend/src/api/assignment.js | 6 ++ frontend/src/components/WeeklyListBlock.jsx | 10 +-- frontend/src/utils/AssignmentStatus.js | 12 +++ 4 files changed, 74 insertions(+), 50 deletions(-) create mode 100644 frontend/src/api/assignment.js create mode 100644 frontend/src/utils/AssignmentStatus.js diff --git a/frontend/src/Assignment.jsx b/frontend/src/Assignment.jsx index bad9e46..6d9789f 100644 --- a/frontend/src/Assignment.jsx +++ b/frontend/src/Assignment.jsx @@ -1,61 +1,67 @@ -import React from "react"; +import React, { useEffect, useState } from "react"; +import axios from "axios"; import WeeklyListBlock from "./components/WeeklyListBlock"; import Header from "./components/Header"; import AssignmentInfoBlock from "./components/AssignmentInfoBlock"; import styles from "./Assignment.module.css"; +import { mapStatus } from "./utils/AssignmentStatus.js"; const Assignment = () => { - const weeks = [ - { - label: "2주차 JS개론/웹개론", - details: [ - { - day: "화", - subject: "Git HTML CSS", - tasks: [ - { label: "제로초 인강", status: "done" }, - { label: "깃허브 클론 코딩", status: "progress" }, - ], - }, - { - day: "목", - subject: "Git HTML CSS", - tasks: [ - { label: "제로초 인강", status: "fail" }, - { label: "깃허브 클론 코딩", status: "progress" }, - ], - }, - ], - }, - { - label: "3주차 JS개론/웹개론", - details: [ - { - day: "화", - subject: "Git HTML CSS", - tasks: [], - }, - ], - }, - ]; - - //Assignment-Info-Block(형광 초록색카드 더미데이터) - const cardData = { - weekLabel: "3주차", - day: "화", - tasks: [{ label: "Django girls 과제" }, { label: "Django girls 과제" }], - }; + const [weeks, setWeeks] = useState([]); + const [highlightCard, setHighlightCard] = useState(null); + + useEffect(() => { + const user = JSON.parse(localStorage.getItem("user")); + const userId = user?.id; + + if (!userId) return; + + fetchAssignmentsByUser(userId) + .then((weekData) => { + const formatted = weekData.map((weekItem) => ({ + label: `${weekItem.week}주차 ${weekItem.title}`, + details: weekItem.days.map((dayItem) => ({ + day: dayItem.day, + subject: weekItem.title, + tasks: dayItem.details.map((task) => ({ + label: task.assignmentName, + status: mapStatus(task.status), + })), + })), + })); + + setWeeks(formatted); + + // 형광 카드용 하이라이트 카드 추출 (가장 최근 주차 + 첫 요일)=>운영진용 페이지 만든 후 수정필요 + // 운영진이 가장 최근 공개한 과제로. + if (formatted.length > 0 && formatted[0].details.length > 0) { + const first = formatted[0]; + const firstDay = first.details[0]; + + setHighlightCard({ + weekLabel: first.label, + day: firstDay.day, + tasks: firstDay.tasks, + }); + } + }) + .catch(() => { + alert("과제 정보를 불러오지 못했습니다."); + }); + }, []); return (
-
- -
- + {highlightCard && ( +
+ +
+ )}
); }; export default Assignment; + diff --git a/frontend/src/api/assignment.js b/frontend/src/api/assignment.js new file mode 100644 index 0000000..1887f5e --- /dev/null +++ b/frontend/src/api/assignment.js @@ -0,0 +1,6 @@ +import axios from "axios"; + +export const fetchAssignmentsByUser = async (userId) => { + const res = await axios.get(`/api/assignment/${userId}`); + return res.data; +}; diff --git a/frontend/src/components/WeeklyListBlock.jsx b/frontend/src/components/WeeklyListBlock.jsx index 8f8a7ee..52a7b92 100644 --- a/frontend/src/components/WeeklyListBlock.jsx +++ b/frontend/src/components/WeeklyListBlock.jsx @@ -12,7 +12,7 @@ const WeeklyListBlock = ({ weeks }) => { return (
{weeks.map((week, index) => ( -
+
+
+ + + + + +
); }; diff --git a/frontend/src/components/AttendanceWeekInfo.jsx b/frontend/src/components/AttendanceWeekInfo.jsx new file mode 100644 index 0000000..4f80431 --- /dev/null +++ b/frontend/src/components/AttendanceWeekInfo.jsx @@ -0,0 +1,12 @@ +import React from "react"; +import "./componentsCss/AttendanceWeekInfo.css"; + +const AttendanceWeekInfo = ({ week }) => { + return ( +
+

{week}주차

+
+ ); +}; + +export default AttendanceWeekInfo; diff --git a/frontend/src/components/componentsCss/AttendanceWeekInfo.css b/frontend/src/components/componentsCss/AttendanceWeekInfo.css new file mode 100644 index 0000000..23216da --- /dev/null +++ b/frontend/src/components/componentsCss/AttendanceWeekInfo.css @@ -0,0 +1,16 @@ +.eachWeekInfo { + width: 270px; + padding: 14px; + border-radius: 20px; + background-color: #6e6e6e; + border: 1px solid #d9d9d9; + margin-block: 20px; + display: flex; + align-items: center; +} +.weekInfo { + font-weight: 600; + font-size: 15px; + color: #ffffff; + font-family: "Inter", sans-serif; +} From a79c6f6f8e25bd25298ba74a8ae252f7cbb624b9 Mon Sep 17 00:00:00 2001 From: qkrxogmla Date: Thu, 8 May 2025 00:02:34 +0900 Subject: [PATCH 40/44] =?UTF-8?q?=EC=82=AC=EC=9A=A9=EB=90=98=EC=A7=80?= =?UTF-8?q?=EB=8A=94=20=EC=95=8A=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/index.html | 2 +- frontend/src/components/Header.jsx | 1 - frontend/src/main.jsx | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 0c589ec..79c4701 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -1,4 +1,4 @@ - + diff --git a/frontend/src/components/Header.jsx b/frontend/src/components/Header.jsx index 4ac3367..a4f62b1 100644 --- a/frontend/src/components/Header.jsx +++ b/frontend/src/components/Header.jsx @@ -1,6 +1,5 @@ import React from "react"; import { useNavigate, useLocation } from "react-router-dom"; -import { ArrowLeft, Wallet } from "lucide-react"; import "./componentsCss/Header.css"; const Header = () => { const navigate = useNavigate(); diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index 1725ce4..b318f90 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -1,7 +1,6 @@ import { createRoot } from "react-dom/client"; import App from "./App.jsx"; import "./root.css"; -import { BrowserRouter } from "react-router-dom"; import "./reset.css"; import { StrictMode } from "react"; From 73090890d9cd5bd278df23d1071fe62a8dee6f56 Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Thu, 8 May 2025 00:04:32 +0900 Subject: [PATCH 41/44] =?UTF-8?q?[fix]:=20public/img=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../public/{ => assets}/img/boom-filled-green.png | Bin .../public/{ => assets}/img/boom-filled-red.png | Bin frontend/public/{ => assets}/img/tabler--boom.png | Bin frontend/public/img/tabler--boom.svg | 1 - frontend/src/Attendance.jsx | 6 +++--- frontend/src/Attendance.module.css | 3 +++ 6 files changed, 6 insertions(+), 4 deletions(-) rename frontend/public/{ => assets}/img/boom-filled-green.png (100%) rename frontend/public/{ => assets}/img/boom-filled-red.png (100%) rename frontend/public/{ => assets}/img/tabler--boom.png (100%) delete mode 100644 frontend/public/img/tabler--boom.svg diff --git a/frontend/public/img/boom-filled-green.png b/frontend/public/assets/img/boom-filled-green.png similarity index 100% rename from frontend/public/img/boom-filled-green.png rename to frontend/public/assets/img/boom-filled-green.png diff --git a/frontend/public/img/boom-filled-red.png b/frontend/public/assets/img/boom-filled-red.png similarity index 100% rename from frontend/public/img/boom-filled-red.png rename to frontend/public/assets/img/boom-filled-red.png diff --git a/frontend/public/img/tabler--boom.png b/frontend/public/assets/img/tabler--boom.png similarity index 100% rename from frontend/public/img/tabler--boom.png rename to frontend/public/assets/img/tabler--boom.png diff --git a/frontend/public/img/tabler--boom.svg b/frontend/public/img/tabler--boom.svg deleted file mode 100644 index 8c6b2eb..0000000 --- a/frontend/public/img/tabler--boom.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/Attendance.jsx b/frontend/src/Attendance.jsx index 7593b8c..36cff96 100644 --- a/frontend/src/Attendance.jsx +++ b/frontend/src/Attendance.jsx @@ -39,13 +39,13 @@ const Attendance = () => { )}
- +
- +
- +
diff --git a/frontend/src/Attendance.module.css b/frontend/src/Attendance.module.css index ea7f9d4..a6f3852 100644 --- a/frontend/src/Attendance.module.css +++ b/frontend/src/Attendance.module.css @@ -30,3 +30,6 @@ width: 100%; height: 100%; } +.attend_week_container { + margin-top: 20px; +} From f4720ab62f645e89233b1bc06153322e40a7e0ab Mon Sep 17 00:00:00 2001 From: Suhjung Park <145967352+Imggaggu@users.noreply.github.com> Date: Thu, 8 May 2025 00:09:27 +0900 Subject: [PATCH 42/44] Update main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 234cd69..69e3cdc 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,7 +23,7 @@ jobs: - name: Send Discord notification env: - DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK }} run: | curl -H "Content-Type: application/json" \ -X POST \ From 5a06c9dd5390cb91ab5354c9f1771fb2aaa495dd Mon Sep 17 00:00:00 2001 From: NamKyeongMin Date: Thu, 8 May 2025 00:25:08 +0900 Subject: [PATCH 43/44] =?UTF-8?q?[add]:=20Attendance=20base=20tool=20?= =?UTF-8?q?=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/public/assets/img/full_coin_green.png | Bin 0 -> 22100 bytes frontend/public/assets/img/one_coin_yellow.png | Bin 0 -> 15784 bytes frontend/public/assets/img/three_out_red.png | Bin 0 -> 18409 bytes frontend/public/assets/img/two_coin_yellow.png | Bin 0 -> 19564 bytes frontend/src/Attendance.jsx | 6 +++--- frontend/src/components/AttendanceWeekInfo.jsx | 9 +++++++++ .../componentsCss/AttendanceWeekInfo.css | 11 ++++++++++- 7 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 frontend/public/assets/img/full_coin_green.png create mode 100644 frontend/public/assets/img/one_coin_yellow.png create mode 100644 frontend/public/assets/img/three_out_red.png create mode 100644 frontend/public/assets/img/two_coin_yellow.png diff --git a/frontend/public/assets/img/full_coin_green.png b/frontend/public/assets/img/full_coin_green.png new file mode 100644 index 0000000000000000000000000000000000000000..7471e14f6b8199c90e04974ba1347dd5e4d91f43 GIT binary patch literal 22100 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 Tvv?N({!@}ye_AGM{`P+WJ)9~B literal 0 HcmV?d00001 diff --git a/frontend/public/assets/img/three_out_red.png b/frontend/public/assets/img/three_out_red.png new file mode 100644 index 0000000000000000000000000000000000000000..d2729d1de98fb8a4b241d4c03040119098130a01 GIT binary patch literal 18409 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 Oe;&xG$bz)Vi~k1{PB~`) literal 0 HcmV?d00001 diff --git a/frontend/public/assets/img/two_coin_yellow.png b/frontend/public/assets/img/two_coin_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..80650f25fa9f7ba562ab5894af616ad46328f92d GIT binary patch literal 19564 zcmeIaRb15F7e4x(agYH7QA$N%L~v*j6r=}`?v_SLNu`@X1r?=Bq@_VXx`#2476Iv0 z>8_#UY<&Oce9ry3I5$6UaG0HI?^VxwHm^0*><*B2lN1u5Q_((y7~87E6-vGQKqIMo)Y7kz^$xk4%S$ar|+>X22g zO>HZK^DE6vx#v+=;$o8IRDVrhzj%dk--72B?9U3z#0TvCn^)AaG`wV*PZLs7t#}2* z$=JLQdb0Pa$46DfUoIw^cqBA-y6L(P8WEPdZ6sU^eJ19Pag|1=#j6W~Ph}t&f)WD- zwUa!UvF?0v3G?qW1_4pP&wdX>aIj&Zyr~ZYR{woOLf6kBQCJ9$)X~5~8lPot+W-4V z3EeyYuLEUXIs{99_U1?Ie}kc*Cl~&8Kxs(9;20vh6!x2E{ZSZb>dJr9r9Xosu%tX9 z+H(J9$3pnq|5{)%L_|o4#@H?A?O6vb1jAbVpY@WGQbHUx^D0;WEguGlTK;PRr=dnc zI!}5M`Tuo*BcSmATKsP#|2q*%%>S;|nJWH&(UEEPsQ|qaK}XX(M>1MFyB6tYZLv{sNut> z>QBGPwk_?XDb&ow4NPSo21N;DT97m?i?OVV z_1y~MGW2znaOubUtE?8@ZLo|Rp35EKY%xVH8-Yt66@-Bi9mNOTyrYh8bC3SBXPKD7 z^4fQs$heTA>JIbcN|nOOull2kRMqZJ96~rUfW?0Crakt{e+VqtTSqUEp8f+`Mhu1N52j;C9V48z?t~wWHAP%=@2rl`T@oU%wQ;RR^SxF5yTabZk3{uz=Gu$`ZGZ?@$=*Gx zEsj|b@!qB>j2Q1Z&Y4d)0&c{qO~5H1;a730(%e&9wl^Hj&D%fyPQ{x@#Uk|BClObW z=GgdJ{~p(x)|$OF0&78qU8xoT6a2U*phSXbxa}1#CSjCQ&XS_{jQutdf`WyQqde{+)0WWVmT6UwO$N#5 zg~p({OA)%fO#`o=+F$rJV4J@-O~|!(PJN4iJ6i_>&mpE>${CO$qBXOSNm?b(^EDig z0Ai9k7u1OGTbXiEZRSl_u!>G4p@busZ>*CDDa7Vx=ira=7D4f(ue% zw~~=r!>_U*jk}=m6r6vv3B5>%hWQ}XL2UB2QN+rw^@CI`BsZG z&*7Khn9sB?Jj!U+dz!z7W=>9%_z%}%4<=yGZ&I#D zHQRK27*sq+5nI%zf+0p|*4;PfsooDBJ~gU4p91%l$9s#EPnXXQtXt~*Me&)YgXv?PH?6!3{FUX{~r;wLt98mZApRAd@{m*x;X z-N;l;B@`gp^f0fX`Ygm?egHG`R!L*@ZM8Q-2MoUctoGvjB@F7)Ua1O`{&d8 z=f+%UQPA`SmHlO+9J2}=Qy1sc%4oac2#hQOSSUQN<;m0hIV!; zYGu6G9h4A_q&6@w@02u`p*q!=z9q9922uVg(9N40nB4H)7F3+mw;fTTIXg|h!}zh& ziN!8^e488=iVVA{%TK#r`WbE8@oUs7KKW?Q#yHgliJ~mPE(mCC?}|yHj^US~UV5z? z7BHs#+d@(L|Per_AuS@Xv(jX8gx3!uPg zQs&RO>V`tT<8*@Cszl}Cn0lAx!FbHl_yIKTpRP5g@PH+Jdd|_> z-WJX+9GnZ>k<1~=Evi51bjTz4@~Q&F_WJ|vV^qAq#IZaF_E#*$dj#Qitq=m8AvGDIQ~=8X3xmJi@)Hq!B25GGS(1(r#RIcJ<>~P zVk3xMhAV4<)Shh~hgO?2K_`5L1knU$(RB~s z!C~KIe{a^qZ^oxwn;E}8Ppl4xGoXjsJjcdA-zF2FhNbf!@VMgTj>;j(NAFmsi}VshqlS+ADomR^X8CU6+;1 z5oO*7Y_t6E&m7-Ees{1dJ&{~*pUfR8Md!|ZF{?QajhT*Z*UH769Ym>92_Dxnxw9p+ zY~YFJy{>aW4@=)xPM$>gXPq+e9~K_TrEkKB?gc%;q9R}7eF}vVW;JVU?~*{WMp2l9 zjh+$v>4QPc2zirgsu%6awJL$ROQsnPX}q#RW|BBx@YC8H4C&!EVa8&X;;wr4f88dQUbY$C zd`;g+$Dv0A$CM6aej4}61hy-VpJ*=Rhj{6jE&Esqq|V}a&e58#FHBGeCv=e+st8oj zu~s)54Sf5^h<)K*yUP35%o;>6>BVJz;ho)~&DWmY0WbeJD?)51*W4Rrc#b{&No+x` z7K+j+dkIHEviI^x$Id03*p%KgHcTP9oP^SV2StlhV<5KAw-X1cYqpy%8t^2}y4Pq{ zE5Kij9GA$wW+X*H)C)`|pM8G!2A(+(%K04V_wJ?RXfe=lepWIM9?_M33g@LL0;=Fi zq_n94;+XoEnh)i7DZ)%oG9}i?tdXAEY>``m-0x z|07KJtjREPkF-#|0hMGpo-Yl}hx=y86M9DUr+w5ilCp$B?wdXe7w-}F`0`-$8oSg4 z5|ZLE3Qz?~BpdC|-gGJNEJ2Nxo1)TlHodawfP^xNjn({pGd(J^5@vO9SFB=e1mvT= zA_$K@5}U-To6j{Bm8CsY8U01YTbZ3C7+mwp$}E*~Fw0*2u=P*5RnK7k00w=2b}dOX zqw@+U?+eRg_An%W8Pf%ejZ^p-6RyP(E!nYZ#pRq~>v3j+I7 zk1IF8-)-ZQm|={zcRMrK;0(=^#?K*1OeBua{_pRzc4!lM+JLT{nVL<~cM{GrUHTz{ zQgDndXS{aP#C(%+nf{y(Zp+GhxEFX(X1FfRlcv!Sbn3N{Z4xM>=z-d?Po_t1mW2z) z{c@Xh*QtxR`kv zDtPjM(J~x3=9K9)Ec`50Pgf0s(ugsTt!q(71-mB+vV+eV;3af4AG09oxK#vyW>jou%?@_sbE(hb=3Sf5%^?t_BRl`pNh}_SIGN7 z>h^E{=PO`g=Aut-#4kB3!}!0Hv1g!3FA2-q zN>oFOJW{AScX)m8lq^FRjzJd2T0~6bjdL&LU4NN=2e>&62G}mEpxC8vzJ-)ff$M`+ z*PMww$Amj2e=evn0qM8O;aA+~8BeVRn>UN3q1M6b_5MapvcGlLoHva2EMA|#gu!V2 zXFy~=p`aI^l!SM#s6eef*j^9?V5~u?)yc*lTMofcHsVC z0}Mfm20A|${qtwQSq^sXtXl}^cHuUATp{SDZyE}^T??W#J4k{et(%9dW5Bm+b^^3O z!AwDHdcexlg|MN4%G7=zDVjYFXS($ag8vtANME{V4h`*ZCbcoWu|BqgdH=dVlp=8n zGlhrWI6VbP)I5c(xt=~Gop{0jOee-c2ujN zc=UK@WvAgPkPG7_wy#ZRF50aJaTNbIwP0eeHd->*{ZB%wP6eaU+K%oEKCOFKu1Tj) z!`o!uYGT&*Jkw`TQ0$R8xuws)@WAgN6<4Wt&>Yy8#y@rrIlY&z3dAi10U0G5D3sZ)W;4tPx@ITPkJS~e>J7S z!ISc83>5k!uwR&bJ`2rPU%0@rnb5YarP%Q-jgku7okgVO@d&eQ^i7ER@!j^mHzn8a z=|m6`+6nxMO`55Rx2b^jXv7$-ZLBpuL125C+8I*PBL;rF6J9{0PjWrno}B-O5WZ`K zVCFk|4zM!O?cQyYnMQg`3k^#V~;}f+;d6rfsVz0V<&W8#ra6jtysKWVd^!3xT?(UfJF0>A>wsmLFHS4=hw9BIjefm)L*)`|RA@XFICdbK~;{K{_#KKNcuPX3f(9)Oz^ zTmXLkap{jev6{xRbBvpmyLFceFbW{hX9s$88uVM}qJ$LLpXu8t(-sf+Z8|Uf`;vkK z1KnfO{7Da7`)<~JQS>gc_@(#qpc`eY9=LNwHkt+d+{fKomTS=q-m(j?CE(OkchAF( zD=NJdycSRI!`F^}Jgc-V`n> z1N)tR`0~8IV_nnvlzA-llVrxBW&LjDAe)v;_vyL=r*;uH?4;b`jpKmmiXYe2IfIz4 z$1?E2Q+c4C}neDsBYfi`hl0t|Ao=>~4?RVEm$ok}o(YpnwoWkozB+&2cOvy)I z4LC)}G3IOdPg^e%kHl)-7jLf~r)1f}gqUT!SHRCHWuT*7YcNwZ)#sQi9)=Zdpz&W}5n zFzIlhX@9uOA}Eetj+q%Z{FpzpH5lL?5ZFiD*+S>_6i$vFxyuTj0q*c@DzF$EMgNK& zwb~QUry?JK!2px=0st$tv_e8;-Jv$H^2&H@-kX#_-xQU6ZQf-qW{DhNl3CA;Yv9x4 z9~K90r(cLI7ncHrf;=M|oQ@`{r`!DgbIv>9eBDl8t@n&nPy6WYie{YqH+(x1;A8c_ zCi46>dg<#&Wz#d)mS*(MrI0$Fl@1tyfZUS(2C=vtj|^u2kG>3i|ImJn71;W?flrgW zd1B5HXLRaN3I+U1|8}IYS=2CjXl6-k&MGq9-ta!S$6qMH7&a+>6&}xxyH|e92Qv}u z5^;In;zC0k^no?yM$W&y1kHXYgaeOjR;%+$j5e>RuGYx*Vr=Aj z=532BLzhXL1G345gqZR=BH>u_yWKlcBSw}7#EP0ygvVqsMA_vhr?EcEC3hC&*~{V# z;<_p+fP0*fr`eTT>1I7vwUOukV|&8NUiW43Z(5S0X9f}0(iFGzqJ@28$3u~>%Olm{ zR9pj1IrZ*VX1RI)VS$CAJGu9q0{`7lI;$DI{3FO-I{3mN)$6%#5N5f^tY1zf9Ja z9Z)D#@^~-=`dK^{v`fYh?XA3_o&W6Z+2(d%g3F|2ByvHE-Y($Qnp(kS$b%>dgt-;P z$Zthxa-JWf2?t0WE&MiitT=MXg`QD8H8*Zi4pL~Yo=o|A0lInI9W$J;bz|X?Zh1Y; zlGfwj*@9z3J+IXYXwOC}4cZ?m(3d!(`_3Edmda90>h=d~@wSX?3{`G_m$&YFxbtaA z%#Iv0H0?U{;wp6Qcr9i*a7Ly#yP)_q(r3c@D}7U68%4o2$U|ty=zMtOJ{iq|SfVN0 z;4`&in8gjs8oX+Bah&Yn$j>1!M%NqAbOuN8HOMK-!CQjGByZ8Dgj{HHI55B(e`FbJ&Qi|1s}#1&(f=IXhxJ--XuSOa&f zjT-lz85q3>K@4-;aX2y}K(j^)?_L###HfY#bTM#3D3EJ$T;DtWs zo8&1lb-c`s(e)4hIOphX!k@IFf`rOrHr*@#-s$)8Le+9SIauC##EF2@@rAMP+p}!h zJK8eW{+f)VhoP8u*5R1{61=ZH83n6MpMJldzPnr>a1-kECox=;ibTN5U0GB3cS)Cn zFhN8)>IY_Vhwk1dB%8({s`z(Lq=+ETL^=CWmae2@YO*S;<+aiosx=-ZeFWBx^Y>Ex z^&*Ct+*UCXIGPIC>s{ulj}UCFRI;9o|DdZkIkc=qM|>p~itG-3K?4q@JHbI#f|?=E z@Ka16zXfosOA`lgo+;!~A=*%c|$gq&g85aln59SvJd zsT+=WsuS1->Ds2j=bvyqX%N} zXUkUeLwzhZF6Z04o^F%hEKX2n5ogua^x%1p_fVu~8Aa{;BnsO4cAppZ{(G^5ul8J5 z5ZDwcF)d`5l#QK$S_$XrodQ_WvO97(U?}>QhQhtpQuXLABj)D5&-i7p+Guk=$+gn_ zNpjd>@t6=>uTOIuNubMf@=3v-Ftt#=TfjW&BDoJM|jv z^5H89gde{+!utMiE`TxjCsuy-XP}$-!lkrQI7s46AAuPIWtnA z&?Xa;G;<)el7c7)Ye^F2_jZos#R2dFcoyIr9Ug*c*2g~*YGg5 zzr`%Ue|(wqGE^o+-uPh>XB))0D6Un?aO1Ja^=|@caYvmIvBN4)KBfMgt4})#6!GWZ zl~-HVyyGveuC`j%73w22T4ofpQZoah5zu9sWoAApU={y-^_;aTHVUzZiEj4 zE2dMZ-6v1SP&_elvm$fuN%PY*X6{JuG_l1PbXtEdquHk=U+uJMf2|7hgRRb8Cx3qK zcPFNOhpeNwB$aWgC;M4hMbTC4wR4U|CDrW?g=4vaxWnDHHSytr+-gOfx`cZ3sE2=w zA5%-;XtR&PY7$}EF==JNla)|Ib037=-O?|ppn>hQ>{h+muaQr6`|KU^_7mS0&T9Rj zublR#xgjRl(6iX}*HtQ=4UVKX#DDdn8$zX?#&O+)p%T7MoJRDcPxumguhJ2|<2_kU zE8lj^YC63Bc^UFluae3BcN1pM76{F7eH0m#-3A5x<{)htRsj!n0MGrO9 zR!W7Bt0}5+^E%d#uHDp`u%SLHDp$8CVR)!q%cG{B9pgJn4B(s`weZ#l02N|@IbUc{ z+f;Y6*{+gnoLuZeS6154dHf;8;O6O>0=U-_Xb!rtatD(v`9q5 zZotw4Hma9wOq=;56GuJ4m~S!fXGk%`w03d*Nx5$3$yFii-|?KRr`1&+s}pJ$6$9e? z(bvZ9gQ7r4s1EXAf3;%$X<<2vO5j+8V`avTm0XBWbOZ7<#|8aK-7B3MuJo*VbVEa~ zc1cAO)7&m|Rbvie7)rQ=*5NA^sUvm*V|os~W1hDMWorWkMm}NTa-q;^Mdr;PkN9@= zw{6`lHc9PoOuW}~rg$-QPy8kpj{~(+-;%61&$gd7_Jt%Vo=T0?z<;(`g&vDn`TZGB zx$Yupv2W{`ZEVwJJ^IDbqOLjQJ({MN_Zmpgg~_}urcM=34qYco?};L|IItvFVd;Iu zYA_jW$wFW?v#)+GJO6d(m?~BA(NuRMwl&(s-@n*{F~SJAe`lcQ(IK!1E((QG(EJZO z6Fb6enw!nMe8gh)j-yBGaPWFKwV9sKa*r{pW#N&GMFk(WM zEF4o!;oWD$6tG+7Ii#`WJ8t)IuI41{FH?!kt-#(D3H~dR-YwOVpE7211@dG`K&onR zR+#nO>uNpW!P^|J$$X!*B)q;js}ld%8;;3IcICF7jN9fZj4+cJ6fd8Un4g0!hy6at z%Q<=^`uNYu$CNw}01qR*EKuIAX}gF`Ys>O?Zugww6|VdUtO1w(YEsQfHVq;qDan<| zUh39zI(@id8-b-1zMXWg@TJ#j0J#$L&_fay988Pm(KHp!$1%- z##dyH4t?wF$9B8B4JCf|>-saPL+y{Fx0n-~1p>P;pB?TxkS+!{p?(+eyL6!Ogl}Tl zc}Fk!NMP-GWj77>If?tht~JvyxNib^xcl~P?5eCiwWm*CzFh5m^3?A=_vCibj|=hRYzXW!SNX>Z(+MAisW%3+ z;t#l)icGi$%@`f(QGshXS!+6j#{CGX9rZpWf@A7tcaxEss6e@eybbppNCX$SnfT#N*fdogu8w{ zu}Nx`cdZpWe(l>zoS+!v^w(Tah-bLtdUbI7ar4eYdPXzxgz=H#0eO3-_@#)EVWCg{ zxLXS{04%3^Fj?^ilR@NXImIH|_S&q3-7RzYj?g2*?52Z~JB}2VzBRiNVSDh3`7knt zPhub->fG9bJ#AV6+kv$y;f?-a6U*RB2d_UNe+Y8&$QL)KswpmT>*ZX6T%eH)=Nnz(|VMJhN*YPlUkP>naM5A{XO7wn-Y%rO=R$LQqYpV3w3Vb2v z49Bz<3XS`2ZdU6nd1RA^p(E^VT(;yK!?J#>gc2FBcssw?<6scnH}IWh7=4xuSG^he z98|l-j5a6Zm#SF_Gko_^tbeohCMzT&t#^k(urb{~TJPDXKjV>2F&bbs5)%)qg|~+3 z+Q0S98apK{ame=Qo>3XB$vtFHwy-Au9{91tiF1b``eY6vp2+pyvvDvaX|3~vj*vY_ z!1L1vhjK=z1G1Ux`MbWJ`)9TS-{~g>^@p*lPv93gOik~7ipw0YA~HWi7WJRA? zjPmFdGwA1c|ET!9v67+w2BJJ5Wvn^Xxp;AJ{!eaeW)cfGhfrU#O|_DBny&hqZk5|{ z#B76*C`#iAjAx61&rg8SX{7T?E9(nWN=UVOUxcDLdFbLqGubf~VC^z82C_ zoCI)u0vf4JN+jxWeY}&&1h+hW$Do19HQyt+tVeNHOhHlUW_O&{r;rYDSQpGhoxYiH4~iIDSoaCd@WfHhRK5Ss>~snsr0H0bjv1 z&avB{d3I=Lf4&If8!WOkaqU&FP0xuK*4WzB(qkW61&A%T;=^krY{Ollf0Af+{W=yc zJb{It%#LmE`Pp$Ix_+b=a&0ybT!W5{;bW$944{omp>rY6ltuR={Xm-f8-D5V4b?z zBB3bWn9H#y*KSgbxeS9>4ymAFt6MC zt#5LeGuD(du~+Ev#ZeJ6rKbsNa-X`d`hBj|5PjszLePu-AkZgxTugpfay;>Kod8gG z(bc!17<#zi4e!l>i)Jy8E8a#ZRt0IboA_k~yz;4{;0RYw!o6H;BRRdDo$PQMO~?gS zM5}Y4Y$+6qOks_i<%kq>qwKtNZ?MhX+_z80B~0;J%>IL=rHOqDaM#8euB6=Hr(9p6 z<^CBnN6yik{)oK&4x6)ofY13E_MUjGfBWL!5_|hWya(xQlbKmxU_7(Y)pxurRX5FV z39ED2zI3uqBR0xF?JG!2W!-MRR{nc-miq4S-C*oLgfc+G`uXOxOiQKOPD7^$Y5#Q( z_i?+gT~@+6JeG=Z%#DQL9Dw?#6W${PGSc0f@hugOE}d$}6l*q-H>xKA+>t-N+Qli{ z;~N+vqrrjxR~ABBOHp=O*1{v3U9>Y@;BCRN3cWvG8tnu=v?|OZW^vT}SpUm@Qtx9| zv})k}#w5q#BFUoU$<7!44(7P3{U{d(_JyeKsPG{|`Se^L)0i~X|0&`bjy^tQg|cWY z0}*vMBE{}Ui|Is7y+Bmz6c?GF1+ru4Nh&Y4)gZ~j@D#a%CnhZKx4xoWF?Iex-pbc# z(nAvot+baiozaak7&uO?w5ccF`9Ke&IyVAx#((830M@#h;0aGW)^HGkDej8GFod&!oD|aQC1jHCS#& z=mw;7LJ6JW|7=0n!#KmAhmtFMVUxU{9Ypwv;28OLR}uf_LI+KUeVlkmm}M32=XErI zV;(2OzdnPTS?TypN`_9_Lt2^)HWO$0#o-v9kJPg1AK(q7CbD$6zP_EiT5gH`Exc>n ztyb3}AdUa(wi*|L8YVsn7Y+v>jF1I`AZm8`X++sECJopaU{i4}UyqRn)TIq&Xt& z;r$4-r8U0=Epx48p5xV64&>-_-MSL~Zw=lEhivAi&iK1c4^o9`TyKG<16C!_x&mdM z3ESYBl8AW3!?Q&o5nSu!wGxhByCR6hUZxwOq3KfNLlUU|83t79ypK3!Ma+u#y(=)F z*f$@I={bd`D{~!QAE+=XEsmB=t2`JAWvy1ZkrrE7O5-RRR z=$);bfp&@nTMnCK*|(uN)UERC%NbtA3l5V}f^0d?`sx{g*G=9z$Si5LS`xiHCT95I z7M$S{+hJ0d8=|!H`5tMazn4E5upPMr5 zJXW6QnGs<6>MSX~uu+PC@yz1cr`)z5$S0d?Z(V<6QbI20dAvYg#z>~~3|h~_@VSf$ zP&eBs1>`i)Tu6;4X1IHf@<~E;b;As80|Z0uv8vn+GC!elB|`O!*x<@bRwU(~x_y{d zW|1_tZs{OwcM^XBJ!yQz>GPJM%b~Nsrzxp$zC$4=sD9T1=(}>6E=U#siw-}%l88s9vLy)6FvXCnSLhPPCzB#1H>^W zMR2;hBoMK#d&1+Dsmrx!eKPCfD-SMT2p5_E;Q+2rBB(|2KfF+dgrOp`Z$cGCixvPG z<;{)HYYC5BQc#p{zjN%q8Rf?FU6bo*W4x)=#x({ofsyM!R0*{Gigr57iq*kx*uQy&qG&Wg$9 zwFI}4tgh&B&OU2zv18$V?@jLjw-WMj=Skmjaqs$t{QR3U+I=}iQ&yt>o~K8g84LpK z2VuG7gy)a@8gYWh>4Za~D(~F<$Y4 z2Iy}2&)Pj>%2$wQ3%?jA@6W#$^9#KzA=~q8U@m1ciPenP)<4a!am%w$GHFmx;BfM> zmX?e3#716s-)?VA1VfSUaxd?k&!g@d{r&bJ8TWS#8H|$BG4BQAQh)I)sZfm$3>u=8 z{ir&wjt)0+Ww(_K{*ZTPrEA$_p@@igf*RYohx)N zI*#U~+7=$nI`>C68+A!Y>LO&Fe+?*HMjKWXdSdLc5`FmD_va#2a2Mz$-O0<~TMisG(W^1Oc1A2IK z!)TLD6}TR@9FR92WsFH`b*}ELw&NTK8?ImH<9N0x!Lk~RqD*x-zghT|8^7v)(76BJ zz^TI;@PlhGOKnjR1YH;M^ZYa?5u}zGn|1>4pr3V*`ty!ewC)8yn?CUa^}rh?&6zx4 zAM&7dcADEcVU`?D(ffLMa`flk=<|gHIRQF=fR8Z@a5fL0RvzrV5iq+;3iyZ_fJ0xS z5bAtk=@fl@5g=bx8j*MUG=o4z;9XWwIB7Oxr=%6(^+KGpxDN2_}gX_@JpJ2&Frs|LnbO>OZ&VwU_2yg z&{{L}+Cx%MEs?W7WgZN?7-KkhRyhjVQ5yxU^@}j)UnjG_^=*!}P*4A~*$i!tHql$I z-AQ?kc>pv2589E4N%YJ_@?IJvcmIALMF(@<4&45oKz{PvICReB*Rd0Qs+ZlwSB<72 z_(LLWltmiLQf(_@wc50i&kxI)+K;=yPSuC$avmwb ze}kD$nj(jNrKKl4OFW|bTTVHSy!p-{3T{kgK3Aq`NsC^1F=caoG?JUijQ&XM9fl(a z)UE(oS`7CR|BM^ftug|(`*sx%`nVQpibMXR8~#4{kP%J> z3Y52KPeTK)7R4+rFwiZ1!{(@W9GRSfK57?Qt^lex_f%i^Z6(Gf$?Vu$#wWZpWmTg2 zsB@SlrbUGnUaPvA@z-<#lI8VQbvo5c{Jt}LJ70E{pMywmYKd0TB&NrRg_UWh(O~;B z{k6aD3hnh@T;Chiz|6=0G{3hqA$q`ASE_Y0*1{dpK#x zNdw#wXT9;JpQ_QI*e1b7k2vx5|3eck=}b!}B1z~Iu0EX43Atdv9yEr#-@zPC5q%Ph-7tG1(>+wY|2+^Z4?kvEw}{`lWJ|KwidQV#Gp=n^ z%4z;2ri4{Ky-rO`&881cWnj-Strn-X9{I4>rSjoVFWewq7Fp;pMJ;4e&i#x^t=*oy zH2ag7UH7c1@b&N)LBi&xkA;ZtEmUW8XP*lGET~pqfI}CFDxOkOogcwiB#43Ua(icb z137Su%f>$-ybNrG>9gop>}XhYNfn^kuh3bjBdpO=g|rMg-i>Xd>nU73Yuyx%W=2mJ zn*8fYR}I>MB`4+6@_nwtR5114TGVRLF|dgJ85g2oa&eJ^BD3(e* z&&r@(W6jwUc^U-DaJ84Ut)dgjbkNYp)xZxv+_j$VMOWaGG12DfrFxiGcXLv`Izt3m zrNWF7i2P;@8hw`i`_Q{yb{f`wXy3=02}TxsCh!wjq59EP6taR-BN5{Br!n8S%x*Zy zLwo3ce=2A}W6C00uprk)WkBFNJ^hTu8c&~s$A34YDtiEz=mK=Bv=T(he$66Y(OfnDBf|sJ; zCFWsb8oH@^`fIf<$NqKaC|M&*ZKFHG<+4>4Z$5gy@u79-nSEI`Pvp7$^MIAC(qc)v z8Kiz_Iy=*DY3~M&sNJ^Ag_1bGo#0T1gL1!&u^dUGUuflks?jyem)&E}=loaCiHw!m z_eN8PU4UDO0h1x`Pwy^?4^ajQ zgT!VBzIC^9j;;5QmAtzry6Y@k--hRO7oc&iXM_s>+Z?D*fiO5;!ohEPkg?GA^Wn_F zO$tVUAf?}g=e%S&ds4-_)arFX%Nw+UQNWlOyc)#!e3h_gyM!!$;YY7Vt;UAID0X)->m;fv^yE9a2>5u(kgrR$-i zpRmuaRvSsvM{VXIA7iCacY;=p6!t4&LHZp>T`no_WW1F? zh^tAYlBV}j*|A30@E7d@Sx^dCT5>p%XX3R=A>|Y6#A8FXuNvS1N9c_wGE3i@8oW(z zk7SS`D0l#Qw??yo+t01%cW=Y=!=Pzlc!a9%+Z1pSZQ)BaquEt{M^v)*Zv!ary@Oy= z=F(S>Cjgs7|5uC{*OQE_{i|`=7XaocgD3bW`s?7lwJ=nWNk8TO7;v+!Tk8WeY0m0m9d(!Ch78ejAH^8Hu7n@Sw*P}+9TbJQ&W~NvVTNn(H zL&O-nL@FCl3m(qVQzP0zM$h&$^q}Y*+KwM*E^=XhgUBvSk1{V3t6IUcmBe#a&fvK7 zG{^8ZkSdIBY>->nPkqq~9TtfUq? ze9Pp91{V-u>A=kdr?aQLp~qacDYyFaqf?_gFaWvLhUXYf*BL~Oe_YuZT*-QUD0=tK zUlh2HaEyVT3&qxYR8UOT-kn6&hf{YHUv@wA6qHS;hc7V&JXlKNuQ!O%7TRLLIdQ=( z;#C1Zxr)ZoLPDZ!&%vNOF&h04wg2F!+*J=LlqgJplk2#o?Z{}cr_1BZH^*U`+{fG zoKD5;5?UlpV??dtQk>M=On$son5lHQQI7iF!TU$`ZSfH$;`5CEV4E}jp5Y3-&17;! z?cFV`;vxrw>QCOK!qacGQjMVD&A$N1e;T~D^(u&*$%#*i1yvS))(G(TXa9X z{`q^NE@mt~6CCe#>flR5oL8>1F0j>x$5%>7X7Gi@mqhupHp!Ryg3M!5d9|xh-U2+2 zG~LhXcnit{m(HHaBW{4VwlcrAIx<-#m7cm)bVfvv_7ttn$ScPqLUIwe6Mx*@S2kFB z5fI@wi&*oB_^`*wn&vwa3qunuaoV@0yaGkt_dqmalm__%sLq$6sQXtDS zJCki>7-yekY-EM2Bs4xQ%yCHKNe%n$s2%Ia;HbM6UNmyav46)lX?E99x3RQeQp!@MjYqO2YZGvEqA1q4omf)I62 zD!@bCvvR{VaE8~!cg|jO0by!@Pw8ax01g1q-~T%PPdNX(Isem+|6fhV-s#)`sTke< S1w9D-Q { )}
- +
- +
- +
diff --git a/frontend/src/components/AttendanceWeekInfo.jsx b/frontend/src/components/AttendanceWeekInfo.jsx index 4f80431..2bae09c 100644 --- a/frontend/src/components/AttendanceWeekInfo.jsx +++ b/frontend/src/components/AttendanceWeekInfo.jsx @@ -5,6 +5,15 @@ const AttendanceWeekInfo = ({ week }) => { return (

{week}주차

+
+ +
+
+ +
+
+ +
); }; diff --git a/frontend/src/components/componentsCss/AttendanceWeekInfo.css b/frontend/src/components/componentsCss/AttendanceWeekInfo.css index 23216da..458de9d 100644 --- a/frontend/src/components/componentsCss/AttendanceWeekInfo.css +++ b/frontend/src/components/componentsCss/AttendanceWeekInfo.css @@ -2,11 +2,12 @@ width: 270px; padding: 14px; border-radius: 20px; - background-color: #6e6e6e; + background-color: #434343; border: 1px solid #d9d9d9; margin-block: 20px; display: flex; align-items: center; + justify-content: space-around; } .weekInfo { font-weight: 600; @@ -14,3 +15,11 @@ color: #ffffff; font-family: "Inter", sans-serif; } +.coin_img_container { + width: 30px; + height: 30px; +} +.coin_img_container > img { + width: 100%; + height: 100%; +} From 4c29ddae538e52dcb8a432e991d549bb3877da22 Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Thu, 8 May 2025 00:28:15 +0900 Subject: [PATCH 44/44] [Fix] assignment api url --- .github/workflows/main.yml | 2 +- .gitignore | 1 - frontend/src/api/assignment.js | 3 +-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 234cd69..69e3cdc 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,7 +23,7 @@ jobs: - name: Send Discord notification env: - DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK }} run: | curl -H "Content-Type: application/json" \ -X POST \ diff --git a/.gitignore b/.gitignore index bf54333..53d4561 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,3 @@ .env *.pem .idea/ - diff --git a/frontend/src/api/assignment.js b/frontend/src/api/assignment.js index 1887f5e..4102105 100644 --- a/frontend/src/api/assignment.js +++ b/frontend/src/api/assignment.js @@ -1,6 +1,5 @@ import axios from "axios"; export const fetchAssignmentsByUser = async (userId) => { - const res = await axios.get(`/api/assignment/${userId}`); - return res.data; + const res = await axios.get(`/api/assignment/grouped/${userId}`); return res.data; };