From c19cfe05e199e7e0a63f56cfe0b8ea3bd61dd951 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 19 Feb 2025 20:41:57 -0600 Subject: [PATCH 001/157] changes to packages --- .env.example | 1 - package-lock.json | 750 ++++++++++++++++++++++++++-------------------- package.json | 2 +- 3 files changed, 428 insertions(+), 325 deletions(-) delete mode 100644 .env.example diff --git a/.env.example b/.env.example deleted file mode 100644 index 449cb7e2..00000000 --- a/.env.example +++ /dev/null @@ -1 +0,0 @@ -REACT_APP_BACKEND_URL=http://localhost:5050 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d130e671..883801b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "react-router-dom": "^7.0.2", - "react-scripts": "5.0.1", + "react-scripts": "^5.0.1", "styled-components": "^6.1.13", "web-vitals": "^4.2.4" }, @@ -72,9 +72,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -120,9 +120,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz", - "integrity": "sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.26.8.tgz", + "integrity": "sha512-3tBctaHRW6xSub26z7n8uyOTwwUsCdvIug/oxBH9n6yCO5hMj2vwDJAo7RbBMKrM7P+W2j61zLKviJQFGOYKMg==", "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -156,13 +156,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -184,12 +184,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -336,9 +336,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -446,12 +446,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -953,14 +953,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.8" }, "engines": { "node": ">=6.9.0" @@ -987,12 +987,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1201,13 +1201,13 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz", - "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.26.5.tgz", + "integrity": "sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-flow": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/plugin-syntax-flow": "^7.26.0" }, "engines": { "node": ">=6.9.0" @@ -1217,12 +1217,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { @@ -1407,12 +1407,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1691,13 +1691,13 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.9.tgz", + "integrity": "sha512-Jf+8y9wXQbbxvVYTM8gO5oEF2POdNji0NMltEkG7FtmzD9PVz7/lxpqSdTvwsjTMU5HIHuDVNf2SOxLkWi+wPQ==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", @@ -1710,6 +1710,19 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1766,12 +1779,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1781,12 +1794,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1796,14 +1809,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", - "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz", + "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9" }, @@ -1878,14 +1891,14 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", - "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", @@ -1897,9 +1910,9 @@ "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", "@babel/plugin-transform-block-scoping": "^7.25.9", "@babel/plugin-transform-class-properties": "^7.25.9", "@babel/plugin-transform-class-static-block": "^7.26.0", @@ -1910,21 +1923,21 @@ "@babel/plugin-transform-duplicate-keys": "^7.25.9", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", "@babel/plugin-transform-function-name": "^7.25.9", "@babel/plugin-transform-json-strings": "^7.25.9", "@babel/plugin-transform-literals": "^7.25.9", "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", "@babel/plugin-transform-member-expression-literals": "^7.25.9", "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", "@babel/plugin-transform-modules-systemjs": "^7.25.9", "@babel/plugin-transform-modules-umd": "^7.25.9", "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", "@babel/plugin-transform-numeric-separator": "^7.25.9", "@babel/plugin-transform-object-rest-spread": "^7.25.9", "@babel/plugin-transform-object-super": "^7.25.9", @@ -1940,17 +1953,17 @@ "@babel/plugin-transform-shorthand-properties": "^7.25.9", "@babel/plugin-transform-spread": "^7.25.9", "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", "@babel/plugin-transform-unicode-escapes": "^7.25.9", "@babel/plugin-transform-unicode-property-regex": "^7.25.9", "@babel/plugin-transform-unicode-regex": "^7.25.9", "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", + "core-js-compat": "^3.40.0", "semver": "^6.3.1" }, "engines": { @@ -2023,9 +2036,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz", + "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2035,30 +2048,30 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2076,9 +2089,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -3237,9 +3250,9 @@ "license": "MIT" }, "node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", - "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.5.tgz", + "integrity": "sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==", "license": "MIT" }, "node_modules/@sinclair/typebox": { @@ -3676,9 +3689,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz", - "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -3721,9 +3734,9 @@ "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3772,9 +3785,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", - "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "license": "MIT", "dependencies": { "undici-types": "~6.20.0" @@ -3808,9 +3821,9 @@ "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -3898,9 +3911,9 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", + "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -5026,13 +5039,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -5099,9 +5112,9 @@ } }, "node_modules/babel-preset-react-app": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", - "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.1.0.tgz", + "integrity": "sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==", "license": "MIT", "dependencies": { "@babel/core": "^7.16.0", @@ -5111,6 +5124,7 @@ "@babel/plugin-proposal-numeric-separator": "^7.16.0", "@babel/plugin-proposal-optional-chaining": "^7.16.0", "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", "@babel/plugin-transform-flow-strip-types": "^7.16.0", "@babel/plugin-transform-react-display-name": "^7.16.0", "@babel/plugin-transform-runtime": "^7.16.4", @@ -5122,6 +5136,25 @@ "babel-plugin-transform-react-remove-prop-types": "^0.4.24" } }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -5273,9 +5306,9 @@ "license": "BSD-2-Clause" }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "funding": [ { "type": "opencollective", @@ -5292,9 +5325,9 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -5371,6 +5404,22 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -5433,9 +5482,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001687", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", - "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "version": "1.0.30001700", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", + "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", "funding": [ { "type": "opencollective", @@ -5553,9 +5602,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "license": "MIT" }, "node_modules/clean-css": { @@ -5770,9 +5819,9 @@ } }, "node_modules/compression": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", - "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -5866,9 +5915,9 @@ "license": "MIT" }, "node_modules/core-js": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", - "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz", + "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -5877,12 +5926,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", "license": "MIT", "dependencies": { - "browserslist": "^4.24.2" + "browserslist": "^4.24.3" }, "funding": { "type": "opencollective", @@ -5890,9 +5939,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.39.0.tgz", - "integrity": "sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.40.0.tgz", + "integrity": "sha512-AtDzVIgRrmRKQai62yuSIN5vNiQjcJakJb4fbhVw3ehxx7Lohphvw9SGNWKhLFqSxC4ilD0g/L1huAYFQU3Q6A==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -6438,9 +6487,9 @@ } }, "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", "license": "MIT" }, "node_modules/dedent": { @@ -6763,12 +6812,12 @@ "license": "BSD-2-Clause" }, "node_modules/dunder-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", - "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", + "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" }, @@ -6810,9 +6859,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.72", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz", - "integrity": "sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==", + "version": "1.5.102", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz", + "integrity": "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==", "license": "ISC" }, "node_modules/emittery": { @@ -6852,9 +6901,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -7002,9 +7051,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "license": "MIT" }, "node_modules/es-object-atoms": { @@ -7020,14 +7069,15 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -7989,9 +8039,19 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "BSD-3-Clause" }, "node_modules/fastq": { @@ -8363,14 +8423,15 @@ } }, "node_modules/form-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz", - "integrity": "sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz", + "integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -8502,19 +8563,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.5.tgz", - "integrity": "sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "dunder-proto": "^1.0.0", + "call-bind-apply-helpers": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", + "get-proto": "^1.0.0", "gopd": "^1.2.0", "has-symbols": "^1.1.0", - "hasown": "^2.0.2" + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8538,6 +8601,19 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -9046,9 +9122,9 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", + "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", "license": "MIT" }, "node_modules/http-proxy": { @@ -9388,9 +9464,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -10429,6 +10505,15 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/jest-serializer": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", @@ -10853,9 +10938,9 @@ } }, "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", "bin": { "jiti": "bin/jiti.js" @@ -11094,9 +11179,9 @@ } }, "node_modules/launch-editor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", - "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", "license": "MIT", "dependencies": { "picocolors": "^1.0.0", @@ -11378,6 +11463,15 @@ "tmpl": "1.0.5" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", @@ -12265,9 +12359,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "funding": [ { "type": "opencollective", @@ -12284,7 +12378,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -12798,9 +12892,9 @@ } }, "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -12966,9 +13060,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", - "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", @@ -12983,9 +13077,9 @@ } }, "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -13011,9 +13105,9 @@ } }, "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -13823,10 +13917,23 @@ "dev": true, "license": "MIT" }, + "node_modules/prettier-eslint/node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/prettier-eslint/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -13898,6 +14005,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -13937,12 +14050,6 @@ "react-is": "^16.13.1" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -14242,15 +14349,15 @@ } }, "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz", + "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==", "license": "MIT" }, "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, "node_modules/react-refresh": { @@ -14487,9 +14594,9 @@ } }, "node_modules/regex-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", "license": "MIT" }, "node_modules/regexp.prototype.flags": { @@ -14824,14 +14931,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -14953,9 +15061,9 @@ "license": "MIT" }, "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -14964,7 +15072,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -15270,15 +15378,69 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -15777,12 +15939,12 @@ } }, "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/strip-comments": { @@ -16215,9 +16377,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.16", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.16.tgz", - "integrity": "sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==", + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -16328,9 +16490,9 @@ } }, "node_modules/terser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", - "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -16346,16 +16508,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -16379,24 +16541,6 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -16525,19 +16669,6 @@ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", "license": "MIT" }, - "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -16568,15 +16699,6 @@ "json5": "lib/cli.js" } }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -17083,9 +17205,9 @@ } }, "node_modules/webpack": { - "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "version": "5.98.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", + "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", @@ -17106,9 +17228,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", + "schema-utils": "^4.3.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", + "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, @@ -17300,24 +17422,6 @@ "node": ">=4.0" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", diff --git a/package.json b/package.json index 1b4e33b9..29537921 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "react-router-dom": "^7.0.2", - "react-scripts": "5.0.1", + "react-scripts": "^5.0.1", "styled-components": "^6.1.13", "web-vitals": "^4.2.4" }, From 0963f6baf1c3b65ac916141eb4a62799a639ef0a Mon Sep 17 00:00:00 2001 From: jskpaul Date: Wed, 19 Feb 2025 20:52:57 -0600 Subject: [PATCH 002/157] removed PORT=3001, added my account --- .env.example | 1 - package.json | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 .env.example diff --git a/.env.example b/.env.example deleted file mode 100644 index 449cb7e2..00000000 --- a/.env.example +++ /dev/null @@ -1 +0,0 @@ -REACT_APP_BACKEND_URL=http://localhost:5050 \ No newline at end of file diff --git a/package.json b/package.json index 1b4e33b9..14f918ed 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "web-vitals": "^4.2.4" }, "scripts": { - "start": "PORT=3001 react-scripts start", + "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", From d2b46b8b036b2fd3a50658d400d15b5bd0c45caa Mon Sep 17 00:00:00 2001 From: Andy2887 Date: Wed, 19 Feb 2025 20:53:08 -0600 Subject: [PATCH 003/157] modified package.json --- .env.example | 1 - package-lock.json | 14 -------------- package.json | 2 +- 3 files changed, 1 insertion(+), 16 deletions(-) delete mode 100644 .env.example diff --git a/.env.example b/.env.example deleted file mode 100644 index 449cb7e2..00000000 --- a/.env.example +++ /dev/null @@ -1 +0,0 @@ -REACT_APP_BACKEND_URL=http://localhost:5050 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d130e671..7c36e4fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16739,20 +16739,6 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", diff --git a/package.json b/package.json index 1b4e33b9..14f918ed 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "web-vitals": "^4.2.4" }, "scripts": { - "start": "PORT=3001 react-scripts start", + "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", From 92d218b758ca9ca50abedc7f23f7237a30eb8532 Mon Sep 17 00:00:00 2001 From: bbrockbrown Date: Wed, 19 Feb 2025 20:58:16 -0600 Subject: [PATCH 004/157] first commit for brock_frontend --- .env.example | 1 - .history/package_20250219202759.json | 58 ++++++++++++++++++++++++++++ .history/package_20250219205120.json | 58 ++++++++++++++++++++++++++++ .history/package_20250219205207.json | 58 ++++++++++++++++++++++++++++ package.json | 2 +- 5 files changed, 175 insertions(+), 2 deletions(-) delete mode 100644 .env.example create mode 100644 .history/package_20250219202759.json create mode 100644 .history/package_20250219205120.json create mode 100644 .history/package_20250219205207.json diff --git a/.env.example b/.env.example deleted file mode 100644 index 449cb7e2..00000000 --- a/.env.example +++ /dev/null @@ -1 +0,0 @@ -REACT_APP_BACKEND_URL=http://localhost:5050 \ No newline at end of file diff --git a/.history/package_20250219202759.json b/.history/package_20250219202759.json new file mode 100644 index 00000000..1b4e33b9 --- /dev/null +++ b/.history/package_20250219202759.json @@ -0,0 +1,58 @@ +{ + "name": "frontend", + "version": "0.1.0", + "private": true, + "dependencies": { + "cra-template": "1.2.0", + "prop-types": "^15.8.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.0.2", + "react-scripts": "5.0.1", + "styled-components": "^6.1.13", + "web-vitals": "^4.2.4" + }, + "scripts": { + "start": "PORT=3001 react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "format": "prettier --write \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", + "format:check": "prettier --check \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", + "check-imports": "prettier --check --plugin @trivago/prettier-plugin-sort-imports \"src/**/*.{js,jsx,mjs,cjs}\"" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@eslint/js": "^9.16.0", + "@trivago/prettier-plugin-sort-imports": "^5.2.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-no-relative-import-paths": "^1.5.5", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.37.2", + "globals": "^15.13.0", + "prettier": "^3.4.2", + "prettier-eslint": "^16.3.0" + } +} diff --git a/.history/package_20250219205120.json b/.history/package_20250219205120.json new file mode 100644 index 00000000..b79ef30d --- /dev/null +++ b/.history/package_20250219205120.json @@ -0,0 +1,58 @@ +{ + "name": "frontend", + "version": "0.1.0", + "private": true, + "dependencies": { + "cra-template": "1.2.0", + "prop-types": "^15.8.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.0.2", + "react-scripts": "5.0.1", + "styled-components": "^6.1.13", + "web-vitals": "^4.2.4" + }, + "scripts": { + "start": "PORT=3000 react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "format": "prettier --write \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", + "format:check": "prettier --check \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", + "check-imports": "prettier --check --plugin @trivago/prettier-plugin-sort-imports \"src/**/*.{js,jsx,mjs,cjs}\"" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@eslint/js": "^9.16.0", + "@trivago/prettier-plugin-sort-imports": "^5.2.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-no-relative-import-paths": "^1.5.5", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.37.2", + "globals": "^15.13.0", + "prettier": "^3.4.2", + "prettier-eslint": "^16.3.0" + } +} diff --git a/.history/package_20250219205207.json b/.history/package_20250219205207.json new file mode 100644 index 00000000..14f918ed --- /dev/null +++ b/.history/package_20250219205207.json @@ -0,0 +1,58 @@ +{ + "name": "frontend", + "version": "0.1.0", + "private": true, + "dependencies": { + "cra-template": "1.2.0", + "prop-types": "^15.8.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.0.2", + "react-scripts": "5.0.1", + "styled-components": "^6.1.13", + "web-vitals": "^4.2.4" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "format": "prettier --write \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", + "format:check": "prettier --check \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", + "check-imports": "prettier --check --plugin @trivago/prettier-plugin-sort-imports \"src/**/*.{js,jsx,mjs,cjs}\"" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@eslint/js": "^9.16.0", + "@trivago/prettier-plugin-sort-imports": "^5.2.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-no-relative-import-paths": "^1.5.5", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.37.2", + "globals": "^15.13.0", + "prettier": "^3.4.2", + "prettier-eslint": "^16.3.0" + } +} diff --git a/package.json b/package.json index 1b4e33b9..14f918ed 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "web-vitals": "^4.2.4" }, "scripts": { - "start": "PORT=3001 react-scripts start", + "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", From e0ec0d515574cb2e4c9aea58c7f6cbbd98831ba4 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 24 Feb 2025 08:49:34 -0600 Subject: [PATCH 005/157] you need port 3001 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 992bd84a..29537921 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "web-vitals": "^4.2.4" }, "scripts": { - "start": "react-scripts start", + "start": "PORT=3001 react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", From ad78bc53f91a44d95751da18cc04d755f2bc7004 Mon Sep 17 00:00:00 2001 From: bbrockbrown Date: Tue, 25 Feb 2025 19:42:04 -0600 Subject: [PATCH 006/157] added new files for yes/no popup and form popup --- .history/.prettierrc_20250219202759.js | 18 ++++++ .history/.prettierrc_20250225192502.js | 18 ++++++ .history/package_20250225091015.json | 58 +++++++++++++++++++ .history/src/App_20250219202759.jsx | 46 +++++++++++++++ .history/src/App_20250225120017.jsx | 46 +++++++++++++++ .../components/FormPopup_20250225192228.jsx | 0 .../components/FormPopup_20250225192900.jsx | 12 ++++ .../components/FormPopup_20250225192920.jsx | 17 ++++++ .../components/FormPopup_20250225194133.jsx | 28 +++++++++ .../components/YNPopup_20250225192240.jsx | 0 .../components/YNPopup_20250225192909.jsx | 12 ++++ .../components/YNPopup_20250225193030.jsx | 17 ++++++ .../components/YNPopup_20250225193119.jsx | 22 +++++++ .../components/YNPopup_20250225193122.jsx | 22 +++++++ .../components/YNPopup_20250225193238.jsx | 24 ++++++++ .../components/YNPopup_20250225193314.jsx | 21 +++++++ .../components/YNPopup_20250225193334.jsx | 23 ++++++++ .../components/YNPopup_20250225193532.jsx | 26 +++++++++ .../components/YNPopup_20250225193702.jsx | 28 +++++++++ .../components/YNPopup_20250225193925.jsx | 28 +++++++++ .history/src/index_20250219202759.jsx | 13 +++++ .history/src/index_20250225120401.jsx | 13 +++++ .prettierrc.js | 2 +- .vscode/settings.json | 5 +- package.json | 2 +- src/common/components/FormPopup.jsx | 28 +++++++++ src/common/components/YNPopup.jsx | 28 +++++++++ 27 files changed, 554 insertions(+), 3 deletions(-) create mode 100644 .history/.prettierrc_20250219202759.js create mode 100644 .history/.prettierrc_20250225192502.js create mode 100644 .history/package_20250225091015.json create mode 100644 .history/src/App_20250219202759.jsx create mode 100644 .history/src/App_20250225120017.jsx create mode 100644 .history/src/common/components/FormPopup_20250225192228.jsx create mode 100644 .history/src/common/components/FormPopup_20250225192900.jsx create mode 100644 .history/src/common/components/FormPopup_20250225192920.jsx create mode 100644 .history/src/common/components/FormPopup_20250225194133.jsx create mode 100644 .history/src/common/components/YNPopup_20250225192240.jsx create mode 100644 .history/src/common/components/YNPopup_20250225192909.jsx create mode 100644 .history/src/common/components/YNPopup_20250225193030.jsx create mode 100644 .history/src/common/components/YNPopup_20250225193119.jsx create mode 100644 .history/src/common/components/YNPopup_20250225193122.jsx create mode 100644 .history/src/common/components/YNPopup_20250225193238.jsx create mode 100644 .history/src/common/components/YNPopup_20250225193314.jsx create mode 100644 .history/src/common/components/YNPopup_20250225193334.jsx create mode 100644 .history/src/common/components/YNPopup_20250225193532.jsx create mode 100644 .history/src/common/components/YNPopup_20250225193702.jsx create mode 100644 .history/src/common/components/YNPopup_20250225193925.jsx create mode 100644 .history/src/index_20250219202759.jsx create mode 100644 .history/src/index_20250225120401.jsx create mode 100644 src/common/components/FormPopup.jsx create mode 100644 src/common/components/YNPopup.jsx diff --git a/.history/.prettierrc_20250219202759.js b/.history/.prettierrc_20250219202759.js new file mode 100644 index 00000000..ce8623ca --- /dev/null +++ b/.history/.prettierrc_20250219202759.js @@ -0,0 +1,18 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 2, + semi: true, + singleQuote: true, + printWidth: 80, + jsxSingleQuote: true, + proseWrap: 'always', + plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], + importOrder: [ + '^react$', + '', + '^(common|pages)/(.*)$', + '^[./]', + ], + importOrderSeparation: true, + importOrderSortSpecifiers: true, +}; diff --git a/.history/.prettierrc_20250225192502.js b/.history/.prettierrc_20250225192502.js new file mode 100644 index 00000000..24673dbb --- /dev/null +++ b/.history/.prettierrc_20250225192502.js @@ -0,0 +1,18 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 4, + semi: true, + singleQuote: true, + printWidth: 80, + jsxSingleQuote: true, + proseWrap: 'always', + plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], + importOrder: [ + '^react$', + '', + '^(common|pages)/(.*)$', + '^[./]', + ], + importOrderSeparation: true, + importOrderSortSpecifiers: true, +}; diff --git a/.history/package_20250225091015.json b/.history/package_20250225091015.json new file mode 100644 index 00000000..1b4e33b9 --- /dev/null +++ b/.history/package_20250225091015.json @@ -0,0 +1,58 @@ +{ + "name": "frontend", + "version": "0.1.0", + "private": true, + "dependencies": { + "cra-template": "1.2.0", + "prop-types": "^15.8.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.0.2", + "react-scripts": "5.0.1", + "styled-components": "^6.1.13", + "web-vitals": "^4.2.4" + }, + "scripts": { + "start": "PORT=3001 react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "format": "prettier --write \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", + "format:check": "prettier --check \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", + "check-imports": "prettier --check --plugin @trivago/prettier-plugin-sort-imports \"src/**/*.{js,jsx,mjs,cjs}\"" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@eslint/js": "^9.16.0", + "@trivago/prettier-plugin-sort-imports": "^5.2.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-no-relative-import-paths": "^1.5.5", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.37.2", + "globals": "^15.13.0", + "prettier": "^3.4.2", + "prettier-eslint": "^16.3.0" + } +} diff --git a/.history/src/App_20250219202759.jsx b/.history/src/App_20250219202759.jsx new file mode 100644 index 00000000..9a6e3eff --- /dev/null +++ b/.history/src/App_20250219202759.jsx @@ -0,0 +1,46 @@ +import React from 'react'; + +import { BrowserRouter, Route, Routes } from 'react-router-dom'; + +import { + PrivateRoute, + PublicOnlyRoute, +} from 'common/components/routes/ProtectedRoutes'; +import { UserProvider } from 'common/contexts/UserContext'; +import NavLayout from 'common/layouts/NavLayout'; +import AuthCallback from 'pages/account/AuthCallback'; +import Login from 'pages/account/Login'; +import RequestPasswordReset from 'pages/account/RequestPasswordReset'; +import ResetPassword from 'pages/account/ResetPassword'; +import SignUp from 'pages/account/SignUp'; +import Home from 'pages/home/Home'; +import NotFound from 'pages/not-found/NotFound'; + +import './App.css'; + +export default function App() { + return ( + + + + }> + }> + } /> + + }> + } /> + } /> + } + /> + + } /> + } /> + } /> + + + + + ); +} diff --git a/.history/src/App_20250225120017.jsx b/.history/src/App_20250225120017.jsx new file mode 100644 index 00000000..9a6e3eff --- /dev/null +++ b/.history/src/App_20250225120017.jsx @@ -0,0 +1,46 @@ +import React from 'react'; + +import { BrowserRouter, Route, Routes } from 'react-router-dom'; + +import { + PrivateRoute, + PublicOnlyRoute, +} from 'common/components/routes/ProtectedRoutes'; +import { UserProvider } from 'common/contexts/UserContext'; +import NavLayout from 'common/layouts/NavLayout'; +import AuthCallback from 'pages/account/AuthCallback'; +import Login from 'pages/account/Login'; +import RequestPasswordReset from 'pages/account/RequestPasswordReset'; +import ResetPassword from 'pages/account/ResetPassword'; +import SignUp from 'pages/account/SignUp'; +import Home from 'pages/home/Home'; +import NotFound from 'pages/not-found/NotFound'; + +import './App.css'; + +export default function App() { + return ( + + + + }> + }> + } /> + + }> + } /> + } /> + } + /> + + } /> + } /> + } /> + + + + + ); +} diff --git a/.history/src/common/components/FormPopup_20250225192228.jsx b/.history/src/common/components/FormPopup_20250225192228.jsx new file mode 100644 index 00000000..e69de29b diff --git a/.history/src/common/components/FormPopup_20250225192900.jsx b/.history/src/common/components/FormPopup_20250225192900.jsx new file mode 100644 index 00000000..bdbbf5fa --- /dev/null +++ b/.history/src/common/components/FormPopup_20250225192900.jsx @@ -0,0 +1,12 @@ +import React from 'react'; + +// import PropTypes from 'prop-types'; +// import styled from 'styled-components'; + +export default function FormPopup() { + return ( +
+

FormPopup

+
+ ); +} diff --git a/.history/src/common/components/FormPopup_20250225192920.jsx b/.history/src/common/components/FormPopup_20250225192920.jsx new file mode 100644 index 00000000..60079cc3 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250225192920.jsx @@ -0,0 +1,17 @@ +import React from 'react'; + +// import PropTypes from 'prop-types'; +// import styled from 'styled-components'; + +export default function FormPopup() { + return ( +
+

FormPopup

+
+ ); +} + +FormPopup.propTypes = { + // name: PropTypes.string, + // age: PropTypes.number, +}; diff --git a/.history/src/common/components/FormPopup_20250225194133.jsx b/.history/src/common/components/FormPopup_20250225194133.jsx new file mode 100644 index 00000000..27f4a5d6 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250225194133.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function FormPopup() { + return ( +
+

FormPopup

+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/.history/src/common/components/YNPopup_20250225192240.jsx b/.history/src/common/components/YNPopup_20250225192240.jsx new file mode 100644 index 00000000..e69de29b diff --git a/.history/src/common/components/YNPopup_20250225192909.jsx b/.history/src/common/components/YNPopup_20250225192909.jsx new file mode 100644 index 00000000..d9fa0182 --- /dev/null +++ b/.history/src/common/components/YNPopup_20250225192909.jsx @@ -0,0 +1,12 @@ +import React from 'react'; + +// import PropTypes from 'prop-types'; +// import styled from 'styled-components'; + +export default function YNPopup() { + return ( +
+

FormPopup

+
+ ); +} diff --git a/.history/src/common/components/YNPopup_20250225193030.jsx b/.history/src/common/components/YNPopup_20250225193030.jsx new file mode 100644 index 00000000..fd343313 --- /dev/null +++ b/.history/src/common/components/YNPopup_20250225193030.jsx @@ -0,0 +1,17 @@ +import React from 'react'; + +// import PropTypes from 'prop-types'; +// import styled from 'styled-components'; + +export default function YNPopup() { + return ( +
+

FormPopup

