From c26bdfb39e0a26a423d92ea95acdbc4195702ae4 Mon Sep 17 00:00:00 2001 From: Sofie Date: Thu, 1 May 2025 13:44:04 +0200 Subject: [PATCH 01/72] added comp and sections --- index.html | 39 +++++++++++++++++++----------- package.json | 7 +++--- src/Sections/Components/Form.jsx | 0 src/Sections/Components/Submit.jsx | 0 src/Sections/Post.jsx | 0 src/Sections/View.jsx | 0 6 files changed, 29 insertions(+), 17 deletions(-) create mode 100644 src/Sections/Components/Form.jsx create mode 100644 src/Sections/Components/Submit.jsx create mode 100644 src/Sections/Post.jsx create mode 100644 src/Sections/View.jsx diff --git a/index.html b/index.html index d4492e947..6b8a24e3a 100644 --- a/index.html +++ b/index.html @@ -1,16 +1,27 @@ - - - - - Happy Thoughts - - -
- - - + + + + + + Happy Thoughts + + + +
+ + + + \ No newline at end of file diff --git a/package.json b/package.json index 2f66d2959..ed91e62db 100644 --- a/package.json +++ b/package.json @@ -4,14 +4,15 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", + "dev": "vite --host", "build": "vite build", "lint": "eslint .", "preview": "vite preview" }, "dependencies": { "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "styled-components": "^6.1.17" }, "devDependencies": { "@eslint/js": "^9.21.0", @@ -24,4 +25,4 @@ "globals": "^15.15.0", "vite": "^6.2.0" } -} +} \ No newline at end of file diff --git a/src/Sections/Components/Form.jsx b/src/Sections/Components/Form.jsx new file mode 100644 index 000000000..e69de29bb diff --git a/src/Sections/Components/Submit.jsx b/src/Sections/Components/Submit.jsx new file mode 100644 index 000000000..e69de29bb diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx new file mode 100644 index 000000000..e69de29bb diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx new file mode 100644 index 000000000..e69de29bb From f5b96b096821c5b59e5f6c7198aad9d7915e4c98 Mon Sep 17 00:00:00 2001 From: Sofie Date: Thu, 1 May 2025 13:50:05 +0200 Subject: [PATCH 02/72] add form --- src/App.jsx | 2 +- src/Sections/Components/Form.jsx | 19 +++++++++++++++++++ src/Sections/Post.jsx | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/App.jsx b/src/App.jsx index 07f2cbdfe..86d0e3ed8 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -2,4 +2,4 @@ export const App = () => { return (

Happy Thoughts

) -} +} \ No newline at end of file diff --git a/src/Sections/Components/Form.jsx b/src/Sections/Components/Form.jsx index e69de29bb..7fb26a711 100644 --- a/src/Sections/Components/Form.jsx +++ b/src/Sections/Components/Form.jsx @@ -0,0 +1,19 @@ +import styled from "styled-components"; + +export const Form = () => { + + const FormContainer = styled.div` + ` + return ( + +

Share your happy thought!

+
+ + +
+
+ ); +} diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index e69de29bb..e25d346c0 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -0,0 +1,2 @@ +import styled from "styled-components"; + From aba6941b1006bc2c1bab6f6a505fa8820732c5a2 Mon Sep 17 00:00:00 2001 From: Sofie Date: Thu, 1 May 2025 13:54:36 +0200 Subject: [PATCH 03/72] publish form --- src/App.jsx | 8 +++++++- src/Sections/Post.jsx | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/App.jsx b/src/App.jsx index 86d0e3ed8..2e1d68239 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,5 +1,11 @@ +import React from 'react'; +import { Post } from './Sections/Post'; + export const App = () => { return ( -

Happy Thoughts

+ <> +

Happy Thoughts

+ + ) } \ No newline at end of file diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index e25d346c0..705b0f666 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -1,2 +1,14 @@ import styled from "styled-components"; +import { Form } from "./Components/Form"; +const PostContainer = styled.div` +` + +export const Post = () => { + return ( + + +
+ + ); +} From 105c6ef8b84ec73df5868eb9853bdf2d728a10ef Mon Sep 17 00:00:00 2001 From: Sofie Date: Thu, 1 May 2025 14:34:14 +0200 Subject: [PATCH 04/72] edit Post section --- src/Sections/Components/Form.jsx | 36 ++++++++++++++++++++---------- src/Sections/Components/Submit.jsx | 32 ++++++++++++++++++++++++++ src/Sections/Post.jsx | 20 ++++++++++++++++- 3 files changed, 75 insertions(+), 13 deletions(-) diff --git a/src/Sections/Components/Form.jsx b/src/Sections/Components/Form.jsx index 7fb26a711..ffae9bb44 100644 --- a/src/Sections/Components/Form.jsx +++ b/src/Sections/Components/Form.jsx @@ -1,19 +1,31 @@ import styled from "styled-components"; +import { SubmitButton } from "./Submit"; export const Form = () => { - const FormContainer = styled.div` - ` + const TextArea = styled.textarea` + width: 90%; + height: 60px; + border: 2px solid #7a7b7b; + padding: 10px; + font-size: 16px; + + &:focus { + outline: none; + color: #000; + border-color: #7a7b7b; + box-shadow: 0 0 5px #7a7b7b; + } + `; + return ( - -

Share your happy thought!

- - - - -
+
+ + Send Happy Thought + +
); } diff --git a/src/Sections/Components/Submit.jsx b/src/Sections/Components/Submit.jsx index e69de29bb..009798cd4 100644 --- a/src/Sections/Components/Submit.jsx +++ b/src/Sections/Components/Submit.jsx @@ -0,0 +1,32 @@ +import styled from "styled-components"; + +export const SubmitButton = () => { + const SubmitButtonContainer = styled.div` + display: flex; + justify-content: left; + margin: 10px; + `; + const Button = styled.button` + background-color: #fdafaf; + color: #000; + font-weight: 600; + border: none; + padding: 10px 20px; + border-radius: 50px; + cursor: pointer; + font-size: 14px; + font-family: Roboto, sans-serif; + letter-spacing: 0.2px; + + &:hover { + + transform: scale(1.1); + } + `; + + return ( + + + + ); +} \ No newline at end of file diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index 705b0f666..938488e86 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -2,12 +2,30 @@ import styled from "styled-components"; import { Form } from "./Components/Form"; const PostContainer = styled.div` + display: flex; + flex-direction: column; + padding: 20px; + margin: 20px; + background-color: #f2f0f0; + outline: 2px solid #000; + box-shadow: 8px 8px 0px #000; + height: 200px; +` + +const Title = styled.h2` + font-size: 16px; + color: #000; + text-align: left; + margin-bottom: 20px; + font-weight: 500; + font-family: Roboto, sans-serif; + letter-spacing: 0.2px; ` export const Post = () => { return ( - + What's making you happy right now?
); From 5fcdef672e57fbf060c741a786ea501bcc8cdd17 Mon Sep 17 00:00:00 2001 From: oskarnordin Date: Thu, 1 May 2025 14:35:24 +0200 Subject: [PATCH 05/72] Added textbox and likebutton styling to view-comp --- src/App.jsx | 10 ++++--- src/Sections/Components/Form.jsx | 6 ++-- src/Sections/View.jsx | 48 ++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 2e1d68239..afdadc8e2 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,11 +1,13 @@ -import React from 'react'; -import { Post } from './Sections/Post'; +import React from "react"; +import { Post } from "./Sections/Post"; +import { View } from "./Sections/View"; export const App = () => { return ( <>

Happy Thoughts

+ - ) -} \ No newline at end of file + ); +}; diff --git a/src/Sections/Components/Form.jsx b/src/Sections/Components/Form.jsx index 7fb26a711..315341a2e 100644 --- a/src/Sections/Components/Form.jsx +++ b/src/Sections/Components/Form.jsx @@ -1,9 +1,7 @@ import styled from "styled-components"; export const Form = () => { - - const FormContainer = styled.div` - ` + const FormContainer = styled.div``; return (

Share your happy thought!

@@ -16,4 +14,4 @@ export const Form = () => {
); -} +}; diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index e69de29bb..63d1dc70d 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -0,0 +1,48 @@ +import styled from "styled-components"; + +const ViewContainer = styled.div` + position: relative; /* Needed for absolute positioning of LikeButton */ + background-color: white; + width: 600px; + height: 200px; + border: 1px solid; + padding: 20px; + box-shadow: 6px 6px 0px 0px black; +`; + +const TextField = styled.div` + background-color: white; + font-family: monospace; + font-weight: 500; + font-size: 18px; + width: 100%; + height: 25%; + align-self: top; +`; + +const LikeButton = styled.button` + position: absolute; /* Absolute to position it inside ViewContainer */ + font-size: 28px; + bottom: 10px; + left: 10px; + background-color: #ebebeb; + width: 55px; + height: 55px; + border: none; + border-radius: 50%; +`; + +const LikeCount = styled.div``; + +export const View = () => { + return ( + + + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Recusandae + consequuntur deleniti dolor sed dolorum! Suscipit iusto beatae voluptate + fugiat illum. + + ❤️ + + ); +}; From a08a8980cbef9fa04058623cc669d75a9b60309d Mon Sep 17 00:00:00 2001 From: Sofie Date: Thu, 1 May 2025 14:39:29 +0200 Subject: [PATCH 06/72] Post --- src/App.jsx | 10 ++++--- src/Sections/Components/Form.jsx | 6 +++- src/Sections/View.jsx | 48 ++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 5 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 2e1d68239..afdadc8e2 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,11 +1,13 @@ -import React from 'react'; -import { Post } from './Sections/Post'; +import React from "react"; +import { Post } from "./Sections/Post"; +import { View } from "./Sections/View"; export const App = () => { return ( <>

Happy Thoughts

+ - ) -} \ No newline at end of file + ); +}; diff --git a/src/Sections/Components/Form.jsx b/src/Sections/Components/Form.jsx index ffae9bb44..a6e44cf0b 100644 --- a/src/Sections/Components/Form.jsx +++ b/src/Sections/Components/Form.jsx @@ -2,6 +2,7 @@ import styled from "styled-components"; import { SubmitButton } from "./Submit"; export const Form = () => { +<<<<<<< HEAD const TextArea = styled.textarea` width: 90%; @@ -18,6 +19,9 @@ export const Form = () => { } `; +======= + const FormContainer = styled.div``; +>>>>>>> 5fcdef672e57fbf060c741a786ea501bcc8cdd17 return (
Send Happy Thought -
); }; diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index 7f6e99180..450771d93 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -3,11 +3,11 @@ import styled from "styled-components"; const ViewContainer = styled.div` display: flex; flex-direction: column; - justify-content: space-between; - align-items: flex-start; + justify-content: space-between; + align-items: flex-start; background-color: white; width: 80vw; - box-sizing: border-box; + box-sizing: border-box; outline: 2px solid #000; padding: 20px; box-shadow: 6px 6px 0px 0px black; @@ -29,7 +29,7 @@ const LikeButton = styled.button` border: none; margin-top: 10px; border-radius: 50%; - align-self: flex-start; + align-self: flex-start; cursor: pointer; transition: background-color 0.3s ease; &:hover { @@ -37,15 +37,11 @@ const LikeButton = styled.button` } `; -const LikeCount = styled.div``; - -export const View = () => { +export const View = ({ happyThought }) => { return ( - Lorem ipsum dolor sit amet consectetur, adipisicing elit. Recusandae - consequuntur deleniti dolor sed dolorum! Suscipit iusto beatae voluptate - fugiat illum. + {happyThought || "Your happy thought will appear here..."} ❤️ From 63d593571fb83db5ab9fc8a5093e18c35a5c5c20 Mon Sep 17 00:00:00 2001 From: Sofie Date: Thu, 1 May 2025 16:56:53 +0200 Subject: [PATCH 12/72] submit button --- src/App.jsx | 38 ++++++++++++------- src/Sections/Components/Form.jsx | 60 ++++++++++++++++++++---------- src/Sections/Components/Submit.jsx | 32 ---------------- src/Sections/Container.jsx | 32 ---------------- src/Sections/Post.jsx | 6 +-- src/Sections/View.jsx | 6 +-- 6 files changed, 70 insertions(+), 104 deletions(-) delete mode 100644 src/Sections/Components/Submit.jsx delete mode 100644 src/Sections/Container.jsx diff --git a/src/App.jsx b/src/App.jsx index ff8f68205..ed5cb8961 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,20 +1,32 @@ -import React, { useState } from "react"; -import { Form } from "./Sections/Components/Form"; +import React from "react"; +import { Post } from "./Sections/Post"; import { View } from "./Sections/View"; -import { AppContainer } from "./Sections/Container"; +import styled from "styled-components"; -export const App = () => { - const [happyThought, setHappyThought] = useState(""); // State to store the submitted text +const Container = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 20px; + gap: 30px; +`; - const handleFormSubmit = (text) => { - setHappyThought(text); // Update the state with the submitted text - }; +const Heading = styled.h1` + font-size: 24px; + color: #000; + text-align: center; + font-weight: 500; + font-family: Monospace, monospace; + letter-spacing: 0.2px; +`; +export const App = () => { return ( -
-
- - -
+ + Happy Thoughts ❤️ + + + ); }; diff --git a/src/Sections/Components/Form.jsx b/src/Sections/Components/Form.jsx index 30327d099..5c91303d0 100644 --- a/src/Sections/Components/Form.jsx +++ b/src/Sections/Components/Form.jsx @@ -1,11 +1,8 @@ import React, { useState } from "react"; import styled from "styled-components"; -import { SubmitButton } from "./Submit"; -export const Form = ({ onSubmit }) => { - const [text, setText] = useState(""); // Local state to manage the textarea input - - const TextArea = styled.textarea` +export const Form = () => { + const InputArea = styled.input` width: 90%; border: 2px solid #7a7b7b; padding: 10px; @@ -19,23 +16,46 @@ export const Form = ({ onSubmit }) => { } `; - const handleSubmit = (e) => { - e.preventDefault(); - if (text.trim()) { - onSubmit(text); // Pass the text to the parent component - setText(""); // Clear the textarea + const SubmitButtonContainer = styled.div` + display: flex; + justify-content: left; + margin: 10px; + `; + + const Button = styled.button` + background-color: #fdafaf; + color: #000; + font-weight: 600; + border: none; + padding: 10px 20px; + border-radius: 50px; + cursor: pointer; + font-size: 14px; + font-family: Roboto, sans-serif; + letter-spacing: 0.2px; + + &:hover { + transform: scale(1.1); } - }; + `; + + const TextInput = () => { + const [inputValue, setInputValue] = useState(""); + const handleInputChange = (event) => { + setInputValue(event.target.value); + }; + } return ( - - - Send Happy Thought + + + + + + ); -}; +}; \ No newline at end of file diff --git a/src/Sections/Components/Submit.jsx b/src/Sections/Components/Submit.jsx deleted file mode 100644 index 009798cd4..000000000 --- a/src/Sections/Components/Submit.jsx +++ /dev/null @@ -1,32 +0,0 @@ -import styled from "styled-components"; - -export const SubmitButton = () => { - const SubmitButtonContainer = styled.div` - display: flex; - justify-content: left; - margin: 10px; - `; - const Button = styled.button` - background-color: #fdafaf; - color: #000; - font-weight: 600; - border: none; - padding: 10px 20px; - border-radius: 50px; - cursor: pointer; - font-size: 14px; - font-family: Roboto, sans-serif; - letter-spacing: 0.2px; - - &:hover { - - transform: scale(1.1); - } - `; - - return ( - - - - ); -} \ No newline at end of file diff --git a/src/Sections/Container.jsx b/src/Sections/Container.jsx deleted file mode 100644 index f48edc1e8..000000000 --- a/src/Sections/Container.jsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Post } from "./Post"; -import { View } from "./View"; -import styled from "styled-components"; - -const Container = styled.div` - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 20px; - gap: 30px; - -`; - -const Heading = styled.h1` - font-size: 24px; - color: #000; - text-align: center; - font-weight: 500; - font-family: Monospace, monospace; - letter-spacing: 0.2px; -`; - -export const AppContainer = () => { - return ( - - Happy Thoughts ❤️ - - - - ); -} \ No newline at end of file diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index e5ee20e69..ac3734e18 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -14,7 +14,7 @@ const PostContainer = styled.div` width: 80vw; box-sizing: border-box; -` +`; const Title = styled.h2` font-size: 16px; @@ -22,7 +22,7 @@ const Title = styled.h2` font-weight: 500; font-family: Roboto, sans-serif; letter-spacing: 0.2px; -` +`; export const Post = () => { return ( @@ -31,4 +31,4 @@ export const Post = () => {
); -} +}; diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index 450771d93..70db5c823 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -37,12 +37,10 @@ const LikeButton = styled.button` } `; -export const View = ({ happyThought }) => { +export const View = () => { return ( - - {happyThought || "Your happy thought will appear here..."} - + Your happy thought will appear here... ❤️ ); From aa27821d92a9529493e1e49bf5c7e038b933e197 Mon Sep 17 00:00:00 2001 From: Sofie Date: Fri, 2 May 2025 08:18:15 +0200 Subject: [PATCH 13/72] removed components to make the posting more clear --- src/App.jsx | 12 ++++-- src/Sections/Components/Form.jsx | 61 --------------------------- src/Sections/Post.jsx | 72 ++++++++++++++++++++++++++++---- src/Sections/View.jsx | 4 +- 4 files changed, 76 insertions(+), 73 deletions(-) delete mode 100644 src/Sections/Components/Form.jsx diff --git a/src/App.jsx b/src/App.jsx index ed5cb8961..dd2d117b4 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useState } from "react"; import { Post } from "./Sections/Post"; import { View } from "./Sections/View"; import styled from "styled-components"; @@ -22,11 +22,17 @@ const Heading = styled.h1` `; export const App = () => { + const [happyThought, setHappyThought] = useState(""); + + const handleFormSubmit = (text) => { + setHappyThought(text); + }; + return ( Happy Thoughts ❤️ - - + + ); }; diff --git a/src/Sections/Components/Form.jsx b/src/Sections/Components/Form.jsx deleted file mode 100644 index 5c91303d0..000000000 --- a/src/Sections/Components/Form.jsx +++ /dev/null @@ -1,61 +0,0 @@ -import React, { useState } from "react"; -import styled from "styled-components"; - -export const Form = () => { - const InputArea = styled.input` - width: 90%; - border: 2px solid #7a7b7b; - padding: 10px; - font-size: 16px; - - &:focus { - outline: none; - color: #000; - border-color: #7a7b7b; - box-shadow: 0 0 5px #7a7b7b; - } - `; - - const SubmitButtonContainer = styled.div` - display: flex; - justify-content: left; - margin: 10px; - `; - - const Button = styled.button` - background-color: #fdafaf; - color: #000; - font-weight: 600; - border: none; - padding: 10px 20px; - border-radius: 50px; - cursor: pointer; - font-size: 14px; - font-family: Roboto, sans-serif; - letter-spacing: 0.2px; - - &:hover { - transform: scale(1.1); - } - `; - - const TextInput = () => { - const [inputValue, setInputValue] = useState(""); - - const handleInputChange = (event) => { - setInputValue(event.target.value); - }; - } - return ( - - - - - - - - ); -}; \ No newline at end of file diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index ac3734e18..1a6882354 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -1,5 +1,5 @@ +import React, { useState } from "react"; import styled from "styled-components"; -import { Form } from "./Components/Form"; const PostContainer = styled.div` display: flex; @@ -7,13 +7,11 @@ const PostContainer = styled.div` align-items: left; justify-content: center; padding: 20px; - background-color: #f2f0f0; outline: 2px solid #000; box-shadow: 8px 8px 0px #000; width: 80vw; - - box-sizing: border-box; + box-sizing: border-box; `; const Title = styled.h2` @@ -24,11 +22,71 @@ const Title = styled.h2` letter-spacing: 0.2px; `; -export const Post = () => { +const InputArea = styled.textarea` + width: 90%; + border: 2px solid #7a7b7b; + padding: 10px; + font-size: 16px; + + &:focus { + outline: none; + color: #000; + border-color: #7a7b7b; + box-shadow: 0 0 5px #7a7b7b; + } +`; + +const SubmitButtonContainer = styled.div` + display: flex; + justify-content: left; + margin: 10px; +`; + +const Button = styled.button` + background-color: #fdafaf; + color: #000; + font-weight: 600; + border: none; + padding: 10px 20px; + border-radius: 50px; + cursor: pointer; + font-size: 14px; + font-family: Roboto, sans-serif; + letter-spacing: 0.2px; + + &:hover { + transform: scale(1.1); + } +`; + +export const Post = ({ onSubmit }) => { + const [inputValue, setInputValue] = useState(""); // Local state to manage the input + + const handleInputChange = (event) => { + setInputValue(event.target.value); // Update local state on input change + }; + + const handleSubmit = (event) => { + event.preventDefault(); + if (inputValue.trim()) { + onSubmit(inputValue); + setInputValue(""); + } + }; + return ( What's making you happy right now? -
+ + + + + +
); -}; +}; \ No newline at end of file diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index 70db5c823..521267440 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -37,10 +37,10 @@ const LikeButton = styled.button` } `; -export const View = () => { +export const View = ({ happyThought }) => { return ( - Your happy thought will appear here... + {happyThought || "Your happy thought will appear here"} ❤️ ); From 90eba531e09ba17f4f4ad2a0f04900f034dfe9d0 Mon Sep 17 00:00:00 2001 From: Sofie Date: Fri, 2 May 2025 09:15:51 +0200 Subject: [PATCH 14/72] made a new container for each thought --- src/App.jsx | 13 +++++--- src/Sections/Components/ResetBtn.jsx | 0 src/Sections/Components/SubmitBtn.jsx | 0 src/Sections/Post.jsx | 9 +++-- src/Sections/View.jsx | 47 ++++++++++++++++++++++++--- 5 files changed, 58 insertions(+), 11 deletions(-) create mode 100644 src/Sections/Components/ResetBtn.jsx create mode 100644 src/Sections/Components/SubmitBtn.jsx diff --git a/src/App.jsx b/src/App.jsx index dd2d117b4..43954c630 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -22,17 +22,22 @@ const Heading = styled.h1` `; export const App = () => { - const [happyThought, setHappyThought] = useState(""); + const [happyThoughts, setHappyThoughts] = useState([]); const handleFormSubmit = (text) => { - setHappyThought(text); + setHappyThoughts((prevThoughts) => [text, ...prevThoughts]); }; + const handleReset = () => { + setHappyThoughts([]); + }; + + return ( - Happy Thoughts ❤️ + Welcome to Happy Thoughts ❤️ - + ); }; diff --git a/src/Sections/Components/ResetBtn.jsx b/src/Sections/Components/ResetBtn.jsx new file mode 100644 index 000000000..e69de29bb diff --git a/src/Sections/Components/SubmitBtn.jsx b/src/Sections/Components/SubmitBtn.jsx new file mode 100644 index 000000000..e69de29bb diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index 1a6882354..f2428d278 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -12,6 +12,11 @@ const PostContainer = styled.div` box-shadow: 8px 8px 0px #000; width: 80vw; box-sizing: border-box; + + + @media (min-width: 768px) { + max-width: 600px; + } `; const Title = styled.h2` @@ -60,10 +65,10 @@ const Button = styled.button` `; export const Post = ({ onSubmit }) => { - const [inputValue, setInputValue] = useState(""); // Local state to manage the input + const [inputValue, setInputValue] = useState(""); const handleInputChange = (event) => { - setInputValue(event.target.value); // Update local state on input change + setInputValue(event.target.value); }; const handleSubmit = (event) => { diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index 521267440..5d0ac3e19 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -11,6 +11,11 @@ const ViewContainer = styled.div` outline: 2px solid #000; padding: 20px; box-shadow: 6px 6px 0px 0px black; + margin-bottom: 20px; + + @media (min-width: 768px) { + max-width: 600px; + } `; const TextField = styled.div` @@ -19,6 +24,7 @@ const TextField = styled.div` font-weight: 500; font-size: 16px; width: 100%; + margin-bottom: 10px; `; const LikeButton = styled.button` @@ -37,11 +43,42 @@ const LikeButton = styled.button` } `; -export const View = ({ happyThought }) => { +const ResetButton = styled.button` + background-color: #fdafaf; + color: #FFF; + font-weight: 600; + border: none; + padding: 10px 20px; + border-radius: 50px; + cursor: pointer; + font-size: 14px; + font-family: Roboto, sans-serif; + letter-spacing: 0.2px; + + &:hover { + transform: scale(1.1); + } +`; + +export const View = ({ happyThoughts, onReset }) => { return ( - - {happyThought || "Your happy thought will appear here"} - ❤️ - + <> + {happyThoughts.length > 0 ? ( + happyThoughts.map((thought, index) => ( + + {thought} + ❤️ + + )) + ) : ( + + Your happy thoughts will appear here + ❤️ + + )} + {happyThoughts.length > 0 && ( + 💔 Remove All Thoughts 💔 + )} + ); }; From 09a92e864a14907c3e0311e3bc070205dfe7b35c Mon Sep 17 00:00:00 2001 From: Sofie Date: Fri, 2 May 2025 11:28:39 +0200 Subject: [PATCH 15/72] like btn test --- src/Sections/Post.jsx | 2 ++ src/Sections/View.jsx | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index f2428d278..33209504a 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -1,5 +1,6 @@ import React, { useState } from "react"; import styled from "styled-components"; +import { LikeButton } from "./View"; const PostContainer = styled.div` display: flex; @@ -92,6 +93,7 @@ export const Post = ({ onSubmit }) => { + ❤️
); }; \ No newline at end of file diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index 5d0ac3e19..2d1497d86 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -27,7 +27,7 @@ const TextField = styled.div` margin-bottom: 10px; `; -const LikeButton = styled.button` +export const LikeButton = styled.button` font-size: 24px; background-color: #ebebeb; width: 50px; From f9d55517f7179a5420e3b6c938dc050ff3bee637 Mon Sep 17 00:00:00 2001 From: oskarnordin Date: Fri, 2 May 2025 17:20:21 +0200 Subject: [PATCH 16/72] added timestamp --- src/App.jsx | 5 ++--- src/Sections/Components/TimeAgo.jsx | 33 +++++++++++++++++++++++++++++ src/Sections/Post.jsx | 9 +++++--- src/Sections/View.jsx | 10 +++++---- 4 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 src/Sections/Components/TimeAgo.jsx diff --git a/src/App.jsx b/src/App.jsx index 43954c630..7868722f3 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -24,15 +24,14 @@ const Heading = styled.h1` export const App = () => { const [happyThoughts, setHappyThoughts] = useState([]); - const handleFormSubmit = (text) => { - setHappyThoughts((prevThoughts) => [text, ...prevThoughts]); + const handleFormSubmit = (newThought) => { + setHappyThoughts((prevThoughts) => [newThought, ...prevThoughts]); }; const handleReset = () => { setHappyThoughts([]); }; - return ( Welcome to Happy Thoughts ❤️ diff --git a/src/Sections/Components/TimeAgo.jsx b/src/Sections/Components/TimeAgo.jsx new file mode 100644 index 000000000..5afcfd85f --- /dev/null +++ b/src/Sections/Components/TimeAgo.jsx @@ -0,0 +1,33 @@ +import React from "react"; + +const TimeAgo = ({ timestamp }) => { + const date = timestamp instanceof Date ? timestamp : new Date(timestamp); + if (isNaN(date)) return Invalid date; // Rendered as a span element + + const now = new Date(); + const seconds = Math.floor((now - date) / 1000); + + if (seconds < 5) return just now; + + const intervals = { + year: 31536000, + month: 2592000, + week: 604800, + day: 86400, + hour: 3600, + minute: 60, + second: 1, + }; + + for (const [unit, value] of Object.entries(intervals)) { + const count = Math.floor(seconds / value); + if (count >= 1) { + const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" }); + return {rtf.format(-count, unit)}; + } + } + + return just now; +}; + +export default TimeAgo; diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index 33209504a..a562c39db 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -14,7 +14,6 @@ const PostContainer = styled.div` width: 80vw; box-sizing: border-box; - @media (min-width: 768px) { max-width: 600px; } @@ -75,7 +74,11 @@ export const Post = ({ onSubmit }) => { const handleSubmit = (event) => { event.preventDefault(); if (inputValue.trim()) { - onSubmit(inputValue); + const newThought = { + text: inputValue, + timestamp: new Date().toISOString(), // Adding timestamp here + }; + onSubmit(newThought); setInputValue(""); } }; @@ -96,4 +99,4 @@ export const Post = ({ onSubmit }) => { ❤️
); -}; \ No newline at end of file +}; diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index 2d1497d86..e89f133e6 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -1,4 +1,5 @@ import styled from "styled-components"; +import TimeAgo from "./Components/TimeAgo"; const ViewContainer = styled.div` display: flex; @@ -11,7 +12,7 @@ const ViewContainer = styled.div` outline: 2px solid #000; padding: 20px; box-shadow: 6px 6px 0px 0px black; - margin-bottom: 20px; + margin-bottom: 20px; @media (min-width: 768px) { max-width: 600px; @@ -45,7 +46,7 @@ export const LikeButton = styled.button` const ResetButton = styled.button` background-color: #fdafaf; - color: #FFF; + color: #fff; font-weight: 600; border: none; padding: 10px 20px; @@ -56,7 +57,7 @@ const ResetButton = styled.button` letter-spacing: 0.2px; &:hover { - transform: scale(1.1); + transform: scale(1.1); } `; @@ -66,8 +67,9 @@ export const View = ({ happyThoughts, onReset }) => { {happyThoughts.length > 0 ? ( happyThoughts.map((thought, index) => ( - {thought} + {thought.text} ❤️ + )) ) : ( From 9b6007ac261791cda2ceff2b96491b56dd179104 Mon Sep 17 00:00:00 2001 From: Sofie Date: Fri, 2 May 2025 17:25:51 +0200 Subject: [PATCH 17/72] added like count --- src/Sections/Post.jsx | 23 ++++++++++++++++++++++- src/Sections/View.jsx | 2 +- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index 33209504a..c06e8c8e4 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -33,6 +33,7 @@ const InputArea = styled.textarea` border: 2px solid #7a7b7b; padding: 10px; font-size: 16px; + resize: none; &:focus { outline: none; @@ -65,8 +66,21 @@ const Button = styled.button` } `; +const LikeContainer = styled.div` + display: flex; + align-items: center; + gap: 10px; + margin-top: 10px; +`; + +const LikeCount = styled.span` + font-size: 15px; + color: #7a7b7b; +`; + export const Post = ({ onSubmit }) => { const [inputValue, setInputValue] = useState(""); + const [likeCount, setLikeCount] = useState(0); const handleInputChange = (event) => { setInputValue(event.target.value); @@ -80,6 +94,10 @@ export const Post = ({ onSubmit }) => { } }; + const handleLike = () => { + setLikeCount((prevCount) => prevCount + 1); + }; + return ( What's making you happy right now? @@ -93,7 +111,10 @@ export const Post = ({ onSubmit }) => { - ❤️ + + ❤️ + x {likeCount} + ); }; \ No newline at end of file diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index 2d1497d86..f9d8048dd 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -39,7 +39,7 @@ export const LikeButton = styled.button` cursor: pointer; transition: background-color 0.3s ease; &:hover { - transform: scale(1.1); + background-color: #fdafaf; } `; From 8f683dd52fdbf4eef0b11cac1e3986abf071ba78 Mon Sep 17 00:00:00 2001 From: Sofie Date: Sat, 3 May 2025 11:05:59 +0200 Subject: [PATCH 18/72] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 41ebece29..70ef3329f 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ # Happy Thoughts +https://reliable-truffle-5d0fac.netlify.app/ From cc266979889de2fc7c0ad7b88d5d26cdb51c7147 Mon Sep 17 00:00:00 2001 From: Sofie Date: Sat, 3 May 2025 11:08:47 +0200 Subject: [PATCH 19/72] cleaned up code, styling of actions --- src/App.jsx | 24 ++++++++++++-- src/Sections/Components/LikeBtn.jsx | 50 +++++++++++++++++++++++++++++ src/Sections/Components/TimeAgo.jsx | 14 +++++--- src/Sections/Post.jsx | 30 ++--------------- src/Sections/View.jsx | 46 ++++++++++---------------- 5 files changed, 101 insertions(+), 63 deletions(-) create mode 100644 src/Sections/Components/LikeBtn.jsx diff --git a/src/App.jsx b/src/App.jsx index 7868722f3..416844540 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -12,8 +12,7 @@ const Container = styled.div` gap: 30px; `; -const Heading = styled.h1` - font-size: 24px; +const BaseHeading = styled.h1` color: #000; text-align: center; font-weight: 500; @@ -21,10 +20,28 @@ const Heading = styled.h1` letter-spacing: 0.2px; `; +const Heading = styled(BaseHeading)` + font-size: 24px; +`; + +const SubHeading = styled(BaseHeading)` + font-size: 16px; +`; + +const RedText = styled.span` + color: #E63946; +`; + + export const App = () => { const [happyThoughts, setHappyThoughts] = useState([]); - const handleFormSubmit = (newThought) => { + const handleFormSubmit = (text) => { + const newThought = { + text, + timestamp: new Date().toISOString(), + likeCount: 0, + }; setHappyThoughts((prevThoughts) => [newThought, ...prevThoughts]); }; @@ -35,6 +52,7 @@ export const App = () => { return ( Welcome to Happy Thoughts ❤️ + Trying to make the world a better place, one thought at a time. diff --git a/src/Sections/Components/LikeBtn.jsx b/src/Sections/Components/LikeBtn.jsx new file mode 100644 index 000000000..7969aaec2 --- /dev/null +++ b/src/Sections/Components/LikeBtn.jsx @@ -0,0 +1,50 @@ +import React, { useState } from "react"; +import styled from "styled-components"; + +const LikeButton = styled.button` + font-size: 24px; + background-color: ${(props) => (props.liked ? "#fdafaf" : "#ebebeb")}; + width: 50px; + height: 50px; + border: none; + margin-top: 10px; + border-radius: 50%; + align-self: flex-start; + cursor: pointer; + transition: background-color 0.3s ease; + &:hover { + transform: scale(1.1); + } +`; + +const LikeCount = styled.span` + font-size: 15px; + color: #7a7b7b; + margin-left: 10px; +`; + +const LikeContainer = styled.div` + display: flex; + align-items: center; + gap: 10px; + margin-top: 10px; +`; + +export const LikeBtn = () => { + const [likeCount, setLikeCount] = useState(0); + const [liked, setLiked] = useState(false); + + const handleLike = () => { + setLikeCount((prevCount) => prevCount + 1); + setLiked(true); + }; + + return ( + + + ❤️ + + x {likeCount} + + ); +}; \ No newline at end of file diff --git a/src/Sections/Components/TimeAgo.jsx b/src/Sections/Components/TimeAgo.jsx index 5afcfd85f..7d7fa4d3a 100644 --- a/src/Sections/Components/TimeAgo.jsx +++ b/src/Sections/Components/TimeAgo.jsx @@ -1,13 +1,19 @@ import React from "react"; +import styled from "styled-components"; + +const Text = styled.span` + color: #7a7b7b; + font-size: 15px; +` const TimeAgo = ({ timestamp }) => { const date = timestamp instanceof Date ? timestamp : new Date(timestamp); - if (isNaN(date)) return Invalid date; // Rendered as a span element + if (isNaN(date)) return Invalid date; // Rendered as a span element const now = new Date(); const seconds = Math.floor((now - date) / 1000); - if (seconds < 5) return just now; + if (seconds < 5) return just now; const intervals = { year: 31536000, @@ -23,11 +29,11 @@ const TimeAgo = ({ timestamp }) => { const count = Math.floor(seconds / value); if (count >= 1) { const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" }); - return {rtf.format(-count, unit)}; + return {rtf.format(-count, unit)}; } } - return just now; + return just now; }; export default TimeAgo; diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index 4b9038f06..a04bd96ba 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -1,6 +1,5 @@ import React, { useState } from "react"; import styled from "styled-components"; -import { LikeButton } from "./View"; const PostContainer = styled.div` display: flex; @@ -65,21 +64,9 @@ const Button = styled.button` } `; -const LikeContainer = styled.div` - display: flex; - align-items: center; - gap: 10px; - margin-top: 10px; -`; - -const LikeCount = styled.span` - font-size: 15px; - color: #7a7b7b; -`; - export const Post = ({ onSubmit }) => { const [inputValue, setInputValue] = useState(""); - const [likeCount, setLikeCount] = useState(0); + const handleInputChange = (event) => { setInputValue(event.target.value); @@ -88,19 +75,11 @@ export const Post = ({ onSubmit }) => { const handleSubmit = (event) => { event.preventDefault(); if (inputValue.trim()) { - const newThought = { - text: inputValue, - timestamp: new Date().toISOString(), // Adding timestamp here - }; - onSubmit(newThought); + onSubmit(inputValue); setInputValue(""); } }; - const handleLike = () => { - setLikeCount((prevCount) => prevCount + 1); - }; - return ( What's making you happy right now? @@ -114,10 +93,7 @@ export const Post = ({ onSubmit }) => { - - ❤️ - x {likeCount} - + ); }; diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index b837a9b33..5cd9b8ebd 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -1,5 +1,6 @@ import styled from "styled-components"; import TimeAgo from "./Components/TimeAgo"; +import { LikeBtn } from "./Components/LikeBtn"; const ViewContainer = styled.div` display: flex; @@ -28,31 +29,22 @@ const TextField = styled.div` margin-bottom: 10px; `; -export const LikeButton = styled.button` - font-size: 24px; - background-color: #ebebeb; - width: 50px; - height: 50px; - border: none; - margin-top: 10px; - border-radius: 50%; - align-self: flex-start; - cursor: pointer; - transition: background-color 0.3s ease; - &:hover { - background-color: #fdafaf; - } +const ActionsWrapper = styled.div` + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; `; const ResetButton = styled.button` - background-color: #fdafaf; - color: #fff; + background-color: #fff; + color: #E63946; font-weight: 600; - border: none; + border: 3px solid #fdafaf; padding: 10px 20px; border-radius: 50px; cursor: pointer; - font-size: 14px; + font-size: 12px; font-family: Roboto, sans-serif; letter-spacing: 0.2px; @@ -64,23 +56,19 @@ const ResetButton = styled.button` export const View = ({ happyThoughts, onReset }) => { return ( <> - {happyThoughts.length > 0 ? ( + {happyThoughts.length > 0 && happyThoughts.map((thought, index) => ( {thought.text} - ❤️ - + + + + - )) - ) : ( - - Your happy thoughts will appear here - ❤️ - - )} + ))} {happyThoughts.length > 0 && ( 💔 Remove All Thoughts 💔 )} ); -}; +}; \ No newline at end of file From 684486563d509059b050a5847e9ee005344951a7 Mon Sep 17 00:00:00 2001 From: oskarnordin Date: Sun, 4 May 2025 19:39:25 +0200 Subject: [PATCH 20/72] Update Post with character counter Added character counter with error message. --- src/Sections/Post.jsx | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index a562c39db..f68a3efd1 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -66,17 +66,30 @@ const Button = styled.button` export const Post = ({ onSubmit }) => { const [inputValue, setInputValue] = useState(""); + const [error, setError] = useState(""); + + const maxLength = 140; + const charCount = inputValue.length; + const charsLeft = maxLength - charCount; + const counterColor = charsLeft < 0 ? "red" : "#333"; const handleInputChange = (event) => { - setInputValue(event.target.value); + const value = event.target.value; + setInputValue(value); + + if (value.length > maxLength) { + setError("Character limit exceeded"); + } else { + setError(""); + } }; const handleSubmit = (event) => { event.preventDefault(); - if (inputValue.trim()) { + if (inputValue.trim() && inputValue.length <= maxLength) { const newThought = { text: inputValue, - timestamp: new Date().toISOString(), // Adding timestamp here + timestamp: new Date().toISOString(), }; onSubmit(newThought); setInputValue(""); @@ -92,8 +105,16 @@ export const Post = ({ onSubmit }) => { onChange={handleInputChange} placeholder="Type your happy thought here" /> +
+ {charsLeft >= 0 + ? `${charCount} / ${maxLength}` + : `${charsLeft} characters over limit`} +
+ {error &&

{error}

} - + ❤️ From e0e065bd721a7a1d39640c308458c05a2f23407b Mon Sep 17 00:00:00 2001 From: Sofie Date: Mon, 5 May 2025 09:36:46 +0200 Subject: [PATCH 21/72] fixed post error --- src/App.jsx | 7 +------ src/Sections/Post.jsx | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 416844540..ea6bdf80e 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -36,12 +36,7 @@ const RedText = styled.span` export const App = () => { const [happyThoughts, setHappyThoughts] = useState([]); - const handleFormSubmit = (text) => { - const newThought = { - text, - timestamp: new Date().toISOString(), - likeCount: 0, - }; + const handleFormSubmit = (newThought) => { setHappyThoughts((prevThoughts) => [newThought, ...prevThoughts]); }; diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index e2133f079..2404ee096 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -71,7 +71,7 @@ export const Post = ({ onSubmit }) => { const maxLength = 140; const charCount = inputValue.length; const charsLeft = maxLength - charCount; - const counterColor = charsLeft < 0 ? "red" : "#333"; + const counterColor = charsLeft < 0 ? "#E63946" : "#333"; const handleInputChange = (event) => { From c398e776a612aa9c487c8f99b3732b80f74e77bf Mon Sep 17 00:00:00 2001 From: oskarnordin Date: Mon, 5 May 2025 09:50:49 +0200 Subject: [PATCH 22/72] added character visual counter --- src/App.jsx | 17 +++++----- src/Sections/Post.jsx | 78 +++++++++++++++++++++++++++++++++++-------- 2 files changed, 73 insertions(+), 22 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 416844540..0c30015f2 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -29,20 +29,18 @@ const SubHeading = styled(BaseHeading)` `; const RedText = styled.span` - color: #E63946; + color: #e63946; `; - export const App = () => { const [happyThoughts, setHappyThoughts] = useState([]); - const handleFormSubmit = (text) => { - const newThought = { - text, - timestamp: new Date().toISOString(), + const handleFormSubmit = (newThought) => { + const extendedThought = { + ...newThought, likeCount: 0, }; - setHappyThoughts((prevThoughts) => [newThought, ...prevThoughts]); + setHappyThoughts((prevThoughts) => [extendedThought, ...prevThoughts]); }; const handleReset = () => { @@ -52,7 +50,10 @@ export const App = () => { return ( Welcome to Happy Thoughts ❤️ - Trying to make the world a better place, one thought at a time. + + Trying to make the world a better place,{" "} + one thought at a time. + diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index e2133f079..e76c4ffa0 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -64,6 +64,24 @@ const Button = styled.button` } `; +const CircleWrapper = styled.div` + position: relative; + width: 50px; + height: 50px; + margin: 10px 0; +`; + +const ProgressCircle = styled.svg` + transform: rotate(0deg); +`; + +const CircleText = styled.text` + font-size: 12px; + fill: ${({ color }) => color}; + text-anchor: middle; + dominant-baseline: central; +`; + export const Post = ({ onSubmit }) => { const [inputValue, setInputValue] = useState(""); const [error, setError] = useState(""); @@ -73,16 +91,10 @@ export const Post = ({ onSubmit }) => { const charsLeft = maxLength - charCount; const counterColor = charsLeft < 0 ? "red" : "#333"; - const handleInputChange = (event) => { const value = event.target.value; setInputValue(value); - - if (value.length > maxLength) { - setError("Character limit exceeded"); - } else { - setError(""); - } + setError(value.length > maxLength ? "Character limit exceeded" : ""); }; const handleSubmit = (event) => { @@ -93,11 +105,47 @@ export const Post = ({ onSubmit }) => { timestamp: new Date().toISOString(), }; onSubmit(newThought); - setInputValue(""); } }; + // Moved this INSIDE the component scope properly + const renderProgressCircle = () => { + const radius = 20; + const circumference = 2 * Math.PI * radius; + const progress = Math.min(charCount / maxLength, 1); + const strokeDashoffset = circumference * (1 - progress); + const strokeColor = charsLeft < 0 ? "red" : "#4caf50"; + + return ( + + + + + + {charCount} + + + + ); + }; + return ( What's making you happy right now? @@ -107,11 +155,14 @@ export const Post = ({ onSubmit }) => { onChange={handleInputChange} placeholder="Type your happy thought here" /> -
- {charsLeft >= 0 - ? `${charCount} / ${maxLength}` - : `${charsLeft} characters over limit`} -
+ {renderProgressCircle()} + {/*
+

+ {charsLeft >= 0 + ? `${charCount} / ${maxLength}` + : `${charsLeft} characters over limit`} +

+
*/} {error &&

{error}

} -
); }; From d4bdfcfa1807dce8b49781823de720d9ff1f2b39 Mon Sep 17 00:00:00 2001 From: oskarnordin Date: Mon, 5 May 2025 10:07:56 +0200 Subject: [PATCH 23/72] bug fix --- src/App.jsx | 7 +------ src/Sections/View.jsx | 4 ++-- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 60ee05e8f..300adecbc 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -35,12 +35,7 @@ const RedText = styled.span` export const App = () => { const [happyThoughts, setHappyThoughts] = useState([]); - const handleFormSubmit = (text) => { - const newThought = { - text, - timestamp: new Date().toISOString(), - likeCount: 0, - }; + const handleFormSubmit = (newThought) => { setHappyThoughts((prevThoughts) => [newThought, ...prevThoughts]); }; diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index 5cd9b8ebd..d925468e5 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -38,7 +38,7 @@ const ActionsWrapper = styled.div` const ResetButton = styled.button` background-color: #fff; - color: #E63946; + color: #e63946; font-weight: 600; border: 3px solid #fdafaf; padding: 10px 20px; @@ -71,4 +71,4 @@ export const View = ({ happyThoughts, onReset }) => { )} ); -}; \ No newline at end of file +}; From 35a31113a0c16f621e371dc5a1447c8c88dc2bcf Mon Sep 17 00:00:00 2001 From: Sofie Date: Mon, 5 May 2025 14:43:05 +0200 Subject: [PATCH 24/72] bug --- src/Sections/Post.jsx | 80 ++++++++----------------------------------- 1 file changed, 15 insertions(+), 65 deletions(-) diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index 784c5a9f5..e2133f079 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -64,24 +64,6 @@ const Button = styled.button` } `; -const CircleWrapper = styled.div` - position: relative; - width: 50px; - height: 50px; - margin: 10px 0; -`; - -const ProgressCircle = styled.svg` - transform: rotate(0deg); -`; - -const CircleText = styled.text` - font-size: 12px; - fill: ${({ color }) => color}; - text-anchor: middle; - dominant-baseline: central; -`; - export const Post = ({ onSubmit }) => { const [inputValue, setInputValue] = useState(""); const [error, setError] = useState(""); @@ -89,12 +71,18 @@ export const Post = ({ onSubmit }) => { const maxLength = 140; const charCount = inputValue.length; const charsLeft = maxLength - charCount; - const counterColor = charsLeft < 0 ? "#E63946" : "#333"; + const counterColor = charsLeft < 0 ? "red" : "#333"; + const handleInputChange = (event) => { const value = event.target.value; setInputValue(value); - setError(value.length > maxLength ? "Character limit exceeded" : ""); + + if (value.length > maxLength) { + setError("Character limit exceeded"); + } else { + setError(""); + } }; const handleSubmit = (event) => { @@ -105,47 +93,11 @@ export const Post = ({ onSubmit }) => { timestamp: new Date().toISOString(), }; onSubmit(newThought); + setInputValue(""); } }; - // Moved this INSIDE the component scope properly - const renderProgressCircle = () => { - const radius = 20; - const circumference = 2 * Math.PI * radius; - const progress = Math.min(charCount / maxLength, 1); - const strokeDashoffset = circumference * (1 - progress); - const strokeColor = charsLeft < 0 ? "red" : "#4caf50"; - - return ( - - - - - - {charCount} - - - - ); - }; - return ( What's making you happy right now? @@ -155,14 +107,11 @@ export const Post = ({ onSubmit }) => { onChange={handleInputChange} placeholder="Type your happy thought here" /> - {renderProgressCircle()} - {/*
-

- {charsLeft >= 0 - ? `${charCount} / ${maxLength}` - : `${charsLeft} characters over limit`} -

-
*/} +
+ {charsLeft >= 0 + ? `${charCount} / ${maxLength}` + : `${charsLeft} characters over limit`} +
{error &&

{error}

} +
); }; From e12af5706207f98f38616d35f881d0c127cf07a5 Mon Sep 17 00:00:00 2001 From: oskarnordin Date: Mon, 5 May 2025 15:05:29 +0200 Subject: [PATCH 25/72] updated push --- src/Sections/Post.jsx | 80 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 65 insertions(+), 15 deletions(-) diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index e2133f079..784c5a9f5 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -64,6 +64,24 @@ const Button = styled.button` } `; +const CircleWrapper = styled.div` + position: relative; + width: 50px; + height: 50px; + margin: 10px 0; +`; + +const ProgressCircle = styled.svg` + transform: rotate(0deg); +`; + +const CircleText = styled.text` + font-size: 12px; + fill: ${({ color }) => color}; + text-anchor: middle; + dominant-baseline: central; +`; + export const Post = ({ onSubmit }) => { const [inputValue, setInputValue] = useState(""); const [error, setError] = useState(""); @@ -71,18 +89,12 @@ export const Post = ({ onSubmit }) => { const maxLength = 140; const charCount = inputValue.length; const charsLeft = maxLength - charCount; - const counterColor = charsLeft < 0 ? "red" : "#333"; - + const counterColor = charsLeft < 0 ? "#E63946" : "#333"; const handleInputChange = (event) => { const value = event.target.value; setInputValue(value); - - if (value.length > maxLength) { - setError("Character limit exceeded"); - } else { - setError(""); - } + setError(value.length > maxLength ? "Character limit exceeded" : ""); }; const handleSubmit = (event) => { @@ -93,11 +105,47 @@ export const Post = ({ onSubmit }) => { timestamp: new Date().toISOString(), }; onSubmit(newThought); - setInputValue(""); } }; + // Moved this INSIDE the component scope properly + const renderProgressCircle = () => { + const radius = 20; + const circumference = 2 * Math.PI * radius; + const progress = Math.min(charCount / maxLength, 1); + const strokeDashoffset = circumference * (1 - progress); + const strokeColor = charsLeft < 0 ? "red" : "#4caf50"; + + return ( + + + + + + {charCount} + + + + ); + }; + return ( What's making you happy right now? @@ -107,11 +155,14 @@ export const Post = ({ onSubmit }) => { onChange={handleInputChange} placeholder="Type your happy thought here" /> -
- {charsLeft >= 0 - ? `${charCount} / ${maxLength}` - : `${charsLeft} characters over limit`} -
+ {renderProgressCircle()} + {/*
+

+ {charsLeft >= 0 + ? `${charCount} / ${maxLength}` + : `${charsLeft} characters over limit`} +

+
*/} {error &&

{error}

} -
); }; From 4b85b536743c05c806f814ddbefe8e5b99199f9d Mon Sep 17 00:00:00 2001 From: Sofie Date: Mon, 5 May 2025 15:49:45 +0200 Subject: [PATCH 26/72] styling edit --- src/Sections/Post.jsx | 34 ++++++++++++++++++++-------------- src/Sections/View.jsx | 4 ++-- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index 784c5a9f5..de2ae6232 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -10,11 +10,11 @@ const PostContainer = styled.div` background-color: #f2f0f0; outline: 2px solid #000; box-shadow: 8px 8px 0px #000; - width: 80vw; + width: 90vw; box-sizing: border-box; @media (min-width: 768px) { - max-width: 600px; + max-width: 700px; } `; @@ -43,8 +43,15 @@ const InputArea = styled.textarea` const SubmitButtonContainer = styled.div` display: flex; - justify-content: left; + flex-direction: column; + justify-content: flex-start; + align-items: center; margin: 10px; + + @media (min-width: 768px) { + flex-direction: row; + justify-content: space-between; + } `; const Button = styled.button` @@ -53,11 +60,14 @@ const Button = styled.button` font-weight: 600; border: none; padding: 10px 20px; + height: 45px; + width: 250px; border-radius: 50px; cursor: pointer; font-size: 14px; font-family: Roboto, sans-serif; letter-spacing: 0.2px; + margin: 10px; &:hover { transform: scale(1.1); @@ -94,7 +104,7 @@ export const Post = ({ onSubmit }) => { const handleInputChange = (event) => { const value = event.target.value; setInputValue(value); - setError(value.length > maxLength ? "Character limit exceeded" : ""); + setError(value.length > maxLength ? "Your message is too long" : ""); }; const handleSubmit = (event) => { @@ -115,7 +125,7 @@ export const Post = ({ onSubmit }) => { const circumference = 2 * Math.PI * radius; const progress = Math.min(charCount / maxLength, 1); const strokeDashoffset = circumference * (1 - progress); - const strokeColor = charsLeft < 0 ? "red" : "#4caf50"; + const strokeColor = charsLeft < 0 ? "#e63946" : "#7a7b7b"; return ( @@ -155,19 +165,15 @@ export const Post = ({ onSubmit }) => { onChange={handleInputChange} placeholder="Type your happy thought here" /> - {renderProgressCircle()} - {/*
-

