From bc6c62073618a413a5a0d0732b6f13451936334f Mon Sep 17 00:00:00 2001 From: Andreas Schaafsma Date: Tue, 6 Jun 2023 13:25:16 +0200 Subject: [PATCH] Changed too much shit I dont care --- package-lock.json | 396 ++++++++++++++++++ package.json | 5 + public/global.css | 8 + public/image-placeholder.png | Bin 0 -> 3609 bytes public/placeholder-square.png | Bin 0 -> 9113 bytes src/app/[article]/[...slug]/page.tsx | 49 +++ src/app/admin/page.tsx | 58 +++ src/app/index.css | 7 + src/app/layout.tsx | 5 +- src/app/page.tsx | 138 ++---- src/app/page.tsx.bak | 113 +++++ .../test/index.tsx => app/page.tsx.bak2} | 2 +- src/app/registry.tsx | 23 + src/app/test/index.css | 7 + src/app/test/layout.tsx.bak | 21 + src/app/test/page.tsx | 29 ++ src/components/bootstrap.tsx | 10 + ...es.header.module.css => header.module.css} | 2 +- src/components/header.tsx | 2 +- ...es.navbar.module.css => navbar.module.css} | 3 +- src/components/navbar.tsx | 3 +- .../news/article-preview.module.css | 23 + src/components/news/article-preview.tsx | 21 + src/components/news/article.module.css | 24 ++ src/components/news/article.tsx | 19 + src/components/news/tagbar.module.css | 14 + src/components/news/tagbar.tsx | 11 + src/components/page-container.module.css | 8 + src/components/page-container.tsx | 2 +- src/components/page-template.tsx | 19 + src/components/sidebar.module.css | 7 + src/components/sidebar.tsx | 12 + .../styles.page-container.module.css | 4 - src/controller/Post.ts | 34 ++ src/db.ts | 19 + src/gens.ts | 10 + src/model/Models.ts | 15 + src/model/Post.ts | 8 + src/pages/api/post/[...slug].ts | 13 + src/pages/api/post/index.ts | 14 + 40 files changed, 1035 insertions(+), 123 deletions(-) create mode 100644 public/image-placeholder.png create mode 100644 public/placeholder-square.png create mode 100644 src/app/[article]/[...slug]/page.tsx create mode 100644 src/app/admin/page.tsx create mode 100644 src/app/index.css create mode 100644 src/app/page.tsx.bak rename src/{pages/test/index.tsx => app/page.tsx.bak2} (91%) create mode 100644 src/app/registry.tsx create mode 100644 src/app/test/index.css create mode 100644 src/app/test/layout.tsx.bak create mode 100644 src/app/test/page.tsx create mode 100644 src/components/bootstrap.tsx rename src/components/{styles.header.module.css => header.module.css} (81%) rename src/components/{styles.navbar.module.css => navbar.module.css} (53%) create mode 100644 src/components/news/article-preview.module.css create mode 100644 src/components/news/article-preview.tsx create mode 100644 src/components/news/article.module.css create mode 100644 src/components/news/article.tsx create mode 100644 src/components/news/tagbar.module.css create mode 100644 src/components/news/tagbar.tsx create mode 100644 src/components/page-container.module.css create mode 100644 src/components/page-template.tsx create mode 100644 src/components/sidebar.module.css create mode 100644 src/components/sidebar.tsx delete mode 100644 src/components/styles.page-container.module.css create mode 100644 src/controller/Post.ts create mode 100644 src/db.ts create mode 100644 src/gens.ts create mode 100644 src/model/Models.ts create mode 100644 src/model/Post.ts create mode 100644 src/pages/api/post/[...slug].ts create mode 100644 src/pages/api/post/index.ts diff --git a/package-lock.json b/package-lock.json index e63385d..6cd178e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,13 +10,18 @@ "dependencies": { "@types/node": "20.1.7", "@types/react": "18.2.6", + "@types/react-bootstrap": "^0.32.32", "@types/react-dom": "18.2.4", "autoprefixer": "10.4.14", + "bootstrap": "^5.3.0", "eslint": "8.40.0", "eslint-config-next": "13.4.2", + "mysql": "^2.18.1", + "mysql2": "^3.3.3", "next": "13.4.2", "postcss": "8.4.23", "react": "18.2.0", + "react-bootstrap": "^2.7.4", "react-dom": "18.2.0", "tailwindcss": "3.3.2", "typescript": "5.0.4" @@ -373,6 +378,73 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.6.0.tgz", + "integrity": "sha512-OFiYQdv+Yk7AO7IsQu/fAEPijbeTwrrEYvdNoJ3sblBBedD5j5fBTNWrUPNVlwC4XWWnWTCMaRIVsJujsFiWXg==", + "dependencies": { + "@swc/helpers": "^0.4.14" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/ssr/node_modules/@swc/helpers": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", + "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@restart/hooks": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.9.tgz", + "integrity": "sha512-3BekqcwB6Umeya+16XPooARn4qEPW6vNvwYnlofIYe6h9qG1/VeD7UvShCWx11eFz5ELYmwIEshz+MkPX3wjcQ==", + "dependencies": { + "dequal": "^2.0.2" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.6.tgz", + "integrity": "sha512-eC3puKuWE1SRYbojWHXnvCNHGgf3uzHCb6JOhnF4OXPibOIPEkR1sqDSkL643ydigxwh+ruCa1CmYHlzk7ikKA==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@popperjs/core": "^2.11.6", + "@react-aria/ssr": "^3.5.0", + "@restart/hooks": "^0.4.9", + "@types/warning": "^3.0.0", + "dequal": "^2.0.3", + "dom-helpers": "^5.2.0", + "uncontrollable": "^8.0.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, + "node_modules/@restart/ui/node_modules/uncontrollable": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.2.tgz", + "integrity": "sha512-/GDx+K1STGtpgTsj5Dj3J51YaKxZDblbCQHTH1zHLuoBEWodj6MjtRVv3TUijj1JYLRLSFsFzN8NV4M3QV4d9w==", + "peerDependencies": { + "react": ">=16.14.0" + } + }, "node_modules/@rushstack/eslint-patch": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", @@ -411,6 +483,14 @@ "csstype": "^3.0.2" } }, + "node_modules/@types/react-bootstrap": { + "version": "0.32.32", + "resolved": "https://registry.npmjs.org/@types/react-bootstrap/-/react-bootstrap-0.32.32.tgz", + "integrity": "sha512-GM9UtV7v+C2F0rbqgIpMWdCKBMdX3PQURoJQobPO4vDAeFadcExNtKffi13/MjaAks+riJKVGyiMe+6OmDYT2w==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-dom": { "version": "18.2.4", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz", @@ -419,11 +499,24 @@ "@types/react": "*" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", + "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/scheduler": { "version": "0.16.3", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" }, + "node_modules/@types/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", + "integrity": "sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==" + }, "node_modules/@typescript-eslint/parser": { "version": "5.59.6", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", @@ -772,6 +865,14 @@ "node": ">=0.6" } }, + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -780,6 +881,24 @@ "node": ">=8" } }, + "node_modules/bootstrap": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.0.tgz", + "integrity": "sha512-UnBV3E3v4STVNQdms6jSGO2CvOkjUMdDAVR2V5N4uCMdaIkaQjbcEAMqRimDHIs4uqBYzDAKCQwCB+97tJgHQw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.7" + } + }, "node_modules/bplist-parser": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", @@ -962,6 +1081,11 @@ "node": ">= 6" } }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -996,6 +1120,11 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1137,6 +1266,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -1169,6 +1314,15 @@ "node": ">=6.0.0" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.397", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.397.tgz", @@ -1929,6 +2083,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, "node_modules/get-intrinsic": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", @@ -2157,6 +2319,17 @@ "node": ">=14.18.0" } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -2215,6 +2388,14 @@ "node": ">= 0.4" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -2415,6 +2596,11 @@ "node": ">=8" } }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -2695,6 +2881,11 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -2777,6 +2968,54 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "dependencies": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mysql2": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.3.tgz", + "integrity": "sha512-MxDQJztArk4JFX1PKVjDhIXRzAmVJfuqZrVU+my6NeYBAA/XZRaDw5q7vga8TNvgyy3Lv3rivBFBBuJFbsdjaw==", + "dependencies": { + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru-cache": "^8.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/node_modules/lru-cache": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", + "engines": { + "node": ">=16.14" + } + }, + "node_modules/mysql2/node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -2787,6 +3026,25 @@ "thenify-all": "^1.0.0" } }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -3347,6 +3605,11 @@ "node": ">= 0.8.0" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -3357,6 +3620,18 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -3395,6 +3670,35 @@ "node": ">=0.10.0" } }, + "node_modules/react-bootstrap": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.7.4.tgz", + "integrity": "sha512-EPKPwhfbxsKsNBhJBitJwqul9fvmlYWSft6jWE2EpqhEyjhqIqNihvQo2onE5XtS+QHOavUSNmA+8Lnv5YeAyg==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@restart/hooks": "^0.4.9", + "@restart/ui": "^1.6.3", + "@types/react-transition-group": "^4.4.5", + "classnames": "^2.3.2", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.8.1", + "prop-types-extra": "^1.1.0", + "react-transition-group": "^4.4.5", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "@types/react": ">=16.14.8", + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -3412,6 +3716,26 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -3420,6 +3744,25 @@ "pify": "^2.3.0" } }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -3617,6 +3960,11 @@ "queue-microtask": "^1.2.2" } }, + "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/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -3630,6 +3978,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -3652,6 +4005,11 @@ "node": ">=10" } }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3705,6 +4063,14 @@ "node": ">=0.10.0" } }, + "node_modules/sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -3724,6 +4090,14 @@ "node": ">=10.0.0" } }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", @@ -4116,6 +4490,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -4166,6 +4554,14 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index d62bf63..a50c998 100644 --- a/package.json +++ b/package.json @@ -11,13 +11,18 @@ "dependencies": { "@types/node": "20.1.7", "@types/react": "18.2.6", + "@types/react-bootstrap": "^0.32.32", "@types/react-dom": "18.2.4", "autoprefixer": "10.4.14", + "bootstrap": "^5.3.0", "eslint": "8.40.0", "eslint-config-next": "13.4.2", + "mysql": "^2.18.1", + "mysql2": "^3.3.3", "next": "13.4.2", "postcss": "8.4.23", "react": "18.2.0", + "react-bootstrap": "^2.7.4", "react-dom": "18.2.0", "tailwindcss": "3.3.2", "typescript": "5.0.4" diff --git a/public/global.css b/public/global.css index 74fbf8f..24cc129 100644 --- a/public/global.css +++ b/public/global.css @@ -24,3 +24,11 @@ html{ min-height: 100vh; height:100vh; } +h1{ + font-size: 21pt; + font-weight: bold; +} +h2{ + font-size: 19pt; + font-weight: bold; +} \ No newline at end of file diff --git a/public/image-placeholder.png b/public/image-placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..675190832f2d529eee3472e064435d310e3998f6 GIT binary patch literal 3609 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 q&#C)Ar|$oYPu>4-{#vqgL`R8n3K_|2m> { + const res = await fetch(`http://localhost:3000/api/post/${slug}`); + // The return value is *not* serialized + // You can return Date, Map, Set, etc. + // Recommendation: handle errors + if (!res.ok) { + // This will activate the closest `error.js` Error Boundary + throw new Error('Failed to fetch data'); + } + return res.json(); +} + +export default async function Page({ params }) { + const { slug } = params; + const post = ((await getData(slug))[0]); + console.log(post); + + return
+
+ + + +