+
+ ); +} + +YNPopup.propTypes = { + // name: PropTypes.string, + // age: PropTypes.number, +}; diff --git a/.history/src/common/components/YNPopup_20250225193119.jsx b/.history/src/common/components/YNPopup_20250225193119.jsx new file mode 100644 index 00000000..5b83bbb0 --- /dev/null +++ b/.history/src/common/components/YNPopup_20250225193119.jsx @@ -0,0 +1,22 @@ +import React from 'react'; + +// import PropTypes from 'prop-types'; +// import styled from 'styled-components'; + +export default function YNPopup() { + return ( +
+

FormPopup

+
+ ); +} + +YNPopup.propTypes = { + // name: PropTypes.string, + // age: PropTypes.number, +}; + +YNPopup.defaultProps = { + // name: PropTypes.string, + // age: PropTypes.number, +}; diff --git a/.history/src/common/components/YNPopup_20250225193122.jsx b/.history/src/common/components/YNPopup_20250225193122.jsx new file mode 100644 index 00000000..5b83bbb0 --- /dev/null +++ b/.history/src/common/components/YNPopup_20250225193122.jsx @@ -0,0 +1,22 @@ +import React from 'react'; + +// import PropTypes from 'prop-types'; +// import styled from 'styled-components'; + +export default function YNPopup() { + return ( +
+

FormPopup

+
+ ); +} + +YNPopup.propTypes = { + // name: PropTypes.string, + // age: PropTypes.number, +}; + +YNPopup.defaultProps = { + // name: PropTypes.string, + // age: PropTypes.number, +}; diff --git a/.history/src/common/components/YNPopup_20250225193238.jsx b/.history/src/common/components/YNPopup_20250225193238.jsx new file mode 100644 index 00000000..1cb64f47 --- /dev/null +++ b/.history/src/common/components/YNPopup_20250225193238.jsx @@ -0,0 +1,24 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function YNPopup() { + return ( +
+

FormPopup

+
+ ); +} + +YNPopup.propTypes = { + // name: PropTypes.string, + // age: PropTypes.number, +}; + +YNPopup.defaultProps = { + yesText: PropTypes.string, + + // age: PropTypes.number, +}; diff --git a/.history/src/common/components/YNPopup_20250225193314.jsx b/.history/src/common/components/YNPopup_20250225193314.jsx new file mode 100644 index 00000000..0eab1e58 --- /dev/null +++ b/.history/src/common/components/YNPopup_20250225193314.jsx @@ -0,0 +1,21 @@ +import React from 'react'; + +// import styled from 'styled-components'; + +export default function YNPopup() { + return ( +
+

FormPopup

+
+ ); +} + +YNPopup.propTypes = { + // name: PropTypes.string, + // age: PropTypes.number, +}; + +YNPopup.defaultProps = { + yesText: 'Yes', + noText: 'No', +}; diff --git a/.history/src/common/components/YNPopup_20250225193334.jsx b/.history/src/common/components/YNPopup_20250225193334.jsx new file mode 100644 index 00000000..2285eb0a --- /dev/null +++ b/.history/src/common/components/YNPopup_20250225193334.jsx @@ -0,0 +1,23 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function YNPopup() { + return ( +
+

FormPopup

+
+ ); +} + +YNPopup.propTypes = { + yesText: PropTypes.string, + noText: PropTypes.string, +}; + +YNPopup.defaultProps = { + yesText: 'Yes', + noText: 'No', +}; diff --git a/.history/src/common/components/YNPopup_20250225193532.jsx b/.history/src/common/components/YNPopup_20250225193532.jsx new file mode 100644 index 00000000..bf90e218 --- /dev/null +++ b/.history/src/common/components/YNPopup_20250225193532.jsx @@ -0,0 +1,26 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function YNPopup({ yesText, noText }) { + return ( +
+

+ {yesText} + {noText} +

+
+ ); +} + +YNPopup.propTypes = { + yesText: PropTypes.string, + noText: PropTypes.string, +}; + +YNPopup.defaultProps = { + yesText: 'Yes', + noText: 'No', +}; diff --git a/.history/src/common/components/YNPopup_20250225193702.jsx b/.history/src/common/components/YNPopup_20250225193702.jsx new file mode 100644 index 00000000..4675cd72 --- /dev/null +++ b/.history/src/common/components/YNPopup_20250225193702.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function YNPopup({ yesText, noText, noOnClick, yesOnClick }) { + return ( +
+

+ {yesText} + {noText} +

+
+ ); +} + +YNPopup.propTypes = { + yesText: PropTypes.string, + noText: PropTypes.string, + noOnClick: PropTypes.func, + yesOnClick: PropTypes.func, +}; + +YNPopup.defaultProps = { + yesText: 'Yes', + noText: 'No', +}; diff --git a/.history/src/common/components/YNPopup_20250225193925.jsx b/.history/src/common/components/YNPopup_20250225193925.jsx new file mode 100644 index 00000000..4675cd72 --- /dev/null +++ b/.history/src/common/components/YNPopup_20250225193925.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function YNPopup({ yesText, noText, noOnClick, yesOnClick }) { + return ( +
+

+ {yesText} + {noText} +

+
+ ); +} + +YNPopup.propTypes = { + yesText: PropTypes.string, + noText: PropTypes.string, + noOnClick: PropTypes.func, + yesOnClick: PropTypes.func, +}; + +YNPopup.defaultProps = { + yesText: 'Yes', + noText: 'No', +}; diff --git a/.history/src/index_20250219202759.jsx b/.history/src/index_20250219202759.jsx new file mode 100644 index 00000000..a29b8bfa --- /dev/null +++ b/.history/src/index_20250219202759.jsx @@ -0,0 +1,13 @@ +import React from 'react'; + +import ReactDOM from 'react-dom/client'; + +import App from './App'; +import './index.css'; + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + +); diff --git a/.history/src/index_20250225120401.jsx b/.history/src/index_20250225120401.jsx new file mode 100644 index 00000000..a29b8bfa --- /dev/null +++ b/.history/src/index_20250225120401.jsx @@ -0,0 +1,13 @@ +import React from 'react'; + +import ReactDOM from 'react-dom/client'; + +import App from './App'; +import './index.css'; + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + +); diff --git a/.prettierrc.js b/.prettierrc.js index ce8623ca..24673dbb 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,6 +1,6 @@ module.exports = { trailingComma: 'es5', - tabWidth: 2, + tabWidth: 4, semi: true, singleQuote: true, printWidth: 80, diff --git a/.vscode/settings.json b/.vscode/settings.json index c58f9c05..b53ee67e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,5 +8,8 @@ }, "editor.formatOnSaveMode": "file", "vs-code-prettier-eslint.prettierLast": false, - "editor.tabSize": 2 + "editor.tabSize": 2, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + } } diff --git a/package.json b/package.json index 14f918ed..1b4e33b9 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "web-vitals": "^4.2.4" }, "scripts": { - "start": "react-scripts start", + "start": "PORT=3001 react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", diff --git a/src/common/components/FormPopup.jsx b/src/common/components/FormPopup.jsx new file mode 100644 index 00000000..27f4a5d6 --- /dev/null +++ b/src/common/components/FormPopup.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function FormPopup() { + return ( +
+

FormPopup

+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/src/common/components/YNPopup.jsx b/src/common/components/YNPopup.jsx new file mode 100644 index 00000000..4675cd72 --- /dev/null +++ b/src/common/components/YNPopup.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function YNPopup({ yesText, noText, noOnClick, yesOnClick }) { + return ( +
+

+ {yesText} + {noText} +

+
+ ); +} + +YNPopup.propTypes = { + yesText: PropTypes.string, + noText: PropTypes.string, + noOnClick: PropTypes.func, + yesOnClick: PropTypes.func, +}; + +YNPopup.defaultProps = { + yesText: 'Yes', + noText: 'No', +}; From a0007c4e4ef85669803b43c1295e4704ab92f443 Mon Sep 17 00:00:00 2001 From: bbrockbrown Date: Wed, 26 Feb 2025 13:58:13 -0600 Subject: [PATCH 007/157] before revert --- .history/.prettierrc_20250226134824.js | 18 + .history/jsconfig_20250219202759.json | 7 + .history/jsconfig_20250226134748.json | 10 + .history/package_20250226133050.json | 58 + .history/package_20250226133101.json | 58 + .history/src/App_20250219202759.css | 13 + .history/src/App_20250226134257.css | 15 + .history/src/App_20250226134425.jsx | 52 + .../components/FormPopup_20250226132140.jsx | 28 + .../components/FormPopup_20250226132154.jsx | 28 + .../components/YNPopup_20250226132137.jsx | 28 + .../components/YNPopup_20250226132239.jsx | 28 + .../components/YNPopup_20250226132313.jsx | 28 + .history/src/index_20250219202759.css | 13 + .history/src/index_20250226134256.css | 16 + .history/src/index_20250226134402.jsx | 13 + .history/src/output_20250226134456.css | 228 ++++ .history/src/output_20250226134552.css | 228 ++++ .prettierrc.js | 32 +- jsconfig.json | 5 +- package-lock.json | 987 ++++++++++++++++-- package.json | 11 +- src/App.css | 2 + src/App.jsx | 58 +- src/common/components/FormPopup.jsx | 28 +- src/common/components/YNPopup.jsx | 28 +- src/index.css | 3 + src/index.jsx | 6 +- src/output.css | 392 +++++++ 29 files changed, 2278 insertions(+), 143 deletions(-) create mode 100644 .history/.prettierrc_20250226134824.js create mode 100644 .history/jsconfig_20250219202759.json create mode 100644 .history/jsconfig_20250226134748.json create mode 100644 .history/package_20250226133050.json create mode 100644 .history/package_20250226133101.json create mode 100644 .history/src/App_20250219202759.css create mode 100644 .history/src/App_20250226134257.css create mode 100644 .history/src/App_20250226134425.jsx create mode 100644 .history/src/common/components/FormPopup_20250226132140.jsx create mode 100644 .history/src/common/components/FormPopup_20250226132154.jsx create mode 100644 .history/src/common/components/YNPopup_20250226132137.jsx create mode 100644 .history/src/common/components/YNPopup_20250226132239.jsx create mode 100644 .history/src/common/components/YNPopup_20250226132313.jsx create mode 100644 .history/src/index_20250219202759.css create mode 100644 .history/src/index_20250226134256.css create mode 100644 .history/src/index_20250226134402.jsx create mode 100644 .history/src/output_20250226134456.css create mode 100644 .history/src/output_20250226134552.css create mode 100644 src/output.css diff --git a/.history/.prettierrc_20250226134824.js b/.history/.prettierrc_20250226134824.js new file mode 100644 index 00000000..64dc4468 --- /dev/null +++ b/.history/.prettierrc_20250226134824.js @@ -0,0 +1,18 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 4, + semi: true, + singleQuote: true, + printWidth: 80, + jsxSingleQuote: true, + proseWrap: 'always', + plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], + importOrder: [ + '^react$', + '', + '^(common|pages)/(.*)$', + '^[./]', + ], + importOrderSeparation: true, + importOrderSortSpecifiers: true, +}; diff --git a/.history/jsconfig_20250219202759.json b/.history/jsconfig_20250219202759.json new file mode 100644 index 00000000..ef66e1dc --- /dev/null +++ b/.history/jsconfig_20250219202759.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "baseUrl": "src", + "jsx": "react" + }, + "include": ["src"] +} diff --git a/.history/jsconfig_20250226134748.json b/.history/jsconfig_20250226134748.json new file mode 100644 index 00000000..7eab209e --- /dev/null +++ b/.history/jsconfig_20250226134748.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "baseUrl": "src", + "jsx": "react", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src"] +} diff --git a/.history/package_20250226133050.json b/.history/package_20250226133050.json new file mode 100644 index 00000000..b79ef30d --- /dev/null +++ b/.history/package_20250226133050.json @@ -0,0 +1,58 @@ +{ + "name": "frontend", + "version": "0.1.0", + "private": true, + "dependencies": { + "cra-template": "1.2.0", + "prop-types": "^15.8.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.0.2", + "react-scripts": "5.0.1", + "styled-components": "^6.1.13", + "web-vitals": "^4.2.4" + }, + "scripts": { + "start": "PORT=3000 react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "format": "prettier --write \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", + "format:check": "prettier --check \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", + "check-imports": "prettier --check --plugin @trivago/prettier-plugin-sort-imports \"src/**/*.{js,jsx,mjs,cjs}\"" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@eslint/js": "^9.16.0", + "@trivago/prettier-plugin-sort-imports": "^5.2.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-no-relative-import-paths": "^1.5.5", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.37.2", + "globals": "^15.13.0", + "prettier": "^3.4.2", + "prettier-eslint": "^16.3.0" + } +} diff --git a/.history/package_20250226133101.json b/.history/package_20250226133101.json new file mode 100644 index 00000000..1b4e33b9 --- /dev/null +++ b/.history/package_20250226133101.json @@ -0,0 +1,58 @@ +{ + "name": "frontend", + "version": "0.1.0", + "private": true, + "dependencies": { + "cra-template": "1.2.0", + "prop-types": "^15.8.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.0.2", + "react-scripts": "5.0.1", + "styled-components": "^6.1.13", + "web-vitals": "^4.2.4" + }, + "scripts": { + "start": "PORT=3001 react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "format": "prettier --write \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", + "format:check": "prettier --check \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", + "check-imports": "prettier --check --plugin @trivago/prettier-plugin-sort-imports \"src/**/*.{js,jsx,mjs,cjs}\"" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@eslint/js": "^9.16.0", + "@trivago/prettier-plugin-sort-imports": "^5.2.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-no-relative-import-paths": "^1.5.5", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.37.2", + "globals": "^15.13.0", + "prettier": "^3.4.2", + "prettier-eslint": "^16.3.0" + } +} diff --git a/.history/src/App_20250219202759.css b/.history/src/App_20250219202759.css new file mode 100644 index 00000000..161800f9 --- /dev/null +++ b/.history/src/App_20250219202759.css @@ -0,0 +1,13 @@ +/* global color presets */ +:root { + --primary-green: #45bf84; + --secondary-lightgrey: #f3f3f3; + --darkgrey: #747474; + --white: #fff; + --text: #191a23; +} + +* { + font-family: Verdana, sans-serif; + color: var(--text); +} diff --git a/.history/src/App_20250226134257.css b/.history/src/App_20250226134257.css new file mode 100644 index 00000000..0f533e38 --- /dev/null +++ b/.history/src/App_20250226134257.css @@ -0,0 +1,15 @@ +/* global color presets */ +@import "tailwindcss"; + +:root { + --primary-green: #45bf84; + --secondary-lightgrey: #f3f3f3; + --darkgrey: #747474; + --white: #fff; + --text: #191a23; +} + +* { + font-family: Verdana, sans-serif; + color: var(--text); +} diff --git a/.history/src/App_20250226134425.jsx b/.history/src/App_20250226134425.jsx new file mode 100644 index 00000000..4ddd65ae --- /dev/null +++ b/.history/src/App_20250226134425.jsx @@ -0,0 +1,52 @@ +import React from 'react'; + +import { BrowserRouter, Route, Routes } from 'react-router-dom'; + +import { + PrivateRoute, + PublicOnlyRoute, +} from 'common/components/routes/ProtectedRoutes'; +import { UserProvider } from 'common/contexts/UserContext'; +import NavLayout from 'common/layouts/NavLayout'; +import AuthCallback from 'pages/account/AuthCallback'; +import Login from 'pages/account/Login'; +import RequestPasswordReset from 'pages/account/RequestPasswordReset'; +import ResetPassword from 'pages/account/ResetPassword'; +import SignUp from 'pages/account/SignUp'; +import Home from 'pages/home/Home'; +import NotFound from 'pages/not-found/NotFound'; + +import './App.css'; + +export default function App() { + return ( + + + + }> + }> + } /> + + }> + } /> + } /> + } + /> + + } + /> + } + /> + } /> + + + + + ); +} diff --git a/.history/src/common/components/FormPopup_20250226132140.jsx b/.history/src/common/components/FormPopup_20250226132140.jsx new file mode 100644 index 00000000..b8a152d0 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226132140.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function FormPopup() { + return ( +
+

FormPopup

+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/.history/src/common/components/FormPopup_20250226132154.jsx b/.history/src/common/components/FormPopup_20250226132154.jsx new file mode 100644 index 00000000..b8a152d0 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226132154.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function FormPopup() { + return ( +
+

FormPopup

+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/.history/src/common/components/YNPopup_20250226132137.jsx b/.history/src/common/components/YNPopup_20250226132137.jsx new file mode 100644 index 00000000..1c30006a --- /dev/null +++ b/.history/src/common/components/YNPopup_20250226132137.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function YNPopup({ yesText, noText, noOnClick, yesOnClick }) { + return ( +
+

+ {yesText} + {noText} +

+
+ ); +} + +YNPopup.propTypes = { + yesText: PropTypes.string, + noText: PropTypes.string, + noOnClick: PropTypes.func, + yesOnClick: PropTypes.func, +}; + +YNPopup.defaultProps = { + yesText: 'Yes', + noText: 'No', +}; diff --git a/.history/src/common/components/YNPopup_20250226132239.jsx b/.history/src/common/components/YNPopup_20250226132239.jsx new file mode 100644 index 00000000..1c30006a --- /dev/null +++ b/.history/src/common/components/YNPopup_20250226132239.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function YNPopup({ yesText, noText, noOnClick, yesOnClick }) { + return ( +
+

+ {yesText} + {noText} +

+
+ ); +} + +YNPopup.propTypes = { + yesText: PropTypes.string, + noText: PropTypes.string, + noOnClick: PropTypes.func, + yesOnClick: PropTypes.func, +}; + +YNPopup.defaultProps = { + yesText: 'Yes', + noText: 'No', +}; diff --git a/.history/src/common/components/YNPopup_20250226132313.jsx b/.history/src/common/components/YNPopup_20250226132313.jsx new file mode 100644 index 00000000..1c30006a --- /dev/null +++ b/.history/src/common/components/YNPopup_20250226132313.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function YNPopup({ yesText, noText, noOnClick, yesOnClick }) { + return ( +
+

+ {yesText} + {noText} +

+
+ ); +} + +YNPopup.propTypes = { + yesText: PropTypes.string, + noText: PropTypes.string, + noOnClick: PropTypes.func, + yesOnClick: PropTypes.func, +}; + +YNPopup.defaultProps = { + yesText: 'Yes', + noText: 'No', +}; diff --git a/.history/src/index_20250219202759.css b/.history/src/index_20250219202759.css new file mode 100644 index 00000000..85e778f4 --- /dev/null +++ b/.history/src/index_20250219202759.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', + 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', + 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/.history/src/index_20250226134256.css b/.history/src/index_20250226134256.css new file mode 100644 index 00000000..b5132c0d --- /dev/null +++ b/.history/src/index_20250226134256.css @@ -0,0 +1,16 @@ +@import "tailwindcss"; + + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', + 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', + 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/.history/src/index_20250226134402.jsx b/.history/src/index_20250226134402.jsx new file mode 100644 index 00000000..1d7eb3a6 --- /dev/null +++ b/.history/src/index_20250226134402.jsx @@ -0,0 +1,13 @@ +import React from 'react'; + +import ReactDOM from 'react-dom/client'; + +import App from './App'; +import './index.css'; + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + +); diff --git a/.history/src/output_20250226134456.css b/.history/src/output_20250226134456.css new file mode 100644 index 00000000..c8023913 --- /dev/null +++ b/.history/src/output_20250226134456.css @@ -0,0 +1,228 @@ +/*! tailwindcss v4.0.9 | MIT License | https://tailwindcss.com */ +@layer theme, base, components, utilities; +@layer theme { + :root, :host { + --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace; + --color-red-500: oklch(0.637 0.237 25.331); + --spacing: 0.25rem; + --default-transition-duration: 150ms; + --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + --default-font-family: var(--font-sans); + --default-font-feature-settings: var(--font-sans--font-feature-settings); + --default-font-variation-settings: var( + --font-sans--font-variation-settings + ); + --default-mono-font-family: var(--font-mono); + --default-mono-font-feature-settings: var( + --font-mono--font-feature-settings + ); + --default-mono-font-variation-settings: var( + --font-mono--font-variation-settings + ); + } +} +@layer base { + *, ::after, ::before, ::backdrop, ::file-selector-button { + box-sizing: border-box; + margin: 0; + padding: 0; + border: 0 solid; + } + html, :host { + line-height: 1.5; + -webkit-text-size-adjust: 100%; + tab-size: 4; + font-family: var( --default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" ); + font-feature-settings: var(--default-font-feature-settings, normal); + font-variation-settings: var( --default-font-variation-settings, normal ); + -webkit-tap-highlight-color: transparent; + } + body { + line-height: inherit; + } + hr { + height: 0; + color: inherit; + border-top-width: 1px; + } + abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + } + h1, h2, h3, h4, h5, h6 { + font-size: inherit; + font-weight: inherit; + } + a { + color: inherit; + -webkit-text-decoration: inherit; + text-decoration: inherit; + } + b, strong { + font-weight: bolder; + } + code, kbd, samp, pre { + font-family: var( --default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace ); + font-feature-settings: var( --default-mono-font-feature-settings, normal ); + font-variation-settings: var( --default-mono-font-variation-settings, normal ); + font-size: 1em; + } + small { + font-size: 80%; + } + sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + sub { + bottom: -0.25em; + } + sup { + top: -0.5em; + } + table { + text-indent: 0; + border-color: inherit; + border-collapse: collapse; + } + :-moz-focusring { + outline: auto; + } + progress { + vertical-align: baseline; + } + summary { + display: list-item; + } + ol, ul, menu { + list-style: none; + } + img, svg, video, canvas, audio, iframe, embed, object { + display: block; + vertical-align: middle; + } + img, video { + max-width: 100%; + height: auto; + } + button, input, select, optgroup, textarea, ::file-selector-button { + font: inherit; + font-feature-settings: inherit; + font-variation-settings: inherit; + letter-spacing: inherit; + color: inherit; + border-radius: 0; + background-color: transparent; + opacity: 1; + } + :where(select:is([multiple], [size])) optgroup { + font-weight: bolder; + } + :where(select:is([multiple], [size])) optgroup option { + padding-inline-start: 20px; + } + ::file-selector-button { + margin-inline-end: 4px; + } + ::placeholder { + opacity: 1; + color: color-mix(in oklab, currentColor 50%, transparent); + } + textarea { + resize: vertical; + } + ::-webkit-search-decoration { + -webkit-appearance: none; + } + ::-webkit-date-and-time-value { + min-height: 1lh; + text-align: inherit; + } + ::-webkit-datetime-edit { + display: inline-flex; + } + ::-webkit-datetime-edit-fields-wrapper { + padding: 0; + } + ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field { + padding-block: 0; + } + :-moz-ui-invalid { + box-shadow: none; + } + button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button { + appearance: button; + } + ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { + height: auto; + } + [hidden]:where(:not([hidden="until-found"])) { + display: none !important; + } +} +@layer utilities { + .absolute { + position: absolute; + } + .fixed { + position: fixed; + } + .relative { + position: relative; + } + .mb-4 { + margin-bottom: calc(var(--spacing) * 4); + } + .flex { + display: flex; + } + .border { + border-style: var(--tw-border-style); + border-width: 1px; + } + .text-red-500 { + color: var(--color-red-500); + } + .lowercase { + text-transform: lowercase; + } + .uppercase { + text-transform: uppercase; + } + .underline { + text-decoration-line: underline; + } + .outline { + outline-style: var(--tw-outline-style); + outline-width: 1px; + } + .transition { + transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } +} +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; +} +@property --tw-border-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} +@property --tw-outline-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} diff --git a/.history/src/output_20250226134552.css b/.history/src/output_20250226134552.css new file mode 100644 index 00000000..768ebb00 --- /dev/null +++ b/.history/src/output_20250226134552.css @@ -0,0 +1,228 @@ +/*! tailwindcss v4.0.9 | MIT License | https://tailwindcss.com */ +@layer theme, base, components, utilities; +@layer theme { + :root, :host { + --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace; + --color-red-500: oklch(0.637 0.237 25.331); + --spacing: 0.25rem; + --default-transition-duration: 150ms; + --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + --default-font-family: var(--font-sans); + --default-font-feature-settings: var(--font-sans--font-feature-settings); + --default-font-variation-settings: var( + --font-sans--font-variation-settings + ); + --default-mono-font-family: var(--font-mono); + --default-mono-font-feature-settings: var( + --font-mono--font-feature-settings + ); + --default-mono-font-variation-settings: var( + --font-mono--font-variation-settings + ); + } +} +@layer base { + *, ::after, ::before, ::backdrop, ::file-selector-button { + box-sizing: border-box; + margin: 0; + padding: 0; + border: 0 solid; + } + html, :host { + line-height: 1.5; + -webkit-text-size-adjust: 100%; + tab-size: 4; + font-family: var( --default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" ); + font-feature-settings: var(--default-font-feature-settings, normal); + font-variation-settings: var( --default-font-variation-settings, normal ); + -webkit-tap-highlight-color: transparent; + } + body { + line-height: inherit; + } + hr { + height: 0; + color: inherit; + border-top-width: 1px; + } + abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + } + h1, h2, h3, h4, h5, h6 { + font-size: inherit; + font-weight: inherit; + } + a { + color: inherit; + -webkit-text-decoration: inherit; + text-decoration: inherit; + } + b, strong { + font-weight: bolder; + } + code, kbd, samp, pre { + font-family: var( --default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace ); + font-feature-settings: var( --default-mono-font-feature-settings, normal ); + font-variation-settings: var( --default-mono-font-variation-settings, normal ); + font-size: 1em; + } + small { + font-size: 80%; + } + sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + sub { + bottom: -0.25em; + } + sup { + top: -0.5em; + } + table { + text-indent: 0; + border-color: inherit; + border-collapse: collapse; + } + :-moz-focusring { + outline: auto; + } + progress { + vertical-align: baseline; + } + summary { + display: list-item; + } + ol, ul, menu { + list-style: none; + } + img, svg, video, canvas, audio, iframe, embed, object { + display: block; + /*vertical-align: middle; */ + } + img, video { + max-width: 100%; + height: auto; + } + button, input, select, optgroup, textarea, ::file-selector-button { + font: inherit; + font-feature-settings: inherit; + font-variation-settings: inherit; + letter-spacing: inherit; + color: inherit; + border-radius: 0; + background-color: transparent; + opacity: 1; + } + :where(select:is([multiple], [size])) optgroup { + font-weight: bolder; + } + :where(select:is([multiple], [size])) optgroup option { + padding-inline-start: 20px; + } + ::file-selector-button { + margin-inline-end: 4px; + } + ::placeholder { + opacity: 1; + color: color-mix(in oklab, currentColor 50%, transparent); + } + textarea { + resize: vertical; + } + ::-webkit-search-decoration { + -webkit-appearance: none; + } + ::-webkit-date-and-time-value { + min-height: 1lh; + text-align: inherit; + } + ::-webkit-datetime-edit { + display: inline-flex; + } + ::-webkit-datetime-edit-fields-wrapper { + padding: 0; + } + ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field { + padding-block: 0; + } + :-moz-ui-invalid { + box-shadow: none; + } + button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button { + appearance: button; + } + ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { + height: auto; + } + [hidden]:where(:not([hidden="until-found"])) { + display: none !important; + } +} +@layer utilities { + .absolute { + position: absolute; + } + .fixed { + position: fixed; + } + .relative { + position: relative; + } + .mb-4 { + margin-bottom: calc(var(--spacing) * 4); + } + .flex { + display: flex; + } + .border { + border-style: var(--tw-border-style); + border-width: 1px; + } + .text-red-500 { + color: var(--color-red-500); + } + .lowercase { + text-transform: lowercase; + } + .uppercase { + text-transform: uppercase; + } + .underline { + text-decoration-line: underline; + } + .outline { + outline-style: var(--tw-outline-style); + outline-width: 1px; + } + .transition { + transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } +} +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; +} +@property --tw-border-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} +@property --tw-outline-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} diff --git a/.prettierrc.js b/.prettierrc.js index 24673dbb..64dc4468 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,18 +1,18 @@ module.exports = { - trailingComma: 'es5', - tabWidth: 4, - semi: true, - singleQuote: true, - printWidth: 80, - jsxSingleQuote: true, - proseWrap: 'always', - plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], - importOrder: [ - '^react$', - '', - '^(common|pages)/(.*)$', - '^[./]', - ], - importOrderSeparation: true, - importOrderSortSpecifiers: true, + trailingComma: 'es5', + tabWidth: 4, + semi: true, + singleQuote: true, + printWidth: 80, + jsxSingleQuote: true, + proseWrap: 'always', + plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], + importOrder: [ + '^react$', + '', + '^(common|pages)/(.*)$', + '^[./]', + ], + importOrderSeparation: true, + importOrderSortSpecifiers: true, }; diff --git a/jsconfig.json b/jsconfig.json index ef66e1dc..7eab209e 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,7 +1,10 @@ { "compilerOptions": { "baseUrl": "src", - "jsx": "react" + "jsx": "react", + "paths": { + "@/*": ["src/*"] + } }, "include": ["src"] } diff --git a/package-lock.json b/package-lock.json index d130e671..abf1aadf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,19 +8,26 @@ "name": "frontend", "version": "0.1.0", "dependencies": { + "@tailwindcss/cli": "^4.0.9", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", "cra-template": "1.2.0", + "lucide-react": "^0.476.0", "prop-types": "^15.8.1", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router-dom": "^7.0.2", "react-scripts": "5.0.1", "styled-components": "^6.1.13", + "tailwind-merge": "^3.0.2", + "tailwindcss-animate": "^1.0.7", "web-vitals": "^4.2.4" }, "devDependencies": { "@babel/plugin-transform-private-property-in-object": "^7.25.9", "@eslint/js": "^9.16.0", "@trivago/prettier-plugin-sort-imports": "^5.2.0", + "autoprefixer": "^10.4.20", "eslint": "^8.57.1", "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.31.0", @@ -28,8 +35,10 @@ "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.37.2", "globals": "^15.13.0", + "postcss": "^8.5.3", "prettier": "^3.4.2", - "prettier-eslint": "^16.3.0" + "prettier-eslint": "^16.3.0", + "tailwindcss": "^4.0.9" } }, "node_modules/@alloc/quick-lru": { @@ -3080,6 +3089,301 @@ "node": ">= 8" } }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -3499,6 +3803,234 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@tailwindcss/cli": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.0.9.tgz", + "integrity": "sha512-obJvIxu4SCA3PLQYDB7tz9Biv3LFB6+YM/DXNNqwjEMRBNr7Y7LLBk3Cl6xwM+/TxJlA2rEV/t+XwkbldcxeXA==", + "license": "MIT", + "dependencies": { + "@parcel/watcher": "^2.5.1", + "@tailwindcss/node": "4.0.9", + "@tailwindcss/oxide": "4.0.9", + "enhanced-resolve": "^5.18.1", + "lightningcss": "^1.29.1", + "mri": "^1.2.0", + "picocolors": "^1.1.1", + "tailwindcss": "4.0.9" + }, + "bin": { + "tailwindcss": "dist/index.mjs" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.9.tgz", + "integrity": "sha512-tOJvdI7XfJbARYhxX+0RArAhmuDcczTC46DGCEziqxzzbIaPnfYaIyRT31n4u8lROrsO7Q6u/K9bmQHL2uL1bQ==", + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "tailwindcss": "4.0.9" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.9.tgz", + "integrity": "sha512-eLizHmXFqHswJONwfqi/WZjtmWZpIalpvMlNhTM99/bkHtUs6IqgI1XQ0/W5eO2HiRQcIlXUogI2ycvKhVLNcA==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.0.9", + "@tailwindcss/oxide-darwin-arm64": "4.0.9", + "@tailwindcss/oxide-darwin-x64": "4.0.9", + "@tailwindcss/oxide-freebsd-x64": "4.0.9", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.9", + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.9", + "@tailwindcss/oxide-linux-arm64-musl": "4.0.9", + "@tailwindcss/oxide-linux-x64-gnu": "4.0.9", + "@tailwindcss/oxide-linux-x64-musl": "4.0.9", + "@tailwindcss/oxide-win32-arm64-msvc": "4.0.9", + "@tailwindcss/oxide-win32-x64-msvc": "4.0.9" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.9.tgz", + "integrity": "sha512-YBgy6+2flE/8dbtrdotVInhMVIxnHJPbAwa7U1gX4l2ThUIaPUp18LjB9wEH8wAGMBZUb//SzLtdXXNBHPUl6Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.9.tgz", + "integrity": "sha512-pWdl4J2dIHXALgy2jVkwKBmtEb73kqIfMpYmcgESr7oPQ+lbcQ4+tlPeVXaSAmang+vglAfFpXQCOvs/aGSqlw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.9.tgz", + "integrity": "sha512-4Dq3lKp0/C7vrRSkNPtBGVebEyWt9QPPlQctxJ0H3MDyiQYvzVYf8jKow7h5QkWNe8hbatEqljMj/Y0M+ERYJg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.9.tgz", + "integrity": "sha512-k7U1RwRODta8x0uealtVt3RoWAWqA+D5FAOsvVGpYoI6ObgmnzqWW6pnVwz70tL8UZ/QXjeMyiICXyjzB6OGtQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.9.tgz", + "integrity": "sha512-NDDjVweHz2zo4j+oS8y3KwKL5wGCZoXGA9ruJM982uVJLdsF8/1AeKvUwKRlMBpxHt1EdWJSAh8a0Mfhl28GlQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.9.tgz", + "integrity": "sha512-jk90UZ0jzJl3Dy1BhuFfRZ2KP9wVKMXPjmCtY4U6fF2LvrjP5gWFJj5VHzfzHonJexjrGe1lMzgtjriuZkxagg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.9.tgz", + "integrity": "sha512-3eMjyTC6HBxh9nRgOHzrc96PYh1/jWOwHZ3Kk0JN0Kl25BJ80Lj9HEvvwVDNTgPg154LdICwuFLuhfgH9DULmg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.9.tgz", + "integrity": "sha512-v0D8WqI/c3WpWH1kq/HP0J899ATLdGZmENa2/emmNjubT0sWtEke9W9+wXeEoACuGAhF9i3PO5MeyditpDCiWQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.9.tgz", + "integrity": "sha512-Kvp0TCkfeXyeehqLJr7otsc4hd/BUPfcIGrQiwsTVCfaMfjQZCG7DjI+9/QqPZha8YapLA9UoIcUILRYO7NE1Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.9.tgz", + "integrity": "sha512-m3+60T/7YvWekajNq/eexjhV8z10rswcz4BC9bioJ7YaN+7K8W2AmLmG0B79H14m6UHE571qB0XsPus4n0QVgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.9.tgz", + "integrity": "sha512-dpc05mSlqkwVNOUjGu/ZXd5U1XNch1kHFJ4/cHkZFvaW1RzbHmRt24gvM8/HC6IirMxNarzVw4IXVtvrOoZtxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -5552,12 +6084,24 @@ "node": ">=8" } }, - "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", - "license": "MIT" - }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "license": "MIT" + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -5590,6 +6134,15 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -6547,6 +7100,18 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -6852,9 +7417,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -8238,12 +8803,12 @@ } }, "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -10853,12 +11418,12 @@ } }, "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", "license": "MIT", "bin": { - "jiti": "bin/jiti.js" + "jiti": "lib/jiti-cli.mjs" } }, "node_modules/js-tokens": { @@ -11125,6 +11690,234 @@ "node": ">= 0.8.0" } }, + "node_modules/lightningcss": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz", + "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.1", + "lightningcss-darwin-x64": "1.29.1", + "lightningcss-freebsd-x64": "1.29.1", + "lightningcss-linux-arm-gnueabihf": "1.29.1", + "lightningcss-linux-arm64-gnu": "1.29.1", + "lightningcss-linux-arm64-musl": "1.29.1", + "lightningcss-linux-x64-gnu": "1.29.1", + "lightningcss-linux-x64-musl": "1.29.1", + "lightningcss-win32-arm64-msvc": "1.29.1", + "lightningcss-win32-x64-msvc": "1.29.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz", + "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz", + "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz", + "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz", + "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz", + "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz", + "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz", + "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz", + "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz", + "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz", + "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -11336,6 +12129,15 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "0.476.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.476.0.tgz", + "integrity": "sha512-x6cLTk8gahdUPje0hSgLN1/MgiJH+Xl90Xoxy9bkPAsMPOUiyRSKR4JCDPGVCEpyqnZXH3exFWNItcvra9WzUQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -11561,6 +12363,15 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -11646,6 +12457,12 @@ "tslib": "^2.0.3" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -12265,9 +13082,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "funding": [ { "type": "opencollective", @@ -12284,7 +13101,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -12798,9 +13615,9 @@ } }, "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -14384,6 +15201,64 @@ } } }, + "node_modules/react-scripts/node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/react-scripts/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/react-scripts/node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -16214,53 +17089,29 @@ "url": "https://opencollective.com/unts" } }, - "node_modules/tailwindcss": { - "version": "3.4.16", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.16.tgz", - "integrity": "sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==", + "node_modules/tailwind-merge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.0.2.tgz", + "integrity": "sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==", "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" } }, - "node_modules/tailwindcss/node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "node_modules/tailwindcss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.9.tgz", + "integrity": "sha512-12laZu+fv1ONDRoNR9ipTOpUD7RN9essRVkX36sjxuRUInpN7hIiHN4lBd/SIFjbISvnXzp8h/hXzmU8SQQYhw==", + "license": "MIT" + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" } }, "node_modules/tapable": { diff --git a/package.json b/package.json index 1b4e33b9..232d7845 100644 --- a/package.json +++ b/package.json @@ -3,13 +3,19 @@ "version": "0.1.0", "private": true, "dependencies": { + "@tailwindcss/cli": "^4.0.9", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", "cra-template": "1.2.0", + "lucide-react": "^0.476.0", "prop-types": "^15.8.1", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router-dom": "^7.0.2", "react-scripts": "5.0.1", "styled-components": "^6.1.13", + "tailwind-merge": "^3.0.2", + "tailwindcss-animate": "^1.0.7", "web-vitals": "^4.2.4" }, "scripts": { @@ -45,6 +51,7 @@ "@babel/plugin-transform-private-property-in-object": "^7.25.9", "@eslint/js": "^9.16.0", "@trivago/prettier-plugin-sort-imports": "^5.2.0", + "autoprefixer": "^10.4.20", "eslint": "^8.57.1", "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.31.0", @@ -52,7 +59,9 @@ "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.37.2", "globals": "^15.13.0", + "postcss": "^8.5.3", "prettier": "^3.4.2", - "prettier-eslint": "^16.3.0" + "prettier-eslint": "^16.3.0", + "tailwindcss": "^4.0.9" } } diff --git a/src/App.css b/src/App.css index 161800f9..0f533e38 100644 --- a/src/App.css +++ b/src/App.css @@ -1,4 +1,6 @@ /* global color presets */ +@import "tailwindcss"; + :root { --primary-green: #45bf84; --secondary-lightgrey: #f3f3f3; diff --git a/src/App.jsx b/src/App.jsx index 9a6e3eff..4ddd65ae 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -3,8 +3,8 @@ import React from 'react'; import { BrowserRouter, Route, Routes } from 'react-router-dom'; import { - PrivateRoute, - PublicOnlyRoute, + PrivateRoute, + PublicOnlyRoute, } from 'common/components/routes/ProtectedRoutes'; import { UserProvider } from 'common/contexts/UserContext'; import NavLayout from 'common/layouts/NavLayout'; @@ -19,28 +19,34 @@ import NotFound from 'pages/not-found/NotFound'; import './App.css'; export default function App() { - return ( - - - - }> - }> - } /> - - }> - } /> - } /> - } - /> - - } /> - } /> - } /> - - - - - ); + return ( + + + + }> + }> + } /> + + }> + } /> + } /> + } + /> + + } + /> + } + /> + } /> + + + + + ); } diff --git a/src/common/components/FormPopup.jsx b/src/common/components/FormPopup.jsx index 27f4a5d6..b8a152d0 100644 --- a/src/common/components/FormPopup.jsx +++ b/src/common/components/FormPopup.jsx @@ -5,24 +5,24 @@ import PropTypes from 'prop-types'; // import styled from 'styled-components'; export default function FormPopup() { - return ( -
-

FormPopup

-
- ); + return ( +
+

FormPopup

+
+ ); } FormPopup.propTypes = { - promptText: PropTypes.string, - placeholderText: PropTypes.string, - submitButtonText: PropTypes.string, - cancelButtonText: PropTypes.string, - onSubmit: PropTypes.func, + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, }; FormPopup.defaultProps = { - promptText: 'Prompt', - placeholderText: 'Enter text here', - submitButtonText: 'Submit', - cancelButtonText: 'Cancel', + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', }; diff --git a/src/common/components/YNPopup.jsx b/src/common/components/YNPopup.jsx index 4675cd72..1c30006a 100644 --- a/src/common/components/YNPopup.jsx +++ b/src/common/components/YNPopup.jsx @@ -5,24 +5,24 @@ import PropTypes from 'prop-types'; // import styled from 'styled-components'; export default function YNPopup({ yesText, noText, noOnClick, yesOnClick }) { - return ( -
-

- {yesText} - {noText} -

-
- ); + return ( +
+

+ {yesText} + {noText} +

+
+ ); } YNPopup.propTypes = { - yesText: PropTypes.string, - noText: PropTypes.string, - noOnClick: PropTypes.func, - yesOnClick: PropTypes.func, + yesText: PropTypes.string, + noText: PropTypes.string, + noOnClick: PropTypes.func, + yesOnClick: PropTypes.func, }; YNPopup.defaultProps = { - yesText: 'Yes', - noText: 'No', + yesText: 'Yes', + noText: 'No', }; diff --git a/src/index.css b/src/index.css index 85e778f4..b5132c0d 100644 --- a/src/index.css +++ b/src/index.css @@ -1,3 +1,6 @@ +@import "tailwindcss"; + + body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', diff --git a/src/index.jsx b/src/index.jsx index a29b8bfa..1d7eb3a6 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -7,7 +7,7 @@ import './index.css'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( - - - + + + ); diff --git a/src/output.css b/src/output.css new file mode 100644 index 00000000..1df3d01a --- /dev/null +++ b/src/output.css @@ -0,0 +1,392 @@ +/*! tailwindcss v4.0.9 | MIT License | https://tailwindcss.com */ +@layer theme, base, components, utilities; +@layer theme { + :root, :host { + --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace; + --color-red-500: oklch(0.637 0.237 25.331); + --spacing: 0.25rem; + --default-transition-duration: 150ms; + --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + --default-font-family: var(--font-sans); + --default-font-feature-settings: var(--font-sans--font-feature-settings); + --default-font-variation-settings: var( + --font-sans--font-variation-settings + ); + --default-mono-font-family: var(--font-mono); + --default-mono-font-feature-settings: var( + --font-mono--font-feature-settings + ); + --default-mono-font-variation-settings: var( + --font-mono--font-variation-settings + ); + } +} +@layer base { + *, ::after, ::before, ::backdrop, ::file-selector-button { + box-sizing: border-box; + margin: 0; + padding: 0; + border: 0 solid; + } + html, :host { + line-height: 1.5; + -webkit-text-size-adjust: 100%; + tab-size: 4; + font-family: var( --default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" ); + font-feature-settings: var(--default-font-feature-settings, normal); + font-variation-settings: var( --default-font-variation-settings, normal ); + -webkit-tap-highlight-color: transparent; + } + body { + line-height: inherit; + } + hr { + height: 0; + color: inherit; + border-top-width: 1px; + } + abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + } + h1, h2, h3, h4, h5, h6 { + font-size: inherit; + font-weight: inherit; + } + a { + color: inherit; + -webkit-text-decoration: inherit; + text-decoration: inherit; + } + b, strong { + font-weight: bolder; + } + code, kbd, samp, pre { + font-family: var( --default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace ); + font-feature-settings: var( --default-mono-font-feature-settings, normal ); + font-variation-settings: var( --default-mono-font-variation-settings, normal ); + font-size: 1em; + } + small { + font-size: 80%; + } + sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + sub { + bottom: -0.25em; + } + sup { + top: -0.5em; + } + table { + text-indent: 0; + border-color: inherit; + border-collapse: collapse; + } + :-moz-focusring { + outline: auto; + } + progress { + vertical-align: baseline; + } + summary { + display: list-item; + } + ol, ul, menu { + list-style: none; + } + img, svg, video, canvas, audio, iframe, embed, object { + display: block; + vertical-align: middle; + } + img, video { + max-width: 100%; + height: auto; + } + button, input, select, optgroup, textarea, ::file-selector-button { + font: inherit; + font-feature-settings: inherit; + font-variation-settings: inherit; + letter-spacing: inherit; + color: inherit; + border-radius: 0; + background-color: transparent; + opacity: 1; + } + :where(select:is([multiple], [size])) optgroup { + font-weight: bolder; + } + :where(select:is([multiple], [size])) optgroup option { + padding-inline-start: 20px; + } + ::file-selector-button { + margin-inline-end: 4px; + } + ::placeholder { + opacity: 1; + color: color-mix(in oklab, currentColor 50%, transparent); + } + textarea { + resize: vertical; + } + ::-webkit-search-decoration { + -webkit-appearance: none; + } + ::-webkit-date-and-time-value { + min-height: 1lh; + text-align: inherit; + } + ::-webkit-datetime-edit { + display: inline-flex; + } + ::-webkit-datetime-edit-fields-wrapper { + padding: 0; + } + ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field { + padding-block: 0; + } + :-moz-ui-invalid { + box-shadow: none; + } + button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button { + appearance: button; + } + ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { + height: auto; + } + [hidden]:where(:not([hidden="until-found"])) { + display: none !important; + } +} +@layer utilities { + .collapse { + visibility: collapse; + } + .absolute { + position: absolute; + } + .fixed { + position: fixed; + } + .relative { + position: relative; + } + .container { + width: 100%; + @media (width >= 40rem) { + max-width: 40rem; + } + @media (width >= 48rem) { + max-width: 48rem; + } + @media (width >= 64rem) { + max-width: 64rem; + } + @media (width >= 80rem) { + max-width: 80rem; + } + @media (width >= 96rem) { + max-width: 96rem; + } + } + .mb-4 { + margin-bottom: calc(var(--spacing) * 4); + } + .block { + display: block; + } + .flex { + display: flex; + } + .inline { + display: inline; + } + .inline-flex { + display: inline-flex; + } + .list-item { + display: list-item; + } + .table { + display: table; + } + .border-collapse { + border-collapse: collapse; + } + .transform { + transform: var(--tw-rotate-x) var(--tw-rotate-y) var(--tw-rotate-z) var(--tw-skew-x) var(--tw-skew-y); + } + .resize { + resize: both; + } + .border { + border-style: var(--tw-border-style); + border-width: 1px; + } + .text-red-500 { + color: var(--color-red-500); + } + .capitalize { + text-transform: capitalize; + } + .lowercase { + text-transform: lowercase; + } + .uppercase { + text-transform: uppercase; + } + .underline { + text-decoration-line: underline; + } + .antialiased { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + .outline { + outline-style: var(--tw-outline-style); + outline-width: 1px; + } + .grayscale { + --tw-grayscale: grayscale(100%); + filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); + } + .filter { + filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); + } + .backdrop-filter { + -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,); + backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,); + } + .transition { + transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } +} +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; +} +@property --tw-rotate-x { + syntax: "*"; + inherits: false; + initial-value: rotateX(0); +} +@property --tw-rotate-y { + syntax: "*"; + inherits: false; + initial-value: rotateY(0); +} +@property --tw-rotate-z { + syntax: "*"; + inherits: false; + initial-value: rotateZ(0); +} +@property --tw-skew-x { + syntax: "*"; + inherits: false; + initial-value: skewX(0); +} +@property --tw-skew-y { + syntax: "*"; + inherits: false; + initial-value: skewY(0); +} +@property --tw-border-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} +@property --tw-outline-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} +@property --tw-blur { + syntax: "*"; + inherits: false; +} +@property --tw-brightness { + syntax: "*"; + inherits: false; +} +@property --tw-contrast { + syntax: "*"; + inherits: false; +} +@property --tw-grayscale { + syntax: "*"; + inherits: false; +} +@property --tw-hue-rotate { + syntax: "*"; + inherits: false; +} +@property --tw-invert { + syntax: "*"; + inherits: false; +} +@property --tw-opacity { + syntax: "*"; + inherits: false; +} +@property --tw-saturate { + syntax: "*"; + inherits: false; +} +@property --tw-sepia { + syntax: "*"; + inherits: false; +} +@property --tw-drop-shadow { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-blur { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-brightness { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-contrast { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-grayscale { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-hue-rotate { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-invert { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-opacity { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-saturate { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-sepia { + syntax: "*"; + inherits: false; +} From 64b37b36052cb0e5ee997a517da39b55136e8c3a Mon Sep 17 00:00:00 2001 From: bbrockbrown Date: Wed, 26 Feb 2025 14:05:04 -0600 Subject: [PATCH 008/157] Revert "added new files for yes/no popup and form popup" This reverts commit ad78bc53f91a44d95751da18cc04d755f2bc7004. --- .history/.prettierrc_20250219202759.js | 18 --- .history/.prettierrc_20250225192502.js | 18 --- .history/.prettierrc_20250226140041.js | 18 +++ .history/package_20250225091015.json | 58 ---------- .history/src/App_20250219202759.jsx | 46 -------- .history/src/App_20250225120017.jsx | 46 -------- .../components/FormPopup_20250225192228.jsx | 0 .../components/FormPopup_20250225192900.jsx | 12 -- .../components/FormPopup_20250225192920.jsx | 17 --- .../components/FormPopup_20250225194133.jsx | 28 ----- .../components/YNPopup_20250225192240.jsx | 0 .../components/YNPopup_20250225192909.jsx | 12 -- .../components/YNPopup_20250225193030.jsx | 17 --- .../components/YNPopup_20250225193119.jsx | 22 ---- .../components/YNPopup_20250225193122.jsx | 22 ---- .../components/YNPopup_20250225193238.jsx | 24 ---- .../components/YNPopup_20250225193314.jsx | 21 ---- .../components/YNPopup_20250225193334.jsx | 23 ---- .../components/YNPopup_20250225193532.jsx | 26 ----- .../components/YNPopup_20250225193702.jsx | 28 ----- .../components/YNPopup_20250225193925.jsx | 28 ----- .../components/form/Input_20250219202759.jsx | 90 +++++++++++++++ .../components/form/Input_20250226140429.jsx | 90 +++++++++++++++ .history/src/index_20250219202759.jsx | 13 --- .history/src/index_20250225120401.jsx | 13 --- .prettierrc.js | 2 +- package.json | 2 +- src/common/components/FormPopup.jsx | 28 ----- src/common/components/YNPopup.jsx | 28 ----- src/common/components/form/Input.jsx | 106 +++++++++--------- 30 files changed, 253 insertions(+), 603 deletions(-) delete mode 100644 .history/.prettierrc_20250219202759.js delete mode 100644 .history/.prettierrc_20250225192502.js create mode 100644 .history/.prettierrc_20250226140041.js delete mode 100644 .history/package_20250225091015.json delete mode 100644 .history/src/App_20250219202759.jsx delete mode 100644 .history/src/App_20250225120017.jsx delete mode 100644 .history/src/common/components/FormPopup_20250225192228.jsx delete mode 100644 .history/src/common/components/FormPopup_20250225192900.jsx delete mode 100644 .history/src/common/components/FormPopup_20250225192920.jsx delete mode 100644 .history/src/common/components/FormPopup_20250225194133.jsx delete mode 100644 .history/src/common/components/YNPopup_20250225192240.jsx delete mode 100644 .history/src/common/components/YNPopup_20250225192909.jsx delete mode 100644 .history/src/common/components/YNPopup_20250225193030.jsx delete mode 100644 .history/src/common/components/YNPopup_20250225193119.jsx delete mode 100644 .history/src/common/components/YNPopup_20250225193122.jsx delete mode 100644 .history/src/common/components/YNPopup_20250225193238.jsx delete mode 100644 .history/src/common/components/YNPopup_20250225193314.jsx delete mode 100644 .history/src/common/components/YNPopup_20250225193334.jsx delete mode 100644 .history/src/common/components/YNPopup_20250225193532.jsx delete mode 100644 .history/src/common/components/YNPopup_20250225193702.jsx delete mode 100644 .history/src/common/components/YNPopup_20250225193925.jsx create mode 100644 .history/src/common/components/form/Input_20250219202759.jsx create mode 100644 .history/src/common/components/form/Input_20250226140429.jsx delete mode 100644 .history/src/index_20250219202759.jsx delete mode 100644 .history/src/index_20250225120401.jsx delete mode 100644 src/common/components/FormPopup.jsx delete mode 100644 src/common/components/YNPopup.jsx diff --git a/.history/.prettierrc_20250219202759.js b/.history/.prettierrc_20250219202759.js deleted file mode 100644 index ce8623ca..00000000 --- a/.history/.prettierrc_20250219202759.js +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - trailingComma: 'es5', - tabWidth: 2, - semi: true, - singleQuote: true, - printWidth: 80, - jsxSingleQuote: true, - proseWrap: 'always', - plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], - importOrder: [ - '^react$', - '', - '^(common|pages)/(.*)$', - '^[./]', - ], - importOrderSeparation: true, - importOrderSortSpecifiers: true, -}; diff --git a/.history/.prettierrc_20250225192502.js b/.history/.prettierrc_20250225192502.js deleted file mode 100644 index 24673dbb..00000000 --- a/.history/.prettierrc_20250225192502.js +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - trailingComma: 'es5', - tabWidth: 4, - semi: true, - singleQuote: true, - printWidth: 80, - jsxSingleQuote: true, - proseWrap: 'always', - plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], - importOrder: [ - '^react$', - '', - '^(common|pages)/(.*)$', - '^[./]', - ], - importOrderSeparation: true, - importOrderSortSpecifiers: true, -}; diff --git a/.history/.prettierrc_20250226140041.js b/.history/.prettierrc_20250226140041.js new file mode 100644 index 00000000..47ecbfee --- /dev/null +++ b/.history/.prettierrc_20250226140041.js @@ -0,0 +1,18 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 2, + semi: true, + singleQuote: true, + printWidth: 80, + jsxSingleQuote: true, + proseWrap: 'always', + plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], + importOrder: [ + '^react$', + '', + '^(common|pages)/(.*)$', + '^[./]', + ], + importOrderSeparation: true, + importOrderSortSpecifiers: true, +}; diff --git a/.history/package_20250225091015.json b/.history/package_20250225091015.json deleted file mode 100644 index 1b4e33b9..00000000 --- a/.history/package_20250225091015.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "frontend", - "version": "0.1.0", - "private": true, - "dependencies": { - "cra-template": "1.2.0", - "prop-types": "^15.8.1", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-router-dom": "^7.0.2", - "react-scripts": "5.0.1", - "styled-components": "^6.1.13", - "web-vitals": "^4.2.4" - }, - "scripts": { - "start": "PORT=3001 react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject", - "lint": "eslint .", - "lint:fix": "eslint . --fix", - "format": "prettier --write \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", - "format:check": "prettier --check \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", - "check-imports": "prettier --check --plugin @trivago/prettier-plugin-sort-imports \"src/**/*.{js,jsx,mjs,cjs}\"" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "devDependencies": { - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@eslint/js": "^9.16.0", - "@trivago/prettier-plugin-sort-imports": "^5.2.0", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-no-relative-import-paths": "^1.5.5", - "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-react": "^7.37.2", - "globals": "^15.13.0", - "prettier": "^3.4.2", - "prettier-eslint": "^16.3.0" - } -} diff --git a/.history/src/App_20250219202759.jsx b/.history/src/App_20250219202759.jsx deleted file mode 100644 index 9a6e3eff..00000000 --- a/.history/src/App_20250219202759.jsx +++ /dev/null @@ -1,46 +0,0 @@ -import React from 'react'; - -import { BrowserRouter, Route, Routes } from 'react-router-dom'; - -import { - PrivateRoute, - PublicOnlyRoute, -} from 'common/components/routes/ProtectedRoutes'; -import { UserProvider } from 'common/contexts/UserContext'; -import NavLayout from 'common/layouts/NavLayout'; -import AuthCallback from 'pages/account/AuthCallback'; -import Login from 'pages/account/Login'; -import RequestPasswordReset from 'pages/account/RequestPasswordReset'; -import ResetPassword from 'pages/account/ResetPassword'; -import SignUp from 'pages/account/SignUp'; -import Home from 'pages/home/Home'; -import NotFound from 'pages/not-found/NotFound'; - -import './App.css'; - -export default function App() { - return ( - - - - }> - }> - } /> - - }> - } /> - } /> - } - /> - - } /> - } /> - } /> - - - - - ); -} diff --git a/.history/src/App_20250225120017.jsx b/.history/src/App_20250225120017.jsx deleted file mode 100644 index 9a6e3eff..00000000 --- a/.history/src/App_20250225120017.jsx +++ /dev/null @@ -1,46 +0,0 @@ -import React from 'react'; - -import { BrowserRouter, Route, Routes } from 'react-router-dom'; - -import { - PrivateRoute, - PublicOnlyRoute, -} from 'common/components/routes/ProtectedRoutes'; -import { UserProvider } from 'common/contexts/UserContext'; -import NavLayout from 'common/layouts/NavLayout'; -import AuthCallback from 'pages/account/AuthCallback'; -import Login from 'pages/account/Login'; -import RequestPasswordReset from 'pages/account/RequestPasswordReset'; -import ResetPassword from 'pages/account/ResetPassword'; -import SignUp from 'pages/account/SignUp'; -import Home from 'pages/home/Home'; -import NotFound from 'pages/not-found/NotFound'; - -import './App.css'; - -export default function App() { - return ( - - - - }> - }> - } /> - - }> - } /> - } /> - } - /> - - } /> - } /> - } /> - - - - - ); -} diff --git a/.history/src/common/components/FormPopup_20250225192228.jsx b/.history/src/common/components/FormPopup_20250225192228.jsx deleted file mode 100644 index e69de29b..00000000 diff --git a/.history/src/common/components/FormPopup_20250225192900.jsx b/.history/src/common/components/FormPopup_20250225192900.jsx deleted file mode 100644 index bdbbf5fa..00000000 --- a/.history/src/common/components/FormPopup_20250225192900.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react'; - -// import PropTypes from 'prop-types'; -// import styled from 'styled-components'; - -export default function FormPopup() { - return ( -
-

