From 875f2d88ce57ba1f69d34e5802f8d82f21e1d71b Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Tue, 19 Nov 2024 16:29:22 +0100 Subject: [PATCH 01/29] First commit, npm installed --- package-lock.json | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5c1b936d..7914fac3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -922,7 +922,9 @@ "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", + "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": { @@ -2692,7 +2694,9 @@ } }, "node_modules/rollup": { - "version": "3.29.4", + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", "dev": true, "license": "MIT", "bin": { @@ -3093,10 +3097,11 @@ } }, "node_modules/vite": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", - "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", + "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", From 8d143a2dfbe416f3c796243613a680cdd96a442c Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Tue, 19 Nov 2024 18:46:21 +0100 Subject: [PATCH 02/29] Installed zustand and lottie animations to use later --- index.html | 1 + package-lock.json | 60 +++++++++++++++++++++++++++++++++++++++++++---- package.json | 4 +++- src/App.jsx | 6 ++++- 4 files changed, 64 insertions(+), 7 deletions(-) diff --git a/index.html b/index.html index 09bcfb14..42415bf4 100644 --- a/index.html +++ b/index.html @@ -8,5 +8,6 @@
+ diff --git a/package-lock.json b/package-lock.json index 7914fac3..ee3c4c8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,11 @@ "name": "project-todos-context", "version": "0.0.0", "dependencies": { + "@lottiefiles/dotlottie-react": "^0.9.3", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-router-dom": "^6.18.0" + "react-router-dom": "^6.18.0", + "zustand": "^5.0.1" }, "devDependencies": { "@types/react": "^18.2.15", @@ -500,6 +502,25 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@lottiefiles/dotlottie-react": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.9.3.tgz", + "integrity": "sha512-x4xQlFFulAF/nG044VNMwaXWk8ehg/KEHXpMxGB+L5gv3qohjxv/I7/erHyfhWY9y6C/VMl+PiWZbT54W8+lUQ==", + "license": "MIT", + "dependencies": { + "@lottiefiles/dotlottie-web": "0.36.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@lottiefiles/dotlottie-web": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.36.1.tgz", + "integrity": "sha512-KvxOH5Msk0Ivqpgq4p1DGo1IG2XPX4kEVkhssTaOUEvoeCxDLru+DlbUzwG8b5JcJwEBmrAMzCNzCTmn+uMFxQ==", + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -578,12 +599,12 @@ }, "node_modules/@types/prop-types": { "version": "15.7.10", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@types/react": { "version": "18.2.37", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -601,7 +622,7 @@ }, "node_modules/@types/scheduler": { "version": "0.16.6", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@ungap/structured-clone": { @@ -938,7 +959,7 @@ }, "node_modules/csstype": { "version": "3.1.2", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/debug": { @@ -3258,6 +3279,35 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zustand": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.1.tgz", + "integrity": "sha512-pRET7Lao2z+n5R/HduXMio35TncTlSW68WsYBq2Lg1ASspsNGjpwLAsij3RpouyV6+kHMwwwzP0bZPD70/Jx/w==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } } } } diff --git a/package.json b/package.json index a23290e8..c7ffac97 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,11 @@ "preview": "vite preview" }, "dependencies": { + "@lottiefiles/dotlottie-react": "^0.9.3", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-router-dom": "^6.18.0" + "react-router-dom": "^6.18.0", + "zustand": "^5.0.1" }, "devDependencies": { "@types/react": "^18.2.15", diff --git a/src/App.jsx b/src/App.jsx index 496ab1b1..6e3d40de 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,3 +1,7 @@ +import React from "react"; + export const App = () => { - return
Find me in App.jsx!
; + return ( +

hejhej

+ ); }; From 91d5a2b2a332e3c0873853410905784d48e3b1e1 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Wed, 20 Nov 2024 12:19:33 +0100 Subject: [PATCH 03/29] Structure foundation, created components and store --- src/components/TodoForm.jsx | 1 + src/components/TodoItem.jsx | 1 + src/components/TodoList.jsx | 1 + src/store/todoStore.jsx | 1 + 4 files changed, 4 insertions(+) create mode 100644 src/components/TodoForm.jsx create mode 100644 src/components/TodoItem.jsx create mode 100644 src/components/TodoList.jsx create mode 100644 src/store/todoStore.jsx diff --git a/src/components/TodoForm.jsx b/src/components/TodoForm.jsx new file mode 100644 index 00000000..fb083fa8 --- /dev/null +++ b/src/components/TodoForm.jsx @@ -0,0 +1 @@ +//Component to create new to-do/task \ No newline at end of file diff --git a/src/components/TodoItem.jsx b/src/components/TodoItem.jsx new file mode 100644 index 00000000..20f323c0 --- /dev/null +++ b/src/components/TodoItem.jsx @@ -0,0 +1 @@ +//Component for single to-do, create toggle function inside here \ No newline at end of file diff --git a/src/components/TodoList.jsx b/src/components/TodoList.jsx new file mode 100644 index 00000000..2186aeda --- /dev/null +++ b/src/components/TodoList.jsx @@ -0,0 +1 @@ +//List that shows all of the created to do's/tasks \ No newline at end of file diff --git a/src/store/todoStore.jsx b/src/store/todoStore.jsx new file mode 100644 index 00000000..de904816 --- /dev/null +++ b/src/store/todoStore.jsx @@ -0,0 +1 @@ +// Create state management with Zustand here (stores information about the to-do's, done or not e.g.) \ No newline at end of file From 915abf4ee0fd93df49ed899bbc11d209c6db814c Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Wed, 20 Nov 2024 16:33:14 +0100 Subject: [PATCH 04/29] Added content to TodoForm component and created state management using zustand in TodoStore --- src/App.jsx | 5 +++++ src/components/TodoForm.jsx | 37 ++++++++++++++++++++++++++++++++++++- src/components/TodoItem.jsx | 6 +++++- src/store/todoStore.jsx | 11 ++++++++++- 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 6e3d40de..88fa5ec9 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,7 +1,12 @@ import React from "react"; +import { TodoForm } from "./components/TodoForm.jsx"; + export const App = () => { return ( +

hejhej

+ +
); }; diff --git a/src/components/TodoForm.jsx b/src/components/TodoForm.jsx index fb083fa8..5d97ee75 100644 --- a/src/components/TodoForm.jsx +++ b/src/components/TodoForm.jsx @@ -1 +1,36 @@ -//Component to create new to-do/task \ No newline at end of file +//Component to create new to-do/task +import React from "react"; +import { useState } from "react"; +import { useTodoStore } from "../store/TodoStore.jsx"; //It's working even though it's a red underline, not to self + +export const TodoForm = () => { + const [input, setInput] = useState(""); //Local state for the input + const addTodo = useTodoStore((state) => state.addTodo); //Access Zustand function + + //Handle input submission + const handleInputChange = (e) => { + setInput(e.target.value); + }; + + //Handle form submission + const handleSubmit = (e) => { + e.preventDefault(); + if (input.trim() === "") return; //No empty to-do's + addTodo(input); //Add the new to-do to the store + setInput(""); //Clear the input + }; + + return ( +
+ + + +
+ ); +}; diff --git a/src/components/TodoItem.jsx b/src/components/TodoItem.jsx index 20f323c0..0e5ad466 100644 --- a/src/components/TodoItem.jsx +++ b/src/components/TodoItem.jsx @@ -1 +1,5 @@ -//Component for single to-do, create toggle function inside here \ No newline at end of file +//Component for single to-do, create toggle function inside here +import React from "react"; +import { useTodoStore } from "../store/TodoStore"; + + diff --git a/src/store/todoStore.jsx b/src/store/todoStore.jsx index de904816..a77e2429 100644 --- a/src/store/todoStore.jsx +++ b/src/store/todoStore.jsx @@ -1 +1,10 @@ -// Create state management with Zustand here (stores information about the to-do's, done or not e.g.) \ No newline at end of file +// Create state management with Zustand here (stores information about the to-do's, done or not e.g.) +import { create } from "zustand"; + +export const useTodoStore = create((set) => ({ + todos: [], + addTodo: (text) => + set((state) => ({ + todos: [...state.todos, { id: Date.now(), text, completed: false }], + })), +})); From c502462d90e09ef5e3c330f03b846c13139f9486 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Wed, 20 Nov 2024 17:31:44 +0100 Subject: [PATCH 05/29] Added content to TodoList,TodoItem and made two separate lists: incomplete tasks, completed tasks and added toggle --- src/App.jsx | 2 ++ src/components/TodoForm.jsx | 6 +++--- src/components/TodoItem.jsx | 20 ++++++++++++++++++++ src/components/TodoList.jsx | 35 ++++++++++++++++++++++++++++++++++- src/store/todoStore.jsx | 6 ++++++ 5 files changed, 65 insertions(+), 4 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 88fa5ec9..865df28f 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,5 +1,6 @@ import React from "react"; import { TodoForm } from "./components/TodoForm.jsx"; +import { TodoList } from "./components/TodoList.jsx"; export const App = () => { @@ -7,6 +8,7 @@ export const App = () => {

hejhej

+
); }; diff --git a/src/components/TodoForm.jsx b/src/components/TodoForm.jsx index 5d97ee75..e685f098 100644 --- a/src/components/TodoForm.jsx +++ b/src/components/TodoForm.jsx @@ -1,7 +1,7 @@ //Component to create new to-do/task import React from "react"; import { useState } from "react"; -import { useTodoStore } from "../store/TodoStore.jsx"; //It's working even though it's a red underline, not to self +import { useTodoStore } from "../store/TodoStore"; //It's working even though it's a red underline, not to self export const TodoForm = () => { const [input, setInput] = useState(""); //Local state for the input @@ -22,13 +22,13 @@ export const TodoForm = () => { return (
- +
diff --git a/src/components/TodoItem.jsx b/src/components/TodoItem.jsx index 0e5ad466..1e5ad81a 100644 --- a/src/components/TodoItem.jsx +++ b/src/components/TodoItem.jsx @@ -2,4 +2,24 @@ import React from "react"; import { useTodoStore } from "../store/TodoStore"; +export const TodoItem =({ id }) => { + const todo = useTodoStore((state) => state.todos.find((todo) => todo.id === id)); //Find the specific to-do + const toggleTodo = useTodoStore((state) => state.toggleTodo); //Access toggle function from Zustand + //Handle checkbox toggle + const handleCheckboxChange = () => { + toggleTodo(id); //Toggle the to-do's completed status when checkbox is clicked + }; + + return ( +
+ + +
+ ); +}; diff --git a/src/components/TodoList.jsx b/src/components/TodoList.jsx index 2186aeda..1d8e9dea 100644 --- a/src/components/TodoList.jsx +++ b/src/components/TodoList.jsx @@ -1 +1,34 @@ -//List that shows all of the created to do's/tasks \ No newline at end of file +//List that shows all of the created to do's/tasks +import React from "react"; +import { useTodoStore } from "../store/TodoStore"; +import { TodoItem } from "../components/TodoItem"; + +export const TodoList = () => { + const todos = useTodoStore((state) => state.todos); //Access the list of to-do's from Zustand + + //Separate completed and incomplete to-do's + const completedTodos = todos.filter((todo) => todo.completed); + const incompleteTodos = todos.filter((todo) => !todo.completed); + + + return ( +
+ {/* Incomplete Tasks */} +

