From bbbc59e6918c2ca8b1ad6f925b27f183bbfe59ac Mon Sep 17 00:00:00 2001 From: yuraup Date: Fri, 4 Oct 2024 16:48:22 +0900 Subject: [PATCH 1/6] =?UTF-8?q?setting:=201=EC=A3=BC=EC=B0=A8=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "week01/[1\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274/[1\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" => "week01/\354\235\264\354\234\240\353\235\274/[1\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" (100%) diff --git "a/week01/[1\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274/[1\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" "b/week01/\354\235\264\354\234\240\353\235\274/[1\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" similarity index 100% rename from "week01/[1\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274/[1\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" rename to "week01/\354\235\264\354\234\240\353\235\274/[1\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" From 1055453f1895a6a17fb7354188705bd950dc28dd Mon Sep 17 00:00:00 2001 From: yuraup Date: Fri, 4 Oct 2024 16:53:57 +0900 Subject: [PATCH 2/6] =?UTF-8?q?docs:=202=EC=A3=BC=EC=B0=A8=20=EC=9D=B4?= =?UTF-8?q?=EB=A1=A0=20=ED=95=99=EC=8A=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0]\354\235\264\354\234\240\353\235\274.md" | 170 ++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/[2\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" diff --git "a/week02/\354\235\264\354\234\240\353\235\274/[2\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" "b/week02/\354\235\264\354\234\240\353\235\274/[2\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" new file mode 100644 index 0000000..eaac86f --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/[2\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" @@ -0,0 +1,170 @@ +## React 동작 방식 JSX + +### JSX + +웹은 HTML, CSS, JavaScript로 구축된다. 초기에는 HTML이 콘텐츠를, CSS가 디자인을, JS가 로직을 각각 담당했다. 하지만 웹이 점점 더 인터랙티브해지면서 JS가 DOM 조작과 UI 렌더링까지 맡게 되었다. JSX는 이러한 변화에 대응하여 등장한 문법으로, HTML과 유사한 문법을 JS 코드 내에서 사용할 수 있도록 설계되었다. 그리고 이와 함께 React도 등장하며, JSX를 사용하여 렌더링 로직과 마크업을 컴포넌트 내에서 함께 처리할 수 있게 되었다. + +> # +> +> ### JSX 정의: +> +> JS 파일 내부에 HTML과 유사한 마크업을 작성할 수 있는 JS의 확장 문법이다. +> +> - JavaScript와 XML을 조합해 가독성이 좋은 코드를 작성할 수 있게 해 준다. +> - Babel이 JSX를 JS로 변환해 주기 때문에 브라우저가 JSX 코드를 이해하고 실행할 수 있다. +> +> ### JSX 규칙: +> +> **1. 최상위 태그는 오직 하나** +> +> - JSX에서 여러 요소를 반환하기 위해서는 단일 부모 태그로 자식 태그들을 하나로 감싸야 한다. 즉, 여러 개의 태그들을 묶는 하나의 상위 요소가 필요하다는 뜻이다. +> - `
`태그나 React.Fragment를 사용해 여러 태그를 감싸는 방식이 일반적이다. ``는 `<>`로 줄여서 쓸 수 있다. +> +> ```JSX +> const element = ( +> +>
Hello World
+>
Goodbye World
+>
+> ); +> ``` +> +> **2. 모든 태그를 닫아야 한다.** +> +> - JSX 내에서 열린 태그를 작성하면 '닫는 태그'가 없다는 에러가 발생한다. +> - ``, `
` 와 같은 self-closing tag도 끝에 `/` 를 붙여야 한다. +> +> **3. 모든 프로퍼티의 이름은 카멜 케이스(CamelCase)로 작성한다.** +> +> - JSX는 JS에 가깝기 때문에 React DOM은 HTML 어트리뷰트 이름 대신 camelCase 프로퍼티 명명 규칙을 사용한다. +> - 예시:`className`,`onFocus`,`onMousedown` +> +> **4. JSX는 자바스크립트의 표현식을 포함할 수 있다.** +> +> - 중괄호 {}를 사용해 JavaScript 코드를 JSX 안에 삽입할 수 있다. +> +> ```JSX +> const name = "World"; +> const element =

Hello, {name}!

; +> ``` +> +> **5. 인라인 스타일 적용 시 객체를 사용한다.** +> +> ```JSX +>
Hello, there !
+> ``` +> +> ###### 인라인 스타일: 스타일 속성을 직접 태그의 속성으로 지정하는 방식이다. +> +> # + +## state와 props + +state와 props는 둘 다 컴포넌트의 데이터를 다루는 데 사용되지만, 목적과 사용 방법 등에서 차이점을 지닌다. + +> # +> +> ### State +> +> State(상태)는 컴포넌트에서 변경 가능한 데이터를 다루기 위한 객체이다. +> +> - 컴포넌트의 상태를 변경하거나 업데이트할 때 사용된다. +> - 읽기와 쓰기 모두 가능하다. +> - 컴포넌트 내부에서 값의 업데이트가 가능하지만 **불변성을 유지**해 줘야 하기 때문에 `setState()` (클래스형 컴포넌트) `useSate()` (함수형 컴포넌트)를 사용한다.
+> +> ###### 불변성: 메모리에서 직접 변경하지 않고, 기존값을 수정하지 않으면서 새 값을 만든다. +> +> #### 사용 이유: +> +> 변수는 값이 변경되더라도 React에서 자동으로 UI가 리렌더링되지 않는다. 반면, state는 값이 변경될 때마다 React가 해당 컴포넌트를 다시 렌더링하여 UI를 업데이트한다. 이를 더 쉽게 이해하기 위해, 일반 변수를 사용하여 계산기를 구현한다고 상상해 보자. 계산기에 `plus`, `minus` 버튼이 있다. 이 버튼들을 누를 때마다 숫자가 증가하거나 감소한다고 가정하자. 버튼을 누를 때마다 콘솔에서는 값이 변화된 것을 확인할 수 있지만, 화면에 그 변화가 반영되지 않는다면 이는 일반 변수를 사용했기 때문이다. React는 변수를 변경하더라도 그 변화가 화면에 반영되지 않는데, 이는 React가 상태 변화를 감지하지 않기 때문이다. 하지만 state는 값이 변경되었을 때 리렌더링이 되도록 구현되어 있기 때문에 UI가 자동으로 리렌더링된다. +> +> #### 사용 방법: +> +> 클래스형 컴포넌트에서는`this.state`를 통해 상태를 정의하고, `setState()`메서드를 통해 상태를 업데이트한다. +> 함수형 컴포넌트에서는 useSate라는 Hook으로 상태를 관리한다. +> +> ```JSX +> // useState +> const [state, setState] = useState(초기값); +> ``` +> +> # + +> # +> +> ### Props +> +> 부모 컴포넌트로부터 자식 컴포넌트로 데이터를 전달할 때 사용되는 매개변수 +> +> - props는 읽기 전용이기 때문에,자식 컴포넌트는 props 값을 변경할 수 없다. 따라서 props 값을 변경하고 싶다면 props를 전달한 부모 컴포넌트에서 변경하거나 state를 이용해 변경해야 한다. +> +> ```JSX +> // 부모 컴포넌트 +> import React from 'react'; +> import ChildComponent from './ChildComponent'; +> +> const ParentComponent = () => { +> return ( +>
+> +>
+> ); +> }; +> ``` +> +> ```JSX +> // 자식 컴포넌트 +> import React from 'react'; +> +> const ChildComponent = (props) => { +> return ( +>
+>

안녕하세요. {props.name} 님 !

+>
+> ); +> }; +> +> export default ParentComponent; +> //안녕하세요. 유라 님 ! +> ``` +> +> # + +> # +> +> ### state와 props 정리 +> +> 1. state와 props의 차이점
+> 둘 다 컴포넌트 간의 데이터 전달을 위한 속성이지만 둘의 목적이 다르다. state는 컴포넌트 내부의 상태를 관리하고 변경 시 컴포넌트가 리렌더링되도록 한다. 반면, props는 부모로부터 자식에게 값을 전달하고 이를 기반으로 컴포넌트를 리렌더링한다. +> 또한 변경 가능 여부에서도 state는 읽기와 쓰기가 모두 허용되지만, props는 읽기 전용이라는 점에서 차이가 있다. +> +> 2. state를 직접 변경하지 않고 setState를 사용하는 이유
+> 그 이유는 불변성과 관련이 있다. **state는 React 내장 객체**이기 때문에 이를 직접 변경할 경우 기존 객체의 참조에서는 변경사항이 반영되지 않는다. React가 변경 사항을 인지하기 위해서는 setState를 통해 state를 변경해야 한다. +> +> 3. setSate가 비동기적으로 작동하는 이유
+> 리렌더링과 관련이 있다. State값이 변경되면 React는 이를 감지하고 기존 Virtual DOM과 비교하여 변경사항을 반영한다. 하지만 State가 변경될 때마다 동기적으로 반영하게 되면 그때마다 리렌더링이 필요하고 이로 인해 애플리케이션 성능 저하가 일어날 수 있다. 따라서 setState는 변경된 state를 일괄 업데이트(batch update)하게끔 동작한다. +> +> # + +
+[참고자료] +
+- 기본 자료
+1.JSX:
+ +https://ko.legacy.reactjs.org/docs/introducing-jsx.html +
+ +2.State:
+https://ko.react.dev/learn/updating-objects-in-state + +3.Props:
+https://ko.react.dev/learn/passing-props-to-a-component + +- 추가 자료 + State & Props
+ https://valueengine.tistory.com/62
+ https://kindjjee.tistory.com/102 + +
+
From 53d81cfef9870d62aaccdbd9f494c09dacbacaff Mon Sep 17 00:00:00 2001 From: yuraup Date: Mon, 7 Oct 2024 16:29:15 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20=ED=88=AC=EB=91=90=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todo/.gitignore" | 24 + .../todo/README.md" | 8 + .../todo/eslint.config.js" | 38 + .../todo/index.html" | 13 + .../todo/package-lock.json" | 4109 +++++++++++++++++ .../todo/package.json" | 30 + .../todo/public/vite.svg" | 1 + .../todo/src/App.css" | 12 + .../todo/src/App.jsx" | 15 + .../todo/src/assets/react.svg" | 1 + .../src/components/TodoView/TodoView.css" | 50 + .../src/components/TodoView/TodoView.jsx" | 27 + .../components/TodoWriting/TodoWriting.css" | 31 + .../components/TodoWriting/TodoWriting.jsx" | 32 + .../todo/src/index.css" | 68 + .../todo/src/main.jsx" | 10 + .../todo/src/pages/TodoList.css" | 4 + .../todo/src/pages/TodoList.jsx" | 28 + .../todo/vite.config.js" | 7 + 19 files changed, 4508 insertions(+) create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/.gitignore" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/README.md" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/eslint.config.js" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/index.html" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/package-lock.json" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/package.json" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/public/vite.svg" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/src/App.css" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/src/App.jsx" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/src/assets/react.svg" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoView/TodoView.css" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoView/TodoView.jsx" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.css" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.jsx" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/src/index.css" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/src/main.jsx" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/src/pages/TodoList.css" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/src/pages/TodoList.jsx" create mode 100644 "week02/\354\235\264\354\234\240\353\235\274/todo/vite.config.js" diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/.gitignore" "b/week02/\354\235\264\354\234\240\353\235\274/todo/.gitignore" new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/.gitignore" @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/README.md" "b/week02/\354\235\264\354\234\240\353\235\274/todo/README.md" new file mode 100644 index 0000000..f768e33 --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/README.md" @@ -0,0 +1,8 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/eslint.config.js" "b/week02/\354\235\264\354\234\240\353\235\274/todo/eslint.config.js" new file mode 100644 index 0000000..238d2e4 --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/eslint.config.js" @@ -0,0 +1,38 @@ +import js from '@eslint/js' +import globals from 'globals' +import react from 'eslint-plugin-react' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' + +export default [ + { ignores: ['dist'] }, + { + files: ['**/*.{js,jsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + settings: { react: { version: '18.3' } }, + plugins: { + react, + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...js.configs.recommended.rules, + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + ...reactHooks.configs.recommended.rules, + 'react/jsx-no-target-blank': 'off', + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +] diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/index.html" "b/week02/\354\235\264\354\234\240\353\235\274/todo/index.html" new file mode 100644 index 0000000..0c589ec --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/index.html" @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +
+ + + diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/package-lock.json" "b/week02/\354\235\264\354\234\240\353\235\274/todo/package-lock.json" new file mode 100644 index 0000000..c56ec59 --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/package-lock.json" @@ -0,0 +1,4109 @@ +{ + "name": "todo", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "todo", + "version": "0.0.0", + "dependencies": { + "prop-types": "^15.8.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.26.2" + }, + "devDependencies": { + "@eslint/js": "^9.11.1", + "@types/react": "^18.3.10", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.2", + "eslint": "^9.11.1", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.12", + "globals": "^15.9.0", + "vite": "^5.4.8" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", + "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", + "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz", + "integrity": "sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz", + "integrity": "sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", + "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", + "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "dev": true, + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "dev": true, + "dependencies": { + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@remix-run/router": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz", + "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.3.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", + "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz", + "integrity": "sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001667", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", + "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.32", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.32.tgz", + "integrity": "sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", + "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.12.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.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", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz", + "integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.1.0-rc-fb9a90fa48-20240614", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz", + "integrity": "sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz", + "integrity": "sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "dev": true, + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.10.0.tgz", + "integrity": "sha512-tqFIbz83w4Y5TCbtgjZjApohbuh7K9BxGYFm7ifwDR240tvdb7P9x+/9VvUKlmkPoiknoJtanI8UOrqxS3a7lQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz", + "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==", + "dependencies": { + "@remix-run/router": "1.19.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz", + "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==", + "dependencies": { + "@remix-run/router": "1.19.2", + "react-router": "6.26.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", + "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/package.json" "b/week02/\354\235\264\354\234\240\353\235\274/todo/package.json" new file mode 100644 index 0000000..45308e9 --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/package.json" @@ -0,0 +1,30 @@ +{ + "name": "todo", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "prop-types": "^15.8.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.26.2" + }, + "devDependencies": { + "@eslint/js": "^9.11.1", + "@types/react": "^18.3.10", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.2", + "eslint": "^9.11.1", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.12", + "globals": "^15.9.0", + "vite": "^5.4.8" + } +} diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/public/vite.svg" "b/week02/\354\235\264\354\234\240\353\235\274/todo/public/vite.svg" new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/public/vite.svg" @@ -0,0 +1 @@ + \ No newline at end of file diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/App.css" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/App.css" new file mode 100644 index 0000000..346da8a --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/App.css" @@ -0,0 +1,12 @@ +#root { + max-width: 100%; + margin: 0 auto; + padding: 1rem; + text-align: center; +} + +.AppWrapper { + width: 100%; + height: 100vh; + color: #000000; +} diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/App.jsx" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/App.jsx" new file mode 100644 index 0000000..5597b3e --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/App.jsx" @@ -0,0 +1,15 @@ +import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; +import "./App.css"; +import Todo from "./pages/TodoList.jsx"; + +const App = () => { + return ( + + + } /> + + + ); +}; + +export default App; diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/assets/react.svg" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/assets/react.svg" new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/assets/react.svg" @@ -0,0 +1 @@ + \ No newline at end of file diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoView/TodoView.css" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoView/TodoView.css" new file mode 100644 index 0000000..1855507 --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoView/TodoView.css" @@ -0,0 +1,50 @@ +.ListWrapper { + width: 500px; + height: 380px; + + margin: 10px 0 0 0; + padding: 10px; + border-radius: 20px; + background-color: #76b8ff; +} + +.TodoBox { + height: 270px; + overflow: scroll; +} + +.TodoBox::-webkit-scrollbar { + width: 1px; + background: none; +} + +.title { + padding: 20px; + font-size: 16px; + font-weight: 600; +} + +.TodoRow { + width: 80%; + display: flex; + justify-content: space-between; + align-items: center; + + padding: 10px 30px; + margin: 20px auto; + background-color: #fff; + border-radius: 20px; +} + +.TodoName { + font-size: 16px; + font-weight: 600; +} + +.TodoDeleteBtn { + background-color: #fff; + border: none; +} +.TodoDeleteBtn:hover { + background-color: #e7ebff; +} diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoView/TodoView.jsx" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoView/TodoView.jsx" new file mode 100644 index 0000000..a600874 --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoView/TodoView.jsx" @@ -0,0 +1,27 @@ +import "./TodoView.css"; +import PropTypes from "prop-types"; + +const TodoView = ({ todos, deleteTodo }) => { + return ( +
+

✨ Today's todo ✨

+
+ {todos.map((todo, index) => ( +
+

{todo}

+ +
+ ))} +
+
+ ); +}; + +TodoView.propTypes = { + todos: PropTypes.arrayOf(PropTypes.string).isRequired, + deleteTodo: PropTypes.func.isRequired, +}; + +export default TodoView; diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.css" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.css" new file mode 100644 index 0000000..51f6c6f --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.css" @@ -0,0 +1,31 @@ +.writingWrapper { + width: 100%; + height: 100px; + + display: flex; + justify-content: space-evenly; + align-items: center; + + background-color: #76b8ff; + border-radius: 20px; +} + +.TodoInput { + width: 300px; + padding: 10px; + font-size: 16px; + border: 1px solid #ccc; + border-radius: 4px; + outline: none; +} +.TodoInput:focus { + border-color: #fff; +} + +.AddBtn { + background-color: #fff; + border: none; +} +.AddBtn:hover { + background-color: #e7ebff; +} diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.jsx" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.jsx" new file mode 100644 index 0000000..a8fc463 --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.jsx" @@ -0,0 +1,32 @@ +import { useState } from "react"; +import PropTypes from "prop-types"; +import "./TodoWriting.css"; + +const TodoWriting = ({ addTodo }) => { + const [content, setContent] = useState(""); + + const PlusTodo = () => { + addTodo(content); + setContent(""); + }; + + return ( +
+ setContent(e.target.value)} + placeholder="오늘의 할 일을 입력해주세요" + /> + +
+ ); +}; + +TodoWriting.propTypes = { + addTodo: PropTypes.func.isRequired, +}; + +export default TodoWriting; diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/index.css" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/index.css" new file mode 100644 index 0000000..6119ad9 --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/index.css" @@ -0,0 +1,68 @@ +:root { + font-family: Inter, 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/week02/\354\235\264\354\234\240\353\235\274/todo/src/main.jsx" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/main.jsx" new file mode 100644 index 0000000..89f91e5 --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/main.jsx" @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import App from './App.jsx' +import './index.css' + +createRoot(document.getElementById('root')).render( + + + , +) diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/pages/TodoList.css" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/pages/TodoList.css" new file mode 100644 index 0000000..99b7438 --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/pages/TodoList.css" @@ -0,0 +1,4 @@ +.Title { + font-size: 30px; + font-weight: 900; +} diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/pages/TodoList.jsx" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/pages/TodoList.jsx" new file mode 100644 index 0000000..e21f848 --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/pages/TodoList.jsx" @@ -0,0 +1,28 @@ +import { useState } from "react"; +import TodoWriting from "../components/TodoWriting/TodoWriting"; +import TodoView from "../components/TodoView/TodoView"; +import "./TodoList.css"; + +const Todo = () => { + const [todoList, setTodoList] = useState([]); + + const addTodo = (newTodo) => { + if (newTodo.trim() != "") { + setTodoList([...todoList, newTodo]); + } + }; + + const deleteTodo = (indexToDelete) => { + setTodoList(todoList.filter((_, index) => index !== indexToDelete)); + }; + + return ( + <> +

오늘의 할 일

+ + + + ); +}; + +export default Todo; diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/vite.config.js" "b/week02/\354\235\264\354\234\240\353\235\274/todo/vite.config.js" new file mode 100644 index 0000000..5a33944 --- /dev/null +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/vite.config.js" @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) From 4388da527415563475bfc21f561581cebd73acc9 Mon Sep 17 00:00:00 2001 From: yuraup Date: Tue, 8 Oct 2024 22:57:59 +0900 Subject: [PATCH 4/6] =?UTF-8?q?docs:=202=EC=A3=BC=EC=B0=A8=20=EC=9D=B4?= =?UTF-8?q?=EB=A1=A0=20=ED=95=99=EC=8A=B5=20=EC=BD=94=EB=93=9C=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0]\354\235\264\354\234\240\353\235\274.md" | 192 +++++++++++++++--- 1 file changed, 169 insertions(+), 23 deletions(-) diff --git "a/week02/\354\235\264\354\234\240\353\235\274/[2\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" "b/week02/\354\235\264\354\234\240\353\235\274/[2\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" index eaac86f..1a6c3b5 100644 --- "a/week02/\354\235\264\354\234\240\353\235\274/[2\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" +++ "b/week02/\354\235\264\354\234\240\353\235\274/[2\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" @@ -1,3 +1,25 @@ +## 서론: React를 공부하는 이유 + +> # +> +> 프론트엔드 라이브러리나 프레임워크를 사용하는 주된 이유 중 하나는 UI를 자동으로 업데이트해주기 때문에 UI를 빠르게 업데이트할 수 있다는 점 때문이다. 하지만 그중에서도 많은 사람들이 React를 선호하는 이유가 있다. 본격적으로 리액트를 공부하기 전에 리액트의 장단점을 토대로 리액트를 사용해야 하는 이유를 정리했다. +> +> **장점** +> +> 1. 높은 수용성 +> React는 가볍고 유연한 라이브러리라서 필요한 부분에만 선택적으로 적용할 수 있다. 이는 기존 코드를 크게 변경하지 않고도 기존 프로젝트에 React를 점진적으로 도입할 수 있게 한다. +> 2. 높은 접근성 +> 각기 고유한 템플릿 문법을 사용하는 Angular, Vue와 달리 리액트는 JavaScript 기반의 문법이기 때문에 JavaScript에 익숙한 개발자들에게 접근성이 높다. +> 3. 큰 생태계 +> 특히 React는 Virtual DOM을 사용한 대표적인 선두주자로, 매우 큰 생태계를 형성하고 있기 때문에 다양한 라이브러리, 도구, 커뮤니티의 자원을 사용하기 용이하다. +> 4. 크로스 플랫폼 개발 +> React Native를 통해 웹 애플리케이션뿐만 아니라 모바일 애플리케이션까지 동일한 기술 스택으로 개발할 수 있다. +> 하지만 단점도 존재하는데, +> 5. 컴포넌트 기반의 아키텍처 +> 컴포넌트 단위로 개발하기 때문에 많은 코드를 재사용할 수 있다. 이러한 재사용 가능한 컴포넌트는 생산성과 유지 보수를 용이하게 하여 React 의 큰 이점으로 작용한다.
>
하지만 **React의 단점**도 존재하는데, 대표적인 단점은 큰 단점 중 하나는 SEO(검색엔진 최적화)에 불리하다는 것이다. React는 단일 페이지 애플리케이션(SPA) 방식으로 작동하기 때문에, 웹 페이지가 처음 로드될 때 클라이언트 측에서 렌더링되면서 SEO 최적화가 어려울 수 있다. 하지만 이는 SSR(Server side rendering)과 meta-tag 사용, pre-rendering 도입 등의 방식으로 극복이 가능하기 때문에 위의 장점들로 충분히 단점을 상쇄할 수 있다고 생각한다. +> +> # + ## React 동작 방식 JSX ### JSX @@ -13,6 +35,19 @@ > - JavaScript와 XML을 조합해 가독성이 좋은 코드를 작성할 수 있게 해 준다. > - Babel이 JSX를 JS로 변환해 주기 때문에 브라우저가 JSX 코드를 이해하고 실행할 수 있다. > +> **추가:** +> Babel(바벨)에 대하여 +> +> - 정의: JS 코드를 변환하는 트랜스컴파일러 +> - 사용 이유: +> 1. JSX를 브라우저가 바로 이해할 수 없어서 +> 2. 최신 JS 문법을 구버전으로 변환하기 위해 +> - 장점: 호환성을 향상시킨다. +> - 바벨을 사용하면 최신 JS 문법(ES6 이상)으로 개발해도 ES5 이하의 문법으로 변환하여 오래된 브라우저에서도 작동한다. +> - ECMAScript 2020까지의 기능들도 별도의 세팅 없이 지원한다. +> +> ##### transpiler 트랜스컴파일러: 인풋과 아웃풋이 비슷한 레벨의 언어일 때 사용한다. 즉, 서로 다른 언어를 변환해 주는 컴파일러와 달리, 유사한 두 언어 사이에서 변환할 때 사용한다. 같은 레벨일 때 변환하는 이유는 주로 구형 버전 차이 때문이다. ex) JS -> JS 변환 +> > ### JSX 규칙: > > **1. 최상위 태그는 오직 하나** @@ -64,35 +99,69 @@ state와 props는 둘 다 컴포넌트의 데이터를 다루는 데 사용되 > # > -> ### State +> ### state > > State(상태)는 컴포넌트에서 변경 가능한 데이터를 다루기 위한 객체이다. > > - 컴포넌트의 상태를 변경하거나 업데이트할 때 사용된다. > - 읽기와 쓰기 모두 가능하다. -> - 컴포넌트 내부에서 값의 업데이트가 가능하지만 **불변성을 유지**해 줘야 하기 때문에 `setState()` (클래스형 컴포넌트) `useSate()` (함수형 컴포넌트)를 사용한다.
+> - 초기값이 지정되지 않으면 `undefined`로 설정되기 때문에 이 상태에서 해당 값을 사용하려고 하면 오류가 발생한다. 따라서 초기값을 지정하는 것이 중요하다. +> +> - 컴포넌트 내부에서 값의 업데이트가 가능하다. 하지만 **불변성을 유지**해 줘야 하기 때문에 `setState()` (클래스형 컴포넌트) `useState()` (함수형 컴포넌트)를 사용해서 값을 변경한다.
+> - state가 불변성을 유지하려면, 항상 새로운 객체를 생성하고 이전 state 값을 복사해 변경된 값을 인수로 할당해야 한다. `setState` 함수는 인수로 새로운 값을 할당하여 이전 객체와 다른 참조 주소를 가진다. 이를 통해 React는 이전 state와 새로운 state가 서로 다른 참조 주소를 가지고 있음을 인식하여 변경된 값을 올바르게 변경한다. 이 과정에서 새 객체를 만들기 위해 `...(스프레드 연산자)`가 사용될 수 있다. 이와 관련된 예시 코드는 다음과 같다. +> +> ```JSX +> // 클래스형 컴포넌트 사용 예시 +> `const arr = [1,2,3] +> const [value,setValue] = useState(arr) +> setValue([...value,4]) +> ``` +> +> 이처럼 스프레드 연산자를 사용해 이전 값을 복사하고 새로운 값을 추가할 수 있다. +> 그 외, `map`, `filter` 등의 배열 메서드를 사용하여 새로운 배열을 생성해 원본 배열을 유지하고 React가 변화를 감지할 수 있다. +> 혹은 불변성을 지원하는 라이브러리(ex. Immutable.js)를 사용하는 방법도 있다. > > ###### 불변성: 메모리에서 직접 변경하지 않고, 기존값을 수정하지 않으면서 새 값을 만든다. > -> #### 사용 이유: +> #### state를 사용하는 이유: > -> 변수는 값이 변경되더라도 React에서 자동으로 UI가 리렌더링되지 않는다. 반면, state는 값이 변경될 때마다 React가 해당 컴포넌트를 다시 렌더링하여 UI를 업데이트한다. 이를 더 쉽게 이해하기 위해, 일반 변수를 사용하여 계산기를 구현한다고 상상해 보자. 계산기에 `plus`, `minus` 버튼이 있다. 이 버튼들을 누를 때마다 숫자가 증가하거나 감소한다고 가정하자. 버튼을 누를 때마다 콘솔에서는 값이 변화된 것을 확인할 수 있지만, 화면에 그 변화가 반영되지 않는다면 이는 일반 변수를 사용했기 때문이다. React는 변수를 변경하더라도 그 변화가 화면에 반영되지 않는데, 이는 React가 상태 변화를 감지하지 않기 때문이다. 하지만 state는 값이 변경되었을 때 리렌더링이 되도록 구현되어 있기 때문에 UI가 자동으로 리렌더링된다. +> 변수는 값이 변경되더라도 React에서 자동으로 UI가 리렌더링되지 않는다. 반면, state는 값이 변경될 때마다 React가 해당 컴포넌트를 다시 렌더링하여 UI를 업데이트한다. 이를 더 쉽게 이해하기 위해, 일반 변수를 사용하여 계산기를 구현한다고 상상해 보자. 계산기에 `plus`, `minus` 버튼이 있다. 이 버튼들을 누를 때마다 숫자가 증가하거나 감소한다고 가정하자. 버튼을 누를 때마다 콘솔에서는 값이 변화된 것을 확인할 수 있지만, 화면에 그 변화가 반영되지 않는다면 이는 일반 변수를 사용했기 때문이다. React는 변수를 변경하더라도 그 변화가 화면에 반영되지 않는데, 이는 React가 상태 변화를 감지하지 않기 때문이다. 하지만 state는 값이 변경되었을 때 리렌더링이 되도록 구현되어 있기 때문에 UI가 자동으로 리렌더링된다.
> > #### 사용 방법: > -> 클래스형 컴포넌트에서는`this.state`를 통해 상태를 정의하고, `setState()`메서드를 통해 상태를 업데이트한다. -> 함수형 컴포넌트에서는 useSate라는 Hook으로 상태를 관리한다. +> 클래스형 컴포넌트에서는`this.state`를 통해 상태를 정의하고, `this.setState()`메서드를 통해 상태를 업데이트한다. +> 함수형 컴포넌트에서는 `useState`라는 Hook으로 상태를 관리한다. > > ```JSX -> // useState +> // 클래스형 컴포넌트 사용 예시 +> this.state = { // 초기 state 설정 +> increaseNum: 0, +> decreaseNum: 0, +> }; +> this.setState({ //state 변경 +> increaseNum : increaseNum + 1, +> decreaseNum : decreaseNum - 1 +> }); +> // 함수형 컴포넌트 사용 예시 > const [state, setState] = useState(초기값); > ``` > +> **state 응용 학습** +> +> 1. state를 직접 변경하지 않고 setState를 사용하는 이유
+> 그 이유는 불변성과 관련이 있다. **state는 React 내장 객체**이기 때문에 이를 직접 변경할 경우 기존 객체의 참조에서는 변경사항이 반영되지 않는다. React가 변경 사항을 인지하기 위해서는 setState를 통해 state를 변경해야 한다. +> +> 2. setSate가 비동기적으로 작동하는 이유
+> 리렌더링과 관련이 있다. State값이 변경되면 React는 이를 감지하고 기존 Virtual DOM과 비교하여 변경사항을 반영한다. 하지만 State가 변경될 때마다 동기적으로 반영하게 되면 그때마다 리렌더링이 필요하고 이로 인해 애플리케이션 성능 저하가 일어날 수 있다. 따라서 setState는 변경된 state를 일괄 업데이트(batch update)하게끔 동작한다.
하지만 setState는 비동기적으로 동작하기 때문에 setState 호출 직후에 새로운 값이 state에 반영되지 않는 경우도 있다. 이러한 한계를 극복하기 위해서는 인자를 함수 형태로 넘겨주는 방식이 권장된다. setState의 인자로 함수를 넘기면 함수의 인자값은 항상 최신 값으로 처리할 수 있다. +> +> 3. setState가 useState 내부의 최신 값을 계속 확인할 수 있는 방법
+> 클래스형 컴포넌트는 render() 메서드를 통해 상태 변경을 감지할 수 있다. 하지만 함수형 컴포넌트는 렌더링이 발생하면 함수 자체가 재호출된다. 따라서 상태 관리 시 함수가 호출되기 이전의 상태를 기억하고 있어야 한다. 그리고 useState는 이 문제를 클로저를 통해 해결한다. +> > # > # > -> ### Props +> ### props > > 부모 컴포넌트로부터 자식 컴포넌트로 데이터를 전달할 때 사용되는 매개변수 > @@ -100,49 +169,111 @@ state와 props는 둘 다 컴포넌트의 데이터를 다루는 데 사용되 > > ```JSX > // 부모 컴포넌트 -> import React from 'react'; +> import React, {useState} from 'react'; > import ChildComponent from './ChildComponent'; > > const ParentComponent = () => { +> const [count, setCount] = useState(0); //부모가 상태를 관리하고 있다. +> const handleClick = () => { //setState를 감싼 콜백함수를 만든다. +> setCount(prev => prev + 1); //상태 업데이트 +> }; > return ( >
-> +> >
> ); > }; +> export default ParentComponent; > ``` > > ```JSX > // 자식 컴포넌트 > import React from 'react'; > -> const ChildComponent = (props) => { +> const ChildComponent = ({handleClick}) => { > return ( >
->

안녕하세요. {props.name} 님 !

+> //전달받은 props를 사용했다. >
> ); > }; > -> export default ParentComponent; -> //안녕하세요. 유라 님 ! +> export default ChildComponent; > ``` > +> **props 응용 학습** +> +> 1. 심층 계층 구조에서 제일 마지막 자손까지 props를 일일이 넘겨도 될까? +> +> - 이러한 현상을 **props drilling** 이라고 한다. 여러 계층의 컴포넌트를 거쳐 데이터를 전달하는 방식으로, 이러한 방식은 코드의 복잡성이 증가하여 가독성이 좋지 않고 유지보수에도 용이하지 않다. +> - 해결 방법: +> +> 1. **전역 상태 관리**
이때는 Context API 혹은 Redux나 Recoil 등의 라이브러리를 사용할 수 있다.
+> +> 2. **props.children** 사용
children props는 컴포넌트에게 자식 컴포넌트를 포함시키는 방법으로, 태그와 태그 사이의 모든 내용을 표시하기 위해 사용되는 특수한 props이다. 상태를 직접 관리하지 않고 컴포넌트 간의 데이터를 전달하거나 재사용 가능한 컴포넌트 패턴을 구성할 때 유용하다. +> +> 2. props에 setState를 넘겨 줘도 될까?
+> setState를 직접 props로 넘기는 건 좋지 않다. 부모와 자식 컴포넌트 간에 동일한 상태 공유가 필요할 경우, 혹은 자식 간에 동일한 상태를 공유해야 할 경우에 이러한 로직이 생길 수 있다.
하지만 함수 하나에는 하나의 책임만 부여하는 것이 좋은 것처럼, 컴포넌트도 책임을 분리할 필요가 있다. 이를 단일 책임 원칙이라고 하는데, 만약 자식 컴포넌트가 setState 함수를 props로 전달받을 경우, 해당 자식 컴포넌트는 부모 컴포넌트의 책임까지 지게 된다. 상태 변경을 할 때는 부모 컴포넌트에서 처리를 하는 것이 일반적인데, 만약 자식 컴포넌트가 상태를 변경하게 되면 컴포넌트의 복잡성이 증가하고 자식 컴포넌트는 부모 컴포넌트에 큰 의존성을 갖게 된다. 이러한 의존성은 컴포넌트의 재사용성을 저하함으로 코드의 모듈화를 유지할 수 없게 만든다. 따라서 **setState를 콜백함수로 감싸서 props로 넘기고 자식 컴포넌트에서는 콜백함수를 필요한 부분에서 호출**만 할 수 있게 하는 방식이 좋다. +> 3. props에서 구조 분해 할당을 어떻게 적용할 수 있을까? +> +> - 구조분해할당? +> 말 그대로 구조를 분해하고 할당하는 것.
구조분해를 통해 배열이나 객체에서 요소나 프로퍼티(key, value)를 분해하고, 이를 새로운 변수에 담을 수 있다. +> +> ```JSX +> //일반적인 props 사용법 +> import React from 'react'; +> const Greeting = (props) => { +> return ( +>
+>

안녕하세요. {props.name} 님

+>

당신의 나이는 {props.age} 살입니다.

+>
+> ); +> }; +> +> export default Greeting; +> +> ``` +> +> props를 통해 접근하는 방식은 props 키워드를 계속 사용해야 하기 때문에 가독성이 좋지 않다. +> +> ```JSX +> //구조 분해 할당을 사용한 방식 +> import React from 'react'; +> const Greeting = ({ name, age }) => { +> return ( +>
+>

안녕하세요. {name} 님

+>

당신의 나이는 {age} 살입니다.

+>
+> ); +> }; +> +> export default Greeting; +> +> ``` +> +> 이렇게 구조 분해 할당을 사용하면 props 객체에서 필요한 값만 추출해 바로 사용할 수 있다. 이러한 방식은 가독성을 높이고 중복된 참조가 줄어든다. +> > # > # > -> ### state와 props 정리 +> ### state와 props의 차이점
> -> 1. state와 props의 차이점
-> 둘 다 컴포넌트 간의 데이터 전달을 위한 속성이지만 둘의 목적이 다르다. state는 컴포넌트 내부의 상태를 관리하고 변경 시 컴포넌트가 리렌더링되도록 한다. 반면, props는 부모로부터 자식에게 값을 전달하고 이를 기반으로 컴포넌트를 리렌더링한다. -> 또한 변경 가능 여부에서도 state는 읽기와 쓰기가 모두 허용되지만, props는 읽기 전용이라는 점에서 차이가 있다. +> 둘 다 컴포넌트 간의 데이터 전달을 위한 속성이지만 둘의 목적이 다르다. state는 컴포넌트 내부의 상태를 관리하고 변경 시 컴포넌트가 리렌더링되도록 한다. 반면, props는 부모로부터 자식에게 값을 전달하고 이를 기반으로 컴포넌트를 리렌더링한다. +> 또한 변경 가능 여부에서도 state는 읽기와 쓰기가 모두 허용되지만, props는 읽기 전용이라는 점에서 차이가 있다. > -> 2. state를 직접 변경하지 않고 setState를 사용하는 이유
-> 그 이유는 불변성과 관련이 있다. **state는 React 내장 객체**이기 때문에 이를 직접 변경할 경우 기존 객체의 참조에서는 변경사항이 반영되지 않는다. React가 변경 사항을 인지하기 위해서는 setState를 통해 state를 변경해야 한다. +> # +> +> ### 추가 공부 +> +> 렌더링 최적화는 리액트 애플리케이션의 성능을 결정짓는 중요한 요소이기 때문에 중요한데, +> 참고로 리액트가 리렌더링되는 조건은 다음과 같이 세 가지가 존재한다. > -> 3. setSate가 비동기적으로 작동하는 이유
-> 리렌더링과 관련이 있다. State값이 변경되면 React는 이를 감지하고 기존 Virtual DOM과 비교하여 변경사항을 반영한다. 하지만 State가 변경될 때마다 동기적으로 반영하게 되면 그때마다 리렌더링이 필요하고 이로 인해 애플리케이션 성능 저하가 일어날 수 있다. 따라서 setState는 변경된 state를 일괄 업데이트(batch update)하게끔 동작한다. +> 1. 컴포넌트의 state가 변경됐을 때 +> 2. 컴포넌트가 상속받은 props가 변경됐을 때 +> 3. 부모 컴포넌트가 리렌더링 되었을 때 (모든 자식 컴포넌트도 리렌더링) > > # @@ -162,9 +293,24 @@ https://ko.react.dev/learn/updating-objects-in-state https://ko.react.dev/learn/passing-props-to-a-component - 추가 자료 + React 장단점 + https://www.elancer.co.kr/blog/detail/167?seq=167 + https://minjung-jeon.github.io/React-props-cons/
State & Props
https://valueengine.tistory.com/62
- https://kindjjee.tistory.com/102 + https://kindjjee.tistory.com/102
+ https://velog.io/@junghyeonsu/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%B6%80%EC%8B%9C%EA%B8%B0-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%B4%88%EB%B3%B4-%ED%83%88%EC%B6%9C%ED%95%98%EA%B8%B0
+ https://forweber.palms.blog/nowsopt-react-imddoy
+ https://velog.io/@thisishwarang/React-setState-%EC%9E%90%EC%B2%B4%EB%A5%BC-props%EB%A1%9C-%EC%A0%84%EB%8B%AC%ED%95%98%EC%A7%80-%EB%A7%90%EC%95%84%EC%95%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0
+ https://seokzin.tistory.com/entry/React-useState%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC%EC%99%80-%ED%81%B4%EB%A1%9C%EC%A0%80 +
+ Babel
+ https://velog.io/@a_in/Babel-transpiler-compiler
+ https://junghyeonsu.tistory.com/277 +
+ 불변성 관련 자료
+ https://velog.io/@kcj_dev96/%EB%A6%AC%EC%95%A1%ED%8A%B8%EC%97%90%EC%84%9C-state%EA%B0%80-%EB%B6%88%EB%B3%80%EC%84%B1%EC%9D%84-%EC%9C%A0%EC%A7%80%ED%95%B4%EC%95%BC%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0 + https://f-lab.kr/insight/react-immutability-importance
From 737f5c05ddb58a9b32cd18bbc711f7cb57718d6d Mon Sep 17 00:00:00 2001 From: yuraup Date: Thu, 10 Oct 2024 19:47:13 +0900 Subject: [PATCH 5/6] =?UTF-8?q?docs:=20=EB=A7=88=ED=81=AC=EB=8B=A4?= =?UTF-8?q?=EC=9A=B4=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0]\354\235\264\354\234\240\353\235\274.md" | 508 +++++++++--------- 1 file changed, 244 insertions(+), 264 deletions(-) diff --git "a/week02/\354\235\264\354\234\240\353\235\274/[2\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" "b/week02/\354\235\264\354\234\240\353\235\274/[2\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" index 1a6c3b5..9d22a0d 100644 --- "a/week02/\354\235\264\354\234\240\353\235\274/[2\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" +++ "b/week02/\354\235\264\354\234\240\353\235\274/[2\354\243\274\354\260\250]\354\235\264\354\234\240\353\235\274.md" @@ -1,24 +1,20 @@ ## 서론: React를 공부하는 이유 -> # -> -> 프론트엔드 라이브러리나 프레임워크를 사용하는 주된 이유 중 하나는 UI를 자동으로 업데이트해주기 때문에 UI를 빠르게 업데이트할 수 있다는 점 때문이다. 하지만 그중에서도 많은 사람들이 React를 선호하는 이유가 있다. 본격적으로 리액트를 공부하기 전에 리액트의 장단점을 토대로 리액트를 사용해야 하는 이유를 정리했다. -> -> **장점** -> -> 1. 높은 수용성 -> React는 가볍고 유연한 라이브러리라서 필요한 부분에만 선택적으로 적용할 수 있다. 이는 기존 코드를 크게 변경하지 않고도 기존 프로젝트에 React를 점진적으로 도입할 수 있게 한다. -> 2. 높은 접근성 -> 각기 고유한 템플릿 문법을 사용하는 Angular, Vue와 달리 리액트는 JavaScript 기반의 문법이기 때문에 JavaScript에 익숙한 개발자들에게 접근성이 높다. -> 3. 큰 생태계 -> 특히 React는 Virtual DOM을 사용한 대표적인 선두주자로, 매우 큰 생태계를 형성하고 있기 때문에 다양한 라이브러리, 도구, 커뮤니티의 자원을 사용하기 용이하다. -> 4. 크로스 플랫폼 개발 -> React Native를 통해 웹 애플리케이션뿐만 아니라 모바일 애플리케이션까지 동일한 기술 스택으로 개발할 수 있다. -> 하지만 단점도 존재하는데, -> 5. 컴포넌트 기반의 아키텍처 -> 컴포넌트 단위로 개발하기 때문에 많은 코드를 재사용할 수 있다. 이러한 재사용 가능한 컴포넌트는 생산성과 유지 보수를 용이하게 하여 React 의 큰 이점으로 작용한다.
>
하지만 **React의 단점**도 존재하는데, 대표적인 단점은 큰 단점 중 하나는 SEO(검색엔진 최적화)에 불리하다는 것이다. React는 단일 페이지 애플리케이션(SPA) 방식으로 작동하기 때문에, 웹 페이지가 처음 로드될 때 클라이언트 측에서 렌더링되면서 SEO 최적화가 어려울 수 있다. 하지만 이는 SSR(Server side rendering)과 meta-tag 사용, pre-rendering 도입 등의 방식으로 극복이 가능하기 때문에 위의 장점들로 충분히 단점을 상쇄할 수 있다고 생각한다. -> -> # +프론트엔드 라이브러리나 프레임워크를 사용하는 주된 이유 중 하나는 UI를 자동으로 업데이트해주기 때문에 UI를 빠르게 업데이트할 수 있다는 점 때문이다. 하지만 그중에서도 많은 사람들이 React를 선호하는 이유가 있다. 본격적으로 리액트를 공부하기 전에 리액트의 장단점을 토대로 리액트를 사용해야 하는 이유를 정리했다. + +**장점** + +1. 높은 수용성 + React는 가볍고 유연한 라이브러리라서 필요한 부분에만 선택적으로 적용할 수 있다. 이는 기존 코드를 크게 변경하지 않고도 기존 프로젝트에 React를 점진적으로 도입할 수 있게 한다. +2. 높은 접근성 + 각기 고유한 템플릿 문법을 사용하는 Angular, Vue와 달리 리액트는 JavaScript 기반의 문법이기 때문에 JavaScript에 익숙한 개발자들에게 접근성이 높다. +3. 큰 생태계 + 특히 React는 Virtual DOM을 사용한 대표적인 선두주자로, 매우 큰 생태계를 형성하고 있기 때문에 다양한 라이브러리, 도구, 커뮤니티의 자원을 사용하기 용이하다. +4. 크로스 플랫폼 개발 + React Native를 통해 웹 애플리케이션뿐만 아니라 모바일 애플리케이션까지 동일한 기술 스택으로 개발할 수 있다. + 하지만 단점도 존재하는데, +5. 컴포넌트 기반의 아키텍처 + 컴포넌트 단위로 개발하기 때문에 많은 코드를 재사용할 수 있다. 이러한 재사용 가능한 컴포넌트는 생산성과 유지 보수를 용이하게 하여 React 의 큰 이점으로 작용한다.
하지만 **React의 단점**도 존재하는데, 대표적인 단점은 큰 단점 중 하나는 SEO(검색엔진 최적화)에 불리하다는 것이다. React는 단일 페이지 애플리케이션(SPA) 방식으로 작동하기 때문에, 웹 페이지가 처음 로드될 때 클라이언트 측에서 렌더링되면서 SEO 최적화가 어려울 수 있다. 하지만 이는 SSR(Server side rendering)과 meta-tag 사용, pre-rendering 도입 등의 방식으로 극복이 가능하기 때문에 위의 장점들로 충분히 단점을 상쇄할 수 있다고 생각한다. ## React 동작 방식 JSX @@ -26,256 +22,240 @@ 웹은 HTML, CSS, JavaScript로 구축된다. 초기에는 HTML이 콘텐츠를, CSS가 디자인을, JS가 로직을 각각 담당했다. 하지만 웹이 점점 더 인터랙티브해지면서 JS가 DOM 조작과 UI 렌더링까지 맡게 되었다. JSX는 이러한 변화에 대응하여 등장한 문법으로, HTML과 유사한 문법을 JS 코드 내에서 사용할 수 있도록 설계되었다. 그리고 이와 함께 React도 등장하며, JSX를 사용하여 렌더링 로직과 마크업을 컴포넌트 내에서 함께 처리할 수 있게 되었다. -> # -> -> ### JSX 정의: -> -> JS 파일 내부에 HTML과 유사한 마크업을 작성할 수 있는 JS의 확장 문법이다. -> -> - JavaScript와 XML을 조합해 가독성이 좋은 코드를 작성할 수 있게 해 준다. -> - Babel이 JSX를 JS로 변환해 주기 때문에 브라우저가 JSX 코드를 이해하고 실행할 수 있다. -> -> **추가:** -> Babel(바벨)에 대하여 -> -> - 정의: JS 코드를 변환하는 트랜스컴파일러 -> - 사용 이유: -> 1. JSX를 브라우저가 바로 이해할 수 없어서 -> 2. 최신 JS 문법을 구버전으로 변환하기 위해 -> - 장점: 호환성을 향상시킨다. -> - 바벨을 사용하면 최신 JS 문법(ES6 이상)으로 개발해도 ES5 이하의 문법으로 변환하여 오래된 브라우저에서도 작동한다. -> - ECMAScript 2020까지의 기능들도 별도의 세팅 없이 지원한다. -> -> ##### transpiler 트랜스컴파일러: 인풋과 아웃풋이 비슷한 레벨의 언어일 때 사용한다. 즉, 서로 다른 언어를 변환해 주는 컴파일러와 달리, 유사한 두 언어 사이에서 변환할 때 사용한다. 같은 레벨일 때 변환하는 이유는 주로 구형 버전 차이 때문이다. ex) JS -> JS 변환 -> -> ### JSX 규칙: -> -> **1. 최상위 태그는 오직 하나** -> -> - JSX에서 여러 요소를 반환하기 위해서는 단일 부모 태그로 자식 태그들을 하나로 감싸야 한다. 즉, 여러 개의 태그들을 묶는 하나의 상위 요소가 필요하다는 뜻이다. -> - `
`태그나 React.Fragment를 사용해 여러 태그를 감싸는 방식이 일반적이다. ``는 `<>`로 줄여서 쓸 수 있다. -> -> ```JSX -> const element = ( -> ->
Hello World
->
Goodbye World
->
-> ); -> ``` -> -> **2. 모든 태그를 닫아야 한다.** -> -> - JSX 내에서 열린 태그를 작성하면 '닫는 태그'가 없다는 에러가 발생한다. -> - ``, `
` 와 같은 self-closing tag도 끝에 `/` 를 붙여야 한다. -> -> **3. 모든 프로퍼티의 이름은 카멜 케이스(CamelCase)로 작성한다.** -> -> - JSX는 JS에 가깝기 때문에 React DOM은 HTML 어트리뷰트 이름 대신 camelCase 프로퍼티 명명 규칙을 사용한다. -> - 예시:`className`,`onFocus`,`onMousedown` -> -> **4. JSX는 자바스크립트의 표현식을 포함할 수 있다.** -> -> - 중괄호 {}를 사용해 JavaScript 코드를 JSX 안에 삽입할 수 있다. -> -> ```JSX -> const name = "World"; -> const element =

Hello, {name}!

; -> ``` -> -> **5. 인라인 스타일 적용 시 객체를 사용한다.** -> -> ```JSX ->
Hello, there !
-> ``` -> -> ###### 인라인 스타일: 스타일 속성을 직접 태그의 속성으로 지정하는 방식이다. -> -> # +### JSX 정의: + +JS 파일 내부에 HTML과 유사한 마크업을 작성할 수 있는 JS의 확장 문법이다. + +- JavaScript와 XML을 조합해 가독성이 좋은 코드를 작성할 수 있게 해 준다. +- Babel이 JSX를 JS로 변환해 주기 때문에 브라우저가 JSX 코드를 이해하고 실행할 수 있다. + +**추가:** +Babel(바벨)에 대하여 + +- 정의: JS 코드를 변환하는 트랜스컴파일러 +- 사용 이유: + 1. JSX를 브라우저가 바로 이해할 수 없어서 + 2. 최신 JS 문법을 구버전으로 변환하기 위해 +- 장점: 호환성을 향상시킨다. + - 바벨을 사용하면 최신 JS 문법(ES6 이상)으로 개발해도 ES5 이하의 문법으로 변환하여 오래된 브라우저에서도 작동한다. + - ECMAScript 2020까지의 기능들도 별도의 세팅 없이 지원한다. + +##### transpiler 트랜스컴파일러: 인풋과 아웃풋이 비슷한 레벨의 언어일 때 사용한다. 즉, 서로 다른 언어를 변환해 주는 컴파일러와 달리, 유사한 두 언어 사이에서 변환할 때 사용한다. 같은 레벨일 때 변환하는 이유는 주로 구형 버전 차이 때문이다. ex) JS -> JS 변환 + +### JSX 규칙: + +**1. 최상위 태그는 오직 하나** + +- JSX에서 여러 요소를 반환하기 위해서는 단일 부모 태그로 자식 태그들을 하나로 감싸야 한다. 즉, 여러 개의 태그들을 묶는 하나의 상위 요소가 필요하다는 뜻이다. +- `
`태그나 React.Fragment를 사용해 여러 태그를 감싸는 방식이 일반적이다. ``는 `<>`로 줄여서 쓸 수 있다. + +```JSX + const element = ( + +
Hello World
+
Goodbye World
+
+ ); +``` + +**2. 모든 태그를 닫아야 한다.** + +- JSX 내에서 열린 태그를 작성하면 '닫는 태그'가 없다는 에러가 발생한다. +- ``, `
` 와 같은 self-closing tag도 끝에 `/` 를 붙여야 한다. + +**3. 모든 프로퍼티의 이름은 카멜 케이스(CamelCase)로 작성한다.** + +- JSX는 JS에 가깝기 때문에 React DOM은 HTML 어트리뷰트 이름 대신 camelCase 프로퍼티 명명 규칙을 사용한다. +- 예시:`className`,`onFocus`,`onMousedown` + **4. JSX는 자바스크립트의 표현식을 포함할 수 있다.** +- 중괄호 {}를 사용해 JavaScript 코드를 JSX 안에 삽입할 수 있다. + +```JSX + const name = "World"; + const element =

Hello, {name}!

; +``` + +**5. 인라인 스타일 적용 시 객체를 사용한다.** + +```JSX +
Hello, there !
+``` + +###### 인라인 스타일: 스타일 속성을 직접 태그의 속성으로 지정하는 방식이다. ## state와 props state와 props는 둘 다 컴포넌트의 데이터를 다루는 데 사용되지만, 목적과 사용 방법 등에서 차이점을 지닌다. -> # -> -> ### state -> -> State(상태)는 컴포넌트에서 변경 가능한 데이터를 다루기 위한 객체이다. -> -> - 컴포넌트의 상태를 변경하거나 업데이트할 때 사용된다. -> - 읽기와 쓰기 모두 가능하다. -> - 초기값이 지정되지 않으면 `undefined`로 설정되기 때문에 이 상태에서 해당 값을 사용하려고 하면 오류가 발생한다. 따라서 초기값을 지정하는 것이 중요하다. -> -> - 컴포넌트 내부에서 값의 업데이트가 가능하다. 하지만 **불변성을 유지**해 줘야 하기 때문에 `setState()` (클래스형 컴포넌트) `useState()` (함수형 컴포넌트)를 사용해서 값을 변경한다.
-> - state가 불변성을 유지하려면, 항상 새로운 객체를 생성하고 이전 state 값을 복사해 변경된 값을 인수로 할당해야 한다. `setState` 함수는 인수로 새로운 값을 할당하여 이전 객체와 다른 참조 주소를 가진다. 이를 통해 React는 이전 state와 새로운 state가 서로 다른 참조 주소를 가지고 있음을 인식하여 변경된 값을 올바르게 변경한다. 이 과정에서 새 객체를 만들기 위해 `...(스프레드 연산자)`가 사용될 수 있다. 이와 관련된 예시 코드는 다음과 같다. -> -> ```JSX -> // 클래스형 컴포넌트 사용 예시 -> `const arr = [1,2,3] -> const [value,setValue] = useState(arr) -> setValue([...value,4]) -> ``` -> -> 이처럼 스프레드 연산자를 사용해 이전 값을 복사하고 새로운 값을 추가할 수 있다. -> 그 외, `map`, `filter` 등의 배열 메서드를 사용하여 새로운 배열을 생성해 원본 배열을 유지하고 React가 변화를 감지할 수 있다. -> 혹은 불변성을 지원하는 라이브러리(ex. Immutable.js)를 사용하는 방법도 있다. -> -> ###### 불변성: 메모리에서 직접 변경하지 않고, 기존값을 수정하지 않으면서 새 값을 만든다. -> -> #### state를 사용하는 이유: -> -> 변수는 값이 변경되더라도 React에서 자동으로 UI가 리렌더링되지 않는다. 반면, state는 값이 변경될 때마다 React가 해당 컴포넌트를 다시 렌더링하여 UI를 업데이트한다. 이를 더 쉽게 이해하기 위해, 일반 변수를 사용하여 계산기를 구현한다고 상상해 보자. 계산기에 `plus`, `minus` 버튼이 있다. 이 버튼들을 누를 때마다 숫자가 증가하거나 감소한다고 가정하자. 버튼을 누를 때마다 콘솔에서는 값이 변화된 것을 확인할 수 있지만, 화면에 그 변화가 반영되지 않는다면 이는 일반 변수를 사용했기 때문이다. React는 변수를 변경하더라도 그 변화가 화면에 반영되지 않는데, 이는 React가 상태 변화를 감지하지 않기 때문이다. 하지만 state는 값이 변경되었을 때 리렌더링이 되도록 구현되어 있기 때문에 UI가 자동으로 리렌더링된다.
-> -> #### 사용 방법: -> -> 클래스형 컴포넌트에서는`this.state`를 통해 상태를 정의하고, `this.setState()`메서드를 통해 상태를 업데이트한다. -> 함수형 컴포넌트에서는 `useState`라는 Hook으로 상태를 관리한다. -> -> ```JSX -> // 클래스형 컴포넌트 사용 예시 -> this.state = { // 초기 state 설정 -> increaseNum: 0, -> decreaseNum: 0, -> }; -> this.setState({ //state 변경 -> increaseNum : increaseNum + 1, -> decreaseNum : decreaseNum - 1 -> }); -> // 함수형 컴포넌트 사용 예시 -> const [state, setState] = useState(초기값); -> ``` -> -> **state 응용 학습** -> -> 1. state를 직접 변경하지 않고 setState를 사용하는 이유
-> 그 이유는 불변성과 관련이 있다. **state는 React 내장 객체**이기 때문에 이를 직접 변경할 경우 기존 객체의 참조에서는 변경사항이 반영되지 않는다. React가 변경 사항을 인지하기 위해서는 setState를 통해 state를 변경해야 한다. -> -> 2. setSate가 비동기적으로 작동하는 이유
-> 리렌더링과 관련이 있다. State값이 변경되면 React는 이를 감지하고 기존 Virtual DOM과 비교하여 변경사항을 반영한다. 하지만 State가 변경될 때마다 동기적으로 반영하게 되면 그때마다 리렌더링이 필요하고 이로 인해 애플리케이션 성능 저하가 일어날 수 있다. 따라서 setState는 변경된 state를 일괄 업데이트(batch update)하게끔 동작한다.
하지만 setState는 비동기적으로 동작하기 때문에 setState 호출 직후에 새로운 값이 state에 반영되지 않는 경우도 있다. 이러한 한계를 극복하기 위해서는 인자를 함수 형태로 넘겨주는 방식이 권장된다. setState의 인자로 함수를 넘기면 함수의 인자값은 항상 최신 값으로 처리할 수 있다. -> -> 3. setState가 useState 내부의 최신 값을 계속 확인할 수 있는 방법
-> 클래스형 컴포넌트는 render() 메서드를 통해 상태 변경을 감지할 수 있다. 하지만 함수형 컴포넌트는 렌더링이 발생하면 함수 자체가 재호출된다. 따라서 상태 관리 시 함수가 호출되기 이전의 상태를 기억하고 있어야 한다. 그리고 useState는 이 문제를 클로저를 통해 해결한다. -> -> # - -> # -> -> ### props -> -> 부모 컴포넌트로부터 자식 컴포넌트로 데이터를 전달할 때 사용되는 매개변수 -> -> - props는 읽기 전용이기 때문에,자식 컴포넌트는 props 값을 변경할 수 없다. 따라서 props 값을 변경하고 싶다면 props를 전달한 부모 컴포넌트에서 변경하거나 state를 이용해 변경해야 한다. -> -> ```JSX -> // 부모 컴포넌트 -> import React, {useState} from 'react'; -> import ChildComponent from './ChildComponent'; -> -> const ParentComponent = () => { -> const [count, setCount] = useState(0); //부모가 상태를 관리하고 있다. -> const handleClick = () => { //setState를 감싼 콜백함수를 만든다. -> setCount(prev => prev + 1); //상태 업데이트 -> }; -> return ( ->
-> ->
-> ); -> }; -> export default ParentComponent; -> ``` -> -> ```JSX -> // 자식 컴포넌트 -> import React from 'react'; -> -> const ChildComponent = ({handleClick}) => { -> return ( ->
-> //전달받은 props를 사용했다. ->
-> ); -> }; -> -> export default ChildComponent; -> ``` -> -> **props 응용 학습** -> -> 1. 심층 계층 구조에서 제일 마지막 자손까지 props를 일일이 넘겨도 될까? -> -> - 이러한 현상을 **props drilling** 이라고 한다. 여러 계층의 컴포넌트를 거쳐 데이터를 전달하는 방식으로, 이러한 방식은 코드의 복잡성이 증가하여 가독성이 좋지 않고 유지보수에도 용이하지 않다. -> - 해결 방법: -> -> 1. **전역 상태 관리**
이때는 Context API 혹은 Redux나 Recoil 등의 라이브러리를 사용할 수 있다.
-> -> 2. **props.children** 사용
children props는 컴포넌트에게 자식 컴포넌트를 포함시키는 방법으로, 태그와 태그 사이의 모든 내용을 표시하기 위해 사용되는 특수한 props이다. 상태를 직접 관리하지 않고 컴포넌트 간의 데이터를 전달하거나 재사용 가능한 컴포넌트 패턴을 구성할 때 유용하다. -> -> 2. props에 setState를 넘겨 줘도 될까?
-> setState를 직접 props로 넘기는 건 좋지 않다. 부모와 자식 컴포넌트 간에 동일한 상태 공유가 필요할 경우, 혹은 자식 간에 동일한 상태를 공유해야 할 경우에 이러한 로직이 생길 수 있다.
하지만 함수 하나에는 하나의 책임만 부여하는 것이 좋은 것처럼, 컴포넌트도 책임을 분리할 필요가 있다. 이를 단일 책임 원칙이라고 하는데, 만약 자식 컴포넌트가 setState 함수를 props로 전달받을 경우, 해당 자식 컴포넌트는 부모 컴포넌트의 책임까지 지게 된다. 상태 변경을 할 때는 부모 컴포넌트에서 처리를 하는 것이 일반적인데, 만약 자식 컴포넌트가 상태를 변경하게 되면 컴포넌트의 복잡성이 증가하고 자식 컴포넌트는 부모 컴포넌트에 큰 의존성을 갖게 된다. 이러한 의존성은 컴포넌트의 재사용성을 저하함으로 코드의 모듈화를 유지할 수 없게 만든다. 따라서 **setState를 콜백함수로 감싸서 props로 넘기고 자식 컴포넌트에서는 콜백함수를 필요한 부분에서 호출**만 할 수 있게 하는 방식이 좋다. -> 3. props에서 구조 분해 할당을 어떻게 적용할 수 있을까? -> -> - 구조분해할당? -> 말 그대로 구조를 분해하고 할당하는 것.
구조분해를 통해 배열이나 객체에서 요소나 프로퍼티(key, value)를 분해하고, 이를 새로운 변수에 담을 수 있다. -> -> ```JSX -> //일반적인 props 사용법 -> import React from 'react'; -> const Greeting = (props) => { -> return ( ->
->