- {charsLeft >= 0 - ? `${charCount} / ${maxLength}` - : `${charsLeft} characters over limit`} -

-
*/} - {error &&

{error}

} + +
+ {renderProgressCircle()} + {error &&

{error}

} +
diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index d925468e5..19479156a 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -8,7 +8,7 @@ const ViewContainer = styled.div` justify-content: space-between; align-items: flex-start; background-color: white; - width: 80vw; + width: 90vw; box-sizing: border-box; outline: 2px solid #000; padding: 20px; @@ -16,7 +16,7 @@ const ViewContainer = styled.div` margin-bottom: 20px; @media (min-width: 768px) { - max-width: 600px; + max-width: 700px; } `; From 270f90a752c3a2ea7ac6e4db38cc407106a4aadd Mon Sep 17 00:00:00 2001 From: Sofie Date: Tue, 6 May 2025 17:02:51 +0200 Subject: [PATCH 27/72] minor styling changes --- src/Sections/Post.jsx | 22 ++++++++-------------- src/Sections/View.jsx | 6 +++--- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index de2ae6232..440c7aafa 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -10,11 +10,11 @@ const PostContainer = styled.div` background-color: #f2f0f0; outline: 2px solid #000; box-shadow: 8px 8px 0px #000; - width: 90vw; + width: 80vw; box-sizing: border-box; @media (min-width: 768px) { - max-width: 700px; + max-width: 600px; } `; @@ -43,15 +43,10 @@ const InputArea = styled.textarea` const SubmitButtonContainer = styled.div` display: flex; - flex-direction: column; - justify-content: flex-start; + flex-direction: row; + justify-content: space-between; + flex-wrap: wrap; align-items: center; - margin: 10px; - - @media (min-width: 768px) { - flex-direction: row; - justify-content: space-between; - } `; const Button = styled.button` @@ -59,12 +54,11 @@ const Button = styled.button` color: #000; font-weight: 600; border: none; - padding: 10px 20px; - height: 45px; - width: 250px; + padding: 6px 12px; + border-radius: 50px; cursor: pointer; - font-size: 14px; + font-size: 13px; font-family: Roboto, sans-serif; letter-spacing: 0.2px; margin: 10px; diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index 19479156a..3844e74b2 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -8,7 +8,7 @@ const ViewContainer = styled.div` justify-content: space-between; align-items: flex-start; background-color: white; - width: 90vw; + width: 80vw; box-sizing: border-box; outline: 2px solid #000; padding: 20px; @@ -16,7 +16,7 @@ const ViewContainer = styled.div` margin-bottom: 20px; @media (min-width: 768px) { - max-width: 700px; + max-width: 600px; } `; @@ -67,7 +67,7 @@ export const View = ({ happyThoughts, onReset }) => { ))} {happyThoughts.length > 0 && ( - 💔 Remove All Thoughts 💔 + 💔 Clear All Thoughts 💔 )} ); From 752424b16b5eaf10589c92ead980ec929ae6a8b9 Mon Sep 17 00:00:00 2001 From: Sofie Date: Tue, 6 May 2025 17:21:36 +0200 Subject: [PATCH 28/72] added Thoughts.jsx to clean up App.jsx --- src/App.jsx | 59 +++------------------------------------ src/Sections/Thoughts.jsx | 57 +++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 55 deletions(-) create mode 100644 src/Sections/Thoughts.jsx diff --git a/src/App.jsx b/src/App.jsx index 300adecbc..16a13e423 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,57 +1,6 @@ -import React, { useState } from "react"; -import { Post } from "./Sections/Post"; -import { View } from "./Sections/View"; -import styled from "styled-components"; - -const Container = styled.div` - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 20px; - gap: 30px; -`; - -const BaseHeading = styled.h1` - color: #000; - text-align: center; - font-weight: 500; - font-family: Monospace, monospace; - letter-spacing: 0.2px; -`; - -const Heading = styled(BaseHeading)` - font-size: 24px; -`; - -const SubHeading = styled(BaseHeading)` - font-size: 16px; -`; - -const RedText = styled.span` - color: #e63946; -`; +import React from "react"; +import { Thoughts } from "./Sections/Thoughts"; export const App = () => { - const [happyThoughts, setHappyThoughts] = useState([]); - - const handleFormSubmit = (newThought) => { - setHappyThoughts((prevThoughts) => [newThought, ...prevThoughts]); - }; - - const handleReset = () => { - setHappyThoughts([]); - }; - - return ( - - Welcome to Happy Thoughts ❤️ - - Trying to make the world a better place,{" "} - one thought at a time. - - - - - ); -}; + return ; +}; \ No newline at end of file diff --git a/src/Sections/Thoughts.jsx b/src/Sections/Thoughts.jsx new file mode 100644 index 000000000..ae95799d3 --- /dev/null +++ b/src/Sections/Thoughts.jsx @@ -0,0 +1,57 @@ +import React, { useState } from "react"; +import { Post } from "./Post"; +import { View } from "./View"; +import styled from "styled-components"; + +const Container = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 20px; + gap: 30px; +`; + +const BaseHeading = styled.h1` + color: rgb(42, 42, 42); + text-align: center; + font-weight: 500; + font-family: Monospace, monospace; + letter-spacing: 0.2px; +`; + +const Heading = styled(BaseHeading)` + font-size: 22px; +`; + +const SubHeading = styled(BaseHeading)` + font-size: 15px; +`; + +const RedText = styled.span` + color: #e63946; +`; + +export const Thoughts = () => { + const [happyThoughts, setHappyThoughts] = useState([]); + + const handleFormSubmit = (newThought) => { + setHappyThoughts((prevThoughts) => [newThought, ...prevThoughts]); + }; + + const handleReset = () => { + setHappyThoughts([]); + }; + + return ( + + Welcome to Happy Thoughts ❤️ + + Trying to make the world a better place,{" "} + one thought at a time. + + + + + ); +}; \ No newline at end of file From 04ac49162e18e4749860191554e885bea6cd239e Mon Sep 17 00:00:00 2001 From: oskarnordin Date: Tue, 6 May 2025 18:19:28 +0200 Subject: [PATCH 29/72] Synk SYnk --- src/Sections/Post.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index 440c7aafa..3d03e386f 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -166,7 +166,9 @@ export const Post = ({ onSubmit }) => {
{renderProgressCircle()} - {error &&

{error}

} + {error && ( +

{error}

+ )}
From 9060d2b3eec92f500813792648425ea730cfb4f3 Mon Sep 17 00:00:00 2001 From: oskarnordin Date: Tue, 6 May 2025 18:31:33 +0200 Subject: [PATCH 30/72] added API call --- src/Sections/Thoughts.jsx | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Sections/Thoughts.jsx b/src/Sections/Thoughts.jsx index ae95799d3..b25e4bf9c 100644 --- a/src/Sections/Thoughts.jsx +++ b/src/Sections/Thoughts.jsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import { Post } from "./Post"; import { View } from "./View"; import styled from "styled-components"; @@ -35,6 +35,13 @@ const RedText = styled.span` export const Thoughts = () => { const [happyThoughts, setHappyThoughts] = useState([]); + useEffect(() => { + fetch("https://happy-thoughts-ux7hkzgmwa-uc.a.run.app/thoughts") + .then((res) => res.json()) + .then((data) => setHappyThoughts(data)) + .catch((err) => console.error("Failed to fetch thoughts:", err)); + }, []); + const handleFormSubmit = (newThought) => { setHappyThoughts((prevThoughts) => [newThought, ...prevThoughts]); }; @@ -51,7 +58,11 @@ export const Thoughts = () => { one thought at a time. + {/* 👇 Render message from API */} + {happyThoughts.map((thought) => ( +

{thought.message}

+ ))} ); -}; \ No newline at end of file +}; From 44b8e7022e486571636e26ed4332361637e912bb Mon Sep 17 00:00:00 2001 From: oskarnordin Date: Wed, 7 May 2025 13:56:59 +0200 Subject: [PATCH 31/72] fetch in view --- src/Sections/Thoughts.jsx | 11 ----------- src/Sections/View.jsx | 30 +++++++++++++++++++++++------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/Sections/Thoughts.jsx b/src/Sections/Thoughts.jsx index b25e4bf9c..a16dcd4f8 100644 --- a/src/Sections/Thoughts.jsx +++ b/src/Sections/Thoughts.jsx @@ -35,13 +35,6 @@ const RedText = styled.span` export const Thoughts = () => { const [happyThoughts, setHappyThoughts] = useState([]); - useEffect(() => { - fetch("https://happy-thoughts-ux7hkzgmwa-uc.a.run.app/thoughts") - .then((res) => res.json()) - .then((data) => setHappyThoughts(data)) - .catch((err) => console.error("Failed to fetch thoughts:", err)); - }, []); - const handleFormSubmit = (newThought) => { setHappyThoughts((prevThoughts) => [newThought, ...prevThoughts]); }; @@ -58,10 +51,6 @@ export const Thoughts = () => { one thought at a time. - {/* 👇 Render message from API */} - {happyThoughts.map((thought) => ( -

{thought.message}

- ))} ); diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index 3844e74b2..b3a7d6c60 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -1,3 +1,4 @@ +import React, { useState, useEffect } from "react"; import styled from "styled-components"; import TimeAgo from "./Components/TimeAgo"; import { LikeBtn } from "./Components/LikeBtn"; @@ -53,21 +54,36 @@ const ResetButton = styled.button` } `; -export const View = ({ happyThoughts, onReset }) => { +export const View = ({ onReset }) => { + const [thoughts, setHappyThoughts] = useState([]); + + useEffect(() => { + fetch("https://happy-thoughts-ux7hkzgmwa-uc.a.run.app/thoughts") + .then((res) => res.json()) + .then((data) => setHappyThoughts(data)) + .catch((err) => console.error("Failed to fetch thoughts:", err)); + }, []); + return ( <> - {happyThoughts.length > 0 && - happyThoughts.map((thought, index) => ( - + {thoughts.length > 0 && + thoughts.map((thought) => ( + {thought.text} + - + + + {/* Render the message */} +

{thought.message}

))} - {happyThoughts.length > 0 && ( - 💔 Clear All Thoughts 💔 + {thoughts.length > 0 && ( + setHappyThoughts([])}> + 💔 Clear All Thoughts 💔 + )} ); From d9ffd5de46237dd6d58e90f9f558c6b1614406df Mon Sep 17 00:00:00 2001 From: oskarnordin Date: Wed, 7 May 2025 15:45:14 +0200 Subject: [PATCH 32/72] Added post functionality and like functionality to API. --- src/Sections/Components/LikeBtn.jsx | 37 +++++++-- src/Sections/Components/ResetBtn.jsx | 0 src/Sections/Components/TimeAgo.jsx | 3 +- src/Sections/Post.jsx | 107 +++++++++------------------ src/Sections/Thoughts.jsx | 15 ++-- src/Sections/View.jsx | 48 +++--------- 6 files changed, 83 insertions(+), 127 deletions(-) delete mode 100644 src/Sections/Components/ResetBtn.jsx diff --git a/src/Sections/Components/LikeBtn.jsx b/src/Sections/Components/LikeBtn.jsx index 7969aaec2..33ca40ba4 100644 --- a/src/Sections/Components/LikeBtn.jsx +++ b/src/Sections/Components/LikeBtn.jsx @@ -3,7 +3,7 @@ import styled from "styled-components"; const LikeButton = styled.button` font-size: 24px; - background-color: ${(props) => (props.liked ? "#fdafaf" : "#ebebeb")}; + background-color: ${(props) => (props.$liked ? "#fdafaf" : "#ebebeb")}; width: 50px; height: 50px; border: none; @@ -30,21 +30,42 @@ const LikeContainer = styled.div` margin-top: 10px; `; -export const LikeBtn = () => { - const [likeCount, setLikeCount] = useState(0); +export const LikeBtn = ({ thoughtId, hearts }) => { + const [likeCount, setLikeCount] = useState(hearts); const [liked, setLiked] = useState(false); - const handleLike = () => { - setLikeCount((prevCount) => prevCount + 1); - setLiked(true); + const handleLike = async () => { + console.log("Sending like to:", thoughtId); + + try { + const response = await fetch( + `https://happy-thoughts-ux7hkzgmwa-uc.a.run.app/thoughts/${thoughtId}/like`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + } + ); + + if (response.ok) { + console.log("Thought liked successfully!"); + setLikeCount(likeCount + 1); + setLiked(true); + } else { + console.error("Failed to like the thought"); + } + } catch (error) { + console.error("Error liking the thought:", error); + } }; return ( - + ❤️ x {likeCount} ); -}; \ No newline at end of file +}; diff --git a/src/Sections/Components/ResetBtn.jsx b/src/Sections/Components/ResetBtn.jsx deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/Sections/Components/TimeAgo.jsx b/src/Sections/Components/TimeAgo.jsx index 7d7fa4d3a..cdb9a537e 100644 --- a/src/Sections/Components/TimeAgo.jsx +++ b/src/Sections/Components/TimeAgo.jsx @@ -6,7 +6,7 @@ const Text = styled.span` font-size: 15px; ` -const TimeAgo = ({ timestamp }) => { +export const TimeAgo = ({ timestamp }) => { const date = timestamp instanceof Date ? timestamp : new Date(timestamp); if (isNaN(date)) return Invalid date; // Rendered as a span element @@ -36,4 +36,3 @@ const TimeAgo = ({ timestamp }) => { return just now; }; -export default TimeAgo; diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index 3d03e386f..4be2633cc 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -68,32 +68,11 @@ const Button = styled.button` } `; -const CircleWrapper = styled.div` - position: relative; - width: 50px; - height: 50px; - margin: 10px 0; -`; - -const ProgressCircle = styled.svg` - transform: rotate(0deg); -`; - -const CircleText = styled.text` - font-size: 12px; - fill: ${({ color }) => color}; - text-anchor: middle; - dominant-baseline: central; -`; - export const Post = ({ onSubmit }) => { const [inputValue, setInputValue] = useState(""); const [error, setError] = useState(""); const maxLength = 140; - const charCount = inputValue.length; - const charsLeft = maxLength - charCount; - const counterColor = charsLeft < 0 ? "#E63946" : "#333"; const handleInputChange = (event) => { const value = event.target.value; @@ -101,55 +80,41 @@ export const Post = ({ onSubmit }) => { setError(value.length > maxLength ? "Your message is too long" : ""); }; - const handleSubmit = (event) => { + const handleSubmit = async (event) => { event.preventDefault(); - if (inputValue.trim() && inputValue.length <= maxLength) { - const newThought = { - text: inputValue, - timestamp: new Date().toISOString(), - }; - onSubmit(newThought); - setInputValue(""); + if ( + inputValue.trim() && + inputValue.length >= 1 && + inputValue.length <= maxLength + ) { + try { + const response = await fetch( + "https://happy-thoughts-ux7hkzgmwa-uc.a.run.app/thoughts", + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ message: inputValue }), + } + ); + + if (!response.ok) { + const errorData = await response.json(); + setError(errorData.message || "Failed to post your thought."); + return; + } + + const newThought = await response.json(); + onSubmit(newThought); // Pass the new thought to the parent component + setInputValue(""); + setError(""); + } catch (err) { + setError("Something went wrong. Please try again.", err); + } + } else { + setError("Message must be under 140 characters."); } }; - // Moved this INSIDE the component scope properly - const renderProgressCircle = () => { - const radius = 20; - const circumference = 2 * Math.PI * radius; - const progress = Math.min(charCount / maxLength, 1); - const strokeDashoffset = circumference * (1 - progress); - const strokeColor = charsLeft < 0 ? "#e63946" : "#7a7b7b"; - - return ( - - - - - - {charCount} - - - - ); - }; - return ( What's making you happy right now? @@ -159,17 +124,13 @@ export const Post = ({ onSubmit }) => { onChange={handleInputChange} placeholder="Type your happy thought here" /> - -
- {renderProgressCircle()} - {error && ( -

{error}

- )} -
+ {error && ( +

{error}

+ )}
diff --git a/src/Sections/Thoughts.jsx b/src/Sections/Thoughts.jsx index a16dcd4f8..54157dd4b 100644 --- a/src/Sections/Thoughts.jsx +++ b/src/Sections/Thoughts.jsx @@ -35,14 +35,19 @@ const RedText = styled.span` export const Thoughts = () => { const [happyThoughts, setHappyThoughts] = useState([]); + // Fetch thoughts on component mount + useEffect(() => { + fetch("https://happy-thoughts-ux7hkzgmwa-uc.a.run.app/thoughts") + .then((res) => res.json()) + .then((data) => setHappyThoughts(data)) + .catch((err) => console.error("Failed to fetch thoughts:", err)); + }, []); + + // Handle new thought submission const handleFormSubmit = (newThought) => { setHappyThoughts((prevThoughts) => [newThought, ...prevThoughts]); }; - const handleReset = () => { - setHappyThoughts([]); - }; - return ( Welcome to Happy Thoughts ❤️ @@ -51,7 +56,7 @@ export const Thoughts = () => { one thought at a time. - + ); }; diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index b3a7d6c60..114759be3 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -1,6 +1,6 @@ -import React, { useState, useEffect } from "react"; +import React from "react"; import styled from "styled-components"; -import TimeAgo from "./Components/TimeAgo"; +import { TimeAgo } from "./Components/TimeAgo"; import { LikeBtn } from "./Components/LikeBtn"; const ViewContainer = styled.div` @@ -37,54 +37,24 @@ const ActionsWrapper = styled.div` width: 100%; `; -const ResetButton = styled.button` - background-color: #fff; - color: #e63946; - font-weight: 600; - border: 3px solid #fdafaf; - padding: 10px 20px; - border-radius: 50px; - cursor: pointer; - font-size: 12px; - font-family: Roboto, sans-serif; - letter-spacing: 0.2px; - - &:hover { - transform: scale(1.1); - } -`; - -export const View = ({ onReset }) => { - const [thoughts, setHappyThoughts] = useState([]); - - useEffect(() => { - fetch("https://happy-thoughts-ux7hkzgmwa-uc.a.run.app/thoughts") - .then((res) => res.json()) - .then((data) => setHappyThoughts(data)) - .catch((err) => console.error("Failed to fetch thoughts:", err)); - }, []); - +export const View = ({ thoughts, onLike }) => { return ( <> {thoughts.length > 0 && thoughts.map((thought) => ( - {thought.text} + {thought.message} - + - - {/* Render the message */} -

{thought.message}

))} - {thoughts.length > 0 && ( - setHappyThoughts([])}> - 💔 Clear All Thoughts 💔 - - )} ); }; From aa0bff1a2806ce9b3469ff23b77e0012fdfad038 Mon Sep 17 00:00:00 2001 From: Sofie Date: Thu, 8 May 2025 15:49:07 +0200 Subject: [PATCH 33/72] added character counter back and added animation on submit --- src/Sections/Post.jsx | 125 +++++++++++++++++++++++++++++++++++--- src/Sections/Thoughts.jsx | 2 - src/Sections/View.jsx | 5 +- 3 files changed, 118 insertions(+), 14 deletions(-) diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index 4be2633cc..1989bac30 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import styled from "styled-components"; +import styled, { keyframes } from "styled-components"; const PostContainer = styled.div` display: flex; @@ -10,7 +10,8 @@ const PostContainer = styled.div` background-color: #f2f0f0; outline: 2px solid #000; box-shadow: 8px 8px 0px #000; - width: 80vw; + width: 90vw; + margin-bottom: 20px; box-sizing: border-box; @media (min-width: 768px) { @@ -26,6 +27,33 @@ const Title = styled.h2` letter-spacing: 0.2px; `; +const InputWrapper = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + position: relative; +`; + +const CircleWrapper = styled.div` + position: relative; + width: 50px; + height: 50px; + margin: 5px; +`; + +const ProgressCircle = styled.svg` + transform: rotate(0deg); +`; + +const CircleText = styled.text` + font-size: 12px; + fill: ${({ color }) => color}; + text-anchor: middle; + dominant-baseline: central; +`; + + const InputArea = styled.textarea` width: 90%; border: 2px solid #7a7b7b; @@ -68,16 +96,45 @@ const Button = styled.button` } `; +const StarAnimation = keyframes` + 0%, 100% { + opacity: 0; + } + 25%, 75% { + opacity: 0.5; + } + 50% { + opacity: 1; + } +`; + +const StarContainer = styled.div` + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + pointer-events: none; +`; + +const Star = styled.span` + font-size: 54px; + animation: ${StarAnimation} 3s ease-out forwards ; +`; + export const Post = ({ onSubmit }) => { const [inputValue, setInputValue] = useState(""); const [error, setError] = useState(""); + const [showStars, setShowStars] = useState(false); const maxLength = 140; + const charCount = inputValue.length; + const charsLeft = maxLength - charCount; + const handleInputChange = (event) => { const value = event.target.value; setInputValue(value); - setError(value.length > maxLength ? "Your message is too long" : ""); + setError(value.length > maxLength ? "Your thought is too long." : ""); }; const handleSubmit = async (event) => { @@ -104,26 +161,69 @@ export const Post = ({ onSubmit }) => { } const newThought = await response.json(); - onSubmit(newThought); // Pass the new thought to the parent component + onSubmit(newThought); setInputValue(""); setError(""); + + // When submitting - show star for 3 seconds + setShowStars(true); + setTimeout(() => setShowStars(false), 3000); } catch (err) { setError("Something went wrong. Please try again.", err); } } else { - setError("Message must be under 140 characters."); + setError("Your thought must be less than 140 characters."); } }; + const renderProgressCircle = () => { + const radius = 20; + const circumference = 2 * Math.PI * radius; + const progress = Math.min(charCount / maxLength, 1); + const strokeDashoffset = circumference * (1 - progress); + const strokeColor = charsLeft < 0 ? "#e63946" : "#7a7b7b"; + + return ( + + + + + + {charCount} + + + + ); + }; + return ( What's making you happy right now?
- + + + {renderProgressCircle()} + {error && ( @@ -233,11 +247,11 @@ export const Post = ({ onSubmit }) => { )} - {showStars && ( - - - + {showAnimation && ( + + ❤️ + )}
); -}; +}; \ No newline at end of file diff --git a/src/Sections/Thoughts.jsx b/src/Sections/Thoughts.jsx index 2879faa02..d2ca30da5 100644 --- a/src/Sections/Thoughts.jsx +++ b/src/Sections/Thoughts.jsx @@ -53,7 +53,7 @@ export const Thoughts = () => { src="https://lottie.host/5a7cb486-522b-4467-b656-356bea2585ff/MH7Oyw6zWd.lottie" loop autoplay - style={{ maxWidth: "450px" }} + style={{ maxWidth: "350px" }} /> Welcome to Happy Thoughts ❤️ diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index 9468cf646..2b957a343 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -1,4 +1,3 @@ -import React from "react"; import styled from "styled-components"; import { TimeAgo } from "./Components/TimeAgo"; import { LikeBtn } from "./Components/LikeBtn"; @@ -15,15 +14,14 @@ const ViewContainer = styled.div` padding: 20px; box-shadow: 6px 6px 0px 0px black; margin-bottom: 10px; - + transition: transform 0.2s ease; @media (min-width: 768px) { - max-width: 600px; + max-width: 700px; } `; const TextField = styled.div` - background-color: white; font-family: monospace; font-weight: 500; font-size: 16px; @@ -45,7 +43,6 @@ export const View = ({ thoughts, onLike }) => { thoughts.map((thought) => ( {thought.message} - Date: Sun, 11 May 2025 10:15:22 +0200 Subject: [PATCH 39/72] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 70ef3329f..877f9eba6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,5 @@ # Happy Thoughts + +Happy Thoughts is a messaging app built with React that lets users share short messages with the world. It connects to a shared public API, allowing anyone to post and read happy thoughts in real time. Messages appear in reverse chronological order, with the newest thoughts at the top. Each thought displays the message content and a like count, which can be increased by clicking the heart button. + https://reliable-truffle-5d0fac.netlify.app/ From 39d6b6276980be6c27f6f5c5460cb0a8fd0d852f Mon Sep 17 00:00:00 2001 From: Sofie Date: Sun, 11 May 2025 10:36:57 +0200 Subject: [PATCH 40/72] added loadingstate, fixed position of the post animation --- src/Sections/Post.jsx | 7 ++++--- src/Sections/Thoughts.jsx | 37 +++++++++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index 51eb7ef0e..c9837fa3c 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -123,15 +123,16 @@ const PostAnimation = keyframes` `; const PostAnimationContainer = styled.div` - position: absolute; + position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); - pointer-events: none; + pointer-events: none; + z-index: 1000; `; const Animation = styled.span` - font-size: 55px; + font-size: 45px; animation: ${PostAnimation} 3s ease-out forwards; `; diff --git a/src/Sections/Thoughts.jsx b/src/Sections/Thoughts.jsx index d2ca30da5..0c14be28f 100644 --- a/src/Sections/Thoughts.jsx +++ b/src/Sections/Thoughts.jsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from "react"; import { Post } from "./Post"; import { View } from "./View"; -import styled from "styled-components"; +import { styled, keyframes } from "styled-components"; import { DotLottieReact } from "@lottiefiles/dotlottie-react"; const Container = styled.div` @@ -33,14 +33,37 @@ const RedText = styled.span` color: #e63946; `; +const Rotate = keyframes` + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +`; + +const Hourglass = styled.div` + font-size: 45px; + animation: ${Rotate} 1.5s linear infinite; +`; + export const Thoughts = () => { const [happyThoughts, setHappyThoughts] = useState([]); + const [loading, setLoading] = useState(true); useEffect(() => { + setLoading(true); fetch("https://happy-thoughts-ux7hkzgmwa-uc.a.run.app/thoughts") .then((res) => res.json()) - .then((data) => setHappyThoughts(data)) - .catch((err) => console.error("Failed to fetch thoughts:", err)); + .then((data) => { + setHappyThoughts(data) + setLoading(false); + }) + + .catch((err) => { + console.error("Failed to fetch thoughts:", err) + setLoading(false); + }); }, []); const handleFormSubmit = (newThought) => { @@ -61,7 +84,13 @@ export const Thoughts = () => { one thought at a time. - + {loading ? ( + + ) : ( + <> + + + )} ); }; From 49cfccb94b8410eb61a60eab79c309d2146184b0 Mon Sep 17 00:00:00 2001 From: Sofie Date: Sun, 11 May 2025 10:43:48 +0200 Subject: [PATCH 41/72] loading state etx --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 70ef3329f..877f9eba6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,5 @@ # Happy Thoughts + +Happy Thoughts is a messaging app built with React that lets users share short messages with the world. It connects to a shared public API, allowing anyone to post and read happy thoughts in real time. Messages appear in reverse chronological order, with the newest thoughts at the top. Each thought displays the message content and a like count, which can be increased by clicking the heart button. + https://reliable-truffle-5d0fac.netlify.app/ From 9d594a7fafb04d0a69d22b65bf7f225cf137ca94 Mon Sep 17 00:00:00 2001 From: Sofie Date: Tue, 20 May 2025 19:51:00 +0200 Subject: [PATCH 42/72] made changes from code review notes --- src/Sections/Post.jsx | 7 ++----- src/Sections/Thoughts.jsx | 2 +- src/Sections/View.jsx | 8 +++----- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index c9837fa3c..5afc9dfb2 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -10,13 +10,10 @@ const PostContainer = styled.div` background-color: #f2f0f0; outline: 2px solid #000; box-shadow: 8px 8px 0px #000; - width: 90vw; + width: 100%; + max-width: 700px; margin-bottom: 20px; box-sizing: border-box; - - @media (min-width: 768px) { - max-width: 700px; - } `; const Title = styled.h2` diff --git a/src/Sections/Thoughts.jsx b/src/Sections/Thoughts.jsx index 0c14be28f..46387c4a2 100644 --- a/src/Sections/Thoughts.jsx +++ b/src/Sections/Thoughts.jsx @@ -9,7 +9,7 @@ const Container = styled.div` flex-direction: column; align-items: center; justify-content: center; - padding: 20px; + padding: 15px; gap: 30px; `; diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index 2b957a343..e319670b7 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -8,17 +8,15 @@ const ViewContainer = styled.div` justify-content: space-between; align-items: flex-start; background-color: white; - width: 90vw; + width: 100%; + max-width: 700px; box-sizing: border-box; outline: 2px solid #000; padding: 20px; box-shadow: 6px 6px 0px 0px black; margin-bottom: 10px; transition: transform 0.2s ease; - - @media (min-width: 768px) { - max-width: 700px; - } + overflow-wrap: break-word; `; const TextField = styled.div` From 18eca2380308a66fc27489420fc2b89e2edf7a7f Mon Sep 17 00:00:00 2001 From: Sofie Date: Mon, 26 May 2025 16:06:25 +0200 Subject: [PATCH 43/72] updated fetch url --- src/Sections/Post.jsx | 2 +- src/Sections/Thoughts.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index 5afc9dfb2..178b4bc79 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -158,7 +158,7 @@ export const Post = ({ onSubmit }) => { ) { try { const response = await fetch( - "https://happy-thoughts-ux7hkzgmwa-uc.a.run.app/thoughts", + "https://happy-thoughts-api-4ful.onrender.com/thoughts", { method: "POST", headers: { "Content-Type": "application/json" }, diff --git a/src/Sections/Thoughts.jsx b/src/Sections/Thoughts.jsx index 46387c4a2..57e7e89eb 100644 --- a/src/Sections/Thoughts.jsx +++ b/src/Sections/Thoughts.jsx @@ -53,7 +53,7 @@ export const Thoughts = () => { useEffect(() => { setLoading(true); - fetch("https://happy-thoughts-ux7hkzgmwa-uc.a.run.app/thoughts") + fetch("https://happy-thoughts-api-4ful.onrender.com/thoughts") .then((res) => res.json()) .then((data) => { setHappyThoughts(data) From d3012ddbed89d06fd9fd36a058cff38216638430 Mon Sep 17 00:00:00 2001 From: Sofie Date: Mon, 26 May 2025 18:21:38 +0200 Subject: [PATCH 44/72] update url --- src/Sections/Components/LikeBtn.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Sections/Components/LikeBtn.jsx b/src/Sections/Components/LikeBtn.jsx index 44146cc04..8d57f0a55 100644 --- a/src/Sections/Components/LikeBtn.jsx +++ b/src/Sections/Components/LikeBtn.jsx @@ -49,7 +49,7 @@ export const LikeBtn = ({ thoughtId, hearts }) => { try { const response = await fetch( - `https://happy-thoughts-ux7hkzgmwa-uc.a.run.app/thoughts/${thoughtId}/like`, + `https://happy-thoughts-api-4ful.onrender.com/thoughts/${thoughtId}/like`, { method: "POST", headers: { From fbb31ab75d4cb24f3ab69bee3f0b5ec90b8ff7ca Mon Sep 17 00:00:00 2001 From: oskarnordin Date: Tue, 3 Jun 2025 19:27:17 +0200 Subject: [PATCH 45/72] Update thoughts Update thoughts --- src/Sections/Thoughts.jsx | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Sections/Thoughts.jsx b/src/Sections/Thoughts.jsx index 57e7e89eb..2926b4b6a 100644 --- a/src/Sections/Thoughts.jsx +++ b/src/Sections/Thoughts.jsx @@ -1,8 +1,8 @@ -import React, { useEffect, useState } from "react"; -import { Post } from "./Post"; -import { View } from "./View"; -import { styled, keyframes } from "styled-components"; -import { DotLottieReact } from "@lottiefiles/dotlottie-react"; +import React, { useEffect, useState } from 'react'; +import { Post } from './Post'; +import { View } from './View'; +import { styled, keyframes } from 'styled-components'; +import { DotLottieReact } from '@lottiefiles/dotlottie-react'; const Container = styled.div` display: flex; @@ -53,15 +53,15 @@ export const Thoughts = () => { useEffect(() => { setLoading(true); - fetch("https://happy-thoughts-api-4ful.onrender.com/thoughts") + fetch('https://happy-thoughts-api-4ful.onrender.com/thoughts') .then((res) => res.json()) .then((data) => { - setHappyThoughts(data) + setHappyThoughts(data); setLoading(false); }) .catch((err) => { - console.error("Failed to fetch thoughts:", err) + console.error('Failed to fetch thoughts:', err); setLoading(false); }); }, []); @@ -73,14 +73,14 @@ export const Thoughts = () => { return ( Welcome to Happy Thoughts ❤️ - Trying to make the world a better place,{" "} + Trying to make the world a better place,{' '} one thought at a time. From 14f597b200e6a1bf2e7f2cd19ac19aa60f64bdc5 Mon Sep 17 00:00:00 2001 From: oskarnordin Date: Mon, 9 Jun 2025 18:49:13 +0200 Subject: [PATCH 46/72] Connect to backend Connect to backend. --- src/Sections/Components/DeleteBtn.jsx | 27 ++++++++++ src/Sections/Components/LikeBtn.jsx | 20 +++---- src/Sections/Post.jsx | 78 +++++++++++++-------------- src/Sections/Thoughts.jsx | 13 +++-- src/Sections/View.jsx | 15 ++++-- 5 files changed, 92 insertions(+), 61 deletions(-) create mode 100644 src/Sections/Components/DeleteBtn.jsx diff --git a/src/Sections/Components/DeleteBtn.jsx b/src/Sections/Components/DeleteBtn.jsx new file mode 100644 index 000000000..895372808 --- /dev/null +++ b/src/Sections/Components/DeleteBtn.jsx @@ -0,0 +1,27 @@ +// DeleteBtn.js +import React from 'react'; + +export const DeleteBtn = ({ thoughtId, onDelete }) => { + const handleDelete = async () => { + try { + const response = await fetch( + `http://localhost:8080/thoughts/${thoughtId}`, + { + method: 'DELETE', + } + ); + if (!response.ok) { + throw new Error('Failed to delete the thought'); + } + onDelete(thoughtId); // Update the UI in parent component + } catch (error) { + console.error('Error deleting thought:', error); + } + }; + + return ( + + ); +}; diff --git a/src/Sections/Components/LikeBtn.jsx b/src/Sections/Components/LikeBtn.jsx index 8d57f0a55..b600e8f06 100644 --- a/src/Sections/Components/LikeBtn.jsx +++ b/src/Sections/Components/LikeBtn.jsx @@ -1,9 +1,9 @@ -import React, { useState } from "react"; -import styled from "styled-components"; +import React, { useState } from 'react'; +import styled from 'styled-components'; const LikeButton = styled.button` font-size: 24px; - background-color: ${(props) => (props.$liked ? "#fdafaf" : "#ebebeb")}; + background-color: ${(props) => (props.$liked ? '#fdafaf' : '#ebebeb')}; width: 50px; height: 50px; border: none; @@ -24,7 +24,7 @@ const LikeButton = styled.button` const Heart = styled.span` display: inline-block; - transform-origin: center; + transform-origin: center; `; const LikeCount = styled.span` @@ -45,28 +45,28 @@ export const LikeBtn = ({ thoughtId, hearts }) => { const [liked, setLiked] = useState(false); const handleLike = async () => { - console.log("Sending like to:", thoughtId); + console.log('Sending like to:', thoughtId); try { const response = await fetch( `https://happy-thoughts-api-4ful.onrender.com/thoughts/${thoughtId}/like`, { - method: "POST", + method: 'POST', headers: { - "Content-Type": "application/json", + 'Content-Type': 'application/json', }, } ); if (response.ok) { - console.log("Thought liked successfully!"); + console.log('Thought liked successfully!'); setLikeCount(likeCount + 1); setLiked(true); } else { - console.error("Failed to like the thought"); + console.error('Failed to like the thought'); } } catch (error) { - console.error("Error liking the thought:", error); + console.error('Error liking the thought:', error); } }; diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index 178b4bc79..c4ee2f6ab 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -1,5 +1,5 @@ -import React, { useState } from "react"; -import styled, { keyframes } from "styled-components"; +import React, { useState } from 'react'; +import styled, { keyframes } from 'styled-components'; const PostContainer = styled.div` display: flex; @@ -27,7 +27,7 @@ const Title = styled.h2` const InputWrapper = styled.div` display: flex; align-items: center; - justify-content: space-between; + justify-content: space-between; width: 100%; position: relative; `; @@ -50,7 +50,6 @@ const CircleText = styled.text` dominant-baseline: central; `; - const InputArea = styled.textarea` width: 90%; border: 2px solid #7a7b7b; @@ -64,9 +63,8 @@ const InputArea = styled.textarea` border-color: #7a7b7b; box-shadow: 0 0 5px #7a7b7b; } - &::placeholder { + &::placeholder { font-size: 13px; - } `; @@ -96,9 +94,9 @@ const Button = styled.button` transform: scale(1.1); } &:disabled { - background-color:rgba(253, 175, 175, 0.47); + background-color: rgba(253, 175, 175, 0.47); cursor: default; - + } &:hover { transform: scale(1); } @@ -124,7 +122,7 @@ const PostAnimationContainer = styled.div` top: 50%; left: 50%; transform: translate(-50%, -50%); - pointer-events: none; + pointer-events: none; z-index: 1000; `; @@ -134,19 +132,18 @@ const Animation = styled.span` `; export const Post = ({ onSubmit }) => { - const [inputValue, setInputValue] = useState(""); - const [error, setError] = useState(""); + const [inputValue, setInputValue] = useState(''); + const [error, setError] = useState(''); const [showAnimation, setShowAnimation] = useState(false); const maxLength = 140; const charCount = inputValue.length; const charsLeft = maxLength - charCount; - const handleInputChange = (event) => { const value = event.target.value; setInputValue(value); - setError(value.length > maxLength ? "Your thought is too long." : ""); + setError(value.length > maxLength ? 'Your thought is too long.' : ''); }; const handleSubmit = async (event) => { @@ -157,34 +154,31 @@ export const Post = ({ onSubmit }) => { inputValue.length <= maxLength ) { try { - const response = await fetch( - "https://happy-thoughts-api-4ful.onrender.com/thoughts", - { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ message: inputValue }), - } - ); + const response = await fetch('http://localhost:8080/thoughts', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ message: inputValue }), + }); if (!response.ok) { const errorData = await response.json(); - setError(errorData.message || "Failed to post your thought."); + setError(errorData.message || 'Failed to post your thought.'); return; } const newThought = await response.json(); onSubmit(newThought); - setInputValue(""); - setError(""); + setInputValue(''); + setError(''); // When submitting - show animation for 3 seconds setShowAnimation(true); setTimeout(() => setShowAnimation(false), 3000); } catch (err) { - setError("Something went wrong. Please try again.", err); + setError('Something went wrong. Please try again.', err); } } else { - setError("Your thought must be between 5 and 140 characters."); + setError('Your thought must be between 5 and 140 characters.'); } }; @@ -193,30 +187,30 @@ export const Post = ({ onSubmit }) => { const circumference = 2 * Math.PI * radius; const progress = Math.min(charCount / maxLength, 1); const strokeDashoffset = circumference * (1 - progress); - const strokeColor = charsLeft < 0 ? "#e63946" : "#7a7b7b"; + const strokeColor = charsLeft < 0 ? '#e63946' : '#7a7b7b'; return ( - + - + {charCount} @@ -232,16 +226,16 @@ export const Post = ({ onSubmit }) => { {renderProgressCircle()} - {error && ( -

{error}

+

{error}

)}
@@ -252,4 +246,4 @@ export const Post = ({ onSubmit }) => { )} ); -}; \ No newline at end of file +}; diff --git a/src/Sections/Thoughts.jsx b/src/Sections/Thoughts.jsx index 2926b4b6a..b1b5cb9d2 100644 --- a/src/Sections/Thoughts.jsx +++ b/src/Sections/Thoughts.jsx @@ -53,7 +53,7 @@ export const Thoughts = () => { useEffect(() => { setLoading(true); - fetch('https://happy-thoughts-api-4ful.onrender.com/thoughts') + fetch('http://localhost:8080/thoughts') .then((res) => res.json()) .then((data) => { setHappyThoughts(data); @@ -70,6 +70,10 @@ export const Thoughts = () => { setHappyThoughts((prevThoughts) => [newThought, ...prevThoughts]); }; + const handleDeleteThought = (deletedId) => { + setHappyThoughts((prev) => prev.filter((t) => t._id !== deletedId)); + }; + return ( { {loading ? ( ) : ( - <> - - + )} ); diff --git a/src/Sections/View.jsx b/src/Sections/View.jsx index e319670b7..b57707fd7 100644 --- a/src/Sections/View.jsx +++ b/src/Sections/View.jsx @@ -1,6 +1,7 @@ -import styled from "styled-components"; -import { TimeAgo } from "./Components/TimeAgo"; -import { LikeBtn } from "./Components/LikeBtn"; +import styled from 'styled-components'; +import { TimeAgo } from './Components/TimeAgo'; +import { LikeBtn } from './Components/LikeBtn'; +import { DeleteBtn } from './Components/DeleteBtn'; const ViewContainer = styled.div` display: flex; @@ -16,7 +17,7 @@ const ViewContainer = styled.div` box-shadow: 6px 6px 0px 0px black; margin-bottom: 10px; transition: transform 0.2s ease; - overflow-wrap: break-word; + overflow-wrap: break-word; `; const TextField = styled.div` @@ -34,7 +35,7 @@ const ActionsWrapper = styled.div` width: 100%; `; -export const View = ({ thoughts, onLike }) => { +export const View = ({ thoughts, onLike, handleDeleteThought }) => { return ( <> {thoughts.length > 0 && @@ -47,6 +48,10 @@ export const View = ({ thoughts, onLike }) => { hearts={thought.hearts} onLike={onLike} /> +
From 3ac2d2305c051e5732cb87c01be2d720ca071749 Mon Sep 17 00:00:00 2001 From: Sofie Date: Tue, 10 Jun 2025 09:11:35 +0200 Subject: [PATCH 47/72] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 877f9eba6..a24ed7606 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ # Happy Thoughts -Happy Thoughts is a messaging app built with React that lets users share short messages with the world. It connects to a shared public API, allowing anyone to post and read happy thoughts in real time. Messages appear in reverse chronological order, with the newest thoughts at the top. Each thought displays the message content and a like count, which can be increased by clicking the heart button. - -https://reliable-truffle-5d0fac.netlify.app/ +https://smilezone77.netlify.app/ From b6ebc5e04dc178dd3f3376e2b58871c74b07eebf Mon Sep 17 00:00:00 2001 From: Sofie Date: Tue, 10 Jun 2025 10:36:02 +0200 Subject: [PATCH 48/72] update img --- public/heart.png | Bin 10844 -> 75422 bytes yarn.lock | 638 +++++++++++++++++++++++------------------------ 2 files changed, 319 insertions(+), 319 deletions(-) diff --git a/public/heart.png b/public/heart.png index 4e1eb4c8981abdcdbb958d20a6db1afc85d18544..8cc53cf9bf87e0e9108317f8920d6251d9783e8d 100644 GIT binary patch literal 75422 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 z zA@s;AqA0l~WeT2dEW%6qm5%sAJu5 za~~#+%L7}rC@9Y3(rtF{{yh(blw9K^vb{?DFti2#`hM=Fs}jab#`_Z;QBDSqIKcZj zKH36sfP}XR=$Y1gUrTi88#UJ#xe$1s$7ha9S9jc#J!gHMlJj za(DkN#(Y`Y3^A}}-^vESg-F+(kNfs&ZI-0U{-$~#wdris4G8e2q@ zkE=pe-Rd2Vr3yzW2lE)~8)aamajW_?;rB=#^eb>eNP+$OmmVG*B8 z?RbO#sZjheOG5>p5pj+HvK!_Y!O6QzkprhwRaM-{UN+S6ZfR+u8CYjR zX#wLIdFj@HTn1QAcI z+2G4s-T(j}0KlN2#Gy>^jZBKOD#S}`*vQFTBdZ)}e+mB@eY{uV%B#qqFE(A3t56~h(^K2xD!O^?^uu!0heIBYSg`0KUyxN3A?r_A!S3@}i~h%yxzDO| zgEi}Qp*BvWO|@{UmS}Rb8M%>9WFCY{{Z%Je9y=`uACd?B`J1b|>0WbL)&*6j6$<-f z1<}X0b8((kDr-%MtMNXPUY^%wV^zf8cio$1)f5<=bGd|abT+xjF*{? zz`LWD#gpCV(=nTcQ~9ZnQGW@rO(H1U*2$Dl6;k0?K6PBtBGuj(Qb9&q1F11dj+|6?38wP5s9J)_5&KDy4+ zLghltEUbA~7v4l^wROV-iiwshCW+GkVf~1Q{(>c3`hxZWreL}9u{|2 z#RngnNN4}{S9bBil-6vVXYQwCzl{?AL=?~0z8Yf+;?&5(y<7U#~(f%rN+S7%gRMCOQo+YQx$#!D2ZPQ5+cj8P|Uajv7+TpTPd z3AveDs$L4Gz9M7XNV3-umFhyY@|F9c8ERc$YYC?-q2?awe)!xrmUAy@QDmPc|EhEw zTZySlvYm~CwLxnLnws7Pqk+2^Rc}rmsf?3pZo_qUHN=+OSz%O2a|dXV*$-}IbKqEO<`PR%!*&<9?8Xi@>5w{8+H;aB&gca{kz~Q8T_gFrVlYYGcwJ`#fr- zEHFFH>AK1!(P7(k+Q!ZgCSJd`Diz{@iJqUEkKjZ5Wa1?_Req6?)Kwj_USfM%kqVbk zh=G@+Yy(bQHYK>^Y<{@;8g1g2`PU7{-pSyt2FBrnO4rR~wce`fqBIZ_aA7~|$a8oh znCfjiZ)A*&2Rng7J+XzPh%?8wSBq(#kKQ-84f$^VEiR*JW-keX3kN#1|EjpcyW4&{^x z{aXXHc{`-Cn$$Voc=l_2GnliTjxD}fd_}J1JAxwwm_u`lNl(L>W}%zetBavv-#RT` zSJ&7nl$d+!ASI^#AN_XzHe3@dGu!nL}+waOm5>!ODf$JTgyLv<>GpoUnB@9eBV+t zNnx-bP(KG>{-jmWubhFA30wlDCj*)En){JWPd;`#J$uh@3wM|ul-%g4`)u&8k=Q3s zVM9%yM4^GK+h-3hf_u;TI3!l_&6JH7qT=zK9=EZjZ(KD0OchOCdChLPCkJKyv+d%D zH#9D^`Vdsd#sf$b8L!KU@Hj5dZcU05Y+feQJaQHiErA8btZ8uONbGTF(ZXZ3p^?jG zv8HEqMB9|LKF&wbk(KM@n&*MZ<~erm7K+rLzINQlIb{9dNjL279j^HDVVlqiSJ!L%H-Otf~iN!j`JX(r-r^teLYXy}e|y38YC5vgO21S>AgKu;8bH z8_O5L4R`*d&S{qS&1H*Nln?nhg~!2ncf8;CB{lq-#5GE1W$ZZ@_g}L9JJwVYnqwAn z1mEiI4zmVo4+b6N*+@xbZpG7e1Z)-6tfuW6?~dDejLp@oZeHf-+w7SIlz%3H_LrRC zEeuv1xi0K#O_m&lmkBL3i@?|}W4L!?wh{QY`J4WlYo<6qhdc~gc+EDHFyPi+K5*xRT#9)CM?Q zb-1+tG$a1P;l$wiGO~a_a*I-MH~25|km72V=;vO%>q8&cDcj0?!15b8yd-&k&i(P~ z73RzpUK@r)p=Nkck~tN~=df~+tG(M=<)Fh;?#zV2|o(Jv;Ag+JF@y&h7XW>#vZI-@FETP{aY z0m>#1SFuLEKH1)`%NocSBvKH>uS)zM?6ymWE=Cev~4d!$0#L^EJZ|&Ua!WSjirskzvH@jsV{~(Ul#dROMc(~3FW9Uq`_CkT-zV`YbwLBLM66( zT9xCwHO9}(B8=chJpXjG;pcgNFtr}z(b@-M)Gx&46pdjzztIk|-dd5t_4Jp}IzPNP zQg12$0wZm4!b*;&8jz*pr)>I8rAPJ)Gn0qMns@rnEAVv2CwM z4==_2cf@>-(9St)F>>W-CAxBvGa}>tMH|{v2X2E#UB`Bt$_%tbGhnqDG!(L6W?GMs zPNjf`Flbn-idZAwGL*-T#$=U`C$wZS$7f4{pBW?PI|AN3WB0$Yv+eo0mK{?&mR>rq zDY`#uENt^u87OP-NGhnp;@gE9@fNkN31IQnv__H`?AnP6I5@}hkfr=T;*q=9zy?q*lWe8EIC z9k`JOHC|Zh#41sHO=c&Xp%bgSQR(8V_m@FWR|oIkzmEFu$M}n@(<0ke)Kc3n9yYvf zo^qbS5&1o>5lH$g%Gz}?+2g}J0Ax8l0PhVBC1crIgH;e}Az_q2QyznSJX^_gnU*!N zY|!p_iHFmY!*?(%cQAL)B0zfIdL-SE*VW#}@%w%09xUNkhXRUs%)LlVe6F0cC*bGi z;1JJAOtb9o;Z4S>(~v%CERoUlBT6g0F9ybEySmwP7z?Yb-1R}s#802AaUeO(k$NY& zHm6H`sWr!vo>@4HCXGwj?FBstTpuT-v@R{Fb_GU9etKVUKmEuQD1sZj{4M6Aobeeh z-6)&aB4-}d2`}7|jIDV2ui5-$*%`r7fNgB=Jh_5?06Z=uq~JEoz5};5ERC7xMOyNg zZX6Wj2rZ~e1U}q^^FPl7+s^gE*~1Q>nuLKmCf!BElMc0?^YQH~)jBk>jQFpIUj1uE zQKfewF$_Wb`DPQ17{%sT;b@|@chZN4T8z#NJbUVQd}qO$)Ixe6ZPCC1h|)L(>t7c- z#`cZVA)q`hioe=&p+M(#uNT@X{DUniuFB(+KO1XP7j5irxJo#sW7GFM9v4Ng@<$sT z&kn&YeEqdb=|=rWrHMEmj=tSHq*;^`Oyo#GRx$I~=5xbz*@No&eKSVO>!Dj9XDf>X z?v1Sf1}e=hUf^FhYJ0fP^x66oArG?t60FCYv}Hjixjz3sP1Xly`~`B^302WLac2q} z+B=TqVvbN_7L9sZXJ&sDB)+%mXnN)&f{{i(*! zWBgRhgV$>Lk(Wf1bH8fj_an3hGj;wGtei;WG^^@=P%(Ni+s(hLp;hvwoiETsDnoGX zR@f9C=HEVWGE<2C3BSJN=mZrEI%a=GAf9i$8S2=&PjzApEorePoS#GOt;PZ0{+P%x zhVcU?t_qr)BIh@wjss)o<)gsN>Z*jvp2)h8`VP5&fbTMv&?$#30qEhx^X|P9vHsv& z*Cn^p!Kn?OT9+-pAm}*7?mk3Bm*45$&?xOJm_OM>M_VJ_84RldN0r6Op}8J(o?E;p zDCI-fZWGC&(^--s-aqkD&JfHlnM7(fH?^Bbh!vBmJhNzt++y;we%e;(aT)NfbKCrm zdN`=^H0yaag0W$}=K&bFh`mDVV8BJA1Tr4yYZx5VJyk|XS^qThBf?1oa4GwMbJpQM-Lvlq#h%bqJeol%CVf^H zq`cd$Qv5*64fk``5Ho&=p22k?v?HMY=@T?% zSMdj1OIc&G1+E~S2^L*HI zyW|XbvA9&q#*ZJ@cq&pz1rbkm`LWD~c0@E67;}E)ptbG5EK045#tXU;rMmUY%*$ww zm4i@iv%0ny;!nV;MhA*xL93v@-e4D#HL(5ty(;KAdvr{UHs8;lo54)? z`+e%Kd{`n1(J5)(a+zWJFHj60A8q;dwn{cfU6BKf5u8^(! za(68cdu9z-Buci*S94f1Z9exK{~#kS6VX`%Dx~C<3F%{)tNv4ZvoREfRLUP1wI|6uSsEX zKI?FI=%kRKP8 zy3aQq<26+gdb!2Vx%p*$to((G^A5vJE$TWN5Mpza zb8pa2iruV=39oj&9Osq>s}3a^PbAS{rybiV(x53wt_%BXE``@@nWDROT8H%w{O#FQ4sjp)icc%!&PJ+B#n?O-)5_|3#=GGUw*6E1QOp{j#fB>?= z4|tMphaDM&p-HgIDC}Dr=!FzpSr9XpT?%|2uVbj5+F_~?uNN}FWe?ZG0Yhof1e7n} z{C;czt>z(1jyeYVX}1+HD+277KrC3Tf$r2^Uv>C_ev1j4#P=NOLH)z5h3%;updB}^ zwNK#CThEhEF+E`SiOn|-igNF%xU&C(Nul z*EK3J%@57Ky}3)n+o7U}zMn0LA6jmSpw6Pu7Uw7Z9V{^k>`w)gZC=;Op7XQm9j1hA zE<7K2zEdMS3vLwu9{>?S?!MvgGHo>HHbXnpgmBEJ3HG3%p`#x3UW`EPAflaNytuO7UwifKxm?7Q9IBu`ef?+N`BV}PzD8GT_;f?%eS3Sro!Cm*gF1;J(a!}!Q z=el-4L|6;LlS7k`>h$}sYd2g$UQup2O;bDDrhP5P^@Z2v>mKLx&}F~Uh0>RWxk5VM z2xTvbfY@L;?x7!9#AXyFgVT2hpM3pxW#t|rhbpK6;OvWU+=v%1tS9>9kh6IM*lgY) zJGM4G_C2h52)-`8xoN_E_3?Eq+FXwy2*N%}g1Ac9mA|)DddhiD7JD%5Yx!?tGn4GI zxaRzOg^V z`pT<|+cw;%kO7l((q*At2xeg46e}!)q5%SJVD*oqQI9sxfATBezVPzjITUlOGDkvC z)7jVVoPOprZ^80yW*!3AcXR0g1=6Duc5ONmZdjY%t{@0PTc#1TP5HD@G<<2=hUZ~* zod+t0wD-4_?uzd`%=MrJ0G#v@C`LjLhFcGZ>ldDXN z_geJcJ8R3^-yi6Z!jCY($EJrRL^#viLu5l(04noaYQZ27lp??qG-)sZQUGayEkMeq zHrW=uR z=M0aJ0ms*LcFyfJRr#Y15dahKFim{2_SnIC?W{d^p5pJ?6FytN*Vkaq?C<)J?WBGA zd!OHocF?}-_dUJC_7~0ETz)aUTbqF$wV_ifpXmMbsA?~53J3QOPgNaJZLktEn2i72=k*t?)`9`Zu9}!1NQ1`F@^1G)#@!HLJ>8Xt< zM%1?>EF*ye5F;Gl;Cv|D`Q9{-Q8i~=7r%V2j&hz=LqKg_vZ^$7@%N?4kMnM(APC2n zs`jd??V3YDMR`@_m&1I=K82?1lwVbzzOsDxj+v1p2F4h0K3ocbnZTC7Owjl+QVVA` z&R+V;&HnXYJ~G-gaKr>P0G#;r7v3HXp1n1~;wDE?w1^m*Eh6rv!z5Xc2>Ef|L$dYe zTR^)9na3+rCHSjo6JC{PQ+Z8kvoEc$Q4oYDn3@iKof6aLxQmusr$AMm>k{7fFWuo) zAs2hr0!eIBO*^qjR5Vn}&#ezW_0=04?&>4q$O-DDi*MXne(v?R?wM1!N47U4lb}Z$ z)=*(%4P&$YTDh3dXk)(BMOe2L;7x+CDQ`E=x{gJ;+}iro`~U?(cyeglQLk%9n%bbY zLb|CwP4UX{+gwlA_B>rXq|-G>mS7TwF$Ol39nsyL{>H`6{rpY3{K}Eirhy|Ur~%-@ zmwx3tCtvvdx08j{jl`&k;|MTj!Z&EK>^|GM%ym}=O!tuUbYVjFI9Vj`VHg^(_Ub^Z`qJhYrTpT7}$IF~%!CGW<)c}!>f*{!J z_ZM$I|HZ%k8?xZm#%;PPXE-iZy^Y8TVsZboz;33dw-+F%jJ8}O+Cyy zd@rK!C98_tCO_XfK@fzlbZK9@3hyrQ>hfGd+- z(+s5)NK@g{8k(W)*he%g0%=wFlTK}?Gdn>=fL3E))tMh=jd<+4TBSa&3xC%cRlcb6 zbGe;y;m?{JpV)c14rQOyxr4T{pXwYNH21s60Z-d7US^QleZGYFZbF}TGeg2|- zcGl<_Hg2*y7!=232?TI3Dh7z6!Grg2zo$R_zkK%Z-TbebZ{Fc@)LRBTd*#J<_SE3+Zg3(Z8-wE*niFsw zf!G3Mp;Q2dDlW!tF7qADTx0&G9$AsjRv)AEa+iOcZHIW8!hMJaEeOIq=`xyE2VFgamPtWQ`i<33zVgmJKD~+2DAGvKgF#>uaJ&bNR6C8b-Di-QX=P&@#e=f>`Haek zo1PeZS8;lb6M`GrM(_D4PfyqPBk;`yRSm@#-)n|{ruh>D;qj$ONohJB3p^A~F0z0L zXBXx4b@|i{Q|Fp^-hL~__&X-I2rYb0XZ3LZ+_g)tt4kf<$8NBMSoLr!{wP``yFnLU zyGdX8)g!mcyUdXn)U@)s2d7_n_3bAema26E1N>v_r!gSYZ%NNxMkzRn+i?G87!<{{~e(}|B z-so_P4~-))r~#n&(l34I?5Dr{?GgGLkqIJ`P-^>T)179FG3mbF73N#657IVTWtFfl zdt}L9(Bfsa`-f{>ngn<`UY+1>qiG*@Lm>#l!7=OayGuLbe&)ySob!a>%+7VGZ&i4% zaFm5~e!i+Lo@le3{WbEY0yNe|9oyv@zcyP96=dy_x#g6@#Rtf9kWwet5J@ z8@n7vkx?KOfSF;9NriR(pqw6>dki!SyRt@}1x#qnc|Pu3jk|cQ>q}Y{UXI(8Pn&WD zK{)=*t0UlRKbn*ZS6EIAe>c?C{oZsP04Am!;V4k9#+{#6z{D}T?R|yN-Z2C8cRn7T zSs2`2`{Lhti!Q!#ByFavI5vVB0D7PK{M&=o3%95@*n|!vty6O>X0z`_m~a`{@M4x< z^19XD6LCuQV&+CWw`qPv)1*J_9=#w4N1HC~OS!!)6ccBf&lRw3%dc&VD%#t!Z|R%~ zztY$*r1vRgmJ!oZv|#o&>|XTkXMXlqzSFA0M}#BekGc(X@#}Z^2mkkP-2LzWgTd*A zkG?cgXVyOEQ(OF8bM~e3@{jAfC2_nY5;FZfeE10 zL3BRW1C`mw8W2(!)C2}n|JIDcemKm{7&G&09`FC2p0ix|wkD+E%Az=z=QH6mHn+`X z2D$#CIkVf%KQVSEU1iq|AT?)ez*>(Tu=3bxTA!Wu5%+iPvGdm6^hev@wI7ea=9Z0d zJsvx0PxwLmizc6)xX+Gx#`?3@4%%bKP5XzfT`bJRP_lN8fznFqQa%JA0i_x(VeGvS zT$~FG6>*ufw$YB$TcT9(X6e}(!L-a!$kLlM18V?S1i4dF zpBneHG6VXmc^KtkTENT9eb*mfNDc7M~ zm#R8e(M7Ws1VPAYt2H-~3-IzBb$+g?tpiYW2;4Tb80v0Oex7%Es*$o!4F$Fe#sb#F z2oWRH5f~976Ga$Y**N#yU%J`9{>HIbK<0An1T_FGeC0p?Epy?s-zEeb%kf9i67L~` z0y10bbhn!P7(n(tpWnzIY`!xNfC*t;tn4n&kvK0^<~TPhOv9m&?K8X%hzw6x%%d@SwQA;ECn?HT>jE8e(T4(YMtU} zsM&y3FMVLnmT_#5*-)dfr3O&DYH-2}SN=UOuw*Y?7S>Ha-Zq+bIbJ!u?uS=3THs4B z2*Q3ImyYPH?L(802C@xDvh!~H=@Yi)g_*aS#yy2v;% zBXF{fh-kReKXLoar@r4m=@!HSbj2EBU7_p9$Buclk%>*<&(X?Tv$`Xi(2=?$f@i-R{Y?q;+N02Nk1(j$c4w5gBGNZ zlBPDIDo)+`^0|q5YNzdNeUCgs+O1FduNd*nG;7!98kP~5z0`#z`bap0!Xg+ahxX*v z^{4;RzjNgG^KRl;3u?Of#+|3W@bA9Gr!U>6czZa0peTfM`ke})%AEEH-Q)bveUZSW z`525}pz?4{-RAIZ1a#AnqI}L5$Cq9Zgrm#6Is((SA9dxpLOK`Bt|kp0uluR0Z*lC* zNl*AwC@DI1_08MmvY;;ne!K@Z7O~YZrWeKByN~efJFB1gske{I4rFy4Ye5YFFZ}GU zd}mLc{B}P`Hee~**9*&5fxE&Qz{Igjnr3`l;BI>2;?7x@)0EEDy@Xw8%70dllg1zj z$Bjqv`ckLQkVattB{L&0!wsPxkM$&(k~ zKJ%p$zuEZ)95If(Kk7E@{Mm0``tG;?`QN+tqksID(Z95|8=Mb^Izgni(C_VHK#S-n z1K3^yR+$}h=Brw10EN%!AhktQ1Xi5d?W)x7nuwsX&)f&K>(3f0-AC3^8i#?guj$;* zI^f+-^Lz)(MmO&<%_@TS?#P3 z7QdbJZ2qEs{+xXc|3TYH`!?;c95;r0@1L2Ezw5fuG=*lZ*&aXy7Uo#>| z`R^-Nf*fm?bXc02M-`K?W^FA}d+9t4GpsV;+_!YL&Is0mGm9P0%C?391K7mCI#Zn= zE&!)LTE>Z;`%y9&-oAV4)we$TAO4@e)_l{C2ghEc27sk2U%hkXGq1k2r!U|BIKgl) z{s2Au5eBT$ix*&xh6&OinQ|I)1*9*5!?<@g*>lXb=DZh|$1QTR)#;k3>T$Yh>K;y~ z9dAO;lM z(m?5BX1b@lUsb)AnfDz3aX<2AzWjJqud1uNDo^z5m+$7iH}k#9dw=(wdw%C&a0R!$ zboV3QeM3^Qs$^FHH2~ax;+ZeX(eHhJy?^M!DEn42%dg^qD9n!bgA;`$8hTGb;|*>= z+N>%G;!>kY9^|CTVIl`sTNpNQ73UhX z1!-njWsAWqfM#S_oLo#7F5LVb-@Cm3Z8u(+&?ebcKn(zgA9(!C!8^a_Tsm{t%H>2S zT8+>nfQCK0Dr2iv!)w-Hqg}g)t^mRlg0<6vLvRLAe4x?10(Ju;jPm0&>ni#}xxG8C z8?4uABDv8umQHr3Y*f>`*3a)ouHUo}ubU%6K=$X$AY5@DVcl}-ND6>_lKXEuPa+-n5fl2h{V&9)J0+H-Ge5J^zN~wSI3U zjaQS1G-zN$j0#yzwSs3Y#fLY1xI+_A7>cy)Oa=tt?0ADUW4sPjJviHXA&sG2w_H|r zjZQl0Wc%e>0e#*0ue(lI=H?QoNr#p`Z_z8gLTYNceOvhC^8MBUH-Ox`n_W~%Ghdr| zI)8WPj3y0$B>~e)didD#J#YQ-XX&QLZ^$sAO|t8N8UXqaec*-JBM+a-`m^Ub9u6QG zFzf~1+F|NP2ad{vq^VO}CAu=-F7R|L?@xzP4zcIjR1K&~o^}ZSEiwskchX5GH?Fh+ zak;E&&O*c7(==~{?Z@V@ntPZ;^Y_OhfKX7b#+-2Tg+Um$lm-wvzi{V0rxqUn!53=3 zzzr-nR6gpB$Q>W~yPtpQe`~PB>H5Bf1N-~yN@0|xfCAz;Mqd#`Qban1A_l8I z05W--MOoIRKtTZnu(mu{WjNRb0fh5J$+64VYB|pY!yUF|F$ek-1|k78Cl=(b zwyZ4!N6dVgLfiWx2pA0a2Q_UZTf-IEkJVJ+pc33fYe;mKtj#W6SYNpJ`Mclu>z{A_ z1KhZ>D>Z5-54`(FPY)LFJD0`#S1`Pqa5@C(1d3BcSq9PO!Pi1yQD&Ukhb-SWF`Bj` z;yVd7T(41AtT@Z7*aAq6slXly9?z58u6}8mH z_3z?Ggds$I`=G2aKL*D|%Vek}tHM2m*K$-Wa}O>M3!pf~d;}m}$1q8gG+tOq7H&WH zh7bJc=}CUC8&!5SP}BWC^zz}yo;v+EquKMEtPUt0VMZ7|){tZkJRBPDM~a{k`v(M4 z%xUfSvVp?hbCp+ic@L)y*8X$gfQDdo><57q>(uU-hkHrBX|=iOTJ522R<8H^>tvUU zH^0`rrtW@goY`v4$&PJ;e7^8=hpkecpMYS_DLIRUeT@Zl3LI_AWg%^gZ0w4HCM~cO zEb)%LZtt0`bFbq|i=|(Q2C`9x8DT6^ioP%gS#Pj9d)xV&-uUj*bpH?Sx_#+Tb~R7~ zz`=KX@{6~=<$Ip*%^bWS8i@j-uLvs3z{v=DlmZe%OYHf2Ay^j)`1u1EKBQ&tVc|gy zz*>TKWw7=Sdf=>99!zb6b)v!CARSP4awE%be}3z}M_4`yNQX)QHSna%kr)ecCQ9>| zcc#^BfSJo6EdT>-K{o_x6MhsXE0z|3xxkk;UfvAWG5R9tX9HAT%1LF{12q8L`NR*Ner@K?bE_k)Bq@?K(I7GVCM1G1&5&g|N6)P61Y)C@xwy0C z2f6%kmwAdF)I$)r8Z@K`)}ES$@n8f6UN+}-sZ<6O2W|Mi6%*BNp9nkI+p<*}?{;0k zT+balar2L-U^$R>a}VH^2Oy_@iWpEXgLFCYNfB9VHb49!TXvc>xgESoN zY7C^U+1o}Q>!}$a)yPI!lEnK~R%h=xcjPd0BgT`4cb(#NXry400pO!vG}_|*(4hG zPEJH^veVb^Pw{4xr1Ft8!T6!gidSa}exd2b#2>$HIB7JZ~Y`j}Gdy z%^5A40nI*XM;W9=i#2x}Ko+kUSpU~~_Gth4`%nDv>G}KLwX03u zPWA*)1Hi$@KmNtr?tRPiYVpsHuR=ckeDeIo3nlkJq9e*W7Q;y`J>aPyL>IHpMhd2Z-X zvksLI3cg?HIOciPWrf9pbX9vdzZNv<&`aE!#XW!8g?SdEt!JYQnxjN59KCS+n@&7` z@bPDMy~*3jo&jnAIQ;f^pFVW+(mCCmSs7-MXl))U1ww?-)7yZyf50qQ14VDfy0D%= z@rSJfYgcc~iLCTF)Uu~_ChMe=PU_`)0ODz`UtZJ)9m6r5LbghI@-Od6hZ1^+=ksK7 z{wsTz7w$RG=53FGa-wn|hnaiBNNMJt71q~B2~)h%TR42~_9ym+$=k`U>SZ?Ea6N5lM@J0mlNK}2l)&G8Z=%R(v&vfe9Fy4taALQp4X85b$0CBr#yJqUpd|v6 zBi_tY8FbFm7B=xC#AYs04#>>_03ZNKL_t)9!i-+S8qZ=KGl+@M;~^9?)}@Da%;Bb) zD+6A7)A@sM`;pUhY;Tyno$M)%8UXHm;^`M|dgzH$>7m=tYpn+~cnvWpNOe@8DY%Ev z5%$f>&juLrD?stHv*TH-V77KEL7=qa4DKf^3+uRZ1(AF|y6Oel{7l`MuRG~vi)0JO z(MI;Jt9a4{DrrOip(b74I1 zAYBI!*Pu8{dZaJvL-)RT=$<#9-uL)N_l(Kg$({ph09g3o-~IgB!8bi0&+fa>OD-ie z8i0EXd9ZgMIR`!sCR;Ok70=pJxa|H6S?7piT=9~#SnvRs)6Es~QM;9K#VR@+WL4(w zs`KUYvP{yxlTLO*rZ!EBG{3gyCJXl)-uL8P)Qr!Tc>t*9N&B*j?Xs#^-r*iMPzso0 z_msmdgs!ZPCv5=RQD3RRlMeexIWl*irJ!txKBtH{1!+A{jF*PDyyeWo`|f{k;vaGs z$({si0C?a7pFGWTN6yXn;+04^k!Z#^E@<|2fDo)Hc(Kj2H5L?wowGy^){X<{SDF>n zEf2^*Em&9WQI8$Nb3y&uS>q+EB-{b3~lc{9F@m1fv`Z=vzXqS)64z9p>_PwU- z)Xqy@iLi=^bGU`oni+tQb^L<$;O2s|;&{?vcnX#SY3~89W{{=8Xl)&mj4%_$h%+3dlsna*yAtX@%9fsd$o7V@{nd%vXm3p+@>K|hdEGP zPSnsF98P<-yg#3ntE5>&k9&iMgQCn+LvP{5QTe_^q`Y6Mio*N8jZ+q#^x4eJXrLNqF>{*}&fd2RVCoe2K z^5m&>Vd;Fbes$o(*g3!qz}kbhc3Z6R+#5;ZcPPSLB_rGt`B6uTxl#i?Ws9g*M+i3*~7En+Is?u48?aLsYD;O#_ zcROW;b2@8i?lyo8&y9Ab@0^0==1iD+X@ZD>e%yl=g{$dIGUy+@F!#_qm-oH@m;TMf zKjJQwJq^?VaP%X;{`u(U`%W+P;}=EaqG(P+uqL<1;`grWdDhM>ME>E;!P-6Oj#~(f z^Q0vh7-0mUFbGN$MQaiut^?+#)%sS+^*+&dvbSZcHR{b=zkEFDLfUA}=D1*qlYE{i z_c6Ax2+ZYhb5sEAZjLj~U$%`X`?;JmS}J+cxxWs1koI$))@FZN1fZD&^Ea>bjy`zq zwl{rXPixaa2h;$72R`+o=aQ?J&j5G{P=kCG89YQ*@&S>1bLZaRwx0D02l9wv%0J{r z!axAE{6}+vT(d^=z@6lL_<54Lb!DA&a-+$$UMRMW%W3Iy}vZr{|bwc!%e);7uoxJ?H&)m5%`sU$-(duE$?ZZV{z^X*p$E&zGUc-PF000bu zf(BVyf#VyBXv>+l4>~Esv9>u@weB09v;d?Ogv3ys2>>xtfzRzqZgr~2=YY*aijseK zd8P$o`G^6Zm&x+7&3nJVV|M&&flDOqXv{giT7nM(F7a&3JZoynr%Pjev!b--yKYI? ztXqh-)Rs@WWiI8me8b$b?rlk@J?&K9#>3ueo;0=OJ8$~|s4bs#E789tUw9i)y5#{8 zUF307=~#sc*(*Rimg2cGC_A1sVE2XHv0KCwOnzt>MVAvlYg#7We_ESmh7%!H06}o_Q!yb>DDSR!h{|H!z@FZ0ZPq6KuB2|zaIf+ zq6I{wOHisexUz8j`TcMI@l*8Z(=Rms=zByujoQi`cf4c$;N5RJ$NO&k=9N?>!{HE= z4WaZ1S(;*PRP?@ft3w6kJZpsB*Y>Ba;8Ocz6!)LXk$uW#ZRY3#4I^mp$|haa*VXGZ z>rOh^TG_~$Y~o4R<+cY(d(;dV3I*?;0e)tRe<~O{!HgjZU zHQ_|1>zK`k5Y1T2;(~{w+i&qPz->-db1rnMfTtihGj`cg!x36Un#ony_+izB`nMTveu9WS5KDO%l-0V2? zp@IWY4!yYxG^zlAz1Mf}DuQpYtryNaC4hIdsvM-rX1D_K;7)eB$pCSjX>HsCl!`51 zS_g^>VVELGbnoJ8>fnn<-}1eu>8&5%b0I?8qyy>-IsDF_`uzNZ?|7aL9J`>Ymt;u_ zJxZaq7*f6m+T0B8Q@CjuUZCe*ThR1@0rCOB%=uukjyPd-p>WU?G-fH9z5NS$2Anal z4y0<5aG&cYkV)FN$xZ|9PG5ho%k{nxyB61`rNYes=i!;pwKuZrx&e%-rodmAp=vs*)t9hXQ$< zGD!Qm!JE7RAmBnvsIA*EZ(~S^y%+Y2h0xp$h;Z)5qZwJ6B4&+PMbJ=K(@~-pZoY8f zrlm7WAO0^sJNd7@x1`gkYh?cZ$6r47=Et99HM<;vR+Q+(fEDFtCp+{D9B0QZM1I~6 zvZ@t&d2h+J40wj+eAG=mNY_VYK5R5k43o&T?Wd8Q*0?&^+j6Zn?y9mThNBzv;apG& z(xtwt76##*;g3DCM;H(F|4)l8|`m-8BWHfG3 zX3rQ5qR8;7l{Et?Hhkj`*8Q<^5NF;tTj@5zR0h3$88!hx8);l;X$hw zp6s^gyKdv*wtT(zeAg{J@avo>-NsYqmh)|YU$pVu+xl;b10XF#?=atWCHVPd@p&Y| z@QUH@Th*SSp)F4uD(6y*jj@nf3!1r>*fY7Mj{Wu;K{Q!SS>>MF$~d!18DJP6gs3^_E3aa9ba`;-o_o$;e(=fD z^u(vX+W6z{ap^Sb7P;;Fe(LkLJ^WqI^TE3>^i`Bdnjl*rKwE0TY+r$5LM9n}>NdZU zrC>E$G#xqZ+^tBIvkQC*F5@aPu3_A&XZiL83B7oFzcIhDbDs1Sw0vskTwYte3dU zah)epC(A*!PH5Vt$dsbDW$CyK%zjlK0C(N~mXpxIj7nv-?cDxTAcb=!soQ_+OxJr` zcKYw%cKxlmzpC-$+Xv&QZhSVicYs~k3Jd&NfOej=t6QdOl@$p%$|)O7+|4u2dDiiy zC4<$d4SU5oni(frz~wt&X6R@R7_Oo>d_9S0_OGlTdF0%|<3G{yr6-Wi^gV&lv3I?k zeDz;F`?Z(9vX6CkB9>&SPtxZ!LBar3j4Uz_E5w+o8P@zw0)`nFF65^u0kHxRjF~A? z)~Q4C(0?$dB}K-f7n)UxVe1K?j4uf>{IW}=+8NA+_%!A$m;q{T()3kw6stN0DxA99 zgo5#QVf$&NZL-{MU$fT9dXGE1?e)c09mq~n4}f2MyYeyfIMsu+D+|Hb?G>YBNh8Y= zHPlbjgG(gD!eby!F7lWbh&Z;36ew862ZstE&DxsVH2?uJnt|3=l71AejOK4ye(=3N z`79lKQ^%K{KsunFQ2O^h{=(Wn{f(1f{j)y;ucs$ybZIFT^dTCOMP`z=oPWb>F4VTU|0?TI)%EMFTIJT|dXePiWsnvzDzX3` zq`f)ZS;u_L1r$I!H(9%PYtClNn{U_z8oglYtI5> zes;hNjPs-s`nUjjdP#GPz~UByv;kSRPG>gxPzj`sCDELRx_oQ@t)EksLe(;w*zi`)^Ppf^my(rP#Ma5AfsUXTCzoeuvS-J?= zKFod~3A}kJ+!rcG7IMes2t#2|l#Mu(<#EFEzU!RHCNbS@r2e%qi*CgpV<*?I?DXGv z((AX~OWpV>$L=q`+#CV8eP(!&2GGcpu8K?+=B*AvysSw>yLn22J?R{zjeiY$?{0Hl z%J-`?Nm%6K!G)O@7jA##^wE#}mtC@r4N3>pn~(=ScKo^dLr2bt^j{i{^gvP|mS~Je z2*75GvB2%TB_$m6IamWIB+v-C)aA*b$}4;$lSTN4uZsgdXw2yArW z+txl$a~qs1wQb@_hZ4qZ$oIWz?3(0KTsm-eq;Iw?9lgdIWPf_pi<;P$@8@fqnfxqKGh3DMoRItOqPe z4@3fr6qF*U*zl>9QV;?nQh>6i;)p;IK#{W1&V&^vWqWA9kOxq(oI!w0MSfe%Y0XB972ktjxQqB40#0jo(Gf+&<|lwSqP9YOO5BTg`aHqK?N(AUaNR4N}h&O{Up z&M>#D8vyQeUS7;)oyYgiO<-lsK8ywKq@4b;io1!Ryh$d}3fkIt8h9tyn{3F!w1H=R zBjrw zxSFkjMG%QXFHzPD(yc%d1h_8^Fx9#4QU~E!oGQ&@51}ra5wq5M+S^H{j-tCb$%9Ouvd-t2;N0 z^|8_RDAg~7<1CGDZ_bwSu*13by%C-?*^GbiDS5;8(5_$8cYp0w#Hxp^e+X;3mvAy# zIdI^>@{u>Z^V!+Af3k}_HidLRJ*7PKk^k(A`|f${`FQ^D1*~yGnK3JC#gK@=1W-nx zVQ6k*J0NnfCYutItZ8X1C<=@5y0il^%w=766logFp=Mn+v6Y=!LZ=qTzbI?kRT_64 zSWhzF8NoAosreI?h01Mhd)I~N{!b|i%bbtD|9UfpkE<1wzLje_6izh0}lf?62Ml3>T4JKHO6=de9)&$Uqcc~ygd54K^mIppDpydXw18Zf%?yEc~3fb`(f;DWJa!EG)!oVyVn8iDl zH36xK%Tf>I*a9GLJJ%$w6Y);-tZ#6j-)VEIb+y6h-~e0G9SekWMS#~ z(?D z2V_^~6+CMMb;>K}kZWD$V*@Dgti9RWt;SK@&nl$O49wrhk!v=M+%MlMXd$Gp_{mjN6kAK-wJJcXpoP z4zOYSAr^Af%&viU$0G>0M{{~_3rP7>Z zK{~HnWU%ZTtPC)F;QYcPKX7{fegAP6!+Q&5r>#}HQoeTTS3WxYcVGMoefi(Nna^Ea=2=4#VrwENG8}7j4modH`i(s6$XKqd zncFzMLFHU!j@TbNDeNy(ai^rrbJh`6mb+srY2CTW+)frHo^^N*fX|~{*S;-Zb(yC< zCM`T=YT-Gvnvw@i%{x&t?YerqdD1mj72m!s-}sa~Y1s31AgOd=1sog}7pl z+KsiZxrZ>wNL`(>Y1=K_MZ|1)i3|JbVsBeVQ&C{7!|q>!wcCqkA9Ts2^Cr(QVe821 z==Gw-P_URyT@A3-J}clLK8$^<-^T3lGFGvOZ%4Nvnwi6q^y^rB{jZW&j~qWAKXBr? zyPp2_&sO|#I+;Q`jd~m8uBU(X_mg99d46VL;X-fl%|wP*z_W*-wT9NA7M+{4U2uXj zcRDwJ+sVKUs?w@A9Q5Iex_n&De_iHjmybi4M(f##*0LSf?__Vww9k|nRdQReRpv>T z%gS2xSVTdWy~;&H6a(NcG9r2Qh{-2l9Mo)L9vAl5w)Z)$ed=C-MgwRljMN-N1dAA; zxBe=wtn1{}-mNS1cfal2oo_tenY_0_T0$jtvRV1f|NggEvXwu%JAVCZx2|VApU&SJ zMWX?Xn>7J8K?afa`xXMAZ8j@q9JR@0+E7ps5-2gF%hbvH5aS{Ok_g^=OgTq#<4tND zzpbWg({1Kn=B7WJH^kDeY<>Gq0K{snbs9Gj`543sl)t+^YuW@K3cukb8h1hCZ!-|J z*^gShy{JWFmzMKw(x$ObZ2)UgnOl38=`?b*Sv1;!u;uz;|5Xc54{UWBbIoGaYs?kw zg@QI*(=NPz6TPuuvJPW%`!b*Z)-KZFInJhs%mT02xC_Ct7%G(uW>VCs9Vq9(%$AO2 zj?E%P4+o&$JQ9u(vBm+cBU!zgydEvC&^^bO@BN{lKS}p|@1HmSjXK$kbY9=vB=h$_ z{<54u_3Xd<{fqme!M9G#uD`m(Y1ZdRAqGGco2X@(wkBOc+#?GX450|34U94vB$ksc zfGFoHPBzyygB2M%7}>$8#pk&en+MN(kOp4i2CQu&5j8#`0l`F*7mRy%h|ok$J0uy#ovCzwVEQ^Rh=^RlBNsP3^Z!%HN~vdv#JT+x`1(^>Z}I^ILWAO+ZXmLk{2Fab@H| z56*c6LN|8HdH9hhJHGTbN~ck8vpoFdC(r)XAN<$o|Jf?CD_2j5UUJ=?zBT%t_B`DPnAd5vO{Qt8sJEpW zbzpjTrtVOSH{hIudhVBE-@V2SA7lhB-?J!)n7q)rCJnf7pb!B|VEVQZ$Jq8G!eGsT z={rx)iwuA;vbYCH6U1sg$)eenmq&+|AAkRkom@QrOb622ES*Mu4dnhG`Q@|egFkSx z7xk8vQY$1Xffi&LgEMWYSAI23L5NW*IGC{?oSbXcc4chdn|am}Ob}t6NpexwX&VU2 z+IZG&*VxSUucap2Y1Grnwfg<0eSVtSH`TBE9Gs{$zx#!P9fxD#eM>Kw+up_ccgIrL zpN0o%1H@$K3<<1sHukrhO9GIV0Hj^}HJL?EvScnDtn}v(EZ_azA3M4D!C&q``Wi?F z)YnMv`qqWzEQeb=xcKr_{k% ze^upm?Kh(-ZMJV&UrPl&=)nxK^S!zGQ};jf_dAfjMzYh^tUV|H>hFE*Z{PK;Fa5;Y{N+bR zb4UAgqk|BY;+5HpII8AM?rCLA+bV+LODkne&k+hdYl;x?r3pPkGtU|dVV-K&&gG?! zBx~kbQ_h2};z~=@D}2{-opL_wrsKkA*FLZP-_mXQJND#iackCF;RyBPFTZdv=Sl9pN3BWlqcFSd(bWbQy;)EVWbH_Y6b!Y zmJG}pm^BWrUryE*?>>L&$fM7_{TKdG$CbW@(rMJ!SRVW7pF92X(R<+6dc9adULyd>o9J2eoRm01}&qeAM`*%0^J+&j43>*-EZqE+qd&ezG*KsTk-U8n87uJ!$G_w{QRYc&gox@V*6xas$;1L=wem3=p6x3cDL z2ht&(($(XD8|^7rOg8id(k>eoQy+vLbeciZ6cGU|5mNLA zNwn|$L+|_4sf8y#)p4bFKstKX4$0x~d*<_B|KC1y>&&?`vsW&?_SV-9)4sz(ePXiv z#3s_1xYTq+W{@chaGtsav-9eFNXXU~2HBt}qFkU9qiwSyOWk4<6a@f_AhMfy1?rZ{ z`xP3eOu2Uex#nF#?*dG0bN9IrH#rEH;@XG(`iU7W*AMD$Cg1h69vjz6D=&YqtqS-u z$#r*9rd^1&Y0i@dJgEiZipXe%_HHp+=1BuSr#!KtQ8|$I+-blp#=TbU7Vi$s$s(`< z*aS!tn|=~n0Ehu=p&X=LE@{UaK@ZFsBF><-M#@pLrWOVOBSGB0>fq9ghwgdc^lisK z(xt83A?bj62jz|rzx}!O%X)G3{Mmhj?Baum35RWbPzVu(Oh#(JV434t8=%d>nnWN9 zh)wAIdY-idVn)EwX75bqpsbN+9fCs%aJ{coSRQ~#9T1o6)q$`(SMDPRVzdHz+qoub z1*&VrbFSl=x8C12-~Y6~&!h{1T8+B&8`J@DT_2TwhGjBdZ(|mpd^@RU91-b}%(>L3^(jt~}CC2)uox_?7dLn?<2~-@RANMd!fPwB0(gSzC zbm+n3XKwx2o1eocK3D%o>111_1L_?VqNg-~&;IM*cm_9L{Ilzwkvt`$A+gCeM(l=1IH1MYw=dIoSKL9NeST$RhxpB^VBe ziAKCKcj)N3hmL>X)TVx%PPSA!9`$u37k=@9U%4DD{_xd|9=WNv+CR$Q0PzUlijUyZ z!d+P6Z-SK3LMc{bJnNp)mNP9tq@ZHMr&daV2#BH>OnIJa$Fru$uGcv7JZ&PeJZ+Oz z3(BO)YvNg}Am8y=u4n){*ds2~vBx^#Ay@LW8+g)V@ii;1pHcDpV|~=*yUw-N=HcRh z#~NwlS-0oAo^H6d0a64hEULy#$1OZ;K{HQUp{V_r??<88AuzP)RQ2KdM@|1#3)Ape zu`j4@FIi)IR&gUwnr&KJU&nfKi&!QFv=2Dqc+xJPG>Je`^ZT02R{>Aj-nR~tb$I7d z>o7(v$Oa=wJPS|+m5vZ)Yse(V6?Fhtupf8MehtIF87AN(EBfBIF5mvqpZu+b``*(z zk6j1SY1G$|-1U)PJT-gEedi8G>nri_QnE_>ak+mBl!|d^?XSIw%1s2`WaU@l$Q?`I z1}*t>WSIUIi%0|tJ6JKWwOqY8`cJTXeL@VFS-)Y*v z`6TTp$tUgFgt??WwUGleba{MpzF5q!S&S?ej&o;a3pMG!GWPK#6C_N~5D7lJ$ zauHWAbCN9Fv@%?}clq9TJ$bSN>FY;2puUcTp7>i|z5TmB@a*i|+;WewawVHduBt=m z0k|psmR(&N+68+j5Ge#jVYlZM#sYU>tzF<0cs5EP8 zVfiFx?n&AgK&Jt$>-sL&*=r!aS<`Y`pOgH3o37vZ_X(b}%{)KTwl4s36;IkOr2T@p zJl^bB-7HVqd4Pu$EJxb}6M8V)X=w%|5&@(TA;X+r#lq-fGFm^dGCK0`^3sQ%I@vq^ z$u2zTbtD~7UuUxL#HU`k^@*oWUYWXG)%^+rIt&xcU6hjaLnxM2!dZJgZ$}P)FkAL9g;m10VzTTws`o0cj{>jgr{j1;q z)y4Er{@^gZ`j?BDUO0Sd-z}hQ6=Z3VD$-Dh;QYIpU@2G(2${WTI4(7eS9frYoM&yE zKTQ=&2_dp{FuR}4D0oaa@vK7`qYRa}zary2=jnLT<6h$s8QZ@uw<~*2*LhS=>m1$& zcGrjwT`Q9U;a2otbq&E}*RKWgmU?YG>9+f8E1a1LW-Z)B#T#)})@<3|S`Rs78`xSQ|;A)!YirA6$OpJ3evp@VkGy1L^Bf zI-tHz<^GTU%IClF?9bmi%C62{T^+tPNoV%$=RqGNASf^ZvOH@o23!RKQ5JqRSr9jX zY?k82Sxi8_y|Q3!9K^(PvZ2ky!eC>vQ|&x!ZkW`YxWCf?@g(ix+t&l}B>Aq}q!rX| z5ZBFmje6_8z~(F}leKR;KaEwVwS54(RXl0;1;S9FVJvR;j$=G#%7*1Xi`ZZ$R+BcC zEt_LHbASzqxQK?fJ%EwSKno#)hBDsW7|P5by6J)Q^Gn}x>hOmecvTI=RMS4ce(`fzn!L)z zf@rzVuueH%{rLTHV|%i`AeH%~EnbEWo6gt6^}!i}{b}UeSDq(rMjqSkE4G?8+lXYE ztwGI3A9Elrw$F9$fkB8RgG$$uG|eva{@Y*N_ony%FAx2PzyAA`KWZn}g>-w=*Rc>i zrSJLFZ+>>+$USEcW*0ArNMcswcH#*3h0D2Pi}|hL_sIY=kiGc5v*ILImG9P_Z{k@u zX(#2+lV~edGHv@NndJWWf^3KByRN^DXtZ_hCeei zoSTp*Ek&L*f;mEhKG!k@tp$;2^dW#hFGbM-+ znPeF%ucJXG7q*behiy027)DdqnKcC~YwjkSp^J3WfL2mz(sq+!ub`2-dg8B>=c~@oA!8= zE!=$lFfj^M9Bm0tI^2i0$L_tzlPIfIz!NE5yVkVDp_#T6pb2)&QytWMp{GTASy~nY}}=Z4w~keBo`pzOCb! z-Gg3N3>s?mQ-vP)0FJPhB^X8w?nO8-vx@!|LV7hyF3#P5;g#DSIP>1m{Nv98{|ud6 z-_mK+H-H>`)AxP#9Z!DnSzda>a(3X@%9>V5y1I_p(K_a`6iPC1T-2=Vc-Cd@+ppSP z9%~oDENJhvgaY*hxmIsK6f|omRp!R+3F>96QT9-6#5kX%o#3}|N1+5qevk;oko3w$ijV3ys-AizjN{{|K}e1TVpcKH`X@w?sFp+UmaeL5!)u?@Y z@q5#Pd~y*56I)ybUevah*knG|5xt-hRVDR6NfUw?E z)8?GbS^;9(E#_7L+S$cI-PXfKOxqhZXK$!|%c618zC&;f%f^D61awBTV71O*Hj9<_ z&bGOs**cAhrB1@8s&q_Am*q+d9^X!*26`!hiI5Q^r3_j!#7bc%VIb9bU9u#K4z1{g zTbAGUfggL89(m7K$9~vOu1o2F`UaBuN1r*He&q`|f9kiDpUuT3MteOWjh&nMGN>!Fzwh^z9OP zgkWvZy%|UZ8>3g1!MXtCrTX?nv3=>d+<&=V)%{hq->mEwt$Z^e?JPb`b=ul*G`rO# z_ZpTLytl)bEvo}*N6~VcbeL+A9TiK+I*W~iG_=`#GG=n~GR|byOfGDOLZU#CAd?J( zbRB)wLj+)kde9j`%`FaQjy`n$!S{UP6g|>K9lMdF1L_-0dJjK&_FG^0ZG8O;uc4Q! z6P#XIf|7m|3$zW0P{*?d#8A4FAwN?Dh?uN8CVQ5_Qi;fOHW?<_2NMu0n=@Ak6saOu zyFEDs)U5!l0hoN)4N~SdS82T4$&;Rz$Gy!y*%JVH%R;E7{qzcdvt~LqPkKrqFIO$s zqf&YK*d@xS18UgCoC9gklXm@R9^*Mf#HXJWJLbwDEjFLDXp;s{Seu2j=Ubb5;Ea%J zhA2iP3TdK2)I*vefu0?#&D{CoBPV{~bo|&yyS&mjm~=pW1IjH={_NQ+%g^GE|KNYZ z5vUV!c4aA!bYHZfiDwO1(lcD1Yq6#_0u+PLgSa3m0a$wvQ?lkgn=;dZHHmc^tKwNB zcgm75sY8V`n9$~c66FbZ3Z8Tm5VvX6?WXT$DBLX?HLx>4JgG+AbiT=SUS;|&v?=G6 zwl6a3v@va4o)+8W8%BG!R7lH{E`zi)jT=DM5F35agb;--7o>Kf9BD#7Q^*iwEm1(c zIOxwWzV!AF{mhx(JJ5M}-+Njz z6d16Tb6&A=!ok){S)de5Tw$2KX4hUKn@$rj5y)KBGQamMrW|%3S_Obsk#NwG z_MYMm;8~^eZMW&V4&X=S@L>hg8QfVhPxUH5sTonN zk+MmC=c;;}Z9nP#HT75Zn>vsN8hFx$5Tk*m#^#tV#v&kJ*JsIcFP1zYiip{lV!==} zGS-kJgA6%QX|&SsANbOddmj4TTR!@ozcta9?Bu$X>s<-xWCFSLFaF`D{`HyP|FMVD zFTa)g3;T3`e}5=FBnqHdq1R{h`UIt=F`xCUVw-7i%@`3k-mY z>$ENQB5nrfDByuteg}#x!PqZIZT||$<9P>xgb=aUZe6k*lT+G!FJ%Lhggj}<0@HSC z+XvaP3{TpCdX|pB5@jI+1$t9BxzSyKedv$pLc6X%;mOqfd+0~$n7cERr^VAnt3cgf+* z$!;&t1DN}QZZcKwW3{=u&5XU#dZk8{d(0cTX6URojcn@vw^=r7uCA&#={MSnYgLL% zoFPT?b{P6p1?QEZu=FzhD!8<;MpG`D#tmo(fG&B`3Pq^Q9YKgTC;U(v6GO?ldBzYi=U**sr>*HlN5yM zGX?%LP_50BWkcq1$tTOU_HBJnVkV!|%v%1w8nz$T&f|nhq8h?|rFv`&-W}J#)Ns9NQ(*0rf7DJ3sU@Coj$2btc=t^iqo6 zfJZ4Jogx-8oUN98*6edsi*;r(`D~%tI=HwxY;)won)bK^=2l~Hz%J!D#4-lfZUXc% z$tzxUfL66%Sa;mizR7G_uHV-8M!|X#sRi_kg~)bF?fuu>$E1Isa@n-M?}poR`!iSt z(*F6*Ox|em3t#v}FoL|&oaN)oIgUX~0MKQSHVbGik*S|)a5937M(7hjIzyJGkV{Dt z@4xke-23J;5C6jd_*tT-T4Kg_a-&FR`rbuCcf4aAz-M3h?|x?A>dS*4250;FS=!H7 zLq)2UXKf;vF-VM;xG_yzs+SlOb`#G!0^2&2??D$5GD-eM@KMf;XL!IS%x?X_wNqL7sq!7k#Mc4LaQ_X2ky4FEce05B-cfQ&KQ z?;G%@ev;{IaCr8X3#+$1^o4t#`ibZ8vz_nQZjvs|+@b6#&8}DTJ_3v1v}YW6RqXOM?QrVxML+a#}Ol zFr^gkL;D*lNC5;@5tz!(T499csyfaYtk&791iIyVp|e(H{}p`}+E;w9qGMP~QVoaa zb>F`QiR;ox<`-x_UA&iZuv0BsYncsDZr|jr=AO~!>(`$Xk%`h&y0WsBMa1}Q02tGx zJx|(E5=$V>c7g02%t}0I6P*muoadx=AT0u`SqoCFfGjiFuOfvc15zDhU1l#!fAOW> zZQu1zANui6evWQ=;$?KQtEAJYccIV&PkdFrdiL4n=YDhFzF~ZVl2?`}TkS*jFbU6^ zv_QZRavC>$yGeQ03=_4iz_WH5CBt}nJDhh8W+k4r`7r+ds;uS>OL3xp78$Kr2hLi%T~FcZJTMj<$86WH(Fk6c_@Vlbq;0Xj!Ow>Oze6K;y|9F zvY=HP?VE+*qKS=zwB6rs;Ymjzdy|yvn=ULKJ$B}<|Ma(ijfgsP_b!xf zk9wC1-S@-`Cw}thPpXB(%L&s;I$TfuUYeVHN<8auAK3FeZG9iCq=9E0Y9VEwHGl&B z$4~5qe)Dsil_p@=XdjcBbSG`URrj}(GVT3u^f#I0cdn{8ZF^T%*H3Ql4&r+Ub@MEC z*4z!0##e4aFK59D&zHv{0BEg^NgPoU_2*Y^TDte#UGMtPsSc!fuXGyqE*84$-DlUn z_GPU6;XlNM=l{uxJCEokH8a=e-V7LhBpCqBh$A++f@fo6$|HqHDJX3wB;~SdN#@vH zCVVInl#NPC3eaindDc3z!AFTbUs@ps#O9_}#$+x;Hq0oH>6|A`WZ#jSc{$LyMe=u7 zreJx(;JS;g6x88J|?*vil9kBaEffie!j}a9X8>q;4?dan9WhM9^;8MQlF`ji{ zSuMf;wtfpF38bPzyw~x1Ay2wMb3(BkRp-k0FQssA_XM+uhE-322Kt^E?rF)duk-gEVFMkgG47m6ge{>>ZEX^?bJ)J=bLyJIb1vN7Z&Qb$-k?~BW zh#;bj85{Gi81^q`b7*UZ?udkREr#PKbN23JArmlHj6 z)5_r3cP>Bh{hvD7d#KBVwcDiw>OCOy$A9{)eC5md_AB24k6u3^Yu{d)OIQ1|F~BOu zP-c;4gc#a_qJl)u#H}G>z*cEMlu3OF%J;YhCeJ02^A0nbvdd>J?DARXnh)9e&1TO8 zlT@mNAt1BUoGLu3tB%Y2!A|P-ho@~{uIrC;wST-`Y2i}UUMkveMmA%ju543xuEvzS z5wmoYMnB0tG`6>zGyqGr5^s(Ma*Y@cumMlkGEL1MvExa@I)*tjH(K&ZLyLKanJgX4 zws+|((FdRmi(<5H?@V-Dk&toKAL|bU?jF zgdRSAR{r=8@TY%t2Ez-(6KehH(!MzA3lvgBNYV(gGe^UO9}`%u0LFoZZ5m8144clw zXTD}-0$fg#&zfD9EJx#ViM(pkV0y6PV8RXG-LbV?R{^OpS)vjICv`U4X#1*T1bqYz z3SX#ck#H@f3Lq!h>!pgill0-Q*K!ZR$=1Fr+t+|}Vaq~_i8XxC9>9kC6dTOM1r9RL zJBb2o7e4^wJZXUkWCzk>Q(ZE%S-4V+h!iLhaF&A84E@NYq1BoZy?!O(`6DaCqjxUf z_X9t7a=ruUJtG}Z?;)W_f8^}NFaI81x_S}mtD_Sa*I!$j?Q>ruh9U;B+eCKe{xPZLj?ow?fuL&>aGZ8dF13@r?$8N`B~iXaq2 zL!br8tdf;i4?nPc^g};?a{kdLJCNQ((gF1zlf%b9c6RNB-@~6h|9e>f_FtYDtzTN2 zk+k3MMK<7x-G_q#MrJZ;FaeNeuW>UJL|e_;YRe+l1nv#uHa(xS?%J5*WOMPdO~T=w zt{_EiIeejB;|`@6h}$*dY1?nK@34Mb`)OrT(|0XUhGzJRdeqWKWuM{u1nnE|uceL; zs8f!PXDa4tECmIS&NXouE_$Fzn-HP4ZDxX=)bXT+#q3F2bGHL&Z~9i&Hzd>OsUDI{ zV>A?uC{9#=|H|O#ZOadT=%-Hh9_v7QuSo~gdr;;d``FnlU;Z8Z)tCM`vXwtSq1Ikq zn!(k+P#+)yvo;yE02tSAWi;v70It!bO+ITTV-_@#$)w1$CP%w64rXQ{V8d=$Om>>J zn@%e=Nh>a}1W??&MgsuVfnd3g>2$jGRp7fJ)4EKy5ZEqhHBC>c(YDo@^gi0ko9cNm zcHnAGm^q)ozgRDiUAn4pNjX$HkW20^AHtY#{qg##=7 z14ou`dHV02>^*$E1L-{|9gljC%Hr{7&c5ly2Ts!b!DS*^NrzVxt+nN78k3ykYnt-h z6lh*Wp0x@lK=Cw{kf&{~TQ*_3GB-hnv6h{GnR~SXMVm>rsqI#@-$+?o-0h?1x`w{qa>km%c zcE`b`cxJwz#WTn#LLwSU5#or@j{%7?5DAo0P>K-6#w_m4*VH43GUq8GkUj76Oh;rW zUa&c@p#+E=hZ#_aEDcN`NmJpUp}EyEX`2b??o9Rm~20w9y0DhDPzXY zH3mRL!C0S-9g&zI)~4uq)`VPZb~$=QiFGC;drZZA&Eh6igYIHMra)J+QdQ=p${ZaY zPi$It6Z-^p>*`J0zO7AbJd+7E+s$ae-YPQ1HCtnmx3u?5El0VsFYhddHlDQ8f(7u zNGMud86NqL<%d4>$&>RPNbh;+fVvYbKKTo0*Z%l_$6tT*8<^w42|apk>3|yc7iJZh zdRWthjAHbx%EdOg32Ec)3MixXGR&T{HlWLtyOj}%rD2)tzK)pnl_d9UD3xx+Z>#0(B}CF{^p_MSRqxVDKj)gWk6b^2-2>s#FO@p zU;>}Z-D}a#ES@<9zYm4juq(8N&N4*8po}3&0*U8=wM)s2=9SUScP-!dzE7W=f9%5@ zNO#f!btgvVAN}Cj^vloUPyX*S7`;3^u|B%8G^^03o`4V|Nm3|fKvCIXD8@tFfHe_8 zY?dI31PTg50_OwHDi8ZfO03tcxwcrFD3S3VXH7X+>kyC}pyjU|%#6w0_Y;7#lS#C@ zN)Vj{tb_jRoz?0!`=<6Dw6-v*N8!Hganb6$agc7ZYE05TD4h5@wIJ;^Tp2UTmwD1G z)*(_1^@^E%KobsQ;A{78LEo9Z*+%biVL@$fc4k0QvF39?Fbg3CB^v1{0kRZIMTkTp zWd*r>G0EcnD>(ed43TuFTLZRJbUHKzk~DtVijxOUOypgmzHMx zx-Wf3k9uI%0cJVsmC+iAY%FNMjTxMe$Y;!QIjx~wUM_h26~zINQ%SStF~A&?Qb3fl zM|i8o8EW4l2$q1OmgkId5cT&lN&5;A4%^rD;X$=EjpfF){sYj*qrsL}CG~Zua zd$Q>#3!dA-9yD9iHwPds9;A)Q+nBqH)GMbMbEeI+&SFzfS~IufNoSTv?X>DtAj~Gs zr5z`d30P~RNvj^BC<1FhE0xUgXk~El;pJQ2|8pHkcT$iJs5>dh;_+wBuD$Sk_|rf9 z$GGzCzdW&)Tv=LB-0$}VBP|9v#i_Igi~*x*M;QT%O{m3~Kx9%~isfRl5Xhc4rpf#m z$~f;ZS&b+vf;GhMeFFuJI^DlQtktIW3C~ zScf3(G;IhY(F@{3{tC@s)b1QUUe)*v%KXG#LLsX9sJ3e zONi3TC(_}iCF$+!1F)v(-1FN=4wk|SKC6LqFtgs>06bU&$R|=bU{V34#sn8{(oVy& zDpPS)n_3OE;e1_Rb!BxjZTqJCYXjIxoXN`9DIC{$*SB4_t?ouN?xwnBu02q6AS^6) z+`>)rJ?qeM%$&-Py{R1bnRnM>ThCGFoX58fieirKLXk3Po!St+3K~dMZ+2zzmSfBJ zz2)sEsRQXwYNP||PHKf7d*&5U_8d{ z-Zd#8vpna(8jg@_9c4CJ8W9*U2|nBTPJsiQ>)(Z9 z^;JSTnw|Xt-!62ZBQiX6|F*&JU${-(l4^ne8!w~kJGo#tI(e@c*)&@}7 zI7T{++D8{76;Qv7rma~_NKg^<5=N3TG{s=*K|^7br2q@!IL4*HSFpHv4|>@m@U2V9 zA*ENY96ho;_nuFmq>h5sNrQAi-ASV?KJw(*EC2EzKq=t$m;RpzV6Q|e zLo^}H6qNM>7s<8lkY{ZsU8AMAgjx_~JZP11Mq|r4g(9CG6M)rh0<*cxd2Nqjwfv@i zTLTW37G}?T$8~ocv<(3jfDc#I*#88Y@uv5cH*w8MZMRMXo=`L1hz1?Dsk+Oi`y1b* z&i`iNHitKN+h zu6^YTSo!7!#L4OjN(M_Yt@ro!2^kSqGax~Xe$UkRJZs7w&WNm;5E3NquqiYnWhOu6 z_|``KrWkpE6suiIu*c01s3`XeCsI~>xBJ*ulXp1A&e;sEFK3o_i-w}-x05DNt~09_ zj(vaa4rOh9yZdR}4rnrKhh?RDlbFWG!80h6=6Y>?S6Knd{dn`XjXLIonOKWNTlT9m zPufwi2)VBWYYX5m6{X*!77(-NNxR5nh9@o15*epP&B&6WNnZ)`Y-_F2o4EI43$nDU%z!Y7HmNc#ShHwv<`uwbG?6m4^2lk@4EEYNK+2`j6p&(L!nOfb z%KU1FK+2vsi9m{A4QnjM4R@|VZZ$}&SrIbbrlddfq5NBRsnI_ zo^ummkN4HmzojdeL7Hqb4Q4KYG=M^44Hla_-DaQI&+M5k{pdRrRAPuPEMoMM&zAYA(D&m2&a~yoiA5;*yDT zA2LeW!AVePT^ylSb|EKv1X6Z{&9Cu?65L>>N$Z|@Qbb>x~ztNZPX zj;ndZz&x_{$M>F#K7#8>w=SRA`o;46i}q3X_gNDW1R;hFeWwyp zFSdX2)cNA~Zh}y(kEBC3K?L(6>2RFS)S#zNT67{DY07(0pR_dkq{W*7cw%;b9Bi{s zx+omTm9PvXCPBf3PQl30&Ut9%)QOdACtr2zFHMZaba%ulA`*4PDI>l99eZXU_!=JF z^F?~2eepkoW}n{7`N?syZQo~I&EIVXNp;(dn11EA-|ti9z7T1`L?ZERTpaqewI3%a zaw$YfW^s~flHVZFRI_zy5Lqr4ixKmwUSpw1{rTQw^Ljnk9se5m!&EorzwbtWbsg*y3`+ln zgs8mnfFJ;|t&T+%eK*q9jd9X_I<|VdLD1Dce=|L){8~?mU;6$9V7Z@6 z>+}8hQ1;$ab%{_Xwmt9HBwP`nBLUD;W2R7-W`Q%VB5MwjbR)_JiSMP>2RtXxerk=F zp>0=?5O(AuIJ+kA9z8t0 za&+iGdEpg%$F|(LgRZ*y0YpSRM?|8IcwV5(u6>}hXXlX(hPFTR-LGv;AXiFvZgpz9 zST)i{H_tJ5Vj4WuMyjcC5mnK`0B|tI6BUOKW%v(iXMF>g5x^0U8uF@fR>KoE>OHO> z{7f)LAYqoZu0iKrYcp6iAOz4B>_*Dk_jKz%1lLK?V=GyAU+vqkp+U3(%Z+?PMEYFM zugH3-W0rwaO^q-2TFbd^_+5s`7-)z9Lppmvlx@Tdu>H^t&DaQ4+df-UHk`*oR)(vT zIhW!iVgKH4_q&kJ*?#W`^4P^N2PXOF{m4o@em*6p9Y@HJoAc>6!u zNf*EF(Nq4xMMO04{Bmaz5eWI4eZ?#Qs(fv-}f1zWXS$H22p<&!L@R+4&bg9&KzXfOi zF_srU--hsap|rU(3!WQN+WtOtTjx6i09a5`)9w>>L>=0%xSn3sbQBBDVWs$(-5Zra z72Wj%Vvz@LZ&iJl0%ituI#wCl_Z)*u2bUKxuwdst)r0Flj9FW9{D&`q9;I+k zn~xI5qA$f#M6}Q`FVy)<;l;W?gx7%MmwJWc`bj!$H*3yd@xOQdn`!=SgmiXg`{_I} zlm2bEvi=(q2RP?{_fqzfbcm#(<|kl6=?D?DVu zwU2N$aE5 ztSKC?=#OgI@}m2f6HzaA{!0;2FSJiYmW-$qji?t&cT2gjIvoJ2(3blilo0CDeeGEd z5;p=A6}eLtNrzd`5QBmX^!7=k(I+inm(edSgE;8QV@j(9;~mp&vS;?(e;?*5Gjk3XK6PEm}`&CU*y@URtUowWc+ zd#ZsRqwS!(7TpRiW6*=e6FfwT6#ifdYH$EnOw||dE8T%(2>|N=2VdVNRF~EIuK&-_ z<0B1JBR0{z)rHU$gAE{3#^OZ393o!q{H4$oZZ-d{wi}!|=$P7eeE}k;#Z%|91kndm zk}7gmk`B&eC6m^LgGkJOSET>4bMOkokWGPSW35ZOQhW1*fUKtlD@5U{TzBC(QNfv@ zlb3*V`g0(ZrNK;@U=}0CxxH%tnk%o}HU75uPyFjo{@>-YejyPN%S4Q*BVIH-F!7JK z(A4+0w~zg3vzaEanqU*1Jxzkd)b(Ss1SCFUChI-G6BVPuc!jhv@RPJO z%1$V&t|dkzYfDuPJ2kZhnLo!z&EY+hMva&Qi8pH2#?(wakVrGk+uz&{5%od@%Xa=b z&Fw(s3lj7xipl!PvOl8k-!^XX^Fu^EXdeJ@G5_4=w&|-$qnYjoP=wxm-4`P15LG)D zQsdM^(xLp3v#VUldP&-^IgR)ONjv8}Ne7~42XYQZ7zB&yobp*3n>J(XzO(+4pNNrk z#EXVlqmFpdaQ&UX`}MV#Z`>(qYaeql9qQB0IjvJOoCc20<`AgM-m%7Gs z@8|i{$QOE#CP~k`XV&}%t0r6wj2Qi!@N52fQ>VqHvE6rF3BOOS|E`#Qt=j*+Ijwbb z^$N9cW(JGNjUApc?XmlR;@TVk=;9A;{?zmOK}19>f*4Upyy$rRtDpY+-~Q?sfAN-M zU%T$u*!t0Q*Ae2Va;hoxzK*5IwQJRjk#KD zM#w~PX7L*LAgj^lc1S2-0g@%+YTuyama1_J?BWkIl{jy3jhQW1ZFW!rVMs^o1sdm( z7Y&AXD+U~wK*O^eDlTL84_ZZtwnZRiU5gG8b15@un*^xLcO zf|1NgPBJ>x9)Im*dg)C&*S+tfUq?j5i-_1q9r2>$;b=Gacc-ClQFPkthP`14`DKO#G^gXB8~KKa3o_jBncn#kYGj%U$)kL!HtRn3Bb>? zMu?~g#sVz;=PNmB&$VbByC43Zpa1?Pu|VXy)cMPec)e(A`Ns|f_ZpZ`<6pnKChlgR zbf|p?lCH;6*4xD1?>)?pMn(9j#9*j0Eh9~aCL-7>;uWv>HlFB1 z6m5g`SEF_<>S{*DlX^vZstQM=mfehE2Sv<T{|q=wC>0Bq|vJ8*NFl@c%tK#adPZM_56*LBX-B&}v8 zzU9v!Q-ZX=ng{ktcWs8eAQZU)I}0mWPLzI;vmLhB5pYO{rsT38`nFR`;U|{pUSV9cfpyF@b?ZOsI#7gnOpO ze%Qf8ToE7UN7Tz9^8U5{W0y;|i|t!ZMBTqOZ(s22ZuCh*YCBK|tx3-#>ADupn#Qi% ztm=rnCT<@|d#5^A&6{SBT87pn?Y9Aez?BYg4v8y3GK+2(m?_iTth{h)WX-zCn?Cr@ zC(`vdMv{(r$q|V<;r|<~!`@T|vQoJoaa zeu7mXX&)|YW}(sdJTKyAUl!qDc;dMB{D$wX7HOutMX%u>aAxcZq;3`#9iS}ooZHiG z^+g9(ZhYh33$OW^9qIZT;{>dT(}GCU5vL99D{grdz`s5G`|qE|Uw(e;6rXn;h(|>v z1A_9~K-9r3%$*hh5a>K>6&E2yn5OoNmIi_OvbHB?>ov!I+uw_pvz1_|V%Iv2+Z*Kq z^9@IqyT59bza5x8LuHYob0zOUzzbQtfoz%ju%#AqrzkY^xa zF@=(1ow5$XFo;xr=uJm4Uxx4xT^xuy^jABm^{2m1*Rj^H^|}rkUHhl7c5wm@DRM{X zbOFF3g+am$E(>t0L^0z~=2<>+-cRf+F1Tjb76174A18WG{fmi+I1Pvqb;M~0UG(}n z0KfO6i4P(D(f+OW*wl3yPL3XzPDY7ED`{cftN@v&Xaxunw2zj2wV4~KR}zA=4g|o6 zfg^??Tg{sesaY^phAGWxI=ER?QG6gp7Wgi&(31!oAb}tq&_aE0!QrjWIZKS~cc}B%zfOih#>Ip<7sKWiakG!dlsH@{N z)$M;|>Q+{#(W`c@P|t<|vEXRY^6yUxkQz<36K3;Sa0v|0QqI|mX}<8{1Lo=*?z!Sk zzxW44*F=(zIPHi-IU>#&eDce``JkL!XVPa*jONFW40VUxaFL45Iu2{Q7Bd+DkpFNd zfG9+GKK0F-9t8l9l47X6vS_UvT4y#;zE|>O7zxQ+UwJk}2!lhYQmgs;xPNa|i}^6w z_hE}4>Ck(c0-{T%7M0Kouc@-$yLbzY zYYH{YRA}+kHyYRL*%zYlQ%HRS^T~El#N6Dbaz0V_Y;&FZu2kL)lamro*J<9oaAATY ze}AO*pkP!=?l8vE2-M6(ddy1zpeVT_>1rC5`HKF22|uQE{7{hul={JJV}S9 z4wvgEfAY4iJ6FH`pF~U0h%*Y2s3Xou%s#N=roZ}c|LM;2yT>;dm>%b0%4+hHimZ)A zwHE5lV$e6w+LLoi^}Oof6&|($AT>=QugN;3zHPJ3%bH%YhJP<$@fvkFze(1NaF2@< zH7zl{ii%s_;?2*4n*Bg((HUGV=fn<=wOISWR_4m;CN2CYptG|m1Odg5B#f%_1C{Q zwqHe@afmhQh%*wy*Wa;c=4%sUKfdqo)rFfHJ3`N{UeooFu+MncZdGL1i^Zr;B@2nS zF#`ZA{)3&gJxhE`7b8qr3ehmtDRTqB`R1-VrChge0jM3zBt*nvjAq}fS_{6_s7+N^ z)A*>puouJt)%U5YzZYxaq5;SCrnVO#_Ud1~FHLt>BptK^;!SBJq`NE8n5M{;gL}

d#*#u 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 PAwF42MTyE!#^3)3aTZMS literal 10844 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 F{{smzmk9s> diff --git a/yarn.lock b/yarn.lock index e76d9b3b3..ca98339da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@ampproject/remapping@^2.2.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -12,7 +12,7 @@ "@babel/code-frame@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: "@babel/helper-validator-identifier" "^7.27.1" @@ -21,12 +21,12 @@ "@babel/compat-data@^7.27.2": version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.2.tgz#4183f9e642fd84e74e3eea7ffa93a412e3b102c9" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz" integrity sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ== -"@babel/core@^7.26.10": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.26.10": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.27.1.tgz#89de51e86bd12246003e3524704c49541b16c3e6" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz" integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ== dependencies: "@ampproject/remapping" "^2.2.0" @@ -47,7 +47,7 @@ "@babel/generator@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.1.tgz#862d4fad858f7208edd487c28b58144036b76230" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz" integrity sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w== dependencies: "@babel/parser" "^7.27.1" @@ -58,7 +58,7 @@ "@babel/helper-compilation-targets@^7.27.1": version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz" integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== dependencies: "@babel/compat-data" "^7.27.2" @@ -69,7 +69,7 @@ "@babel/helper-module-imports@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== dependencies: "@babel/traverse" "^7.27.1" @@ -77,7 +77,7 @@ "@babel/helper-module-transforms@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz#e1663b8b71d2de948da5c4fb2a20ca4f3ec27a6f" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz" integrity sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g== dependencies: "@babel/helper-module-imports" "^7.27.1" @@ -86,27 +86,27 @@ "@babel/helper-plugin-utils@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz" integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== "@babel/helper-string-parser@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== "@babel/helper-validator-identifier@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== "@babel/helper-validator-option@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== "@babel/helpers@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.1.tgz#ffc27013038607cdba3288e692c3611c06a18aa4" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz" integrity sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ== dependencies: "@babel/template" "^7.27.1" @@ -114,28 +114,28 @@ "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.1", "@babel/parser@^7.27.2": version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.2.tgz#577518bedb17a2ce4212afd052e01f7df0941127" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz" integrity sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw== dependencies: "@babel/types" "^7.27.1" "@babel/plugin-transform-react-jsx-self@^7.25.9": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz" integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-react-jsx-source@^7.25.9": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz" integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/template@^7.27.1": version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== dependencies: "@babel/code-frame" "^7.27.1" @@ -144,7 +144,7 @@ "@babel/traverse@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.1.tgz#4db772902b133bbddd1c4f7a7ee47761c1b9f291" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz" integrity sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg== dependencies: "@babel/code-frame" "^7.27.1" @@ -157,7 +157,7 @@ "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.1.tgz#9defc53c16fc899e46941fc6901a9eea1c9d8560" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz" integrity sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q== dependencies: "@babel/helper-string-parser" "^7.27.1" @@ -165,161 +165,161 @@ "@emotion/is-prop-valid@1.2.2": version "1.2.2" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz#d4175076679c6a26faa92b03bb786f9e52612337" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz" integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== dependencies: "@emotion/memoize" "^0.8.1" "@emotion/memoize@^0.8.1": version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== "@emotion/unitless@0.8.1": version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== "@esbuild/aix-ppc64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz#830d6476cbbca0c005136af07303646b419f1162" + resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz" integrity sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q== -"@esbuild/android-arm64@0.25.4": - version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz#d11d4fc299224e729e2190cacadbcc00e7a9fd67" - integrity sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A== - "@esbuild/android-arm@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.4.tgz#5660bd25080553dd2a28438f2a401a29959bd9b1" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz" integrity sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ== +"@esbuild/android-arm64@0.25.4": + version "0.25.4" + resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz" + integrity sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A== + "@esbuild/android-x64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.4.tgz#18ddde705bf984e8cd9efec54e199ac18bc7bee1" + resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz" integrity sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ== "@esbuild/darwin-arm64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz#b0b7fb55db8fc6f5de5a0207ae986eb9c4766e67" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz" integrity sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g== "@esbuild/darwin-x64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz#e6813fdeba0bba356cb350a4b80543fbe66bf26f" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz" integrity sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A== "@esbuild/freebsd-arm64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz#dc11a73d3ccdc308567b908b43c6698e850759be" + resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz" integrity sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ== "@esbuild/freebsd-x64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz#91da08db8bd1bff5f31924c57a81dab26e93a143" + resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz" integrity sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ== -"@esbuild/linux-arm64@0.25.4": - version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz#efc15e45c945a082708f9a9f73bfa8d4db49728a" - integrity sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ== - "@esbuild/linux-arm@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz#9b93c3e54ac49a2ede6f906e705d5d906f6db9e8" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz" integrity sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ== +"@esbuild/linux-arm64@0.25.4": + version "0.25.4" + resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz" + integrity sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ== + "@esbuild/linux-ia32@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz#be8ef2c3e1d99fca2d25c416b297d00360623596" + resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz" integrity sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ== "@esbuild/linux-loong64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz#b0840a2707c3fc02eec288d3f9defa3827cd7a87" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz" integrity sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA== "@esbuild/linux-mips64el@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz#2a198e5a458c9f0e75881a4e63d26ba0cf9df39f" + resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz" integrity sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg== "@esbuild/linux-ppc64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz#64f4ae0b923d7dd72fb860b9b22edb42007cf8f5" + resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz" integrity sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag== "@esbuild/linux-riscv64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz#fb2844b11fdddd39e29d291c7cf80f99b0d5158d" + resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz" integrity sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA== "@esbuild/linux-s390x@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz#1466876e0aa3560c7673e63fdebc8278707bc750" + resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz" integrity sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g== "@esbuild/linux-x64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz#c10fde899455db7cba5f11b3bccfa0e41bf4d0cd" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz" integrity sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA== "@esbuild/netbsd-arm64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz#02e483fbcbe3f18f0b02612a941b77be76c111a4" + resolved "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz" integrity sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ== "@esbuild/netbsd-x64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz#ec401fb0b1ed0ac01d978564c5fc8634ed1dc2ed" + resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz" integrity sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw== "@esbuild/openbsd-arm64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz#f272c2f41cfea1d91b93d487a51b5c5ca7a8c8c4" + resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz" integrity sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A== "@esbuild/openbsd-x64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz#2e25950bc10fa9db1e5c868e3d50c44f7c150fd7" + resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz" integrity sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw== "@esbuild/sunos-x64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz#cd596fa65a67b3b7adc5ecd52d9f5733832e1abd" + resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz" integrity sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q== "@esbuild/win32-arm64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz#b4dbcb57b21eeaf8331e424c3999b89d8951dc88" + resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz" integrity sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ== "@esbuild/win32-ia32@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz#410842e5d66d4ece1757634e297a87635eb82f7a" + resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz" integrity sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg== "@esbuild/win32-x64@0.25.4": version "0.25.4" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz#0b17ec8a70b2385827d52314c1253160a0b9bacc" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz" integrity sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ== "@eslint-community/eslint-utils@^4.2.0": version "4.7.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz" integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== dependencies: eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.12.1": version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/config-array@^0.20.0": version "0.20.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.0.tgz#7a1232e82376712d3340012a2f561a2764d1988f" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz" integrity sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ== dependencies: "@eslint/object-schema" "^2.1.6" @@ -328,19 +328,19 @@ "@eslint/config-helpers@^0.2.1": version "0.2.2" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.2.tgz#3779f76b894de3a8ec4763b79660e6d54d5b1010" + resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz" integrity sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg== "@eslint/core@^0.13.0": version "0.13.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.13.0.tgz#bf02f209846d3bf996f9e8009db62df2739b458c" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz" integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw== dependencies: "@types/json-schema" "^7.0.15" "@eslint/eslintrc@^3.3.1": version "3.3.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz" integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== dependencies: ajv "^6.12.4" @@ -353,19 +353,19 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.26.0", "@eslint/js@^9.21.0": +"@eslint/js@^9.21.0", "@eslint/js@9.26.0": version "9.26.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.26.0.tgz#1e13126b67a3db15111d2dcc61f69a2acff70bd5" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz" integrity sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ== "@eslint/object-schema@^2.1.6": version "2.1.6" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz" integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== "@eslint/plugin-kit@^0.2.8": version "0.2.8" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz#47488d8f8171b5d4613e833313f3ce708e3525f8" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz" integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA== dependencies: "@eslint/core" "^0.13.0" @@ -373,12 +373,12 @@ "@humanfs/core@^0.19.1": version "0.19.1" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== "@humanfs/node@^0.16.6": version "0.16.6" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz" integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== dependencies: "@humanfs/core" "^0.19.1" @@ -386,22 +386,22 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/retry@^0.3.0": version "0.3.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz" integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== "@humanwhocodes/retry@^0.4.2": version "0.4.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== "@jridgewell/gen-mapping@^0.3.5": version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -410,22 +410,22 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -433,19 +433,19 @@ "@lottiefiles/dotlottie-react@^0.13.5": version "0.13.5" - resolved "https://registry.yarnpkg.com/@lottiefiles/dotlottie-react/-/dotlottie-react-0.13.5.tgz#19344572316f6e8a5677ad7b777c4b9057c8d302" + resolved "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.13.5.tgz" integrity sha512-4U5okwjRqDPkjB572hfZtLXJ/LGfCo6vDwUB2KIPEUoSgqbIlw+UrbnaqVp3GS+dRvhMD27F2JObpHpYRlpF0Q== dependencies: "@lottiefiles/dotlottie-web" "0.44.0" "@lottiefiles/dotlottie-web@0.44.0": version "0.44.0" - resolved "https://registry.yarnpkg.com/@lottiefiles/dotlottie-web/-/dotlottie-web-0.44.0.tgz#3c139677f3e1e1f9fbcee10b55fd9129fb046aa7" + resolved "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.44.0.tgz" integrity sha512-IUWKVciDJI/BMWDWnh7j0Ngd0N8q9ySRAwm84aDqIE07qpmdZ7x1rkIpBaU1yHSNqNYHeh1Rxsl+LC3CY4f0KA== "@modelcontextprotocol/sdk@^1.8.0": version "1.11.1" - resolved "https://registry.yarnpkg.com/@modelcontextprotocol/sdk/-/sdk-1.11.1.tgz#c7f4a1432872ef10130f5d9b0072060c17a3946b" + resolved "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.1.tgz" integrity sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ== dependencies: content-type "^1.0.5" @@ -461,107 +461,107 @@ "@rollup/rollup-android-arm-eabi@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz#c228d00a41f0dbd6fb8b7ea819bbfbf1c1157a10" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz" integrity sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg== "@rollup/rollup-android-arm64@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz#e2b38d0c912169fd55d7e38d723aada208d37256" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz" integrity sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw== "@rollup/rollup-darwin-arm64@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz#1fddb3690f2ae33df16d334c613377f05abe4878" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz" integrity sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w== "@rollup/rollup-darwin-x64@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz#818298d11c8109e1112590165142f14be24b396d" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz" integrity sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ== "@rollup/rollup-freebsd-arm64@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz#91a28dc527d5bed7f9ecf0e054297b3012e19618" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz" integrity sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ== "@rollup/rollup-freebsd-x64@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz#28acadefa76b5c7bede1576e065b51d335c62c62" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz" integrity sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q== "@rollup/rollup-linux-arm-gnueabihf@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz#819691464179cbcd9a9f9d3dc7617954840c6186" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz" integrity sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q== "@rollup/rollup-linux-arm-musleabihf@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz#d149207039e4189e267e8724050388effc80d704" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz" integrity sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg== "@rollup/rollup-linux-arm64-gnu@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz#fa72ebddb729c3c6d88973242f1a2153c83e86ec" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz" integrity sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg== "@rollup/rollup-linux-arm64-musl@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz#2054216e34469ab8765588ebf343d531fc3c9228" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz" integrity sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg== "@rollup/rollup-linux-loongarch64-gnu@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz#818de242291841afbfc483a84f11e9c7a11959bc" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz" integrity sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw== "@rollup/rollup-linux-powerpc64le-gnu@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz#0bb4cb8fc4a2c635f68c1208c924b2145eb647cb" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz" integrity sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q== "@rollup/rollup-linux-riscv64-gnu@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz#4b3b8e541b7b13e447ae07774217d98c06f6926d" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz" integrity sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg== "@rollup/rollup-linux-riscv64-musl@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz#e065405e67d8bd64a7d0126c931bd9f03910817f" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz" integrity sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg== "@rollup/rollup-linux-s390x-gnu@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz#dda3265bbbfe16a5d0089168fd07f5ebb2a866fe" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz" integrity sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ== "@rollup/rollup-linux-x64-gnu@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz#90993269b8b995b4067b7b9d72ff1c360ef90a17" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz" integrity sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng== "@rollup/rollup-linux-x64-musl@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz#fdf5b09fd121eb8d977ebb0fda142c7c0167b8de" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz" integrity sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA== "@rollup/rollup-win32-arm64-msvc@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz#6397e1e012db64dfecfed0774cb9fcf89503d716" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz" integrity sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg== "@rollup/rollup-win32-ia32-msvc@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz#df0991464a52a35506103fe18d29913bf8798a0c" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz" integrity sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA== "@rollup/rollup-win32-x64-msvc@4.40.2": version "4.40.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz#8dae04d01a2cbd84d6297d99356674c6b993f0fc" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz" integrity sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA== "@types/babel__core@^7.20.5": version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" @@ -572,14 +572,14 @@ "@types/babel__generator@*": version "7.27.0" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz" integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" @@ -587,41 +587,41 @@ "@types/babel__traverse@*": version "7.20.7" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.7.tgz#968cdc2366ec3da159f61166428ee40f370e56c2" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz" integrity sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng== dependencies: "@babel/types" "^7.20.7" -"@types/estree@1.0.7", "@types/estree@^1.0.6": +"@types/estree@^1.0.6", "@types/estree@1.0.7": version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz" integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== "@types/json-schema@^7.0.15": version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/react-dom@^19.0.4": version "19.1.3" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.1.3.tgz#3f0c60804441bf34d19f8dd0d44405c0c0e21bfa" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.3.tgz" integrity sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg== -"@types/react@^19.0.10": +"@types/react@^19.0.0", "@types/react@^19.0.10": version "19.1.3" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.3.tgz#c75a24b775a63280b02c66a55a3cfa04f4022cf7" + resolved "https://registry.npmjs.org/@types/react/-/react-19.1.3.tgz" integrity sha512-dLWQ+Z0CkIvK1J8+wrDPwGxEYFA4RAyHoZPxHVGspYmFVnwGSNT24cGIhFJrtfRnWVuW8X7NO52gCXmhkVUWGQ== dependencies: csstype "^3.0.2" "@types/stylis@4.2.5": version "4.2.5" - resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.5.tgz#1daa6456f40959d06157698a653a9ab0a70281df" + resolved "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz" integrity sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw== "@vitejs/plugin-react@^4.3.4": version "4.4.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz#d7d1e9c9616d7536b0953637edfee7c6cbe2fe0f" + resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz" integrity sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w== dependencies: "@babel/core" "^7.26.10" @@ -632,7 +632,7 @@ accepts@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" + resolved "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz" integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== dependencies: mime-types "^3.0.0" @@ -640,17 +640,17 @@ accepts@^2.0.0: acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.14.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0: version "8.14.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz" integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -660,24 +660,24 @@ ajv@^6.12.4: ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== body-parser@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.0.tgz#f7a9656de305249a715b549b7b8fd1ab9dfddcfa" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz" integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg== dependencies: bytes "^3.1.2" @@ -692,15 +692,15 @@ body-parser@^2.2.0: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" -browserslist@^4.24.0: +browserslist@^4.24.0, "browserslist@>= 4.21.0": version "4.24.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.5.tgz#aa0f5b8560fe81fde84c6dcb38f759bafba0e11b" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz" integrity sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw== dependencies: caniuse-lite "^1.0.30001716" @@ -708,14 +708,14 @@ browserslist@^4.24.0: node-releases "^2.0.19" update-browserslist-db "^1.1.3" -bytes@3.1.2, bytes@^3.1.2: +bytes@^3.1.2, bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" @@ -723,7 +723,7 @@ call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: call-bound@^1.0.2: version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== dependencies: call-bind-apply-helpers "^1.0.2" @@ -731,22 +731,22 @@ call-bound@^1.0.2: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelize@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" + resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz" integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== caniuse-lite@^1.0.30001716: version "1.0.30001717" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz#5d9fec5ce09796a1893013825510678928aca129" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz" integrity sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw== chalk@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -754,51 +754,51 @@ chalk@^4.0.0: color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== content-disposition@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.0.tgz#844426cb398f934caefcbb172200126bc7ceace2" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz" integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg== dependencies: safe-buffer "5.2.1" content-type@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz" integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== cookie@^0.7.1: version "0.7.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== cors@^2.8.5: version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: object-assign "^4" @@ -806,7 +806,7 @@ cors@^2.8.5: cross-spawn@^7.0.3, cross-spawn@^7.0.6: version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -815,43 +815,43 @@ cross-spawn@^7.0.3, cross-spawn@^7.0.6: css-color-keywords@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz" integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== css-to-react-native@3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" + resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz" integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== dependencies: camelize "^1.0.0" css-color-keywords "^1.0.0" postcss-value-parser "^4.0.2" -csstype@3.1.3, csstype@^3.0.2: +csstype@^3.0.2, csstype@3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.5, debug@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -depd@2.0.0, depd@^2.0.0: +depd@^2.0.0, depd@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== dunder-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: call-bind-apply-helpers "^1.0.1" @@ -860,39 +860,39 @@ dunder-proto@^1.0.1: ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.5.149: version "1.5.151" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.151.tgz#5edd6c17e1b2f14b4662c41b9379f96cc8c2bb7c" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.151.tgz" integrity sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA== encodeurl@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== es-define-property@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" esbuild@^0.25.0: version "0.25.4" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.4.tgz#bb9a16334d4ef2c33c7301a924b8b863351a0854" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz" integrity sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q== optionalDependencies: "@esbuild/aix-ppc64" "0.25.4" @@ -923,32 +923,32 @@ esbuild@^0.25.0: escalade@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-plugin-react-hooks@^5.1.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz#1be0080901e6ac31ce7971beed3d3ec0a423d9e3" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz" integrity sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg== eslint-plugin-react-refresh@^0.4.19: version "0.4.20" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz#3bbfb5c8637e28d19ce3443686445e502ecd18ba" + resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz" integrity sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA== eslint-scope@^8.3.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz" integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== dependencies: esrecurse "^4.3.0" @@ -956,17 +956,17 @@ eslint-scope@^8.3.0: eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint-visitor-keys@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz" integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== -eslint@^9.21.0: +"eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^9.21.0, eslint@>=8.40: version "9.26.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.26.0.tgz#978fe029adc2aceed28ab437bca876e83461c3b4" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz" integrity sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -1009,7 +1009,7 @@ eslint@^9.21.0: espree@^10.0.1, espree@^10.3.0: version "10.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + resolved "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz" integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== dependencies: acorn "^8.14.0" @@ -1018,53 +1018,53 @@ espree@^10.0.1, espree@^10.3.0: esquery@^1.5.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@^1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eventsource-parser@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/eventsource-parser/-/eventsource-parser-3.0.1.tgz#5e358dba9a55ba64ca90da883c4ca35bd82467bd" + resolved "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz" integrity sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA== eventsource@^3.0.2: version "3.0.6" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-3.0.6.tgz#5c4b24cd70c0323eed2651a5ee07bd4bc391e656" + resolved "https://registry.npmjs.org/eventsource/-/eventsource-3.0.6.tgz" integrity sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA== dependencies: eventsource-parser "^3.0.1" express-rate-limit@^7.5.0: version "7.5.0" - resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-7.5.0.tgz#6a67990a724b4fbbc69119419feef50c51e8b28f" + resolved "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz" integrity sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg== -express@^5.0.1: +"express@^4.11 || 5 || ^5.0.0-beta.1", express@^5.0.1: version "5.1.0" - resolved "https://registry.yarnpkg.com/express/-/express-5.1.0.tgz#d31beaf715a0016f0d53f47d3b4d7acf28c75cc9" + resolved "https://registry.npmjs.org/express/-/express-5.1.0.tgz" integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA== dependencies: accepts "^2.0.0" @@ -1097,34 +1097,34 @@ express@^5.0.1: fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fdir@^6.4.4: version "6.4.4" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz" integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== file-entry-cache@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: flat-cache "^4.0.0" finalhandler@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.0.tgz#72306373aa89d05a8242ed569ed86a1bff7c561f" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz" integrity sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q== dependencies: debug "^4.4.0" @@ -1136,7 +1136,7 @@ finalhandler@^2.1.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -1144,7 +1144,7 @@ find-up@^5.0.0: flat-cache@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" @@ -1152,37 +1152,37 @@ flat-cache@^4.0.0: flatted@^3.2.9: version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" + resolved "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz" integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: call-bind-apply-helpers "^1.0.2" @@ -1198,7 +1198,7 @@ get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: get-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: dunder-proto "^1.0.1" @@ -1206,51 +1206,51 @@ get-proto@^1.0.1: glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^14.0.0: version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== globals@^15.15.0: version "15.15.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" + resolved "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz" integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== gopd@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-symbols@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" -http-errors@2.0.0, http-errors@^2.0.0: +http-errors@^2.0.0, http-errors@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -1259,21 +1259,21 @@ http-errors@2.0.0, http-errors@^2.0.0: statuses "2.0.1" toidentifier "1.0.1" -iconv-lite@0.6.3, iconv-lite@^0.6.3: +iconv-lite@^0.6.3, iconv-lite@0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" ignore@^5.2.0: version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" @@ -1281,88 +1281,88 @@ import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inherits@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-glob@^4.0.0, is-glob@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-promise@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz" integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsesc@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== keyv@^4.5.4: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -1370,109 +1370,109 @@ levn@^0.4.1: locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" math-intrinsics@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== media-typer@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz" integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== merge-descriptors@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz" integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== mime-db@^1.54.0: version "1.54.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== mime-types@^3.0.0, mime-types@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz" integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== dependencies: mime-db "^1.54.0" minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== nanoid@^3.3.7, nanoid@^3.3.8: version "3.3.11" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz" integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== node-releases@^2.0.19: version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== object-assign@^4: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.3: version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== on-finished@^2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" optionator@^0.9.3: version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -1484,91 +1484,91 @@ optionator@^0.9.3: p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parseurl@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-to-regexp@^8.0.0: version "8.2.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz" integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^4.0.2: +"picomatch@^3 || ^4", picomatch@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== pkce-challenge@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/pkce-challenge/-/pkce-challenge-5.0.0.tgz#c3a405cb49e272094a38e890a2b51da0228c4d97" + resolved "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz" integrity sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ== postcss-value-parser@^4.0.2: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.49: - version "8.4.49" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" - integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== - dependencies: - nanoid "^3.3.7" - picocolors "^1.1.1" - source-map-js "^1.2.1" - postcss@^8.5.3: version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz" integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== dependencies: nanoid "^3.3.8" picocolors "^1.1.1" source-map-js "^1.2.1" +postcss@8.4.49: + version "8.4.49" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== + dependencies: + nanoid "^3.3.7" + picocolors "^1.1.1" + source-map-js "^1.2.1" + prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== proxy-addr@^2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -1576,24 +1576,24 @@ proxy-addr@^2.0.7: punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== qs@^6.14.0: version "6.14.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + resolved "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz" integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== dependencies: side-channel "^1.1.0" range-parser@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.0.tgz#25b3476f07a51600619dae3fe82ddc28a36e5e0f" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz" integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g== dependencies: bytes "3.1.2" @@ -1601,31 +1601,31 @@ raw-body@^3.0.0: iconv-lite "0.6.3" unpipe "1.0.0" -react-dom@^19.0.0: +react-dom@^19.0.0, "react-dom@>= 16.8.0": version "19.1.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.1.0.tgz#133558deca37fa1d682708df8904b25186793623" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz" integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== dependencies: scheduler "^0.26.0" react-refresh@^0.17.0: version "0.17.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz" integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== -react@^19.0.0: +"react@^17 || ^18 || ^19", react@^19.0.0, react@^19.1.0, "react@>= 16.8.0": version "19.1.0" - resolved "https://registry.yarnpkg.com/react/-/react-19.1.0.tgz#926864b6c48da7627f004795d6cce50e90793b75" + resolved "https://registry.npmjs.org/react/-/react-19.1.0.tgz" integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== rollup@^4.34.9: version "4.40.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.2.tgz#778e88b7a197542682b3e318581f7697f55f0619" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz" integrity sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg== dependencies: "@types/estree" "1.0.7" @@ -1654,7 +1654,7 @@ rollup@^4.34.9: router@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" + resolved "https://registry.npmjs.org/router/-/router-2.2.0.tgz" integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== dependencies: debug "^4.4.0" @@ -1665,27 +1665,27 @@ router@^2.2.0: safe-buffer@5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== scheduler@^0.26.0: version "0.26.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz" integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== send@^1.1.0, send@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212" + resolved "https://registry.npmjs.org/send/-/send-1.2.0.tgz" integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== dependencies: debug "^4.3.5" @@ -1702,7 +1702,7 @@ send@^1.1.0, send@^1.2.0: serve-static@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz" integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== dependencies: encodeurl "^2.0.0" @@ -1712,29 +1712,29 @@ serve-static@^2.2.0: setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== shallowequal@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== side-channel-list@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: es-errors "^1.3.0" @@ -1742,7 +1742,7 @@ side-channel-list@^1.0.0: side-channel-map@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== dependencies: call-bound "^1.0.2" @@ -1752,7 +1752,7 @@ side-channel-map@^1.0.1: side-channel-weakmap@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== dependencies: call-bound "^1.0.2" @@ -1763,7 +1763,7 @@ side-channel-weakmap@^1.0.2: side-channel@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: es-errors "^1.3.0" @@ -1774,22 +1774,22 @@ side-channel@^1.1.0: source-map-js@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== -statuses@2.0.1, statuses@^2.0.1: +statuses@^2.0.1, statuses@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== styled-components@^6.1.17: version "6.1.18" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.18.tgz#9647497a92326ba9d758051c914f15004d524bb9" + resolved "https://registry.npmjs.org/styled-components/-/styled-components-6.1.18.tgz" integrity sha512-Mvf3gJFzZCkhjY2Y/Fx9z1m3dxbza0uI9H1CbNZm/jSHCojzJhQ0R7bByrlFJINnMzz/gPulpoFFGymNwrsMcw== dependencies: "@emotion/is-prop-valid" "1.2.2" @@ -1804,19 +1804,19 @@ styled-components@^6.1.17: stylis@4.3.2: version "4.3.2" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.2.tgz#8f76b70777dd53eb669c6f58c997bf0a9972e444" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz" integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg== supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" tinyglobby@^0.2.13: version "0.2.13" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz" integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== dependencies: fdir "^6.4.4" @@ -1824,24 +1824,24 @@ tinyglobby@^0.2.13: toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tslib@2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-is@^2.0.0, type-is@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" + resolved "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz" integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== dependencies: content-type "^1.0.5" @@ -1850,12 +1850,12 @@ type-is@^2.0.0, type-is@^2.0.1: unpipe@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== update-browserslist-db@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== dependencies: escalade "^3.2.0" @@ -1863,19 +1863,19 @@ update-browserslist-db@^1.1.3: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" vary@^1, vary@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vite@^6.2.0: +"vite@^4.2.0 || ^5.0.0 || ^6.0.0", vite@^6.2.0: version "6.3.5" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.3.5.tgz#fec73879013c9c0128c8d284504c6d19410d12a3" + resolved "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz" integrity sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ== dependencies: esbuild "^0.25.0" @@ -1889,37 +1889,37 @@ vite@^6.2.0: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zod-to-json-schema@^3.24.1: version "3.24.5" - resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz#d1095440b147fb7c2093812a53c54df8d5df50a3" + resolved "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz" integrity sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g== -zod@^3.23.8, zod@^3.24.2: +zod@^3.23.8, zod@^3.24.1, zod@^3.24.2: version "3.24.4" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.4.tgz#e2e2cca5faaa012d76e527d0d36622e0a90c315f" + resolved "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz" integrity sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg== From 2127dc958afbf8516e33372e8aa13fc6162e7c7c Mon Sep 17 00:00:00 2001 From: Sofie Date: Tue, 10 Jun 2025 11:40:04 +0200 Subject: [PATCH 49/72] added browser routes --- package.json | 1 + src/App.jsx | 13 +++++++++++-- src/Pages/Home.jsx | 31 +++++++++++++++++++++++++++++++ src/Sections/Post.jsx | 13 +++++++------ src/Sections/Thoughts.jsx | 8 ++++---- yarn.lock | 29 +++++++++++++++++++++++++++-- 6 files changed, 81 insertions(+), 14 deletions(-) create mode 100644 src/Pages/Home.jsx diff --git a/package.json b/package.json index a6a307789..170d4644c 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@lottiefiles/dotlottie-react": "^0.13.5", "react": "^19.0.0", "react-dom": "^19.0.0", + "react-router-dom": "^7.6.2", "styled-components": "^6.1.17" }, "devDependencies": { diff --git a/src/App.jsx b/src/App.jsx index 16a13e423..383bc3693 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,6 +1,15 @@ -import React from "react"; +import { BrowserRouter, Routes, Route } from "react-router-dom"; import { Thoughts } from "./Sections/Thoughts"; +import { Home } from "./Pages/Home" export const App = () => { - return ; + return ( + + + } /> + } /> + + + ) + }; \ No newline at end of file diff --git a/src/Pages/Home.jsx b/src/Pages/Home.jsx new file mode 100644 index 000000000..c47d1988e --- /dev/null +++ b/src/Pages/Home.jsx @@ -0,0 +1,31 @@ +import { PostContainer, Title, InputWrapper, InputArea, SubmitButtonContainer, Button } from "../Sections/Post" +import { Container } from "../Sections/Thoughts" +import { DotLottieReact } from '@lottiefiles/dotlottie-react'; + +export const Home = () => { + return ( + <> +

Home page

+ See all thoughts + + +

Welcome to Happy Thoughts ❤️

+ Log in + + + Username: + + Password: + + + + +
+ + ) +} \ No newline at end of file diff --git a/src/Sections/Post.jsx b/src/Sections/Post.jsx index c4ee2f6ab..23ef8d45e 100644 --- a/src/Sections/Post.jsx +++ b/src/Sections/Post.jsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import styled, { keyframes } from 'styled-components'; -const PostContainer = styled.div` +export const PostContainer = styled.div` display: flex; flex-direction: column; align-items: left; @@ -16,7 +16,7 @@ const PostContainer = styled.div` box-sizing: border-box; `; -const Title = styled.h2` +export const Title = styled.h2` font-size: 16px; color: #000; font-weight: 500; @@ -24,10 +24,11 @@ const Title = styled.h2` letter-spacing: 0.2px; `; -const InputWrapper = styled.div` +export const InputWrapper = styled.div` display: flex; align-items: center; justify-content: space-between; + flex-wrap: wrap; width: 100%; position: relative; `; @@ -50,7 +51,7 @@ const CircleText = styled.text` dominant-baseline: central; `; -const InputArea = styled.textarea` +export const InputArea = styled.textarea` width: 90%; border: 2px solid #7a7b7b; padding: 10px; @@ -68,7 +69,7 @@ const InputArea = styled.textarea` } `; -const SubmitButtonContainer = styled.div` +export const SubmitButtonContainer = styled.div` display: flex; flex-direction: row; justify-content: space-between; @@ -76,7 +77,7 @@ const SubmitButtonContainer = styled.div` align-items: center; `; -const Button = styled.button` +export const Button = styled.button` background-color: #fdafaf; color: #000; font-weight: 600; diff --git a/src/Sections/Thoughts.jsx b/src/Sections/Thoughts.jsx index b1b5cb9d2..5315734cd 100644 --- a/src/Sections/Thoughts.jsx +++ b/src/Sections/Thoughts.jsx @@ -4,7 +4,7 @@ import { View } from './View'; import { styled, keyframes } from 'styled-components'; import { DotLottieReact } from '@lottiefiles/dotlottie-react'; -const Container = styled.div` +export const Container = styled.div` display: flex; flex-direction: column; align-items: center; @@ -13,7 +13,7 @@ const Container = styled.div` gap: 30px; `; -const BaseHeading = styled.h1` +export const BaseHeading = styled.h1` color: rgb(42, 42, 42); text-align: center; font-weight: 500; @@ -21,11 +21,11 @@ const BaseHeading = styled.h1` letter-spacing: 0.2px; `; -const Heading = styled(BaseHeading)` +export const Heading = styled(BaseHeading)` font-size: 22px; `; -const SubHeading = styled(BaseHeading)` +export const SubHeading = styled(BaseHeading)` font-size: 15px; `; diff --git a/yarn.lock b/yarn.lock index ca98339da..89c861c5b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -796,6 +796,11 @@ cookie@^0.7.1: resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== +cookie@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz" + integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== + cors@^2.8.5: version "2.8.5" resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" @@ -1601,7 +1606,7 @@ raw-body@^3.0.0: iconv-lite "0.6.3" unpipe "1.0.0" -react-dom@^19.0.0, "react-dom@>= 16.8.0": +react-dom@^19.0.0, "react-dom@>= 16.8.0", react-dom@>=18: version "19.1.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz" integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== @@ -1613,7 +1618,22 @@ react-refresh@^0.17.0: resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz" integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== -"react@^17 || ^18 || ^19", react@^19.0.0, react@^19.1.0, "react@>= 16.8.0": +react-router-dom@^7.6.2: + version "7.6.2" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.2.tgz" + integrity sha512-Q8zb6VlTbdYKK5JJBLQEN06oTUa/RAbG/oQS1auK1I0TbJOXktqm+QENEVJU6QvWynlXPRBXI3fiOQcSEA78rA== + dependencies: + react-router "7.6.2" + +react-router@7.6.2: + version "7.6.2" + resolved "https://registry.npmjs.org/react-router/-/react-router-7.6.2.tgz" + integrity sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w== + dependencies: + cookie "^1.0.1" + set-cookie-parser "^2.6.0" + +"react@^17 || ^18 || ^19", react@^19.0.0, react@^19.1.0, "react@>= 16.8.0", react@>=18: version "19.1.0" resolved "https://registry.npmjs.org/react/-/react-19.1.0.tgz" integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== @@ -1710,6 +1730,11 @@ serve-static@^2.2.0: parseurl "^1.3.3" send "^1.2.0" +set-cookie-parser@^2.6.0: + version "2.7.1" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz" + integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" From 822a8272d803bd050992aa66ebdaf140b54c8c64 Mon Sep 17 00:00:00 2001 From: Sofie Date: Tue, 10 Jun 2025 11:48:46 +0200 Subject: [PATCH 50/72] edit login --- src/Pages/Home.jsx | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/Pages/Home.jsx b/src/Pages/Home.jsx index c47d1988e..edcdaa314 100644 --- a/src/Pages/Home.jsx +++ b/src/Pages/Home.jsx @@ -1,5 +1,4 @@ -import { PostContainer, Title, InputWrapper, InputArea, SubmitButtonContainer, Button } from "../Sections/Post" -import { Container } from "../Sections/Thoughts" +import { Title, Button } from "../Sections/Post" import { DotLottieReact } from '@lottiefiles/dotlottie-react'; export const Home = () => { @@ -7,7 +6,7 @@ export const Home = () => { <>

Home page

See all thoughts - +
{ />

Welcome to Happy Thoughts ❤️

Log in - - +
+
Username: Password: - - - - +
+
+
+
) } \ No newline at end of file From 3c4ce8805bc18b319d39355bd7163e43d82782b5 Mon Sep 17 00:00:00 2001 From: Sofie Date: Wed, 11 Jun 2025 12:23:11 +0200 Subject: [PATCH 51/72] update nav --- src/App.jsx | 6 ++++ src/Pages/Home.jsx | 26 ++------------ src/Pages/Login.jsx | 30 ++++++++++++++++ src/Pages/Register.jsx | 30 ++++++++++++++++ src/Sections/Components/Nav.jsx | 61 +++++++++++++++++++++++++++++++++ src/index.css | 4 +++ 6 files changed, 134 insertions(+), 23 deletions(-) create mode 100644 src/Pages/Login.jsx create mode 100644 src/Pages/Register.jsx create mode 100644 src/Sections/Components/Nav.jsx diff --git a/src/App.jsx b/src/App.jsx index 383bc3693..39f8eedd2 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,13 +1,19 @@ import { BrowserRouter, Routes, Route } from "react-router-dom"; import { Thoughts } from "./Sections/Thoughts"; import { Home } from "./Pages/Home" +import { Login } from "./Pages/Login" +import { Register } from "./Pages/Register" +import { Nav } from "./Sections/Components/Nav" export const App = () => { return ( +