Incomplete Tasks

+ {incompleteTodos.length === 0 ? ( +

Hurray, you've completed all your to-do's!

+ ) : ( + incompleteTodos.map((todo) => ) + )} + + {/* Completed Tasks */} +

Completed Tasks

+ {completedTodos.lenght === 0 ? ( + // Why is the text below in the paragraph not showing on the site? +

No completed to-do's yet but you're doing great!

+ ) : ( + completedTodos.map((todo) => ) + )} +
+ ); +}; diff --git a/src/store/todoStore.jsx b/src/store/todoStore.jsx index a77e2429..f1c4ee29 100644 --- a/src/store/todoStore.jsx +++ b/src/store/todoStore.jsx @@ -7,4 +7,10 @@ export const useTodoStore = create((set) => ({ set((state) => ({ todos: [...state.todos, { id: Date.now(), text, completed: false }], })), + toggleTodo: (id) => + set((state) => ({ + todos: state.todos.map((todo) => + todo.id === id ? { ...todo, completed: !todo.completed } : todo + ), + })), })); From d325ccbb82f8b1d833e679ad36a0114b4e9c3d80 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Wed, 20 Nov 2024 17:45:02 +0100 Subject: [PATCH 06/29] Added header --- src/App.jsx | 3 ++- src/components/Header.jsx | 7 +++++++ src/components/TodoForm.jsx | 6 +++--- 3 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 src/components/Header.jsx diff --git a/src/App.jsx b/src/App.jsx index 865df28f..3baa7150 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,4 +1,5 @@ import React from "react"; +import { Header } from "./components/Header.jsx" import { TodoForm } from "./components/TodoForm.jsx"; import { TodoList } from "./components/TodoList.jsx"; @@ -6,7 +7,7 @@ import { TodoList } from "./components/TodoList.jsx"; export const App = () => { return (
-

hejhej

+
diff --git a/src/components/Header.jsx b/src/components/Header.jsx new file mode 100644 index 00000000..ec4b8d42 --- /dev/null +++ b/src/components/Header.jsx @@ -0,0 +1,7 @@ +import React from "react"; + +export const Header = () => { + return ( +

To-Do App

+ ); +}; diff --git a/src/components/TodoForm.jsx b/src/components/TodoForm.jsx index e685f098..e699257d 100644 --- a/src/components/TodoForm.jsx +++ b/src/components/TodoForm.jsx @@ -22,15 +22,15 @@ export const TodoForm = () => { return (
- + - +
); }; From bbd36075ebae82980862cfe9300df5bb386b3e1a Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Thu, 21 Nov 2024 13:34:27 +0100 Subject: [PATCH 07/29] Added css files to each component --- src/components/Header.css | 7 +++++++ src/components/Header.jsx | 6 +++++- src/components/TodoForm.css | 3 +++ src/components/TodoForm.jsx | 3 ++- src/components/TodoItem.css | 0 src/components/TodoItem.jsx | 1 + src/components/TodoList.css | 0 src/components/TodoList.jsx | 1 + src/index.css | 4 ++++ 9 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 src/components/Header.css create mode 100644 src/components/TodoForm.css create mode 100644 src/components/TodoItem.css create mode 100644 src/components/TodoList.css diff --git a/src/components/Header.css b/src/components/Header.css new file mode 100644 index 00000000..6b1506a3 --- /dev/null +++ b/src/components/Header.css @@ -0,0 +1,7 @@ +.title { + text-align: center; +} + +.sub-title { + text-align: center; +} \ No newline at end of file diff --git a/src/components/Header.jsx b/src/components/Header.jsx index ec4b8d42..8c3c20d6 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -1,7 +1,11 @@ import React from "react"; +import "../components/Header.css"; export const Header = () => { return ( -

To-Do App

+
+

To-Do App

+

Work smarter, Not harder

+
); }; diff --git a/src/components/TodoForm.css b/src/components/TodoForm.css new file mode 100644 index 00000000..251e5d57 --- /dev/null +++ b/src/components/TodoForm.css @@ -0,0 +1,3 @@ +.add-task-button { + border-radius: 16px; +} \ No newline at end of file diff --git a/src/components/TodoForm.jsx b/src/components/TodoForm.jsx index e699257d..2ef4bbf6 100644 --- a/src/components/TodoForm.jsx +++ b/src/components/TodoForm.jsx @@ -2,6 +2,7 @@ import React from "react"; import { useState } from "react"; import { useTodoStore } from "../store/TodoStore"; //It's working even though it's a red underline, not to self +import "../components/TodoForm.css"; export const TodoForm = () => { const [input, setInput] = useState(""); //Local state for the input @@ -30,7 +31,7 @@ export const TodoForm = () => { onChange={handleInputChange} placeholder="Write your to-do here" /> - + ); }; diff --git a/src/components/TodoItem.css b/src/components/TodoItem.css new file mode 100644 index 00000000..e69de29b diff --git a/src/components/TodoItem.jsx b/src/components/TodoItem.jsx index 1e5ad81a..140b42cb 100644 --- a/src/components/TodoItem.jsx +++ b/src/components/TodoItem.jsx @@ -1,6 +1,7 @@ //Component for single to-do, create toggle function inside here import React from "react"; import { useTodoStore } from "../store/TodoStore"; +import "../components/TodoItem.css"; export const TodoItem =({ id }) => { const todo = useTodoStore((state) => state.todos.find((todo) => todo.id === id)); //Find the specific to-do diff --git a/src/components/TodoList.css b/src/components/TodoList.css new file mode 100644 index 00000000..e69de29b diff --git a/src/components/TodoList.jsx b/src/components/TodoList.jsx index 1d8e9dea..402fc8e6 100644 --- a/src/components/TodoList.jsx +++ b/src/components/TodoList.jsx @@ -2,6 +2,7 @@ import React from "react"; import { useTodoStore } from "../store/TodoStore"; import { TodoItem } from "../components/TodoItem"; +import "../components/TodoList.css"; export const TodoList = () => { const todos = useTodoStore((state) => state.todos); //Access the list of to-do's from Zustand diff --git a/src/index.css b/src/index.css index 4669a352..99ae78ee 100644 --- a/src/index.css +++ b/src/index.css @@ -4,6 +4,10 @@ box-sizing: border-box; } +html { + margin: 0; +} + body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", From 201d2dce7100d6fcb944a589e52705a09a013776 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Thu, 21 Nov 2024 16:14:28 +0100 Subject: [PATCH 08/29] CSS styling --- index.html | 4 ++++ src/components/TodoForm.css | 45 ++++++++++++++++++++++++++++++++++++- src/components/TodoForm.jsx | 28 ++++++++++++++--------- src/components/TodoList.css | 30 +++++++++++++++++++++++++ src/components/TodoList.jsx | 38 +++++++++++++++++-------------- src/index.css | 9 +++----- 6 files changed, 119 insertions(+), 35 deletions(-) diff --git a/index.html b/index.html index 42415bf4..be507a10 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,10 @@ Todos App Context API + + + +
diff --git a/src/components/TodoForm.css b/src/components/TodoForm.css index 251e5d57..baf0973d 100644 --- a/src/components/TodoForm.css +++ b/src/components/TodoForm.css @@ -1,3 +1,46 @@ +.new-task-wrapper { + display: flex; + justify-content: center; + align-items: center; + gap: 32px; + padding-left: 35px; + padding-right: 35px; + padding-bottom: 32px; +} + +.new-task-container { + display: flex; + justify-content: center; + align-items: center; + background-color: #f0f0f0; + border-radius: 8px; + max-width: 324px; + min-height: 100px; +} + +.input-container { + display: flex; + flex-direction: column; + gap: 16px; + align-items: center; + justify-content: center; + padding: 24px; +} + .add-task-button { - border-radius: 16px; + width: 100px; + height: 35px; + border-radius: 50px; +} + +.add-task-button:hover { + background-color: #45a049; +} + +@media (min-width: 768px) { + .new-task-wrapper { + gap: 35px; + padding-left: 100px; + padding-right: 100px; + } } \ No newline at end of file diff --git a/src/components/TodoForm.jsx b/src/components/TodoForm.jsx index 2ef4bbf6..4b3b0384 100644 --- a/src/components/TodoForm.jsx +++ b/src/components/TodoForm.jsx @@ -22,16 +22,22 @@ export const TodoForm = () => { }; return ( -
- - - -
+
+
+
+
+ + + +
+
+
+
); }; diff --git a/src/components/TodoList.css b/src/components/TodoList.css index e69de29b..ebe69ca7 100644 --- a/src/components/TodoList.css +++ b/src/components/TodoList.css @@ -0,0 +1,30 @@ +.tasks-container { + display: flex; + flex-direction: column; + gap: 32px; + padding-left: 35px; + padding-right: 35px; +} + +.incomplete-tasks-container, +.completed-tasks-container { + padding: 16px; + background-color: #f0f0f0; /* Optional: adds some visual separation */ + border-radius: 8px; + min-height: 200px; +} + +/* Responsive layout for larger screens */ +@media (min-width: 768px) { + .tasks-container { + flex-direction: row; + gap: 35px; + padding-left: 100px; + padding-right: 100px; + } + + .incomplete-tasks-container, + .completed-tasks-container { + flex: 1; /* Equal width for both containers */ + } +} diff --git a/src/components/TodoList.jsx b/src/components/TodoList.jsx index 402fc8e6..a605e65f 100644 --- a/src/components/TodoList.jsx +++ b/src/components/TodoList.jsx @@ -13,23 +13,27 @@ export const TodoList = () => { return ( -
- {/* Incomplete Tasks */} -

Incomplete Tasks

- {incompleteTodos.length === 0 ? ( -

Hurray, you've completed all your to-do's!

- ) : ( - incompleteTodos.map((todo) => ) - )} +
+ {/* Incomplete Tasks */} +
+

Incomplete Tasks

+ {incompleteTodos.length === 0 ? ( +

Hurray, you've completed all your to-do's!

+ ) : ( + incompleteTodos.map((todo) => ) + )} +
- {/* Completed Tasks */} -

Completed Tasks

- {completedTodos.lenght === 0 ? ( - // Why is the text below in the paragraph not showing on the site? -

No completed to-do's yet but you're doing great!

- ) : ( - completedTodos.map((todo) => ) - )} -
+
+ {/* Completed Tasks */} +

Completed Tasks

+ {completedTodos.length === 0 ? ( + // Why is the text below in the paragraph not showing on the site? +

No completed to-do's yet but you're doing great!

+ ) : ( + completedTodos.map((todo) => ) + )} +
+
); }; diff --git a/src/index.css b/src/index.css index 99ae78ee..40bd5031 100644 --- a/src/index.css +++ b/src/index.css @@ -4,15 +4,12 @@ box-sizing: border-box; } -html { - margin: 0; -} - body { margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", + font-family: inter; + /* font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", - sans-serif; + sans-serif; */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } \ No newline at end of file From b99086ab311744edfb943dbfc0051de809e70117 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Thu, 21 Nov 2024 18:30:38 +0100 Subject: [PATCH 09/29] Added animation and styling --- index.html | 5 +++++ src/App.jsx | 1 - src/assets/thumbIcon.png | Bin 0 -> 25398 bytes src/assets/waitIcon.png | Bin 0 -> 23089 bytes src/components/Animation.css | 0 src/components/Animation.jsx | 16 ++++++++++++++++ src/components/Header.css | 33 ++++++++++++++++++++++++++++++--- src/components/Header.jsx | 10 ++++++++-- src/components/TodoForm.css | 28 +++++++++++++++++++++++----- src/components/TodoForm.jsx | 2 +- src/components/TodoList.css | 32 ++++++++++++++++++++++++++++++-- src/components/TodoList.jsx | 12 ++++++++++-- src/index.css | 7 +++++++ 13 files changed, 130 insertions(+), 16 deletions(-) create mode 100644 src/assets/thumbIcon.png create mode 100644 src/assets/waitIcon.png create mode 100644 src/components/Animation.css create mode 100644 src/components/Animation.jsx diff --git a/index.html b/index.html index be507a10..e6566861 100644 --- a/index.html +++ b/index.html @@ -8,6 +8,11 @@ + + + + +
diff --git a/src/App.jsx b/src/App.jsx index 3baa7150..ce2751c7 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -3,7 +3,6 @@ import { Header } from "./components/Header.jsx" import { TodoForm } from "./components/TodoForm.jsx"; import { TodoList } from "./components/TodoList.jsx"; - export const App = () => { return (
diff --git a/src/assets/thumbIcon.png b/src/assets/thumbIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6db5e84d21cdb35713f1ecd161c613457bba04 GIT binary patch literal 25398 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

yX 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 DrlgJU literal 0 HcmV?d00001 diff --git a/src/assets/waitIcon.png b/src/assets/waitIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..5e3172a40caf5468c8d58fa5034123e29338c6e3 GIT binary patch literal 23089 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 { + return ( +

+ +
+ ); +}; diff --git a/src/components/Header.css b/src/components/Header.css index 6b1506a3..5a21844b 100644 --- a/src/components/Header.css +++ b/src/components/Header.css @@ -1,7 +1,34 @@ +.header { + display: flex; + align-items: center; + justify-content: center; + padding: 20px; + width: 100%; + flex-direction: column; + text-align: center; + font-family: Kumar One; + letter-spacing: 8px; +} + .title { - text-align: center; + margin-bottom: 10px; + font-size: 2rem; } .sub-title { - text-align: center; -} \ No newline at end of file + margin-top: 10px; + font-size: 1.2rem; + color: #c19646; +} + +.animation-container { + display: flex; + justify-content: center; + align-items: center; + margin: 0 20px; +} + +.lottie-animation { + width: 70%; + height: 70%; +} diff --git a/src/components/Header.jsx b/src/components/Header.jsx index 8c3c20d6..e4ad3568 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -1,11 +1,17 @@ import React from "react"; +import { Animation } from "../components/Animation.jsx"; import "../components/Header.css"; export const Header = () => { return (
-

To-Do App

-

Work smarter, Not harder

+
+

To-Do App

+

Work smarter, Not harder

+
+ {/* Insert the animation component here */} +
+
); }; diff --git a/src/components/TodoForm.css b/src/components/TodoForm.css index baf0973d..69678a06 100644 --- a/src/components/TodoForm.css +++ b/src/components/TodoForm.css @@ -12,10 +12,13 @@ display: flex; justify-content: center; align-items: center; - background-color: #f0f0f0; - border-radius: 8px; + background-color: #faf5ba; + border-radius: 24px; max-width: 324px; min-height: 100px; + font-family: kumar one; + font-size: 20px; + border: 2px solid rgba(214, 178, 0, 0.3); } .input-container { @@ -27,14 +30,29 @@ padding: 24px; } +.textfield { + font-family: robot; + font-size: 14px; + border-color: #d6b200; + border-radius: 8px; + height: 50px; + text-align: center; +} + .add-task-button { - width: 100px; - height: 35px; + width: 90px; + height: 32px; border-radius: 50px; + border: none; + background-color: #006400; + color: white; + font-weight: 600; + font-family: kumar one; + font-size: 12px; } .add-task-button:hover { - background-color: #45a049; + background-color: #c19646; } @media (min-width: 768px) { diff --git a/src/components/TodoForm.jsx b/src/components/TodoForm.jsx index 4b3b0384..f8e71389 100644 --- a/src/components/TodoForm.jsx +++ b/src/components/TodoForm.jsx @@ -32,7 +32,7 @@ export const TodoForm = () => { type="text" value={input} onChange={handleInputChange} - placeholder="Write something here" + placeholder="Write something here" className="textfield" />
diff --git a/src/components/TodoList.css b/src/components/TodoList.css index ebe69ca7..481e35a5 100644 --- a/src/components/TodoList.css +++ b/src/components/TodoList.css @@ -4,14 +4,42 @@ gap: 32px; padding-left: 35px; padding-right: 35px; + padding-bottom: 35px } .incomplete-tasks-container, .completed-tasks-container { padding: 16px; - background-color: #f0f0f0; /* Optional: adds some visual separation */ - border-radius: 8px; + /* background-color: #e0eafb; */ + border-radius: 24px; min-height: 200px; + font-family: roboto; + border: 2px solid rgba(214, 178, 0, 0.3); + font-family: kumar one; + letter-spacing: 2px; +} + +.incomplete-tasks-container h2, +.completed-tasks-container h2 { + font-size: 20px; +} + +.incomplete-tasks-container p, +.completed-tasks-container p { + font-size: 20px; + font-family: robot; +} + +.thumb-icon { + width: 35px; + height: 35px; + margin-left: 4px; +} + +.wait-icon { + width: 25px; + height: 25px; + margin-left: 4px; } /* Responsive layout for larger screens */ diff --git a/src/components/TodoList.jsx b/src/components/TodoList.jsx index a605e65f..5d16d78b 100644 --- a/src/components/TodoList.jsx +++ b/src/components/TodoList.jsx @@ -2,6 +2,8 @@ import React from "react"; import { useTodoStore } from "../store/TodoStore"; import { TodoItem } from "../components/TodoItem"; +import thumbIcon from "../assets/thumbIcon.png"; +import waitIcon from "../assets/waitIcon.png"; import "../components/TodoList.css"; export const TodoList = () => { @@ -16,7 +18,10 @@ export const TodoList = () => {
{/* Incomplete Tasks */}
-

Incomplete Tasks

+

+ Incomplete Tasks + hourglass +

{incompleteTodos.length === 0 ? (

Hurray, you've completed all your to-do's!

) : ( @@ -26,7 +31,10 @@ export const TodoList = () => {
{/* Completed Tasks */} -

Completed Tasks

+

+ Completed Tasks + thumbs up +

{completedTodos.length === 0 ? ( // Why is the text below in the paragraph not showing on the site?

No completed to-do's yet but you're doing great!

diff --git a/src/index.css b/src/index.css index 40bd5031..ce699193 100644 --- a/src/index.css +++ b/src/index.css @@ -4,6 +4,13 @@ box-sizing: border-box; } +html { + background-color: #faf5ba; + /* change later if i wanna change specific text-colors */ + color: #4a4400; + /* color: #337fbd; */ +} + body { margin: 0; font-family: inter; From 33130e12db92237c6dce7081002bd18c28b6bb30 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 22 Nov 2024 19:05:54 +0100 Subject: [PATCH 10/29] Added additional styling and media queries --- src/assets/DeleteIcon.svg | 15 ++++++++++++ src/components/Animation.css | 8 ++++++ src/components/Header.css | 23 ++++++++++++++---- src/components/Header.jsx | 2 +- src/components/TodoForm.css | 47 ++++++++++++++++++++++++++++++------ src/components/TodoItem.css | 8 ++++++ src/components/TodoItem.jsx | 16 +++++++++++- src/components/TodoList.css | 35 ++++++++++++++++++++++++++- src/components/TodoList.jsx | 8 +++--- src/index.css | 7 ++---- src/store/todoStore.jsx | 15 ++++++++++++ 11 files changed, 160 insertions(+), 24 deletions(-) create mode 100644 src/assets/DeleteIcon.svg diff --git a/src/assets/DeleteIcon.svg b/src/assets/DeleteIcon.svg new file mode 100644 index 00000000..9266d741 --- /dev/null +++ b/src/assets/DeleteIcon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/components/Animation.css b/src/components/Animation.css index e69de29b..283015d9 100644 --- a/src/components/Animation.css +++ b/src/components/Animation.css @@ -0,0 +1,8 @@ +.animation-container { + display: flex; + align-items: center; + justify-content: center; + /* max-width: 300px; + max-height: 300px; */ + overflow: hidden; +} \ No newline at end of file diff --git a/src/components/Header.css b/src/components/Header.css index 5a21844b..2e10e225 100644 --- a/src/components/Header.css +++ b/src/components/Header.css @@ -2,12 +2,12 @@ display: flex; align-items: center; justify-content: center; - padding: 20px; + padding: 35px; width: 100%; flex-direction: column; text-align: center; - font-family: Kumar One; - letter-spacing: 8px; + font-family: Kumar One; + letter-spacing: 8px; } .title { @@ -17,8 +17,11 @@ .sub-title { margin-top: 10px; - font-size: 1.2rem; - color: #c19646; + font-size: 1.3rem; + /* color: #c19646; */ + color: blue; + padding-left: 8px; + padding-right: 8px; } .animation-container { @@ -32,3 +35,13 @@ width: 70%; height: 70%; } + +@media (max-width: 767px) { + .title { + font-size: 1.8rem; + } + + .sub-title { + font-size: 1.1rem; + } +} diff --git a/src/components/Header.jsx b/src/components/Header.jsx index e4ad3568..c18e3cf0 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -6,7 +6,7 @@ export const Header = () => { return (
-

To-Do App

+

To-Do List

Work smarter, Not harder

{/* Insert the animation component here */} diff --git a/src/components/TodoForm.css b/src/components/TodoForm.css index 69678a06..81105b4b 100644 --- a/src/components/TodoForm.css +++ b/src/components/TodoForm.css @@ -31,28 +31,59 @@ } .textfield { - font-family: robot; - font-size: 14px; + font-size: 18px; border-color: #d6b200; border-radius: 8px; height: 50px; text-align: center; + font-family:'Courier New', Courier, monospace; + padding: 16px; } .add-task-button { - width: 90px; - height: 32px; - border-radius: 50px; + width: 100px; + height: 36px; + border-radius: 24px; border: none; - background-color: #006400; + background-color: blue; color: white; font-weight: 600; font-family: kumar one; - font-size: 12px; + font-size: 14px; } .add-task-button:hover { - background-color: #c19646; + background-color: #444C38; +} + +@media (max-width: 767px) { + .new-task-wrapper { + padding-left: 35px; + padding-right: 35px; + } + + .new-task-container { + flex: 1; + max-width: 100%; + width: 90%; + min-width: 240px; + padding: 16px; + font-size: 18px; + } + + .input-container label { + font-size: 16px + } + + .textfield { + font-size: 14px; + padding: 12px; + } + + .add-task-button { + width: 90px; + font-size: 12px; + } } @media (min-width: 768px) { diff --git a/src/components/TodoItem.css b/src/components/TodoItem.css index e69de29b..5ac4d4fb 100644 --- a/src/components/TodoItem.css +++ b/src/components/TodoItem.css @@ -0,0 +1,8 @@ +.delete-icon { + cursor: pointer; + width: 24px; + height: 24px; + display: inline-block; + position: relative; + top: 2px; +} \ No newline at end of file diff --git a/src/components/TodoItem.jsx b/src/components/TodoItem.jsx index 140b42cb..ffb2968f 100644 --- a/src/components/TodoItem.jsx +++ b/src/components/TodoItem.jsx @@ -1,17 +1,24 @@ //Component for single to-do, create toggle function inside here import React from "react"; import { useTodoStore } from "../store/TodoStore"; +import DeleteIcon from "../assets/DeleteIcon.svg"; import "../components/TodoItem.css"; export const TodoItem =({ id }) => { const todo = useTodoStore((state) => state.todos.find((todo) => todo.id === id)); //Find the specific to-do const toggleTodo = useTodoStore((state) => state.toggleTodo); //Access toggle function from Zustand + const deleteTodo = useTodoStore ((state) => state.deleteTodo); //Access delete function //Handle checkbox toggle const handleCheckboxChange = () => { toggleTodo(id); //Toggle the to-do's completed status when checkbox is clicked }; + //Handle delete button + const handleDeleteClick = () => { + deleteTodo(id); //Remove the task from list + }; + return (
{ onChange={handleCheckboxChange} //When checked or unchecked it triggers toggle id={`todo-${todo.id}`} /> - + + {/* Delete button */} + Delete task
); }; diff --git a/src/components/TodoList.css b/src/components/TodoList.css index 481e35a5..c2e7cd1b 100644 --- a/src/components/TodoList.css +++ b/src/components/TodoList.css @@ -27,19 +27,52 @@ .incomplete-tasks-container p, .completed-tasks-container p { font-size: 20px; - font-family: robot; + letter-spacing: 0; + font-family:'Courier New', Courier, monospace; } .thumb-icon { width: 35px; height: 35px; margin-left: 4px; + position: relative; + top: 2px; } .wait-icon { width: 25px; height: 25px; margin-left: 4px; + position: relative; + top: 2px; +} + +@media (max-width: 767px) { + .incomplete-tasks-container h2, + .completed-tasks-container h2 { + font-size: 16px; + } + + .incomplete-tasks-container p, + .completed-tasks-container p { + font-size: 16px; + } + .thumb-icon { + width: 25px; + height: 25px; + margin-left: 4px; + position: relative; + top: 2px; + } + + .wait-icon { + width: 15px; + height: 15px; + margin-left: 4px; + position: relative; + top: 2px; + } + } /* Responsive layout for larger screens */ diff --git a/src/components/TodoList.jsx b/src/components/TodoList.jsx index 5d16d78b..7f9dbbbd 100644 --- a/src/components/TodoList.jsx +++ b/src/components/TodoList.jsx @@ -19,11 +19,12 @@ export const TodoList = () => { {/* Incomplete Tasks */}

- Incomplete Tasks + Incomplete Tasks + ({incompleteTodos.length}) hourglass

{incompleteTodos.length === 0 ? ( -

Hurray, you've completed all your to-do's!

+

You're a star!

) : ( incompleteTodos.map((todo) => ) )} @@ -33,11 +34,12 @@ export const TodoList = () => { {/* Completed Tasks */}

Completed Tasks + ({completedTodos.length}) thumbs up

{completedTodos.length === 0 ? ( // Why is the text below in the paragraph not showing on the site? -

No completed to-do's yet but you're doing great!

+

Hurray, you're doing great!

) : ( completedTodos.map((todo) => ) )} diff --git a/src/index.css b/src/index.css index ce699193..8ca7d9b2 100644 --- a/src/index.css +++ b/src/index.css @@ -6,17 +6,14 @@ html { background-color: #faf5ba; - /* change later if i wanna change specific text-colors */ color: #4a4400; - /* color: #337fbd; */ + overflow-x: hidden; } body { margin: 0; + overflow-x: hidden; font-family: inter; - /* font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", - "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", - sans-serif; */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } \ No newline at end of file diff --git a/src/store/todoStore.jsx b/src/store/todoStore.jsx index f1c4ee29..1683fbed 100644 --- a/src/store/todoStore.jsx +++ b/src/store/todoStore.jsx @@ -13,4 +13,19 @@ export const useTodoStore = create((set) => ({ todo.id === id ? { ...todo, completed: !todo.completed } : todo ), })), + + //Delete to-do + deleteTodo: (id) => + set ((state) => ({ + todos: state.todos.filter((todo) => todo.id !== id), + })), + + //Task counts + getIncompleteCount: () => + get().todos.filter((todo) => !todo.completed).length, + + getCompletedCount: () => + get().todos.filter((todo) => todo.completed).length, })); + + From fea8235e595aa510260ecd98e5a5649c2c3fdf5e Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 22 Nov 2024 19:15:36 +0100 Subject: [PATCH 11/29] Cleaned code and deleted unused files in assets --- README.md | 21 --------------------- src/assets/banner.svg | 18 ------------------ src/components/Animation.css | 2 -- src/components/Header.css | 7 +++++-- src/components/Header.jsx | 2 +- src/components/TodoForm.css | 4 ++++ src/components/TodoForm.jsx | 5 +++-- src/components/TodoItem.jsx | 5 +++-- src/components/TodoList.css | 10 ++++++---- src/components/TodoList.jsx | 3 ++- src/store/todoStore.jsx | 4 +--- 11 files changed, 25 insertions(+), 56 deletions(-) delete mode 100644 src/assets/banner.svg diff --git a/README.md b/README.md index 36daf341..cb9e8611 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,10 @@ -

- - Project Banner Image - -

- # Todo - useContext Project - Replace this readme with your own information about your project. Start by briefly describing the assignment in a sentence or two. Keep it short and to the point. ## Getting Started with the Project -### Dependency Installation & Startup Development Server - -Once cloned, navigate to the project's root directory and this project uses npm (Node Package Manager) to manage its dependencies. - -The command below is a combination of installing dependencies, opening up the project on VS Code and it will run a development server on your terminal. - -```bash -npm i && code . && npm run dev -``` ### The Problem @@ -30,8 +14,3 @@ Describe how you approached to problem, and what tools and techniques you used t Every project should be deployed somewhere. Be sure to include the link to the deployed project so that the viewer can click around and see what it's all about. -## Instructions - - - See instructions of this project - diff --git a/src/assets/banner.svg b/src/assets/banner.svg deleted file mode 100644 index 2bc0acbb..00000000 --- a/src/assets/banner.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/src/components/Animation.css b/src/components/Animation.css index 283015d9..b0936425 100644 --- a/src/components/Animation.css +++ b/src/components/Animation.css @@ -2,7 +2,5 @@ display: flex; align-items: center; justify-content: center; - /* max-width: 300px; - max-height: 300px; */ overflow: hidden; } \ No newline at end of file diff --git a/src/components/Header.css b/src/components/Header.css index 2e10e225..b54bfcd7 100644 --- a/src/components/Header.css +++ b/src/components/Header.css @@ -18,7 +18,6 @@ .sub-title { margin-top: 10px; font-size: 1.3rem; - /* color: #c19646; */ color: blue; padding-left: 8px; padding-right: 8px; @@ -36,6 +35,10 @@ height: 70%; } + +/* Media queries */ + +/* Smaller screens */ @media (max-width: 767px) { .title { font-size: 1.8rem; @@ -44,4 +47,4 @@ .sub-title { font-size: 1.1rem; } -} +} \ No newline at end of file diff --git a/src/components/Header.jsx b/src/components/Header.jsx index c18e3cf0..36ae17ff 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -9,7 +9,7 @@ export const Header = () => {

To-Do List

Work smarter, Not harder

- {/* Insert the animation component here */} +
diff --git a/src/components/TodoForm.css b/src/components/TodoForm.css index 81105b4b..93b8b3ca 100644 --- a/src/components/TodoForm.css +++ b/src/components/TodoForm.css @@ -56,6 +56,9 @@ background-color: #444C38; } +/* Media queries */ + +/* Smaller screens */ @media (max-width: 767px) { .new-task-wrapper { padding-left: 35px; @@ -86,6 +89,7 @@ } } +/* Larger screens */ @media (min-width: 768px) { .new-task-wrapper { gap: 35px; diff --git a/src/components/TodoForm.jsx b/src/components/TodoForm.jsx index f8e71389..9658153d 100644 --- a/src/components/TodoForm.jsx +++ b/src/components/TodoForm.jsx @@ -1,7 +1,8 @@ -//Component to create new to-do/task +//Component to create new tasks + import React from "react"; import { useState } from "react"; -import { useTodoStore } from "../store/TodoStore"; //It's working even though it's a red underline, not to self +import { useTodoStore } from "../store/TodoStore"; import "../components/TodoForm.css"; export const TodoForm = () => { diff --git a/src/components/TodoItem.jsx b/src/components/TodoItem.jsx index ffb2968f..53f64be5 100644 --- a/src/components/TodoItem.jsx +++ b/src/components/TodoItem.jsx @@ -1,4 +1,5 @@ -//Component for single to-do, create toggle function inside here +//Component for single task + import React from "react"; import { useTodoStore } from "../store/TodoStore"; import DeleteIcon from "../assets/DeleteIcon.svg"; @@ -28,7 +29,7 @@ export const TodoItem =({ id }) => { id={`todo-${todo.id}`} /> - {/* Delete button */} + {/* Delete clickable icon */} Delete task ({ @@ -27,5 +27,3 @@ export const useTodoStore = create((set) => ({ getCompletedCount: () => get().todos.filter((todo) => todo.completed).length, })); - - From ecff126b916ab410cdb501e65e203e942d9365b5 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 22 Nov 2024 20:18:44 +0100 Subject: [PATCH 12/29] Deleted icons and imported icons in proper sizes and some styling --- src/assets/thumbIcon.png | Bin 25398 -> 3350 bytes src/assets/waitIcon.png | Bin 23089 -> 2187 bytes src/components/Animation.css | 3 +++ src/components/Animation.jsx | 1 + src/components/TodoItem.css | 16 ++++++++++++++-- src/components/TodoItem.jsx | 1 + src/components/TodoList.css | 10 ++++++++-- 7 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/assets/thumbIcon.png b/src/assets/thumbIcon.png index 9b6db5e84d21cdb35713f1ecd161c613457bba04..b91fe4ecaf14da9ca8392dbe32ddcb895a5ab785 100644 GIT binary patch literal 3350 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 a`{WvM+bb}i&v|+KSHSqF1-it*E#g1@Yrf+E literal 25398 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

yX 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 DrlgJU diff --git a/src/assets/waitIcon.png b/src/assets/waitIcon.png index 5e3172a40caf5468c8d58fa5034123e29338c6e3..21d017c4045a95ea9cb8e4c394f08d848f6204a0 100644 GIT binary patch literal 2187 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 { loop autoplay className="lottie-animation" + renderer="svg" />

); diff --git a/src/components/TodoItem.css b/src/components/TodoItem.css index 5ac4d4fb..6ed9d162 100644 --- a/src/components/TodoItem.css +++ b/src/components/TodoItem.css @@ -1,8 +1,20 @@ +.todo-item { + display: flex; + font-family:'Courier New', Courier, monospace; + font-size: 20px; + font-weight: 500; +} + .delete-icon { cursor: pointer; - width: 24px; - height: 24px; + width: 20px; + height: 20px; display: inline-block; position: relative; top: 2px; +} + +.checkbox { + width: 40px; + height: 18px; } \ No newline at end of file diff --git a/src/components/TodoItem.jsx b/src/components/TodoItem.jsx index 53f64be5..10910996 100644 --- a/src/components/TodoItem.jsx +++ b/src/components/TodoItem.jsx @@ -27,6 +27,7 @@ export const TodoItem =({ id }) => { checked={todo.completed} onChange={handleCheckboxChange} //When checked or unchecked it triggers toggle id={`todo-${todo.id}`} + className="checkbox" /> {/* Delete clickable icon */} diff --git a/src/components/TodoList.css b/src/components/TodoList.css index 8dc84881..3e9d943f 100644 --- a/src/components/TodoList.css +++ b/src/components/TodoList.css @@ -46,6 +46,12 @@ top: 2px; } +.delete-icon { + position: relative; + top: 5px; + margin-left: 4px; +} + /* Media queries */ /* Smaller screens */ @@ -68,8 +74,8 @@ } .wait-icon { - width: 15px; - height: 15px; + width: 18px; + height: 18px; margin-left: 4px; position: relative; top: 2px; From 06293ab512e7106b55b31d5dbfc52f7435c16842 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 22 Nov 2024 20:30:39 +0100 Subject: [PATCH 13/29] Styling --- src/components/TodoItem.css | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/components/TodoItem.css b/src/components/TodoItem.css index 6ed9d162..4f01d692 100644 --- a/src/components/TodoItem.css +++ b/src/components/TodoItem.css @@ -10,11 +10,32 @@ width: 20px; height: 20px; display: inline-block; - position: relative; - top: 2px; + margin-top: -4px; } .checkbox { width: 40px; height: 18px; +} + +/* Media queries */ + +/* Smaller screens */ +@media (max-width: 767px) { + .todo-item { + font-size: 16px; + position: relative; + } + + .delete-icon { + width: 18px; + height: 18px; + display: inline-block; + margin-top: -5px; + } + + .checkbox { + width: 35px; + height: 12px + } } \ No newline at end of file From f9fd6640bd5fcb39b5745c154643701b68714349 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 22 Nov 2024 20:42:48 +0100 Subject: [PATCH 14/29] Updated readme file --- README.md | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index cb9e8611..dd0abcdb 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,8 @@ -# Todo - useContext Project -Replace this readme with your own information about your project. - -Start by briefly describing the assignment in a sentence or two. Keep it short and to the point. - -## Getting Started with the Project - +# The Project +This week's project we've built a to-do app using Zustand for Global State Management. ### The Problem - -Describe how you approached to problem, and what tools and techniques you used to solve it. How did you plan? What technologies did you use? If you had more time, what would be next? +At first I found it hard to understand all the logical parts with Zustand. I started out with planning the structure and deciding what kind of components I needed. I also sketched out my ideas on a piece of paper and wanted to have a playful design. I found a Lottie animation I wanted to import which I managed to do with some help from google. I tried to reasearch a lot before starting with the code but I had to turn to chatgbt a bit to help me make it work. After I've made it work I moved onto styling the app. This week I also started with mobile first which helped me a lot when making the app responsive. ### View it live -Every project should be deployed somewhere. Be sure to include the link to the deployed project so that the viewer can click around and see what it's all about. - From d879c137960c10a3a927f51218ebc015a19108cc Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 22 Nov 2024 20:48:46 +0100 Subject: [PATCH 15/29] Updated icons alt texts --- src/components/TodoItem.jsx | 2 +- src/components/TodoList.jsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/TodoItem.jsx b/src/components/TodoItem.jsx index 10910996..90724f52 100644 --- a/src/components/TodoItem.jsx +++ b/src/components/TodoItem.jsx @@ -33,7 +33,7 @@ export const TodoItem =({ id }) => { {/* Delete clickable icon */} Delete task diff --git a/src/components/TodoList.jsx b/src/components/TodoList.jsx index 162b3bf1..ece4304a 100644 --- a/src/components/TodoList.jsx +++ b/src/components/TodoList.jsx @@ -22,7 +22,7 @@ export const TodoList = () => {

Incomplete Tasks ({incompleteTodos.length}) - hourglass + Hourglass in light blue and orange

{incompleteTodos.length === 0 ? (

You're a star!

@@ -36,7 +36,7 @@ export const TodoList = () => {

Completed Tasks ({completedTodos.length}) - thumbs up + A hand doing thumbs-up with small yellow stars above

{completedTodos.length === 0 ? ( // Why is the text below in the paragraph not showing on the site? From 08a8ae0c87de3563945e7145e5f17bf75d2a573a Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 22 Nov 2024 20:59:18 +0100 Subject: [PATCH 16/29] Try error fixing, deplying site --- README.md | 1 - src/components/TodoForm.jsx | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index dd0abcdb..8ae78dbb 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,3 @@ This week's project we've built a to-do app using Zustand for Global State Manag At first I found it hard to understand all the logical parts with Zustand. I started out with planning the structure and deciding what kind of components I needed. I also sketched out my ideas on a piece of paper and wanted to have a playful design. I found a Lottie animation I wanted to import which I managed to do with some help from google. I tried to reasearch a lot before starting with the code but I had to turn to chatgbt a bit to help me make it work. After I've made it work I moved onto styling the app. This week I also started with mobile first which helped me a lot when making the app responsive. ### View it live - diff --git a/src/components/TodoForm.jsx b/src/components/TodoForm.jsx index 9658153d..e30292a5 100644 --- a/src/components/TodoForm.jsx +++ b/src/components/TodoForm.jsx @@ -2,7 +2,7 @@ import React from "react"; import { useState } from "react"; -import { useTodoStore } from "../store/TodoStore"; +import { useTodoStore } from "../store/TodoStore.jsx"; import "../components/TodoForm.css"; export const TodoForm = () => { From c28c279cec3a89a839da77342b3d60e63fd772ff Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 22 Nov 2024 21:33:58 +0100 Subject: [PATCH 17/29] Error fix --- src/components/TodoForm.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/TodoForm.jsx b/src/components/TodoForm.jsx index e30292a5..421440c6 100644 --- a/src/components/TodoForm.jsx +++ b/src/components/TodoForm.jsx @@ -3,6 +3,7 @@ import React from "react"; import { useState } from "react"; import { useTodoStore } from "../store/TodoStore.jsx"; +import { TodoStore } from "../store/TodoStore.jsx"; import "../components/TodoForm.css"; export const TodoForm = () => { From dba43ed1b3fe104a0c3ff3a4a79f7c6072322df7 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 22 Nov 2024 21:35:04 +0100 Subject: [PATCH 18/29] Error fix x2 --- src/components/TodoForm.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/TodoForm.jsx b/src/components/TodoForm.jsx index 421440c6..e30292a5 100644 --- a/src/components/TodoForm.jsx +++ b/src/components/TodoForm.jsx @@ -3,7 +3,6 @@ import React from "react"; import { useState } from "react"; import { useTodoStore } from "../store/TodoStore.jsx"; -import { TodoStore } from "../store/TodoStore.jsx"; import "../components/TodoForm.css"; export const TodoForm = () => { From 7b77ad190c121037708cbcb1ca0bfc8d9d4c201f Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 22 Nov 2024 21:55:39 +0100 Subject: [PATCH 19/29] Error fix x3 --- src/store/todoStore.jsx | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/store/todoStore.jsx b/src/store/todoStore.jsx index 1b8fc6aa..e14fa169 100644 --- a/src/store/todoStore.jsx +++ b/src/store/todoStore.jsx @@ -1,12 +1,16 @@ // Create state management with Zustand import { create } from "zustand"; -export const useTodoStore = create((set) => ({ +export const useTodoStore = create((set, get) => ({ todos: [], + + // Add a new todo addTodo: (text) => set((state) => ({ todos: [...state.todos, { id: Date.now(), text, completed: false }], })), + + // Toggle todo completion status toggleTodo: (id) => set((state) => ({ todos: state.todos.map((todo) => @@ -14,16 +18,17 @@ export const useTodoStore = create((set) => ({ ), })), - //Delete to-do - deleteTodo: (id) => - set ((state) => ({ - todos: state.todos.filter((todo) => todo.id !== id), - })), + // Delete a todo + deleteTodo: (id) => + set((state) => ({ + todos: state.todos.filter((todo) => todo.id !== id), + })), - //Task counts - getIncompleteCount: () => - get().todos.filter((todo) => !todo.completed).length, - - getCompletedCount: () => - get().todos.filter((todo) => todo.completed).length, -})); + // Get count of incomplete todos + getIncompleteCount: () => + get().todos.filter((todo) => !todo.completed).length, + + // Get count of completed todos + getCompletedCount: () => + get().todos.filter((todo) => todo.completed).length, +})); \ No newline at end of file From ddd72d7c3b9eb559796ba19ca77fc5180368d5db Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 22 Nov 2024 22:05:38 +0100 Subject: [PATCH 20/29] Error fix x4 --- src/components/TodoForm.jsx | 2 +- src/components/TodoItem.jsx | 2 +- src/components/TodoList.jsx | 2 +- src/store/{todoStore.jsx => useTodoStore.jsx} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename src/store/{todoStore.jsx => useTodoStore.jsx} (100%) diff --git a/src/components/TodoForm.jsx b/src/components/TodoForm.jsx index e30292a5..eca64030 100644 --- a/src/components/TodoForm.jsx +++ b/src/components/TodoForm.jsx @@ -2,7 +2,7 @@ import React from "react"; import { useState } from "react"; -import { useTodoStore } from "../store/TodoStore.jsx"; +import { useTodoStore } from "../store/useTodoStore"; import "../components/TodoForm.css"; export const TodoForm = () => { diff --git a/src/components/TodoItem.jsx b/src/components/TodoItem.jsx index 90724f52..9862969f 100644 --- a/src/components/TodoItem.jsx +++ b/src/components/TodoItem.jsx @@ -1,7 +1,7 @@ //Component for single task import React from "react"; -import { useTodoStore } from "../store/TodoStore"; +import { useTodoStore } from "../store/useTodoStore"; import DeleteIcon from "../assets/DeleteIcon.svg"; import "../components/TodoItem.css"; diff --git a/src/components/TodoList.jsx b/src/components/TodoList.jsx index ece4304a..312cb9fb 100644 --- a/src/components/TodoList.jsx +++ b/src/components/TodoList.jsx @@ -1,7 +1,7 @@ //List that shows all of the created tasks import React from "react"; -import { useTodoStore } from "../store/TodoStore"; +import { useTodoStore } from "../store/useTodoStore"; import { TodoItem } from "../components/TodoItem"; import thumbIcon from "../assets/thumbIcon.png"; import waitIcon from "../assets/waitIcon.png"; diff --git a/src/store/todoStore.jsx b/src/store/useTodoStore.jsx similarity index 100% rename from src/store/todoStore.jsx rename to src/store/useTodoStore.jsx From 112a855fc650698b568d33509ccf4ba9a5be252e Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 22 Nov 2024 22:13:12 +0100 Subject: [PATCH 21/29] update --- src/components/Animation.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Animation.jsx b/src/components/Animation.jsx index e84ba7db..9bce9300 100644 --- a/src/components/Animation.jsx +++ b/src/components/Animation.jsx @@ -1,6 +1,6 @@ import React from "react"; import { DotLottieReact } from "@lottiefiles/dotlottie-react"; -import "../components/animation.css"; +import "../components/Animation.css"; export const Animation = () => { return ( From 91af381547b4d40b678147fe89aee80a37dc29e5 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 22 Nov 2024 22:23:29 +0100 Subject: [PATCH 22/29] Added deploy link to readme file --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8ae78dbb..82a51b62 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,4 @@ This week's project we've built a to-do app using Zustand for Global State Manag At first I found it hard to understand all the logical parts with Zustand. I started out with planning the structure and deciding what kind of components I needed. I also sketched out my ideas on a piece of paper and wanted to have a playful design. I found a Lottie animation I wanted to import which I managed to do with some help from google. I tried to reasearch a lot before starting with the code but I had to turn to chatgbt a bit to help me make it work. After I've made it work I moved onto styling the app. This week I also started with mobile first which helped me a lot when making the app responsive. ### View it live +https://elinatodoapp3.netlify.app/ \ No newline at end of file From 7897344232b5d087f1419af1c0fdb021011d9e97 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Thu, 28 Nov 2024 15:51:08 +0100 Subject: [PATCH 23/29] Typescript installation done, changed file names to tsx --- .vscode/settings.json | 3 + eslint.config.js | 12 + package-lock.json | 1348 +++++++++++++---- package.json | 15 +- src/App.jsx | 14 - src/App.tsx | 13 + .../{Animation.jsx => Animation.tsx} | 1 - src/components/{Header.jsx => Header.tsx} | 3 +- src/components/{TodoForm.jsx => TodoForm.tsx} | 1 - src/components/{TodoItem.jsx => TodoItem.tsx} | 1 - src/components/{TodoList.jsx => TodoList.tsx} | 3 +- .../{useTodoStore.jsx => useTodoStore.tsx} | 0 tsconfig.json | 53 + 13 files changed, 1174 insertions(+), 293 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 eslint.config.js delete mode 100644 src/App.jsx create mode 100644 src/App.tsx rename src/components/{Animation.jsx => Animation.tsx} (93%) rename src/components/{Header.jsx => Header.tsx} (80%) rename src/components/{TodoForm.jsx => TodoForm.tsx} (97%) rename src/components/{TodoItem.jsx => TodoItem.tsx} (98%) rename src/components/{TodoList.jsx => TodoList.tsx} (95%) rename src/store/{useTodoStore.jsx => useTodoStore.tsx} (100%) create mode 100644 tsconfig.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..55712c19 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib" +} \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..bb72d115 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,12 @@ +import globals from "globals"; +import pluginJs from "@eslint/js"; +import pluginReact from "eslint-plugin-react"; + + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + {files: ["**/*.{js,mjs,cjs,jsx}"]}, + {languageOptions: { globals: globals.browser }}, + pluginJs.configs.recommended, + pluginReact.configs.flat.recommended, +]; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ee3c4c8e..8ca8332f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,13 +15,18 @@ "zustand": "^5.0.1" }, "devDependencies": { - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", + "@eslint/js": "^9.15.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@typescript-eslint/eslint-plugin": "^8.16.0", + "@typescript-eslint/parser": "^8.16.0", "@vitejs/plugin-react": "^4.0.3", - "eslint": "^8.45.0", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", + "eslint": "^8.57.1", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "^0.4.3", + "globals": "^15.12.0", + "typescript": "^5.7.2", "vite": "^4.4.5" } }, @@ -335,6 +340,16 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.23.3", "dev": true, @@ -386,7 +401,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.3", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -408,7 +425,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -422,20 +441,25 @@ } }, "node_modules/@eslint/js": { - "version": "8.53.0", + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", + "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -455,7 +479,10 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, "license": "BSD-3-Clause" }, @@ -603,27 +630,275 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.2.37", + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", "devOptional": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.2.15", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", "dev": true, "license": "MIT", "dependencies": { "@types/react": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.6", - "devOptional": true, - "license": "MIT" + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz", + "integrity": "sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.16.0", + "@typescript-eslint/type-utils": "8.16.0", + "@typescript-eslint/utils": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.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.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.16.0.tgz", + "integrity": "sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.16.0", + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/typescript-estree": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0", + "debug": "^4.3.4" + }, + "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" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz", + "integrity": "sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.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/type-utils": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz", + "integrity": "sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.16.0", + "@typescript-eslint/utils": "8.16.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.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" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.16.0.tgz", + "integrity": "sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==", + "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.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz", + "integrity": "sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.16.0.tgz", + "integrity": "sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.16.0", + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/typescript-estree": "8.16.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" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz", + "integrity": "sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.16.0", + "eslint-visitor-keys": "^4.2.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": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "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/@ungap/structured-clone": { "version": "1.2.0", @@ -649,7 +924,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "license": "MIT", "bin": { @@ -661,6 +938,8 @@ }, "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": { @@ -669,6 +948,8 @@ }, "node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -703,30 +984,40 @@ }, "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/array-buffer-byte-length": { - "version": "1.0.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-includes": { - "version": "3.1.7", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -736,6 +1027,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.2", "dev": true, @@ -771,28 +1083,36 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.2", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -802,18 +1122,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - } - }, "node_modules/available-typed-arrays": { - "version": "1.0.5", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -835,6 +1152,19 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browserslist": { "version": "4.22.1", "dev": true, @@ -867,13 +1197,20 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "license": "MIT", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -881,6 +1218,8 @@ }, "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": { @@ -962,6 +1301,60 @@ "devOptional": true, "license": "MIT" }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { "version": "4.3.4", "dev": true, @@ -984,16 +1377,21 @@ "license": "MIT" }, "node_modules/define-data-property": { - "version": "1.1.1", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -1029,49 +1427,58 @@ "license": "ISC" }, "node_modules/es-abstract": { - "version": "1.22.3", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -1080,35 +1487,79 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-iterator-helpers": { - "version": "1.0.15", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", + "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", "dev": true, "license": "MIT", "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -1191,15 +1642,18 @@ } }, "node_modules/eslint": { - "version": "8.53.0", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -1245,36 +1699,42 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.33.2", + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", "dev": true, "license": "MIT", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", + "es-iterator-helpers": "^1.1.0", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", + "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, "license": "MIT", "engines": { @@ -1329,6 +1789,16 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, @@ -1420,6 +1890,8 @@ }, "node_modules/espree": { "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1474,11 +1946,45 @@ }, "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-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "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" }, @@ -1506,6 +2012,19 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-up": { "version": "5.0.0", "dev": true, @@ -1541,6 +2060,8 @@ }, "node_modules/for-each": { "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "license": "MIT", "dependencies": { @@ -1606,26 +2127,35 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-symbol-description": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -1665,19 +2195,27 @@ } }, "node_modules/globals": { - "version": "11.12.0", + "version": "15.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", + "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { - "version": "1.0.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -1719,18 +2257,22 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "license": "MIT", "engines": { @@ -1752,11 +2294,13 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -1766,7 +2310,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1777,7 +2323,9 @@ } }, "node_modules/ignore": { - "version": "5.2.4", + "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": { @@ -1786,6 +2334,8 @@ }, "node_modules/import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "license": "MIT", "dependencies": { @@ -1822,11 +2372,13 @@ "license": "ISC" }, "node_modules/internal-slot": { - "version": "1.0.6", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -1835,13 +2387,17 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1849,6 +2405,8 @@ }, "node_modules/is-async-function": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, "license": "MIT", "dependencies": { @@ -1909,6 +2467,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "dev": true, @@ -1932,11 +2506,16 @@ } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", + "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1944,6 +2523,8 @@ }, "node_modules/is-generator-function": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, "license": "MIT", "dependencies": { @@ -1968,15 +2549,22 @@ } }, "node_modules/is-map": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-negative-zero": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", "engines": { @@ -1986,6 +2574,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-number-object": { "version": "1.0.7", "dev": true, @@ -2010,6 +2608,8 @@ }, "node_modules/is-regex": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "license": "MIT", "dependencies": { @@ -2024,19 +2624,29 @@ } }, "node_modules/is-set": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2071,11 +2681,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -2085,9 +2697,14 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.1", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2104,12 +2721,17 @@ } }, "node_modules/is-weakset": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2117,6 +2739,8 @@ }, "node_modules/isarray": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, @@ -2126,7 +2750,9 @@ "license": "ISC" }, "node_modules/iterator.prototype": { - "version": "1.1.2", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2135,6 +2761,9 @@ "has-symbols": "^1.0.3", "reflect.getprototypeof": "^1.0.4", "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/js-tokens": { @@ -2143,6 +2772,8 @@ }, "node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { @@ -2170,6 +2801,8 @@ }, "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" }, @@ -2260,6 +2893,30 @@ "yallist": "^3.0.2" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "dev": true, @@ -2312,9 +2969,14 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2328,12 +2990,14 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -2345,26 +3009,31 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.7", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -2373,26 +3042,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.hasown": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.values": { - "version": "1.1.7", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -2455,6 +3114,8 @@ }, "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": { @@ -2498,6 +3159,29 @@ "dev": true, "license": "ISC" }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.31", "dev": true, @@ -2545,6 +3229,8 @@ }, "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": { @@ -2633,16 +3319,19 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.4", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz", + "integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "which-builtin-type": "^1.1.4" }, "engines": { "node": ">= 0.4" @@ -2652,13 +3341,16 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -2685,6 +3377,8 @@ }, "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": { @@ -2754,12 +3448,14 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -2771,14 +3467,19 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.0", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2799,27 +3500,34 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.1", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2845,13 +3553,19 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2866,32 +3580,54 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { - "version": "1.2.8", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -2901,26 +3637,33 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2939,6 +3682,8 @@ }, "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": { @@ -2983,6 +3728,32 @@ "node": ">=4" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.2.tgz", + "integrity": "sha512-ZF5gQIQa/UmzfvxbHZI3JXN0/Jt+vnAfAviNRAMc491laiK6YCLpCW9ft8oaCRFOTxCZtUTE6XB0ZQAe3olntw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/type-check": { "version": "0.4.0", "dev": true, @@ -3006,27 +3777,32 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -3036,15 +3812,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", + "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", "dev": true, "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -3054,18 +3834,40 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "dev": true, @@ -3111,6 +3913,8 @@ }, "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": { @@ -3203,22 +4007,25 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.3", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", + "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", "dev": true, "license": "MIT", "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "call-bind": "^1.0.7", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.1.4", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -3228,29 +4035,36 @@ } }, "node_modules/which-collection": { - "version": "1.0.1", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.13", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", + "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", "dev": true, "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" diff --git a/package.json b/package.json index c7ffac97..76f59854 100644 --- a/package.json +++ b/package.json @@ -17,13 +17,18 @@ "zustand": "^5.0.1" }, "devDependencies": { - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", + "@eslint/js": "^9.15.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@typescript-eslint/eslint-plugin": "^8.16.0", + "@typescript-eslint/parser": "^8.16.0", "@vitejs/plugin-react": "^4.0.3", - "eslint": "^8.45.0", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", + "eslint": "^8.57.1", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "^0.4.3", + "globals": "^15.12.0", + "typescript": "^5.7.2", "vite": "^4.4.5" } } diff --git a/src/App.jsx b/src/App.jsx deleted file mode 100644 index ce2751c7..00000000 --- a/src/App.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from "react"; -import { Header } from "./components/Header.jsx" -import { TodoForm } from "./components/TodoForm.jsx"; -import { TodoList } from "./components/TodoList.jsx"; - -export const App = () => { - return ( -
-
- - -
- ); -}; diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 00000000..d2543dc2 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,13 @@ +import { Header } from "./components/Header" +import { TodoForm } from "./components/TodoForm"; +import { TodoList } from "./components/TodoList"; + +export const App = () => { + return ( +
+
+ + +
+ ); +}; diff --git a/src/components/Animation.jsx b/src/components/Animation.tsx similarity index 93% rename from src/components/Animation.jsx rename to src/components/Animation.tsx index 9bce9300..bb2188ec 100644 --- a/src/components/Animation.jsx +++ b/src/components/Animation.tsx @@ -1,4 +1,3 @@ -import React from "react"; import { DotLottieReact } from "@lottiefiles/dotlottie-react"; import "../components/Animation.css"; diff --git a/src/components/Header.jsx b/src/components/Header.tsx similarity index 80% rename from src/components/Header.jsx rename to src/components/Header.tsx index 36ae17ff..fbf7debb 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.tsx @@ -1,5 +1,4 @@ -import React from "react"; -import { Animation } from "../components/Animation.jsx"; +import { Animation } from "./Animation"; import "../components/Header.css"; export const Header = () => { diff --git a/src/components/TodoForm.jsx b/src/components/TodoForm.tsx similarity index 97% rename from src/components/TodoForm.jsx rename to src/components/TodoForm.tsx index eca64030..ec754a30 100644 --- a/src/components/TodoForm.jsx +++ b/src/components/TodoForm.tsx @@ -1,6 +1,5 @@ //Component to create new tasks -import React from "react"; import { useState } from "react"; import { useTodoStore } from "../store/useTodoStore"; import "../components/TodoForm.css"; diff --git a/src/components/TodoItem.jsx b/src/components/TodoItem.tsx similarity index 98% rename from src/components/TodoItem.jsx rename to src/components/TodoItem.tsx index 9862969f..e202c7fe 100644 --- a/src/components/TodoItem.jsx +++ b/src/components/TodoItem.tsx @@ -1,6 +1,5 @@ //Component for single task -import React from "react"; import { useTodoStore } from "../store/useTodoStore"; import DeleteIcon from "../assets/DeleteIcon.svg"; import "../components/TodoItem.css"; diff --git a/src/components/TodoList.jsx b/src/components/TodoList.tsx similarity index 95% rename from src/components/TodoList.jsx rename to src/components/TodoList.tsx index 312cb9fb..7e0d78d6 100644 --- a/src/components/TodoList.jsx +++ b/src/components/TodoList.tsx @@ -1,8 +1,7 @@ //List that shows all of the created tasks -import React from "react"; import { useTodoStore } from "../store/useTodoStore"; -import { TodoItem } from "../components/TodoItem"; +import { TodoItem } from "./TodoItem"; import thumbIcon from "../assets/thumbIcon.png"; import waitIcon from "../assets/waitIcon.png"; import "../components/TodoList.css"; diff --git a/src/store/useTodoStore.jsx b/src/store/useTodoStore.tsx similarity index 100% rename from src/store/useTodoStore.jsx rename to src/store/useTodoStore.tsx diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..a937daa6 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,53 @@ +{ + "compilerOptions": { + /* Basic Setup */ + "target": "es5", /* Make sure the target is compatible with older browsers. */ + "module": "esnext", /* ESModules. */ + "moduleResolution": "node", /* Use Node.js resolution strategy. */ + "jsx": "react-jsx", /* Use React 17 JSX transform. */ + "esModuleInterop": true, /* To support importing commonjs modules. */ + "forceConsistentCasingInFileNames": true, /* Ensure that file imports are case-sensitive. */ + + /* Strict Mode */ + "strict": true, /* Enable all strict type-checking options. */ + "skipLibCheck": true, /* Skip type checking for library files. */ + + /* Additional Options for React Projects */ + "noImplicitAny": true, /* Disallow 'any' type, which can help prevent runtime errors. */ + "resolveJsonModule": true, /* Enable importing JSON files as modules. */ + + /* Paths & Base URL */ + "baseUrl": ".", /* Base directory for non-relative imports. */ + "paths": { + "*": ["node_modules/*", "src/types/*"] /* Allow custom types. */ + }, + + /* Source Maps */ + "sourceMap": true, /* Enable source maps to debug TypeScript easily. */ + + /* Type Checking */ + "noUnusedLocals": true, /* Report unused variables. */ + "noUnusedParameters": true, /* Report unused function parameters. */ + "noImplicitReturns": true, /* Enforce explicit return types in functions. */ + + /* React & JSX Handling */ + "skipLibCheck": true, /* Skip checking libraries. */ + "resolveJsonModule": true, /* Allow importing JSON files. */ + + /* Emitting settings */ + "outDir": "./dist", /* Output the compiled files into the 'dist' folder. */ + "removeComments": true, /* Remove comments from the output files. */ + + /* Linting */ + "noEmitOnError": true /* Prevent emitting output when there are type errors. */ + }, + + /* Include source files and exclude unnecessary files */ + "include": [ + "src/**/*" + ], + "exclude": [ + "node_modules", + "build" + ] +} From e99386049e8903221d70a3735edc20338915f6d0 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Thu, 28 Nov 2024 17:24:00 +0100 Subject: [PATCH 24/29] Added typescript to components, created assets tsx file for svg and png --- src/App.tsx | 8 ++++---- src/assets.d.tsx | 9 +++++++++ src/components/Animation.tsx | 4 ++-- src/components/Header.tsx | 2 +- src/components/TodoForm.tsx | 8 ++++---- src/components/TodoItem.tsx | 8 +++++++- src/components/TodoList.tsx | 26 +++++++++++++------------- src/main.jsx | 2 +- src/store/useTodoStore.tsx | 21 +++++++++++++++++++-- tsconfig.json | 5 +++-- 10 files changed, 63 insertions(+), 30 deletions(-) create mode 100644 src/assets.d.tsx diff --git a/src/App.tsx b/src/App.tsx index d2543dc2..a3ac64e6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,12 +2,12 @@ import { Header } from "./components/Header" import { TodoForm } from "./components/TodoForm"; import { TodoList } from "./components/TodoList"; -export const App = () => { +export const App: React.FC = () => { return (
-
- - +
+ +
); }; diff --git a/src/assets.d.tsx b/src/assets.d.tsx new file mode 100644 index 00000000..05642bf7 --- /dev/null +++ b/src/assets.d.tsx @@ -0,0 +1,9 @@ +declare module "*.svg" { + const content: string; + export default content; +} + +declare module "*.png" { + const content: string; + export default content; +} diff --git a/src/components/Animation.tsx b/src/components/Animation.tsx index bb2188ec..dddc0fd9 100644 --- a/src/components/Animation.tsx +++ b/src/components/Animation.tsx @@ -1,7 +1,7 @@ import { DotLottieReact } from "@lottiefiles/dotlottie-react"; import "../components/Animation.css"; -export const Animation = () => { +export const Animation: React.FC = () => { return (
{ loop autoplay className="lottie-animation" - renderer="svg" + // renderer="svg" />
); diff --git a/src/components/Header.tsx b/src/components/Header.tsx index fbf7debb..a2d31413 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -1,7 +1,7 @@ import { Animation } from "./Animation"; import "../components/Header.css"; -export const Header = () => { +export const Header: React.FC = () => { return (
diff --git a/src/components/TodoForm.tsx b/src/components/TodoForm.tsx index ec754a30..2b72a4c0 100644 --- a/src/components/TodoForm.tsx +++ b/src/components/TodoForm.tsx @@ -1,20 +1,20 @@ //Component to create new tasks -import { useState } from "react"; +import { useState, ChangeEvent, FormEvent } from "react"; import { useTodoStore } from "../store/useTodoStore"; import "../components/TodoForm.css"; export const TodoForm = () => { - const [input, setInput] = useState(""); //Local state for the input + const [input, setInput] = useState(""); //Local state for the input const addTodo = useTodoStore((state) => state.addTodo); //Access Zustand function //Handle input submission - const handleInputChange = (e) => { + const handleInputChange = (e: ChangeEvent) => { setInput(e.target.value); }; //Handle form submission - const handleSubmit = (e) => { + const handleSubmit = (e: FormEvent) => { e.preventDefault(); if (input.trim() === "") return; //No empty to-do's addTodo(input); //Add the new to-do to the store diff --git a/src/components/TodoItem.tsx b/src/components/TodoItem.tsx index e202c7fe..ef4e1321 100644 --- a/src/components/TodoItem.tsx +++ b/src/components/TodoItem.tsx @@ -4,7 +4,11 @@ import { useTodoStore } from "../store/useTodoStore"; import DeleteIcon from "../assets/DeleteIcon.svg"; import "../components/TodoItem.css"; -export const TodoItem =({ id }) => { +interface TodoItemProps { + id: number; +} + +export const TodoItem =({ id }: TodoItemProps) => { const todo = useTodoStore((state) => state.todos.find((todo) => todo.id === id)); //Find the specific to-do const toggleTodo = useTodoStore((state) => state.toggleTodo); //Access toggle function from Zustand const deleteTodo = useTodoStore ((state) => state.deleteTodo); //Access delete function @@ -19,6 +23,8 @@ export const TodoItem =({ id }) => { deleteTodo(id); //Remove the task from list }; + if (!todo) return null; + return (
{ return ( -
- {/* Incomplete Tasks */} -
-

- Incomplete Tasks - ({incompleteTodos.length}) - Hourglass in light blue and orange -

- {incompleteTodos.length === 0 ? ( -

You're a star!

+
+ {/* Incomplete Tasks */} +
+

+ Incomplete Tasks + ({incompleteTodos.length}) + Hourglass in light blue and orange +

+ {incompleteTodos.length === 0 ? ( +

You're a star!

) : ( - incompleteTodos.map((todo) => ) + incompleteTodos.map((todo) => ) )} -
+
{/* Completed Tasks */} @@ -44,6 +44,6 @@ export const TodoList = () => { completedTodos.map((todo) => ) )}
-
+
); }; diff --git a/src/main.jsx b/src/main.jsx index 51294f39..7f8540e2 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -1,6 +1,6 @@ import React from "react"; import ReactDOM from "react-dom/client"; -import { App } from "./App.jsx"; +import { App } from "./App.tsx"; import "./index.css"; ReactDOM.createRoot(document.getElementById("root")).render( diff --git a/src/store/useTodoStore.tsx b/src/store/useTodoStore.tsx index e14fa169..a25da4de 100644 --- a/src/store/useTodoStore.tsx +++ b/src/store/useTodoStore.tsx @@ -1,7 +1,24 @@ // Create state management with Zustand import { create } from "zustand"; -export const useTodoStore = create((set, get) => ({ +//Define type for a single to-do item +interface Todo { + id: number; + text: string; + completed: boolean; +} + +//Define the state and actions types for the store +interface TodoStore { + todos: Todo[]; + addTodo: (text: string) => void; + toggleTodo: (id: number) => void; + deleteTodo: (id: number) => void; + getIncompleteCount: () => number; + getCompletedCount: () => number; +} + +export const useTodoStore = create((set, get) => ({ todos: [], // Add a new todo @@ -31,4 +48,4 @@ export const useTodoStore = create((set, get) => ({ // Get count of completed todos getCompletedCount: () => get().todos.filter((todo) => todo.completed).length, -})); \ No newline at end of file +})); diff --git a/tsconfig.json b/tsconfig.json index a937daa6..843eac0f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { /* Basic Setup */ - "target": "es5", /* Make sure the target is compatible with older browsers. */ + "target": "ES2015", /* Make sure the target is compatible with older browsers. */ "module": "esnext", /* ESModules. */ "moduleResolution": "node", /* Use Node.js resolution strategy. */ "jsx": "react-jsx", /* Use React 17 JSX transform. */ @@ -44,7 +44,8 @@ /* Include source files and exclude unnecessary files */ "include": [ - "src/**/*" + "src/**/*", + "src/assets.d.tsx" ], "exclude": [ "node_modules", From dddaed92eec677eb26fb4989a6e91e9a41f7a223 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Thu, 28 Nov 2024 17:28:21 +0100 Subject: [PATCH 25/29] Fixed indentation --- src/components/Header.tsx | 10 +++++----- src/components/TodoForm.tsx | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/Header.tsx b/src/components/Header.tsx index a2d31413..206cbfa4 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -6,11 +6,11 @@ export const Header: React.FC = () => {

To-Do List

-

Work smarter, Not harder

-
- -
-
+

Work smarter, Not harder

+
+ +
+
); }; diff --git a/src/components/TodoForm.tsx b/src/components/TodoForm.tsx index 2b72a4c0..ae4959a6 100644 --- a/src/components/TodoForm.tsx +++ b/src/components/TodoForm.tsx @@ -35,7 +35,7 @@ export const TodoForm = () => { placeholder="Write something here" className="textfield" /> -
+
From 8cebe37784811b34913477a636dba942b7cddc6c Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Thu, 28 Nov 2024 17:45:49 +0100 Subject: [PATCH 26/29] Cleaned code and fixed a button in media queries --- src/assets.d.tsx | 1 + src/components/TodoForm.css | 4 ++-- tsconfig.json | 42 +++++++++++++++++-------------------- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/assets.d.tsx b/src/assets.d.tsx index 05642bf7..33992238 100644 --- a/src/assets.d.tsx +++ b/src/assets.d.tsx @@ -1,3 +1,4 @@ +//File to help typescript find files in assets folder declare module "*.svg" { const content: string; export default content; diff --git a/src/components/TodoForm.css b/src/components/TodoForm.css index 93b8b3ca..a911fde5 100644 --- a/src/components/TodoForm.css +++ b/src/components/TodoForm.css @@ -84,8 +84,8 @@ } .add-task-button { - width: 90px; - font-size: 12px; + width: 100px; + font-size: 10px; } } diff --git a/tsconfig.json b/tsconfig.json index 843eac0f..ecea6911 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,45 +1,41 @@ { "compilerOptions": { /* Basic Setup */ - "target": "ES2015", /* Make sure the target is compatible with older browsers. */ - "module": "esnext", /* ESModules. */ - "moduleResolution": "node", /* Use Node.js resolution strategy. */ - "jsx": "react-jsx", /* Use React 17 JSX transform. */ - "esModuleInterop": true, /* To support importing commonjs modules. */ - "forceConsistentCasingInFileNames": true, /* Ensure that file imports are case-sensitive. */ + "target": "ES2015", + "module": "esnext", + "moduleResolution": "node", + "jsx": "react-jsx", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, /* Strict Mode */ - "strict": true, /* Enable all strict type-checking options. */ - "skipLibCheck": true, /* Skip type checking for library files. */ + "strict": true, + "skipLibCheck": true, /* Additional Options for React Projects */ - "noImplicitAny": true, /* Disallow 'any' type, which can help prevent runtime errors. */ - "resolveJsonModule": true, /* Enable importing JSON files as modules. */ + "noImplicitAny": true, + "resolveJsonModule": true, /* Paths & Base URL */ - "baseUrl": ".", /* Base directory for non-relative imports. */ + "baseUrl": ".", "paths": { - "*": ["node_modules/*", "src/types/*"] /* Allow custom types. */ + "*": ["node_modules/*", "src/types/*"] }, /* Source Maps */ - "sourceMap": true, /* Enable source maps to debug TypeScript easily. */ + "sourceMap": true, /* Type Checking */ - "noUnusedLocals": true, /* Report unused variables. */ - "noUnusedParameters": true, /* Report unused function parameters. */ - "noImplicitReturns": true, /* Enforce explicit return types in functions. */ - - /* React & JSX Handling */ - "skipLibCheck": true, /* Skip checking libraries. */ - "resolveJsonModule": true, /* Allow importing JSON files. */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, /* Emitting settings */ - "outDir": "./dist", /* Output the compiled files into the 'dist' folder. */ - "removeComments": true, /* Remove comments from the output files. */ + "outDir": "./dist", + "removeComments": true, /* Linting */ - "noEmitOnError": true /* Prevent emitting output when there are type errors. */ + "noEmitOnError": true }, /* Include source files and exclude unnecessary files */ From 2d581c8c15ddcfd11669d9e9c8435d27bc507116 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Thu, 28 Nov 2024 17:53:11 +0100 Subject: [PATCH 27/29] Changed main.jsx to tsx and updated index.html file --- index.html | 2 +- src/{main.jsx => main.tsx} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/{main.jsx => main.tsx} (61%) diff --git a/index.html b/index.html index e6566861..1bf7493e 100644 --- a/index.html +++ b/index.html @@ -16,7 +16,7 @@
- + diff --git a/src/main.jsx b/src/main.tsx similarity index 61% rename from src/main.jsx rename to src/main.tsx index 7f8540e2..fd7970f7 100644 --- a/src/main.jsx +++ b/src/main.tsx @@ -1,9 +1,9 @@ import React from "react"; import ReactDOM from "react-dom/client"; -import { App } from "./App.tsx"; +import { App } from "./App"; import "./index.css"; -ReactDOM.createRoot(document.getElementById("root")).render( +ReactDOM.createRoot(document.getElementById("root")!).render( From 23e1508a01fde8f56179fcf8597912ebe763f0aa Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 29 Nov 2024 12:15:00 +0100 Subject: [PATCH 28/29] Cleaned code --- src/components/Animation.tsx | 13 ++++++------- src/components/TodoForm.tsx | 6 ++++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/components/Animation.tsx b/src/components/Animation.tsx index dddc0fd9..e1ab8c80 100644 --- a/src/components/Animation.tsx +++ b/src/components/Animation.tsx @@ -4,13 +4,12 @@ import "../components/Animation.css"; export const Animation: React.FC = () => { return (
- +
); }; diff --git a/src/components/TodoForm.tsx b/src/components/TodoForm.tsx index ae4959a6..a8c686ac 100644 --- a/src/components/TodoForm.tsx +++ b/src/components/TodoForm.tsx @@ -33,8 +33,10 @@ export const TodoForm = () => { value={input} onChange={handleInputChange} placeholder="Write something here" className="textfield" - /> - + /> + From 960f3f61c4360edb3a0903ecb88081390c946d65 Mon Sep 17 00:00:00 2001 From: Elina Eriksson Hult Date: Fri, 29 Nov 2024 15:13:53 +0100 Subject: [PATCH 29/29] test --- pull_request_template.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pull_request_template.md b/pull_request_template.md index 39a2aa32..48d61d51 100644 --- a/pull_request_template.md +++ b/pull_request_template.md @@ -1,6 +1,2 @@ ## Netlify link -Add your Netlify link here. -PS. Don't forget to add it in your readme as well. - -## Collaborators -Add any collaborators here. +https://elinatodoapp3.netlify.app/