From ac917e6e26ca0822fefee8eb7d183c89fe0f5a51 Mon Sep 17 00:00:00 2001 From: QkoSad Date: Mon, 7 Nov 2022 19:37:10 +0200 Subject: [PATCH] moving online --- db.json | 19 + package-lock.json | 1154 +++++++++++++++++++++++ package.json | 10 +- public/index.html | 25 +- src/App.css | 38 - src/App.js | 48 +- src/App.test.js | 8 - src/components/FeedbackForm.jsx | 76 ++ src/components/FeedbackItem.jsx | 21 + src/components/FeedbackList.jsx | 32 + src/components/FeedbackStats.jsx | 20 + src/components/Header.jsx | 25 + src/components/assets/spinner.gif | Bin 0 -> 45404 bytes src/components/shared/AboutIconLink.jsx | 12 + src/components/shared/Button.jsx | 20 + src/components/shared/Card.jsx | 15 + src/components/shared/RatingSelect.jsx | 33 + src/components/shared/Spinner.jsx | 12 + src/context/FeedbackContext.js | 80 ++ src/data/FeedbackData.js | 18 + src/index.css | 235 ++++- src/index.js | 25 +- src/logo.svg | 1 - src/pages/AboutPage.jsx | 17 + src/reportWebVitals.js | 13 - src/setupTests.js | 5 - 26 files changed, 1829 insertions(+), 133 deletions(-) create mode 100644 db.json delete mode 100644 src/App.css delete mode 100644 src/App.test.js create mode 100644 src/components/FeedbackForm.jsx create mode 100644 src/components/FeedbackItem.jsx create mode 100644 src/components/FeedbackList.jsx create mode 100644 src/components/FeedbackStats.jsx create mode 100644 src/components/Header.jsx create mode 100644 src/components/assets/spinner.gif create mode 100644 src/components/shared/AboutIconLink.jsx create mode 100644 src/components/shared/Button.jsx create mode 100644 src/components/shared/Card.jsx create mode 100644 src/components/shared/RatingSelect.jsx create mode 100644 src/components/shared/Spinner.jsx create mode 100644 src/context/FeedbackContext.js create mode 100644 src/data/FeedbackData.js delete mode 100644 src/logo.svg create mode 100644 src/pages/AboutPage.jsx delete mode 100644 src/reportWebVitals.js delete mode 100644 src/setupTests.js diff --git a/db.json b/db.json new file mode 100644 index 0000000..0d8deb1 --- /dev/null +++ b/db.json @@ -0,0 +1,19 @@ +{ + "feedback":[ + { + "id":3, + "rating":10, + "text":"This is feedback item 3 comfing from the backend" + }, + { + "id":2, + "rating":10, + "text":"This is feedback item 2 comfing from the backend" + }, + { + "id":1, + "rating":10, + "text":"This is feedback item 1 comfing from the backend" + } + ] +} diff --git a/package-lock.json b/package-lock.json index 0bb29d6..7bd2f35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,8 +11,13 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "concurrently": "^7.5.0", + "framer-motion": "^4.1.17", + "json-server": "^0.17.1", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-icons": "^4.6.0", + "react-router-dom": "^6.4.3", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" } @@ -2132,6 +2137,21 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, "node_modules/@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -3085,6 +3105,14 @@ } } }, + "node_modules/@remix-run/router": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.3.tgz", + "integrity": "sha512-ceuyTSs7PZ/tQqi19YZNBc5X7kj1f8p+4DIyrcIYFY9h+hd1OKm4RqtiWldR9eGEvIiJfsqwM4BsuCtRIuEw6Q==", + "engines": { + "node": ">=14" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -5252,6 +5280,22 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -5777,6 +5821,148 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/concurrently": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.5.0.tgz", + "integrity": "sha512-5E3mwiS+i2JYBzr5BpXkFxOnleZTMsG+WnE/dCG4/P+oiVXrbmrBwJ2ozn4SxwB2EZDrKR568X+puVohxz3/Mg==", + "dependencies": { + "chalk": "^4.1.0", + "date-fns": "^2.29.1", + "lodash": "^4.17.21", + "rxjs": "^7.0.0", + "shell-quote": "^1.7.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^17.3.1" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/concurrently/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/concurrently/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concurrently/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/yargs": { + "version": "17.6.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.1.tgz", + "integrity": "sha512-leBuCGrL4dAd6ispNOGsJlhd0uZ6Qehkbu/B9KCR+Pxa/NVdNwi+i31lo0buCm6XxhJQFshXCD0/evfV4xfoUg==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/concurrently/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -5790,6 +5976,14 @@ "node": ">=0.8" } }, + "node_modules/connect-pause": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/connect-pause/-/connect-pause-0.1.1.tgz", + "integrity": "sha512-a1gSWQBQD73krFXdUEYJom2RTFrWUL3YvXDCRkyv//GVXc79cdW9MngtRuN9ih4FDKBtfJAJId+BbDuX+1rh2w==", + "engines": { + "node": "*" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -5864,6 +6058,18 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cosmiconfig": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", @@ -6307,6 +6513,18 @@ "node": ">=10" } }, + "node_modules/date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -6759,6 +6977,18 @@ "stackframe": "^1.3.4" } }, + "node_modules/errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "dependencies": { + "accepts": "~1.3.7", + "escape-html": "~1.0.3" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/es-abstract": { "version": "1.20.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", @@ -7731,6 +7961,28 @@ "node": ">= 0.10.0" } }, + "node_modules/express-urlrewrite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/express-urlrewrite/-/express-urlrewrite-1.4.0.tgz", + "integrity": "sha512-PI5h8JuzoweS26vFizwQl6UTF25CAHSggNv0J25Dn/IKZscJHWZzPrI5z2Y2jgOzIaw2qh8l6+/jUcig23Z2SA==", + "dependencies": { + "debug": "*", + "path-to-regexp": "^1.0.3" + } + }, + "node_modules/express-urlrewrite/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/express-urlrewrite/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, "node_modules/express/node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -8187,6 +8439,33 @@ "url": "https://www.patreon.com/infusion" } }, + "node_modules/framer-motion": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-4.1.17.tgz", + "integrity": "sha512-thx1wvKzblzbs0XaK2X0G1JuwIdARcoNOW7VVwjO8BUltzXPyONGAElLu6CiCScsOQRI7FIk/45YTFtJw5Yozw==", + "dependencies": { + "framesync": "5.3.0", + "hey-listen": "^1.0.8", + "popmotion": "9.3.6", + "style-value-types": "4.1.4", + "tslib": "^2.1.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": ">=16.8 || ^17.0.0", + "react-dom": ">=16.8 || ^17.0.0" + } + }, + "node_modules/framesync": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-5.3.0.tgz", + "integrity": "sha512-oc5m68HDO/tuK2blj7ZcdEBRx3p1PjrgHazL8GYEpvULhrtGIFbQArN6cQS2QhW8mitffaB+VYzMjDqBxxQeoA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -8531,6 +8810,11 @@ "he": "bin/he" } }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, "node_modules/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -9124,6 +9408,11 @@ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -11342,6 +11631,11 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" + }, "node_modules/js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", @@ -11425,6 +11719,14 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, + "node_modules/json-parse-helpfulerror": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", + "dependencies": { + "jju": "^1.1.0" + } + }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -11435,6 +11737,140 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "node_modules/json-server": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/json-server/-/json-server-0.17.1.tgz", + "integrity": "sha512-2cR/IAL9xX4M1Y5ONMpnvRvJ5o9gJH5GsSQs7fQHdTKTKoN4YRZu1ApQKg/4P0XzwlLyUDqTlwhPq9nsvJ9acw==", + "dependencies": { + "body-parser": "^1.19.0", + "chalk": "^4.1.2", + "compression": "^1.7.4", + "connect-pause": "^0.1.1", + "cors": "^2.8.5", + "errorhandler": "^1.5.1", + "express": "^4.17.1", + "express-urlrewrite": "^1.4.0", + "json-parse-helpfulerror": "^1.0.3", + "lodash": "^4.17.21", + "lodash-id": "^0.14.1", + "lowdb": "^1.0.0", + "method-override": "^3.0.0", + "morgan": "^1.10.0", + "nanoid": "^3.1.23", + "please-upgrade-node": "^3.2.0", + "pluralize": "^8.0.0", + "server-destroy": "^1.0.1", + "yargs": "^17.0.1" + }, + "bin": { + "json-server": "lib/cli/bin.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/json-server/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/json-server/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/json-server/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/json-server/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/json-server/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/json-server/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/json-server/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/json-server/node_modules/yargs": { + "version": "17.6.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.1.tgz", + "integrity": "sha512-leBuCGrL4dAd6ispNOGsJlhd0uZ6Qehkbu/B9KCR+Pxa/NVdNwi+i31lo0buCm6XxhJQFshXCD0/evfV4xfoUg==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/json-server/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -11592,6 +12028,14 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash-id": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/lodash-id/-/lodash-id-0.14.1.tgz", + "integrity": "sha512-ikQPBTiq/d5m6dfKQlFdIXFzvThPi2Be9/AHxktOnDSfSxE1j9ICbBT5Elk1ke7HSTgM38LHTpmJovo9/klnLg==", + "engines": { + "node": ">= 4" + } + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -11628,6 +12072,29 @@ "loose-envify": "cli.js" } }, + "node_modules/lowdb": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", + "integrity": "sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==", + "dependencies": { + "graceful-fs": "^4.1.3", + "is-promise": "^2.1.0", + "lodash": "4", + "pify": "^3.0.0", + "steno": "^0.4.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lowdb/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "engines": { + "node": ">=4" + } + }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -11735,6 +12202,33 @@ "node": ">= 8" } }, + "node_modules/method-override": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", + "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", + "dependencies": { + "debug": "3.1.0", + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/method-override/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/method-override/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -11903,6 +12397,45 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -12558,6 +13091,33 @@ "node": ">=4" } }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/popmotion": { + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-9.3.6.tgz", + "integrity": "sha512-ZTbXiu6zIggXzIliMi8LGxXBF5ST+wkpXGEjeTUDUOCdSQ356hij/xjeUdv0F8zCQNeqB1+PR5/BB+gC+QLAPw==", + "dependencies": { + "framesync": "5.3.0", + "hey-listen": "^1.0.8", + "style-value-types": "4.1.4", + "tslib": "^2.1.0" + } + }, "node_modules/postcss": { "version": "8.4.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", @@ -14123,6 +14683,14 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, + "node_modules/react-icons": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.6.0.tgz", + "integrity": "sha512-rR/L9m9340yO8yv1QT1QurxWQvWpbNHqVX0fzMln2HEb9TEIrQRGsqiNFQfiv9/JEUbyHmHPlNTB2LWm2Ttz0g==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -14136,6 +14704,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.4.3.tgz", + "integrity": "sha512-BT6DoGn6aV1FVP5yfODMOiieakp3z46P1Fk0RNzJMACzE7C339sFuHebfvWtnB4pzBvXXkHP2vscJzWRuUjTtA==", + "dependencies": { + "@remix-run/router": "1.0.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.4.3.tgz", + "integrity": "sha512-MiaYQU8CwVCaOfJdYvt84KQNjT78VF0TJrA17SIQgNHRvLnXDJO6qsFqq8F/zzB1BWZjCFIrQpu4QxcshitziQ==", + "dependencies": { + "@remix-run/router": "1.0.3", + "react-router": "6.4.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -14625,6 +15223,14 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -14775,6 +15381,11 @@ "node": ">=10" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -14908,6 +15519,11 @@ "node": ">= 0.8.0" } }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -15044,6 +15660,11 @@ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, + "node_modules/spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==" + }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -15115,6 +15736,14 @@ "node": ">= 0.8" } }, + "node_modules/steno": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", + "integrity": "sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==", + "dependencies": { + "graceful-fs": "^4.1.3" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -15287,6 +15916,15 @@ "webpack": "^5.0.0" } }, + "node_modules/style-value-types": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-4.1.4.tgz", + "integrity": "sha512-LCJL6tB+vPSUoxgUBt9juXIlNJHtBMy8jkXzUJSBzeHWdBu6lhzHqCvLVkXFGsFIlNa2ln1sQHya/gzaFmB2Lg==", + "dependencies": { + "hey-listen": "^1.0.8", + "tslib": "^2.1.0" + } + }, "node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -15697,6 +16335,14 @@ "node": ">=8" } }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", @@ -18335,6 +18981,21 @@ "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", "requires": {} }, + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "requires": { + "@emotion/memoize": "0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, "@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -19023,6 +19684,11 @@ "source-map": "^0.7.3" } }, + "@remix-run/router": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.3.tgz", + "integrity": "sha512-ceuyTSs7PZ/tQqi19YZNBc5X7kj1f8p+4DIyrcIYFY9h+hd1OKm4RqtiWldR9eGEvIiJfsqwM4BsuCtRIuEw6Q==" + }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -20648,6 +21314,21 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -21055,6 +21736,106 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "concurrently": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.5.0.tgz", + "integrity": "sha512-5E3mwiS+i2JYBzr5BpXkFxOnleZTMsG+WnE/dCG4/P+oiVXrbmrBwJ2ozn4SxwB2EZDrKR568X+puVohxz3/Mg==", + "requires": { + "chalk": "^4.1.0", + "date-fns": "^2.29.1", + "lodash": "^4.17.21", + "rxjs": "^7.0.0", + "shell-quote": "^1.7.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^17.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs": { + "version": "17.6.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.1.tgz", + "integrity": "sha512-leBuCGrL4dAd6ispNOGsJlhd0uZ6Qehkbu/B9KCR+Pxa/NVdNwi+i31lo0buCm6XxhJQFshXCD0/evfV4xfoUg==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } + } + }, "confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -21065,6 +21846,11 @@ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" }, + "connect-pause": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/connect-pause/-/connect-pause-0.1.1.tgz", + "integrity": "sha512-a1gSWQBQD73krFXdUEYJom2RTFrWUL3YvXDCRkyv//GVXc79cdW9MngtRuN9ih4FDKBtfJAJId+BbDuX+1rh2w==" + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -21116,6 +21902,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cosmiconfig": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", @@ -21415,6 +22210,11 @@ "whatwg-url": "^8.0.0" } }, + "date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -21755,6 +22555,15 @@ "stackframe": "^1.3.4" } }, + "errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "requires": { + "accepts": "~1.3.7", + "escape-html": "~1.0.3" + } + }, "es-abstract": { "version": "1.20.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", @@ -22485,6 +23294,30 @@ } } }, + "express-urlrewrite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/express-urlrewrite/-/express-urlrewrite-1.4.0.tgz", + "integrity": "sha512-PI5h8JuzoweS26vFizwQl6UTF25CAHSggNv0J25Dn/IKZscJHWZzPrI5z2Y2jgOzIaw2qh8l6+/jUcig23Z2SA==", + "requires": { + "debug": "*", + "path-to-regexp": "^1.0.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + } + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -22800,6 +23633,27 @@ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" }, + "framer-motion": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-4.1.17.tgz", + "integrity": "sha512-thx1wvKzblzbs0XaK2X0G1JuwIdARcoNOW7VVwjO8BUltzXPyONGAElLu6CiCScsOQRI7FIk/45YTFtJw5Yozw==", + "requires": { + "@emotion/is-prop-valid": "^0.8.2", + "framesync": "5.3.0", + "hey-listen": "^1.0.8", + "popmotion": "9.3.6", + "style-value-types": "4.1.4", + "tslib": "^2.1.0" + } + }, + "framesync": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-5.3.0.tgz", + "integrity": "sha512-oc5m68HDO/tuK2blj7ZcdEBRx3p1PjrgHazL8GYEpvULhrtGIFbQArN6cQS2QhW8mitffaB+VYzMjDqBxxQeoA==", + "requires": { + "tslib": "^2.1.0" + } + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -23040,6 +23894,11 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, + "hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, "hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -23450,6 +24309,11 @@ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -25062,6 +25926,11 @@ } } }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" + }, "js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", @@ -25125,6 +25994,14 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, + "json-parse-helpfulerror": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", + "requires": { + "jju": "^1.1.0" + } + }, "json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -25135,6 +26012,106 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "json-server": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/json-server/-/json-server-0.17.1.tgz", + "integrity": "sha512-2cR/IAL9xX4M1Y5ONMpnvRvJ5o9gJH5GsSQs7fQHdTKTKoN4YRZu1ApQKg/4P0XzwlLyUDqTlwhPq9nsvJ9acw==", + "requires": { + "body-parser": "^1.19.0", + "chalk": "^4.1.2", + "compression": "^1.7.4", + "connect-pause": "^0.1.1", + "cors": "^2.8.5", + "errorhandler": "^1.5.1", + "express": "^4.17.1", + "express-urlrewrite": "^1.4.0", + "json-parse-helpfulerror": "^1.0.3", + "lodash": "^4.17.21", + "lodash-id": "^0.14.1", + "lowdb": "^1.0.0", + "method-override": "^3.0.0", + "morgan": "^1.10.0", + "nanoid": "^3.1.23", + "please-upgrade-node": "^3.2.0", + "pluralize": "^8.0.0", + "server-destroy": "^1.0.1", + "yargs": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs": { + "version": "17.6.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.1.tgz", + "integrity": "sha512-leBuCGrL4dAd6ispNOGsJlhd0uZ6Qehkbu/B9KCR+Pxa/NVdNwi+i31lo0buCm6XxhJQFshXCD0/evfV4xfoUg==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } + } + }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -25248,6 +26225,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash-id": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/lodash-id/-/lodash-id-0.14.1.tgz", + "integrity": "sha512-ikQPBTiq/d5m6dfKQlFdIXFzvThPi2Be9/AHxktOnDSfSxE1j9ICbBT5Elk1ke7HSTgM38LHTpmJovo9/klnLg==" + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -25281,6 +26263,25 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lowdb": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", + "integrity": "sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==", + "requires": { + "graceful-fs": "^4.1.3", + "is-promise": "^2.1.0", + "lodash": "4", + "pify": "^3.0.0", + "steno": "^0.4.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" + } + } + }, "lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -25366,6 +26367,32 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, + "method-override": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", + "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", + "requires": { + "debug": "3.1.0", + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -25479,6 +26506,41 @@ "minimist": "^1.2.6" } }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "requires": { + "ee-first": "1.1.1" + } + } + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -25943,6 +27005,30 @@ } } }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "requires": { + "semver-compare": "^1.0.0" + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==" + }, + "popmotion": { + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-9.3.6.tgz", + "integrity": "sha512-ZTbXiu6zIggXzIliMi8LGxXBF5ST+wkpXGEjeTUDUOCdSQ356hij/xjeUdv0F8zCQNeqB1+PR5/BB+gC+QLAPw==", + "requires": { + "framesync": "5.3.0", + "hey-listen": "^1.0.8", + "style-value-types": "4.1.4", + "tslib": "^2.1.0" + } + }, "postcss": { "version": "8.4.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", @@ -26893,6 +27979,12 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, + "react-icons": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.6.0.tgz", + "integrity": "sha512-rR/L9m9340yO8yv1QT1QurxWQvWpbNHqVX0fzMln2HEb9TEIrQRGsqiNFQfiv9/JEUbyHmHPlNTB2LWm2Ttz0g==", + "requires": {} + }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -26903,6 +27995,23 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" }, + "react-router": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.4.3.tgz", + "integrity": "sha512-BT6DoGn6aV1FVP5yfODMOiieakp3z46P1Fk0RNzJMACzE7C339sFuHebfvWtnB4pzBvXXkHP2vscJzWRuUjTtA==", + "requires": { + "@remix-run/router": "1.0.3" + } + }, + "react-router-dom": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.4.3.tgz", + "integrity": "sha512-MiaYQU8CwVCaOfJdYvt84KQNjT78VF0TJrA17SIQgNHRvLnXDJO6qsFqq8F/zzB1BWZjCFIrQpu4QxcshitziQ==", + "requires": { + "@remix-run/router": "1.0.3", + "react-router": "6.4.3" + } + }, "react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -27251,6 +28360,14 @@ "queue-microtask": "^1.2.2" } }, + "rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "requires": { + "tslib": "^2.1.0" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -27337,6 +28454,11 @@ "lru-cache": "^6.0.0" } }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, "send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -27458,6 +28580,11 @@ "send": "0.18.0" } }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==" + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -27562,6 +28689,11 @@ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==" + }, "spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -27622,6 +28754,14 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, + "steno": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", + "integrity": "sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==", + "requires": { + "graceful-fs": "^4.1.3" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -27748,6 +28888,15 @@ "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", "requires": {} }, + "style-value-types": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-4.1.4.tgz", + "integrity": "sha512-LCJL6tB+vPSUoxgUBt9juXIlNJHtBMy8jkXzUJSBzeHWdBu6lhzHqCvLVkXFGsFIlNa2ln1sQHya/gzaFmB2Lg==", + "requires": { + "hey-listen": "^1.0.8", + "tslib": "^2.1.0" + } + }, "stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -28053,6 +29202,11 @@ "punycode": "^2.1.1" } }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" + }, "tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", diff --git a/package.json b/package.json index 295f573..0dbce7a 100644 --- a/package.json +++ b/package.json @@ -2,12 +2,18 @@ "name": "feed-app", "version": "0.1.0", "private": true, + "proxy":"http://localhost:5000", "dependencies": { "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "concurrently": "^7.5.0", + "framer-motion": "^4.1.17", + "json-server": "^0.17.1", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-icons": "^4.6.0", + "react-router-dom": "^6.4.3", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" }, @@ -15,7 +21,9 @@ "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", - "eject": "react-scripts eject" + "eject": "react-scripts eject", + "server": "json-server --watch db.json --port 5000", + "dev": "concurrently \"npm run server\" \"npm start\"" }, "eslintConfig": { "extends": [ diff --git a/public/index.html b/public/index.html index aa069f2..5d10976 100644 --- a/public/index.html +++ b/public/index.html @@ -10,34 +10,11 @@ content="Web site created using create-react-app" /> - - - React App + Feedback UI
- diff --git a/src/App.css b/src/App.css deleted file mode 100644 index 74b5e05..0000000 --- a/src/App.css +++ /dev/null @@ -1,38 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/src/App.js b/src/App.js index 3784575..28c55e0 100644 --- a/src/App.js +++ b/src/App.js @@ -1,24 +1,36 @@ -import logo from './logo.svg'; -import './App.css'; +import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; +import Header from "./components/Header"; +import FeedbackList from "./components/FeedbackList"; +import FeedbackStats from "./components/FeedbackStats"; +import FeedbackForm from "./components/FeedbackForm"; +import AboutPage from "./pages/AboutPage"; +import AboutIconLink from "./components/shared/AboutIconLink"; +import { FeedbackProvider } from "./context/FeedbackContext"; function App() { return ( -
-
- logo -

- Edit src/App.js and save to reload. -

- - Learn React - -
-
+ + +
+
+ + + + + + + } + > + } /> + + +
+ + ); } diff --git a/src/App.test.js b/src/App.test.js deleted file mode 100644 index 1f03afe..0000000 --- a/src/App.test.js +++ /dev/null @@ -1,8 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import App from './App'; - -test('renders learn react link', () => { - render(); - const linkElement = screen.getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); -}); diff --git a/src/components/FeedbackForm.jsx b/src/components/FeedbackForm.jsx new file mode 100644 index 0000000..ea0c324 --- /dev/null +++ b/src/components/FeedbackForm.jsx @@ -0,0 +1,76 @@ +import { useState, useContext, useEffect } from "react"; +import FeedbackContext from "../context/FeedbackContext"; +import Card from "./shared/Card"; +import Button from "./shared/Button"; +import RatingSelect from "./shared/RatingSelect"; + +function FeedbackForm() { + const [text, setText] = useState(""); + const [btnDisabled, setBtnDisabled] = useState(true); + const [rating, setRating] = useState(10); + const [message, setMessage] = useState(""); + + const { addFeedback, updateFeedback, feedbackEdit } = + useContext(FeedbackContext); + + useEffect(() => { + if (feedbackEdit.edit === true) { + setBtnDisabled(false); + setText(feedbackEdit.item.text); + setRating(feedbackEdit.item.rating); + } + }, [feedbackEdit]); + + const handleTextChange = ({target:{value}}) => { + if (value === "") { + setBtnDisabled(true); + setMessage(null); + } else if (value.trim().length<10){ + setMessage("Text must be at least 10 characters"); + setBtnDisabled(true); + } else { + setMessage(null); + setBtnDisabled(false); + } + setText(value) + }; + + const handleSubmit = (e) => { + e.preventDefault(); + if (text.trim().length > 10) { + const newFeedback = { + text, + rating, + }; + if (feedbackEdit.edit === true) { + updateFeedback(feedbackEdit.item.id, newFeedback); + } else { + addFeedback(newFeedback); + } + setText(""); + } + }; + + return ( + +
+

How would you rate your service with us?

+ setRating(rating)} /> +
+ + +
+ {message &&
{message}
} + +
+ ); +} + +export default FeedbackForm; diff --git a/src/components/FeedbackItem.jsx b/src/components/FeedbackItem.jsx new file mode 100644 index 0000000..5583ef8 --- /dev/null +++ b/src/components/FeedbackItem.jsx @@ -0,0 +1,21 @@ +import { FaTimes, FaEdit } from "react-icons/fa"; +import { useContext } from "react"; +import Card from "./shared/Card" +import FeedbackContext from "../context/FeedbackContext"; + +function FeedbackItem({ item }) { + const { deleteFeedback, editFeedback } = useContext(FeedbackContext); + return ( + +
{item.rating}
+ + +
{item.text}
+
+ ); +} +export default FeedbackItem; diff --git a/src/components/FeedbackList.jsx b/src/components/FeedbackList.jsx new file mode 100644 index 0000000..f33455e --- /dev/null +++ b/src/components/FeedbackList.jsx @@ -0,0 +1,32 @@ +import { useContext } from "react"; +import { AnimatePresence, motion } from "framer-motion"; +import FeedbackItem from "./FeedbackItem"; +import Spinner from "./shared/Spinner"; +import FeedbackContext from "../context/FeedbackContext"; + +function FeedbackList() { + const { feedback, isLoading } = useContext(FeedbackContext); + if (!isLoading && (!feedback || feedback.length === 0)) { + return

No Feedback Yet

; + } + return isLoading ? ( + + ) : ( +
+ + {feedback.map((item) => ( + + + + ))} + +
+ ); +} + +export default FeedbackList; diff --git a/src/components/FeedbackStats.jsx b/src/components/FeedbackStats.jsx new file mode 100644 index 0000000..d3de45f --- /dev/null +++ b/src/components/FeedbackStats.jsx @@ -0,0 +1,20 @@ +import { useContext } from "react"; +import FeedbackContext from "../context/FeedbackContext"; + +function FeedbackStats() { + const { feedback } = useContext(FeedbackContext); + let average = + feedback.reduce((acc, cur) => { + return acc + cur.rating; + }, 0) / feedback.length; + + average = average.toFixed(1).replace(/[.,]0$/, ""); + return ( +
+

{feedback.length} Reviews

+

Average Rating: {isNaN(average) ? 0 : average}

+
+ ); +} + +export default FeedbackStats; diff --git a/src/components/Header.jsx b/src/components/Header.jsx new file mode 100644 index 0000000..f2782b0 --- /dev/null +++ b/src/components/Header.jsx @@ -0,0 +1,25 @@ +import PropTypes from "prop-types" +function Header ({text,bgColor,textColor}){ +const headerStyles = { + color: textColor, + backgroundColor:bgColor +} + return( +
+

{text}

+
+ ) +} + +Header.defaultProps = { + text:"FeedBack UI", + bgColor:'rgba(0,0,0,0.4)', + textColor: '#ff6a95', +} +Header.propTypes = { + text: PropTypes.string, + bgColor:PropTypes.string, + textColor: PropTypes.string +} + +export default Header diff --git a/src/components/assets/spinner.gif b/src/components/assets/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..9590093e9e6d32e5605452cc6cdffee3df0d0abb GIT binary patch literal 45404 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 F8UT4AXr%xE literal 0 HcmV?d00001 diff --git a/src/components/shared/AboutIconLink.jsx b/src/components/shared/AboutIconLink.jsx new file mode 100644 index 0000000..02439b5 --- /dev/null +++ b/src/components/shared/AboutIconLink.jsx @@ -0,0 +1,12 @@ +import { Link } from "react-router-dom"; +import { FaQuestion } from "react-icons/fa"; +function AboutIconLink() { + return ( +
+ + + +
+ ); +} +export default AboutIconLink; diff --git a/src/components/shared/Button.jsx b/src/components/shared/Button.jsx new file mode 100644 index 0000000..a744608 --- /dev/null +++ b/src/components/shared/Button.jsx @@ -0,0 +1,20 @@ +import PropTypes from 'prop-types' +function Button ({children, version, type, isDisabled}){ + return ( + + ) +} + Button.defaultProps={ + version: 'primavry', + type: 'button' + , + isDisabled:false + } +Button.propTypes ={ + children: PropTypes.node.isRequired, + version:PropTypes.string, + type:PropTypes.string, + isDisabled:PropTypes.bool +} +export default Button; diff --git a/src/components/shared/Card.jsx b/src/components/shared/Card.jsx new file mode 100644 index 0000000..35026c0 --- /dev/null +++ b/src/components/shared/Card.jsx @@ -0,0 +1,15 @@ +import PropTypes from 'prop-types' +function Card({children, reverse}){ + //return (
{children}
) + return (
{children}
) + +} +Card.defaultProps = { + reverse:false +} +Card.propTypes={ + children:PropTypes.node.isRequired, + reverse:PropTypes.bool +} +export default Card; diff --git a/src/components/shared/RatingSelect.jsx b/src/components/shared/RatingSelect.jsx new file mode 100644 index 0000000..1be07e5 --- /dev/null +++ b/src/components/shared/RatingSelect.jsx @@ -0,0 +1,33 @@ +import { useEffect,useState ,useContext} from "react"; +import FeedbackContext from "../../context/FeedbackContext"; + +function RatingSelect({ select }) { + const [selected, setSelected] = useState(10); + const { feedbackEdit } = useContext(FeedbackContext); + const handleChange = (e) => { + setSelected(+e.currentTarget.value); + select(+e.currentTarget.value); + }; + useEffect(()=>{ + setSelected(feedbackEdit.item.rating) + },[feedbackEdit]) + return ( +
    + {Array.from({ length: 10 }, (_, i) => ( +
  • + + +
  • + ))} +
+ ); +} + +export default RatingSelect; diff --git a/src/components/shared/Spinner.jsx b/src/components/shared/Spinner.jsx new file mode 100644 index 0000000..6f3b28a --- /dev/null +++ b/src/components/shared/Spinner.jsx @@ -0,0 +1,12 @@ +import spinner from "../assets/spinner.gif"; + +function Spinner() { + return ( + Loading... + ); +} +export default Spinner diff --git a/src/context/FeedbackContext.js b/src/context/FeedbackContext.js new file mode 100644 index 0000000..d9f6085 --- /dev/null +++ b/src/context/FeedbackContext.js @@ -0,0 +1,80 @@ +import { createContext, useState, useEffect } from "react"; + +const FeedbackContext = createContext(); + +export const FeedbackProvider = ({ children }) => { + const [isloading, setIsLoading] = useState(true); + const [feedback, setFeedback] = useState([]); + const [feedbackEdit, setFeedbackEdit] = useState({ + item: {}, + edit: false, + }); + + useEffect(() => { + fetchFeedback(); + }, []); + + // Fetch feedback + const fetchFeedback = async () => { + const response = await fetch(`/feedback?_sort=id&_order=desc`); + const data = await response.json(); + setFeedback(data); + setIsLoading(false); + }; + + const addFeedback = async (newFeedback) => { + const response = await fetch("/feedback", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(newFeedback), + }); + const data = await response.json(); + setFeedback([data, ...feedback]); + }; + + const deleteFeedback = async (id) => { + if (window.confirm("Are you sure you want to delete?")) { + await fetch(`/feedback/${id}`, { method: "DELETE" }); + setFeedback(feedback.filter((item) => item.id !== id)); + } + }; + const updateFeedback = async (id, updItem) => { + const response = await fetch(`/feedback/${id}`, { + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(updItem), + }); + + const data = await response.json(); + setFeedback(feedback.map((item) => (item.id === id ? data : item))); + setFeedbackEdit({ item: {}, edit: false }); + }; + + //set item to be updated + const editFeedback = (item) => { + setFeedbackEdit({ + item, + edit: true, + }); + }; + + return ( + + {children} + + ); +}; + +export default FeedbackContext; diff --git a/src/data/FeedbackData.js b/src/data/FeedbackData.js new file mode 100644 index 0000000..53a25fb --- /dev/null +++ b/src/data/FeedbackData.js @@ -0,0 +1,18 @@ +const FeedbackData = [ + { + id: 1, + rating: 10, + text: "Lorem ipsum dolor sit amet consectetur adipisicing elit. consequuntur vel vitae commodi alias voluptatem est voluptatum ipsa quae.", + }, + { + id: 2, + rating: 9, + text: "Lorem ipsum dolor sit amet consectetur adipisicing elit. consequuntur vel vitae commodi alias voluptatem est voluptatum ipsa quae.", + }, + { + id: 3, + rating: 8, + text: "Lorem ipsum dolor sit amet consectetur adipisicing elit. consequuntur vel vitae commodi alias voluptatem est voluptatum ipsa quae.", + }, +]; +export default FeedbackData; diff --git a/src/index.css b/src/index.css index ec2585e..00ce88e 100644 --- a/src/index.css +++ b/src/index.css @@ -1,13 +1,230 @@ -body { +@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;600;700&display=swap'); + +* { + box-sizing: border-box; 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; + padding: 0; } -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; +body { + font-family: 'Poppins', sans-serif; + background-color: #202142; + color: #fff; + line-height: 1.6; +} + +ul { + list-style: none; +} + +.container { + max-width: 768px; + margin: auto; + padding: 0 20px; +} + +header { + height: 70px; + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 30px; +} + +.card { + background-color: #fff; + color: #333; + border-radius: 15px; + padding: 40px 50px; + margin: 20px 0; + position: relative; +} + +.card.reverse { + background-color: rgba(0, 0, 0, 0.4); + color: #fff; +} + +.card h2 { + font-size: 22px; + font-weight: 600; + text-align: center; +} + +.rating { + display: flex; + align-items: center; + justify-content: space-around; + margin: 30px 0 40px; +} + +.rating li, +.num-display { + position: relative; + background: #f4f4f4; + width: 50px; + height: 50px; + padding: 10px; + text-align: center; + border-radius: 50%; + font-size: 19px; + border: 1px #eee solid; + transition: 0.3s; +} + +.rating li label { + position: absolute; + top: 50%; + left: 50%; + width: 50px; + height: 50px; + padding: 10px; + border-radius: 50%; + transform: translate(-50%, -50%); + cursor: pointer; +} + +.rating li:hover, +.num-display { + background: #ff6a95; + color: #fff; +} + +[type='radio'] { + opacity: 0; +} + +[type='radio']:checked ~ label { + background: #ff6a95; + color: #fff; +} + +.input-group { + display: flex; + flex-direction: row; + border: 1px solid #ccc; + padding: 8px 10px; + border-radius: 8px; +} + +input { + flex-grow: 2; + border: none; + font-size: 16px; +} + +input:focus { + outline: none; +} + +.feedback-stats { + color: #fff; + display: flex; + justify-content: space-between; + align-items: center; +} + +.num-display { + position: absolute; + top: -10px; + left: -10px; +} + +.close, +.edit { + position: absolute; + top: 10px; + right: 20px; + cursor: pointer; + background: none; + border: none; +} + +.edit { + right: 40px; +} + +.btn { + color: #fff; + border: 0; + border-radius: 8px; + color: #fff; + width: 100px; + height: 40px; + cursor: pointer; +} + +.btn-primary { + background-color: #202142; +} + +.btn-secondary { + background: #ff6a95; +} + +.btn:hover { + transform: scale(0.98); + opacity: 0.9; +} + +.btn:disabled { + background-color: #cccccc; + color: #333; + cursor: auto; +} + +.btn:disabled:hover { + transform: scale(1); + opacity: 1; +} + +.message { + padding-top: 10px; + text-align: center; + color: rebeccapurple; +} + +/* FIX: Remove position: absolute to keep about icon at the bottom of the + * document */ +.about-link { + display: flex; + justify-content: flex-end; +} + +/* FIX: Remove position: absolute to keep about icon at the bottom of the + * document */ +.about-link a { + color: #fff; + cursor: pointer; +} + +.about-link a:hover { + color: #ff6a95; +} + +.about h1 { + margin-bottom: 20px; +} + +.about p { + margin: 10px 0; +} + +@media (max-width: 600px) { + .rating li { + margin: 10px 3px; + } + + .rating { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + margin: 30px 0 40px; + } + + .input-group input { + width: 80%; + } } diff --git a/src/index.js b/src/index.js index d563c0f..906b191 100644 --- a/src/index.js +++ b/src/index.js @@ -1,17 +1,10 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import './index.css'; -import App from './App'; -import reportWebVitals from './reportWebVitals'; - -const root = ReactDOM.createRoot(document.getElementById('root')); +import ReactDOM from "react-dom/client"; +import React from "react"; +import App from "./App"; +import './index.css' +const container = document.getElementById('root') +const root = ReactDOM.createRoot(container) root.render( - - - -); - -// If you want to start measuring performance in your app, pass a function -// to log results (for example: reportWebVitals(console.log)) -// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals -reportWebVitals(); + + + ) diff --git a/src/logo.svg b/src/logo.svg deleted file mode 100644 index 9dfc1c0..0000000 --- a/src/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/pages/AboutPage.jsx b/src/pages/AboutPage.jsx new file mode 100644 index 0000000..147b615 --- /dev/null +++ b/src/pages/AboutPage.jsx @@ -0,0 +1,17 @@ +import { Link } from "react-router-dom"; +import Card from "../components/shared/Card"; +function AboutPage() { + return ( + +
+

About this Project

+

This is a React app to leave a feedback for a product or servicec

+

Version: 1.0.0

+

+ Back to Home +

+
+
+ ); +} +export default AboutPage; diff --git a/src/reportWebVitals.js b/src/reportWebVitals.js deleted file mode 100644 index 5253d3a..0000000 --- a/src/reportWebVitals.js +++ /dev/null @@ -1,13 +0,0 @@ -const reportWebVitals = onPerfEntry => { - if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { - getCLS(onPerfEntry); - getFID(onPerfEntry); - getFCP(onPerfEntry); - getLCP(onPerfEntry); - getTTFB(onPerfEntry); - }); - } -}; - -export default reportWebVitals; diff --git a/src/setupTests.js b/src/setupTests.js deleted file mode 100644 index 8f2609b..0000000 --- a/src/setupTests.js +++ /dev/null @@ -1,5 +0,0 @@ -// jest-dom adds custom jest matchers for asserting on DOM nodes. -// allows you to do things like: -// expect(element).toHaveTextContent(/react/i) -// learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom';