diff options
| -rw-r--r-- | next.config.mjs | 8 | ||||
| -rw-r--r-- | package-lock.json | 100 | ||||
| -rw-r--r-- | package.json | 1 | ||||
| -rw-r--r-- | src/app/anime/video/loading.css | 346 | ||||
| -rw-r--r-- | src/app/anime/video/loading.jsx | 9 | ||||
| -rw-r--r-- | src/app/globals.css | 19 | ||||
| -rw-r--r-- | src/app/manga/[title]/[id]/info.module.css | 19 | ||||
| -rw-r--r-- | src/app/manga/[title]/[id]/page.jsx | 10 | ||||
| -rw-r--r-- | src/app/manga/[title]/title.module.css | 6 | ||||
| -rw-r--r-- | src/app/manga/manga.module.css | 36 | ||||
| -rw-r--r-- | src/app/page.jsx | 1 |
11 files changed, 175 insertions, 380 deletions
diff --git a/next.config.mjs b/next.config.mjs index fc47e34..e1f50db 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -27,14 +27,6 @@ const nextConfig = { protocol: "https", hostname: "uploads.mangadex.org", }, - { - protocol: "https", - hostname: "cros.shashstorm.in", - }, - { - protocol: "https", - hostname: "image-proxy-manga.vercel.app", - }, ], }, logging: { diff --git a/package-lock.json b/package-lock.json index 2acc5f5..a990722 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "dramalama-next", "version": "0.1.0", "dependencies": { + "@supabase/supabase-js": "^2.40.0", "@vercel/analytics": "^1.2.2", "@vercel/postgres": "^0.7.2", "@vercel/speed-insights": "^1.0.10", @@ -842,6 +843,73 @@ "integrity": "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==", "dev": true }, + "node_modules/@supabase/functions-js": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.1.5.tgz", + "integrity": "sha512-BNzC5XhCzzCaggJ8s53DP+WeHHGT/NfTsx2wUSSGKR2/ikLFQTBCDzMvGz/PxYMqRko/LwncQtKXGOYp1PkPaw==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/gotrue-js": { + "version": "2.62.2", + "resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-2.62.2.tgz", + "integrity": "sha512-AP6e6W9rQXFTEJ7sTTNYQrNf0LCcnt1hUW+RIgUK+Uh3jbWvcIST7wAlYyNZiMlS9+PYyymWQ+Ykz/rOYSO0+A==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/node-fetch": { + "version": "2.6.15", + "resolved": "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz", + "integrity": "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/@supabase/postgrest-js": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.9.2.tgz", + "integrity": "sha512-I6yHo8CC9cxhOo6DouDMy9uOfW7hjdsnCxZiaJuIVZm1dBGTFiQPgfMa9zXCamEWzNyWRjZvupAUuX+tqcl5Sw==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/realtime-js": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.9.3.tgz", + "integrity": "sha512-lAp50s2n3FhGJFq+wTSXLNIDPw5Y0Wxrgt44eM5nLSA3jZNUUP3Oq2Ccd1CbZdVntPCWLZvJaU//pAd2NE+QnQ==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14", + "@types/phoenix": "^1.5.4", + "@types/ws": "^8.5.10", + "ws": "^8.14.2" + } + }, + "node_modules/@supabase/storage-js": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.5.5.tgz", + "integrity": "sha512-OpLoDRjFwClwc2cjTJZG8XviTiQH4Ik8sCiMK5v7et0MDu2QlXjCAW3ljxJB5+z/KazdMOTnySi+hysxWUPu3w==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/supabase-js": { + "version": "2.40.0", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.40.0.tgz", + "integrity": "sha512-XF8OrsA13DYBL074sHH4M0NhXJCWhQ0R5JbVeVUytZ0coPMS9krRdzxl+0c4z4LLjqbm/Wdz0UYlTYM9MgnDag==", + "dependencies": { + "@supabase/functions-js": "2.1.5", + "@supabase/gotrue-js": "2.62.2", + "@supabase/node-fetch": "2.6.15", + "@supabase/postgrest-js": "1.9.2", + "@supabase/realtime-js": "2.9.3", + "@supabase/storage-js": "2.5.5" + } + }, "node_modules/@swc/helpers": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", @@ -874,6 +942,11 @@ "pg-types": "^2.2.0" } }, + "node_modules/@types/phoenix": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.4.tgz", + "integrity": "sha512-B34A7uot1Cv0XtaHRYDATltAdKx0BvVKNgYNqE4WjtPUa4VQJM7kxeXcVKaH+KS+kCmZ+6w+QaUdcljiheiBJA==" + }, "node_modules/@types/prop-types": { "version": "15.7.11", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", @@ -894,6 +967,14 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/parser": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", @@ -4684,6 +4765,11 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -4865,6 +4951,20 @@ "node": ">=6.14.2" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.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 1419650..bcece2d 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "next lint" }, "dependencies": { + "@supabase/supabase-js": "^2.40.0", "@vercel/analytics": "^1.2.2", "@vercel/postgres": "^0.7.2", "@vercel/speed-insights": "^1.0.10", diff --git a/src/app/anime/video/loading.css b/src/app/anime/video/loading.css deleted file mode 100644 index aa3a519..0000000 --- a/src/app/anime/video/loading.css +++ /dev/null @@ -1,346 +0,0 @@ -.loadingContainer { - color: white; - display: flex; - justify-content: center; - align-items: center; - height: 80dvh; -} - - -.text-flicker-in-glow { - -webkit-animation: text-flicker-in-glow 4s linear both; - animation: text-flicker-in-glow 4s linear both; - font-size: 36px; - font-family: "Kanit"; -} - -/* ---------------------------------------------- - * Generated by Animista on 2024-3-21 9:58:16 - * Licensed under FreeBSD License. - * See http://animista.net/license for more info. - * w: http://animista.net, t: @cssanimista - * ---------------------------------------------- */ - -/** - * ---------------------------------------- - * animation text-flicker-in-glow - * ---------------------------------------- - */ - -@-webkit-keyframes text-flicker-in-glow { - 0% { - opacity: 0; - } - - 10% { - opacity: 0; - text-shadow: none; - } - - 10.1% { - opacity: 1; - text-shadow: none; - } - - 10.2% { - opacity: 0; - text-shadow: none; - } - - 20% { - opacity: 0; - text-shadow: none; - } - - 20.1% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.25); - } - - 20.6% { - opacity: 0; - text-shadow: none; - } - - 30% { - opacity: 0; - text-shadow: none; - } - - 30.1% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.45), 0 0 60px rgba(255, 255, 255, 0.25); - } - - 30.5% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.45), 0 0 60px rgba(255, 255, 255, 0.25); - } - - 30.6% { - opacity: 0; - text-shadow: none; - } - - 45% { - opacity: 0; - text-shadow: none; - } - - 45.1% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.45), 0 0 60px rgba(255, 255, 255, 0.25); - } - - 50% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.45), 0 0 60px rgba(255, 255, 255, 0.25); - } - - 55% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.45), 0 0 60px rgba(255, 255, 255, 0.25); - } - - 55.1% { - opacity: 0; - text-shadow: none; - } - - 57% { - opacity: 0; - text-shadow: none; - } - - 57.1% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.55), 0 0 60px rgba(255, 255, 255, 0.35); - } - - 60% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.55), 0 0 60px rgba(255, 255, 255, 0.35); - } - - 60.1% { - opacity: 0; - text-shadow: none; - } - - 65% { - opacity: 0; - text-shadow: none; - } - - 65.1% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.55), 0 0 60px rgba(255, 255, 255, 0.35), 0 0 100px rgba(255, 255, 255, 0.1); - } - - 75% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.55), 0 0 60px rgba(255, 255, 255, 0.35), 0 0 100px rgba(255, 255, 255, 0.1); - } - - 75.1% { - opacity: 0; - text-shadow: none; - } - - 77% { - opacity: 0; - text-shadow: none; - } - - 77.1% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.55), 0 0 60px rgba(255, 255, 255, 0.4), 0 0 110px rgba(255, 255, 255, 0.2), 0 0 100px rgba(255, 255, 255, 0.1); - } - - 85% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.55), 0 0 60px rgba(255, 255, 255, 0.4), 0 0 110px rgba(255, 255, 255, 0.2), 0 0 100px rgba(255, 255, 255, 0.1); - } - - 85.1% { - opacity: 0; - text-shadow: none; - } - - 86% { - opacity: 0; - text-shadow: none; - } - - 86.1% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.6), 0 0 60px rgba(255, 255, 255, 0.45), 0 0 110px rgba(255, 255, 255, 0.25), 0 0 100px rgba(255, 255, 255, 0.1); - } - - 100% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.6), 0 0 60px rgba(255, 255, 255, 0.45), 0 0 110px rgba(255, 255, 255, 0.25), 0 0 100px rgba(255, 255, 255, 0.1); - } -} - -@keyframes text-flicker-in-glow { - 0% { - opacity: 0; - } - - 10% { - opacity: 0; - text-shadow: none; - } - - 10.1% { - opacity: 1; - text-shadow: none; - } - - 10.2% { - opacity: 0; - text-shadow: none; - } - - 20% { - opacity: 0; - text-shadow: none; - } - - 20.1% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.25); - } - - 20.6% { - opacity: 0; - text-shadow: none; - } - - 30% { - opacity: 0; - text-shadow: none; - } - - 30.1% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.45), 0 0 60px rgba(255, 255, 255, 0.25); - } - - 30.5% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.45), 0 0 60px rgba(255, 255, 255, 0.25); - } - - 30.6% { - opacity: 0; - text-shadow: none; - } - - 45% { - opacity: 0; - text-shadow: none; - } - - 45.1% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.45), 0 0 60px rgba(255, 255, 255, 0.25); - } - - 50% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.45), 0 0 60px rgba(255, 255, 255, 0.25); - } - - 55% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.45), 0 0 60px rgba(255, 255, 255, 0.25); - } - - 55.1% { - opacity: 0; - text-shadow: none; - } - - 57% { - opacity: 0; - text-shadow: none; - } - - 57.1% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.55), 0 0 60px rgba(255, 255, 255, 0.35); - } - - 60% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.55), 0 0 60px rgba(255, 255, 255, 0.35); - } - - 60.1% { - opacity: 0; - text-shadow: none; - } - - 65% { - opacity: 0; - text-shadow: none; - } - - 65.1% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.55), 0 0 60px rgba(255, 255, 255, 0.35), 0 0 100px rgba(255, 255, 255, 0.1); - } - - 75% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.55), 0 0 60px rgba(255, 255, 255, 0.35), 0 0 100px rgba(255, 255, 255, 0.1); - } - - 75.1% { - opacity: 0; - text-shadow: none; - } - - 77% { - opacity: 0; - text-shadow: none; - } - - 77.1% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.55), 0 0 60px rgba(255, 255, 255, 0.4), 0 0 110px rgba(255, 255, 255, 0.2), 0 0 100px rgba(255, 255, 255, 0.1); - } - - 85% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.55), 0 0 60px rgba(255, 255, 255, 0.4), 0 0 110px rgba(255, 255, 255, 0.2), 0 0 100px rgba(255, 255, 255, 0.1); - } - - 85.1% { - opacity: 0; - text-shadow: none; - } - - 86% { - opacity: 0; - text-shadow: none; - } - - 86.1% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.6), 0 0 60px rgba(255, 255, 255, 0.45), 0 0 110px rgba(255, 255, 255, 0.25), 0 0 100px rgba(255, 255, 255, 0.1); - } - - 100% { - opacity: 1; - text-shadow: 0 0 30px rgba(255, 255, 255, 0.6), 0 0 60px rgba(255, 255, 255, 0.45), 0 0 110px rgba(255, 255, 255, 0.25), 0 0 100px rgba(255, 255, 255, 0.1); - } -} - -@media (prefers-color-scheme: light) { - .loadingContainer { - color: black; - } -}
\ No newline at end of file diff --git a/src/app/anime/video/loading.jsx b/src/app/anime/video/loading.jsx deleted file mode 100644 index dfa397c..0000000 --- a/src/app/anime/video/loading.jsx +++ /dev/null @@ -1,9 +0,0 @@ -import "./loading.css"; - -export default function Loading() { - return ( - <div className="loadingContainer"> - <p className="text-flicker-in-glow">Loading</p> - </div> - ); -} diff --git a/src/app/globals.css b/src/app/globals.css index a76fc50..c0273da 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -48,6 +48,25 @@ body::-webkit-scrollbar { margin-left: 10px; } +.ErrorContainer { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + height: 90dvh; + color: white; + font-family: "Kanit"; + font-size: 20px; +} + +.ErrorContainer button { + border-radius: 5px; + padding: 3px; + font-family: "Lato"; + border: 0; + outline: 0; +} + @media (prefers-color-scheme: dark) { body { background-color: black; diff --git a/src/app/manga/[title]/[id]/info.module.css b/src/app/manga/[title]/[id]/info.module.css index 638cfd1..686374a 100644 --- a/src/app/manga/[title]/[id]/info.module.css +++ b/src/app/manga/[title]/[id]/info.module.css @@ -20,7 +20,6 @@ justify-content: space-between; align-items: center; margin-top: 10px; - /* background-color: #3a3a3ac2; */ } .TitleContainer p { @@ -30,6 +29,7 @@ .TitleContainer img { border-radius: 10px; + margin-left: 5px; } .MangaDescription { @@ -89,7 +89,7 @@ /* Chapters Buttons */ .ChapterContainer { - width: 95%; + width: 100%; margin: 20px auto; text-align: center; height: 400px; @@ -119,10 +119,9 @@ border: none; outline: none; font-family: "Lato"; - background-color: #41C9E2; + background-color: #777777e3; cursor: pointer; transition: transform 0.2s linear; - } .ChapterContainer button:hover { @@ -132,5 +131,17 @@ .ChapterContainer button:focus { opacity: 0.6; transition: transform 0.2s linear; + background-color: var(--pastel-red); transform: scale(0.9); +} + +@media screen and (max-width: 768px) { + .MangaInfoContainer { + max-width: 100%; + } + + .TitleContainer p { + font-size: 28px; + } + }
\ No newline at end of file diff --git a/src/app/manga/[title]/[id]/page.jsx b/src/app/manga/[title]/[id]/page.jsx index 1b9b631..4166568 100644 --- a/src/app/manga/[title]/[id]/page.jsx +++ b/src/app/manga/[title]/[id]/page.jsx @@ -1,11 +1,16 @@ import styles from "./info.module.css"; import Image from "next/image"; import Buttons from "./buttons"; +import { redirect } from "next/navigation"; export default async function MangaInfo({ params }) { const id = params.id; const data = await getMangaInfo(id); + if (data.message) { + redirect("/404"); + } + return ( <div className={styles.MangaInfoContainer}> {data && ( @@ -63,7 +68,10 @@ export default async function MangaInfo({ params }) { <span key={index} className={styles.MangaGenre} - style={{ color: data.color, margin: 5 }} + style={{ + color: data.color, + margin: 5, + }} > {item} </span> diff --git a/src/app/manga/[title]/title.module.css b/src/app/manga/[title]/title.module.css index eef08ba..1369856 100644 --- a/src/app/manga/[title]/title.module.css +++ b/src/app/manga/[title]/title.module.css @@ -58,4 +58,10 @@ .MangaChapters { color: #FFEBB4 +} + +@media screen and (max-width: 768px) { + .Main { + max-width: 100%; + } }
\ No newline at end of file diff --git a/src/app/manga/manga.module.css b/src/app/manga/manga.module.css index 7e4a5ba..87c9563 100644 --- a/src/app/manga/manga.module.css +++ b/src/app/manga/manga.module.css @@ -76,18 +76,6 @@ } } -@media screen and (max-width: 768px) { - - .HorizontalImageContainer img { - width: 95%; - height: auto; - } - - .VerticalImageContainer img { - width: 46.5%; - height: 300px; - } -} .SearchBar { display: flex; @@ -110,6 +98,30 @@ font-size: 16px; } +.LoadingContainer { + display: flex; + justify-content: center; + align-items: center; + height: 90dvh; + color: white; + font-family: "Kanit"; + font-size: 18px; +} + +@media screen and (max-width: 768px) { + + .HorizontalImageContainer img { + width: 95%; + height: auto; + } + + .VerticalImageContainer img { + width: 46.5%; + height: 300px; + } +} + + @media screen and (max-width: 425px) { .Hero { diff --git a/src/app/page.jsx b/src/app/page.jsx index 31391ad..d77c55e 100644 --- a/src/app/page.jsx +++ b/src/app/page.jsx @@ -11,6 +11,7 @@ export default function Home() { width={300} height={300} alt="Logo" + priority ></Image> <p> Welcome to dramalama. An online service where you can watch |