diff --git a/package-lock.json b/package-lock.json index 3c7a771..91eaa6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,8 @@ "dependencies": { "@titaniumnetwork-dev/ultraviolet": "^2.0.0", "@tomphttp/bare-server-node": "^2.0.1", + "classnames": "^2.3.2", + "framer-motion": "^10.16.16", "i18next": "^23.7.9", "i18next-browser-languagedetector": "^7.2.0", "million": "^2.6.4", @@ -479,6 +481,21 @@ "node": ">=6.9.0" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, "node_modules/@esbuild/android-arm": { "version": "0.19.9", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", @@ -2034,6 +2051,11 @@ "node": ">= 6" } }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -3111,6 +3133,34 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/framer-motion": { + "version": "10.16.16", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.16.16.tgz", + "integrity": "sha512-je6j91rd7NmUX7L1XHouwJ4v3R+SO4umso2LUcgOct3rHZ0PajZ80ETYZTajzEXEl9DlKyzjyt4AvGQ+lrebOw==", + "dependencies": { + "tslib": "^2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/framer-motion/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", diff --git a/src/components/Header.tsx b/src/components/Header.tsx index a9a3dc2..902fe95 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -30,7 +30,7 @@ export function Header() {
diff --git a/src/pages/Settings/Dropdown.tsx b/src/pages/Settings/Dropdown.tsx new file mode 100644 index 0000000..80d9648 --- /dev/null +++ b/src/pages/Settings/Dropdown.tsx @@ -0,0 +1,40 @@ +import { useState } from "preact/hooks"; + +const Dropdown = ({ name, options }: { name: string; options: string[] }) => { + const [isOpen, setIsOpen] = useState(false); + const [choice, setChoice] = useState( + localStorage.getItem(name) || options[0] + ); + + return ( +
+

{name}

+
setIsOpen(!isOpen)} + > +
{choice}
+ {isOpen && ( +
+ {options.map((option: string) => ( +
{ + setIsOpen(false); + setChoice(option); + localStorage.setItem(name, option); + }} + > + {option} +
+ ))} +
+ )} +
+
+ ); +}; + +export default Dropdown; + diff --git a/src/pages/Settings/Proxy.tsx b/src/pages/Settings/Proxy.tsx index ee7f068..eab9061 100644 --- a/src/pages/Settings/Proxy.tsx +++ b/src/pages/Settings/Proxy.tsx @@ -1,19 +1,27 @@ import { motion } from "framer-motion"; import { tabContentVariant, settingsPageVariant } from "./Variants"; +import Dropdown from "./Dropdown"; -const Proxy = ({ id, active }) => ( - - -

Porxy

+const Proxy = ({ id, active }) => { + const engines = ["Automatic", "Ultraviolet", "Rammerhead", "Dynamic"]; + + return ( + + + + -
-); - + ); +}; export default Proxy; + diff --git a/src/themes/main.css b/src/themes/main.css index 983f7a9..30bd5da 100644 --- a/src/themes/main.css +++ b/src/themes/main.css @@ -14,6 +14,7 @@ --input-border-color: #eb6f92; --input-border-size: 1.3px; --navbar-logo-filter: none; + --dropdown-option-hover-color: #6ba6ea; } .font-inter { @@ -24,3 +25,4 @@ .font-roboto { font-family: "Roboto"; } + diff --git a/tailwind.config.js b/tailwind.config.js index bf39f6b..6549176 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -10,9 +10,11 @@ export default { "text-hover-color": "var(--navbar-link-hover-color)", input: "var(--input-background-color)", "input-text": "var(--input-text-color)", - "input-border-color": "var(--input-border-color)" + "input-border-color": "var(--input-border-color)", + "dropdown-option-hover-color": "var(--dropdown-option-hover-color)" }, extend: {} }, plugins: [] }; +