안녕하세요. {props.name} 님

->

당신의 나이는 {props.age} 살입니다.

->
-> ); -> }; -> -> export default Greeting; -> -> ``` -> -> props를 통해 접근하는 방식은 props 키워드를 계속 사용해야 하기 때문에 가독성이 좋지 않다. -> -> ```JSX -> //구조 분해 할당을 사용한 방식 -> import React from 'react'; -> const Greeting = ({ name, age }) => { -> return ( ->
->

안녕하세요. {name} 님

->

당신의 나이는 {age} 살입니다.

->
-> ); -> }; -> -> export default Greeting; -> -> ``` -> -> 이렇게 구조 분해 할당을 사용하면 props 객체에서 필요한 값만 추출해 바로 사용할 수 있다. 이러한 방식은 가독성을 높이고 중복된 참조가 줄어든다. -> -> # - -> # -> -> ### state와 props의 차이점
-> -> 둘 다 컴포넌트 간의 데이터 전달을 위한 속성이지만 둘의 목적이 다르다. state는 컴포넌트 내부의 상태를 관리하고 변경 시 컴포넌트가 리렌더링되도록 한다. 반면, props는 부모로부터 자식에게 값을 전달하고 이를 기반으로 컴포넌트를 리렌더링한다. -> 또한 변경 가능 여부에서도 state는 읽기와 쓰기가 모두 허용되지만, props는 읽기 전용이라는 점에서 차이가 있다. -> -> # -> -> ### 추가 공부 -> -> 렌더링 최적화는 리액트 애플리케이션의 성능을 결정짓는 중요한 요소이기 때문에 중요한데, -> 참고로 리액트가 리렌더링되는 조건은 다음과 같이 세 가지가 존재한다. -> -> 1. 컴포넌트의 state가 변경됐을 때 -> 2. 컴포넌트가 상속받은 props가 변경됐을 때 -> 3. 부모 컴포넌트가 리렌더링 되었을 때 (모든 자식 컴포넌트도 리렌더링) -> -> # +### state + +State(상태)는 컴포넌트에서 변경 가능한 데이터를 다루기 위한 객체이다. + +- 컴포넌트의 상태를 변경하거나 업데이트할 때 사용된다. +- 읽기와 쓰기 모두 가능하다. +- 초기값이 지정되지 않으면 `undefined`로 설정되기 때문에 이 상태에서 해당 값을 사용하려고 하면 오류가 발생한다. 따라서 초기값을 지정하는 것이 중요하다. + + - 컴포넌트 내부에서 값의 업데이트가 가능하다. 하지만 **불변성을 유지**해 줘야 하기 때문에 `setState()` (클래스형 컴포넌트) `useState()` (함수형 컴포넌트)를 사용해서 값을 변경한다.
+ - state가 불변성을 유지하려면, 항상 새로운 객체를 생성하고 이전 state 값을 복사해 변경된 값을 인수로 할당해야 한다. `setState` 함수는 인수로 새로운 값을 할당하여 이전 객체와 다른 참조 주소를 가진다. 이를 통해 React는 이전 state와 새로운 state가 서로 다른 참조 주소를 가지고 있음을 인식하여 변경된 값을 올바르게 변경한다. 이 과정에서 새 객체를 만들기 위해 `...(스프레드 연산자)`가 사용될 수 있다. 이와 관련된 예시 코드는 다음과 같다.> + +```JSX +// 클래스형 컴포넌트 사용 예시 +`const arr = [1,2,3] +const [value,setValue] = useState(arr) +setValue([...value,4]) +``` + +이처럼 스프레드 연산자를 사용해 이전 값을 복사하고 새로운 값을 추가할 수 있다. +그 외, `map`, `filter` 등의 배열 메서드를 사용하여 새로운 배열을 생성해 원본 배열을 유지하고 React가 변화를 감지할 수 있다. +혹은 불변성을 지원하는 라이브러리(ex. Immutable.js)를 사용하는 방법도 있다. + +###### 불변성: 메모리에서 직접 변경하지 않고, 기존값을 수정하지 않으면서 새 값을 만든다. + +#### state를 사용하는 이유: + +변수는 값이 변경되더라도 React에서 자동으로 UI가 리렌더링되지 않는다. 반면, state는 값이 변경될 때마다 React가 해당 컴포넌트를 다시 렌더링하여 UI를 업데이트한다. 이를 더 쉽게 이해하기 위해, 일반 변수를 사용하여 계산기를 구현한다고 상상해 보자. 계산기에 `plus`, `minus` 버튼이 있다. 이 버튼들을 누를 때마다 숫자가 증가하거나 감소한다고 가정하자. 버튼을 누를 때마다 콘솔에서는 값이 변화된 것을 확인할 수 있지만, 화면에 그 변화가 반영되지 않는다면 이는 일반 변수를 사용했기 때문이다. React는 변수를 변경하더라도 그 변화가 화면에 반영되지 않는데, 이는 React가 상태 변화를 감지하지 않기 때문이다. 하지만 state는 값이 변경되었을 때 리렌더링이 되도록 구현되어 있기 때문에 UI가 자동으로 리렌더링된다.
+ +#### 사용 방법: + +클래스형 컴포넌트에서는`this.state`를 통해 상태를 정의하고, `this.setState()`메서드를 통해 상태를 업데이트한다. +함수형 컴포넌트에서는 `useState`라는 Hook으로 상태를 관리한다. + +```JSX +// 클래스형 컴포넌트 사용 예시 + this.state = { // 초기 state 설정 + increaseNum: 0, + decreaseNum: 0, + }; +this.setState({ //state 변경 + increaseNum : increaseNum + 1, + decreaseNum : decreaseNum - 1 + }); +// 함수형 컴포넌트 사용 예시 + const [state, setState] = useState(초기값); +``` + +**state 응용 학습** + +1. state를 직접 변경하지 않고 setState를 사용하는 이유
+ 그 이유는 불변성과 관련이 있다. **state는 React 내장 객체**이기 때문에 이를 직접 변경할 경우 기존 객체의 참조에서는 변경사항이 반영되지 않는다. React가 변경 사항을 인지하기 위해서는 setState를 통해 state를 변경해야 한다. + +2. setSate가 비동기적으로 작동하는 이유
+ 리렌더링과 관련이 있다. State값이 변경되면 React는 이를 감지하고 기존 Virtual DOM과 비교하여 변경사항을 반영한다. 하지만 State가 변경될 때마다 동기적으로 반영하게 되면 그때마다 리렌더링이 필요하고 이로 인해 애플리케이션 성능 저하가 일어날 수 있다. 따라서 setState는 변경된 state를 일괄 업데이트(batch update)하게끔 동작한다.
하지만 setState는 비동기적으로 동작하기 때문에 setState 호출 직후에 새로운 값이 state에 반영되지 않는 경우도 있다. 이러한 한계를 극복하기 위해서는 인자를 함수 형태로 넘겨주는 방식이 권장된다. setState의 인자로 함수를 넘기면 함수의 인자값은 항상 최신 값으로 처리할 수 있다. + +3. setState가 useState 내부의 최신 값을 계속 확인할 수 있는 방법
+ 클래스형 컴포넌트는 render() 메서드를 통해 상태 변경을 감지할 수 있다. 하지만 함수형 컴포넌트는 렌더링이 발생하면 함수 자체가 재호출된다. 따라서 상태 관리 시 함수가 호출되기 이전의 상태를 기억하고 있어야 한다. 그리고 useState는 이 문제를 클로저를 통해 해결한다. + +### props + +부모 컴포넌트로부터 자식 컴포넌트로 데이터를 전달할 때 사용되는 매개변수 + +- props는 읽기 전용이기 때문에,자식 컴포넌트는 props 값을 변경할 수 없다. 따라서 props 값을 변경하고 싶다면 props를 전달한 부모 컴포넌트에서 변경하거나 state를 이용해 변경해야 한다. + +```JSX + // 부모 컴포넌트 +import React, {useState} from 'react'; +import ChildComponent from './ChildComponent'; + +const ParentComponent = () => { + const [count, setCount] = useState(0); //부모가 상태를 관리하고 있다. + const handleClick = () => { //setState를 감싼 콜백함수를 만든다. + setCount(prev => prev + 1); //상태 업데이트 + }; +return ( +
+ +
+ ); +}; +export default ParentComponent; +``` + +```JSX + // 자식 컴포넌트 +import React from 'react'; + +const ChildComponent = ({handleClick}) => { +return ( +
+ //전달받은 props를 사용했다. +
+ ); +}; + +export default ChildComponent; +``` + +**props 응용 학습** + +1. 심층 계층 구조에서 제일 마지막 자손까지 props를 일일이 넘겨도 될까? + + - 이러한 현상을 **props drilling** 이라고 한다. 여러 계층의 컴포넌트를 거쳐 데이터를 전달하는 방식으로, 이러한 방식은 코드의 복잡성이 증가하여 가독성이 좋지 않고 유지보수에도 용이하지 않다. + - 해결 방법: + + 1. **전역 상태 관리**
이때는 Context API 혹은 Redux나 Recoil 등의 라이브러리를 사용할 수 있다.
+ + 2. **props.children** 사용
children props는 컴포넌트에게 자식 컴포넌트를 포함시키는 방법으로, 태그와 태그 사이의 모든 내용을 표시하기 위해 사용되는 특수한 props이다. 상태를 직접 관리하지 않고 컴포넌트 간의 데이터를 전달하거나 재사용 가능한 컴포넌트 패턴을 구성할 때 유용하다. + +2. props에 setState를 넘겨 줘도 될까?
+ setState를 직접 props로 넘기는 건 좋지 않다. 부모와 자식 컴포넌트 간에 동일한 상태 공유가 필요할 경우, 혹은 자식 간에 동일한 상태를 공유해야 할 경우에 이러한 로직이 생길 수 있다.
하지만 함수 하나에는 하나의 책임만 부여하는 것이 좋은 것처럼, 컴포넌트도 책임을 분리할 필요가 있다. 이를 단일 책임 원칙이라고 하는데, 만약 자식 컴포넌트가 setState 함수를 props로 전달받을 경우, 해당 자식 컴포넌트는 부모 컴포넌트의 책임까지 지게 된다. 상태 변경을 할 때는 부모 컴포넌트에서 처리를 하는 것이 일반적인데, 만약 자식 컴포넌트가 상태를 변경하게 되면 컴포넌트의 복잡성이 증가하고 자식 컴포넌트는 부모 컴포넌트에 큰 의존성을 갖게 된다. 이러한 의존성은 컴포넌트의 재사용성을 저하함으로 코드의 모듈화를 유지할 수 없게 만든다. 따라서 **setState를 콜백함수로 감싸서 props로 넘기고 자식 컴포넌트에서는 콜백함수를 필요한 부분에서 호출**만 할 수 있게 하는 방식이 좋다. +3. props에서 구조 분해 할당을 어떻게 적용할 수 있을까? + +- 구조분해할당? + 말 그대로 구조를 분해하고 할당하는 것.
구조분해를 통해 배열이나 객체에서 요소나 프로퍼티(key, value)를 분해하고, 이를 새로운 변수에 담을 수 있다. + +```JSX +//일반적인 props 사용법 +import React from 'react'; +const Greeting = (props) => { + return ( +
+