+ Filters +

+
  • filter 1
  • filter 2
  • filter 3
+
+
+
+
+
+
; +} \ No newline at end of file diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx new file mode 100644 index 0000000..08f89a4 --- /dev/null +++ b/src/app/admin/page.tsx @@ -0,0 +1,58 @@ +'use client' +import Container from 'react-bootstrap/Container'; +import Nav from 'react-bootstrap/Nav'; +import Navbar from 'react-bootstrap/Navbar'; +import NavDropdown from 'react-bootstrap/NavDropdown'; +import Button from 'react-bootstrap/Button'; +import Form from 'react-bootstrap/Form'; + + +export default function Page(){ + return
+ + + React-Bootstrap + + + + + + + +
+ + Email address + + + We'll never share your email with anyone else. + + + + + Password + + + + + + +
+
+
+} \ No newline at end of file diff --git a/src/app/index.css b/src/app/index.css new file mode 100644 index 0000000..b3bcf9e --- /dev/null +++ b/src/app/index.css @@ -0,0 +1,7 @@ +main{ + display:flex; + flex-direction: column; + padding:8px; + flex-grow: 1; + gap:8px; +} \ No newline at end of file diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 71b3fbf..b7501b5 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,7 +1,8 @@ import './globals.css' import { Inter } from 'next/font/google' +import StyledJsxRegistry from './registry'; -const inter = Inter({ subsets: ['latin'] }) +const inter = Inter({ subsets: ['latin'], fallback: ['system-ui', 'arial'] }) export const metadata = { title: 'Create Next App', @@ -15,7 +16,7 @@ export default function RootLayout({ }) { return ( - {children} + {children} ) } diff --git a/src/app/page.tsx b/src/app/page.tsx index 7e80296..8e9bb5c 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,113 +1,29 @@ -import Image from 'next/image' +import Header from "@/components/header"; +import PageContainer from "@/components/page-container"; +import Navbar from "@/components/navbar"; +import Sidebar from "@/components/sidebar"; +import ArticlePreview from "@/components/news/article-preview" +import ReactDOM from "react"; +import "public/global.css" +import "./index.css" -export default function Home() { - return ( -
-
-

- Get started by editing  - src/app/page.tsx -

- -
-
- Next.js Logo -
- - -
- ) -} +export default function Test() { + return
+
+ + + +

+ Filters +

+
  • filter 1
  • filter 2
  • filter 3
+
+
+ + + +
+
+
; +} \ No newline at end of file diff --git a/src/app/page.tsx.bak b/src/app/page.tsx.bak new file mode 100644 index 0000000..7e80296 --- /dev/null +++ b/src/app/page.tsx.bak @@ -0,0 +1,113 @@ +import Image from 'next/image' + +export default function Home() { + return ( +
+
+

+ Get started by editing  + src/app/page.tsx +

+ +
+ +
+ Next.js Logo +
+ + +
+ ) +} diff --git a/src/pages/test/index.tsx b/src/app/page.tsx.bak2 similarity index 91% rename from src/pages/test/index.tsx rename to src/app/page.tsx.bak2 index c81cafa..2f8ae30 100644 --- a/src/pages/test/index.tsx +++ b/src/app/page.tsx.bak2 @@ -4,7 +4,7 @@ import Navbar from "@/components/navbar"; import ReactDOM from "react"; import "public/global.css" -export default function Test() { +export default function Page() { return
diff --git a/src/app/registry.tsx b/src/app/registry.tsx new file mode 100644 index 0000000..4abc213 --- /dev/null +++ b/src/app/registry.tsx @@ -0,0 +1,23 @@ +'use client'; + +import React, { useState } from 'react'; +import { useServerInsertedHTML } from 'next/navigation'; +import { StyleRegistry, createStyleRegistry } from 'styled-jsx'; + +export default function StyledJsxRegistry({ + children, +}: { + children: React.ReactNode; +}) { + // Only create stylesheet once with lazy initial state + // x-ref: https://reactjs.org/docs/hooks-reference.html#lazy-initial-state + const [jsxStyleRegistry] = useState(() => createStyleRegistry()); + + useServerInsertedHTML(() => { + const styles = jsxStyleRegistry.styles(); + jsxStyleRegistry.flush(); + return <>{styles}; + }); + + return {children}; +} \ No newline at end of file diff --git a/src/app/test/index.css b/src/app/test/index.css new file mode 100644 index 0000000..b3bcf9e --- /dev/null +++ b/src/app/test/index.css @@ -0,0 +1,7 @@ +main{ + display:flex; + flex-direction: column; + padding:8px; + flex-grow: 1; + gap:8px; +} \ No newline at end of file diff --git a/src/app/test/layout.tsx.bak b/src/app/test/layout.tsx.bak new file mode 100644 index 0000000..12bdcfc --- /dev/null +++ b/src/app/test/layout.tsx.bak @@ -0,0 +1,21 @@ +// import "public/globals.css" +import { Inter } from 'next/font/google' + +const inter = Inter({ subsets: ['latin'], fallback: ['system-ui', 'arial'] }) + +export const metadata = { + title: 'Create Next App', + description: 'Generated by create next app', +} + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} diff --git a/src/app/test/page.tsx b/src/app/test/page.tsx new file mode 100644 index 0000000..8e9bb5c --- /dev/null +++ b/src/app/test/page.tsx @@ -0,0 +1,29 @@ +import Header from "@/components/header"; +import PageContainer from "@/components/page-container"; +import Navbar from "@/components/navbar"; +import Sidebar from "@/components/sidebar"; +import ArticlePreview from "@/components/news/article-preview" +import ReactDOM from "react"; +import "public/global.css" +import "./index.css" + + +export default function Test() { + return
+
+ + + +

+ Filters +

+
  • filter 1
  • filter 2
  • filter 3
+
+
+ + + +
+
+
; +} \ No newline at end of file diff --git a/src/components/bootstrap.tsx b/src/components/bootstrap.tsx new file mode 100644 index 0000000..4f53cf9 --- /dev/null +++ b/src/components/bootstrap.tsx @@ -0,0 +1,10 @@ +'use client' +import 'bootstrap/dist/css/bootstrap.css'; +import { useEffect } from 'react'; + +export default function Bootstrap(Component, children, pageProps){ + useEffect(() => { + typeof document !== undefined ? require('bootstrap/dist/js/bootstrap') : null + }, []); + return <>
; +} \ No newline at end of file diff --git a/src/components/styles.header.module.css b/src/components/header.module.css similarity index 81% rename from src/components/styles.header.module.css rename to src/components/header.module.css index 82c7c02..e09d6ef 100644 --- a/src/components/styles.header.module.css +++ b/src/components/header.module.css @@ -1,6 +1,6 @@ .header{ display: flex; - background-color: green; + background-color: #008BC7; flex-direction: row; flex-grow: 0; } diff --git a/src/components/header.tsx b/src/components/header.tsx index 0475ccf..8c93b47 100644 --- a/src/components/header.tsx +++ b/src/components/header.tsx @@ -1,4 +1,4 @@ -import styles from "./styles.header.module.css" +import styles from "./header.module.css" export default function Header() { return
diff --git a/src/components/styles.navbar.module.css b/src/components/navbar.module.css similarity index 53% rename from src/components/styles.navbar.module.css rename to src/components/navbar.module.css index 10299ac..30a9017 100644 --- a/src/components/styles.navbar.module.css +++ b/src/components/navbar.module.css @@ -1,7 +1,8 @@ .navbar{ - background-color: pink; + background-color: #136D94; flex-grow: 0; } .navItem{ margin: 8px; + color: white; } \ No newline at end of file diff --git a/src/components/navbar.tsx b/src/components/navbar.tsx index 672420c..1454d88 100644 --- a/src/components/navbar.tsx +++ b/src/components/navbar.tsx @@ -1,8 +1,9 @@ -import styles from "./styles.navbar.module.css" +import styles from "./navbar.module.css" const navItems = ["News", "Projects", "About Me"]; const navList = navItems.map(value => {value}); + export default function Navbar() { return