FormPopup

-
- ); -} diff --git a/.history/src/common/components/FormPopup_20250225192920.jsx b/.history/src/common/components/FormPopup_20250225192920.jsx deleted file mode 100644 index 60079cc3..00000000 --- a/.history/src/common/components/FormPopup_20250225192920.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react'; - -// import PropTypes from 'prop-types'; -// import styled from 'styled-components'; - -export default function FormPopup() { - return ( -
-

FormPopup

-
- ); -} - -FormPopup.propTypes = { - // name: PropTypes.string, - // age: PropTypes.number, -}; diff --git a/.history/src/common/components/FormPopup_20250225194133.jsx b/.history/src/common/components/FormPopup_20250225194133.jsx deleted file mode 100644 index 27f4a5d6..00000000 --- a/.history/src/common/components/FormPopup_20250225194133.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; - -import PropTypes from 'prop-types'; - -// import styled from 'styled-components'; - -export default function FormPopup() { - return ( -
-

FormPopup

-
- ); -} - -FormPopup.propTypes = { - promptText: PropTypes.string, - placeholderText: PropTypes.string, - submitButtonText: PropTypes.string, - cancelButtonText: PropTypes.string, - onSubmit: PropTypes.func, -}; - -FormPopup.defaultProps = { - promptText: 'Prompt', - placeholderText: 'Enter text here', - submitButtonText: 'Submit', - cancelButtonText: 'Cancel', -}; diff --git a/.history/src/common/components/YNPopup_20250225192240.jsx b/.history/src/common/components/YNPopup_20250225192240.jsx deleted file mode 100644 index e69de29b..00000000 diff --git a/.history/src/common/components/YNPopup_20250225192909.jsx b/.history/src/common/components/YNPopup_20250225192909.jsx deleted file mode 100644 index d9fa0182..00000000 --- a/.history/src/common/components/YNPopup_20250225192909.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react'; - -// import PropTypes from 'prop-types'; -// import styled from 'styled-components'; - -export default function YNPopup() { - return ( -
-