안녕하세요. {props.name} 님

+

당신의 나이는 {props.age} 살입니다.

+
+ ); +}; + +export default Greeting; + +``` + +props를 통해 접근하는 방식은 props 키워드를 계속 사용해야 하기 때문에 가독성이 좋지 않다. + +```JSX +//구조 분해 할당을 사용한 방식 +import React from 'react'; +const Greeting = ({ name, age }) => { + return ( +
+

안녕하세요. {name} 님

+

당신의 나이는 {age} 살입니다.

+
+ ); +}; + +export default Greeting; + +``` + +이렇게 구조 분해 할당을 사용하면 props 객체에서 필요한 값만 추출해 바로 사용할 수 있다. 이러한 방식은 가독성을 높이고 중복된 참조가 줄어든다. + +# + +### state와 props의 차이점
+ +둘 다 컴포넌트 간의 데이터 전달을 위한 속성이지만 둘의 목적이 다르다. state는 컴포넌트 내부의 상태를 관리하고 변경 시 컴포넌트가 리렌더링되도록 한다. 반면, props는 부모로부터 자식에게 값을 전달하고 이를 기반으로 컴포넌트를 리렌더링한다. +또한 변경 가능 여부에서도 state는 읽기와 쓰기가 모두 허용되지만, props는 읽기 전용이라는 점에서 차이가 있다. + +### 추가 공부 + +렌더링 최적화는 리액트 애플리케이션의 성능을 결정짓는 중요한 요소이기 때문에 중요한데, +참고로 리액트가 리렌더링되는 조건은 다음과 같이 세 가지가 존재한다. + +1. 컴포넌트의 state가 변경됐을 때 +2. 컴포넌트가 상속받은 props가 변경됐을 때 +3. 부모 컴포넌트가 리렌더링 되었을 때 (모든 자식 컴포넌트도 리렌더링) + +#
[참고자료] From f25ddc50d5b43bead0cca7505fc711668be380af Mon Sep 17 00:00:00 2001 From: yuraup Date: Fri, 11 Oct 2024 14:53:16 +0900 Subject: [PATCH 6/6] =?UTF-8?q?feat:=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=98=EC=98=81,=20id=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todo/src/components/TodoView/TodoView.jsx" | 18 +++++++++++++----- .../components/TodoWriting/TodoWriting.css" | 2 +- .../components/TodoWriting/TodoWriting.jsx" | 6 +++--- .../todo/src/pages/TodoList.jsx" | 13 ++++++++----- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoView/TodoView.jsx" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoView/TodoView.jsx" index a600874..e831f50 100644 --- "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoView/TodoView.jsx" +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoView/TodoView.jsx" @@ -6,10 +6,13 @@ const TodoView = ({ todos, deleteTodo }) => {

✨ Today's todo ✨

- {todos.map((todo, index) => ( -
-

{todo}

-
@@ -20,7 +23,12 @@ const TodoView = ({ todos, deleteTodo }) => { }; TodoView.propTypes = { - todos: PropTypes.arrayOf(PropTypes.string).isRequired, + todos: PropTypes.arrayOf( + PropTypes.shape({ + id: PropTypes.number.isRequired, + content: PropTypes.string.isRequired, + }) + ).isRequired, deleteTodo: PropTypes.func.isRequired, }; diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.css" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.css" index 51f6c6f..fa0edd6 100644 --- "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.css" +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.css" @@ -1,4 +1,4 @@ -.writingWrapper { +.WritingWrapper { width: 100%; height: 100px; diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.jsx" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.jsx" index a8fc463..1a3a273 100644 --- "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.jsx" +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/components/TodoWriting/TodoWriting.jsx" @@ -5,20 +5,20 @@ import "./TodoWriting.css"; const TodoWriting = ({ addTodo }) => { const [content, setContent] = useState(""); - const PlusTodo = () => { + const AddNewTodo = () => { addTodo(content); setContent(""); }; return ( -
+
setContent(e.target.value)} placeholder="오늘의 할 일을 입력해주세요" /> -
diff --git "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/pages/TodoList.jsx" "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/pages/TodoList.jsx" index e21f848..894af1d 100644 --- "a/week02/\354\235\264\354\234\240\353\235\274/todo/src/pages/TodoList.jsx" +++ "b/week02/\354\235\264\354\234\240\353\235\274/todo/src/pages/TodoList.jsx" @@ -5,21 +5,24 @@ import "./TodoList.css"; const Todo = () => { const [todoList, setTodoList] = useState([]); + const [todoId, setTodoId] = useState(0); - const addTodo = (newTodo) => { + const addNewTodo = (newTodo) => { if (newTodo.trim() != "") { - setTodoList([...todoList, newTodo]); + const newTodoItem = { id: todoId, content: newTodo }; + setTodoList([...todoList, newTodoItem]); + setTodoId(todoId + 1); } }; - const deleteTodo = (indexToDelete) => { - setTodoList(todoList.filter((_, index) => index !== indexToDelete)); + const deleteTodo = (idToDelete) => { + setTodoList(todoList.filter((todo) => todo.id !== idToDelete)); }; return ( <>

오늘의 할 일

- + );