From 197ba399ca76ae6f4f41216672780d7dfe009b6e Mon Sep 17 00:00:00 2001 From: jy000n Date: Tue, 16 Sep 2025 16:19:36 +0900 Subject: [PATCH 1/9] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EA=B8=B0=EB=B0=98=20=EC=88=98=EC=A0=95=20=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .prettierrc | 12 ++++ index.html | 33 ++++++++++ script.js | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++ style.css | 167 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 386 insertions(+) create mode 100644 .prettierrc create mode 100644 index.html create mode 100644 script.js create mode 100644 style.css diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..958d068 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,12 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "endOfLine": "lf", + "printWidth": 120, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false, + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..39a80d8 --- /dev/null +++ b/index.html @@ -0,0 +1,33 @@ + + + + + + Todo + + + + +

Todo-List

+ +
+ +
+ + +
+ +
+ + + diff --git a/script.js b/script.js new file mode 100644 index 0000000..e908a30 --- /dev/null +++ b/script.js @@ -0,0 +1,174 @@ +document.addEventListener("DOMContentLoaded", () => { + const goToday = document.getElementById("goToday"); + const prevButton = document.getElementById("prevButton"); + const currentDate = document.getElementById("currentDate"); + const nextButton = document.getElementById("nextButton"); + const todoCount = document.querySelector(".todoCount"); + const todoInput = document.getElementById("todoInput"); + const appendTodo = document.querySelector(".appendTodo"); + const mainContainer = document.querySelector("main"); + + // todo 리스트 컨테이너 div 태그 추가 + const todoListContainer = document.createElement("div"); + mainContainer.appendChild(todoListContainer); + + // 날짜별 투두리스트 저장 + let todos = {}; + + // 마지막으로 선택된 날짜 (session 우선, 없으면 local) + // const savedDate = localStorage.getItem("lastSelectedDate"); + const savedDate = sessionStorage.getItem("lastSelectedDate"); + + // 날짜 디폴트값 : 당일 + function setToday() { + const today = new Date(); + const yyyy = today.getFullYear(); + const mm = String(today.getMonth() + 1).padStart(2, "0"); // 1~9월 앞에 0 붙임 + const dd = String(today.getDate()).padStart(2, "0"); // 1~9일 앞에 0 붙임 + + const defaultDate = `${yyyy}-${mm}-${dd}`; + currentDate.value = defaultDate; + + // localStorage.setItem('lastSelectedDate', defaultDate); + sessionStorage.setItem("lastSelectedDate", defaultDate); + + loadTodos(); + renderTodos(defaultDate); + } + + // 페이지 새로고침 / 처음 열었을 때 + function setInitialDate() { + loadTodos(); + + if (savedDate) { + currentDate.value = savedDate; + } else { + setToday(); + return; + } + renderTodos(currentDate.value); + } + + setInitialDate(); // 페이지 로딩 시 날짜 설정 + + // 날짜 변경 + function changeDate(days) { + // value를 연도, 월, 일로 분리 + const [year, month, day] = currentDate.value.split("-").map(Number); + const selectedDate = new Date(year, month - 1, day); // JS에서 month는 0~11 + selectedDate.setDate(selectedDate.getDate() + days); + + const yyyy = selectedDate.getFullYear(); + const mm = String(selectedDate.getMonth() + 1).padStart(2, "0"); + const dd = String(selectedDate.getDate()).padStart(2, "0"); + currentDate.value = `${yyyy}-${mm}-${dd}`; + + sessionStorage.setItem("lastSelectedDate", currentDate.value); + renderTodos(currentDate.value); + } + + // 버튼 클릭 시 날짜 변경 + prevButton.addEventListener("click", () => { + changeDate(-1); + }); + nextButton.addEventListener("click", () => { + changeDate(1); + }); + + // 달력에서 날짜 변경 + currentDate.addEventListener("change", () => { + sessionStorage.setItem("lastSelectedDate", currentDate.value); // 선택한 날짜 저장 + renderTodos(currentDate.value); + }); + + // Todo 추가 + appendTodo.addEventListener("click", () => { + const text = todoInput.value.trim(); + if (!text) return; + + if (!todos[currentDate.value]) todos[currentDate.value] = []; + todos[currentDate.value].push({ text, checked: false }); // todo 객체 형태로 저장 + + todoInput.value = ""; // 입력값 초기화 + saveTodos(); + renderTodos(currentDate.value); + }); + todoInput.addEventListener("keydown", (event) => { + if (event.isComposing) return; // 입력(조합) 중일 때 무시 + if (event.key === "Enter") { + appendTodo.click(); + } + }); + + // Todo 렌더링 + function renderTodos(date) { + // 기존 목록 초기화 + while (todoListContainer.firstChild) { + todoListContainer.removeChild(todoListContainer.firstChild); + } + const list = todos[date] || []; + + list.forEach((todo, index) => { + const div = document.createElement("div"); + div.className = "listContainer"; + + // 체크박스 + const checkbox = document.createElement("input"); + checkbox.type = "checkbox"; + checkbox.className = "checkboxButton"; + checkbox.id = `checkbox-${index}`; + checkbox.checked = todo.checked; + // todo 내용 + const todoContent = document.createElement("span"); + todoContent.className = "todoContent"; + todoContent.textContent = todo.text; + // 삭제 + const deleteButton = document.createElement("button"); + deleteButton.className = "deleteButton"; + deleteButton.textContent = "x"; + + div.appendChild(checkbox); + div.appendChild(todoContent); + div.appendChild(deleteButton); + + todoListContainer.appendChild(div); + + // 체크박스 + checkbox.addEventListener("change", () => { + todo.checked = checkbox.checked; + saveTodos(); + renderTodos(date); // 상태 반영 위해 다시 렌더링 + }); + + // 투두 삭제 + deleteButton.addEventListener("click", () => { + todos[date].splice(index, 1); + saveTodos(); + renderTodos(date); + }); + }); + + // 투두 개수 + todoCount.textContent = `${list.filter((todo) => !todo.checked).length} 개`; + } + + // 투두 리스트 로컬 스토리지에 저장 + function saveTodos() { + localStorage.setItem("todos", JSON.stringify(todos)); + } + // 투두 리스트 로드 + function loadTodos() { + const data = localStorage.getItem("todos"); + if (data) { + todos = JSON.parse(data); + } + } + + // 페이지 로드 시 투두리스트 로드 + loadTodos(); + + // Todo-List 클릭 -> 오늘 날짜로 + goToday.addEventListener("click", () => { + setToday(); + }); +}); diff --git a/style.css b/style.css new file mode 100644 index 0000000..d8a20e1 --- /dev/null +++ b/style.css @@ -0,0 +1,167 @@ +* { + text-align: center; + font-family: Pretendard; + margin: 0; + padding: 0; + box-sizing: border-box; +} + +header { + display: flex; + justify-content: center; + padding: 2rem; +} + +h1 { + cursor: pointer; +} + +.dateButton { + position: relative; + top: -0.05rem; +} + +/* ------------- */ + +nav { + display: flex; + align-items: center; + justify-content: center; + padding-bottom: 0.5rem; + gap: 0.5rem; +} + +.dateButton { + border: none; + background: none; + + font-weight: 900; + cursor: pointer; +} + +#currentDate { + border: none; + font-size: 1rem; +} +/* 달력 아이콘 스타일 */ +#currentDate::-webkit-calendar-picker-indicator { + padding: 0; + margin: 0; + cursor: pointer; + + margin-left: -0.2rem; + margin-right: 0.5rem; +} + +.todoCount { + margin-left: 1rem; +} + +/* ------------- */ + +main { + display: flex; + align-items: center; + justify-content: space-between; + + flex-direction: column; +} + +.inputContainer { + display: flex; + flex-direction: row; + + padding: 0.5rem; + margin-bottom: 0.8rem; + width: 100%; + max-width: 20.8rem; +} + +#todoInput { + text-align: start; + padding: 0.6rem; + padding-left: 0.7rem; + flex: 1; + + border: 1px solid grey; + border-radius: 5px; +} +#todoInput::placeholder { + color: #b8b8b8; +} + +.appendTodo { + all: unset; /* 기본 스타일 제거*/ + position: relative; + top: -0.1rem; + + margin-left: 0.9rem; + color: grey; + font-size: 1.5rem; +} +.appendTodo:hover { + color: black; + cursor: pointer; +} + +#todoInput:valid + .appendTodo { + color: black; +} +#todoInput:invalid + .appendTodo { + color: grey; + cursor: not-allowed; +} + +/* ------------- */ + +.listContainer { + display: flex; + align-items: center; + + padding: 0.1rem 0.3rem; + margin-bottom: 10px; + margin-left: 1px; + width: 20rem; +} + +.checkboxButton { + margin-top: 1.5px; + margin-right: 13px; + transform: scale(1.4); + accent-color: #808080; /* 체크 시 배경색 기본 파랑->회색 */ + + cursor: pointer; +} + +.todoContent { + flex: 1; + text-align: left; + word-break: break-all; /* 문자열 길어지면 강제 줄바꿈*/ +} + +/* 체크되었을 때 글자 색 변경 */ +.checkboxButton:checked ~ .todoContent, +.checkboxButton:checked ~ .deleteButton { + color: #8b8b8b; +} +/* 체크되었을 때 취소선 */ +.checkboxButton:checked ~ .todoContent { + text-decoration: line-through; + color: #8b8b8b; +} + +.deleteButton { + position: relative; + top: -2px; + margin-left: 0.9rem; + + font-size: 1.3rem; + border: none; + background: none; + + cursor: pointer; +} +.deleteButton:hover, +.checkboxButton:checked ~ .deleteButton:hover { + color: #d1a29f; +} From ae823c54735f0c49a42f94ad2cc4606f1f926be9 Mon Sep 17 00:00:00 2001 From: jy000n Date: Fri, 19 Sep 2025 13:25:21 +0900 Subject: [PATCH 2/9] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EA=B8=B0=EB=B0=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/script.js b/script.js index e908a30..74b82d4 100644 --- a/script.js +++ b/script.js @@ -16,7 +16,6 @@ document.addEventListener("DOMContentLoaded", () => { let todos = {}; // 마지막으로 선택된 날짜 (session 우선, 없으면 local) - // const savedDate = localStorage.getItem("lastSelectedDate"); const savedDate = sessionStorage.getItem("lastSelectedDate"); // 날짜 디폴트값 : 당일 @@ -29,7 +28,6 @@ document.addEventListener("DOMContentLoaded", () => { const defaultDate = `${yyyy}-${mm}-${dd}`; currentDate.value = defaultDate; - // localStorage.setItem('lastSelectedDate', defaultDate); sessionStorage.setItem("lastSelectedDate", defaultDate); loadTodos(); From 31a89034077285a05b0691bdc69ad85043eed2dd Mon Sep 17 00:00:00 2001 From: jy000n Date: Fri, 19 Sep 2025 13:45:03 +0900 Subject: [PATCH 3/9] =?UTF-8?q?fix:=20merge=20=EC=B6=A9=EB=8F=8C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 24 + .prettierrc | 3 +- eslint.config.js | 29 + index.html | 19 +- package-lock.json | 2808 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 27 + src/App.css | 167 +++ src/App.jsx | 148 +++ src/index.css | 0 src/main.jsx | 10 + vite.config.js | 7 + 11 files changed, 3223 insertions(+), 19 deletions(-) create mode 100644 .gitignore create mode 100644 eslint.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/App.css create mode 100644 src/App.jsx create mode 100644 src/index.css create mode 100644 src/main.jsx create mode 100644 vite.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.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/.prettierrc b/.prettierrc index 958d068..7e11949 100644 --- a/.prettierrc +++ b/.prettierrc @@ -7,6 +7,5 @@ "singleQuote": true, "tabWidth": 2, "trailingComma": "all", - "useTabs": false, - "plugins": ["prettier-plugin-tailwindcss"] + "useTabs": false } diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..cee1e2c --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,29 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{js,jsx}'], + extends: [ + js.configs.recommended, + reactHooks.configs['recommended-latest'], + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + rules: { + 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], + }, + }, +]) diff --git a/index.html b/index.html index 39a80d8..431cd0f 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,6 @@ Todo - -

Todo-List

- -
- -
- - -
- -
- +
+ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4db54d9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2808 @@ +{ + "name": "react-todo-22nd", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-todo-22nd", + "version": "0.0.0", + "dependencies": { + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@eslint/js": "^9.35.0", + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", + "eslint": "^9.35.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.4.0", + "vite": "^7.1.6" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "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.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", + "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.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, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.35", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.35.tgz", + "integrity": "sha512-slYrCpoxJUqzFDDNlvrOYRazQUNRvWPjXA17dAOISY3rDMxX6k8K4cj2H+hEYMHF81HO3uNd5rHVigAWRM5dSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.2.tgz", + "integrity": "sha512-uLN8NAiFVIRKX9ZQha8wy6UUs06UNSZ32xj6giK/rmMXAgKahwExvK6SsmgU5/brh4w/nSgj8e0k3c1HBQpa0A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.2.tgz", + "integrity": "sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.2.tgz", + "integrity": "sha512-OZuTVTpj3CDSIxmPgGH8en/XtirV5nfljHZ3wrNwvgkT5DQLhIKAeuFSiwtbMto6oVexV0k1F1zqURPKf5rI1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.2.tgz", + "integrity": "sha512-Wa/Wn8RFkIkr1vy1k1PB//VYhLnlnn5eaJkfTQKivirOvzu5uVd2It01ukeQstMursuz7S1bU+8WW+1UPXpa8A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.2.tgz", + "integrity": "sha512-QkzxvH3kYN9J1w7D1A+yIMdI1pPekD+pWx7G5rXgnIlQ1TVYVC6hLl7SOV9pi5q9uIDF9AuIGkuzcbF7+fAhow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.2.tgz", + "integrity": "sha512-dkYXB0c2XAS3a3jmyDkX4Jk0m7gWLFzq1C3qUnJJ38AyxIF5G/dyS4N9B30nvFseCfgtCEdbYFhk0ChoCGxPog==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.2.tgz", + "integrity": "sha512-9VlPY/BN3AgbukfVHAB8zNFWB/lKEuvzRo1NKev0Po8sYFKx0i+AQlCYftgEjcL43F2h9Ui1ZSdVBc4En/sP2w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.2.tgz", + "integrity": "sha512-+GdKWOvsifaYNlIVf07QYan1J5F141+vGm5/Y8b9uCZnG/nxoGqgCmR24mv0koIWWuqvFYnbURRqw1lv7IBINw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.2.tgz", + "integrity": "sha512-df0Eou14ojtUdLQdPFnymEQteENwSJAdLf5KCDrmZNsy1c3YaCNaJvYsEUHnrg+/DLBH612/R0xd3dD03uz2dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.2.tgz", + "integrity": "sha512-iPeouV0UIDtz8j1YFR4OJ/zf7evjauqv7jQ/EFs0ClIyL+by++hiaDAfFipjOgyz6y6xbDvJuiU4HwpVMpRFDQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.50.2.tgz", + "integrity": "sha512-OL6KaNvBopLlj5fTa5D5bau4W82f+1TyTZRr2BdnfsrnQnmdxh4okMxR2DcDkJuh4KeoQZVuvHvzuD/lyLn2Kw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.2.tgz", + "integrity": "sha512-I21VJl1w6z/K5OTRl6aS9DDsqezEZ/yKpbqlvfHbW0CEF5IL8ATBMuUx6/mp683rKTK8thjs/0BaNrZLXetLag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.2.tgz", + "integrity": "sha512-Hq6aQJT/qFFHrYMjS20nV+9SKrXL2lvFBENZoKfoTH2kKDOJqff5OSJr4x72ZaG/uUn+XmBnGhfr4lwMRrmqCQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.2.tgz", + "integrity": "sha512-82rBSEXRv5qtKyr0xZ/YMF531oj2AIpLZkeNYxmKNN6I2sVE9PGegN99tYDLK2fYHJITL1P2Lgb4ZXnv0PjQvw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.2.tgz", + "integrity": "sha512-4Q3S3Hy7pC6uaRo9gtXUTJ+EKo9AKs3BXKc2jYypEcMQ49gDPFU2P1ariX9SEtBzE5egIX6fSUmbmGazwBVF9w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.2.tgz", + "integrity": "sha512-9Jie/At6qk70dNIcopcL4p+1UirusEtznpNtcq/u/C5cC4HBX7qSGsYIcG6bdxj15EYWhHiu02YvmdPzylIZlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.2.tgz", + "integrity": "sha512-HPNJwxPL3EmhzeAnsWQCM3DcoqOz3/IC6de9rWfGR8ZCuEHETi9km66bH/wG3YH0V3nyzyFEGUZeL5PKyy4xvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.2.tgz", + "integrity": "sha512-nMKvq6FRHSzYfKLHZ+cChowlEkR2lj/V0jYj9JnGUVPL2/mIeFGmVM2mLaFeNa5Jev7W7TovXqXIG2d39y1KYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.2.tgz", + "integrity": "sha512-eFUvvnTYEKeTyHEijQKz81bLrUQOXKZqECeiWH6tb8eXXbZk+CXSG2aFrig2BQ/pjiVRj36zysjgILkqarS2YA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.2.tgz", + "integrity": "sha512-cBaWmXqyfRhH8zmUxK3d3sAhEWLrtMjWBRwdMMHJIXSjvjLKvv49adxiEz+FJ8AP90apSDDBx2Tyd/WylV6ikA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.2.tgz", + "integrity": "sha512-APwKy6YUhvZaEoHyM+9xqmTpviEI+9eL7LoCH+aLcvWYHJ663qG5zx7WzWZY+a9qkg5JtzcMyJ9z0WtQBMDmgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.1.13", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.13.tgz", + "integrity": "sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.3.tgz", + "integrity": "sha512-PFVHhosKkofGH0Yzrw1BipSedTH68BFF8ZWy1kfUpCtJcouXXY0+racG8sExw7hw0HoX36813ga5o3LTWZ4FUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.35", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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, + "license": "Python-2.0" + }, + "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, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz", + "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001743", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", + "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==", + "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" + } + ], + "license": "CC-BY-4.0" + }, + "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, + "license": "MIT", + "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/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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.222", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.222.tgz", + "integrity": "sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", + "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.35.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.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" + }, + "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-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "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.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", + "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "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.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "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, + "license": "BSD-3-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": 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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "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, + "license": "ISC", + "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, + "license": "ISC", + "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, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "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, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.2.tgz", + "integrity": "sha512-BgLRGy7tNS9H66aIMASq1qSYbAAJV6Z6WR4QYTvj5FgF15rZ/ympT1uixHXwzbZUBDbkvqUI1KR0fH1FhMaQ9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.50.2", + "@rollup/rollup-android-arm64": "4.50.2", + "@rollup/rollup-darwin-arm64": "4.50.2", + "@rollup/rollup-darwin-x64": "4.50.2", + "@rollup/rollup-freebsd-arm64": "4.50.2", + "@rollup/rollup-freebsd-x64": "4.50.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.2", + "@rollup/rollup-linux-arm-musleabihf": "4.50.2", + "@rollup/rollup-linux-arm64-gnu": "4.50.2", + "@rollup/rollup-linux-arm64-musl": "4.50.2", + "@rollup/rollup-linux-loong64-gnu": "4.50.2", + "@rollup/rollup-linux-ppc64-gnu": "4.50.2", + "@rollup/rollup-linux-riscv64-gnu": "4.50.2", + "@rollup/rollup-linux-riscv64-musl": "4.50.2", + "@rollup/rollup-linux-s390x-gnu": "4.50.2", + "@rollup/rollup-linux-x64-gnu": "4.50.2", + "@rollup/rollup-linux-x64-musl": "4.50.2", + "@rollup/rollup-openharmony-arm64": "4.50.2", + "@rollup/rollup-win32-arm64-msvc": "4.50.2", + "@rollup/rollup-win32-ia32-msvc": "4.50.2", + "@rollup/rollup-win32-x64-msvc": "4.50.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "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, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.6.tgz", + "integrity": "sha512-SRYIB8t/isTwNn8vMB3MR6E+EQZM/WG1aKmmIUCfDXfVvKfc20ZpamngWHKzAmmu9ppsgxsg4b2I7c90JZudIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "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, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "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, + "license": "MIT", + "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, + "license": "ISC" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..43168dc --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "react-todo-22nd", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@eslint/js": "^9.35.0", + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", + "eslint": "^9.35.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.4.0", + "vite": "^7.1.6" + } +} diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..7445042 --- /dev/null +++ b/src/App.css @@ -0,0 +1,167 @@ +* { + text-align: center; + font-family: Pretendard, sans-serif; + margin: 0; + padding: 0; + box-sizing: border-box; +} + +header { + display: flex; + justify-content: center; + padding: 2rem; +} + +h1 { + cursor: pointer; +} + +.dateButton { + position: relative; + top: -0.05rem; +} + +/* ------------- */ + +nav { + display: flex; + align-items: center; + justify-content: center; + padding-bottom: 0.5rem; + gap: 0.5rem; +} + +.dateButton { + border: none; + background: none; + + font-weight: 900; + cursor: pointer; +} + +#currentDate { + border: none; + font-size: 1rem; +} +/* 달력 아이콘 스타일 */ +#currentDate::-webkit-calendar-picker-indicator { + padding: 0; + margin: 0; + cursor: pointer; + + margin-left: -0.2rem; + margin-right: 0.5rem; +} + +.todoCount { + margin-left: 1rem; +} + +/* ------------- */ + +main { + display: flex; + align-items: center; + justify-content: space-between; + + flex-direction: column; +} + +.inputContainer { + display: flex; + flex-direction: row; + + padding: 0.5rem; + margin-bottom: 0.8rem; + width: 100%; + max-width: 20.8rem; +} + +#todoInput { + text-align: start; + padding: 0.6rem; + padding-left: 0.7rem; + flex: 1; + + border: 1px solid grey; + border-radius: 5px; +} +#todoInput::placeholder { + color: #b8b8b8; +} + +.appendTodo { + all: unset; /* 기본 스타일 제거*/ + position: relative; + top: -0.1rem; + + margin-left: 0.9rem; + color: grey; + font-size: 1.5rem; +} +.appendTodo:hover { + color: black; + cursor: pointer; +} + +#todoInput:valid + .appendTodo { + color: black; +} +#todoInput:invalid + .appendTodo { + color: grey; + cursor: not-allowed; +} + +/* ------------- */ + +.listContainer { + display: flex; + align-items: center; + + padding: 0.1rem 0.3rem; + margin-bottom: 10px; + margin-left: 1px; + width: 20rem; +} + +.checkboxButton { + margin-top: 1.5px; + margin-right: 13px; + transform: scale(1.4); + accent-color: #808080; /* 체크 시 배경색 기본 파랑->회색 */ + + cursor: pointer; +} + +.todoContent { + flex: 1; + text-align: left; + word-break: break-all; /* 문자열 길어지면 강제 줄바꿈*/ +} + +/* 체크되었을 때 글자 색 변경 */ +.checkboxButton:checked ~ .todoContent, +.checkboxButton:checked ~ .deleteButton { + color: #8b8b8b; +} +/* 체크되었을 때 취소선 */ +.checkboxButton:checked ~ .todoContent { + text-decoration: line-through; + color: #8b8b8b; +} + +.deleteButton { + position: relative; + top: -2px; + margin-left: 0.9rem; + + font-size: 1.3rem; + border: none; + background: none; + + cursor: pointer; +} +.deleteButton:hover, +.checkboxButton:checked ~ .deleteButton:hover { + color: #d1a29f; +} diff --git a/src/App.jsx b/src/App.jsx new file mode 100644 index 0000000..308d277 --- /dev/null +++ b/src/App.jsx @@ -0,0 +1,148 @@ +import { useState, useEffect } from 'react'; +import './App.css'; + +function App() { + // 오늘 날짜 + const setToday = () => { + const today = new Date(); + const yyyy = today.getFullYear(); + const mm = String(today.getMonth() + 1).padStart(2, '0'); + const dd = String(today.getDate()).padStart(2, '0'); + return `${yyyy}-${mm}-${dd}`; + }; + + const [currentDate, setCurrentDate] = useState(() => sessionStorage.getItem('lastSelectedDate') || setToday()); + const [todoInput, setTodoInput] = useState(''); + const [todos, setTodos] = useState(() => { + const savedTodos = localStorage.getItem('todos'); + return savedTodos ? JSON.parse(savedTodos) : {}; + }); + const list = todos[currentDate] || []; + const todoCount = list.filter((todo) => !todo.checked).length; + + // 날짜 변경 (버튼) + const changeDateButton = (days) => { + const [year, month, day] = currentDate.split('-').map(Number); + const selectedDate = new Date(year, month - 1, day); + selectedDate.setDate(selectedDate.getDate() + days); + + const yyyy = selectedDate.getFullYear(); + const mm = String(selectedDate.getMonth() + 1).padStart(2, '0'); + const dd = String(selectedDate.getDate()).padStart(2, '0'); + + // selectedDate = Date 객체 -> 문자열로 변경 + const stringDate = `${yyyy}-${mm}-${dd}`; + setCurrentDate(stringDate); + sessionStorage.setItem('lastSelectedDate', stringDate); + }; + // 날짜 변경 (아이콘) + const changeDateIcon = (e) => { + const selectedDate = e.target.value; + setCurrentDate(selectedDate); + sessionStorage.setItem('lastSelectedDate', selectedDate); + }; + + // Todo 추가 + const addTodo = () => { + const todoInputText = todoInput.trim(); + if (!todoInputText) return; + + setTodos((prev) => { + const todoList = { ...prev }; + if (!todoList[currentDate]) todoList[currentDate] = []; + todoList[currentDate] = [...todoList[currentDate], { todoInputText, checked: false }]; + return todoList; + }); + setTodoInput(''); + }; + // 한글 입력 enter 처리 + const handleKeyDown = (e) => { + if (e.key === 'Enter' && !e.nativeEvent.isComposing) addTodo(); + }; + + // Todo 완료여부 + const toggleTodo = (index) => { + setTodos((prev) => { + const todoList = { ...prev }; + todoList[currentDate] = todoList[currentDate].map((todo, i) => + i === index ? { ...todo, checked: !todo.checked } : todo, + ); + return todoList; + }); + }; + + // Todo 삭제 + const deleteTodo = (index) => { + setTodos((prev) => { + const todoList = { ...prev }; + // todoList[currentDate].splice(index, 1); + todoList[currentDate] = todoList[currentDate].filter((_, i) => i !== index); + return todoList; + }); + }; + + // 오늘 날짜로 (로고클릭) + const goToday = () => { + const today = setToday(); + setCurrentDate(today); + sessionStorage.setItem('lastSelectedDate', today); + }; + + // todo 저장 + useEffect(() => { + localStorage.setItem('todos', JSON.stringify(todos)); + }, [todos]); + + return ( + <> +
+

