From 6b5c61de0b16373672c742b1a8f0e4193d9495ec Mon Sep 17 00:00:00 2001 From: QkoSad Date: Mon, 7 Nov 2022 19:38:16 +0200 Subject: [PATCH] moving online --- dist/output.css | 1004 ++++++++++++++++++++++ package-lock.json | 290 +++++++ package.json | 9 + postcss.config.js | 6 + public/index.html | 52 +- src/App.css | 38 - src/App.js | 52 +- src/App.test.js | 8 - src/components/layout/Alert.jsx | 31 + src/components/layout/Footer.jsx | 22 + src/components/layout/Navbar.jsx | 30 + src/components/layout/Spinner.jsx | 14 + src/components/layout/assets/spinner.gif | Bin 0 -> 45404 bytes src/components/repos/RepoItem.jsx | 48 ++ src/components/repos/RepoList.jsx | 21 + src/components/users/UserItem.jsx | 31 + src/components/users/UserResults.jsx | 20 + src/components/users/UserSearch.jsx | 60 ++ src/context/alert/AlertContext.js | 22 + src/context/alert/AlertReducer.js | 11 + src/context/github/GithubActions.js | 27 + src/context/github/GithubContext.js | 25 + src/context/github/GithubReducer.js | 30 + src/index.css | 17 +- src/index.js | 5 - src/input.css | 3 + src/logo.svg | 1 - src/pages/About.jsx | 29 + src/pages/Home.jsx | 10 + src/pages/NotFound.jsx | 19 + src/pages/User.jsx | 186 ++++ src/reportWebVitals.js | 13 - src/setupTests.js | 5 - tailwind.config.js | 10 + 34 files changed, 2005 insertions(+), 144 deletions(-) create mode 100644 dist/output.css create mode 100644 postcss.config.js delete mode 100644 src/App.css delete mode 100644 src/App.test.js create mode 100644 src/components/layout/Alert.jsx create mode 100644 src/components/layout/Footer.jsx create mode 100644 src/components/layout/Navbar.jsx create mode 100644 src/components/layout/Spinner.jsx create mode 100644 src/components/layout/assets/spinner.gif create mode 100644 src/components/repos/RepoItem.jsx create mode 100644 src/components/repos/RepoList.jsx create mode 100644 src/components/users/UserItem.jsx create mode 100644 src/components/users/UserResults.jsx create mode 100644 src/components/users/UserSearch.jsx create mode 100644 src/context/alert/AlertContext.js create mode 100644 src/context/alert/AlertReducer.js create mode 100644 src/context/github/GithubActions.js create mode 100644 src/context/github/GithubContext.js create mode 100644 src/context/github/GithubReducer.js create mode 100644 src/input.css delete mode 100644 src/logo.svg create mode 100644 src/pages/About.jsx create mode 100644 src/pages/Home.jsx create mode 100644 src/pages/NotFound.jsx create mode 100644 src/pages/User.jsx delete mode 100644 src/reportWebVitals.js delete mode 100644 src/setupTests.js create mode 100644 tailwind.config.js diff --git a/dist/output.css b/dist/output.css new file mode 100644 index 0000000..ef1f999 --- /dev/null +++ b/dist/output.css @@ -0,0 +1,1004 @@ +/* +! tailwindcss v3.2.1 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + /* 3 */ + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::-webkit-backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + +.visible { + visibility: visible; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.top-0 { + top: 0px; +} + +.right-0 { + right: 0px; +} + +.col-span-2 { + grid-column: span 2 / span 2; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.mx-1 { + margin-left: 0.25rem; + margin-right: 0.25rem; +} + +.mx-2 { + margin-left: 0.5rem; + margin-right: 0.5rem; +} + +.my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.mr-2 { + margin-right: 0.5rem; +} + +.mb-6 { + margin-bottom: 1.5rem; +} + +.mb-0 { + margin-bottom: 0px; +} + +.ml-2 { + margin-left: 0.5rem; +} + +.mr-1 { + margin-right: 0.25rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mr-3 { + margin-right: 0.75rem; +} + +.mb-12 { + margin-bottom: 3rem; +} + +.mt-20 { + margin-top: 5rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.inline-block { + display: inline-block; +} + +.inline { + display: inline; +} + +.flex { + display: flex; +} + +.grid { + display: grid; +} + +.hidden { + display: none; +} + +.h-screen { + height: 100vh; +} + +.h-6 { + height: 1.5rem; +} + +.h-14 { + height: 3.5rem; +} + +.w-full { + width: 100%; +} + +.w-6 { + width: 1.5rem; +} + +.w-14 { + width: 3.5rem; +} + +.w-36 { + width: 9rem; +} + +.max-w-lg { + max-width: 32rem; +} + +.flex-none { + flex: none; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-grow-0 { + flex-grow: 0; +} + +.grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); +} + +.flex-col { + flex-direction: column; +} + +.items-center { + align-items: center; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-between { + justify-content: space-between; +} + +.gap-8 { + gap: 2rem; +} + +.space-x-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-l-none { + border-top-left-radius: 0px; + border-bottom-left-radius: 0px; +} + +.bg-gray-700 { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity)); +} + +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.fill-current { + fill: currentColor; +} + +.stroke-current { + stroke: currentColor; +} + +.p-10 { + padding: 2.5rem; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.py-5 { + padding-top: 1.25rem; + padding-bottom: 1.25rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.pb-12 { + padding-bottom: 3rem; +} + +.pr-5 { + padding-right: 1.25rem; +} + +.pr-2 { + padding-right: 0.5rem; +} + +.pr-40 { + padding-right: 10rem; +} + +.text-center { + text-align: center; +} + +.text-6xl { + font-size: 3.75rem; + line-height: 1; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-8xl { + font-size: 6rem; + line-height: 1; +} + +.text-5xl { + font-size: 3rem; + line-height: 1; +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.font-light { + font-weight: 300; +} + +.font-bold { + font-weight: 700; +} + +.font-semibold { + font-weight: 600; +} + +.text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-black { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} + +.text-opacity-40 { + --tw-text-opacity: 0.4; +} + +.shadow-xl { + --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-md { + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +@media (min-width: 768px) { + .md\:mb-0 { + margin-bottom: 0px; + } + + .md\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .md\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .md\:gap-8 { + gap: 2rem; + } + + .md\:text-5xl { + font-size: 3rem; + line-height: 1; + } + + .md\:text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; + } +} + +@media (min-width: 1024px) { + .lg\:w-10\/12 { + width: 83.333333%; + } + + .lg\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .lg\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (min-width: 1280px) { + .xl\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .xl\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .xl\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } +} diff --git a/package-lock.json b/package-lock.json index ea93f4b..b9e1eb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,10 +11,19 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "axios": "^1.1.3", + "daisyui": "^2.38.0", "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" + }, + "devDependencies": { + "autoprefixer": "^10.4.13", + "postcss": "^8.4.18", + "tailwindcss": "^3.2.1" } }, "node_modules/@adobe/css-tools": { @@ -3085,6 +3094,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", @@ -4963,6 +4980,29 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", + "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -5667,6 +5707,18 @@ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -5680,6 +5732,31 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/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/color/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/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -6099,6 +6176,15 @@ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, + "node_modules/css-selector-tokenizer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", + "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, "node_modules/css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -6290,6 +6376,21 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, + "node_modules/daisyui": { + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-2.38.0.tgz", + "integrity": "sha512-/AIT/XrNY8QLpXnoEXU7aFv5NRU7R3NSpg13ujs+hkTlDlR8pkjsGMqTRKvMf7orCX9833VLFAFJw+CH4EORvA==", + "dependencies": { + "color": "^4.2", + "css-selector-tokenizer": "^0.8.0", + "postcss-js": "^4.0.0", + "tailwindcss": "^3" + }, + "peerDependencies": { + "autoprefixer": "^10.0.2", + "postcss": "^8.1.6" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -7791,6 +7892,11 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -13851,6 +13957,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -14140,6 +14251,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", @@ -14153,6 +14272,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", @@ -14975,6 +15124,19 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -19040,6 +19202,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", @@ -20444,6 +20611,28 @@ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.1.tgz", "integrity": "sha512-1exVbW0X1O/HSr/WMwnaweyqcWOgZgLiVxdLG34pvSQk4NlYQr9OUy0JLwuhFfuVNQzzqgH57eYzkFBCb3bIsQ==" }, + "axios": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", + "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -20975,6 +21164,30 @@ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" }, + "color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "dependencies": { + "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==" + } + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -20988,6 +21201,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -21276,6 +21498,15 @@ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, + "css-selector-tokenizer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", + "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, "css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -21418,6 +21649,17 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, + "daisyui": { + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-2.38.0.tgz", + "integrity": "sha512-/AIT/XrNY8QLpXnoEXU7aFv5NRU7R3NSpg13ujs+hkTlDlR8pkjsGMqTRKvMf7orCX9833VLFAFJw+CH4EORvA==", + "requires": { + "color": "^4.2", + "css-selector-tokenizer": "^0.8.0", + "postcss-js": "^4.0.0", + "tailwindcss": "^3" + } + }, "damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -22540,6 +22782,11 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -26718,6 +26965,11 @@ } } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -26924,6 +27176,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", @@ -26934,6 +27192,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", @@ -27527,6 +27802,21 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", diff --git a/package.json b/package.json index 7420166..a77a93b 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,12 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "axios": "^1.1.3", + "daisyui": "^2.38.0", "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" }, @@ -34,5 +38,10 @@ "last 1 firefox version", "last 1 safari version" ] + }, + "devDependencies": { + "autoprefixer": "^10.4.13", + "postcss": "^8.4.18", + "tailwindcss": "^3.2.1" } } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/index.html b/public/index.html index aa069f2..9b792a0 100644 --- a/public/index.html +++ b/public/index.html @@ -1,43 +1,11 @@ - - - - - - - - - - - - - React App - - - -
- - + + + + + + + + +
+ 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..96a9d33 100644 --- a/src/App.js +++ b/src/App.js @@ -1,25 +1,35 @@ -import logo from './logo.svg'; -import './App.css'; +import Home from "./pages/Home"; +import About from "./pages/About"; +import NotFound from "./pages/NotFound"; +import Footer from "./components/layout/Footer"; +import Navbar from "./components/layout/Navbar"; +import Alert from "./components/layout/Alert"; +import User from './pages/User' +import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; +import { GithubProvider } from "./context/github/GithubContext"; +import { AlertProvider } from "./context/alert/AlertContext"; -function App() { +export default function App() { return ( -
-
- logo -

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

- - Learn React - -
-
+ + + +
+ +
+ + + } /> + } /> + } /> + } /> + } /> + +
+
+
+
+
+
); } - -export default App; 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/layout/Alert.jsx b/src/components/layout/Alert.jsx new file mode 100644 index 0000000..77d8621 --- /dev/null +++ b/src/components/layout/Alert.jsx @@ -0,0 +1,31 @@ +import { useContext } from "react"; +import AlertContext from "../../context/alert/AlertContext"; + +function Alert() { + const { alert } = useContext(AlertContext); + return ( +
+
+
+ + + + {alert?.msg} +
+
+
+ ); +} +export default Alert; diff --git a/src/components/layout/Footer.jsx b/src/components/layout/Footer.jsx new file mode 100644 index 0000000..6aaf600 --- /dev/null +++ b/src/components/layout/Footer.jsx @@ -0,0 +1,22 @@ +export default function Footer() { + const footerYear = new Date().getFullYear(); + + return ( +
+
+ + + +

Copyright © {footerYear} All rights reserved

+
+
+ ); +} diff --git a/src/components/layout/Navbar.jsx b/src/components/layout/Navbar.jsx new file mode 100644 index 0000000..a791677 --- /dev/null +++ b/src/components/layout/Navbar.jsx @@ -0,0 +1,30 @@ +import { FaGithub } from "react-icons/fa"; +import { Link } from "react-router-dom"; +import PropTypes from "prop-types"; + +function Navbar({ title }) { + return ( + + ); +} +Navbar.defaultProps = { + title: "Github Finder", +}; +Navbar.propTypes = { title: PropTypes.string }; + +export default Navbar; diff --git a/src/components/layout/Spinner.jsx b/src/components/layout/Spinner.jsx new file mode 100644 index 0000000..6703df3 --- /dev/null +++ b/src/components/layout/Spinner.jsx @@ -0,0 +1,14 @@ +import spinner from "./assets/spinner.gif"; + +export default function Spinner() { + return ( +
+ Loading +
+ ); +} diff --git a/src/components/layout/assets/spinner.gif b/src/components/layout/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/repos/RepoItem.jsx b/src/components/repos/RepoItem.jsx new file mode 100644 index 0000000..784e81e --- /dev/null +++ b/src/components/repos/RepoItem.jsx @@ -0,0 +1,48 @@ +import { FaEye, FaInfo, FaLink, FaStar, FaUtensils } from 'react-icons/fa' + +import PropTypes from 'prop-types' + +function RepoItem({ repo }) { + const { + name, + description, + html_url, + forks, + open_issues, + watchers_count, + stargazers_count, + } = repo + + return ( +
+
+

+ + {name} + +

+

{description}

+
+
+ {watchers_count} +
+
+ {stargazers_count} +
+
+ {open_issues} +
+
+ {forks} +
+
+
+
+ ) +} + +RepoItem.propTypes = { + repo: PropTypes.object.isRequired, +} + +export default RepoItem diff --git a/src/components/repos/RepoList.jsx b/src/components/repos/RepoList.jsx new file mode 100644 index 0000000..39104a3 --- /dev/null +++ b/src/components/repos/RepoList.jsx @@ -0,0 +1,21 @@ +import RepoItem from "./RepoItem"; +import PropTypes from "prop-types"; + +export default function RepoList({ repos }) { + return ( +
+
+

+ Latest Repositories +

+ {repos.map((repo) => ( + + ))} +
+
+ ); +} + +RepoList.propTypes = { + repos: PropTypes.array.isRequired, +}; diff --git a/src/components/users/UserItem.jsx b/src/components/users/UserItem.jsx new file mode 100644 index 0000000..dbc53c1 --- /dev/null +++ b/src/components/users/UserItem.jsx @@ -0,0 +1,31 @@ +import { Link } from "react-router-dom"; +import PropTypes from "prop-types"; + +export default function UserItem({ user: { login, avatar_url } }) { + return ( +
+
+
+
+
+ Profile +
+
+
+
+

+ + Visit Profile + +
+
+
+ ); +} + +UserItem.propTypes = { + user: PropTypes.object.isRequired, +}; diff --git a/src/components/users/UserResults.jsx b/src/components/users/UserResults.jsx new file mode 100644 index 0000000..fa6e125 --- /dev/null +++ b/src/components/users/UserResults.jsx @@ -0,0 +1,20 @@ +import Spinner from "../layout/Spinner"; +import UserItem from "./UserItem"; +import { useContext } from "react"; +import GithubContext from "../../context/github/GithubContext"; + +export default function UserResults() { + const { users, loading } = useContext(GithubContext); + + if (!loading) { + return ( +
+ {users.map((user) => ( + + ))} +
+ ); + } else { + return ; + } +} diff --git a/src/components/users/UserSearch.jsx b/src/components/users/UserSearch.jsx new file mode 100644 index 0000000..b235ec5 --- /dev/null +++ b/src/components/users/UserSearch.jsx @@ -0,0 +1,60 @@ +import AlertContext from "../../context/alert/AlertContext"; +import GithubContext from "../../context/github/GithubContext"; +import { searchUsers } from "../../context/github/GithubActions"; +import { useContext, useState } from "react"; + +export default function UserSearch() { + const [text, setText] = useState(""); + + const { users, dispatch } = useContext(GithubContext); + const { setAlert } = useContext(AlertContext); + + const handleChange = (e) => setText(e.target.value); + + const handleSubmit = async (e) => { + e.preventDefault(); + if (text === "") { + setAlert("Please enter something", "error"); + } else { + dispatch({ type: "SET_LOADING" }); + const users = await searchUsers(text); + dispatch({ type: "GET_USERS", payload: users }); + setText(""); + } + }; + return ( +
+
+
+
+
+ + +
+
+
+
+ {users.length > 0 && ( +
+ +
+ )} +
+ ); +} diff --git a/src/context/alert/AlertContext.js b/src/context/alert/AlertContext.js new file mode 100644 index 0000000..ca5d7c9 --- /dev/null +++ b/src/context/alert/AlertContext.js @@ -0,0 +1,22 @@ +import { createContext, useReducer } from "react"; +import alertReducer from "./AlertReducer"; + +const AlertContext = createContext(); +export const AlertProvider = ({ children }) => { + const initialState = null; + + const [state, dispatch] = useReducer(alertReducer, initialState); + const setAlert = (msg, type)=>{ + dispatch({ + type:"SET_ALERT", + payload:{msg,type} + }) + setTimeout(()=> dispatch({type:"REMOVE_ALERT"}),3000) + } + return ( + + {children} + + ); +}; +export default AlertContext; diff --git a/src/context/alert/AlertReducer.js b/src/context/alert/AlertReducer.js new file mode 100644 index 0000000..bbadb9a --- /dev/null +++ b/src/context/alert/AlertReducer.js @@ -0,0 +1,11 @@ + const alertReducer = (state, action) => { + switch (action.type) { + case "SET_ALERT": + return action.payload; + case "REMOVE_ALERT": + return null; + default: + return state; + } +}; +export default alertReducer; diff --git a/src/context/github/GithubActions.js b/src/context/github/GithubActions.js new file mode 100644 index 0000000..d60ee4c --- /dev/null +++ b/src/context/github/GithubActions.js @@ -0,0 +1,27 @@ +import axios from 'axios' + +const GITHUB_URL = process.env.REACT_APP_GITHUB_URL +const GITHUB_TOKEN = process.env.REACT_APP_GITHUB_TOKEN + +const github = axios.create({ + baseURL: GITHUB_URL, + headers: { Authorization: `token ${GITHUB_TOKEN}` }, +}) + +export const searchUsers = async (text) => { + const params = new URLSearchParams({ + q: text, + }) + + const response = await github.get(`/search/users?${params}`) + return response.data.items +} + +export const getUserAndRepos = async (login) => { + const [user, repos] = await Promise.all([ + github.get(`/users/${login}`), + github.get(`/users/${login}/repos`), + ]) + + return { user: user.data, repos: repos.data } +} diff --git a/src/context/github/GithubContext.js b/src/context/github/GithubContext.js new file mode 100644 index 0000000..dba55bf --- /dev/null +++ b/src/context/github/GithubContext.js @@ -0,0 +1,25 @@ +import { createContext, useReducer } from "react"; +import githubReducer from "./GithubReducer"; + +const GithubContext = createContext(); + +export const GithubProvider = ({ children }) => { + const initialState = { + users: [], + user:{}, + repos:[], + loading: false, + }; + const [state, dispatch] = useReducer(githubReducer, initialState); + return ( + + {children} + + ); +}; +export default GithubContext; diff --git a/src/context/github/GithubReducer.js b/src/context/github/GithubReducer.js new file mode 100644 index 0000000..4ba4fc8 --- /dev/null +++ b/src/context/github/GithubReducer.js @@ -0,0 +1,30 @@ +const githubReducer = (state, action) => { + switch (action.type) { + case "GET_USERS": + return { + ...state, + users: action.payload, + loading: false, + }; + case "SET_LOADING": + return { + ...state, + loading: true, + }; + case "CLEAR_USERS": + return { + ...state, + users: [], + }; + case "GET_USER_AND_REPOS": + return{ + ...state, + user: action.payload.user, + repos: action.payload.repos, + loading: false + } + default: + return state; + } +}; +export default githubReducer; diff --git a/src/index.css b/src/index.css index ec2585e..3b873c7 100644 --- a/src/index.css +++ b/src/index.css @@ -1,13 +1,8 @@ -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; +@tailwind base; +@tailwind components; +@tailwind utilities; +.custom-card-image .card.image-full:before { + border-radius: 0.5rem; + opacity: 0.45; } -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} diff --git a/src/index.js b/src/index.js index d563c0f..7716fe4 100644 --- a/src/index.js +++ b/src/index.js @@ -2,7 +2,6 @@ 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')); root.render( @@ -11,7 +10,3 @@ 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/input.css b/src/input.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/src/input.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; 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/About.jsx b/src/pages/About.jsx new file mode 100644 index 0000000..05bc600 --- /dev/null +++ b/src/pages/About.jsx @@ -0,0 +1,29 @@ +export default function About() { + return ( +
+