FormPopup

-
- ); -} diff --git a/.history/src/common/components/YNPopup_20250225193030.jsx b/.history/src/common/components/YNPopup_20250225193030.jsx deleted file mode 100644 index fd343313..00000000 --- a/.history/src/common/components/YNPopup_20250225193030.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react'; - -// import PropTypes from 'prop-types'; -// import styled from 'styled-components'; - -export default function YNPopup() { - return ( -
-

FormPopup

-
- ); -} - -YNPopup.propTypes = { - // name: PropTypes.string, - // age: PropTypes.number, -}; diff --git a/.history/src/common/components/YNPopup_20250225193119.jsx b/.history/src/common/components/YNPopup_20250225193119.jsx deleted file mode 100644 index 5b83bbb0..00000000 --- a/.history/src/common/components/YNPopup_20250225193119.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; - -// import PropTypes from 'prop-types'; -// import styled from 'styled-components'; - -export default function YNPopup() { - return ( -
-

FormPopup

-
- ); -} - -YNPopup.propTypes = { - // name: PropTypes.string, - // age: PropTypes.number, -}; - -YNPopup.defaultProps = { - // name: PropTypes.string, - // age: PropTypes.number, -}; diff --git a/.history/src/common/components/YNPopup_20250225193122.jsx b/.history/src/common/components/YNPopup_20250225193122.jsx deleted file mode 100644 index 5b83bbb0..00000000 --- a/.history/src/common/components/YNPopup_20250225193122.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; - -// import PropTypes from 'prop-types'; -// import styled from 'styled-components'; - -export default function YNPopup() { - return ( -
-

FormPopup

-
- ); -} - -YNPopup.propTypes = { - // name: PropTypes.string, - // age: PropTypes.number, -}; - -YNPopup.defaultProps = { - // name: PropTypes.string, - // age: PropTypes.number, -}; diff --git a/.history/src/common/components/YNPopup_20250225193238.jsx b/.history/src/common/components/YNPopup_20250225193238.jsx deleted file mode 100644 index 1cb64f47..00000000 --- a/.history/src/common/components/YNPopup_20250225193238.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; - -import PropTypes from 'prop-types'; - -// import styled from 'styled-components'; - -export default function YNPopup() { - return ( -
-

FormPopup

-
- ); -} - -YNPopup.propTypes = { - // name: PropTypes.string, - // age: PropTypes.number, -}; - -YNPopup.defaultProps = { - yesText: PropTypes.string, - - // age: PropTypes.number, -}; diff --git a/.history/src/common/components/YNPopup_20250225193314.jsx b/.history/src/common/components/YNPopup_20250225193314.jsx deleted file mode 100644 index 0eab1e58..00000000 --- a/.history/src/common/components/YNPopup_20250225193314.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react'; - -// import styled from 'styled-components'; - -export default function YNPopup() { - return ( -
-

FormPopup

-
- ); -} - -YNPopup.propTypes = { - // name: PropTypes.string, - // age: PropTypes.number, -}; - -YNPopup.defaultProps = { - yesText: 'Yes', - noText: 'No', -}; diff --git a/.history/src/common/components/YNPopup_20250225193334.jsx b/.history/src/common/components/YNPopup_20250225193334.jsx deleted file mode 100644 index 2285eb0a..00000000 --- a/.history/src/common/components/YNPopup_20250225193334.jsx +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react'; - -import PropTypes from 'prop-types'; - -// import styled from 'styled-components'; - -export default function YNPopup() { - return ( -
-

FormPopup

-
- ); -} - -YNPopup.propTypes = { - yesText: PropTypes.string, - noText: PropTypes.string, -}; - -YNPopup.defaultProps = { - yesText: 'Yes', - noText: 'No', -}; diff --git a/.history/src/common/components/YNPopup_20250225193532.jsx b/.history/src/common/components/YNPopup_20250225193532.jsx deleted file mode 100644 index bf90e218..00000000 --- a/.history/src/common/components/YNPopup_20250225193532.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react'; - -import PropTypes from 'prop-types'; - -// import styled from 'styled-components'; - -export default function YNPopup({ yesText, noText }) { - return ( -
-

- {yesText} - {noText} -

-
- ); -} - -YNPopup.propTypes = { - yesText: PropTypes.string, - noText: PropTypes.string, -}; - -YNPopup.defaultProps = { - yesText: 'Yes', - noText: 'No', -}; diff --git a/.history/src/common/components/YNPopup_20250225193702.jsx b/.history/src/common/components/YNPopup_20250225193702.jsx deleted file mode 100644 index 4675cd72..00000000 --- a/.history/src/common/components/YNPopup_20250225193702.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; - -import PropTypes from 'prop-types'; - -// import styled from 'styled-components'; - -export default function YNPopup({ yesText, noText, noOnClick, yesOnClick }) { - return ( -
-

- {yesText} - {noText} -

-
- ); -} - -YNPopup.propTypes = { - yesText: PropTypes.string, - noText: PropTypes.string, - noOnClick: PropTypes.func, - yesOnClick: PropTypes.func, -}; - -YNPopup.defaultProps = { - yesText: 'Yes', - noText: 'No', -}; diff --git a/.history/src/common/components/YNPopup_20250225193925.jsx b/.history/src/common/components/YNPopup_20250225193925.jsx deleted file mode 100644 index 4675cd72..00000000 --- a/.history/src/common/components/YNPopup_20250225193925.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; - -import PropTypes from 'prop-types'; - -// import styled from 'styled-components'; - -export default function YNPopup({ yesText, noText, noOnClick, yesOnClick }) { - return ( -
-

- {yesText} - {noText} -

-
- ); -} - -YNPopup.propTypes = { - yesText: PropTypes.string, - noText: PropTypes.string, - noOnClick: PropTypes.func, - yesOnClick: PropTypes.func, -}; - -YNPopup.defaultProps = { - yesText: 'Yes', - noText: 'No', -}; diff --git a/.history/src/common/components/form/Input_20250219202759.jsx b/.history/src/common/components/form/Input_20250219202759.jsx new file mode 100644 index 00000000..c367d9d4 --- /dev/null +++ b/.history/src/common/components/form/Input_20250219202759.jsx @@ -0,0 +1,90 @@ +import React, { useState } from 'react'; + +import { Icon } from 'assets/icons/icons'; +import PropTypes from 'prop-types'; + +import { + IconContainer, + InputContainer, + InputName, + InputTitle, + PasswordContainer, + RedSpan, + StyledInput, +} from './styles'; + +TitledInput.propTypes = { + title: PropTypes.string.isRequired, + required: PropTypes.bool, + children: PropTypes.node.isRequired, +}; +function TitledInput({ title, required, children }) { + return ( + + + {title} + {required && *} + + {children} + + ); +} + +const InputPropTypes = { + onChange: PropTypes.func.isRequired, + placeholder: PropTypes.string, + value: PropTypes.string, + required: PropTypes.bool, +}; + +TextField.propTypes = InputPropTypes; +function TextField(props) { + props.placeholder ??= 'Text Here'; + return ; +} + +InputText.propTypes = { + title: PropTypes.string.isRequired, + ...InputPropTypes, +}; +function InputText({ title, ...rest }) { + return ( + + + + ); +} + +PasswordField.propTypes = InputPropTypes; +function PasswordField(props) { + const [showPassword, setShowPassword] = useState(false); + const toggleShowPassword = () => { + setShowPassword(!showPassword); + }; + + return ( + + + + {showPassword ? : } + + + ); +} + +InputPassword.propTypes = { + title: PropTypes.string.isRequired, + ...InputPropTypes, +}; +function InputPassword({ title, ...rest }) { + return ( + + + + ); +} + +export const Input = { + Text: InputText, + Password: InputPassword, +}; diff --git a/.history/src/common/components/form/Input_20250226140429.jsx b/.history/src/common/components/form/Input_20250226140429.jsx new file mode 100644 index 00000000..dbdb5202 --- /dev/null +++ b/.history/src/common/components/form/Input_20250226140429.jsx @@ -0,0 +1,90 @@ +import React, { useState } from 'react'; + +import { Icon } from 'assets/icons/icons'; +import PropTypes from 'prop-types'; + +import { + IconContainer, + InputContainer, + InputName, + InputTitle, + PasswordContainer, + RedSpan, + StyledInput, +} from './styles'; + +TitledInput.propTypes = { + title: PropTypes.string.isRequired, + required: PropTypes.bool, + children: PropTypes.node.isRequired, +}; +function TitledInput({ title, required, children }) { + return ( + + + {title} + {required && *} + + {children} + + ); +} + +const InputPropTypes = { + onChange: PropTypes.func.isRequired, + placeholder: PropTypes.string, + value: PropTypes.string, + required: PropTypes.bool, +}; + +TextField.propTypes = InputPropTypes; +function TextField(props) { + props.placeholder ??= 'Text Here'; + return ; +} + +InputText.propTypes = { + title: PropTypes.string.isRequired, + ...InputPropTypes, +}; +function InputText({ title, ...rest }) { + return ( + + + + ); +} + +PasswordField.propTypes = InputPropTypes; +function PasswordField(props) { + const [showPassword, setShowPassword] = useState(false); + const toggleShowPassword = () => { + setShowPassword(!showPassword); + }; + + return ( + + + + {showPassword ? : } + + + ); +} + +InputPassword.propTypes = { + title: PropTypes.string.isRequired, + ...InputPropTypes, +}; +function InputPassword({ title, ...rest }) { + return ( + + + + ); +} + +export const Input = { + Text: InputText, + Password: InputPassword, +}; diff --git a/.history/src/index_20250219202759.jsx b/.history/src/index_20250219202759.jsx deleted file mode 100644 index a29b8bfa..00000000 --- a/.history/src/index_20250219202759.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; - -import ReactDOM from 'react-dom/client'; - -import App from './App'; -import './index.css'; - -const root = ReactDOM.createRoot(document.getElementById('root')); -root.render( - - - -); diff --git a/.history/src/index_20250225120401.jsx b/.history/src/index_20250225120401.jsx deleted file mode 100644 index a29b8bfa..00000000 --- a/.history/src/index_20250225120401.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; - -import ReactDOM from 'react-dom/client'; - -import App from './App'; -import './index.css'; - -const root = ReactDOM.createRoot(document.getElementById('root')); -root.render( - - - -); diff --git a/.prettierrc.js b/.prettierrc.js index 64dc4468..47ecbfee 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,6 +1,6 @@ module.exports = { trailingComma: 'es5', - tabWidth: 4, + tabWidth: 2, semi: true, singleQuote: true, printWidth: 80, diff --git a/package.json b/package.json index 232d7845..e030c1c8 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "web-vitals": "^4.2.4" }, "scripts": { - "start": "PORT=3001 react-scripts start", + "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", diff --git a/src/common/components/FormPopup.jsx b/src/common/components/FormPopup.jsx deleted file mode 100644 index b8a152d0..00000000 --- a/src/common/components/FormPopup.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; - -import PropTypes from 'prop-types'; - -// import styled from 'styled-components'; - -export default function FormPopup() { - return ( -
-

FormPopup

-
- ); -} - -FormPopup.propTypes = { - promptText: PropTypes.string, - placeholderText: PropTypes.string, - submitButtonText: PropTypes.string, - cancelButtonText: PropTypes.string, - onSubmit: PropTypes.func, -}; - -FormPopup.defaultProps = { - promptText: 'Prompt', - placeholderText: 'Enter text here', - submitButtonText: 'Submit', - cancelButtonText: 'Cancel', -}; diff --git a/src/common/components/YNPopup.jsx b/src/common/components/YNPopup.jsx deleted file mode 100644 index 1c30006a..00000000 --- a/src/common/components/YNPopup.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; - -import PropTypes from 'prop-types'; - -// import styled from 'styled-components'; - -export default function YNPopup({ yesText, noText, noOnClick, yesOnClick }) { - return ( -
-

- {yesText} - {noText} -

