From 73c5fe694f2b4bcf35dbc6b1862e261bd424588d Mon Sep 17 00:00:00 2001 From: a-00-a Date: Wed, 18 Mar 2026 01:52:12 +0900 Subject: [PATCH 01/20] chore: add favicon and app icons --- react-todo/index.html | 68 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 react-todo/index.html diff --git a/react-todo/index.html b/react-todo/index.html new file mode 100644 index 0000000..b626e01 --- /dev/null +++ b/react-todo/index.html @@ -0,0 +1,68 @@ + + + + + + + + + + + + React Todo + + + + + +
+ +

To Do

+
+ + + + + +
+
+ +
0
+ +
+
+
+ + + From 87093722f40a2fcd5a9baca471163a40a9b8edae Mon Sep 17 00:00:00 2001 From: a-00-a Date: Wed, 18 Mar 2026 03:14:28 +0900 Subject: [PATCH 02/20] chore: add Prettier configuration and npm format script --- react-todo/.prettierrc | 8 ++++++++ react-todo/package.json | 17 +++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 react-todo/.prettierrc create mode 100644 react-todo/package.json diff --git a/react-todo/.prettierrc b/react-todo/.prettierrc new file mode 100644 index 0000000..f415c34 --- /dev/null +++ b/react-todo/.prettierrc @@ -0,0 +1,8 @@ +{ + "htmlWhitespaceSensitivity": "ignore", + "singleQuote": true, + "printWidth": 120, + "tabWidth": 2, + "semi": true, + "endOfLine": "lf" +} diff --git a/react-todo/package.json b/react-todo/package.json new file mode 100644 index 0000000..a3c0e8e --- /dev/null +++ b/react-todo/package.json @@ -0,0 +1,17 @@ +{ + "name": "react-todo", + "version": "1.0.0", + "description": "", + "main": "main.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "format": "prettier --write \"**/*.{js,jsx,ts,tsx,html,css,json,md}\"" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "devDependencies": { + "prettier": "^3.8.1" + } +} From 7aadd4f305d17ec4d8f213208fc97f720519984d Mon Sep 17 00:00:00 2001 From: a-00-a Date: Wed, 18 Mar 2026 03:16:51 +0900 Subject: [PATCH 03/20] chore: add .gitignore --- react-todo/.gitignore | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 react-todo/.gitignore diff --git a/react-todo/.gitignore b/react-todo/.gitignore new file mode 100644 index 0000000..7cc758b --- /dev/null +++ b/react-todo/.gitignore @@ -0,0 +1,5 @@ +# Node modules +node_modules/ + +# npm lock 파일 +package-lock.json \ No newline at end of file From 95b1eb6df58dab0cba8c489db84a0ec097412d6d Mon Sep 17 00:00:00 2001 From: a-00-a Date: Wed, 18 Mar 2026 04:58:40 +0900 Subject: [PATCH 04/20] chore: clean up CSS variables and add comments --- react-todo/styles.css | 451 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 451 insertions(+) create mode 100644 react-todo/styles.css diff --git a/react-todo/styles.css b/react-todo/styles.css new file mode 100644 index 0000000..71fb4a9 --- /dev/null +++ b/react-todo/styles.css @@ -0,0 +1,451 @@ +:root { + --bg: #cbdef0; + --bg-darkmode: #3d3c3c; + --text: #000000; + --text-darkmode: #5b5959; + --text-header: #000000; + --text-darkmode-header: #ffffff; + + /* inputContainer */ + --bg-inputContainer: #ffffff; + --bg-inputContainer-darkmode: #2c2c2c; + --bg-enter: #ffc933; + --text-enter: #000000; + --text-darkmode-enter: #ffffff; + --text-todocount: #b2b0b0; + --text-countitem: #b2b0b0; + + /* container */ + --text-todoitem: #000000; + --text-darkmode-todo: #000000; + --bg-todoitem: #f9c254; + --bg-todoitem-darkmode: #d6d7d8; + --completed-todoitem: #f8b2b2; + --deleteButton: #f3f4f6; + --hover-deleteButton: #e5e7eb; + --text-deleteButton: #000000; + --border-placeholder: #ccc; + + /* checkbox */ + --bg-checkbox: #f9f9f9; + --checked-checkbox: #ff4d4d; + + /* sidebar */ + --bg-sidebar: #fbf0d6; + --bg-sidebar-darkmode: #ffffff; + --hamburger: #000000; + --darkmode-hamburger: #ffffff; + --closeButton: #a5a3a3; + --text-darkmode-closeBtn: #5b5959; + --border-datePicker: #ccc; + --text-sidebarButton: #000000; + --text-darkmode-sidebar: #a5a3a3; + --text-datePicker: #a5a3a3; + + /* nav */ + --text-nav: #ffffff; + --text-darkmode-nav: #5b5959; + --dateButton: #000000; + --text-darkmode-dateButton: #5b5959; + --weekBtn: #ffffff; +} + +/*기본 스타일 설정*/ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html, +body { + font-family: 'Pretendard', sans-serif; +} + +/* body 스타일 */ +body { + background-color: var(--bg); + color: var(--text); +} + +body.dark-mode { + background-color: var(--bg-darkmode); + color: var(--text-darkmode); +} + +/* 헤더 스타일 */ +header { + display: flex; + position: relative; + align-items: center; + justify-content: center; + color: var(--text-header); + width: 100%; + height: 4rem; + cursor: default; +} + +body.dark-mode header { + color: var(--text-darkmode-header); +} + +/*햄버거 메뉴 버튼 스타일*/ +.hamburger { + position: absolute; + left: 1rem; + padding: 0; + margin: 0; + cursor: pointer; + color: var(--hamburger); + border: none; + background-color: transparent; + font-size: 2rem; +} + +body.dark-mode .hamburger { + color: var(--darkmode-hamburger); +} + +/*내비게이션 바 스타일*/ +nav { + display: flex; + gap: 10px; + margin-top: 1rem; + justify-content: center; + align-items: center; + color: var(--text-nav); +} + +/* 모바일 화면 환경 */ +@media (max-width: 500px) { + .inputContainer, + .todo { + width: 90%; + } + + nav { + flex-wrap: wrap; + gap: 5px; + } +} + +/* 달력 버튼 스타일 */ +.calendarWrapper { + position: relative; + width: 22px; + height: 22px; +} + +.calendarWrapper:hover { + transform: scale(1.1); +} + +/*실제 날짜 입력 요소 스타일*/ +#datePicker { + position: absolute; + background: transparent; + color: var(--text-datePicker); + inset: 0; + border: none; + opacity: 100; + cursor: pointer; +} + +/*webkit browser 날짜 텍스트 숨기기*/ +#datePicker::-webkit-datetime-edit { + display: none; +} + +/*달력 아이콘 표시 및 스타일*/ +#datePicker::-webkit-calendar-picker-indicator { + cursor: pointer; + width: 18px; + height: 18px; + transform: scale(1.2); +} + +body.dark-mode nav { + color: var(--text-darkmode-nav); +} + +/*main 스타일*/ +main { + display: flex; + align-items: center; + flex-direction: column; +} + +/*화살표 버튼 스타일*/ +.dateButton { + border: none; + cursor: pointer; + background-color: transparent; + color: var(--dateButton); +} + +body.dark-mode .dateButton { + color: var(--text-darkmode-dateButton); +} + +/*카운트 숫자*/ +#todo-count { + margin-left: 10px; + font-size: 14px; + color: var(--text-todocount); +} + +/*카운트 item*/ +.count { + color: var(--text-countitem); + font-size: 14px; +} + +/*입력창 스타일*/ +.inputContainer { + box-shadow: 0 3px 10px rgba(0, 0, 0, 0.08); + display: flex; + border-radius: 1rem; + width: 20rem; + padding: 10px; + margin: 2rem 0 1rem 0; + background-color: var(--bg-inputContainer); + align-items: center; + justify-content: center; + position: relative; +} + +/* 입력창 스타일 */ +.input { + border: none; + outline: none; + text-align: left; + flex-grow: 1; +} + +/* 엔터 버튼 스타일 */ +.enter { + display: flex; + cursor: pointer; + border: none; + padding: 5px 10px; + margin-left: 10px; + border-radius: 5px; + background-color: var(--bg-enter); + color: var(--text-enter); + font-weight: 500; + font-size: 14px; +} + +.enter:active { + transform: scale(0.95); +} + +body.dark-mode .inputContainer, +body.dark-mode .enter, +body.dark-mode .input { + background: var(--bg-inputContainer-darkmode); +} + +body.dark-mode .enter { + color: var(--text-darkmode-enter); +} + +/*할 일 리스트 스타일*/ +.container { + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 10px; + height: 100%; + max-height: 500px; + overflow-y: scroll; + margin-bottom: 100px; +} + +/*할 일 item*/ +.todo { + transition: + transform 0.2s ease, + box-shadow 0.2s ease; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05); + animation: fadeIn 0.2s ease; + display: flex; + align-items: center; + background-color: var(--bg-todoitem); + color: var(--text-todoitem); + font-weight: 500; + font-size: 14px; + border-radius: 1rem; + width: 20rem; + padding: 10px; + gap: 10px; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.todo:hover { + transform: translateY(-1px); +} + +.todo.dragging { + opacity: 0.3; + transform: scale(1.05); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); +} + +.todo.placeholder { + height: 50px; + margin: 10px 0; + border: 2px dashed var(--border-placeholder); + border-radius: 1rem; + transition: height 0.2s ease; +} + +body.dark-mode .todo { + background: var(--bg-todoitem-darkmode); + color: var(--text-darkmode-todo); +} + +/*체크박스 스타일*/ +.todo input[type='checkbox'] { + appearance: none; + flex-shrink: 0; + width: 18px; + height: 18px; + border-radius: 5px; + border: 2px solid var(--bg-checkbox); + transition: all 0.2s ease-in-out; + cursor: pointer; + position: relative; + background-color: var(--bg-checkbox); +} + +.todo input[type='checkbox']:checked { + background-color: var(--bg-checkbox); +} + +.todo input[type='checkbox']:checked::after { + content: '✓'; + position: absolute; + color: var(--checked-checkbox); + font-size: 14px; + left: 3px; + top: -2px; +} + +/*할 일 텍스트 스타일*/ +.todo span { + flex-grow: 1; + font-size: 14px; + text-align: left; + word-break: break-all; /*피드백 수정; 영문, 숫자의 줄바꿈 안됨*/ +} + +/*완료된 할 일 텍스트 스타일*/ +.completed { + text-decoration: line-through; + color: var(--completed-todoitem); +} + +/*할 일 삭제 버튼 스타일*/ +.delete { + flex-shrink: 0; + background: var(--deleteButton); + color: var(--text-deleteButton); + border: none; + padding: 5px 10px; + border-radius: 5px; + cursor: pointer; + transition: background 0.2s; +} + +.delete:hover { + background: var(--hover-deleteButton); +} + +/*사이드바 스타일*/ +.sidebar { + position: fixed; + top: 0; + left: -250px; + width: 250px; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + background: var(--bg-sidebar); + transition: left 0.3s ease-in-out; + padding: 0.2rem; +} + +body.dark-mode .sidebar { + background: var(--bg-sidebar-darkmode); + color: var(--text-darkmode-sidebar); +} + +.sidebar button:not(.close) { + display: block; + width: 100%; + margin: 10px 0; + padding: 10px; + font-size: 15px; + font-weight: 500; + background: transparent; + color: var(--text-sidebarButton); + border: none; + cursor: pointer; +} + +/*사이드바 닫기 버튼*/ +.close { + width: auto; + margin: 20px 0 0 0; + align-self: flex-start; + border: none; + font-size: 19px; + cursor: pointer; + background-color: transparent; + color: var(--closeButton); +} + +.close:hover { + transform: scale(1.1); +} + +body.dark-mode .close { + color: var(--text-darkmode-closeBtn); +} + +/*주간 버튼 스타일*/ +.weekBtn { + display: block; + width: 100%; + padding: 10px; + margin: 5px 0; + background: var(--weekBtn); + color: var(--text); + border: none; + cursor: pointer; +} + +body.dark-mode .weekBtn { + color: var(--text-darkmode); +} + +/*테마 스타일*/ +.theme { + width: 100%; +} + +body.dark-mode #currentDate { + color: var(--text-darkmode); +} From 07e8467b3571a6f73793344231e4ed094ad70f79 Mon Sep 17 00:00:00 2001 From: a-00-a Date: Wed, 18 Mar 2026 05:44:51 +0900 Subject: [PATCH 05/20] chore: add JS file, update CSS variables, and refine styling --- react-todo/main.js | 270 ++++++++++++++++++++++++++++++++++++++++++ react-todo/styles.css | 39 +++--- 2 files changed, 292 insertions(+), 17 deletions(-) create mode 100644 react-todo/main.js diff --git a/react-todo/main.js b/react-todo/main.js new file mode 100644 index 0000000..6527d97 --- /dev/null +++ b/react-todo/main.js @@ -0,0 +1,270 @@ +document.addEventListener('DOMContentLoaded', function () { + //DOM 요소 가져오기 + const input = document.querySelector('.input'); + const enterButton = document.querySelector('.enter'); + const todoContainer = document.querySelector('.container'); + const currentDateSpan = document.getElementById('currentDate'); + const prevButton = document.getElementById('prev'); + const nextButton = document.getElementById('next'); + const datePicker = document.getElementById('datePicker'); + const themeBtn = document.querySelector('.theme'); + const body = document.body; + const homeButton = document.querySelector('h2'); + const sidebar = document.querySelector('.sidebar'); + const hamburger = document.querySelector('.hamburger'); + const closeBtn = document.querySelector('.close'); + const todoCountSpan = document.getElementById('todo-count'); + + // Date 객체를 YYYY-MM-DD 형식의 문자열로 변환 + function formatDateToYYYYMMDD(date) { + return [ + date.getFullYear(), + String(date.getMonth() + 1).padStart(2, '0'), + String(date.getDate()).padStart(2, '0'), + ].join('-'); + } + + // 현재 선택된 날짜 (YYYY-MM-DD 형식) + let currentDate = formatDateToYYYYMMDD(new Date()); + + // YYYY-MM-DD 문자열을 "YYYY년 M월 D일" 형식으로 변환 + function formatDate(dateString) { + const [y, m, d] = dateString.split('-').map(Number); + return `${y}년 ${m}월 ${d}일`; + } + + // 현재 날짜 상태를 UI에 반영 + function updateDateUI() { + currentDateSpan.textContent = formatDate(currentDate); + datePicker.value = currentDate; + updateTodoCount(); + } + + // 할 일 리스트 불러오기 (로컬 스토리지) + function loadTodos() { + todoContainer.innerHTML = ''; + const todos = JSON.parse(localStorage.getItem(currentDate)) || []; + todos.forEach(({ id, text, completed }) => addTodoElement(id, text, completed)); + updateTodoCount(); + } + + // 새로운 할 일 요소 추가 + function addTodoElement(id, text, completed = false) { + const todoDiv = document.createElement('div'); + todoDiv.classList.add('todo'); + todoDiv.setAttribute('draggable', true); /*드래그 가능 설정*/ + todoDiv.dataset.id = id; /*순서 저장용*/ + + // 체크박스 + const checkbox = document.createElement('input'); + checkbox.type = 'checkbox'; + checkbox.checked = completed; + checkbox.classList.add('checkbox'); + + checkbox.addEventListener('change', () => { + // UI 클래스 토글 먼저 + if (checkbox.checked) { + todoText.classList.add('completed'); + } else { + todoText.classList.remove('completed'); + } + + // localStorage Update + toggleComplete(id, checkbox.checked); + + /*console 확인용 + console.log( + `Todo "${todoText.textContent}" completed:`, + todoText.classList.contains("completed") + );*/ + }); + + // Todo 텍스트 요소 생성 (완료 시 CSS 클래스 적용) + const todoText = document.createElement('span'); + todoText.textContent = text; + if (completed) { + todoText.classList.add('completed'); + } + + // 삭제버튼 + const deleteButton = document.createElement('button'); + deleteButton.textContent = '삭제'; + deleteButton.classList.add('delete'); + deleteButton.addEventListener('click', () => removeTodo(id)); + + todoDiv.append(checkbox, todoText, deleteButton); + todoContainer.appendChild(todoDiv); + + // 드래그 이벤트 추가 + addDragAndDropListeners(todoDiv); + } + + // 드래그 이벤트 함수 + let placeholder = null; + + function addDragAndDropListeners(item) { + item.draggable = true; + + item.addEventListener('dragstart', () => { + item.classList.add('dragging'); + placeholder = document.createElement('div'); + placeholder.classList.add('todo', 'placeholder'); + item.parentNode.insertBefore(placeholder, item.nextSibling); + }); + + item.addEventListener('dragend', () => { + item.classList.remove('dragging'); + if (placeholder) { + placeholder.parentNode.replaceChild(item, placeholder); + placeholder = null; + saveNewOrder(); // localStorage에 순서 저장 + } + }); + + item.addEventListener('dragover', (e) => { + e.preventDefault(); + const container = item.parentNode; + const draggingItem = document.querySelector('.dragging'); + if (draggingItem === item) return; + + const rect = item.getBoundingClientRect(); + const offset = e.clientY - rect.top; + const middle = rect.height / 2; + + if (offset > middle) { + container.insertBefore(placeholder, item.nextSibling); + } else { + container.insertBefore(placeholder, item); + } + }); + } + + // 순서 변경 후 LocalStorage에 저장 + function saveNewOrder() { + const todos = []; + todoContainer.querySelectorAll('.todo').forEach((todoDiv) => { + const id = todoDiv.dataset.id; + const text = todoDiv.querySelector('span').textContent; + const completed = todoDiv.querySelector('input').checked; + todos.push({ id, text, completed }); + }); + localStorage.setItem(currentDate, JSON.stringify(todos)); + } + + // 할 일 추가 + function addTodo() { + const text = input.value.trim(); + if (!text) return; + + const todos = JSON.parse(localStorage.getItem(currentDate)) || []; + const newTodo = { id: crypto.randomUUID(), text, completed: false }; + + todos.push(newTodo); + localStorage.setItem(currentDate, JSON.stringify(todos)); + addTodoElement(newTodo.id, text); + input.value = ''; + updateTodoCount(); + } + + // 할 일 삭제 + function removeTodo(id) { + let todos = JSON.parse(localStorage.getItem(currentDate)) || []; + todos = todos.filter((todo) => todo.id !== id); + localStorage.setItem(currentDate, JSON.stringify(todos)); + loadTodos(); + } + + // 완료 상태 체크박스 + function toggleComplete(id, isCompleted) { + let todos = JSON.parse(localStorage.getItem(currentDate)) || []; + todos = todos.map((todo) => (todo.id === id ? { ...todo, completed: isCompleted } : todo)); + localStorage.setItem(currentDate, JSON.stringify(todos)); + loadTodos(); + } + + // Todo 개수 업데이트 함수 (체크된 항목 제외) + function updateTodoCount() { + const todos = JSON.parse(localStorage.getItem(currentDate)) || []; + const activeTodos = todos.filter((todo) => !todo.completed).length; + todoCountSpan.textContent = activeTodos; + } + + // 현재 날짜를 기준으로 days 만큼 이동 + function changeDate(days) { + const [y, m, d] = currentDate.split('-').map(Number); + const newDate = new Date(y, m - 1, d); + + newDate.setDate(newDate.getDate() + days); + currentDate = formatDateToYYYYMMDD(newDate); + + updateDateUI(); + loadTodos(); + } + + // 다크모드 설정 + function loadTheme() { + const isDarkMode = JSON.parse(localStorage.getItem('darkMode')); + body.classList.toggle('dark-mode', isDarkMode); + themeBtn.textContent = isDarkMode ? '☀️다크모드 해제' : '다크모드 설정🌙'; + } + + function toggleTheme() { + const isDarkMode = body.classList.toggle('dark-mode'); + themeBtn.textContent = isDarkMode ? '☀️다크모드 해제' : '다크모드 설정🌙'; + localStorage.setItem('darkMode', isDarkMode); + } + + // 사이드바 열기/닫기 기능 + function openSidebar() { + sidebar.style.left = '0'; + } + + function closeSidebar() { + sidebar.style.left = '-250px'; + } + + // 사이드바 외부 클릭 처리 - Early Return 패턴 적용 + function handleOutsideClick(event) { + if (sidebar.contains(event.target) || hamburger.contains(event.target)) return; + closeSidebar(); + } + + // Enter 입력 시 Todo 추가 (한글 IME 조합 중 입력 방지 <-- React에서 수정필요!) + enterButton.addEventListener('click', addTodo); + + input.addEventListener('keydown', (event) => { + if (event.key === 'Enter') { + addTodo(); + } + }); + + prevButton.addEventListener('click', () => changeDate(-1)); + nextButton.addEventListener('click', () => changeDate(1)); + + datePicker.addEventListener('change', function () { + currentDate = this.value; + updateDateUI(); + loadTodos(); + }); + + document.querySelectorAll('.weekBtn').forEach((button) => { + button.addEventListener('click', () => changeDate(parseInt(button.dataset.days))); + }); + + // 홈 버튼 클릭 시 오늘 날짜로 이동 + homeButton.addEventListener('click', () => { + currentDate = formatDateToYYYYMMDD(new Date()); + updateDateUI(); + loadTodos(); + }); + + themeBtn.addEventListener('click', toggleTheme); + hamburger.addEventListener('click', openSidebar); + closeBtn.addEventListener('click', closeSidebar); + document.addEventListener('click', handleOutsideClick); + + // 초기 실행 + updateDateUI(); + loadTodos(); + loadTheme(); +}); diff --git a/react-todo/styles.css b/react-todo/styles.css index 71fb4a9..f412477 100644 --- a/react-todo/styles.css +++ b/react-todo/styles.css @@ -2,7 +2,7 @@ --bg: #cbdef0; --bg-darkmode: #3d3c3c; --text: #000000; - --text-darkmode: #5b5959; + --text-darkmode: #6a6969; --text-header: #000000; --text-darkmode-header: #ffffff; @@ -20,7 +20,7 @@ --text-darkmode-todo: #000000; --bg-todoitem: #f9c254; --bg-todoitem-darkmode: #d6d7d8; - --completed-todoitem: #f8b2b2; + --completed-todoitem: #747373; --deleteButton: #f3f4f6; --hover-deleteButton: #e5e7eb; --text-deleteButton: #000000; @@ -35,19 +35,20 @@ --bg-sidebar-darkmode: #ffffff; --hamburger: #000000; --darkmode-hamburger: #ffffff; - --closeButton: #a5a3a3; - --text-darkmode-closeBtn: #5b5959; - --border-datePicker: #ccc; + --closeButton: #000000; + --text-darkmode-closeBtn: #050000; --text-sidebarButton: #000000; - --text-darkmode-sidebar: #a5a3a3; - --text-datePicker: #a5a3a3; + --text-darkmode-sidebar: #000000; + --weekBtn: #ffffff; + --text-weekBtn: #000000; /* nav */ - --text-nav: #ffffff; - --text-darkmode-nav: #5b5959; + --text-nav: #000000; + --text-datePicker: #030000; + --border-datePicker: #ccc; + --text-darkmode-nav: #000000; --dateButton: #000000; - --text-darkmode-dateButton: #5b5959; - --weekBtn: #ffffff; + --text-darkmode-dateButton: #000000; } /*기본 스타일 설정*/ @@ -164,10 +165,18 @@ nav { transform: scale(1.2); } +#currentDate { + color: var(--text-nav) !important; +} + body.dark-mode nav { color: var(--text-darkmode-nav); } +body.dark-mode #currentDate { + color: var(--text-darkmode-nav); +} + /*main 스타일*/ main { display: flex; @@ -432,20 +441,16 @@ body.dark-mode .close { padding: 10px; margin: 5px 0; background: var(--weekBtn); - color: var(--text); + color: var(--text-weekBtn); border: none; cursor: pointer; } body.dark-mode .weekBtn { - color: var(--text-darkmode); + color: var(--text-weekBtn); } /*테마 스타일*/ .theme { width: 100%; } - -body.dark-mode #currentDate { - color: var(--text-darkmode); -} From 96881e3bced79567ff1cf565703588c5a0f30d1a Mon Sep 17 00:00:00 2001 From: a-00-a Date: Sat, 21 Mar 2026 02:05:18 +0900 Subject: [PATCH 06/20] =?UTF-8?q?chore:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EC=B4=88=EA=B8=B0=20=EC=84=A4=EC=A0=95=20(Vite=20+?= =?UTF-8?q?=20React=20+=20Tailwind)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-todo/index.html | 63 +++-------------------------------- react-todo/package.json | 39 ++++++++++++++++------ react-todo/postcss.config.cjs | 6 ++++ react-todo/src/App.tsx | 7 ++++ react-todo/src/main.tsx | 10 ++++++ react-todo/tailwind.config.js | 8 +++++ 6 files changed, 64 insertions(+), 69 deletions(-) create mode 100644 react-todo/postcss.config.cjs create mode 100644 react-todo/src/App.tsx create mode 100644 react-todo/src/main.tsx create mode 100644 react-todo/tailwind.config.js diff --git a/react-todo/index.html b/react-todo/index.html index b626e01..a5ddfb5 100644 --- a/react-todo/index.html +++ b/react-todo/index.html @@ -1,68 +1,13 @@ - + - - - - - - + React Todo - - - -
- -