+ Todo-List +

+
+ +
+
+ setTodoInput(e.target.value)} + onKeyDown={handleKeyDown} + required + /> + +
+
+ {list.map((todo, index) => ( +
+ toggleTodo(index)} + /> + {todo.todoInputText} + +
+ ))} +
+
+ + ); +} + +export default App; diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main.jsx b/src/main.jsx new file mode 100644 index 0000000..b9a1a6d --- /dev/null +++ b/src/main.jsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.jsx' + +createRoot(document.getElementById('root')).render( + + + , +) diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..8b0f57b --- /dev/null +++ b/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) From 70fd85556ea0599e478e299b1540bf9609fde05f Mon Sep 17 00:00:00 2001 From: jy000n Date: Sat, 20 Sep 2025 00:42:30 +0900 Subject: [PATCH 4/9] =?UTF-8?q?refactor:=20Styled-Component=EB=A1=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 143 ++++++++++++++++++++++++++- package.json | 3 +- src/App.css | 167 ------------------------------- src/App.jsx | 244 ++++++++++++++++++++++++++++++++++++++-------- 4 files changed, 342 insertions(+), 215 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4db54d9..9b7f174 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "0.0.0", "dependencies": { "react": "^19.1.1", - "react-dom": "^19.1.1" + "react-dom": "^19.1.1", + "styled-components": "^6.1.19" }, "devDependencies": { "@eslint/js": "^9.35.0", @@ -305,6 +306,27 @@ "node": ">=6.9.0" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "license": "MIT" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.10", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", @@ -1383,6 +1405,12 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/stylis": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", + "license": "MIT" + }, "node_modules/@vitejs/plugin-react": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.3.tgz", @@ -1539,6 +1567,15 @@ "node": ">=6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001743", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", @@ -1626,11 +1663,30 @@ "node": ">= 8" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "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, "license": "MIT" }, "node_modules/debug": { @@ -2274,7 +2330,6 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, "funding": [ { "type": "github", @@ -2390,7 +2445,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -2435,6 +2489,12 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2553,6 +2613,12 @@ "semver": "bin/semver.js" } }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2580,7 +2646,6 @@ "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, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -2599,6 +2664,68 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/styled-components": { + "version": "6.1.19", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.19.tgz", + "integrity": "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.2.2", + "@emotion/unitless": "0.8.1", + "@types/stylis": "4.2.5", + "css-to-react-native": "3.2.0", + "csstype": "3.1.3", + "postcss": "8.4.49", + "shallowequal": "1.1.0", + "stylis": "4.3.2", + "tslib": "2.6.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", + "license": "MIT" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2629,6 +2756,12 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/package.json b/package.json index 43168dc..2dce413 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ }, "dependencies": { "react": "^19.1.1", - "react-dom": "^19.1.1" + "react-dom": "^19.1.1", + "styled-components": "^6.1.19" }, "devDependencies": { "@eslint/js": "^9.35.0", diff --git a/src/App.css b/src/App.css index 7445042..e69de29 100644 --- a/src/App.css +++ b/src/App.css @@ -1,167 +0,0 @@ -* { - text-align: center; - font-family: Pretendard, sans-serif; - margin: 0; - padding: 0; - box-sizing: border-box; -} - -header { - display: flex; - justify-content: center; - padding: 2rem; -} - -h1 { - cursor: pointer; -} - -.dateButton { - position: relative; - top: -0.05rem; -} - -/* ------------- */ - -nav { - display: flex; - align-items: center; - justify-content: center; - padding-bottom: 0.5rem; - gap: 0.5rem; -} - -.dateButton { - border: none; - background: none; - - font-weight: 900; - cursor: pointer; -} - -#currentDate { - border: none; - font-size: 1rem; -} -/* 달력 아이콘 스타일 */ -#currentDate::-webkit-calendar-picker-indicator { - padding: 0; - margin: 0; - cursor: pointer; - - margin-left: -0.2rem; - margin-right: 0.5rem; -} - -.todoCount { - margin-left: 1rem; -} - -/* ------------- */ - -main { - display: flex; - align-items: center; - justify-content: space-between; - - flex-direction: column; -} - -.inputContainer { - display: flex; - flex-direction: row; - - padding: 0.5rem; - margin-bottom: 0.8rem; - width: 100%; - max-width: 20.8rem; -} - -#todoInput { - text-align: start; - padding: 0.6rem; - padding-left: 0.7rem; - flex: 1; - - border: 1px solid grey; - border-radius: 5px; -} -#todoInput::placeholder { - color: #b8b8b8; -} - -.appendTodo { - all: unset; /* 기본 스타일 제거*/ - position: relative; - top: -0.1rem; - - margin-left: 0.9rem; - color: grey; - font-size: 1.5rem; -} -.appendTodo:hover { - color: black; - cursor: pointer; -} - -#todoInput:valid + .appendTodo { - color: black; -} -#todoInput:invalid + .appendTodo { - color: grey; - cursor: not-allowed; -} - -/* ------------- */ - -.listContainer { - display: flex; - align-items: center; - - padding: 0.1rem 0.3rem; - margin-bottom: 10px; - margin-left: 1px; - width: 20rem; -} - -.checkboxButton { - margin-top: 1.5px; - margin-right: 13px; - transform: scale(1.4); - accent-color: #808080; /* 체크 시 배경색 기본 파랑->회색 */ - - cursor: pointer; -} - -.todoContent { - flex: 1; - text-align: left; - word-break: break-all; /* 문자열 길어지면 강제 줄바꿈*/ -} - -/* 체크되었을 때 글자 색 변경 */ -.checkboxButton:checked ~ .todoContent, -.checkboxButton:checked ~ .deleteButton { - color: #8b8b8b; -} -/* 체크되었을 때 취소선 */ -.checkboxButton:checked ~ .todoContent { - text-decoration: line-through; - color: #8b8b8b; -} - -.deleteButton { - position: relative; - top: -2px; - margin-left: 0.9rem; - - font-size: 1.3rem; - border: none; - background: none; - - cursor: pointer; -} -.deleteButton:hover, -.checkboxButton:checked ~ .deleteButton:hover { - color: #d1a29f; -} diff --git a/src/App.jsx b/src/App.jsx index 308d277..5f94cca 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,6 +1,182 @@ import { useState, useEffect } from 'react'; +import styled from 'styled-components'; import './App.css'; +const Container = styled.div` + text-align: center; + font-family: Pretendard, sans-serif; + margin: 0; + padding: 0; + box-sizing: border-box; +`; + +const Header = styled.header` + display: flex; + justify-content: center; + padding: 2rem; +`; + +const H1 = styled.h1` + cursor: pointer; +`; + +const Nav = styled.nav` + display: flex; + align-items: center; + justify-content: center; + padding-bottom: 0.5rem; + gap: 0.5rem; +`; + +const PrevButton = styled.button` + position: relative; + top: -0.05rem; + + border: none; + background: none; + + font-weight: 900; + cursor: pointer; +`; + +const DateInput = styled.input` + border: none; + font-size: 1rem; + + &::-webkit-calendar-picker-indicator { + margin-left: -0.3rem; + cursor: pointer; + } +`; + +const NextButton = styled.button` + position: relative; + top: -0.05rem; + + border: none; + background: none; + + font-weight: 900; + cursor: pointer; +`; + +const TodoCount = styled.span` + margin-left: 0.5rem; +`; + +const Main = styled.main` + display: flex; + align-items: center; + justify-content: space-between; + + flex-direction: column; +`; + +const InputContainer = styled.div` + display: flex; + flex-direction: row; + + padding: 0.5rem; + margin-bottom: 0.8rem; + width: 100%; + max-width: 19.7rem; +`; + +const TodoInput = styled.input` + text-align: start; + padding: 0.6rem; + padding-left: 0.7rem; + flex: 1; + + border: 1px solid grey; + border-radius: 5px; + + &: placeholder { + color: b8b8b8; + } + + /* 유효한 값일 때 형제 버튼 스타일 */ + &:valid + button { + color: black; + curosr: pointer; + } + + /* 무효한 값일 때 형제 버튼 스타일 */ + &:invalid + button { + color: grey; + cursor: not-allowed; + } +`; + +const AppendButton = styled.button` + all: unset; /* 기본 스타일 제거*/ + position: relative; + top: -0.1rem; + + margin-left: 0.9rem; + color: grey; + font-size: 1.5rem; + + &:hover { + color: black; + cursor: pointer; + } +`; + +const ListContainer = styled.div` + display: flex; + align-items: center; + + padding: 0.1rem 0.3rem; + margin-bottom: 10px; + margin-left: 1px; + width: 20rem; +`; + +const CheckboxButton = styled.input` + margin-top: 1.5px; + margin-right: 13px; + transform: scale(1.4); + accent-color: #808080; /* 체크 시 배경색 기본 파랑->회색 */ + + cursor: pointer; +`; + +const TodoContent = styled.span` + flex: 1; + text-align: left; + word-break: break-all; /* 문자열 길어지면 강제 줄바꿈*/ + + ${({ checked }) => + checked && + ` + text-decoration: line-through; + color: #8b8b8b; + `} +`; + +const DeleteButton = styled.button` + position: relative; + top: -2px; + margin-left: 0.9rem; + + font-size: 1.3rem; + border: none; + background: none; + + cursor: pointer; + + &:hover { + color: #d1a29f; + } + + ${({ checked }) => + checked && + ` + color: #8b8b8b; + `} +`; + function App() { // 오늘 날짜 const setToday = () => { @@ -94,54 +270,38 @@ function App() { }, [todos]); return ( - <> -
-