-
- ); -} - -YNPopup.propTypes = { - yesText: PropTypes.string, - noText: PropTypes.string, - noOnClick: PropTypes.func, - yesOnClick: PropTypes.func, -}; - -YNPopup.defaultProps = { - yesText: 'Yes', - noText: 'No', -}; diff --git a/src/common/components/form/Input.jsx b/src/common/components/form/Input.jsx index c367d9d4..dbdb5202 100644 --- a/src/common/components/form/Input.jsx +++ b/src/common/components/form/Input.jsx @@ -4,87 +4,87 @@ import { Icon } from 'assets/icons/icons'; import PropTypes from 'prop-types'; import { - IconContainer, - InputContainer, - InputName, - InputTitle, - PasswordContainer, - RedSpan, - StyledInput, + IconContainer, + InputContainer, + InputName, + InputTitle, + PasswordContainer, + RedSpan, + StyledInput, } from './styles'; TitledInput.propTypes = { - title: PropTypes.string.isRequired, - required: PropTypes.bool, - children: PropTypes.node.isRequired, + title: PropTypes.string.isRequired, + required: PropTypes.bool, + children: PropTypes.node.isRequired, }; function TitledInput({ title, required, children }) { - return ( - - - {title} - {required && *} - - {children} - - ); + return ( + + + {title} + {required && *} + + {children} + + ); } const InputPropTypes = { - onChange: PropTypes.func.isRequired, - placeholder: PropTypes.string, - value: PropTypes.string, - required: PropTypes.bool, + onChange: PropTypes.func.isRequired, + placeholder: PropTypes.string, + value: PropTypes.string, + required: PropTypes.bool, }; TextField.propTypes = InputPropTypes; function TextField(props) { - props.placeholder ??= 'Text Here'; - return ; + props.placeholder ??= 'Text Here'; + return ; } InputText.propTypes = { - title: PropTypes.string.isRequired, - ...InputPropTypes, + title: PropTypes.string.isRequired, + ...InputPropTypes, }; function InputText({ title, ...rest }) { - return ( - - - - ); + return ( + + + + ); } PasswordField.propTypes = InputPropTypes; function PasswordField(props) { - const [showPassword, setShowPassword] = useState(false); - const toggleShowPassword = () => { - setShowPassword(!showPassword); - }; + const [showPassword, setShowPassword] = useState(false); + const toggleShowPassword = () => { + setShowPassword(!showPassword); + }; - return ( - - - - {showPassword ? : } - - - ); + return ( + + + + {showPassword ? : } + + + ); } InputPassword.propTypes = { - title: PropTypes.string.isRequired, - ...InputPropTypes, + title: PropTypes.string.isRequired, + ...InputPropTypes, }; function InputPassword({ title, ...rest }) { - return ( - - - - ); + return ( + + + + ); } export const Input = { - Text: InputText, - Password: InputPassword, + Text: InputText, + Password: InputPassword, }; From ece01c422583934d176d3b3d0e1a29de85edbb01 Mon Sep 17 00:00:00 2001 From: bbrockbrown Date: Wed, 26 Feb 2025 14:09:02 -0600 Subject: [PATCH 009/157] re-add both pop-up files --- .../components/Button_20250219202759.js | 37 ++++ .../components/Button_20250226140619.js | 37 ++++ .../components/FormPopup_20250226140843.jsx | 28 ++++ .../GoogleButton_20250219202759.jsx | 104 ++++++++++++ .../GoogleButton_20250226140618.jsx | 104 ++++++++++++ .../common/components/Text_20250219202759.js | 13 ++ .../common/components/Text_20250226140618.js | 13 ++ .../components/YNPopup_20250226140848.jsx | 29 ++++ src/common/components/Button.js | 36 ++-- src/common/components/FormPopup.jsx | 28 ++++ src/common/components/GoogleButton.jsx | 158 +++++++++--------- src/common/components/Text.js | 12 +- src/common/components/YNPopup.jsx | 29 ++++ 13 files changed, 525 insertions(+), 103 deletions(-) create mode 100644 .history/src/common/components/Button_20250219202759.js create mode 100644 .history/src/common/components/Button_20250226140619.js create mode 100644 .history/src/common/components/FormPopup_20250226140843.jsx create mode 100644 .history/src/common/components/GoogleButton_20250219202759.jsx create mode 100644 .history/src/common/components/GoogleButton_20250226140618.jsx create mode 100644 .history/src/common/components/Text_20250219202759.js create mode 100644 .history/src/common/components/Text_20250226140618.js create mode 100644 .history/src/common/components/YNPopup_20250226140848.jsx create mode 100644 src/common/components/FormPopup.jsx create mode 100644 src/common/components/YNPopup.jsx diff --git a/.history/src/common/components/Button_20250219202759.js b/.history/src/common/components/Button_20250219202759.js new file mode 100644 index 00000000..a14a6bbf --- /dev/null +++ b/.history/src/common/components/Button_20250219202759.js @@ -0,0 +1,37 @@ +import styled from 'styled-components'; + +const ButtonBase = styled.button` + font-size: 0.8em; + padding: 8px 20px; + border-radius: 5px; + border: solid 1px var(--text); + color: var(--text); + cursor: pointer; +`; + +const ButtonPrimary = styled(ButtonBase)` + background-color: var(--primary-green); + border-color: var(--primary-green); + color: var(--white); +`; + +const ButtonSecondary = styled(ButtonBase)` + background-color: var(--secondary-lightgrey); + border-color: var(--text); +`; + +const ButtonTransparent = styled(ButtonBase)` + background-color: transparent; +`; + +const ButtonInvisible = styled(ButtonBase)` + background-color: transparent; + border-color: transparent; +`; + +export const Button = { + Primary: ButtonPrimary, + Secondary: ButtonSecondary, + Transparent: ButtonTransparent, + Invisible: ButtonInvisible, +}; diff --git a/.history/src/common/components/Button_20250226140619.js b/.history/src/common/components/Button_20250226140619.js new file mode 100644 index 00000000..ab016464 --- /dev/null +++ b/.history/src/common/components/Button_20250226140619.js @@ -0,0 +1,37 @@ +import styled from 'styled-components'; + +const ButtonBase = styled.button` + font-size: 0.8em; + padding: 8px 20px; + border-radius: 5px; + border: solid 1px var(--text); + color: var(--text); + cursor: pointer; +`; + +const ButtonPrimary = styled(ButtonBase)` + background-color: var(--primary-green); + border-color: var(--primary-green); + color: var(--white); +`; + +const ButtonSecondary = styled(ButtonBase)` + background-color: var(--secondary-lightgrey); + border-color: var(--text); +`; + +const ButtonTransparent = styled(ButtonBase)` + background-color: transparent; +`; + +const ButtonInvisible = styled(ButtonBase)` + background-color: transparent; + border-color: transparent; +`; + +export const Button = { + Primary: ButtonPrimary, + Secondary: ButtonSecondary, + Transparent: ButtonTransparent, + Invisible: ButtonInvisible, +}; diff --git a/.history/src/common/components/FormPopup_20250226140843.jsx b/.history/src/common/components/FormPopup_20250226140843.jsx new file mode 100644 index 00000000..b8a152d0 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226140843.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function FormPopup() { + return ( +
+

FormPopup

+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/.history/src/common/components/GoogleButton_20250219202759.jsx b/.history/src/common/components/GoogleButton_20250219202759.jsx new file mode 100644 index 00000000..c1758b7a --- /dev/null +++ b/.history/src/common/components/GoogleButton_20250219202759.jsx @@ -0,0 +1,104 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; +import styled from 'styled-components'; + +const StyledButton = styled.button` + width: 100%; + display: flex; + justify-content: center; + align-items: center; + gap: 8px; + background-color: white; + border: 1px solid #e2e2e2; + border-radius: 4px; + padding: 8px 16px; + color: #5f6368; + font-size: 14px; + cursor: pointer; + transition: background-color 0.2s; + + &:hover { + background-color: #f8f9fa; + } + + &:focus { + outline: none; + box-shadow: 0 0 0 2px #e8e8e8; + } + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } +`; + +const Divider = styled.div` + position: relative; + margin: 24px 0; + text-align: center; + + &::before { + content: ''; + position: absolute; + top: 50%; + left: 0; + right: 0; + height: 1px; + background-color: #e2e2e2; + } + + span { + position: relative; + background-color: white; + padding: 0 12px; + color: #666; + font-size: 14px; + } +`; + +export default function GoogleButton({ + isLoading, + onClick, + text = 'Sign in with Google', +}) { + return ( + <> + + Or continue with + + + + + + + + + {text} + + + ); +} + +GoogleButton.propTypes = { + isLoading: PropTypes.bool, + onClick: PropTypes.func.isRequired, + text: PropTypes.string, +}; + +GoogleButton.defaultProps = { + isLoading: false, + text: 'Sign in with Google', +}; diff --git a/.history/src/common/components/GoogleButton_20250226140618.jsx b/.history/src/common/components/GoogleButton_20250226140618.jsx new file mode 100644 index 00000000..9cdb0157 --- /dev/null +++ b/.history/src/common/components/GoogleButton_20250226140618.jsx @@ -0,0 +1,104 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; +import styled from 'styled-components'; + +const StyledButton = styled.button` + width: 100%; + display: flex; + justify-content: center; + align-items: center; + gap: 8px; + background-color: white; + border: 1px solid #e2e2e2; + border-radius: 4px; + padding: 8px 16px; + color: #5f6368; + font-size: 14px; + cursor: pointer; + transition: background-color 0.2s; + + &:hover { + background-color: #f8f9fa; + } + + &:focus { + outline: none; + box-shadow: 0 0 0 2px #e8e8e8; + } + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } +`; + +const Divider = styled.div` + position: relative; + margin: 24px 0; + text-align: center; + + &::before { + content: ''; + position: absolute; + top: 50%; + left: 0; + right: 0; + height: 1px; + background-color: #e2e2e2; + } + + span { + position: relative; + background-color: white; + padding: 0 12px; + color: #666; + font-size: 14px; + } +`; + +export default function GoogleButton({ + isLoading, + onClick, + text = 'Sign in with Google', +}) { + return ( + <> + + Or continue with + + + + + + + + + {text} + + + ); +} + +GoogleButton.propTypes = { + isLoading: PropTypes.bool, + onClick: PropTypes.func.isRequired, + text: PropTypes.string, +}; + +GoogleButton.defaultProps = { + isLoading: false, + text: 'Sign in with Google', +}; diff --git a/.history/src/common/components/Text_20250219202759.js b/.history/src/common/components/Text_20250219202759.js new file mode 100644 index 00000000..b989b6f0 --- /dev/null +++ b/.history/src/common/components/Text_20250219202759.js @@ -0,0 +1,13 @@ +import styled from 'styled-components'; + +export const Title = styled.h1` + font-size: 2.5em; + font-weight: bold; + margin: 0; +`; + +export const Subtitle = styled.h2` + font-size: 1.5em; + margin: 0; + font-weight: normal; +`; diff --git a/.history/src/common/components/Text_20250226140618.js b/.history/src/common/components/Text_20250226140618.js new file mode 100644 index 00000000..cd15a4a0 --- /dev/null +++ b/.history/src/common/components/Text_20250226140618.js @@ -0,0 +1,13 @@ +import styled from 'styled-components'; + +export const Title = styled.h1` + font-size: 2.5em; + font-weight: bold; + margin: 0; +`; + +export const Subtitle = styled.h2` + font-size: 1.5em; + margin: 0; + font-weight: normal; +`; diff --git a/.history/src/common/components/YNPopup_20250226140848.jsx b/.history/src/common/components/YNPopup_20250226140848.jsx new file mode 100644 index 00000000..cabc98f7 --- /dev/null +++ b/.history/src/common/components/YNPopup_20250226140848.jsx @@ -0,0 +1,29 @@ +// YNPopup.jsx +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function YNPopup({ yesText, noText, noOnClick, yesOnClick }) { + return ( +
+

+ {yesText} + {noText} +

+
+ ); +} + +YNPopup.propTypes = { + yesText: PropTypes.string, + noText: PropTypes.string, + noOnClick: PropTypes.func, + yesOnClick: PropTypes.func, +}; + +YNPopup.defaultProps = { + yesText: 'Yes', + noText: 'No', +}; diff --git a/src/common/components/Button.js b/src/common/components/Button.js index a14a6bbf..ab016464 100644 --- a/src/common/components/Button.js +++ b/src/common/components/Button.js @@ -1,37 +1,37 @@ import styled from 'styled-components'; const ButtonBase = styled.button` - font-size: 0.8em; - padding: 8px 20px; - border-radius: 5px; - border: solid 1px var(--text); - color: var(--text); - cursor: pointer; + font-size: 0.8em; + padding: 8px 20px; + border-radius: 5px; + border: solid 1px var(--text); + color: var(--text); + cursor: pointer; `; const ButtonPrimary = styled(ButtonBase)` - background-color: var(--primary-green); - border-color: var(--primary-green); - color: var(--white); + background-color: var(--primary-green); + border-color: var(--primary-green); + color: var(--white); `; const ButtonSecondary = styled(ButtonBase)` - background-color: var(--secondary-lightgrey); - border-color: var(--text); + background-color: var(--secondary-lightgrey); + border-color: var(--text); `; const ButtonTransparent = styled(ButtonBase)` - background-color: transparent; + background-color: transparent; `; const ButtonInvisible = styled(ButtonBase)` - background-color: transparent; - border-color: transparent; + background-color: transparent; + border-color: transparent; `; export const Button = { - Primary: ButtonPrimary, - Secondary: ButtonSecondary, - Transparent: ButtonTransparent, - Invisible: ButtonInvisible, + Primary: ButtonPrimary, + Secondary: ButtonSecondary, + Transparent: ButtonTransparent, + Invisible: ButtonInvisible, }; diff --git a/src/common/components/FormPopup.jsx b/src/common/components/FormPopup.jsx new file mode 100644 index 00000000..b8a152d0 --- /dev/null +++ b/src/common/components/FormPopup.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function FormPopup() { + return ( +
+

FormPopup

+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/src/common/components/GoogleButton.jsx b/src/common/components/GoogleButton.jsx index c1758b7a..9cdb0157 100644 --- a/src/common/components/GoogleButton.jsx +++ b/src/common/components/GoogleButton.jsx @@ -4,101 +4,101 @@ import PropTypes from 'prop-types'; import styled from 'styled-components'; const StyledButton = styled.button` - width: 100%; - display: flex; - justify-content: center; - align-items: center; - gap: 8px; - background-color: white; - border: 1px solid #e2e2e2; - border-radius: 4px; - padding: 8px 16px; - color: #5f6368; - font-size: 14px; - cursor: pointer; - transition: background-color 0.2s; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + gap: 8px; + background-color: white; + border: 1px solid #e2e2e2; + border-radius: 4px; + padding: 8px 16px; + color: #5f6368; + font-size: 14px; + cursor: pointer; + transition: background-color 0.2s; - &:hover { - background-color: #f8f9fa; - } + &:hover { + background-color: #f8f9fa; + } - &:focus { - outline: none; - box-shadow: 0 0 0 2px #e8e8e8; - } + &:focus { + outline: none; + box-shadow: 0 0 0 2px #e8e8e8; + } - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } `; const Divider = styled.div` - position: relative; - margin: 24px 0; - text-align: center; + position: relative; + margin: 24px 0; + text-align: center; - &::before { - content: ''; - position: absolute; - top: 50%; - left: 0; - right: 0; - height: 1px; - background-color: #e2e2e2; - } + &::before { + content: ''; + position: absolute; + top: 50%; + left: 0; + right: 0; + height: 1px; + background-color: #e2e2e2; + } - span { - position: relative; - background-color: white; - padding: 0 12px; - color: #666; - font-size: 14px; - } + span { + position: relative; + background-color: white; + padding: 0 12px; + color: #666; + font-size: 14px; + } `; export default function GoogleButton({ - isLoading, - onClick, - text = 'Sign in with Google', + isLoading, + onClick, + text = 'Sign in with Google', }) { - return ( - <> - - Or continue with - - - - - - - - - {text} - - - ); + return ( + <> + + Or continue with + + + + + + + + + {text} + + + ); } GoogleButton.propTypes = { - isLoading: PropTypes.bool, - onClick: PropTypes.func.isRequired, - text: PropTypes.string, + isLoading: PropTypes.bool, + onClick: PropTypes.func.isRequired, + text: PropTypes.string, }; GoogleButton.defaultProps = { - isLoading: false, - text: 'Sign in with Google', + isLoading: false, + text: 'Sign in with Google', }; diff --git a/src/common/components/Text.js b/src/common/components/Text.js index b989b6f0..cd15a4a0 100644 --- a/src/common/components/Text.js +++ b/src/common/components/Text.js @@ -1,13 +1,13 @@ import styled from 'styled-components'; export const Title = styled.h1` - font-size: 2.5em; - font-weight: bold; - margin: 0; + font-size: 2.5em; + font-weight: bold; + margin: 0; `; export const Subtitle = styled.h2` - font-size: 1.5em; - margin: 0; - font-weight: normal; + font-size: 1.5em; + margin: 0; + font-weight: normal; `; diff --git a/src/common/components/YNPopup.jsx b/src/common/components/YNPopup.jsx new file mode 100644 index 00000000..cabc98f7 --- /dev/null +++ b/src/common/components/YNPopup.jsx @@ -0,0 +1,29 @@ +// YNPopup.jsx +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function YNPopup({ yesText, noText, noOnClick, yesOnClick }) { + return ( +
+

+ {yesText} + {noText} +

+
+ ); +} + +YNPopup.propTypes = { + yesText: PropTypes.string, + noText: PropTypes.string, + noOnClick: PropTypes.func, + yesOnClick: PropTypes.func, +}; + +YNPopup.defaultProps = { + yesText: 'Yes', + noText: 'No', +}; From 3acd090af1836bcc25f989de8f0be49797c1c8ea Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 26 Feb 2025 20:44:04 -0600 Subject: [PATCH 010/157] deleted prettier --- .prettierrc.js | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 .prettierrc.js diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index ce8623ca..00000000 --- a/.prettierrc.js +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - trailingComma: 'es5', - tabWidth: 2, - semi: true, - singleQuote: true, - printWidth: 80, - jsxSingleQuote: true, - proseWrap: 'always', - plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], - importOrder: [ - '^react$', - '', - '^(common|pages)/(.*)$', - '^[./]', - ], - importOrderSeparation: true, - importOrderSortSpecifiers: true, -}; From 3c6b5584a3fd3eaaa160ac01ae627aeb683e81a3 Mon Sep 17 00:00:00 2001 From: Daisy Zhang Date: Wed, 26 Feb 2025 21:20:40 -0600 Subject: [PATCH 011/157] navbar --- public/ITAlogo.png | Bin 0 -> 56009 bytes src/App.css | 4 ++ src/common/components/navigation/NavBar.jsx | 53 ++++++++++---------- 3 files changed, 31 insertions(+), 26 deletions(-) create mode 100644 public/ITAlogo.png diff --git a/public/ITAlogo.png b/public/ITAlogo.png new file mode 100644 index 0000000000000000000000000000000000000000..567e694217c7a40a073e1770a2c9b74c44b871ca GIT binary patch literal 56009 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 Vp8R(C1^#UM5)zJ5sd{J;_CG+vKhgjI literal 0 HcmV?d00001 diff --git a/src/App.css b/src/App.css index 161800f9..5cbbcec0 100644 --- a/src/App.css +++ b/src/App.css @@ -7,6 +7,10 @@ --text: #191a23; } +#ITAlogo{ + height:50px; +} + * { font-family: Verdana, sans-serif; color: var(--text); diff --git a/src/common/components/navigation/NavBar.jsx b/src/common/components/navigation/NavBar.jsx index e918e8ee..217443a5 100644 --- a/src/common/components/navigation/NavBar.jsx +++ b/src/common/components/navigation/NavBar.jsx @@ -1,17 +1,18 @@ -import React, { useState } from 'react'; +import React, { useState } from "react"; -import { useNavigate } from 'react-router-dom'; -import styled from 'styled-components'; +import { useNavigate } from "react-router-dom"; +import styled from "styled-components"; -import { Button } from 'common/components/Button'; -import { useUser } from 'common/contexts/UserContext'; +import { Button } from "common/components/Button"; +import { useUser } from "common/contexts/UserContext"; -import LogoutModal from './LogoutModal'; +//import '/Users/zhangyixi/frontend/src/App.css'; const StyledNav = styled.nav` display: flex; - gap: 10px; - padding: 10px 20px; + background-color: #d9d9d920; + height: 65px; + width: 100%; font-size: 20px; `; @@ -45,34 +46,34 @@ export default function NavBar() { try { await logout(); setIsModalOpen(false); - navigate('/', { replace: true }); + navigate("/", { replace: true }); } catch (error) { - console.error('Logout error:', error); + console.error("Logout error:", error); } }; + //if log in, show account seeting, if not, show log in. no setup. return ( - navigate('/')}>[LOGO] + navigate("/")}> + + - {user ? ( - Log Out - ) : ( - <> - navigate('/signup')}> - Sign Up - - navigate('/login')}> + <> + {user ? ( // If user is logged in, show their name (clickable to Account Settings) +
navigate("/account")}> + + {user.firstname} + {user.lastname} + +
+ ) : ( + navigate("/login")}> Login - - )} - + )} +
); } From 57b76be72c5293c78a237b12fa08cfbf1dc33843 Mon Sep 17 00:00:00 2001 From: bbrockbrown Date: Fri, 28 Feb 2025 00:33:34 -0600 Subject: [PATCH 012/157] first iteration of new order form popup --- .history/.prettierrc_20250226154205.js | 18 + .history/.prettierrc_20250226164717.js | 18 + .history/.prettierrc_20250226164741.js | 18 + .history/.prettierrc_20250226165903.js | 18 + .history/.prettierrc_20250226165911.js | 18 + .history/.prettierrc_20250226170025.js | 18 + .history/.prettierrc_20250226170311.js | 18 + .history/package_20250226191527.json | 73 + .history/src/App_20250226153700.jsx | 46 + .history/src/App_20250226153747.jsx | 46 + .history/src/App_20250226153839.jsx | 46 + .history/src/App_20250226154043.jsx | 48 + .history/src/App_20250226154058.jsx | 48 + .history/src/App_20250226154252.jsx | 48 + .history/src/App_20250226154303.jsx | 46 + .history/src/App_20250226155035.css | 176 ++ .history/src/App_20250226155356.css | 176 ++ .history/src/App_20250226155414.css | 176 ++ .history/src/App_20250226155418.css | 176 ++ .history/src/App_20250226155436.css | 176 ++ .history/src/App_20250226155503.css | 175 ++ .history/src/App_20250226155634.css | 18 + .history/src/App_20250226155645.jsx | 46 + .../components/Button_20250226152747.js | 37 + .../components/FormPopup_20250226152728.jsx | 28 + .../components/FormPopup_20250226153114.jsx | 28 + .../components/FormPopup_20250226153232.jsx | 28 + .../components/FormPopup_20250226153235.jsx | 28 + .../components/FormPopup_20250226153300.jsx | 28 + .../components/FormPopup_20250226153620.jsx | 71 + .../components/FormPopup_20250226153635.jsx | 72 + .../components/FormPopup_20250226155659.jsx | 228 ++ .../components/FormPopup_20250226155939.jsx | 230 ++ .../components/FormPopup_20250226160000.jsx | 231 ++ .../components/FormPopup_20250226160002.jsx | 231 ++ .../components/FormPopup_20250226160350.jsx | 188 ++ .../components/FormPopup_20250226173723.jsx | 192 ++ .../components/FormPopup_20250227222951.jsx | 207 ++ .../components/FormPopup_20250227223057.jsx | 208 ++ .../components/FormPopup_20250227223259.jsx | 208 ++ .../components/FormPopup_20250227223652.jsx | 209 ++ .../components/FormPopup_20250227224428.jsx | 196 ++ .../components/FormPopup_20250227232142.jsx | 204 ++ .../components/FormPopup_20250227232255.jsx | 204 ++ .../components/FormPopup_20250227232338.jsx | 204 ++ .../components/FormPopup_20250227232439.jsx | 204 ++ .../components/FormPopup_20250227234152.jsx | 205 ++ .../GoogleButton_20250226152730.jsx | 104 + .../NewOrderForm_20250227224353.jsx | 0 .../NewOrderForm_20250227224458.jsx | 42 + .../NewOrderForm_20250227224956.jsx | 45 + .../NewOrderForm_20250227225143.jsx | 45 + .../NewOrderForm_20250227225328.jsx | 59 + .../NewOrderForm_20250227225348.jsx | 60 + .../NewOrderForm_20250227225414.jsx | 60 + .../NewOrderForm_20250227225516.jsx | 60 + .../NewOrderForm_20250227225529.jsx | 60 + .../NewOrderForm_20250227225613.jsx | 60 + .../NewOrderForm_20250227225635.jsx | 60 + .../NewOrderForm_20250227225709.jsx | 62 + .../NewOrderForm_20250227225721.jsx | 62 + .../NewOrderForm_20250227225740.jsx | 62 + .../NewOrderForm_20250227225812.jsx | 62 + .../NewOrderForm_20250227225821.jsx | 62 + .../NewOrderForm_20250227225841.jsx | 62 + .../NewOrderForm_20250227225926.jsx | 62 + .../NewOrderForm_20250227225955.jsx | 62 + .../NewOrderForm_20250227230210.jsx | 82 + .../NewOrderForm_20250227230227.jsx | 82 + .../NewOrderForm_20250227230244.jsx | 82 + .../NewOrderForm_20250227230408.jsx | 82 + .../NewOrderForm_20250227230530.jsx | 82 + .../NewOrderForm_20250227230539.jsx | 82 + .../NewOrderForm_20250227230540.jsx | 82 + .../NewOrderForm_20250227230559.jsx | 82 + .../NewOrderForm_20250227230614.jsx | 82 + .../NewOrderForm_20250227230746.jsx | 82 + .../NewOrderForm_20250227230855.jsx | 112 + .../NewOrderForm_20250227230910.jsx | 112 + .../NewOrderForm_20250227230930.jsx | 112 + .../NewOrderForm_20250227230952.jsx | 112 + .../NewOrderForm_20250227231035.jsx | 112 + .../NewOrderForm_20250227231138.jsx | 112 + .../NewOrderForm_20250227231210.jsx | 112 + .../NewOrderForm_20250227231922.jsx | 113 + .../NewOrderForm_20250227231941.jsx | 112 + .../NewOrderForm_20250227232212.jsx | 113 + .../NewOrderForm_20250227232455.jsx | 113 + .../NewOrderForm_20250227232631.jsx | 117 + .../NewOrderForm_20250227232700.jsx | 117 + .../NewOrderForm_20250227232739.jsx | 118 + .../NewOrderForm_20250227232819.jsx | 118 + .../NewOrderForm_20250227233033.jsx | 118 + .../NewOrderForm_20250227233134.jsx | 118 + .../NewOrderForm_20250227234734.jsx | 159 ++ .../NewOrderForm_20250227235707.jsx | 159 ++ .../NewOrderForm_20250228000245.jsx | 159 ++ .../NewOrderForm_20250228000447.jsx | 162 ++ .../NewOrderForm_20250228000617.jsx | 159 ++ .../NewOrderForm_20250228000648.jsx | 159 ++ .../NewOrderForm_20250228000710.jsx | 166 ++ .../NewOrderForm_20250228000742.jsx | 166 ++ .../NewOrderForm_20250228000803.jsx | 167 ++ .../NewOrderForm_20250228000902.jsx | 166 ++ .../NewOrderForm_20250228002643.jsx | 167 ++ .../NewOrderForm_20250228002737.jsx | 169 ++ .../NewOrderForm_20250228002802.jsx | 169 ++ .../NewOrderForm_20250228002826.jsx | 169 ++ .../NewOrderForm_20250228002902.jsx | 168 ++ .../NewOrderForm_20250228003054.jsx | 172 ++ .../NewOrderForm_20250228003121.jsx | 171 ++ .../components/OrderTable_20250226191220.jsx | 0 .../components/OrderTable_20250226191321.jsx | 37 + .../components/OrderTable_20250226191425.jsx | 34 + .../components/OrderTable_20250226191741.jsx | 95 + .../components/OrderTable_20250226191900.jsx | 95 + .../components/OrderTable_20250226191910.jsx | 95 + .../components/OrderTable_20250226192245.jsx | 97 + .../components/OrderTable_20250226192313.jsx | 95 + .../components/OrderTable_20250226192511.jsx | 97 + .../components/OrderTable_20250226192529.jsx | 97 + .../components/OrderTable_20250226193514.jsx | 98 + .../components/OrderTable_20250226194119.jsx | 276 +++ .../components/OrderTable_20250226202941.jsx | 276 +++ .../PasswordChangeForm_20250227224350.jsx | 0 .../PasswordChangeForm_20250227224538.jsx | 41 + .../PasswordChangeForm_20250227235222.jsx | 41 + .../PasswordChangeForm_20250227235226.jsx | 41 + .../SomeOtherComponent_20250227224128.jsx | 0 .../SomeOtherComponent_20250227224211.jsx | 37 + .../common/components/Text_20250226152732.js | 13 + .../components/YNPopup_20250226141732.jsx | 29 + .../components/YNPopup_20250226141846.jsx | 30 + .../components/YNPopup_20250226152726.jsx | 30 + .../components/YNPopup_20250226160402.jsx | 28 + .../form/CustomInput_20250227235607.jsx | 0 .../form/CustomInput_20250227235655.jsx | 130 ++ .../form/CustomInput_20250227235836.jsx | 126 ++ .../form/CustomInput_20250228000330.jsx | 127 ++ .../form/CustomInput_20250228003141.jsx | 127 ++ .../components/form/Input_20250227223428.jsx | 90 + .../components/form/styles_20250219202759.js | 49 + .../components/form/styles_20250227234419.js | 49 + .../components/form/styles_20250227234720.js | 54 + .../components/form/styles_20250227234826.js | 49 + .../components/form/styles_20250227234848.js | 50 + .../components/form/styles_20250227235011.js | 50 + .../components/form/styles_20250227235135.js | 49 + .history/src/index_20250226153721.jsx | 13 + .history/src/index_20250226191158.jsx | 20 + .history/src/index_20250226193627.jsx | 20 + .history/src/index_20250226193706.jsx | 20 + .history/src/index_20250226193717.jsx | 18 + .../pages/account/Login_20250219202759.jsx | 98 + .../pages/account/Login_20250226154747.jsx | 100 + .../pages/account/Login_20250226155609.jsx | 98 + .../pages/account/Login_20250226160429.jsx | 100 + .../pages/account/Login_20250226191440.jsx | 100 + .../pages/account/Login_20250226191450.jsx | 102 + .../pages/account/Login_20250226191924.jsx | 102 + .../pages/account/Login_20250226194737.jsx | 100 + .../pages/account/Login_20250226194804.jsx | 98 + .../pages/account/Login_20250227222751.jsx | 98 + .../pages/account/Login_20250227222824.jsx | 100 + .../pages/account/Login_20250227223753.jsx | 99 + .../pages/account/Login_20250227223925.jsx | 99 + .../pages/account/Login_20250227224024.jsx | 99 + .../pages/account/Login_20250227224049.jsx | 99 + .../pages/account/Login_20250227224239.jsx | 100 + .../pages/account/Login_20250227224703.jsx | 100 + .../src/pages/home/Home_20250219202759.jsx | 36 + .../src/pages/home/Home_20250226194908.jsx | 38 + .../src/pages/home/Home_20250226195859.jsx | 38 + .../src/pages/home/Home_20250226195905.jsx | 40 + .prettierrc.js | 32 +- .vscode/settings.json | 7 +- package-lock.json | 1906 ++++++++++++++++- package.json | 8 +- src/App.css | 5 +- src/App.jsx | 58 +- src/common/components/Button.js | 36 +- src/common/components/FormPopup.jsx | 209 +- src/common/components/GoogleButton.jsx | 158 +- src/common/components/NewOrderForm.jsx | 171 ++ src/common/components/OrderTable.jsx | 276 +++ src/common/components/PasswordChangeForm.jsx | 41 + src/common/components/Text.js | 12 +- src/common/components/YNPopup.jsx | 29 +- src/common/components/form/CustomInput.jsx | 127 ++ src/common/components/form/Input.jsx | 106 +- src/index.jsx | 11 +- src/pages/account/Login.jsx | 2 + src/pages/home/Home.jsx | 4 + 193 files changed, 19474 insertions(+), 325 deletions(-) create mode 100644 .history/.prettierrc_20250226154205.js create mode 100644 .history/.prettierrc_20250226164717.js create mode 100644 .history/.prettierrc_20250226164741.js create mode 100644 .history/.prettierrc_20250226165903.js create mode 100644 .history/.prettierrc_20250226165911.js create mode 100644 .history/.prettierrc_20250226170025.js create mode 100644 .history/.prettierrc_20250226170311.js create mode 100644 .history/package_20250226191527.json create mode 100644 .history/src/App_20250226153700.jsx create mode 100644 .history/src/App_20250226153747.jsx create mode 100644 .history/src/App_20250226153839.jsx create mode 100644 .history/src/App_20250226154043.jsx create mode 100644 .history/src/App_20250226154058.jsx create mode 100644 .history/src/App_20250226154252.jsx create mode 100644 .history/src/App_20250226154303.jsx create mode 100644 .history/src/App_20250226155035.css create mode 100644 .history/src/App_20250226155356.css create mode 100644 .history/src/App_20250226155414.css create mode 100644 .history/src/App_20250226155418.css create mode 100644 .history/src/App_20250226155436.css create mode 100644 .history/src/App_20250226155503.css create mode 100644 .history/src/App_20250226155634.css create mode 100644 .history/src/App_20250226155645.jsx create mode 100644 .history/src/common/components/Button_20250226152747.js create mode 100644 .history/src/common/components/FormPopup_20250226152728.jsx create mode 100644 .history/src/common/components/FormPopup_20250226153114.jsx create mode 100644 .history/src/common/components/FormPopup_20250226153232.jsx create mode 100644 .history/src/common/components/FormPopup_20250226153235.jsx create mode 100644 .history/src/common/components/FormPopup_20250226153300.jsx create mode 100644 .history/src/common/components/FormPopup_20250226153620.jsx create mode 100644 .history/src/common/components/FormPopup_20250226153635.jsx create mode 100644 .history/src/common/components/FormPopup_20250226155659.jsx create mode 100644 .history/src/common/components/FormPopup_20250226155939.jsx create mode 100644 .history/src/common/components/FormPopup_20250226160000.jsx create mode 100644 .history/src/common/components/FormPopup_20250226160002.jsx create mode 100644 .history/src/common/components/FormPopup_20250226160350.jsx create mode 100644 .history/src/common/components/FormPopup_20250226173723.jsx create mode 100644 .history/src/common/components/FormPopup_20250227222951.jsx create mode 100644 .history/src/common/components/FormPopup_20250227223057.jsx create mode 100644 .history/src/common/components/FormPopup_20250227223259.jsx create mode 100644 .history/src/common/components/FormPopup_20250227223652.jsx create mode 100644 .history/src/common/components/FormPopup_20250227224428.jsx create mode 100644 .history/src/common/components/FormPopup_20250227232142.jsx create mode 100644 .history/src/common/components/FormPopup_20250227232255.jsx create mode 100644 .history/src/common/components/FormPopup_20250227232338.jsx create mode 100644 .history/src/common/components/FormPopup_20250227232439.jsx create mode 100644 .history/src/common/components/FormPopup_20250227234152.jsx create mode 100644 .history/src/common/components/GoogleButton_20250226152730.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227224353.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227224458.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227224956.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225143.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225328.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225348.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225414.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225516.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225529.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225613.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225635.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225709.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225721.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225740.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225812.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225821.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225841.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225926.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227225955.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227230210.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227230227.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227230244.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227230408.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227230530.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227230539.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227230540.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227230559.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227230614.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227230746.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227230855.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227230910.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227230930.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227230952.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227231035.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227231138.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227231210.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227231922.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227231941.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227232212.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227232455.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227232631.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227232700.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227232739.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227232819.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227233033.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227233134.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227234734.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250227235707.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228000245.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228000447.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228000617.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228000648.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228000710.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228000742.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228000803.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228000902.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228002643.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228002737.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228002802.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228002826.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228002902.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228003054.jsx create mode 100644 .history/src/common/components/NewOrderForm_20250228003121.jsx create mode 100644 .history/src/common/components/OrderTable_20250226191220.jsx create mode 100644 .history/src/common/components/OrderTable_20250226191321.jsx create mode 100644 .history/src/common/components/OrderTable_20250226191425.jsx create mode 100644 .history/src/common/components/OrderTable_20250226191741.jsx create mode 100644 .history/src/common/components/OrderTable_20250226191900.jsx create mode 100644 .history/src/common/components/OrderTable_20250226191910.jsx create mode 100644 .history/src/common/components/OrderTable_20250226192245.jsx create mode 100644 .history/src/common/components/OrderTable_20250226192313.jsx create mode 100644 .history/src/common/components/OrderTable_20250226192511.jsx create mode 100644 .history/src/common/components/OrderTable_20250226192529.jsx create mode 100644 .history/src/common/components/OrderTable_20250226193514.jsx create mode 100644 .history/src/common/components/OrderTable_20250226194119.jsx create mode 100644 .history/src/common/components/OrderTable_20250226202941.jsx create mode 100644 .history/src/common/components/PasswordChangeForm_20250227224350.jsx create mode 100644 .history/src/common/components/PasswordChangeForm_20250227224538.jsx create mode 100644 .history/src/common/components/PasswordChangeForm_20250227235222.jsx create mode 100644 .history/src/common/components/PasswordChangeForm_20250227235226.jsx create mode 100644 .history/src/common/components/SomeOtherComponent_20250227224128.jsx create mode 100644 .history/src/common/components/SomeOtherComponent_20250227224211.jsx create mode 100644 .history/src/common/components/Text_20250226152732.js create mode 100644 .history/src/common/components/YNPopup_20250226141732.jsx create mode 100644 .history/src/common/components/YNPopup_20250226141846.jsx create mode 100644 .history/src/common/components/YNPopup_20250226152726.jsx create mode 100644 .history/src/common/components/YNPopup_20250226160402.jsx create mode 100644 .history/src/common/components/form/CustomInput_20250227235607.jsx create mode 100644 .history/src/common/components/form/CustomInput_20250227235655.jsx create mode 100644 .history/src/common/components/form/CustomInput_20250227235836.jsx create mode 100644 .history/src/common/components/form/CustomInput_20250228000330.jsx create mode 100644 .history/src/common/components/form/CustomInput_20250228003141.jsx create mode 100644 .history/src/common/components/form/Input_20250227223428.jsx create mode 100644 .history/src/common/components/form/styles_20250219202759.js create mode 100644 .history/src/common/components/form/styles_20250227234419.js create mode 100644 .history/src/common/components/form/styles_20250227234720.js create mode 100644 .history/src/common/components/form/styles_20250227234826.js create mode 100644 .history/src/common/components/form/styles_20250227234848.js create mode 100644 .history/src/common/components/form/styles_20250227235011.js create mode 100644 .history/src/common/components/form/styles_20250227235135.js create mode 100644 .history/src/index_20250226153721.jsx create mode 100644 .history/src/index_20250226191158.jsx create mode 100644 .history/src/index_20250226193627.jsx create mode 100644 .history/src/index_20250226193706.jsx create mode 100644 .history/src/index_20250226193717.jsx create mode 100644 .history/src/pages/account/Login_20250219202759.jsx create mode 100644 .history/src/pages/account/Login_20250226154747.jsx create mode 100644 .history/src/pages/account/Login_20250226155609.jsx create mode 100644 .history/src/pages/account/Login_20250226160429.jsx create mode 100644 .history/src/pages/account/Login_20250226191440.jsx create mode 100644 .history/src/pages/account/Login_20250226191450.jsx create mode 100644 .history/src/pages/account/Login_20250226191924.jsx create mode 100644 .history/src/pages/account/Login_20250226194737.jsx create mode 100644 .history/src/pages/account/Login_20250226194804.jsx create mode 100644 .history/src/pages/account/Login_20250227222751.jsx create mode 100644 .history/src/pages/account/Login_20250227222824.jsx create mode 100644 .history/src/pages/account/Login_20250227223753.jsx create mode 100644 .history/src/pages/account/Login_20250227223925.jsx create mode 100644 .history/src/pages/account/Login_20250227224024.jsx create mode 100644 .history/src/pages/account/Login_20250227224049.jsx create mode 100644 .history/src/pages/account/Login_20250227224239.jsx create mode 100644 .history/src/pages/account/Login_20250227224703.jsx create mode 100644 .history/src/pages/home/Home_20250219202759.jsx create mode 100644 .history/src/pages/home/Home_20250226194908.jsx create mode 100644 .history/src/pages/home/Home_20250226195859.jsx create mode 100644 .history/src/pages/home/Home_20250226195905.jsx create mode 100644 src/common/components/NewOrderForm.jsx create mode 100644 src/common/components/OrderTable.jsx create mode 100644 src/common/components/PasswordChangeForm.jsx create mode 100644 src/common/components/form/CustomInput.jsx diff --git a/.history/.prettierrc_20250226154205.js b/.history/.prettierrc_20250226154205.js new file mode 100644 index 00000000..ce8623ca --- /dev/null +++ b/.history/.prettierrc_20250226154205.js @@ -0,0 +1,18 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 2, + semi: true, + singleQuote: true, + printWidth: 80, + jsxSingleQuote: true, + proseWrap: 'always', + plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], + importOrder: [ + '^react$', + '', + '^(common|pages)/(.*)$', + '^[./]', + ], + importOrderSeparation: true, + importOrderSortSpecifiers: true, +}; diff --git a/.history/.prettierrc_20250226164717.js b/.history/.prettierrc_20250226164717.js new file mode 100644 index 00000000..24673dbb --- /dev/null +++ b/.history/.prettierrc_20250226164717.js @@ -0,0 +1,18 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 4, + semi: true, + singleQuote: true, + printWidth: 80, + jsxSingleQuote: true, + proseWrap: 'always', + plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], + importOrder: [ + '^react$', + '', + '^(common|pages)/(.*)$', + '^[./]', + ], + importOrderSeparation: true, + importOrderSortSpecifiers: true, +}; diff --git a/.history/.prettierrc_20250226164741.js b/.history/.prettierrc_20250226164741.js new file mode 100644 index 00000000..ce8623ca --- /dev/null +++ b/.history/.prettierrc_20250226164741.js @@ -0,0 +1,18 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 2, + semi: true, + singleQuote: true, + printWidth: 80, + jsxSingleQuote: true, + proseWrap: 'always', + plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], + importOrder: [ + '^react$', + '', + '^(common|pages)/(.*)$', + '^[./]', + ], + importOrderSeparation: true, + importOrderSortSpecifiers: true, +}; diff --git a/.history/.prettierrc_20250226165903.js b/.history/.prettierrc_20250226165903.js new file mode 100644 index 00000000..24673dbb --- /dev/null +++ b/.history/.prettierrc_20250226165903.js @@ -0,0 +1,18 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 4, + semi: true, + singleQuote: true, + printWidth: 80, + jsxSingleQuote: true, + proseWrap: 'always', + plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], + importOrder: [ + '^react$', + '', + '^(common|pages)/(.*)$', + '^[./]', + ], + importOrderSeparation: true, + importOrderSortSpecifiers: true, +}; diff --git a/.history/.prettierrc_20250226165911.js b/.history/.prettierrc_20250226165911.js new file mode 100644 index 00000000..ce8623ca --- /dev/null +++ b/.history/.prettierrc_20250226165911.js @@ -0,0 +1,18 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 2, + semi: true, + singleQuote: true, + printWidth: 80, + jsxSingleQuote: true, + proseWrap: 'always', + plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], + importOrder: [ + '^react$', + '', + '^(common|pages)/(.*)$', + '^[./]', + ], + importOrderSeparation: true, + importOrderSortSpecifiers: true, +}; diff --git a/.history/.prettierrc_20250226170025.js b/.history/.prettierrc_20250226170025.js new file mode 100644 index 00000000..24673dbb --- /dev/null +++ b/.history/.prettierrc_20250226170025.js @@ -0,0 +1,18 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 4, + semi: true, + singleQuote: true, + printWidth: 80, + jsxSingleQuote: true, + proseWrap: 'always', + plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], + importOrder: [ + '^react$', + '', + '^(common|pages)/(.*)$', + '^[./]', + ], + importOrderSeparation: true, + importOrderSortSpecifiers: true, +}; diff --git a/.history/.prettierrc_20250226170311.js b/.history/.prettierrc_20250226170311.js new file mode 100644 index 00000000..ce8623ca --- /dev/null +++ b/.history/.prettierrc_20250226170311.js @@ -0,0 +1,18 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 2, + semi: true, + singleQuote: true, + printWidth: 80, + jsxSingleQuote: true, + proseWrap: 'always', + plugins: [require.resolve('@trivago/prettier-plugin-sort-imports')], + importOrder: [ + '^react$', + '', + '^(common|pages)/(.*)$', + '^[./]', + ], + importOrderSeparation: true, + importOrderSortSpecifiers: true, +}; diff --git a/.history/package_20250226191527.json b/.history/package_20250226191527.json new file mode 100644 index 00000000..6a7da040 --- /dev/null +++ b/.history/package_20250226191527.json @@ -0,0 +1,73 @@ +{ + "name": "frontend", + "version": "0.1.0", + "private": true, + "dependencies": { + "@radix-ui/colors": "^3.0.0", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-icons": "^1.3.2", + "@tailwindcss/cli": "^4.0.9", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cra-template": "1.2.0", + "lucide-react": "^0.476.0", + "primeicons": "^7.0.0", + "primereact": "^10.9.2", + "prop-types": "^15.8.1", + "radix-ui": "^1.1.3", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.0.2", + "react-scripts": "5.0.1", + "styled-components": "^6.1.13", + "tailwind-merge": "^3.0.2", + "tailwindcss-animate": "^1.0.7", + "web-vitals": "^4.2.4" + }, + "scripts": { + "start": "PORT=3001 react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "format": "prettier --write \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", + "format:check": "prettier --check \"src/**/*.{js,jsx,mjs,cjs,json,css,scss,md}\"", + "check-imports": "prettier --check --plugin @trivago/prettier-plugin-sort-imports \"src/**/*.{js,jsx,mjs,cjs}\"" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@eslint/js": "^9.16.0", + "@trivago/prettier-plugin-sort-imports": "^5.2.0", + "autoprefixer": "^10.4.20", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-no-relative-import-paths": "^1.5.5", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.37.2", + "globals": "^15.13.0", + "postcss": "^8.5.3", + "prettier": "^3.4.2", + "prettier-eslint": "^16.3.0", + "tailwindcss": "^4.0.9" + } +} diff --git a/.history/src/App_20250226153700.jsx b/.history/src/App_20250226153700.jsx new file mode 100644 index 00000000..9a6e3eff --- /dev/null +++ b/.history/src/App_20250226153700.jsx @@ -0,0 +1,46 @@ +import React from 'react'; + +import { BrowserRouter, Route, Routes } from 'react-router-dom'; + +import { + PrivateRoute, + PublicOnlyRoute, +} from 'common/components/routes/ProtectedRoutes'; +import { UserProvider } from 'common/contexts/UserContext'; +import NavLayout from 'common/layouts/NavLayout'; +import AuthCallback from 'pages/account/AuthCallback'; +import Login from 'pages/account/Login'; +import RequestPasswordReset from 'pages/account/RequestPasswordReset'; +import ResetPassword from 'pages/account/ResetPassword'; +import SignUp from 'pages/account/SignUp'; +import Home from 'pages/home/Home'; +import NotFound from 'pages/not-found/NotFound'; + +import './App.css'; + +export default function App() { + return ( + + + + }> + }> + } /> + + }> + } /> + } /> + } + /> + + } /> + } /> + } /> + + + + + ); +} diff --git a/.history/src/App_20250226153747.jsx b/.history/src/App_20250226153747.jsx new file mode 100644 index 00000000..9a6e3eff --- /dev/null +++ b/.history/src/App_20250226153747.jsx @@ -0,0 +1,46 @@ +import React from 'react'; + +import { BrowserRouter, Route, Routes } from 'react-router-dom'; + +import { + PrivateRoute, + PublicOnlyRoute, +} from 'common/components/routes/ProtectedRoutes'; +import { UserProvider } from 'common/contexts/UserContext'; +import NavLayout from 'common/layouts/NavLayout'; +import AuthCallback from 'pages/account/AuthCallback'; +import Login from 'pages/account/Login'; +import RequestPasswordReset from 'pages/account/RequestPasswordReset'; +import ResetPassword from 'pages/account/ResetPassword'; +import SignUp from 'pages/account/SignUp'; +import Home from 'pages/home/Home'; +import NotFound from 'pages/not-found/NotFound'; + +import './App.css'; + +export default function App() { + return ( + + + + }> + }> + } /> + + }> + } /> + } /> + } + /> + + } /> + } /> + } /> + + + + + ); +} diff --git a/.history/src/App_20250226153839.jsx b/.history/src/App_20250226153839.jsx new file mode 100644 index 00000000..9a6e3eff --- /dev/null +++ b/.history/src/App_20250226153839.jsx @@ -0,0 +1,46 @@ +import React from 'react'; + +import { BrowserRouter, Route, Routes } from 'react-router-dom'; + +import { + PrivateRoute, + PublicOnlyRoute, +} from 'common/components/routes/ProtectedRoutes'; +import { UserProvider } from 'common/contexts/UserContext'; +import NavLayout from 'common/layouts/NavLayout'; +import AuthCallback from 'pages/account/AuthCallback'; +import Login from 'pages/account/Login'; +import RequestPasswordReset from 'pages/account/RequestPasswordReset'; +import ResetPassword from 'pages/account/ResetPassword'; +import SignUp from 'pages/account/SignUp'; +import Home from 'pages/home/Home'; +import NotFound from 'pages/not-found/NotFound'; + +import './App.css'; + +export default function App() { + return ( + + + + }> + }> + } /> + + }> + } /> + } /> + } + /> + + } /> + } /> + } /> + + + + + ); +} diff --git a/.history/src/App_20250226154043.jsx b/.history/src/App_20250226154043.jsx new file mode 100644 index 00000000..697863b4 --- /dev/null +++ b/.history/src/App_20250226154043.jsx @@ -0,0 +1,48 @@ +import React from 'react'; + +import { BrowserRouter, Route, Routes } from 'react-router-dom'; + +import DialogDemo from 'common/components/FormPopup'; +import { + PrivateRoute, + PublicOnlyRoute, +} from 'common/components/routes/ProtectedRoutes'; +import { UserProvider } from 'common/contexts/UserContext'; +import NavLayout from 'common/layouts/NavLayout'; +import AuthCallback from 'pages/account/AuthCallback'; +import Login from 'pages/account/Login'; +import RequestPasswordReset from 'pages/account/RequestPasswordReset'; +import ResetPassword from 'pages/account/ResetPassword'; +import SignUp from 'pages/account/SignUp'; +import Home from 'pages/home/Home'; +import NotFound from 'pages/not-found/NotFound'; + +import './App.css'; + +export default function App() { + return ( + + + + }> + }> + } /> + + }> + } /> + } /> + + } + /> + + } /> + } /> + } /> + + + + + ); +} diff --git a/.history/src/App_20250226154058.jsx b/.history/src/App_20250226154058.jsx new file mode 100644 index 00000000..697863b4 --- /dev/null +++ b/.history/src/App_20250226154058.jsx @@ -0,0 +1,48 @@ +import React from 'react'; + +import { BrowserRouter, Route, Routes } from 'react-router-dom'; + +import DialogDemo from 'common/components/FormPopup'; +import { + PrivateRoute, + PublicOnlyRoute, +} from 'common/components/routes/ProtectedRoutes'; +import { UserProvider } from 'common/contexts/UserContext'; +import NavLayout from 'common/layouts/NavLayout'; +import AuthCallback from 'pages/account/AuthCallback'; +import Login from 'pages/account/Login'; +import RequestPasswordReset from 'pages/account/RequestPasswordReset'; +import ResetPassword from 'pages/account/ResetPassword'; +import SignUp from 'pages/account/SignUp'; +import Home from 'pages/home/Home'; +import NotFound from 'pages/not-found/NotFound'; + +import './App.css'; + +export default function App() { + return ( + + + + }> + }> + } /> + + }> + } /> + } /> + + } + /> + + } /> + } /> + } /> + + + + + ); +} diff --git a/.history/src/App_20250226154252.jsx b/.history/src/App_20250226154252.jsx new file mode 100644 index 00000000..88076686 --- /dev/null +++ b/.history/src/App_20250226154252.jsx @@ -0,0 +1,48 @@ +import React from 'react'; + +import { BrowserRouter, Route, Routes } from 'react-router-dom'; + +import DialogDemo from 'common/components/FormPopup'; +import { + PrivateRoute, + PublicOnlyRoute, +} from 'common/components/routes/ProtectedRoutes'; +import { UserProvider } from 'common/contexts/UserContext'; +import NavLayout from 'common/layouts/NavLayout'; +import AuthCallback from 'pages/account/AuthCallback'; +import Login from 'pages/account/Login'; +import RequestPasswordReset from 'pages/account/RequestPasswordReset'; +import ResetPassword from 'pages/account/ResetPassword'; +import SignUp from 'pages/account/SignUp'; +import Home from 'pages/home/Home'; +import NotFound from 'pages/not-found/NotFound'; + +import './App.css'; + +export default function App() { + return ( + + + + }> + }> + } /> + + }> + } /> + } /> + } + /> + + } /> + } /> + } /> + + + + + + ); +} diff --git a/.history/src/App_20250226154303.jsx b/.history/src/App_20250226154303.jsx new file mode 100644 index 00000000..9a6e3eff --- /dev/null +++ b/.history/src/App_20250226154303.jsx @@ -0,0 +1,46 @@ +import React from 'react'; + +import { BrowserRouter, Route, Routes } from 'react-router-dom'; + +import { + PrivateRoute, + PublicOnlyRoute, +} from 'common/components/routes/ProtectedRoutes'; +import { UserProvider } from 'common/contexts/UserContext'; +import NavLayout from 'common/layouts/NavLayout'; +import AuthCallback from 'pages/account/AuthCallback'; +import Login from 'pages/account/Login'; +import RequestPasswordReset from 'pages/account/RequestPasswordReset'; +import ResetPassword from 'pages/account/ResetPassword'; +import SignUp from 'pages/account/SignUp'; +import Home from 'pages/home/Home'; +import NotFound from 'pages/not-found/NotFound'; + +import './App.css'; + +export default function App() { + return ( + + + + }> + }> + } /> + + }> + } /> + } /> + } + /> + + } /> + } /> + } /> + + + + + ); +} diff --git a/.history/src/App_20250226155035.css b/.history/src/App_20250226155035.css new file mode 100644 index 00000000..7f744a42 --- /dev/null +++ b/.history/src/App_20250226155035.css @@ -0,0 +1,176 @@ +/* global color presets */ +@import "tailwindcss"; +@import "@radix-ui/colors/black-alpha.css"; +@import "@radix-ui/colors/green.css"; +@import "@radix-ui/colors/mauve.css"; +@import "@radix-ui/colors/violet.css"; + +:root { + --primary-green: #45bf84; + --secondary-lightgrey: #f3f3f3; + --darkgrey: #747474; + --white: #fff; + --text: #191a23; +} + +* { + font-family: Verdana, sans-serif; + color: var(--text); +} + +/* reset */ +button, +fieldset, +input { + all: unset; +} + +.DialogOverlay { + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +} + +.DialogContent { + background-color: var(--gray-1); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +} +.DialogContent:focus { + outline: none; +} + +.DialogTitle { + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +} + +.DialogDescription { + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +} + +.Button { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; +} +.Button:focus:not(:focus-visible) { + outline: 0; +} +.Button:focus-visible { + outline: 2px solid var(--violet-6); + outline-offset: 1px; +} +.Button.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); +} +.Button.violet:hover { + background-color: var(--mauve-3); +} +.Button.green { + background-color: var(--green-4); + color: var(--green-11); + outline-color: var(--green-7); +} +.Button.green:hover { + background-color: var(--green-5); +} + +.IconButton { + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); +} +.IconButton:hover { + background-color: var(--violet-4); +} +.IconButton:focus { + box-shadow: 0 0 0 2px var(--violet-7); +} + +.Fieldset { + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +} + +.Label { + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +} + +.Input { + width: 100%; + flex: 1; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; +} +.Input:focus { + box-shadow: 0 0 0 2px var(--violet-8); +} + +@keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } +} + diff --git a/.history/src/App_20250226155356.css b/.history/src/App_20250226155356.css new file mode 100644 index 00000000..7ee095d9 --- /dev/null +++ b/.history/src/App_20250226155356.css @@ -0,0 +1,176 @@ +/* global color presets */ +@import "tailwindcss"; +@import "@radix-ui/colors/black-alpha.css"; +@import "@radix-ui/colors/green.css"; +@import "@radix-ui/colors/mauve.css"; +@import "@radix-ui/colors/violet.css"; + +:root { + --primary-green: #45bf84; + --secondary-lightgrey: #f3f3f3; + --darkgrey: #747474; + --white: #fff; + --text: #191a23; +} + +* { + font-family: Verdana, sans-serif; + color: var(--text); +} + +/* reset */ +button, +fieldset, +input { + all: unset; +} + +.DialogOverlay { + background-color: var(--darkgrey); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +} + +.DialogContent { + background-color: var(--gray-1); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +} +.DialogContent:focus { + outline: none; +} + +.DialogTitle { + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +} + +.DialogDescription { + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +} + +.Button { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; +} +.Button:focus:not(:focus-visible) { + outline: 0; +} +.Button:focus-visible { + outline: 2px solid var(--violet-6); + outline-offset: 1px; +} +.Button.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); +} +.Button.violet:hover { + background-color: var(--mauve-3); +} +.Button.green { + background-color: var(--green-4); + color: var(--green-11); + outline-color: var(--green-7); +} +.Button.green:hover { + background-color: var(--green-5); +} + +.IconButton { + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); +} +.IconButton:hover { + background-color: var(--violet-4); +} +.IconButton:focus { + box-shadow: 0 0 0 2px var(--violet-7); +} + +.Fieldset { + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +} + +.Label { + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +} + +.Input { + width: 100%; + flex: 1; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; +} +.Input:focus { + box-shadow: 0 0 0 2px var(--violet-8); +} + +@keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } +} + diff --git a/.history/src/App_20250226155414.css b/.history/src/App_20250226155414.css new file mode 100644 index 00000000..7f744a42 --- /dev/null +++ b/.history/src/App_20250226155414.css @@ -0,0 +1,176 @@ +/* global color presets */ +@import "tailwindcss"; +@import "@radix-ui/colors/black-alpha.css"; +@import "@radix-ui/colors/green.css"; +@import "@radix-ui/colors/mauve.css"; +@import "@radix-ui/colors/violet.css"; + +:root { + --primary-green: #45bf84; + --secondary-lightgrey: #f3f3f3; + --darkgrey: #747474; + --white: #fff; + --text: #191a23; +} + +* { + font-family: Verdana, sans-serif; + color: var(--text); +} + +/* reset */ +button, +fieldset, +input { + all: unset; +} + +.DialogOverlay { + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +} + +.DialogContent { + background-color: var(--gray-1); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +} +.DialogContent:focus { + outline: none; +} + +.DialogTitle { + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +} + +.DialogDescription { + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +} + +.Button { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; +} +.Button:focus:not(:focus-visible) { + outline: 0; +} +.Button:focus-visible { + outline: 2px solid var(--violet-6); + outline-offset: 1px; +} +.Button.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); +} +.Button.violet:hover { + background-color: var(--mauve-3); +} +.Button.green { + background-color: var(--green-4); + color: var(--green-11); + outline-color: var(--green-7); +} +.Button.green:hover { + background-color: var(--green-5); +} + +.IconButton { + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); +} +.IconButton:hover { + background-color: var(--violet-4); +} +.IconButton:focus { + box-shadow: 0 0 0 2px var(--violet-7); +} + +.Fieldset { + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +} + +.Label { + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +} + +.Input { + width: 100%; + flex: 1; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; +} +.Input:focus { + box-shadow: 0 0 0 2px var(--violet-8); +} + +@keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } +} + diff --git a/.history/src/App_20250226155418.css b/.history/src/App_20250226155418.css new file mode 100644 index 00000000..3803ee74 --- /dev/null +++ b/.history/src/App_20250226155418.css @@ -0,0 +1,176 @@ +/* global color presets */ +@import "tailwindcss"; +@import "@radix-ui/colors/black-alpha.css"; +@import "@radix-ui/colors/green.css"; +@import "@radix-ui/colors/mauve.css"; +@import "@radix-ui/colors/violet.css"; + +:root { + --primary-green: #45bf84; + --secondary-lightgrey: #f3f3f3; + --darkgrey: #747474; + --white: #fff; + --text: #191a23; +} + +* { + font-family: Verdana, sans-serif; + color: var(--text); +} + +/* reset */ +button, +fieldset, +input { + all: unset; +} + +.DialogOverlay { + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +} + +.DialogContent { + background-color: var(--darkgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +} +.DialogContent:focus { + outline: none; +} + +.DialogTitle { + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +} + +.DialogDescription { + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +} + +.Button { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; +} +.Button:focus:not(:focus-visible) { + outline: 0; +} +.Button:focus-visible { + outline: 2px solid var(--violet-6); + outline-offset: 1px; +} +.Button.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); +} +.Button.violet:hover { + background-color: var(--mauve-3); +} +.Button.green { + background-color: var(--green-4); + color: var(--green-11); + outline-color: var(--green-7); +} +.Button.green:hover { + background-color: var(--green-5); +} + +.IconButton { + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); +} +.IconButton:hover { + background-color: var(--violet-4); +} +.IconButton:focus { + box-shadow: 0 0 0 2px var(--violet-7); +} + +.Fieldset { + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +} + +.Label { + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +} + +.Input { + width: 100%; + flex: 1; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; +} +.Input:focus { + box-shadow: 0 0 0 2px var(--violet-8); +} + +@keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } +} + diff --git a/.history/src/App_20250226155436.css b/.history/src/App_20250226155436.css new file mode 100644 index 00000000..51952e84 --- /dev/null +++ b/.history/src/App_20250226155436.css @@ -0,0 +1,176 @@ +/* global color presets */ +@import "tailwindcss"; +@import "@radix-ui/colors/black-alpha.css"; +@import "@radix-ui/colors/green.css"; +@import "@radix-ui/colors/mauve.css"; +@import "@radix-ui/colors/violet.css"; + +:root { + --primary-green: #45bf84; + --secondary-lightgrey: #f3f3f3; + --darkgrey: #747474; + --white: #fff; + --text: #191a23; +} + +* { + font-family: Verdana, sans-serif; + color: var(--text); +} + +/* reset */ +button, +fieldset, +input { + all: unset; +} + +.DialogOverlay { + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +} + +.DialogContent { + background-color: var(--secondary-lightgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +} +.DialogContent:focus { + outline: none; +} + +.DialogTitle { + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +} + +.DialogDescription { + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +} + +.Button { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; +} +.Button:focus:not(:focus-visible) { + outline: 0; +} +.Button:focus-visible { + outline: 2px solid var(--violet-6); + outline-offset: 1px; +} +.Button.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); +} +.Button.violet:hover { + background-color: var(--mauve-3); +} +.Button.green { + background-color: var(--green-4); + color: var(--green-11); + outline-color: var(--green-7); +} +.Button.green:hover { + background-color: var(--green-5); +} + +.IconButton { + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); +} +.IconButton:hover { + background-color: var(--violet-4); +} +.IconButton:focus { + box-shadow: 0 0 0 2px var(--violet-7); +} + +.Fieldset { + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +} + +.Label { + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +} + +.Input { + width: 100%; + flex: 1; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; +} +.Input:focus { + box-shadow: 0 0 0 2px var(--violet-8); +} + +@keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } +} + diff --git a/.history/src/App_20250226155503.css b/.history/src/App_20250226155503.css new file mode 100644 index 00000000..84384f1b --- /dev/null +++ b/.history/src/App_20250226155503.css @@ -0,0 +1,175 @@ +/* global color presets */ +@import "@radix-ui/colors/black-alpha.css"; +@import "@radix-ui/colors/green.css"; +@import "@radix-ui/colors/mauve.css"; +@import "@radix-ui/colors/violet.css"; + +:root { + --primary-green: #45bf84; + --secondary-lightgrey: #f3f3f3; + --darkgrey: #747474; + --white: #fff; + --text: #191a23; +} + +* { + font-family: Verdana, sans-serif; + color: var(--text); +} + +/* reset */ +button, +fieldset, +input { + all: unset; +} + +.DialogOverlay { + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +} + +.DialogContent { + background-color: var(--secondary-lightgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +} +.DialogContent:focus { + outline: none; +} + +.DialogTitle { + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +} + +.DialogDescription { + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +} + +.Button { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; +} +.Button:focus:not(:focus-visible) { + outline: 0; +} +.Button:focus-visible { + outline: 2px solid var(--violet-6); + outline-offset: 1px; +} +.Button.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); +} +.Button.violet:hover { + background-color: var(--mauve-3); +} +.Button.green { + background-color: var(--green-4); + color: var(--green-11); + outline-color: var(--green-7); +} +.Button.green:hover { + background-color: var(--green-5); +} + +.IconButton { + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); +} +.IconButton:hover { + background-color: var(--violet-4); +} +.IconButton:focus { + box-shadow: 0 0 0 2px var(--violet-7); +} + +.Fieldset { + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +} + +.Label { + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +} + +.Input { + width: 100%; + flex: 1; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; +} +.Input:focus { + box-shadow: 0 0 0 2px var(--violet-8); +} + +@keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } +} + diff --git a/.history/src/App_20250226155634.css b/.history/src/App_20250226155634.css new file mode 100644 index 00000000..3645395f --- /dev/null +++ b/.history/src/App_20250226155634.css @@ -0,0 +1,18 @@ +/* global color presets */ +@import "@radix-ui/colors/black-alpha.css"; +@import "@radix-ui/colors/green.css"; +@import "@radix-ui/colors/mauve.css"; +@import "@radix-ui/colors/violet.css"; + +:root { + --primary-green: #45bf84; + --secondary-lightgrey: #f3f3f3; + --darkgrey: #747474; + --white: #fff; + --text: #191a23; +} + +* { + font-family: Verdana, sans-serif; + color: var(--text); +} diff --git a/.history/src/App_20250226155645.jsx b/.history/src/App_20250226155645.jsx new file mode 100644 index 00000000..9a6e3eff --- /dev/null +++ b/.history/src/App_20250226155645.jsx @@ -0,0 +1,46 @@ +import React from 'react'; + +import { BrowserRouter, Route, Routes } from 'react-router-dom'; + +import { + PrivateRoute, + PublicOnlyRoute, +} from 'common/components/routes/ProtectedRoutes'; +import { UserProvider } from 'common/contexts/UserContext'; +import NavLayout from 'common/layouts/NavLayout'; +import AuthCallback from 'pages/account/AuthCallback'; +import Login from 'pages/account/Login'; +import RequestPasswordReset from 'pages/account/RequestPasswordReset'; +import ResetPassword from 'pages/account/ResetPassword'; +import SignUp from 'pages/account/SignUp'; +import Home from 'pages/home/Home'; +import NotFound from 'pages/not-found/NotFound'; + +import './App.css'; + +export default function App() { + return ( + + + + }> + }> + } /> + + }> + } /> + } /> + } + /> + + } /> + } /> + } /> + + + + + ); +} diff --git a/.history/src/common/components/Button_20250226152747.js b/.history/src/common/components/Button_20250226152747.js new file mode 100644 index 00000000..a14a6bbf --- /dev/null +++ b/.history/src/common/components/Button_20250226152747.js @@ -0,0 +1,37 @@ +import styled from 'styled-components'; + +const ButtonBase = styled.button` + font-size: 0.8em; + padding: 8px 20px; + border-radius: 5px; + border: solid 1px var(--text); + color: var(--text); + cursor: pointer; +`; + +const ButtonPrimary = styled(ButtonBase)` + background-color: var(--primary-green); + border-color: var(--primary-green); + color: var(--white); +`; + +const ButtonSecondary = styled(ButtonBase)` + background-color: var(--secondary-lightgrey); + border-color: var(--text); +`; + +const ButtonTransparent = styled(ButtonBase)` + background-color: transparent; +`; + +const ButtonInvisible = styled(ButtonBase)` + background-color: transparent; + border-color: transparent; +`; + +export const Button = { + Primary: ButtonPrimary, + Secondary: ButtonSecondary, + Transparent: ButtonTransparent, + Invisible: ButtonInvisible, +}; diff --git a/.history/src/common/components/FormPopup_20250226152728.jsx b/.history/src/common/components/FormPopup_20250226152728.jsx new file mode 100644 index 00000000..27f4a5d6 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226152728.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function FormPopup() { + return ( +
+

FormPopup

+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/.history/src/common/components/FormPopup_20250226153114.jsx b/.history/src/common/components/FormPopup_20250226153114.jsx new file mode 100644 index 00000000..27f4a5d6 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226153114.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function FormPopup() { + return ( +
+

FormPopup

+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/.history/src/common/components/FormPopup_20250226153232.jsx b/.history/src/common/components/FormPopup_20250226153232.jsx new file mode 100644 index 00000000..27f4a5d6 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226153232.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function FormPopup() { + return ( +
+

FormPopup

+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/.history/src/common/components/FormPopup_20250226153235.jsx b/.history/src/common/components/FormPopup_20250226153235.jsx new file mode 100644 index 00000000..27f4a5d6 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226153235.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function FormPopup() { + return ( +
+

FormPopup

+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/.history/src/common/components/FormPopup_20250226153300.jsx b/.history/src/common/components/FormPopup_20250226153300.jsx new file mode 100644 index 00000000..27f4a5d6 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226153300.jsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; + +// import styled from 'styled-components'; + +export default function FormPopup() { + return ( +
+

FormPopup

+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/.history/src/common/components/FormPopup_20250226153620.jsx b/.history/src/common/components/FormPopup_20250226153620.jsx new file mode 100644 index 00000000..bc65d197 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226153620.jsx @@ -0,0 +1,71 @@ +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +// import styled from 'styled-components'; +import { Dialog } from 'radix-ui'; + +const DialogDemo = () => ( + + + + + + + + Edit profile + + Make changes to your profile here. Click save when you're done. + +
+ + +
+
+ + +
+
+ + + +
+ + + +
+
+
+); + +export default DialogDemo; + +// export default function FormPopup() { +// return ( +//
+//

FormPopup

+//
+// ); +// } + +// FormPopup.propTypes = { +// promptText: PropTypes.string, +// placeholderText: PropTypes.string, +// submitButtonText: PropTypes.string, +// cancelButtonText: PropTypes.string, +// onSubmit: PropTypes.func, +// }; + +// FormPopup.defaultProps = { +// promptText: 'Prompt', +// placeholderText: 'Enter text here', +// submitButtonText: 'Submit', +// cancelButtonText: 'Cancel', +// }; diff --git a/.history/src/common/components/FormPopup_20250226153635.jsx b/.history/src/common/components/FormPopup_20250226153635.jsx new file mode 100644 index 00000000..4df18495 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226153635.jsx @@ -0,0 +1,72 @@ +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +//import PropTypes from 'prop-types'; +// import styled from 'styled-components'; +import { Dialog } from 'radix-ui'; + +const DialogDemo = () => ( + + + + + + + + Edit profile + + Make changes to your profile here. Click save when you're done. + +
+ + +
+
+ + +
+
+ + + +
+ + + +
+
+
+); + +export default DialogDemo; + +// export default function FormPopup() { +// return ( +//
+//

FormPopup

+//
+// ); +// } + +// FormPopup.propTypes = { +// promptText: PropTypes.string, +// placeholderText: PropTypes.string, +// submitButtonText: PropTypes.string, +// cancelButtonText: PropTypes.string, +// onSubmit: PropTypes.func, +// }; + +// FormPopup.defaultProps = { +// promptText: 'Prompt', +// placeholderText: 'Enter text here', +// submitButtonText: 'Submit', +// cancelButtonText: 'Cancel', +// }; diff --git a/.history/src/common/components/FormPopup_20250226155659.jsx b/.history/src/common/components/FormPopup_20250226155659.jsx new file mode 100644 index 00000000..76bcf56c --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226155659.jsx @@ -0,0 +1,228 @@ +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +//import PropTypes from 'prop-types'; +// import styled from 'styled-components'; +import { Dialog } from 'radix-ui'; + +/* reset */ +// button, +// fieldset, +// input { +// all: unset; +// } + +// .DialogOverlay { +// background-color: var(--black-a9); +// position: fixed; +// inset: 0; +// animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +// } + +// .DialogContent { +// background-color: var(--secondary-lightgrey); +// border-radius: 6px; +// box-shadow: var(--shadow-6); +// position: fixed; +// top: 50%; +// left: 50%; +// transform: translate(-50%, -50%); +// width: 90vw; +// max-width: 500px; +// max-height: 85vh; +// padding: 25px; +// animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +// } +// .DialogContent:focus { +// outline: none; +// } + +// .DialogTitle { +// margin: 0; +// font-weight: 500; +// color: var(--mauve-12); +// font-size: 17px; +// } + +// .DialogDescription { +// margin: 10px 0 20px; +// color: var(--mauve-11); +// font-size: 15px; +// line-height: 1.5; +// } + +// .Button { +// display: inline-flex; +// align-items: center; +// justify-content: center; +// border-radius: 4px; +// padding: 0 15px; +// font-size: 15px; +// line-height: 1; +// font-weight: 500; +// height: 35px; +// user-select: none; +// } +// .Button:focus:not(:focus-visible) { +// outline: 0; +// } +// .Button:focus-visible { +// outline: 2px solid var(--violet-6); +// outline-offset: 1px; +// } +// .Button.violet { +// background-color: var(--violet-4); +// color: var(--violet-12); +// outline-color: var(--violet-6); +// } +// .Button.violet:hover { +// background-color: var(--mauve-3); +// } +// .Button.green { +// background-color: var(--green-4); +// color: var(--green-11); +// outline-color: var(--green-7); +// } +// .Button.green:hover { +// background-color: var(--green-5); +// } + +// .IconButton { +// all: unset; +// font-family: inherit; +// border-radius: 100%; +// height: 25px; +// width: 25px; +// display: inline-flex; +// align-items: center; +// justify-content: center; +// color: var(--violet-11); +// position: absolute; +// top: 10px; +// right: 10px; +// background-color: var(--gray-3); +// } +// .IconButton:hover { +// background-color: var(--violet-4); +// } +// .IconButton:focus { +// box-shadow: 0 0 0 2px var(--violet-7); +// } + +// .Fieldset { +// display: flex; +// gap: 20px; +// align-items: center; +// margin-bottom: 15px; +// } + +// .Label { +// font-size: 15px; +// color: var(--violet-11); +// width: 90px; +// text-align: right; +// } + +// .Input { +// width: 100%; +// flex: 1; +// display: inline-flex; +// align-items: center; +// justify-content: center; +// border-radius: 4px; +// padding: 0 10px; +// font-size: 15px; +// line-height: 1; +// color: var(--violet-11); +// box-shadow: 0 0 0 1px var(--violet-7); +// height: 35px; +// } +// .Input:focus { +// box-shadow: 0 0 0 2px var(--violet-8); +// } + +// @keyframes overlayShow { +// from { +// opacity: 0; +// } +// to { +// opacity: 1; +// } +// } + +// @keyframes contentShow { +// from { +// opacity: 0; +// transform: translate(-50%, -48%) scale(0.96); +// } +// to { +// opacity: 1; +// transform: translate(-50%, -50%) scale(1); +// } +// } + +const DialogDemo = () => ( + + + + + + + + Edit profile + + Make changes to your profile here. Click save when you're done. + +
+ + +
+
+ + +
+
+ + + +
+ + + +
+
+
+); + +export default DialogDemo; + +// export default function FormPopup() { +// return ( +//
+//

FormPopup

+//
+// ); +// } + +// FormPopup.propTypes = { +// promptText: PropTypes.string, +// placeholderText: PropTypes.string, +// submitButtonText: PropTypes.string, +// cancelButtonText: PropTypes.string, +// onSubmit: PropTypes.func, +// }; + +// FormPopup.defaultProps = { +// promptText: 'Prompt', +// placeholderText: 'Enter text here', +// submitButtonText: 'Submit', +// cancelButtonText: 'Cancel', +// }; diff --git a/.history/src/common/components/FormPopup_20250226155939.jsx b/.history/src/common/components/FormPopup_20250226155939.jsx new file mode 100644 index 00000000..a1d99a2d --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226155939.jsx @@ -0,0 +1,230 @@ +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +//import PropTypes from 'prop-types'; +// import styled from 'styled-components'; +import { Dialog } from 'radix-ui'; + +/* reset */ +// button, +// fieldset, +// input { +// all: unset; +// } + +// .DialogOverlay { +// background-color: var(--black-a9); +// position: fixed; +// inset: 0; +// animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +// } + +// .DialogContent { +// background-color: var(--secondary-lightgrey); +// border-radius: 6px; +// box-shadow: var(--shadow-6); +// position: fixed; +// top: 50%; +// left: 50%; +// transform: translate(-50%, -50%); +// width: 90vw; +// max-width: 500px; +// max-height: 85vh; +// padding: 25px; +// animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +// } +// .DialogContent:focus { +// outline: none; +// } + +// .DialogTitle { +// margin: 0; +// font-weight: 500; +// color: var(--mauve-12); +// font-size: 17px; +// } + +// .DialogDescription { +// margin: 10px 0 20px; +// color: var(--mauve-11); +// font-size: 15px; +// line-height: 1.5; +// } + +// .Button { +// display: inline-flex; +// align-items: center; +// justify-content: center; +// border-radius: 4px; +// padding: 0 15px; +// font-size: 15px; +// line-height: 1; +// font-weight: 500; +// height: 35px; +// user-select: none; +// } +// .Button:focus:not(:focus-visible) { +// outline: 0; +// } +// .Button:focus-visible { +// outline: 2px solid var(--violet-6); +// outline-offset: 1px; +// } +// .Button.violet { +// background-color: var(--violet-4); +// color: var(--violet-12); +// outline-color: var(--violet-6); +// } +// .Button.violet:hover { +// background-color: var(--mauve-3); +// } +// .Button.green { +// background-color: var(--green-4); +// color: var(--green-11); +// outline-color: var(--green-7); +// } +// .Button.green:hover { +// background-color: var(--green-5); +// } + +// .IconButton { +// all: unset; +// font-family: inherit; +// border-radius: 100%; +// height: 25px; +// width: 25px; +// display: inline-flex; +// align-items: center; +// justify-content: center; +// color: var(--violet-11); +// position: absolute; +// top: 10px; +// right: 10px; +// background-color: var(--gray-3); +// } +// .IconButton:hover { +// background-color: var(--violet-4); +// } +// .IconButton:focus { +// box-shadow: 0 0 0 2px var(--violet-7); +// } + +// .Fieldset { +// display: flex; +// gap: 20px; +// align-items: center; +// margin-bottom: 15px; +// } + +// .Label { +// font-size: 15px; +// color: var(--violet-11); +// width: 90px; +// text-align: right; +// } + +// .Input { +// width: 100%; +// flex: 1; +// display: inline-flex; +// align-items: center; +// justify-content: center; +// border-radius: 4px; +// padding: 0 10px; +// font-size: 15px; +// line-height: 1; +// color: var(--violet-11); +// box-shadow: 0 0 0 1px var(--violet-7); +// height: 35px; +// } +// .Input:focus { +// box-shadow: 0 0 0 2px var(--violet-8); +// } + +// @keyframes overlayShow { +// from { +// opacity: 0; +// } +// to { +// opacity: 1; +// } +// } + +// @keyframes contentShow { +// from { +// opacity: 0; +// transform: translate(-50%, -48%) scale(0.96); +// } +// to { +// opacity: 1; +// transform: translate(-50%, -50%) scale(1); +// } +// } +export default function FormPopup() { + return( + + + + + + + + Edit profile + + Make changes to your profile here. Click save when you're done. + +
+ + +
+
+ + +
+
+ + + +
+ + + +
+
+
+ ); +} + + +export default DialogDemo; + +// export default function FormPopup() { +// return ( +//
+//

FormPopup

+//
+// ); +// } + +// FormPopup.propTypes = { +// promptText: PropTypes.string, +// placeholderText: PropTypes.string, +// submitButtonText: PropTypes.string, +// cancelButtonText: PropTypes.string, +// onSubmit: PropTypes.func, +// }; + +// FormPopup.defaultProps = { +// promptText: 'Prompt', +// placeholderText: 'Enter text here', +// submitButtonText: 'Submit', +// cancelButtonText: 'Cancel', +// }; diff --git a/.history/src/common/components/FormPopup_20250226160000.jsx b/.history/src/common/components/FormPopup_20250226160000.jsx new file mode 100644 index 00000000..e7a9c7d6 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226160000.jsx @@ -0,0 +1,231 @@ +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +//import PropTypes from 'prop-types'; +// import styled from 'styled-components'; +import { Dialog } from 'radix-ui'; + +/* reset */ +// button, +// fieldset, +// input { +// all: unset; +// } + +// .DialogOverlay { +// background-color: var(--black-a9); +// position: fixed; +// inset: 0; +// animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +// } + +// .DialogContent { +// background-color: var(--secondary-lightgrey); +// border-radius: 6px; +// box-shadow: var(--shadow-6); +// position: fixed; +// top: 50%; +// left: 50%; +// transform: translate(-50%, -50%); +// width: 90vw; +// max-width: 500px; +// max-height: 85vh; +// padding: 25px; +// animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +// } +// .DialogContent:focus { +// outline: none; +// } + +// .DialogTitle { +// margin: 0; +// font-weight: 500; +// color: var(--mauve-12); +// font-size: 17px; +// } + +// .DialogDescription { +// margin: 10px 0 20px; +// color: var(--mauve-11); +// font-size: 15px; +// line-height: 1.5; +// } + +// .Button { +// display: inline-flex; +// align-items: center; +// justify-content: center; +// border-radius: 4px; +// padding: 0 15px; +// font-size: 15px; +// line-height: 1; +// font-weight: 500; +// height: 35px; +// user-select: none; +// } +// .Button:focus:not(:focus-visible) { +// outline: 0; +// } +// .Button:focus-visible { +// outline: 2px solid var(--violet-6); +// outline-offset: 1px; +// } +// .Button.violet { +// background-color: var(--violet-4); +// color: var(--violet-12); +// outline-color: var(--violet-6); +// } +// .Button.violet:hover { +// background-color: var(--mauve-3); +// } +// .Button.green { +// background-color: var(--green-4); +// color: var(--green-11); +// outline-color: var(--green-7); +// } +// .Button.green:hover { +// background-color: var(--green-5); +// } + +// .IconButton { +// all: unset; +// font-family: inherit; +// border-radius: 100%; +// height: 25px; +// width: 25px; +// display: inline-flex; +// align-items: center; +// justify-content: center; +// color: var(--violet-11); +// position: absolute; +// top: 10px; +// right: 10px; +// background-color: var(--gray-3); +// } +// .IconButton:hover { +// background-color: var(--violet-4); +// } +// .IconButton:focus { +// box-shadow: 0 0 0 2px var(--violet-7); +// } + +// .Fieldset { +// display: flex; +// gap: 20px; +// align-items: center; +// margin-bottom: 15px; +// } + +// .Label { +// font-size: 15px; +// color: var(--violet-11); +// width: 90px; +// text-align: right; +// } + +// .Input { +// width: 100%; +// flex: 1; +// display: inline-flex; +// align-items: center; +// justify-content: center; +// border-radius: 4px; +// padding: 0 10px; +// font-size: 15px; +// line-height: 1; +// color: var(--violet-11); +// box-shadow: 0 0 0 1px var(--violet-7); +// height: 35px; +// } +// .Input:focus { +// box-shadow: 0 0 0 2px var(--violet-8); +// } + +// @keyframes overlayShow { +// from { +// opacity: 0; +// } +// to { +// opacity: 1; +// } +// } + +// @keyframes contentShow { +// from { +// opacity: 0; +// transform: translate(-50%, -48%) scale(0.96); +// } +// to { +// opacity: 1; +// transform: translate(-50%, -50%) scale(1); +// } +// } +export default function FormPopup() { + return ( + + + + + + + + Edit profile + + Make changes to your profile here. Click save when you're done. + +
+ + +
+
+ + +
+
+ + + +
+ + + +
+
+
+ ); +} + +// export default function FormPopup() { +// return ( +//
+//

FormPopup

+//
+// ); +// } + +// FormPopup.propTypes = { +// promptText: PropTypes.string, +// placeholderText: PropTypes.string, +// submitButtonText: PropTypes.string, +// cancelButtonText: PropTypes.string, +// onSubmit: PropTypes.func, +// }; + +// FormPopup.defaultProps = { +// promptText: 'Prompt', +// placeholderText: 'Enter text here', +// submitButtonText: 'Submit', +// cancelButtonText: 'Cancel', +// }; diff --git a/.history/src/common/components/FormPopup_20250226160002.jsx b/.history/src/common/components/FormPopup_20250226160002.jsx new file mode 100644 index 00000000..e7a9c7d6 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226160002.jsx @@ -0,0 +1,231 @@ +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +//import PropTypes from 'prop-types'; +// import styled from 'styled-components'; +import { Dialog } from 'radix-ui'; + +/* reset */ +// button, +// fieldset, +// input { +// all: unset; +// } + +// .DialogOverlay { +// background-color: var(--black-a9); +// position: fixed; +// inset: 0; +// animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +// } + +// .DialogContent { +// background-color: var(--secondary-lightgrey); +// border-radius: 6px; +// box-shadow: var(--shadow-6); +// position: fixed; +// top: 50%; +// left: 50%; +// transform: translate(-50%, -50%); +// width: 90vw; +// max-width: 500px; +// max-height: 85vh; +// padding: 25px; +// animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +// } +// .DialogContent:focus { +// outline: none; +// } + +// .DialogTitle { +// margin: 0; +// font-weight: 500; +// color: var(--mauve-12); +// font-size: 17px; +// } + +// .DialogDescription { +// margin: 10px 0 20px; +// color: var(--mauve-11); +// font-size: 15px; +// line-height: 1.5; +// } + +// .Button { +// display: inline-flex; +// align-items: center; +// justify-content: center; +// border-radius: 4px; +// padding: 0 15px; +// font-size: 15px; +// line-height: 1; +// font-weight: 500; +// height: 35px; +// user-select: none; +// } +// .Button:focus:not(:focus-visible) { +// outline: 0; +// } +// .Button:focus-visible { +// outline: 2px solid var(--violet-6); +// outline-offset: 1px; +// } +// .Button.violet { +// background-color: var(--violet-4); +// color: var(--violet-12); +// outline-color: var(--violet-6); +// } +// .Button.violet:hover { +// background-color: var(--mauve-3); +// } +// .Button.green { +// background-color: var(--green-4); +// color: var(--green-11); +// outline-color: var(--green-7); +// } +// .Button.green:hover { +// background-color: var(--green-5); +// } + +// .IconButton { +// all: unset; +// font-family: inherit; +// border-radius: 100%; +// height: 25px; +// width: 25px; +// display: inline-flex; +// align-items: center; +// justify-content: center; +// color: var(--violet-11); +// position: absolute; +// top: 10px; +// right: 10px; +// background-color: var(--gray-3); +// } +// .IconButton:hover { +// background-color: var(--violet-4); +// } +// .IconButton:focus { +// box-shadow: 0 0 0 2px var(--violet-7); +// } + +// .Fieldset { +// display: flex; +// gap: 20px; +// align-items: center; +// margin-bottom: 15px; +// } + +// .Label { +// font-size: 15px; +// color: var(--violet-11); +// width: 90px; +// text-align: right; +// } + +// .Input { +// width: 100%; +// flex: 1; +// display: inline-flex; +// align-items: center; +// justify-content: center; +// border-radius: 4px; +// padding: 0 10px; +// font-size: 15px; +// line-height: 1; +// color: var(--violet-11); +// box-shadow: 0 0 0 1px var(--violet-7); +// height: 35px; +// } +// .Input:focus { +// box-shadow: 0 0 0 2px var(--violet-8); +// } + +// @keyframes overlayShow { +// from { +// opacity: 0; +// } +// to { +// opacity: 1; +// } +// } + +// @keyframes contentShow { +// from { +// opacity: 0; +// transform: translate(-50%, -48%) scale(0.96); +// } +// to { +// opacity: 1; +// transform: translate(-50%, -50%) scale(1); +// } +// } +export default function FormPopup() { + return ( + + + + + + + + Edit profile + + Make changes to your profile here. Click save when you're done. + +
+ + +
+
+ + +
+
+ + + +
+ + + +
+
+
+ ); +} + +// export default function FormPopup() { +// return ( +//
+//