Github Finder

+

+ A React app to search GitHub profiles and see profile details. This + project is part of the + + {" "} + React Front To Back + {" "} + Udemy course by + + Brad Traversy + + . +

+

+ Version 1.0.0 +

+

+ Layout By: + + Hassib Moddasser + +

+
+ ); +} diff --git a/src/pages/Home.jsx b/src/pages/Home.jsx new file mode 100644 index 0000000..0110fe9 --- /dev/null +++ b/src/pages/Home.jsx @@ -0,0 +1,10 @@ +import UserResults from "../components/users/UserResults"; +import UserSearch from "../components/users/UserSearch"; +export default function Home() { + return ( + <> + + + + ); +} diff --git a/src/pages/NotFound.jsx b/src/pages/NotFound.jsx new file mode 100644 index 0000000..629200c --- /dev/null +++ b/src/pages/NotFound.jsx @@ -0,0 +1,19 @@ +import { FaHome } from "react-icons/fa"; +import { Link } from "react-router-dom"; + +export default function NotFound() { + return ( +
+
+
+

Oop!

+

404 - Page not found!

+ + + Back To Home + +
+
+
+ ); +} diff --git a/src/pages/User.jsx b/src/pages/User.jsx new file mode 100644 index 0000000..097ffab --- /dev/null +++ b/src/pages/User.jsx @@ -0,0 +1,186 @@ +import { FaCodepen, FaStore, FaUserFriends, FaUsers } from 'react-icons/fa' +import { useEffect, useContext } from 'react' +import { useParams, Link } from 'react-router-dom' +import Spinner from '../components/layout/Spinner' +import RepoList from '../components/repos/RepoList' +import GithubContext from '../context/github/GithubContext' +import { getUserAndRepos } from '../context/github/GithubActions' + +function User() { + const { user, loading, repos, dispatch } = useContext(GithubContext) + + const params = useParams() + + useEffect(() => { + dispatch({ type: 'SET_LOADING' }) + const getUserData = async () => { + const userData = await getUserAndRepos(params.login) + dispatch({ type: 'GET_USER_AND_REPOS', payload: userData }) + } + + getUserData() + }, [dispatch, params.login]) + + const { + name, + type, + avatar_url, + location, + bio, + blog, + twitter_username, + login, + html_url, + followers, + following, + public_repos, + public_gists, + hireable, + } = user + + if (loading) { + return + } + + // NOTE: check for valid url to users website + + const websiteUrl = blog?.startsWith('http') ? blog : 'https://' + blog + + // NOTE: code here has been fixed so that stats no longer show scroll bar on + // mobile / small devices + // https://www.udemy.com/course/react-front-to-back-2022/learn/lecture/29768968#questions/16902278 + + // NOTE: if you are having problems with the name and login showing at the top + // of the image then you need the className='flex-grow-0' on the

tag + // default styling on

in daisyUI now has flex-grow-1 + + return ( + <> +

+
+ + Back To Search + +
+ +
+
+
+
+ +
+
+

{name}

+

{login}

+
+
+
+ +
+
+

+ {name} +
{type}
+ {hireable && ( +
Hireable
+ )} +

+

{bio}

+ +
+ +
+ {location && ( +
+
Location
+
{location}
+
+ )} + {blog && ( +
+
Website
+ +
+ )} + {twitter_username && ( +
+
Twitter
+ +
+ )} +
+
+
+ +
+
+
+
+ +
+
Followers
+
+ {followers} +
+
+ +
+
+ +
+
Following
+
+ {following} +
+
+ +
+
+ +
+
Public Repos
+
+ {public_repos} +
+
+ +
+
+ +
+
Public Gists
+
+ {public_gists} +
+
+
+
+ + +
+ + ) +} + +export default User 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'; diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..6c48c48 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,10 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./src/**/*.{js,jsx,ts,tsx}", + ], + theme: { + extend: {}, + }, + plugins: [require('daisyui')], +}