- Todo-List -

-
- -
-
- +
+

Todo-List

+
+ +
+ + setTodoInput(e.target.value)} onKeyDown={handleKeyDown} required /> - -
-
- {list.map((todo, index) => ( -
- toggleTodo(index)} - /> - {todo.todoInputText} - -
- ))} -
-
- + + + + {list.map((todo, index) => ( + + toggleTodo(index)} /> + {todo.todoInputText} + deleteTodo(index)}> + x + + + ))} + + ); } From 2279ba60bde9eb5241a8a2a586e3e62d3de729a9 Mon Sep 17 00:00:00 2001 From: jy000n Date: Sat, 20 Sep 2025 01:32:04 +0900 Subject: [PATCH 5/9] =?UTF-8?q?feat:=20=EC=9D=BC=EC=A3=BC=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EB=B2=84=ED=8A=BC=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.jsx | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 5f94cca..94f6154 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -14,6 +14,7 @@ const Header = styled.header` display: flex; justify-content: center; padding: 2rem; + padding-bottom: 1.5rem; `; const H1 = styled.h1` @@ -26,11 +27,25 @@ const Nav = styled.nav` justify-content: center; padding-bottom: 0.5rem; gap: 0.5rem; + + margin-bottom: 0.3rem; +`; + +const PrevWeekButton = styled.button` + position: relative; + top: -0.05rem; + + border: none; + background: none; + + font-weight: 900; + cursor: pointer; `; const PrevButton = styled.button` position: relative; top: -0.05rem; + margin-left: -0.5rem; border: none; background: none; @@ -40,11 +55,15 @@ const PrevButton = styled.button` `; const DateInput = styled.input` + position: relative; + top: -0.1rem; + border: none; font-size: 1rem; + font-family: Pretendard, sans-serif; &::-webkit-calendar-picker-indicator { - margin-left: -0.3rem; + margin-left: -0.5rem; cursor: pointer; } `; @@ -52,6 +71,18 @@ const DateInput = styled.input` const NextButton = styled.button` position: relative; top: -0.05rem; + margin-right: -0.5rem; + + border: none; + background: none; + + font-weight: 900; + cursor: pointer; +`; + +const NextWeekButton = styled.button` + position: relative; + top: -0.05rem; border: none; background: none; @@ -61,7 +92,7 @@ const NextButton = styled.button` `; const TodoCount = styled.span` - margin-left: 0.5rem; + margin-left: 0.3rem; `; const Main = styled.main` @@ -275,9 +306,11 @@ function App() {

Todo-List

From b885b7e8c9838eb90f95408581730413cb87a017 Mon Sep 17 00:00:00 2001 From: jy000n Date: Sat, 20 Sep 2025 05:15:00 +0900 Subject: [PATCH 6/9] =?UTF-8?q?feat:=20=EB=8B=A4=ED=81=AC/=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20=EB=AA=A8=EB=93=9C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/themeIcon/moon.png | Bin 0 -> 10670 bytes public/themeIcon/sun.png | Bin 0 -> 11767 bytes src/App.jsx | 147 ++++++++++++++++++++++++++------------ src/Theme.jsx | 13 ++++ 4 files changed, 113 insertions(+), 47 deletions(-) create mode 100644 public/themeIcon/moon.png create mode 100644 public/themeIcon/sun.png create mode 100644 src/Theme.jsx diff --git a/public/themeIcon/moon.png b/public/themeIcon/moon.png new file mode 100644 index 0000000000000000000000000000000000000000..af6510bf1b15a2577b0058e02242fb55439fbd51 GIT binary patch literal 10670 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 es3kes1X6w-j`<Tt_ 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 props.theme.background}; + color: ${(props) => props.theme.color}; + font-family: Pretendard, sans-serif; + } +`; const Container = styled.div` text-align: center; - font-family: Pretendard, sans-serif; margin: 0; padding: 0; box-sizing: border-box; @@ -21,6 +28,22 @@ const H1 = styled.h1` cursor: pointer; `; +const ThemeToggleButton = styled.button` + border: none; + background: none; + cursor: pointer; + + img { + width: 1.5rem; + height: 1.5rem; + + margin-left: 0.5rem; + margin-top: 0.3rem; + + filter: ${(props) => (props.isDark ? 'invert(100%) brightness(200%)' : 'none')}; + } +`; + const Nav = styled.nav` display: flex; align-items: center; @@ -40,6 +63,8 @@ const PrevWeekButton = styled.button` font-weight: 900; cursor: pointer; + + color: ${(props) => props.theme.color}; `; const PrevButton = styled.button` @@ -52,6 +77,8 @@ const PrevButton = styled.button` font-weight: 900; cursor: pointer; + + color: ${(props) => props.theme.color}; `; const DateInput = styled.input` @@ -62,9 +89,15 @@ const DateInput = styled.input` font-size: 1rem; font-family: Pretendard, sans-serif; + background-color: ${(props) => props.theme.inputBackground}; + color: ${(props) => props.theme.color}; + &::-webkit-calendar-picker-indicator { margin-left: -0.5rem; cursor: pointer; + + filter: ${(props) => (props.theme.mode === 'dark' ? 'invert(100%) brightness(200%)' : 'none')}; + } } `; @@ -78,6 +111,8 @@ const NextButton = styled.button` font-weight: 900; cursor: pointer; + + color: ${(props) => props.theme.color}; `; const NextWeekButton = styled.button` @@ -89,6 +124,8 @@ const NextWeekButton = styled.button` font-weight: 900; cursor: pointer; + + color: ${(props) => props.theme.color}; `; const TodoCount = styled.span` @@ -126,13 +163,13 @@ const TodoInput = styled.input` color: b8b8b8; } - /* 유효한 값일 때 형제 버튼 스타일 */ + /* 유효한 값일 때 형제 버튼(+) 스타일 */ &:valid + button { - color: black; - curosr: pointer; + color: ${(props) => (props.theme.mode === 'dark' ? '#fff' : 'black')}; + cursor: pointer; } - /* 무효한 값일 때 형제 버튼 스타일 */ + /* 무효한 값일 때 형제 버튼(+) 스타일 */ &:invalid + button { color: grey; cursor: not-allowed; @@ -149,7 +186,6 @@ const AppendButton = styled.button` font-size: 1.5rem; &:hover { - color: black; cursor: pointer; } `; @@ -201,11 +237,7 @@ const DeleteButton = styled.button` color: #d1a29f; } - ${({ checked }) => - checked && - ` - color: #8b8b8b; - `} + color: ${({ checked, theme }) => (checked ? '#8b8b8b' : theme.mode === 'dark' ? '#fff' : '#000')}; `; function App() { @@ -218,6 +250,10 @@ function App() { return `${yyyy}-${mm}-${dd}`; }; + const [isDark, setIsDark] = useState(() => { + const savedThemeMode = sessionStorage.getItem('themeMode'); + return savedThemeMode === 'dark' ? true : false; + }); const [currentDate, setCurrentDate] = useState(() => sessionStorage.getItem('lastSelectedDate') || setToday()); const [todoInput, setTodoInput] = useState(''); const [todos, setTodos] = useState(() => { @@ -227,6 +263,14 @@ function App() { const list = todos[currentDate] || []; const todoCount = list.filter((todo) => !todo.checked).length; + // 테마 + const toggleTheme = () => + setIsDark((prev) => { + const themeMode = !prev; + sessionStorage.setItem('themeMode', themeMode ? 'dark' : 'light'); + return themeMode; + }); + // 날짜 변경 (버튼) const changeDateButton = (days) => { const [year, month, day] = currentDate.split('-').map(Number); @@ -301,40 +345,49 @@ function App() { }, [todos]); return ( - -
-

Todo-List

-
- -
- - setTodoInput(e.target.value)} - onKeyDown={handleKeyDown} - required - /> - + - - {list.map((todo, index) => ( - - toggleTodo(index)} /> - {todo.todoInputText} - deleteTodo(index)}> - x - - - ))} -
-
+ + + +
+

Todo-List

+ + {isDark + +
+ +
+ + setTodoInput(e.target.value)} + onKeyDown={handleKeyDown} + required + /> + + + + {list.map((todo, index) => ( + + toggleTodo(index)} /> + {todo.todoInputText} + deleteTodo(index)}> + x + + + ))} +
+
+
); } diff --git a/src/Theme.jsx b/src/Theme.jsx new file mode 100644 index 0000000..539e64b --- /dev/null +++ b/src/Theme.jsx @@ -0,0 +1,13 @@ +export const lightTheme = { + background: '#ffffff', + inputBackground: '#fff', + color: '#000000', + mode: 'light', +}; + +export const darkTheme = { + background: '#121212', + inputBackground: '#121212', + color: '#ffffff', + mode: 'dark', +}; From 5943420cca23bf7fc8a39392a65ef7774cca6f11 Mon Sep 17 00:00:00 2001 From: jy000n Date: Sat, 20 Sep 2025 05:19:58 +0900 Subject: [PATCH 7/9] =?UTF-8?q?deploy:=20vercel=20=EC=9E=AC=EB=B0=B0?= =?UTF-8?q?=ED=8F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.jsx | 2 +- src/Theme.jsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 66f6aaa..9748636 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react'; +import React, { useState, useEffect } from 'react'; import styled, { ThemeProvider, createGlobalStyle } from 'styled-components'; import { lightTheme, darkTheme } from './Theme'; diff --git a/src/Theme.jsx b/src/Theme.jsx index 539e64b..bd2adc0 100644 --- a/src/Theme.jsx +++ b/src/Theme.jsx @@ -1,13 +1,13 @@ export const lightTheme = { + mode: 'light', background: '#ffffff', inputBackground: '#fff', color: '#000000', - mode: 'light', }; export const darkTheme = { + mode: 'dark', background: '#121212', inputBackground: '#121212', color: '#ffffff', - mode: 'dark', }; From e1306d758ad561bab7300ca877d028b10e4655ed Mon Sep 17 00:00:00 2001 From: jy000n Date: Sat, 20 Sep 2025 05:23:49 +0900 Subject: [PATCH 8/9] =?UTF-8?q?design:=20todoList=20=EB=82=B4=EC=9A=A9=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.jsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/App.jsx b/src/App.jsx index 9748636..5fdaf98 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -203,6 +203,7 @@ const ListContainer = styled.div` const CheckboxButton = styled.input` margin-top: 1.5px; margin-right: 13px; + transform: scale(1.4); accent-color: #808080; /* 체크 시 배경색 기본 파랑->회색 */ @@ -213,6 +214,7 @@ const TodoContent = styled.span` flex: 1; text-align: left; word-break: break-all; /* 문자열 길어지면 강제 줄바꿈*/ + margin-top: -0.1rem; ${({ checked }) => checked && From ad3bbb2081d81545151e5c44d0086b70bf19f601 Mon Sep 17 00:00:00 2001 From: jy000n Date: Sat, 20 Sep 2025 10:10:27 +0900 Subject: [PATCH 9/9] =?UTF-8?q?remove:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=8C=8C=EC=9D=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script.js | 172 ------------------------------------------------------ style.css | 167 ---------------------------------------------------- 2 files changed, 339 deletions(-) delete mode 100644 script.js delete mode 100644 style.css diff --git a/script.js b/script.js deleted file mode 100644 index 74b82d4..0000000 --- a/script.js +++ /dev/null @@ -1,172 +0,0 @@ -document.addEventListener("DOMContentLoaded", () => { - const goToday = document.getElementById("goToday"); - const prevButton = document.getElementById("prevButton"); - const currentDate = document.getElementById("currentDate"); - const nextButton = document.getElementById("nextButton"); - const todoCount = document.querySelector(".todoCount"); - const todoInput = document.getElementById("todoInput"); - const appendTodo = document.querySelector(".appendTodo"); - const mainContainer = document.querySelector("main"); - - // todo 리스트 컨테이너 div 태그 추가 - const todoListContainer = document.createElement("div"); - mainContainer.appendChild(todoListContainer); - - // 날짜별 투두리스트 저장 - let todos = {}; - - // 마지막으로 선택된 날짜 (session 우선, 없으면 local) - const savedDate = sessionStorage.getItem("lastSelectedDate"); - - // 날짜 디폴트값 : 당일 - function setToday() { - const today = new Date(); - const yyyy = today.getFullYear(); - const mm = String(today.getMonth() + 1).padStart(2, "0"); // 1~9월 앞에 0 붙임 - const dd = String(today.getDate()).padStart(2, "0"); // 1~9일 앞에 0 붙임 - - const defaultDate = `${yyyy}-${mm}-${dd}`; - currentDate.value = defaultDate; - - sessionStorage.setItem("lastSelectedDate", defaultDate); - - loadTodos(); - renderTodos(defaultDate); - } - - // 페이지 새로고침 / 처음 열었을 때 - function setInitialDate() { - loadTodos(); - - if (savedDate) { - currentDate.value = savedDate; - } else { - setToday(); - return; - } - renderTodos(currentDate.value); - } - - setInitialDate(); // 페이지 로딩 시 날짜 설정 - - // 날짜 변경 - function changeDate(days) { - // value를 연도, 월, 일로 분리 - const [year, month, day] = currentDate.value.split("-").map(Number); - const selectedDate = new Date(year, month - 1, day); // JS에서 month는 0~11 - selectedDate.setDate(selectedDate.getDate() + days); - - const yyyy = selectedDate.getFullYear(); - const mm = String(selectedDate.getMonth() + 1).padStart(2, "0"); - const dd = String(selectedDate.getDate()).padStart(2, "0"); - currentDate.value = `${yyyy}-${mm}-${dd}`; - - sessionStorage.setItem("lastSelectedDate", currentDate.value); - renderTodos(currentDate.value); - } - - // 버튼 클릭 시 날짜 변경 - prevButton.addEventListener("click", () => { - changeDate(-1); - }); - nextButton.addEventListener("click", () => { - changeDate(1); - }); - - // 달력에서 날짜 변경 - currentDate.addEventListener("change", () => { - sessionStorage.setItem("lastSelectedDate", currentDate.value); // 선택한 날짜 저장 - renderTodos(currentDate.value); - }); - - // Todo 추가 - appendTodo.addEventListener("click", () => { - const text = todoInput.value.trim(); - if (!text) return; - - if (!todos[currentDate.value]) todos[currentDate.value] = []; - todos[currentDate.value].push({ text, checked: false }); // todo 객체 형태로 저장 - - todoInput.value = ""; // 입력값 초기화 - saveTodos(); - renderTodos(currentDate.value); - }); - todoInput.addEventListener("keydown", (event) => { - if (event.isComposing) return; // 입력(조합) 중일 때 무시 - if (event.key === "Enter") { - appendTodo.click(); - } - }); - - // Todo 렌더링 - function renderTodos(date) { - // 기존 목록 초기화 - while (todoListContainer.firstChild) { - todoListContainer.removeChild(todoListContainer.firstChild); - } - const list = todos[date] || []; - - list.forEach((todo, index) => { - const div = document.createElement("div"); - div.className = "listContainer"; - - // 체크박스 - const checkbox = document.createElement("input"); - checkbox.type = "checkbox"; - checkbox.className = "checkboxButton"; - checkbox.id = `checkbox-${index}`; - checkbox.checked = todo.checked; - // todo 내용 - const todoContent = document.createElement("span"); - todoContent.className = "todoContent"; - todoContent.textContent = todo.text; - // 삭제 - const deleteButton = document.createElement("button"); - deleteButton.className = "deleteButton"; - deleteButton.textContent = "x"; - - div.appendChild(checkbox); - div.appendChild(todoContent); - div.appendChild(deleteButton); - - todoListContainer.appendChild(div); - - // 체크박스 - checkbox.addEventListener("change", () => { - todo.checked = checkbox.checked; - saveTodos(); - renderTodos(date); // 상태 반영 위해 다시 렌더링 - }); - - // 투두 삭제 - deleteButton.addEventListener("click", () => { - todos[date].splice(index, 1); - saveTodos(); - renderTodos(date); - }); - }); - - // 투두 개수 - todoCount.textContent = `${list.filter((todo) => !todo.checked).length} 개`; - } - - // 투두 리스트 로컬 스토리지에 저장 - function saveTodos() { - localStorage.setItem("todos", JSON.stringify(todos)); - } - // 투두 리스트 로드 - function loadTodos() { - const data = localStorage.getItem("todos"); - if (data) { - todos = JSON.parse(data); - } - } - - // 페이지 로드 시 투두리스트 로드 - loadTodos(); - - // Todo-List 클릭 -> 오늘 날짜로 - goToday.addEventListener("click", () => { - setToday(); - }); -}); diff --git a/style.css b/style.css deleted file mode 100644 index d8a20e1..0000000 --- a/style.css +++ /dev/null @@ -1,167 +0,0 @@ -* { - text-align: center; - font-family: Pretendard; - margin: 0; - padding: 0; - box-sizing: border-box; -} - -header { - display: flex; - justify-content: center; - padding: 2rem; -} - -h1 { - cursor: pointer; -} - -.dateButton { - position: relative; - top: -0.05rem; -} - -/* ------------- */ - -nav { - display: flex; - align-items: center; - justify-content: center; - padding-bottom: 0.5rem; - gap: 0.5rem; -} - -.dateButton { - border: none; - background: none; - - font-weight: 900; - cursor: pointer; -} - -#currentDate { - border: none; - font-size: 1rem; -} -/* 달력 아이콘 스타일 */ -#currentDate::-webkit-calendar-picker-indicator { - padding: 0; - margin: 0; - cursor: pointer; - - margin-left: -0.2rem; - margin-right: 0.5rem; -} - -.todoCount { - margin-left: 1rem; -} - -/* ------------- */ - -main { - display: flex; - align-items: center; - justify-content: space-between; - - flex-direction: column; -} - -.inputContainer { - display: flex; - flex-direction: row; - - padding: 0.5rem; - margin-bottom: 0.8rem; - width: 100%; - max-width: 20.8rem; -} - -#todoInput { - text-align: start; - padding: 0.6rem; - padding-left: 0.7rem; - flex: 1; - - border: 1px solid grey; - border-radius: 5px; -} -#todoInput::placeholder { - color: #b8b8b8; -} - -.appendTodo { - all: unset; /* 기본 스타일 제거*/ - position: relative; - top: -0.1rem; - - margin-left: 0.9rem; - color: grey; - font-size: 1.5rem; -} -.appendTodo:hover { - color: black; - cursor: pointer; -} - -#todoInput:valid + .appendTodo { - color: black; -} -#todoInput:invalid + .appendTodo { - color: grey; - cursor: not-allowed; -} - -/* ------------- */ - -.listContainer { - display: flex; - align-items: center; - - padding: 0.1rem 0.3rem; - margin-bottom: 10px; - margin-left: 1px; - width: 20rem; -} - -.checkboxButton { - margin-top: 1.5px; - margin-right: 13px; - transform: scale(1.4); - accent-color: #808080; /* 체크 시 배경색 기본 파랑->회색 */ - - cursor: pointer; -} - -.todoContent { - flex: 1; - text-align: left; - word-break: break-all; /* 문자열 길어지면 강제 줄바꿈*/ -} - -/* 체크되었을 때 글자 색 변경 */ -.checkboxButton:checked ~ .todoContent, -.checkboxButton:checked ~ .deleteButton { - color: #8b8b8b; -} -/* 체크되었을 때 취소선 */ -.checkboxButton:checked ~ .todoContent { - text-decoration: line-through; - color: #8b8b8b; -} - -.deleteButton { - position: relative; - top: -2px; - margin-left: 0.9rem; - - font-size: 1.3rem; - border: none; - background: none; - - cursor: pointer; -} -.deleteButton:hover, -.checkboxButton:checked ~ .deleteButton:hover { - color: #d1a29f; -}