FormPopup

+//
+// ); +// } + +// FormPopup.propTypes = { +// promptText: PropTypes.string, +// placeholderText: PropTypes.string, +// submitButtonText: PropTypes.string, +// cancelButtonText: PropTypes.string, +// onSubmit: PropTypes.func, +// }; + +// FormPopup.defaultProps = { +// promptText: 'Prompt', +// placeholderText: 'Enter text here', +// submitButtonText: 'Submit', +// cancelButtonText: 'Cancel', +// }; diff --git a/.history/src/common/components/FormPopup_20250226160350.jsx b/.history/src/common/components/FormPopup_20250226160350.jsx new file mode 100644 index 00000000..f060ce31 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226160350.jsx @@ -0,0 +1,188 @@ +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +import { Dialog } from 'radix-ui'; +import styled from 'styled-components'; + +// Define styled components scoped to this component +const StyledOverlay = styled(Dialog.Overlay)` + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +`; + +const StyledContent = styled(Dialog.Content)` + background-color: var(--secondary-lightgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); + &:focus { + outline: none; + } + + @keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + @keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + } +`; + +const StyledTitle = styled(Dialog.Title)` + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +`; + +const StyledDescription = styled(Dialog.Description)` + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +`; + +const StyledFieldset = styled.fieldset` + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +`; + +const StyledLabel = styled.label` + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +`; + +const StyledInput = styled.input` + width: 100%; + flex: 1; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; + &:focus { + box-shadow: 0 0 0 2px var(--violet-8); + } +`; + +const StyledButton = styled.button` + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; + &.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); + &:hover { + background-color: var(--mauve-3); + } + } + &.green { + background-color: var(--green-4); + color: var (--green-11); + outline-color: var(--green-7); + &:hover { + background-color: var(--green-5); + } + } +`; + +const IconButton = styled.button` + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); + &:hover { + background-color: var(--violet-4); + } + &:focus { + box-shadow: 0 0 0 2px var(--violet-7); + } +`; + +export default function FormPopup() { + return ( + + + Edit profile + + + + + Edit profile + + Make changes to your profile here. Click save when you're done. + + + Name + + + + Username + + +
+ + Save changes + +
+ + + + + +
+
+
+ ); +} diff --git a/.history/src/common/components/FormPopup_20250226173723.jsx b/.history/src/common/components/FormPopup_20250226173723.jsx new file mode 100644 index 00000000..4f2e5361 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250226173723.jsx @@ -0,0 +1,192 @@ +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +import { Dialog } from 'radix-ui'; +import styled from 'styled-components'; + +// Define styled components scoped to this component +const StyledOverlay = styled(Dialog.Overlay)` + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +`; + +const StyledContent = styled(Dialog.Content)` + background-color: var(--secondary-lightgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); + &:focus { + outline: none; + } + + @keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + @keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + } +`; + +const StyledTitle = styled(Dialog.Title)` + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +`; + +const StyledDescription = styled(Dialog.Description)` + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +`; + +const StyledFieldset = styled.fieldset` + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +`; + +const StyledLabel = styled.label` + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +`; + +const StyledInput = styled.input` + width: 100%; + flex: 1; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; + &:focus { + box-shadow: 0 0 0 2px var(--violet-8); + } +`; + +const StyledButton = styled.button` + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; + &.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); + &:hover { + background-color: var(--mauve-3); + } + } + &.green { + background-color: var(--green-4); + color: var (--green-11); + outline-color: var(--green-7); + &:hover { + background-color: var(--green-5); + } + } +`; + +const IconButton = styled.button` + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); + &:hover { + background-color: var(--violet-4); + } + &:focus { + box-shadow: 0 0 0 2px var(--violet-7); + } +`; + +export default function FormPopup() { + return ( + + + Edit profile + + + + + Edit profile + + Make changes to your profile here. Click save when you're done. + + + Name + + + + Username + + + + Item Name + + +
+ + Save changes + +
+ + + + + +
+
+
+ ); +} diff --git a/.history/src/common/components/FormPopup_20250227222951.jsx b/.history/src/common/components/FormPopup_20250227222951.jsx new file mode 100644 index 00000000..5554b428 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250227222951.jsx @@ -0,0 +1,207 @@ +import { default as PropTypes, default as React } from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +import { Dialog } from 'radix-ui'; +import styled from 'styled-components'; + +// Define styled components scoped to this component +const StyledOverlay = styled(Dialog.Overlay)` + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +`; + +const StyledContent = styled(Dialog.Content)` + background-color: var(--secondary-lightgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); + &:focus { + outline: none; + } + + @keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + @keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + } +`; + +const StyledTitle = styled(Dialog.Title)` + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +`; + +const StyledDescription = styled(Dialog.Description)` + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +`; + +const StyledFieldset = styled.fieldset` + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +`; + +const StyledLabel = styled.label` + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +`; + +const StyledInput = styled.input` + width: 100%; + flex: 1; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; + &:focus { + box-shadow: 0 0 0 2px var(--violet-8); + } +`; + +const StyledButton = styled.button` + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; + &.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); + &:hover { + background-color: var(--mauve-3); + } + } + &.green { + background-color: var(--green-4); + color: var (--green-11); + outline-color: var(--green-7); + &:hover { + background-color: var(--green-5); + } + } +`; + +const IconButton = styled.button` + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); + &:hover { + background-color: var(--violet-4); + } + &:focus { + box-shadow: 0 0 0 2px var(--violet-7); + } +`; + +export default function FormPopup() { + return ( + + + Edit profile + + + + + Edit profile + + Make changes to your profile here. Click save when you're done. + + + Name + + + + Username + + + + Item Name + + +
+ + Save changes + +
+ + + + + +
+
+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/.history/src/common/components/FormPopup_20250227223057.jsx b/.history/src/common/components/FormPopup_20250227223057.jsx new file mode 100644 index 00000000..989a5c34 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250227223057.jsx @@ -0,0 +1,208 @@ +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +import PropTypes from 'prop-types'; +import { Dialog } from 'radix-ui'; +import styled from 'styled-components'; + +// Define styled components scoped to this component +const StyledOverlay = styled(Dialog.Overlay)` + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +`; + +const StyledContent = styled(Dialog.Content)` + background-color: var(--secondary-lightgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); + &:focus { + outline: none; + } + + @keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + @keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + } +`; + +const StyledTitle = styled(Dialog.Title)` + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +`; + +const StyledDescription = styled(Dialog.Description)` + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +`; + +const StyledFieldset = styled.fieldset` + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +`; + +const StyledLabel = styled.label` + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +`; + +const StyledInput = styled.input` + width: 100%; + flex: 1; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; + &:focus { + box-shadow: 0 0 0 2px var(--violet-8); + } +`; + +const StyledButton = styled.button` + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; + &.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); + &:hover { + background-color: var(--mauve-3); + } + } + &.green { + background-color: var(--green-4); + color: var (--green-11); + outline-color: var(--green-7); + &:hover { + background-color: var(--green-5); + } + } +`; + +const IconButton = styled.button` + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); + &:hover { + background-color: var(--violet-4); + } + &:focus { + box-shadow: 0 0 0 2px var(--violet-7); + } +`; + +export default function FormPopup() { + return ( + + + Edit profile + + + + + Edit profile + + Make changes to your profile here. Click save when you're done. + + + Name + + + + Username + + + + Item Name + + +
+ + Save changes + +
+ + + + + +
+
+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/.history/src/common/components/FormPopup_20250227223259.jsx b/.history/src/common/components/FormPopup_20250227223259.jsx new file mode 100644 index 00000000..b6c73715 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250227223259.jsx @@ -0,0 +1,208 @@ +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +import PropTypes from 'prop-types'; +import { Dialog } from 'radix-ui'; +import styled from 'styled-components'; + +// MAKE SURE TO STYLE COMPONENT IN SAME FILE IT IS BEING EXPORTED FROM!! +const StyledOverlay = styled(Dialog.Overlay)` + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +`; + +const StyledContent = styled(Dialog.Content)` + background-color: var(--secondary-lightgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); + &:focus { + outline: none; + } + + @keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + @keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + } +`; + +const StyledTitle = styled(Dialog.Title)` + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +`; + +const StyledDescription = styled(Dialog.Description)` + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +`; + +const StyledFieldset = styled.fieldset` + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +`; + +const StyledLabel = styled.label` + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +`; + +const StyledInput = styled.input` + width: 100%; + flex: 1; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; + &:focus { + box-shadow: 0 0 0 2px var(--violet-8); + } +`; + +const StyledButton = styled.button` + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; + &.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); + &:hover { + background-color: var(--mauve-3); + } + } + &.green { + background-color: var(--green-4); + color: var (--green-11); + outline-color: var(--green-7); + &:hover { + background-color: var(--green-5); + } + } +`; + +const IconButton = styled.button` + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); + &:hover { + background-color: var(--violet-4); + } + &:focus { + box-shadow: 0 0 0 2px var(--violet-7); + } +`; + +export default function FormPopup() { + return ( + + + Edit profile + + + + + Edit profile + + Make changes to your profile here. Click save when you're done. + + + Name + + + + Username + + + + Item Name + + +
+ + Save changes + +
+ + + + + +
+
+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/.history/src/common/components/FormPopup_20250227223652.jsx b/.history/src/common/components/FormPopup_20250227223652.jsx new file mode 100644 index 00000000..59f71342 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250227223652.jsx @@ -0,0 +1,209 @@ +// Used for New Order Form, Change Password Form +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +import PropTypes from 'prop-types'; +import { Dialog } from 'radix-ui'; +import styled from 'styled-components'; + +// MAKE SURE TO STYLE COMPONENT IN SAME FILE IT IS BEING EXPORTED FROM!! +const StyledOverlay = styled(Dialog.Overlay)` + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +`; + +const StyledContent = styled(Dialog.Content)` + background-color: var(--secondary-lightgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); + &:focus { + outline: none; + } + + @keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + @keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + } +`; + +const StyledTitle = styled(Dialog.Title)` + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +`; + +const StyledDescription = styled(Dialog.Description)` + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +`; + +const StyledFieldset = styled.fieldset` + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +`; + +const StyledLabel = styled.label` + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +`; + +const StyledInput = styled.input` + width: 100%; + flex: 1; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; + &:focus { + box-shadow: 0 0 0 2px var(--violet-8); + } +`; + +const StyledButton = styled.button` + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; + &.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); + &:hover { + background-color: var(--mauve-3); + } + } + &.green { + background-color: var(--green-4); + color: var (--green-11); + outline-color: var(--green-7); + &:hover { + background-color: var(--green-5); + } + } +`; + +const IconButton = styled.button` + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); + &:hover { + background-color: var(--violet-4); + } + &:focus { + box-shadow: 0 0 0 2px var(--violet-7); + } +`; + +export default function FormPopup() { + return ( + + + Edit profile + + + + + Edit profile + + Make changes to your profile here. Click save when you're done. + + + Name + + + + Username + + + + Item Name + + +
+ + Save changes + +
+ + + + + +
+
+
+ ); +} + +FormPopup.propTypes = { + promptText: PropTypes.string, + placeholderText: PropTypes.string, + submitButtonText: PropTypes.string, + cancelButtonText: PropTypes.string, + onSubmit: PropTypes.func, +}; + +FormPopup.defaultProps = { + promptText: 'Prompt', + placeholderText: 'Enter text here', + submitButtonText: 'Submit', + cancelButtonText: 'Cancel', +}; diff --git a/.history/src/common/components/FormPopup_20250227224428.jsx b/.history/src/common/components/FormPopup_20250227224428.jsx new file mode 100644 index 00000000..172ab18b --- /dev/null +++ b/.history/src/common/components/FormPopup_20250227224428.jsx @@ -0,0 +1,196 @@ +// Used for New Order Form, Change Password Form +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +import PropTypes from 'prop-types'; +import { Dialog } from 'radix-ui'; +import styled from 'styled-components'; + +// MAKE SURE TO STYLE COMPONENT IN SAME FILE IT IS BEING EXPORTED FROM!! +const StyledOverlay = styled(Dialog.Overlay)` + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +`; + +const StyledContent = styled(Dialog.Content)` + background-color: var(--secondary-lightgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); + &:focus { + outline: none; + } + + @keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + @keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + } +`; + +const StyledTitle = styled(Dialog.Title)` + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +`; + +const StyledDescription = styled(Dialog.Description)` + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +`; + +const StyledFieldset = styled.fieldset` + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +`; + +const StyledLabel = styled.label` + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +`; + +const StyledInput = styled.input` + width: 100%; + flex: 1; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; + &:focus { + box-shadow: 0 0 0 2px var(--violet-8); + } +`; + +const StyledButton = styled.button` + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; + &.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); + &:hover { + background-color: var(--mauve-3); + } + } + &.green { + background-color: var(--green-4); + color: var (--green-11); + outline-color: var(--green-7); + &:hover { + background-color: var(--green-5); + } + } +`; + +const IconButton = styled.button` + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); + &:hover { + background-color: var(--violet-4); + } + &:focus { + box-shadow: 0 0 0 2px var(--violet-7); + } +`; + +export default function FormPopup({ title, description, children, onSubmit }) { + return ( + + + Open Form + + + + + {title} + {description} +
+ {children} +
+ + + Save changes + + +
+
+ + + + + +
+
+
+ ); +} + +FormPopup.propTypes = { + title: PropTypes.string.isRequired, + description: PropTypes.string, + children: PropTypes.node.isRequired, + onSubmit: PropTypes.func.isRequired, +}; + +FormPopup.defaultProps = { + description: '', +}; diff --git a/.history/src/common/components/FormPopup_20250227232142.jsx b/.history/src/common/components/FormPopup_20250227232142.jsx new file mode 100644 index 00000000..71c68680 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250227232142.jsx @@ -0,0 +1,204 @@ +// Used for New Order Form, Change Password Form +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +import PropTypes from 'prop-types'; +import { Dialog } from 'radix-ui'; +import styled from 'styled-components'; + +// MAKE SURE TO STYLE COMPONENT IN SAME FILE IT IS BEING EXPORTED FROM!! +const StyledOverlay = styled(Dialog.Overlay)` + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +`; + +const StyledContent = styled(Dialog.Content)` + background-color: var(--secondary-lightgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: ${(props) => props.width || '90vw'}; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); + &:focus { + outline: none; + } + + @keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + @keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + } +`; + +const StyledTitle = styled(Dialog.Title)` + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +`; + +const StyledDescription = styled(Dialog.Description)` + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +`; + +const StyledFieldset = styled.fieldset` + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +`; + +const StyledLabel = styled.label` + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +`; + +const StyledInput = styled.input` + width: 100%; + flex: 1; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; + &:focus { + box-shadow: 0 0 0 2px var(--violet-8); + } +`; + +const StyledButton = styled.button` + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; + &.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); + &:hover { + background-color: var(--mauve-3); + } + } + &.green { + background-color: var(--green-4); + color: var (--green-11); + outline-color: var(--green-7); + &:hover { + background-color: var(--green-5); + } + } +`; + +const IconButton = styled.button` + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); + &:hover { + background-color: var(--violet-4); + } + &:focus { + box-shadow: 0 0 0 2px var(--violet-7); + } +`; + +export default function FormPopup({ + title, + description, + children, + onSubmit, + width, +}) { + return ( + + + Open Form + + + + + {title} + {description} +
+ {children} +
+ + + Save changes + + +
+
+ + + + + +
+
+
+ ); +} + +FormPopup.propTypes = { + title: PropTypes.string.isRequired, + description: PropTypes.string, + children: PropTypes.node.isRequired, + onSubmit: PropTypes.func.isRequired, + width: PropTypes.string, +}; + +FormPopup.defaultProps = { + description: '', + width: '90vw', +}; diff --git a/.history/src/common/components/FormPopup_20250227232255.jsx b/.history/src/common/components/FormPopup_20250227232255.jsx new file mode 100644 index 00000000..7e48c6ac --- /dev/null +++ b/.history/src/common/components/FormPopup_20250227232255.jsx @@ -0,0 +1,204 @@ +// Used for New Order Form, Change Password Form +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +import PropTypes from 'prop-types'; +import { Dialog } from 'radix-ui'; +import styled from 'styled-components'; + +// MAKE SURE TO STYLE COMPONENT IN SAME FILE IT IS BEING EXPORTED FROM!! +const StyledOverlay = styled(Dialog.Overlay)` + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +`; + +const StyledContent = styled(Dialog.Content)` + background-color: var(--secondary-lightgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: ${(props) => props.width || '90vw'}; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); + &:focus { + outline: none; + } + + @keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + @keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + } +`; + +const StyledTitle = styled(Dialog.Title)` + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +`; + +const StyledDescription = styled(Dialog.Description)` + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +`; + +const StyledFieldset = styled.fieldset` + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +`; + +const StyledLabel = styled.label` + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +`; + +const StyledInput = styled.input` + width: 100%; + flex: 1; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; + &:focus { + box-shadow: 0 0 0 2px var(--violet-8); + } +`; + +const StyledButton = styled.button` + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; + &.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); + &:hover { + background-color: var(--mauve-3); + } + } + &.green { + background-color: var(--green-4); + color: var (--green-11); + outline-color: var(--green-7); + &:hover { + background-color: var(--green-5); + } + } +`; + +const IconButton = styled.button` + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); + &:hover { + background-color: var(--violet-4); + } + &:focus { + box-shadow: 0 0 0 2px var(--violet-7); + } +`; + +export default function FormPopup({ + title, + description, + children, + onSubmit, + width, +}) { + return ( + + + Open Form + + + + + {title} + {description} +
+ {children} +
+ + + Save changes + + +
+
+ + + + + +
+
+
+ ); +} + +FormPopup.propTypes = { + title: PropTypes.string.isRequired, + description: PropTypes.string, + children: PropTypes.node.isRequired, + onSubmit: PropTypes.func.isRequired, + width: PropTypes.string, +}; + +FormPopup.defaultProps = { + description: '', + width: '90vw', +}; diff --git a/.history/src/common/components/FormPopup_20250227232338.jsx b/.history/src/common/components/FormPopup_20250227232338.jsx new file mode 100644 index 00000000..71c68680 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250227232338.jsx @@ -0,0 +1,204 @@ +// Used for New Order Form, Change Password Form +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +import PropTypes from 'prop-types'; +import { Dialog } from 'radix-ui'; +import styled from 'styled-components'; + +// MAKE SURE TO STYLE COMPONENT IN SAME FILE IT IS BEING EXPORTED FROM!! +const StyledOverlay = styled(Dialog.Overlay)` + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +`; + +const StyledContent = styled(Dialog.Content)` + background-color: var(--secondary-lightgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: ${(props) => props.width || '90vw'}; + max-width: 500px; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); + &:focus { + outline: none; + } + + @keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + @keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + } +`; + +const StyledTitle = styled(Dialog.Title)` + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +`; + +const StyledDescription = styled(Dialog.Description)` + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +`; + +const StyledFieldset = styled.fieldset` + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +`; + +const StyledLabel = styled.label` + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +`; + +const StyledInput = styled.input` + width: 100%; + flex: 1; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; + &:focus { + box-shadow: 0 0 0 2px var(--violet-8); + } +`; + +const StyledButton = styled.button` + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; + &.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); + &:hover { + background-color: var(--mauve-3); + } + } + &.green { + background-color: var(--green-4); + color: var (--green-11); + outline-color: var(--green-7); + &:hover { + background-color: var(--green-5); + } + } +`; + +const IconButton = styled.button` + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); + &:hover { + background-color: var(--violet-4); + } + &:focus { + box-shadow: 0 0 0 2px var(--violet-7); + } +`; + +export default function FormPopup({ + title, + description, + children, + onSubmit, + width, +}) { + return ( + + + Open Form + + + + + {title} + {description} +
+ {children} +
+ + + Save changes + + +
+
+ + + + + +
+
+
+ ); +} + +FormPopup.propTypes = { + title: PropTypes.string.isRequired, + description: PropTypes.string, + children: PropTypes.node.isRequired, + onSubmit: PropTypes.func.isRequired, + width: PropTypes.string, +}; + +FormPopup.defaultProps = { + description: '', + width: '90vw', +}; diff --git a/.history/src/common/components/FormPopup_20250227232439.jsx b/.history/src/common/components/FormPopup_20250227232439.jsx new file mode 100644 index 00000000..972323e5 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250227232439.jsx @@ -0,0 +1,204 @@ +// Used for New Order Form, Change Password Form +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +import PropTypes from 'prop-types'; +import { Dialog } from 'radix-ui'; +import styled from 'styled-components'; + +// MAKE SURE TO STYLE COMPONENT IN SAME FILE IT IS BEING EXPORTED FROM!! +const StyledOverlay = styled(Dialog.Overlay)` + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +`; + +const StyledContent = styled(Dialog.Content)` + background-color: var(--secondary-lightgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: ${(props) => props.maxWidth || '500px'}; + max-height: 85vh; + padding: 25px; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); + &:focus { + outline: none; + } + + @keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + @keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + } +`; + +const StyledTitle = styled(Dialog.Title)` + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +`; + +const StyledDescription = styled(Dialog.Description)` + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +`; + +const StyledFieldset = styled.fieldset` + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +`; + +const StyledLabel = styled.label` + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +`; + +const StyledInput = styled.input` + width: 100%; + flex: 1; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; + &:focus { + box-shadow: 0 0 0 2px var(--violet-8); + } +`; + +const StyledButton = styled.button` + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; + &.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); + &:hover { + background-color: var(--mauve-3); + } + } + &.green { + background-color: var(--green-4); + color: var (--green-11); + outline-color: var(--green-7); + &:hover { + background-color: var(--green-5); + } + } +`; + +const IconButton = styled.button` + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); + &:hover { + background-color: var(--violet-4); + } + &:focus { + box-shadow: 0 0 0 2px var(--violet-7); + } +`; + +export default function FormPopup({ + title, + description, + children, + onSubmit, + maxWidth, +}) { + return ( + + + Open Form + + + + + {title} + {description} +
+ {children} +
+ + + Save changes + + +
+
+ + + + + +
+
+
+ ); +} + +FormPopup.propTypes = { + title: PropTypes.string.isRequired, + description: PropTypes.string, + children: PropTypes.node.isRequired, + onSubmit: PropTypes.func.isRequired, + maxWidth: PropTypes.string, +}; + +FormPopup.defaultProps = { + description: '', + maxWidth: '500px', +}; diff --git a/.history/src/common/components/FormPopup_20250227234152.jsx b/.history/src/common/components/FormPopup_20250227234152.jsx new file mode 100644 index 00000000..ba1e3a32 --- /dev/null +++ b/.history/src/common/components/FormPopup_20250227234152.jsx @@ -0,0 +1,205 @@ +// Used for New Order Form, Change Password Form +import React from 'react'; + +import { Cross2Icon } from '@radix-ui/react-icons'; +import PropTypes from 'prop-types'; +import { Dialog } from 'radix-ui'; +import styled from 'styled-components'; + +// MAKE SURE TO STYLE COMPONENT IN SAME FILE IT IS BEING EXPORTED FROM!! +const StyledOverlay = styled(Dialog.Overlay)` + background-color: var(--black-a9); + position: fixed; + inset: 0; + animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); +`; + +const StyledContent = styled(Dialog.Content)` + background-color: var(--secondary-lightgrey); + border-radius: 6px; + box-shadow: var(--shadow-6); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90vw; + max-width: ${(props) => props.maxWidth || '500px'}; + max-height: 85vh; + padding: 25px; + overflow: hidden; + animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1); + &:focus { + outline: none; + } + + @keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + @keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + } +`; + +const StyledTitle = styled(Dialog.Title)` + margin: 0; + font-weight: 500; + color: var(--mauve-12); + font-size: 17px; +`; + +const StyledDescription = styled(Dialog.Description)` + margin: 10px 0 20px; + color: var(--mauve-11); + font-size: 15px; + line-height: 1.5; +`; + +const StyledFieldset = styled.fieldset` + display: flex; + gap: 20px; + align-items: center; + margin-bottom: 15px; +`; + +const StyledLabel = styled.label` + font-size: 15px; + color: var(--violet-11); + width: 90px; + text-align: right; +`; + +const StyledInput = styled.input` + width: 100%; + flex: 1; + border-radius: 4px; + padding: 0 10px; + font-size: 15px; + line-height: 1; + color: var(--violet-11); + box-shadow: 0 0 0 1px var(--violet-7); + height: 35px; + &:focus { + box-shadow: 0 0 0 2px var(--violet-8); + } +`; + +const StyledButton = styled.button` + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 4px; + padding: 0 15px; + font-size: 15px; + line-height: 1; + font-weight: 500; + height: 35px; + user-select: none; + &.violet { + background-color: var(--violet-4); + color: var(--violet-12); + outline-color: var(--violet-6); + &:hover { + background-color: var(--mauve-3); + } + } + &.green { + background-color: var(--green-4); + color: var (--green-11); + outline-color: var(--green-7); + &:hover { + background-color: var(--green-5); + } + } +`; + +const IconButton = styled.button` + all: unset; + font-family: inherit; + border-radius: 100%; + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--violet-11); + position: absolute; + top: 10px; + right: 10px; + background-color: var(--gray-3); + &:hover { + background-color: var(--violet-4); + } + &:focus { + box-shadow: 0 0 0 2px var(--violet-7); + } +`; + +export default function FormPopup({ + title, + description, + children, + onSubmit, + maxWidth, +}) { + return ( + + + Open Form + + + + + {title} + {description} +
+ {children} +
+ + + Save changes + + +
+
+ + + + + +
+
+
+ ); +} + +FormPopup.propTypes = { + title: PropTypes.string.isRequired, + description: PropTypes.string, + children: PropTypes.node.isRequired, + onSubmit: PropTypes.func.isRequired, + maxWidth: PropTypes.string, +}; + +FormPopup.defaultProps = { + description: '', + maxWidth: '500px', +}; diff --git a/.history/src/common/components/GoogleButton_20250226152730.jsx b/.history/src/common/components/GoogleButton_20250226152730.jsx new file mode 100644 index 00000000..c1758b7a --- /dev/null +++ b/.history/src/common/components/GoogleButton_20250226152730.jsx @@ -0,0 +1,104 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; +import styled from 'styled-components'; + +const StyledButton = styled.button` + width: 100%; + display: flex; + justify-content: center; + align-items: center; + gap: 8px; + background-color: white; + border: 1px solid #e2e2e2; + border-radius: 4px; + padding: 8px 16px; + color: #5f6368; + font-size: 14px; + cursor: pointer; + transition: background-color 0.2s; + + &:hover { + background-color: #f8f9fa; + } + + &:focus { + outline: none; + box-shadow: 0 0 0 2px #e8e8e8; + } + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } +`; + +const Divider = styled.div` + position: relative; + margin: 24px 0; + text-align: center; + + &::before { + content: ''; + position: absolute; + top: 50%; + left: 0; + right: 0; + height: 1px; + background-color: #e2e2e2; + } + + span { + position: relative; + background-color: white; + padding: 0 12px; + color: #666; + font-size: 14px; + } +`; + +export default function GoogleButton({ + isLoading, + onClick, + text = 'Sign in with Google', +}) { + return ( + <> + + Or continue with + + + + + + + + + {text} + + + ); +} + +GoogleButton.propTypes = { + isLoading: PropTypes.bool, + onClick: PropTypes.func.isRequired, + text: PropTypes.string, +}; + +GoogleButton.defaultProps = { + isLoading: false, + text: 'Sign in with Google', +}; diff --git a/.history/src/common/components/NewOrderForm_20250227224353.jsx b/.history/src/common/components/NewOrderForm_20250227224353.jsx new file mode 100644 index 00000000..e69de29b diff --git a/.history/src/common/components/NewOrderForm_20250227224458.jsx b/.history/src/common/components/NewOrderForm_20250227224458.jsx new file mode 100644 index 00000000..94444083 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227224458.jsx @@ -0,0 +1,42 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + return ( + + + + + ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227224956.jsx b/.history/src/common/components/NewOrderForm_20250227224956.jsx new file mode 100644 index 00000000..201faf1d --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227224956.jsx @@ -0,0 +1,45 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + + + + ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225143.jsx b/.history/src/common/components/NewOrderForm_20250227225143.jsx new file mode 100644 index 00000000..c150b7a5 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225143.jsx @@ -0,0 +1,45 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + + + + ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225328.jsx b/.history/src/common/components/NewOrderForm_20250227225328.jsx new file mode 100644 index 00000000..f7851b8d --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225328.jsx @@ -0,0 +1,59 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + + + + + + ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225348.jsx b/.history/src/common/components/NewOrderForm_20250227225348.jsx new file mode 100644 index 00000000..cf174728 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225348.jsx @@ -0,0 +1,60 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + +

hi

+ + + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225414.jsx b/.history/src/common/components/NewOrderForm_20250227225414.jsx new file mode 100644 index 00000000..d33787d2 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225414.jsx @@ -0,0 +1,60 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + +

Hi

+ + + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225516.jsx b/.history/src/common/components/NewOrderForm_20250227225516.jsx new file mode 100644 index 00000000..58f6cbaf --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225516.jsx @@ -0,0 +1,60 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + +

Hi

+ + + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225529.jsx b/.history/src/common/components/NewOrderForm_20250227225529.jsx new file mode 100644 index 00000000..46c2307e --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225529.jsx @@ -0,0 +1,60 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + +
Hi
+ + + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225613.jsx b/.history/src/common/components/NewOrderForm_20250227225613.jsx new file mode 100644 index 00000000..81df4a7b --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225613.jsx @@ -0,0 +1,60 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + +
Hi
+ + + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225635.jsx b/.history/src/common/components/NewOrderForm_20250227225635.jsx new file mode 100644 index 00000000..e0797337 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225635.jsx @@ -0,0 +1,60 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + +
Hi
+ + + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225709.jsx b/.history/src/common/components/NewOrderForm_20250227225709.jsx new file mode 100644 index 00000000..3f421656 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225709.jsx @@ -0,0 +1,62 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + +
+ Selected program budget: {{}} +
+ + + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225721.jsx b/.history/src/common/components/NewOrderForm_20250227225721.jsx new file mode 100644 index 00000000..52849e3b --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225721.jsx @@ -0,0 +1,62 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + +
+ Selected program budget: 4 +
+ + + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225740.jsx b/.history/src/common/components/NewOrderForm_20250227225740.jsx new file mode 100644 index 00000000..613e2337 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225740.jsx @@ -0,0 +1,62 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + +
+ Selected program budget: 4 +
+ + + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225812.jsx b/.history/src/common/components/NewOrderForm_20250227225812.jsx new file mode 100644 index 00000000..a7c73495 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225812.jsx @@ -0,0 +1,62 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + +
+ Selected program budget: 4 +
+ + + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225821.jsx b/.history/src/common/components/NewOrderForm_20250227225821.jsx new file mode 100644 index 00000000..7826d055 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225821.jsx @@ -0,0 +1,62 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + +
+ Selected program budget: 4 +
+ + + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225841.jsx b/.history/src/common/components/NewOrderForm_20250227225841.jsx new file mode 100644 index 00000000..f67aa682 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225841.jsx @@ -0,0 +1,62 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + +
+ Selected program budget: 4 +
+ + + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225926.jsx b/.history/src/common/components/NewOrderForm_20250227225926.jsx new file mode 100644 index 00000000..f67aa682 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225926.jsx @@ -0,0 +1,62 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleOrderNameChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + +
+ Selected program budget: 4 +
+ + + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227225955.jsx b/.history/src/common/components/NewOrderForm_20250227225955.jsx new file mode 100644 index 00000000..1348b4d2 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227225955.jsx @@ -0,0 +1,62 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleBudgetChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + +
+ Selected program budget: 4 +
+ + + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227230210.jsx b/.history/src/common/components/NewOrderForm_20250227230210.jsx new file mode 100644 index 00000000..5e97347a --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227230210.jsx @@ -0,0 +1,82 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleBudgetChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + {/* Program Budget Field - Dropdown */} + +
+ Selected program budget: 4 +
+ {/* Link Field - Text Input */} + + {/* PPU Field - Text Input */} + + {/* Quantity Field - Text Input */} + + {/* Priority Level Field - Dropdown */} + + {/* Reason for Buying Field - Text Field */} + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227230227.jsx b/.history/src/common/components/NewOrderForm_20250227230227.jsx new file mode 100644 index 00000000..f9eb1c02 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227230227.jsx @@ -0,0 +1,82 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleBudgetChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + {/* Program Budget Field - Dropdown */} + +
+ Selected program budget: 4 +
+ {/* Link Field - Text Input */} + + {/* PPU Field - Text Input */} + + {/* Quantity Field - Text Input */} + + {/* Priority Level Field - Dropdown */} + + {/* Reason for Buying Field - Text Field */} + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227230244.jsx b/.history/src/common/components/NewOrderForm_20250227230244.jsx new file mode 100644 index 00000000..5722f1f1 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227230244.jsx @@ -0,0 +1,82 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleBudgetChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + {/* Program Budget Field - Dropdown */} + +
+ Selected program budget: 4 +
+ {/* Link Field - Text Input */} + + {/* PPU Field - Text Input */} + + {/* Quantity Field - Text Input */} + + {/* Priority Level Field - Dropdown */} + + {/* Reason for Buying Field - Text Field */} + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227230408.jsx b/.history/src/common/components/NewOrderForm_20250227230408.jsx new file mode 100644 index 00000000..3a15b7a2 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227230408.jsx @@ -0,0 +1,82 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleBudgetChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + {/* Program Budget Field - Dropdown */} + +
+ Selected program budget: 4 +
+ {/* Link Field - Text Input */} + + {/* PPU Field - Text Input */} + + {/* Quantity Field - Text Input */} + + {/* Priority Level Field - Dropdown */} + + {/* Reason for Buying Field - Text Field */} + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227230530.jsx b/.history/src/common/components/NewOrderForm_20250227230530.jsx new file mode 100644 index 00000000..75813afe --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227230530.jsx @@ -0,0 +1,82 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleBudgetChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + {/* Program Budget Field - Dropdown */} + +
+ Selected program budget: 4 +
+ {/* Link Field - Text Input */} + + {/* PPU Field - Text Input */} + + {/* Quantity Field - Text Input */} + + {/* Priority Level Field - Dropdown */} + + {/* Reason for Buying Field - Text Field */} + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227230539.jsx b/.history/src/common/components/NewOrderForm_20250227230539.jsx new file mode 100644 index 00000000..5ea061c6 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227230539.jsx @@ -0,0 +1,82 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleBudgetChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + {/* Program Budget Field - Dropdown */} + +
+ Selected program budget: 4 +
+ {/* Link Field - Text Input */} + + {/* PPU Field - Text Input */} + + {/* Quantity Field - Text Input */} + + {/* Priority Level Field - Dropdown */} + + {/* Reason for Buying Field - Text Field */} + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227230540.jsx b/.history/src/common/components/NewOrderForm_20250227230540.jsx new file mode 100644 index 00000000..b395a194 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227230540.jsx @@ -0,0 +1,82 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleBudgetChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + {/* Program Budget Field - Dropdown */} + +
+ Selected program budget: 4 +
+ {/* Link Field - Text Input */} + + {/* PPU Field - Text Input */} + + {/* Quantity Field - Text Input */} + + {/* Priority Level Field - Dropdown */} + + {/* Reason for Buying Field - Text Field */} + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227230559.jsx b/.history/src/common/components/NewOrderForm_20250227230559.jsx new file mode 100644 index 00000000..be5c090d --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227230559.jsx @@ -0,0 +1,82 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleBudgetChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + {/* Program Budget Field - Dropdown */} + +
+ Selected program budget: 4 +
+ {/* Link Field - Text Input */} + + {/* PPU Field - Text Input */} + + {/* Quantity Field - Text Input */} + + {/* Priority Level Field - Dropdown */} + + {/* Reason for Buying Field - Text Field */} + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227230614.jsx b/.history/src/common/components/NewOrderForm_20250227230614.jsx new file mode 100644 index 00000000..22fd1134 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227230614.jsx @@ -0,0 +1,82 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleBudgetChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + {/* Program Budget Field - Dropdown */} + +
+ Selected program budget: 4 +
+ {/* Link Field - Text Input */} + + {/* PPU Field - Text Input */} + + {/* Quantity Field - Text Input */} + + {/* Priority Level Field - Dropdown */} + + {/* Reason for Buying Field - Text Field */} + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227230746.jsx b/.history/src/common/components/NewOrderForm_20250227230746.jsx new file mode 100644 index 00000000..ced8be80 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227230746.jsx @@ -0,0 +1,82 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + + const handleBudgetChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { orderName, orderDescription }); + }; + + // const guidelinesLink = ; + + return ( + + {/* Program Budget Field - Dropdown */} + +
+ Selected program budget: 4 +
+ {/* Link Field - Text Input */} + + {/* PPU Field - Text Input */} + + {/* Quantity Field - Text Input */} + + {/* Priority Level Field - Dropdown */} + + {/* Reason for Buying Field - Text Field */} + +
+ ); +} diff --git a/.history/src/common/components/NewOrderForm_20250227230855.jsx b/.history/src/common/components/NewOrderForm_20250227230855.jsx new file mode 100644 index 00000000..8df6d1c9 --- /dev/null +++ b/.history/src/common/components/NewOrderForm_20250227230855.jsx @@ -0,0 +1,112 @@ +import React, { useState } from 'react'; + +import FormPopup from './FormPopup'; +import { Input } from './form/Input'; + +export default function NewOrderForm() { + const [orderName, setOrderName] = useState(''); + const [orderDescription, setOrderDescription] = useState(''); + const [reasonForBuying, setReasonForBuying] = useState(''); + + const handleBudgetChange = (e) => setOrderName(e.target.value); + const handleOrderDescriptionChange = (e) => + setOrderDescription(e.target.value); + const handleReasonForBuyingChange = (e) => setReasonForBuying(e.target.value); + + const handleSubmit = (e) => { + e.preventDefault(); + // Handle new order logic here + console.log('New order created:', { + orderName, + orderDescription, + reasonForBuying, + }); + }; + + // const guidelinesLink = ; + + return ( + + {/* Program Budget Field - Dropdown */} + +
+ Selected program budget: 4 +
+ {/* Link Field - Text Input */} + + {/* PPU Field - Text Input */} + + {/* Quantity Field - Text Input */} + + {/* Priority Level Field - Dropdown */} + + {/* Reason for Buying Field - Textarea */} +
+ +