To Do

-
- - - - - -
-
- -
0
- -
-
-
- +
+ diff --git a/react-todo/package.json b/react-todo/package.json index a3c0e8e..9e5d195 100644 --- a/react-todo/package.json +++ b/react-todo/package.json @@ -1,17 +1,36 @@ { "name": "react-todo", - "version": "1.0.0", - "description": "", - "main": "main.js", + "private": true, + "version": "0.0.0", + "type": "module", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "format": "prettier --write \"**/*.{js,jsx,ts,tsx,html,css,json,md}\"" + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview", + "tailwind:init": ".\\node_modules\\.bin\\tailwindcss init -p" + }, + "dependencies": { + "@tailwindcss/vite": "^4.2.2", + "react": "^19.2.4", + "react-dom": "^19.2.4" }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs", "devDependencies": { - "prettier": "^3.8.1" + "@eslint/js": "^9.39.4", + "@tailwindcss/postcss": "^4.2.2", + "@types/node": "^24.12.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "autoprefixer": "^10.4.27", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.2", + "typescript": "~5.9.3", + "typescript-eslint": "^8.57.0", + "vite": "^8.0.1" } } diff --git a/react-todo/postcss.config.cjs b/react-todo/postcss.config.cjs new file mode 100644 index 0000000..b4bee66 --- /dev/null +++ b/react-todo/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +}; diff --git a/react-todo/src/App.tsx b/react-todo/src/App.tsx new file mode 100644 index 0000000..afde61f --- /dev/null +++ b/react-todo/src/App.tsx @@ -0,0 +1,7 @@ +import { useEffect, useMemo, useState } from 'react'; + +function App() { + return
Todo
; +} + +export default App; diff --git a/react-todo/src/main.tsx b/react-todo/src/main.tsx new file mode 100644 index 0000000..b934846 --- /dev/null +++ b/react-todo/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; +import './styles/index.css'; + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +); diff --git a/react-todo/tailwind.config.js b/react-todo/tailwind.config.js new file mode 100644 index 0000000..62c6d9c --- /dev/null +++ b/react-todo/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], + theme: { + extend: {}, + }, + plugins: [], +}; From 4486fd7c12b020bc975647013989ca8d5a7e6380 Mon Sep 17 00:00:00 2001 From: a-00-a Date: Sat, 21 Mar 2026 02:09:30 +0900 Subject: [PATCH 07/20] =?UTF-8?q?feat:=20todo=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EB=B0=8F=20=EC=B6=94=EA=B0=80=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-todo/src/components/TodoInput.tsx | 46 +++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 react-todo/src/components/TodoInput.tsx diff --git a/react-todo/src/components/TodoInput.tsx b/react-todo/src/components/TodoInput.tsx new file mode 100644 index 0000000..8ddad84 --- /dev/null +++ b/react-todo/src/components/TodoInput.tsx @@ -0,0 +1,46 @@ +import type { KeyboardEvent } from 'react'; + +type TodoInputProps = { + input: string; + count: number; + doneCount: number; + onChangeInput: (value: string) => void; + onAddTodo: () => void; +}; + +export default function TodoInput({ input, count, doneCount, onChangeInput, onAddTodo }: TodoInputProps) { + const handleKeyDown = (event: KeyboardEvent) => { + if (event.nativeEvent.isComposing) return; + if (event.key === 'Enter') { + onAddTodo(); + } + }; + + return ( +
+
+ onChangeInput(e.target.value)} + onKeyDown={handleKeyDown} + placeholder="오늘의 할 일을 적어주세요!" + className="min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-gray-400 dark:text-white" + /> + +
+ {count}개 +
+ + +
+ +
done {doneCount}
+
+ ); +} From 9cd08ca631a65c00f17e9bd2a2c8ec7d31aa5908 Mon Sep 17 00:00:00 2001 From: a-00-a Date: Sat, 21 Mar 2026 02:13:17 +0900 Subject: [PATCH 08/20] =?UTF-8?q?feat:=20todo=20item=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EB=B0=8F=20=EC=82=AD=EC=A0=9C/=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-todo/src/components/TodoItem.tsx | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 react-todo/src/components/TodoItem.tsx diff --git a/react-todo/src/components/TodoItem.tsx b/react-todo/src/components/TodoItem.tsx new file mode 100644 index 0000000..c78d7e8 --- /dev/null +++ b/react-todo/src/components/TodoItem.tsx @@ -0,0 +1,32 @@ +import type { Todo } from '../App'; + +type TodoItemProps = { + todo: Todo; + onRemoveTodo: (id: string) => void; + onToggleTodo: (id: string) => void; +}; + +export default function TodoItem({ todo, onRemoveTodo, onToggleTodo }: TodoItemProps) { + return ( +
+ onToggleTodo(todo.id)} + className="h-[18px] w-[18px] shrink-0 cursor-pointer appearance-none rounded-[5px] border-2 border-[#f9f9f9] bg-[#f9f9f9] transition-all checked:relative checked:bg-[#f9f9f9] checked:after:absolute checked:after:left-[3px] checked:after:top-[-2px] checked:after:text-sm checked:after:text-[#ff4d4d] checked:after:content-['✓']" + /> + + + {todo.text} + + + +
+ ); +} From d6fcdbe4d056b5c14ef15839e7d5dbcfb9b95d8b Mon Sep 17 00:00:00 2001 From: a-00-a Date: Sat, 21 Mar 2026 02:14:20 +0900 Subject: [PATCH 09/20] =?UTF-8?q?feat:=20todo=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=A0=8C=EB=8D=94=EB=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-todo/src/components/TodoList.tsx | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 react-todo/src/components/TodoList.tsx diff --git a/react-todo/src/components/TodoList.tsx b/react-todo/src/components/TodoList.tsx new file mode 100644 index 0000000..13c815f --- /dev/null +++ b/react-todo/src/components/TodoList.tsx @@ -0,0 +1,24 @@ +import type { Todo } from '../App'; +import TodoItem from './TodoItem'; + +type TodoListProps = { + todos: Todo[]; + onRemoveTodo: (id: string) => void; + onToggleTodo: (id: string) => void; +}; + +export default function TodoList({ todos, onRemoveTodo, onToggleTodo }: TodoListProps) { + return ( +
+ {todos.length === 0 ? ( +
+ 아직 등록된 할 일이 없어요. +
+ ) : ( + todos.map((todo) => ( + + )) + )} +
+ ); +} From b1abff7c6fba60e75c3b66d529709de14eb9aaf2 Mon Sep 17 00:00:00 2001 From: a-00-a Date: Sat, 21 Mar 2026 02:45:41 +0900 Subject: [PATCH 10/20] =?UTF-8?q?feat:=20todo=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EB=B0=8F=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-todo/src/App.tsx | 48 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/react-todo/src/App.tsx b/react-todo/src/App.tsx index afde61f..ce1cc7c 100644 --- a/react-todo/src/App.tsx +++ b/react-todo/src/App.tsx @@ -1,7 +1,51 @@ -import { useEffect, useMemo, useState } from 'react'; +import { useMemo, useState } from 'react'; +import TodoInput from './components/TodoInput'; +import TodoList from './components/TodoList'; + +export type Todo = { + id: string; + text: string; + completed: boolean; +}; function App() { - return
Todo
; + const [todos, setTodos] = useState([]); + const [input, setInput] = useState(''); + + const addTodo = () => { + const trimmed = input.trim(); + if (!trimmed) return; + + const newTodo: Todo = { + id: crypto.randomUUID(), + text: trimmed, + completed: false, + }; + + setTodos((prev) => [...prev, newTodo]); + setInput(''); + }; + + const removeTodo = (id: string) => { + setTodos((prev) => prev.filter((todo) => todo.id !== id)); + }; + + const toggleTodo = (id: string) => { + setTodos((prev) => prev.map((todo) => (todo.id === id ? { ...todo, completed: !todo.completed } : todo))); + }; + + const activeCount = useMemo(() => todos.filter((todo) => !todo.completed).length, [todos]); + const doneCount = useMemo(() => todos.filter((todo) => !todo.completed).length, [todos]); + + return ( +
+

To Do

+ + + + +
+ ); } export default App; From fb64a775de211107b6da7e5549b27f8016f8fe50 Mon Sep 17 00:00:00 2001 From: a-00-a Date: Sat, 21 Mar 2026 02:56:52 +0900 Subject: [PATCH 11/20] =?UTF-8?q?feat:=20=EB=82=A0=EC=A7=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=20todo=20=EC=83=81=ED=83=9C=20=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EB=B0=8F=20localStorage=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-todo/src/App.tsx | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/react-todo/src/App.tsx b/react-todo/src/App.tsx index ce1cc7c..223724d 100644 --- a/react-todo/src/App.tsx +++ b/react-todo/src/App.tsx @@ -1,4 +1,4 @@ -import { useMemo, useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import TodoInput from './components/TodoInput'; import TodoList from './components/TodoList'; @@ -8,9 +8,28 @@ export type Todo = { completed: boolean; }; +const formatDateToYYYYMMDD = (date: Date) => { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +}; + +const getToday = () => formatDateToYYYYMMDD(new Date()); + function App() { const [todos, setTodos] = useState([]); const [input, setInput] = useState(''); + const [currentDate, setCurrentDate] = useState(getToday()); + + useEffect(() => { + const storedTodos = JSON.parse(localStorage.getItem(currentDate) || '[]') as Todo[]; + setTodos(storedTodos); + }, [currentDate]); + + useEffect(() => { + localStorage.setItem(currentDate, JSON.stringify(todos)); + }, [todos, currentDate]); const addTodo = () => { const trimmed = input.trim(); @@ -40,6 +59,7 @@ function App() { return (

To Do

+

{currentDate}

From 6dd42c1fdacba466f3a9aa677cf2a23e3bc2baa7 Mon Sep 17 00:00:00 2001 From: a-00-a Date: Sat, 21 Mar 2026 02:58:03 +0900 Subject: [PATCH 12/20] =?UTF-8?q?feat:=20Header=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EB=B0=8F=20=EC=98=A4=EB=8A=98=20=EB=82=A0?= =?UTF-8?q?=EC=A7=9C=EB=A1=9C=20=EC=9D=B4=EB=8F=99=20=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-todo/src/components/Header.tsx | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 react-todo/src/components/Header.tsx diff --git a/react-todo/src/components/Header.tsx b/react-todo/src/components/Header.tsx new file mode 100644 index 0000000..0e6628f --- /dev/null +++ b/react-todo/src/components/Header.tsx @@ -0,0 +1,23 @@ +type HeaderProps = { + onOpenSidebar: () => void; + onGoToday: () => void; +}; + +export default function Header({ onOpenSidebar, onGoToday }: HeaderProps) { + return ( +
+ +

+ To do +

+
+ ); +} From 2a6e586a7ce03605a3ebd385b258791d811c62c7 Mon Sep 17 00:00:00 2001 From: a-00-a Date: Sat, 21 Mar 2026 03:21:40 +0900 Subject: [PATCH 13/20] =?UTF-8?q?feat:=20Header=20=EB=B0=8F=20=EB=82=A0?= =?UTF-8?q?=EC=A7=9C=20=EC=9D=B4=EB=8F=99=20UI=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-todo/src/App.tsx | 52 +++++++++++++++++++++++++------ react-todo/src/components/Nav.tsx | 42 +++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 9 deletions(-) create mode 100644 react-todo/src/components/Nav.tsx diff --git a/react-todo/src/App.tsx b/react-todo/src/App.tsx index 223724d..90a1569 100644 --- a/react-todo/src/App.tsx +++ b/react-todo/src/App.tsx @@ -1,4 +1,6 @@ import { useEffect, useMemo, useState } from 'react'; +import Header from './components/Header'; +import Nav from './components/Nav'; import TodoInput from './components/TodoInput'; import TodoList from './components/TodoList'; @@ -15,12 +17,18 @@ const formatDateToYYYYMMDD = (date: Date) => { return `${year}-${month}-${day}`; }; +const formatDisplayDate = (dateString: string) => { + const [year, month, day] = dateString.split('-').map(Number); + return `${year}년 ${month}월 ${day}일`; +}; + const getToday = () => formatDateToYYYYMMDD(new Date()); function App() { const [todos, setTodos] = useState([]); const [input, setInput] = useState(''); const [currentDate, setCurrentDate] = useState(getToday()); + const [sidebarOpen, setSidebarOpen] = useState(false); useEffect(() => { const storedTodos = JSON.parse(localStorage.getItem(currentDate) || '[]') as Todo[]; @@ -53,18 +61,44 @@ function App() { setTodos((prev) => prev.map((todo) => (todo.id === id ? { ...todo, completed: !todo.completed } : todo))); }; - const activeCount = useMemo(() => todos.filter((todo) => !todo.completed).length, [todos]); - const doneCount = useMemo(() => todos.filter((todo) => !todo.completed).length, [todos]); + const changeDate = (days: number) => { + const [year, month, day] = currentDate.split('-').map(Number); + const nextDate = new Date(year, month - 1, day); + nextDate.setDate(nextDate.getDate() + days); + setCurrentDate(formatDateToYYYYMMDD(nextDate)); + }; - return ( -
-

To Do

-

{currentDate}

+ const goToday = () => { + setCurrentDate(getToday()); + }; - + const activeCount = useMemo(() => todos.filter((todo) => !todo.completed).length, [todos]); + const doneCount = useMemo(() => todos.filter((todo) => todo.completed).length, [todos]); - -
+ return ( +
+
setSidebarOpen(true)} onGoToday={goToday} /> +
); } diff --git a/react-todo/src/components/Nav.tsx b/react-todo/src/components/Nav.tsx new file mode 100644 index 0000000..accd86c --- /dev/null +++ b/react-todo/src/components/Nav.tsx @@ -0,0 +1,42 @@ +type NavProps = { + currentDate: string; + displayDate: string; + onChangeDate: (days: number) => void; + onPickDate: (date: string) => void; +}; + +export default function Nav({ currentDate, displayDate, onChangeDate, onPickDate }: NavProps) { + return ( + + ); +} From f7740d88dc89433f32babe75fe780348c3d5ce97 Mon Sep 17 00:00:00 2001 From: a-00-a Date: Sat, 21 Mar 2026 03:34:18 +0900 Subject: [PATCH 14/20] =?UTF-8?q?feat:=20Sidebar=20=EB=B0=8F=20=EB=8B=A4?= =?UTF-8?q?=ED=81=AC=EB=AA=A8=EB=93=9C=20=ED=86=A0=EA=B8=80=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-todo/src/App.tsx | 43 ++++++++++++++++++-- react-todo/src/components/Sidebar.tsx | 57 +++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 react-todo/src/components/Sidebar.tsx diff --git a/react-todo/src/App.tsx b/react-todo/src/App.tsx index 90a1569..d943235 100644 --- a/react-todo/src/App.tsx +++ b/react-todo/src/App.tsx @@ -1,5 +1,6 @@ import { useEffect, useMemo, useState } from 'react'; import Header from './components/Header'; +import Sidebar from './components/Sidebar'; import Nav from './components/Nav'; import TodoInput from './components/TodoInput'; import TodoList from './components/TodoList'; @@ -28,6 +29,7 @@ function App() { const [todos, setTodos] = useState([]); const [input, setInput] = useState(''); const [currentDate, setCurrentDate] = useState(getToday()); + const [darkMode, setDarkMode] = useState(false); const [sidebarOpen, setSidebarOpen] = useState(false); useEffect(() => { @@ -39,6 +41,35 @@ function App() { localStorage.setItem(currentDate, JSON.stringify(todos)); }, [todos, currentDate]); + useEffect(() => { + const savedDarkMode = JSON.parse(localStorage.getItem('darkMode') || 'false') as boolean; + setDarkMode(savedDarkMode); + }, []); + + useEffect(() => { + document.documentElement.classList.toggle('dark', darkMode); + document.body.classList.toggle('dark-mode', darkMode); + localStorage.setItem('darkMode', JSON.stringify(darkMode)); + }, [darkMode]); + + useEffect(() => { + const handleOutsideClick = (event: MouseEvent) => { + const target = event.target as HTMLElement; + if (target.closest('[data-sidebar]') || target.closest('[data-hamburger]')) { + return; + } + setSidebarOpen(false); + }; + + if (sidebarOpen) { + document.addEventListener('click', handleOutsideClick); + } + + return () => { + document.removeEventListener('click', handleOutsideClick); + }; + }, [sidebarOpen]); + const addTodo = () => { const trimmed = input.trim(); if (!trimmed) return; @@ -78,6 +109,14 @@ function App() { return (
setSidebarOpen(true)} onGoToday={goToday} /> + setSidebarOpen(false)} + onChangeWeek={changeDate} + darkMode={darkMode} + onToggleDarkMode={() => setDarkMode((prev) => !prev)} + /> +
); diff --git a/react-todo/src/components/TodoItem.tsx b/react-todo/src/components/TodoItem.tsx index c78d7e8..a89a4ee 100644 --- a/react-todo/src/components/TodoItem.tsx +++ b/react-todo/src/components/TodoItem.tsx @@ -2,13 +2,23 @@ import type { Todo } from '../App'; type TodoItemProps = { todo: Todo; + index: number; + setDragIndex: (index: number) => void; + handleDrop: (index: number) => void; onRemoveTodo: (id: string) => void; onToggleTodo: (id: string) => void; }; -export default function TodoItem({ todo, onRemoveTodo, onToggleTodo }: TodoItemProps) { +export default function TodoItem({ todo, index, setDragIndex, handleDrop, onRemoveTodo, onToggleTodo }: TodoItemProps) { return ( -
+
setDragIndex(index)} + onDragOver={(e) => e.preventDefault()} + onDragEnd={() => setDragIndex(-1)} + onDrop={() => handleDrop(index)} + > 삭제 -
+ ); } diff --git a/react-todo/src/components/TodoList.tsx b/react-todo/src/components/TodoList.tsx index 13c815f..5a5ce18 100644 --- a/react-todo/src/components/TodoList.tsx +++ b/react-todo/src/components/TodoList.tsx @@ -3,11 +3,13 @@ import TodoItem from './TodoItem'; type TodoListProps = { todos: Todo[]; + setDragIndex: (index: number) => void; + handleDrop: (index: number) => void; onRemoveTodo: (id: string) => void; onToggleTodo: (id: string) => void; }; -export default function TodoList({ todos, onRemoveTodo, onToggleTodo }: TodoListProps) { +export default function TodoList({ todos, setDragIndex, handleDrop, onRemoveTodo, onToggleTodo }: TodoListProps) { return (
{todos.length === 0 ? ( @@ -15,8 +17,16 @@ export default function TodoList({ todos, onRemoveTodo, onToggleTodo }: TodoList 아직 등록된 할 일이 없어요. ) : ( - todos.map((todo) => ( - + todos.map((todo, index) => ( + )) )}
From e6304a6d86151592ae4ede6e88d26fb32f74ce5b Mon Sep 17 00:00:00 2001 From: a-00-a Date: Sat, 21 Mar 2026 04:09:30 +0900 Subject: [PATCH 16/20] =?UTF-8?q?docs:=20REACME=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-todo/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 react-todo/README.md diff --git a/react-todo/README.md b/react-todo/README.md new file mode 100644 index 0000000..c61525a --- /dev/null +++ b/react-todo/README.md @@ -0,0 +1,14 @@ +# React Todo + +기존 HTML, CSS, JavaScript로 구현한 Todo List를 React로 마이그레이션한 프로젝트입니다. +Vite 환경에서 React와 Tailwind CSS를 사용해 구현했으며, React Hooks으로 상태를 관리했습니다. + +## 배포 링크 + +추후 추가 예정 + +### 주요 기능 + +-Todo 추가/삭제 +-Todo 완료/미완료 체크 -남은 Todo 개수 / 완료된 Todo 개수 표시 -날짜별 Todo 저장 (localStorage 이용) -날짜 직접 선택 (화살표버튼 => 이전/다음 날짜 이동 & 달력 선택) -사이드바 (이전.다음 주 이동, 다크모드) +-Drag & Drop으로 Todo 순서 변경 From 12937d775808cf5a096ec43a24587fdfc6760f15 Mon Sep 17 00:00:00 2001 From: a-00-a Date: Sat, 21 Mar 2026 04:20:02 +0900 Subject: [PATCH 17/20] =?UTF-8?q?chore:=20gitignore=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-todo/.gitignore | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/react-todo/.gitignore b/react-todo/.gitignore index 7cc758b..a547bf3 100644 --- a/react-todo/.gitignore +++ b/react-todo/.gitignore @@ -1,5 +1,24 @@ -# Node modules -node_modules/ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* -# npm lock 파일 -package-lock.json \ No newline at end of file +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? From 6c8feae0065303043ea45fd833d345ab15e4b9c9 Mon Sep 17 00:00:00 2001 From: a-00-a Date: Sat, 21 Mar 2026 04:21:50 +0900 Subject: [PATCH 18/20] =?UTF-8?q?chore:=20favicon=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=EB=A5=BC=20public=20=ED=8F=B4=EB=8D=94=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-todo/public/favicon.svg | Bin 0 -> 15406 bytes .../logo/favicon_io/android-chrome-192x192.png | Bin 0 -> 12644 bytes .../logo/favicon_io/android-chrome-512x512.png | Bin 0 -> 33729 bytes .../public/logo/favicon_io/apple-touch-icon.png | Bin 0 -> 11273 bytes .../public/logo/favicon_io/favicon-16x16.png | Bin 0 -> 688 bytes .../public/logo/favicon_io/favicon-32x32.png | Bin 0 -> 1502 bytes react-todo/public/logo/favicon_io/favicon.ico | Bin 0 -> 15406 bytes .../public/logo/favicon_io/site.webmanifest | 1 + 8 files changed, 1 insertion(+) create mode 100644 react-todo/public/favicon.svg create mode 100644 react-todo/public/logo/favicon_io/android-chrome-192x192.png create mode 100644 react-todo/public/logo/favicon_io/android-chrome-512x512.png create mode 100644 react-todo/public/logo/favicon_io/apple-touch-icon.png create mode 100644 react-todo/public/logo/favicon_io/favicon-16x16.png create mode 100644 react-todo/public/logo/favicon_io/favicon-32x32.png create mode 100644 react-todo/public/logo/favicon_io/favicon.ico create mode 100644 react-todo/public/logo/favicon_io/site.webmanifest diff --git a/react-todo/public/favicon.svg b/react-todo/public/favicon.svg new file mode 100644 index 0000000000000000000000000000000000000000..3b7d1f1aac835a6a22f84016e7aa003ad8447975 GIT binary patch literal 15406 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 V1_~ko{__ezR#Hi#24ocU{{iwtJ8u90 literal 0 HcmV?d00001 diff --git a/react-todo/public/logo/favicon_io/android-chrome-512x512.png b/react-todo/public/logo/favicon_io/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..d21fed2f16bc8c91f2dbd896750a23fc688d75b1 GIT binary patch literal 33729 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 literal 0 HcmV?d00001 diff --git a/react-todo/public/logo/favicon_io/apple-touch-icon.png b/react-todo/public/logo/favicon_io/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2ace0ce3566ea8269fb6b0437200074758e3f7 GIT binary patch literal 11273 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

pf~fVN*K)u=vz(=QNcIw9zxVIVq*xObfBEtV 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 Date: Sat, 21 Mar 2026 04:33:45 +0900 Subject: [PATCH 19/20] =?UTF-8?q?chore:=20favicon=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=EC=9D=84=20public=20=ED=8F=B4=EB=8D=94=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-todo/public/favicon.ico | Bin 0 -> 15406 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 react-todo/public/favicon.ico diff --git a/react-todo/public/favicon.ico b/react-todo/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3b7d1f1aac835a6a22f84016e7aa003ad8447975 GIT binary patch literal 15406 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 Date: Sat, 21 Mar 2026 04:38:31 +0900 Subject: [PATCH 20/20] =?UTF-8?q?chore:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EC=84=A4=EC=A0=95=20=EB=B0=8F=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=ED=8C=8C=EC=9D=BC=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-todo/.prettierrc | 12 +- react-todo/eslint.config.js | 23 + react-todo/package-lock.json | 3359 +++++++++++++++++++++++++++++++ react-todo/src/styles/index.css | 33 + react-todo/tsconfig.app.json | 28 + react-todo/tsconfig.json | 7 + react-todo/tsconfig.node.json | 26 + react-todo/vite.config.ts | 8 + 8 files changed, 3490 insertions(+), 6 deletions(-) create mode 100644 react-todo/eslint.config.js create mode 100644 react-todo/package-lock.json create mode 100644 react-todo/src/styles/index.css create mode 100644 react-todo/tsconfig.app.json create mode 100644 react-todo/tsconfig.json create mode 100644 react-todo/tsconfig.node.json create mode 100644 react-todo/vite.config.ts diff --git a/react-todo/.prettierrc b/react-todo/.prettierrc index f415c34..f5e8e7e 100644 --- a/react-todo/.prettierrc +++ b/react-todo/.prettierrc @@ -1,8 +1,8 @@ { - "htmlWhitespaceSensitivity": "ignore", - "singleQuote": true, - "printWidth": 120, - "tabWidth": 2, - "semi": true, - "endOfLine": "lf" + "htmlWhitespaceSensitivity": "ignore", + "singleQuote": true, + "printWidth": 120, + "tabWidth": 2, + "semi": true, + "endOfLine": "lf" } diff --git a/react-todo/eslint.config.js b/react-todo/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/react-todo/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/react-todo/package-lock.json b/react-todo/package-lock.json new file mode 100644 index 0000000..7fe7569 --- /dev/null +++ b/react-todo/package-lock.json @@ -0,0 +1,3359 @@ +{ + "name": "react-todo", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-todo", + "version": "0.0.0", + "dependencies": { + "@tailwindcss/vite": "^4.2.2", + "react": "^19.2.4", + "react-dom": "^19.2.4" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@tailwindcss/postcss": "^4.2.2", + "@types/node": "^24.12.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "autoprefixer": "^10.4.27", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.2", + "typescript": "~5.9.3", + "typescript-eslint": "^8.57.0", + "vite": "^8.0.1" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@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.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@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.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@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.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "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.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", + "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", + "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "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.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "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.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "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.1", + "minimatch": "^3.1.5", + "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.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "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.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "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==", + "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==", + "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==", + "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==", + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.120.0.tgz", + "integrity": "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.10.tgz", + "integrity": "sha512-jOHxwXhxmFKuXztiu1ORieJeTbx5vrTkcOkkkn2d35726+iwhrY1w/+nYY/AGgF12thg33qC3R1LMBF5tHTZHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.10.tgz", + "integrity": "sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.10.tgz", + "integrity": "sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.10.tgz", + "integrity": "sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.10.tgz", + "integrity": "sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.10.tgz", + "integrity": "sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.10.tgz", + "integrity": "sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.10.tgz", + "integrity": "sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.10.tgz", + "integrity": "sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.10.tgz", + "integrity": "sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.10.tgz", + "integrity": "sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.10.tgz", + "integrity": "sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.10.tgz", + "integrity": "sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.10.tgz", + "integrity": "sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.10.tgz", + "integrity": "sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.2.tgz", + "integrity": "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "postcss": "^8.5.6", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", + "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "tailwindcss": "4.2.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "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/node": { + "version": "24.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", + "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz", + "integrity": "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/type-utils": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.1.tgz", + "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.1.tgz", + "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.1", + "@typescript-eslint/types": "^8.57.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz", + "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz", + "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz", + "integrity": "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz", + "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz", + "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.1", + "@typescript-eslint/tsconfig-utils": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.1.tgz", + "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz", + "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.7" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "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.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "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/autoprefixer": { + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.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.10.8", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz", + "integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "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.30001780", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", + "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", + "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.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "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/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.321", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", + "integrity": "sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "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.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "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.5", + "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": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "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.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "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.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "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==", + "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.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "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": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "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/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "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/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "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/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "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/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "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==", + "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.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "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==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "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/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==", + "dev": true, + "license": "MIT" + }, + "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.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "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/rolldown": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.10.tgz", + "integrity": "sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.120.0", + "@rolldown/pluginutils": "1.0.0-rc.10" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.10", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.10", + "@rolldown/binding-darwin-x64": "1.0.0-rc.10", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.10", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.10", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.10", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.10", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.10", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.10", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.10", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.10", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.10", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.10", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.10", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.10" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.10.tgz", + "integrity": "sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "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==", + "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/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "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/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "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/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.1.tgz", + "integrity": "sha512-fLvZWf+cAGw3tqMCYzGIU6yR8K+Y9NT2z23RwOjlNFF2HwSB3KhdEFI5lSBv8tNmFkkBShSjsCjzx1vahZfISA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.57.1", + "@typescript-eslint/parser": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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": "8.0.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.1.tgz", + "integrity": "sha512-wt+Z2qIhfFt85uiyRt5LPU4oVEJBXj8hZNWKeqFG4gRG/0RaRGJ7njQCwzFVjO+v4+Ipmf5CY7VdmZRAYYBPHw==", + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.10", + "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", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.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 + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "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" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/react-todo/src/styles/index.css b/react-todo/src/styles/index.css new file mode 100644 index 0000000..750b0c5 --- /dev/null +++ b/react-todo/src/styles/index.css @@ -0,0 +1,33 @@ +@import 'tailwindcss'; +@custom-variant dark (&:where(.dark, .dark *)); +@import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css'); + +@layer base { + * { + box-sizing: border-box; + margin: 0; + padding: 0; + } + + html, + body, + #root { + min-height: 100%; + font-family: 'Pretendard', sans-serif; + } + + body { + min-height: 100vh; + } + + input[type='date']::-webkit-datetime-edit { + display: none; + } + + input[type='date']::-webkit-calendar-picker-indicator { + cursor: pointer; + width: 18px; + height: 18px; + transform: scale(1.2); + } +} diff --git a/react-todo/tsconfig.app.json b/react-todo/tsconfig.app.json new file mode 100644 index 0000000..af516fc --- /dev/null +++ b/react-todo/tsconfig.app.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2023", + "useDefineForClassFields": true, + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/react-todo/tsconfig.json b/react-todo/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/react-todo/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/react-todo/tsconfig.node.json b/react-todo/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/react-todo/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/react-todo/vite.config.ts b/react-todo/vite.config.ts new file mode 100644 index 0000000..6e7f528 --- /dev/null +++ b/react-todo/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import tailwindcss from '@tailwindcss/vite'; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), tailwindcss()], +});