From f16305c6ad25ee2ebe3fc330e7cb1598e061eb37 Mon Sep 17 00:00:00 2001 From: CorwinDev <88144943+CorwinDev@users.noreply.github.com> Date: Thu, 18 Aug 2022 14:44:12 +0200 Subject: [PATCH] update --- models/bot.js | 1 + models/server.js | 1 + package.json | 3 + postcss.config.js | 1 + tailwind.config.js | 4 +- website/bot/index.js | 38 +- website/index.js | 6 +- website/public/css/style.css | 716 ++++++++++++++++++++++++------ website/public/css/tailwind.css | 48 +- website/routers/admin/index.js | 98 +++- website/routers/bot/index.js | 255 ++++++++--- website/routers/servers/index.js | 76 +++- website/views/admin/bot.ejs | 53 +-- website/views/admin/index.ejs | 17 +- website/views/bot/edit.ejs | 21 +- website/views/bot/index.ejs | 8 +- website/views/bot/join.ejs | 19 + website/views/error.ejs | 3 +- website/views/includes/header.ejs | 4 +- website/views/index.ejs | 8 +- website/views/server/edit.ejs | 14 + website/views/server/join.ejs | 17 +- website/views/servers.ejs | 4 +- website/views/user/edit.ejs | 3 - website/views/user/index.ejs | 11 +- 25 files changed, 1079 insertions(+), 350 deletions(-) create mode 100644 website/views/bot/join.ejs diff --git a/models/bot.js b/models/bot.js index ea124b4..0a148ca 100644 --- a/models/bot.js +++ b/models/bot.js @@ -18,6 +18,7 @@ let hm = new mongoose.Schema({ analytics: Object, analytics_visitors: Number, analytics_invites: Number, + vanity: String, }); module.exports = mongoose.model("bots", hm); \ No newline at end of file diff --git a/models/server.js b/models/server.js index 43f17f2..e3b04ac 100644 --- a/models/server.js +++ b/models/server.js @@ -18,6 +18,7 @@ let hm = new mongoose.Schema({ analytics_visitors: Number, analytics_joins: Number, country: Object, + vanity: String, }); module.exports = mongoose.model("servers", hm); \ No newline at end of file diff --git a/package.json b/package.json index e77636c..6512e46 100644 --- a/package.json +++ b/package.json @@ -44,11 +44,14 @@ "passport": "^0.6.0", "passport-discord": "^0.1.4", "request": "^2.88.2", + "sanitize-html": "^2.7.1", "showdown": "^2.1.0", "tailwindcss": "^3.1.7", "url": "^0.11.0" }, "devDependencies": { + "@tailwindcss/typography": "^0.5.4", + "@types/sanitize-html": "^2.6.2", "postcss-nesting": "^10.1.10" } } diff --git a/postcss.config.js b/postcss.config.js index ea3cf2e..8be64af 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -2,5 +2,6 @@ module.exports = { plugins: [ require('tailwindcss'), require('autoprefixer'), + require('@tailwindcss/typography'), ] } \ No newline at end of file diff --git a/tailwind.config.js b/tailwind.config.js index d049cd4..f5dca41 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -4,6 +4,7 @@ module.exports = { "./website/**/*.{html,css}", "./website/views/*.ejs", "./website/views/**/*.ejs", + "./website/views/**/**/*.ejs", ], theme: { extend: { @@ -19,12 +20,13 @@ module.exports = { serif: ["Georgia", "serif"], mono: ["Menlo", "monospace"] }, - } + }, }, plugins: [ { tailwindcss: {}, autoprefixer: {}, + typography: {} }, ], }; \ No newline at end of file diff --git a/website/bot/index.js b/website/bot/index.js index a59455d..0659f67 100644 --- a/website/bot/index.js +++ b/website/bot/index.js @@ -9,7 +9,7 @@ const colors = require('colors'); const commands = [ new SlashCommandBuilder().setName('ping').setDescription('Replies with pong!'), new SlashCommandBuilder().setName('topvoted').setDescription('Replies with highest server/bots!'), - new SlashCommandBuilder().setName('user').setDescription('Replies with user info and connected bots/servers!'), + new SlashCommandBuilder().setName('profile').setDescription('Replies with user info and connected bots/servers!'), new SlashCommandBuilder().setName('queue').setDescription('Replies with queue'), ] .map(command => command.toJSON()); @@ -60,8 +60,38 @@ client.on('interactionCreate', async interaction => { interaction.reply({ embeds: [embed] }); } else if (commandName === 'user') { const { user } = interaction; - await interaction.reply(`${user.username}#${user.discriminator} has ${user.bot ? 'a bot' : 'no bot'} and is connected to ${user.guilds.size} servers!`); - + bots.find({ owner: user.id }).then(bots => { + var bots1 = bots + .map( + a => `${a.name} | ${a.id} **[ \`${a.votes}\` Votes ]**` + ) + .join('\n'); + if (!bots1) { + var bots1 = 'no bots'; + } + const embed = new EmbedBuilder() + .setAuthor({ name: interaction.user.tag, iconURL: interaction.user.avatarURL({ dynamic: true }) }) + .setColor("#7289da") + .setDescription(`**Bots owned by ${user.tag}**\n${bots1}`) + interaction.reply({ embeds: [embed] }); + }).catch(console.error); + } else if (commandName === 'profile') { + bots.find({ owner: interaction.user.id }).then(async function(bots){ + var bots1 = bots + .map( + a => `${a.name} | ${a.id} **[ \`${a.votes}\` Votes ]**` + ) + .join('\n'); + if (!bots1) { + var bots1 = 'no bots'; + } + var user = await users.findOne({ id: user.id }); + const embed = new EmbedBuilder() + .setAuthor({ name: interaction.user.tag, iconURL: interaction.user.avatarURL({ dynamic: true }) }) + .setColor("#7289da") + .setDescription(`**Bots owned by ${user.tag}**\n${bots1}\nCoins: ${user.coins}`) + interaction.reply({ embeds: [embed] }); + }) } else if (commandName === 'queue') { if (!global.config.users.owner.includes(interaction.user.id) && !global.config.users.verificator.includes(interaction.user.id)) return interaction.reply('You are not allowed to use this command!'); const unVerified = await bots.find({ verified: false }); @@ -102,7 +132,7 @@ var cooldown = []; client.on("messageCreate", async (message) => { if (message.author.bot) return; if (message.channel.type === "dm") return; - if (cooldown.some(code => code.id === message.author.id)){ + if (cooldown.some(code => code.id === message.author.id)) { var userr = cooldown.findIndex((obj => obj.id == message.author.id)); cooldown[userr].message += 1; if (cooldown[userr].message >= 15) { diff --git a/website/index.js b/website/index.js index a1363a4..f33721d 100644 --- a/website/index.js +++ b/website/index.js @@ -166,9 +166,9 @@ app.get('/tag/:id', async (req, res) => { }); app.get('/i/:id', async (req, res) => { var id = req.params.id.toLowerCase(); - var bott = await bots.findOne({ name: { $regex: req.params.id }}); + var bott = await bots.findOne({ vanity: id }); if(!bott){ - var serverr = await server.findOne({ name: { $regex: req.params.id }}); + var serverr = await server.findOne({ vanity: id }); if(!serverr){ res.redirect('/'); return @@ -176,7 +176,7 @@ app.get('/i/:id', async (req, res) => { res.redirect('/server/' + serverr.id + '/join'); return } - res.redirect('/bot/' + bott.id + '/join'); + res.redirect('/bot/' + bott.id + '/invite'); return }); diff --git a/website/public/css/style.css b/website/public/css/style.css index 6b43b62..dd528cb 100644 --- a/website/public/css/style.css +++ b/website/public/css/style.css @@ -1,6 +1,8 @@ /* ! tailwindcss v3.1.7 | 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) */ @@ -8,10 +10,14 @@ *, ::before, ::after { - box-sizing: border-box; /* 1 */ - border-width: 0; /* 2 */ - border-style: solid; /* 2 */ - border-color: #e5e7eb; /* 2 */ + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ } ::before, @@ -27,12 +33,17 @@ */ html { - line-height: 1.5; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ - -moz-tab-size: 4; /* 3 */ + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ -o-tab-size: 4; - tab-size: 4; /* 3 */ - font-family: QuickSand, sans-serif; /* 4 */ + tab-size: 4; + /* 3 */ + font-family: QuickSand, sans-serif; + /* 4 */ } /* @@ -41,8 +52,10 @@ html { */ body { - margin: 0; /* 1 */ - line-height: inherit; /* 2 */ + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ } /* @@ -52,9 +65,12 @@ body { */ hr { - height: 0; /* 1 */ - color: inherit; /* 2 */ - border-top-width: 1px; /* 3 */ + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ } /* @@ -107,8 +123,10 @@ code, kbd, samp, pre { - font-family: Menlo, monospace; /* 1 */ - font-size: 1em; /* 2 */ + font-family: Menlo, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ } /* @@ -146,9 +164,12 @@ sup { */ table { - text-indent: 0; /* 1 */ - border-color: inherit; /* 2 */ - border-collapse: collapse; /* 3 */ + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ } /* @@ -162,13 +183,20 @@ 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 */ + 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 */ } /* @@ -189,9 +217,12 @@ button, [type='button'], [type='reset'], [type='submit'] { - -webkit-appearance: button; /* 1 */ - background-color: transparent; /* 2 */ - background-image: none; /* 2 */ + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ } /* @@ -233,8 +264,10 @@ Correct the cursor style of increment and decrement buttons in Safari. */ [type='search'] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ } /* @@ -251,8 +284,10 @@ Remove the inner padding in Chrome and Safari on macOS. */ ::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ } /* @@ -314,14 +349,18 @@ textarea { */ input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; /* 1 */ - color: #9ca3af; /* 2 */ + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ } input::placeholder, textarea::placeholder { - opacity: 1; /* 1 */ - color: #9ca3af; /* 2 */ + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ } /* @@ -336,6 +375,7 @@ button, /* Make sure disabled buttons don't get the pointer cursor. */ + :disabled { cursor: default; } @@ -354,8 +394,10 @@ audio, iframe, embed, object { - display: block; /* 1 */ - vertical-align: middle; /* 2 */ + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ } /* @@ -508,39 +550,41 @@ video { --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; } + .container { width: 100%; } -@media (min-width: 640px) { +@media (min-width: 640px) { .container { max-width: 640px; } } -@media (min-width: 768px) { +@media (min-width: 768px) { .container { max-width: 768px; } } -@media (min-width: 1024px) { +@media (min-width: 1024px) { .container { max-width: 1024px; } } -@media (min-width: 1280px) { +@media (min-width: 1280px) { .container { max-width: 1280px; } } -@media (min-width: 1536px) { +@media (min-width: 1536px) { .container { max-width: 1536px; } } + .sr-only { position: absolute; width: 1px; @@ -552,1223 +596,1627 @@ video { white-space: nowrap; border-width: 0; } + .pointer-events-none { pointer-events: none; } + .visible { visibility: visible; } + .invisible { visibility: hidden; } + .static { position: static; } + .fixed { position: fixed; } + .absolute { position: absolute; } + .relative { position: relative; } + .inset-y-0 { top: 0px; bottom: 0px; } + .right-0 { right: 0px; } + .right-full { right: 100%; } + .left-0 { left: 0px; } + .bottom-0 { bottom: 0px; } + .top-0 { top: 0px; } + .top-3 { top: 0.75rem; } + .right-1 { right: 0.25rem; } + .z-0 { z-index: 0; } + .-z-10 { z-index: -10; } + .z-10 { z-index: 10; } + .z-30 { z-index: 30; } + .order-3 { order: 3; } + .col-auto { grid-column: auto; } + .col-span-4 { grid-column: span 4 / span 4; } + .float-right { float: right; } + .float-left { float: left; } + .m-8 { margin: 2rem; } + .m-20 { margin: 5rem; } + .m-2 { margin: 0.5rem; } + .m-4 { margin: 1rem; } + .m-10 { margin: 2.5rem; } + .mx-auto { margin-left: auto; margin-right: auto; } + .-mx-3 { margin-left: -0.75rem; margin-right: -0.75rem; } + .mx-10 { margin-left: 2.5rem; margin-right: 2.5rem; } + .mx-96 { margin-left: 24rem; margin-right: 24rem; } + .mx-20 { margin-left: 5rem; margin-right: 5rem; } + .mx-14 { margin-left: 3.5rem; margin-right: 3.5rem; } + +.my-10 { + margin-top: 2.5rem; + margin-bottom: 2.5rem; +} + +.my-6 { + margin-top: 1.5rem; + margin-bottom: 1.5rem; +} + .mb-2 { margin-bottom: 0.5rem; } + .mt-4 { margin-top: 1rem; } + .mt-1 { margin-top: 0.25rem; } + .mt-2 { margin-top: 0.5rem; } + .mr-6 { margin-right: 1.5rem; } + .mr-4 { margin-right: 1rem; } + .mt-0 { margin-top: 0px; } + .mr-2 { margin-right: 0.5rem; } + .mr-3 { margin-right: 0.75rem; } + .mb-5 { margin-bottom: 1.25rem; } + .mb-3 { margin-bottom: 0.75rem; } + .ml-2 { margin-left: 0.5rem; } + .mb-6 { margin-bottom: 1.5rem; } + .mb-0 { margin-bottom: 0px; } + .mb-4 { margin-bottom: 1rem; } + .ml-3 { margin-left: 0.75rem; } + .mr-1 { margin-right: 0.25rem; } + .-mr-1 { margin-right: -0.25rem; } + .-mt-1 { margin-top: -0.25rem; } + .mt-7 { margin-top: 1.75rem; } + .ml-4 { margin-left: 1rem; } + .mr-5 { margin-right: 1.25rem; } + .ml-5 { margin-left: 1.25rem; } + .ml-10 { margin-left: 2.5rem; } + .ml-16 { margin-left: 4rem; } + .ml-0 { margin-left: 0px; } + .ml-px { margin-left: 1px; } + .ml-auto { margin-left: auto; } + .ml-40 { margin-left: 10rem; } + .ml-36 { margin-left: 9rem; } + .mb-1 { margin-bottom: 0.25rem; } + .block { display: block; } + .inline-block { display: inline-block; } + .inline { display: inline; } + .flex { display: flex; } + .inline-flex { display: inline-flex; } + .table { display: table; } + .grid { display: grid; } + .contents { display: contents; } + .hidden { display: none; } + .h-6 { height: 1.5rem; } + .h-32 { height: 8rem; } + .h-8 { height: 2rem; } + .h-5 { height: 1.25rem; } + .h-20 { height: 5rem; } + .h-4 { height: 1rem; } + .h-10 { height: 2.5rem; } + .h-auto { height: auto; } + .h-full { height: 100%; } + .h-fit { height: -webkit-fit-content; height: -moz-fit-content; height: fit-content; } + .h-screen { height: 100vh; } + .h-16 { height: 4rem; } + .h-3 { height: 0.75rem; } + .h-96 { height: 24rem; } + .max-h-fit { max-height: -webkit-fit-content; max-height: -moz-fit-content; max-height: fit-content; } + .min-h-screen { min-height: 100vh; } + .min-h-min { min-height: -webkit-min-content; min-height: -moz-min-content; min-height: min-content; } + .w-full { width: 100%; } + .w-auto { width: auto; } + .w-6 { width: 1.5rem; } + .w-1 { width: 0.25rem; } + .w-screen { width: 100vw; } + .w-52 { width: 13rem; } + .w-2 { width: 0.5rem; } + .w-5 { width: 1.25rem; } + .w-10 { width: 2.5rem; } + .w-20 { width: 5rem; } + .w-3 { width: 0.75rem; } + .w-fit { width: -webkit-fit-content; width: -moz-fit-content; width: fit-content; } + .w-40 { width: 10rem; } + .w-56 { width: 14rem; } + .w-32 { width: 8rem; } + .w-16 { width: 4rem; } + .w-0 { width: 0px; } + .w-64 { width: 16rem; } + .w-9 { width: 2.25rem; } + .w-4 { width: 1rem; } -.w-3\/6 { - width: 50%; -} -.w-2\/3 { - width: 66.666667%; -} -.w-1\/4 { - width: 25%; -} + .w-96 { width: 24rem; } + +.w-8 { + width: 2rem; +} + +.w-3\/6 { + width: 50%; +} + +.w-2\/3 { + width: 66.666667%; +} + +.w-1\/4 { + width: 25%; +} + .min-w-fit { min-width: -webkit-fit-content; min-width: -moz-fit-content; min-width: fit-content; } + .max-w-7xl { max-width: 80rem; } + .max-w-xs { max-width: 20rem; } + .max-w-sm { max-width: 24rem; } + .max-w-full { max-width: 100%; } + .max-w-fit { max-width: -webkit-fit-content; max-width: -moz-fit-content; max-width: fit-content; } + .max-w-md { max-width: 28rem; } + +.max-w-2xl { + max-width: 42rem; +} + .flex-initial { flex: 0 1 auto; } + .flex-auto { flex: 1 1 auto; } + .flex-none { flex: none; } + .flex-1 { flex: 1 1 0%; } + .flex-shrink-0 { flex-shrink: 0; } + .flex-shrink { flex-shrink: 1; } + .flex-grow { flex-grow: 1; } + .grow { flex-grow: 1; } + .basis-1 { flex-basis: 0.25rem; } + .table-auto { table-layout: auto; } + .border-collapse { border-collapse: collapse; } + .origin-top-right { transform-origin: top right; } + .origin-\[0\] { transform-origin: 0; } + .-translate-y-6 { --tw-translate-y: -1.5rem; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } + .translate-y-0 { --tw-translate-y: 0px; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } + .-translate-x-1 { --tw-translate-x: -0.25rem; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } + .-translate-y-full { --tw-translate-y: -100%; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } + .-translate-x-12 { --tw-translate-x: -3rem; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } + .-translate-y-3 { --tw-translate-y: -0.75rem; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } + .scale-75 { --tw-scale-x: .75; --tw-scale-y: .75; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } + .scale-100 { --tw-scale-x: 1; --tw-scale-y: 1; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } + .scale-95 { --tw-scale-x: .95; --tw-scale-y: .95; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } + .transform { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } + .cursor-pointer { cursor: pointer; } + .resize { resize: both; } + .list-disc { list-style-type: disc; } + .appearance-none { -webkit-appearance: none; -moz-appearance: none; appearance: none; } + .columns-4 { -moz-columns: 4; columns: 4; } + .grid-flow-col { grid-auto-flow: column; } + .grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } + .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } + .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .grid-cols-none { grid-template-columns: none; } + .grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); } + .grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } + .grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } + .grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)); } + .flex-row { flex-direction: row; } + .flex-col { flex-direction: column; } + .flex-wrap { flex-wrap: wrap; } + .place-content-end { place-content: end; } + .place-items-center { place-items: center; } + .content-center { align-content: center; } + .content-end { align-content: flex-end; } + .content-evenly { align-content: space-evenly; } + .items-end { align-items: flex-end; } + .items-center { align-items: center; } + .items-stretch { align-items: stretch; } + .justify-end { justify-content: flex-end; } + .justify-center { justify-content: center; } + .justify-between { justify-content: space-between; } + .gap-0 { gap: 0px; } + .gap-4 { gap: 1rem; } + .gap-6 { gap: 1.5rem; } + .gap-11 { gap: 2.75rem; } + .gap-10 { gap: 2.5rem; } + .gap-x-0 { -moz-column-gap: 0px; column-gap: 0px; } + .gap-y-0 { row-gap: 0px; } + .space-x-8 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(2rem * var(--tw-space-x-reverse)); margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse))); } + .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))); } + .space-y-2 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); } + .divide-y > :not([hidden]) ~ :not([hidden]) { --tw-divide-y-reverse: 0; border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); } + .divide-gray-100 > :not([hidden]) ~ :not([hidden]) { --tw-divide-opacity: 1; border-color: rgb(243 244 246 / var(--tw-divide-opacity)); } + .self-end { align-self: flex-end; } + .overflow-hidden { overflow: hidden; } + .overflow-x-auto { overflow-x: auto; } + .overflow-y-auto { overflow-y: auto; } + .text-ellipsis { text-overflow: ellipsis; } + .text-clip { text-overflow: clip; } + .whitespace-nowrap { white-space: nowrap; } + .break-words { overflow-wrap: break-word; } + .rounded { border-radius: 0.25rem; } + .rounded-lg { border-radius: 0.5rem; } + .rounded-full { border-radius: 9999px; } + .rounded-xl { border-radius: 0.75rem; } + .rounded-md { border-radius: 0.375rem; } + .rounded-t-lg { border-top-left-radius: 0.5rem; border-top-right-radius: 0.5rem; } + .rounded-bl-full { border-bottom-left-radius: 9999px; } + .border { border-width: 1px; } + .border-4 { border-width: 4px; } + .border-2 { border-width: 2px; } + .border-0 { border-width: 0px; } + .border-b { border-bottom-width: 1px; } + .border-b-2 { border-bottom-width: 2px; } + .border-l-8 { border-left-width: 8px; } + .border-solid { border-style: solid; } + .border-none { border-style: none; } + .border-white { --tw-border-opacity: 1; border-color: rgb(255 255 255 / var(--tw-border-opacity)); } + .border-teal-500 { --tw-border-opacity: 1; border-color: rgb(20 184 166 / var(--tw-border-opacity)); } + .border-transparent { border-color: transparent; } + .border-button-primary { --tw-border-opacity: 1; border-color: rgb(88 101 242 / var(--tw-border-opacity)); } + .border-gray-300 { --tw-border-opacity: 1; border-color: rgb(209 213 219 / var(--tw-border-opacity)); } + .border-blue-700 { --tw-border-opacity: 1; border-color: rgb(29 78 216 / var(--tw-border-opacity)); } + .border-gray-600 { --tw-border-opacity: 1; border-color: rgb(75 85 99 / var(--tw-border-opacity)); } + .border-blue-color { --tw-border-opacity: 1; border-color: rgb(24 25 28 / var(--tw-border-opacity)); } + .border-gray-700 { --tw-border-opacity: 1; border-color: rgb(55 65 81 / var(--tw-border-opacity)); } + .border-red-400 { --tw-border-opacity: 1; border-color: rgb(248 113 113 / var(--tw-border-opacity)); } + .border-blue-400 { --tw-border-opacity: 1; border-color: rgb(96 165 250 / var(--tw-border-opacity)); } + .border-red-500 { --tw-border-opacity: 1; border-color: rgb(239 68 68 / var(--tw-border-opacity)); } + .border-gray-200 { --tw-border-opacity: 1; border-color: rgb(229 231 235 / var(--tw-border-opacity)); } + .border-slate-500 { --tw-border-opacity: 1; border-color: rgb(100 116 139 / var(--tw-border-opacity)); } + .bg-transparent { background-color: transparent; } + .bg-teal-500 { --tw-bg-opacity: 1; background-color: rgb(20 184 166 / var(--tw-bg-opacity)); } + .bg-primary-color { background-color: #1E2023;; } + .bg-blue-color { --tw-bg-opacity: 1; background-color: rgb(24 25 28 / var(--tw-bg-opacity)); } + .bg-footer { --tw-bg-opacity: 1; background-color: rgb(39 40 45 / var(--tw-bg-opacity)); } + .bg-button-primary { --tw-bg-opacity: 1; background-color: rgb(88 101 242 / var(--tw-bg-opacity)); } + .bg-gray-50 { --tw-bg-opacity: 1; background-color: rgb(249 250 251 / var(--tw-bg-opacity)); } + .bg-blue-700 { --tw-bg-opacity: 1; background-color: rgb(29 78 216 / var(--tw-bg-opacity)); } + .bg-gray-700 { --tw-bg-opacity: 1; background-color: rgb(55 65 81 / var(--tw-bg-opacity)); } + .bg-blue-600 { --tw-bg-opacity: 1; background-color: rgb(37 99 235 / var(--tw-bg-opacity)); } + .bg-white { --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } + .bg-gray-100 { --tw-bg-opacity: 1; background-color: rgb(243 244 246 / var(--tw-bg-opacity)); } + .bg-gray-200 { --tw-bg-opacity: 1; background-color: rgb(229 231 235 / var(--tw-bg-opacity)); } + .bg-secondary-color { --tw-bg-opacity: 1; background-color: rgb(245 245 245 / var(--tw-bg-opacity)); } + .bg-gray-800 { --tw-bg-opacity: 1; background-color: rgb(31 41 55 / var(--tw-bg-opacity)); } + .bg-red-100 { --tw-bg-opacity: 1; background-color: rgb(254 226 226 / var(--tw-bg-opacity)); } + .bg-gray-300 { --tw-bg-opacity: 1; background-color: rgb(209 213 219 / var(--tw-bg-opacity)); } + .bg-gray-900 { --tw-bg-opacity: 1; background-color: rgb(17 24 39 / var(--tw-bg-opacity)); } + .bg-indigo-500 { --tw-bg-opacity: 1; background-color: rgb(99 102 241 / var(--tw-bg-opacity)); } + .bg-orange-500 { --tw-bg-opacity: 1; background-color: rgb(249 115 22 / var(--tw-bg-opacity)); } + .bg-blue-200 { --tw-bg-opacity: 1; background-color: rgb(191 219 254 / var(--tw-bg-opacity)); } + .bg-blue-900 { --tw-bg-opacity: 1; background-color: rgb(30 58 138 / var(--tw-bg-opacity)); } + +.bg-blue-500 { + --tw-bg-opacity: 1; + background-color: rgb(59 130 246 / var(--tw-bg-opacity)); +} + +.bg-red-500 { + --tw-bg-opacity: 1; + background-color: rgb(239 68 68 / var(--tw-bg-opacity)); +} + .bg-fixed { background-attachment: fixed; } + .bg-right-top { background-position: right top; } + .bg-right { background-position: right; } + .fill-current { fill: currentColor; } + .stroke-current { stroke: currentColor; } + .object-cover { -o-object-fit: cover; object-fit: cover; } + .object-center { -o-object-position: center; object-position: center; } + .p-6 { padding: 1.5rem; } + .p-2 { padding: 0.5rem; } + .p-5 { padding: 1.25rem; } + .p-1 { padding: 0.25rem; } + .p-10 { padding: 2.5rem; } + .p-8 { padding: 2rem; } + .p-96 { padding: 24rem; } + .p-3 { padding: 0.75rem; } + .p-2\.5 { padding: 0.625rem; } + .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; } + .py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; } + .px-4 { padding-left: 1rem; padding-right: 1rem; } + .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; } + .py-4 { padding-top: 1rem; padding-bottom: 1rem; } + .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; } + .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; } + .px-5 { padding-left: 1.25rem; padding-right: 1.25rem; } + .px-6 { padding-left: 1.5rem; padding-right: 1.5rem; } + .px-0 { padding-left: 0px; padding-right: 0px; } + .py-2\.5 { padding-top: 0.625rem; padding-bottom: 0.625rem; } + .pt-2 { padding-top: 0.5rem; } + .pl-3 { padding-left: 0.75rem; } + .pl-10 { padding-left: 2.5rem; } + .pt-4 { padding-top: 1rem; } + .pb-2 { padding-bottom: 0.5rem; } + .pt-8 { padding-top: 2rem; } + .pl-4 { padding-left: 1rem; } + .pr-4 { padding-right: 1rem; } + .pb-3 { padding-bottom: 0.75rem; } + .pr-10 { padding-right: 2.5rem; } + .pl-6 { padding-left: 1.5rem; } + .pr-6 { padding-right: 1.5rem; } + .pl-5 { padding-left: 1.25rem; } + .pr-5 { padding-right: 1.25rem; } + .pb-0 { padding-bottom: 0px; } + .pt-0 { padding-top: 0px; } + +.pt-5 { + padding-top: 1.25rem; +} + +.pb-px { + padding-bottom: 1px; +} + .text-left { text-align: left; } + .text-center { text-align: center; } + .text-justify { text-align: justify; } + .text-end { text-align: end; } + .text-3xl { font-size: 1.875rem; line-height: 2.25rem; } + .text-xl { font-size: 1.25rem; line-height: 1.75rem; } + .text-sm { font-size: 0.875rem; line-height: 1.25rem; } + .text-base { font-size: 1rem; line-height: 1.5rem; } + .text-lg { font-size: 1.125rem; line-height: 1.75rem; } + .text-xs { font-size: 0.75rem; line-height: 1rem; } + .text-2xl { font-size: 1.5rem; line-height: 2rem; } + .font-bold { font-weight: 700; } + .font-semibold { font-weight: 600; } + .font-medium { font-weight: 500; } + .font-normal { font-weight: 400; } + .uppercase { text-transform: uppercase; } + .italic { font-style: italic; } + .leading-none { line-height: 1; } + .leading-tight { line-height: 1.25; } + .tracking-tight { letter-spacing: -0.025em; } + .tracking-wide { letter-spacing: 0.025em; } + .text-white { --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); } + .text-teal-200 { --tw-text-opacity: 1; color: rgb(153 246 228 / var(--tw-text-opacity)); } + .text-gray-800 { --tw-text-opacity: 1; color: rgb(31 41 55 / var(--tw-text-opacity)); } + .text-gray-900 { --tw-text-opacity: 1; color: rgb(17 24 39 / var(--tw-text-opacity)); } + .text-gray-600 { --tw-text-opacity: 1; color: rgb(75 85 99 / var(--tw-text-opacity)); } + .text-gray-500 { --tw-text-opacity: 1; color: rgb(107 114 128 / var(--tw-text-opacity)); } + .text-gray-700 { --tw-text-opacity: 1; color: rgb(55 65 81 / var(--tw-text-opacity)); } + .text-teal-500 { --tw-text-opacity: 1; color: rgb(20 184 166 / var(--tw-text-opacity)); } + .text-gray-400 { --tw-text-opacity: 1; color: rgb(156 163 175 / var(--tw-text-opacity)); } + .text-primary-color { color: #1E2023;; } + .text-black { --tw-text-opacity: 1; color: rgb(0 0 0 / var(--tw-text-opacity)); } + .text-red-700 { --tw-text-opacity: 1; color: rgb(185 28 28 / var(--tw-text-opacity)); } + .text-red-500 { --tw-text-opacity: 1; color: rgb(239 68 68 / var(--tw-text-opacity)); } + .text-blue-700 { --tw-text-opacity: 1; color: rgb(29 78 216 / var(--tw-text-opacity)); } + .text-blue-400 { --tw-text-opacity: 1; color: rgb(96 165 250 / var(--tw-text-opacity)); } + .text-blue-600 { --tw-text-opacity: 1; color: rgb(37 99 235 / var(--tw-text-opacity)); } + .text-blue-500 { --tw-text-opacity: 1; color: rgb(59 130 246 / var(--tw-text-opacity)); } + .text-orange-500 { --tw-text-opacity: 1; color: rgb(249 115 22 / var(--tw-text-opacity)); } + .text-gray-300 { --tw-text-opacity: 1; color: rgb(209 213 219 / var(--tw-text-opacity)); } + .text-blue-200 { --tw-text-opacity: 1; color: rgb(191 219 254 / var(--tw-text-opacity)); } + .text-blue-color { --tw-text-opacity: 1; color: rgb(24 25 28 / var(--tw-text-opacity)); } + .text-button-primary { --tw-text-opacity: 1; color: rgb(88 101 242 / var(--tw-text-opacity)); } + .underline { -webkit-text-decoration-line: underline; text-decoration-line: underline; } + .no-underline { -webkit-text-decoration-line: none; text-decoration-line: none; } + .antialiased { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } + +.placeholder-gray-400::-moz-placeholder { + --tw-placeholder-opacity: 1; + color: rgb(156 163 175 / var(--tw-placeholder-opacity)); +} + +.placeholder-gray-400::placeholder { + --tw-placeholder-opacity: 1; + color: rgb(156 163 175 / var(--tw-placeholder-opacity)); +} + .opacity-0 { opacity: 0; } + .opacity-100 { opacity: 1; } + .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-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-none { --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } + .shadow-2xl { --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); --tw-shadow-colored: 0 25px 50px -12px 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-sm { --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); --tw-shadow-colored: 0 1px 2px 0 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); } + .shadow-white { --tw-shadow-color: #fff; --tw-shadow: var(--tw-shadow-colored); } + .shadow-indigo-500 { --tw-shadow-color: #6366f1; --tw-shadow: var(--tw-shadow-colored); } + .outline-none { outline: 2px solid transparent; outline-offset: 2px; } + .outline { outline-style: solid; } + .ring-4 { --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color); box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } + .ring-1 { --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } + .ring-blue-300 { --tw-ring-opacity: 1; --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity)); } + .ring-button-primary { --tw-ring-opacity: 1; --tw-ring-color: rgb(88 101 242 / var(--tw-ring-opacity)); } + .ring-black { --tw-ring-opacity: 1; --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity)); } + .ring-opacity-5 { --tw-ring-opacity: 0.05; } + .ring-offset-gray-800 { --tw-ring-offset-color: #1f2937; } + .drop-shadow { --tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / 0.1)) drop-shadow(0 1px 1px rgb(0 0 0 / 0.06)); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } + .grayscale { --tw-grayscale: grayscale(100%); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } + .filter { filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } + .transition { transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter; transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; @@ -1776,131 +2224,109 @@ video { transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } + .transition-shadow { transition-property: box-shadow; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } + .transition-opacity { transition-property: opacity; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } + .duration-300 { transition-duration: 300ms; } + .duration-100 { transition-duration: 100ms; } + .duration-75 { transition-duration: 75ms; } + .duration-150 { transition-duration: 150ms; } + .ease-in-out { transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } + .ease-out { transition-timing-function: cubic-bezier(0, 0, 0.2, 1); } + .ease-in { transition-timing-function: cubic-bezier(0.4, 0, 1, 1); } + .content-none { --tw-content: none; content: var(--tw-content); } -@import url('https://fonts.googleapis.com/css2?family=Quicksand&display=swap'); + body { - font-family: 'Quicksand', sans-serif; - justify-content: space-around; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; + font-family: 'Quicksand', sans-serif; + justify-content: space-around; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } @font-face { - font-family: 'Quicksand'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/quicksand/v30/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkP8o58m-wi40.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; + font-family: 'Quicksand'; + + font-style: normal; + + font-weight: 400; + + font-display: swap; + + src: url(https://fonts.gstatic.com/s/quicksand/v30/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkP8o58m-wi40.woff2) format('woff2'); + + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; } @font-face { - font-family: 'Quicksand'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/quicksand/v30/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkP8o58i-wi40.woff2) format('woff2'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; + font-family: 'Quicksand'; + + font-style: normal; + + font-weight: 400; + + font-display: swap; + + src: url(https://fonts.gstatic.com/s/quicksand/v30/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkP8o58i-wi40.woff2) format('woff2'); + + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } @font-face { - font-family: 'Quicksand'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/quicksand/v30/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkP8o58a-wg.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} + font-family: 'Quicksand'; + font-style: normal; + + font-weight: 400; + + font-display: swap; + + src: url(https://fonts.gstatic.com/s/quicksand/v30/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkP8o58a-wg.woff2) format('woff2'); + + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} /* media query for logo to vanish on small screens */ @media (max-width: 768px) { - .logo { - display: none; - } + .logo { + display: none; + } } -/* - :root { - --bg: #18191C; - --blue-color-hover: #4554F2; - --bg-section-hover: #27282D; - --color-result-shadow: #1E2023; - --bg-button-dark: #1E2023; - --bg-button-dark-hover: #26282B; - --bg-footer: #27282D; - --form-background: #18191C; - --form-input: #1E2023; - --input-disabled: #26282B; - --tooltip-bg: #000; -} - -[data-theme="light"] { - --bg-card: #D4D5D7; - --bg-section: #5865F2; - --bg-section-hover: #ECECEC; - --text-section-hover: #000; - --text-section: #fff; - --bg-body: #F5F5F5; - --button-green: #5865F2; - --button-green-hover: #4554F2; - --button-text-section: #fff; - --button-text: #000; - --color-result-shadow: #ECECEC; - --color-result-text: #000; - --body-text: #000; - --body-icon: #5865F2; - --bg-button-dark: #ECECEC; - --bg-button-dark-hover: #C7C6C6; - --bg-footer: #515CDA; - --footer-text: #fff; - --footer-text-hover: #18191C; - --color-dropdown: #D4D5D7; - --button-text-section: #fff; - --form-background: #D4D5D7; - --form-input: #ECECEC; - --input-disabled: #C7C6C6; - --label-color: #000; - --input-color: #000; - --tooltip-bg: #000; - --tooltip-text: #fff; -}*/ - .hover\:border-transparent:hover { border-color: transparent; } @@ -1914,6 +2340,16 @@ body { background-color: rgb(88 101 242 / var(--tw-bg-opacity)); } +.hover\:bg-blue-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(29 78 216 / var(--tw-bg-opacity)); +} + +.hover\:bg-red-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(185 28 28 / var(--tw-bg-opacity)); +} + .hover\:bg-gray-100:hover { --tw-bg-opacity: 1; background-color: rgb(243 244 246 / var(--tw-bg-opacity)); @@ -1934,6 +2370,11 @@ body { color: rgb(255 255 255 / var(--tw-text-opacity)); } +.hover\:text-blue-300:hover { + --tw-text-opacity: 1; + color: rgb(147 197 253 / var(--tw-text-opacity)); +} + .hover\:text-blue-600:hover { --tw-text-opacity: 1; color: rgb(37 99 235 / var(--tw-text-opacity)); @@ -1949,11 +2390,6 @@ body { color: rgb(24 25 28 / var(--tw-text-opacity)); } -.hover\:text-blue-300:hover { - --tw-text-opacity: 1; - color: rgb(147 197 253 / var(--tw-text-opacity)); -} - .hover\:no-underline:hover { -webkit-text-decoration-line: none; text-decoration-line: none; @@ -2007,6 +2443,11 @@ body { --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity)); } +.focus\:ring-blue-800:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity)); +} + .peer:-moz-placeholder-shown ~ .peer-placeholder-shown\:translate-y-0 { --tw-translate-y: 0px; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); @@ -2048,13 +2489,17 @@ body { font-weight: 500; } +.peer:focus ~ .peer-focus\:text-blue-500 { + --tw-text-opacity: 1; + color: rgb(59 130 246 / var(--tw-text-opacity)); +} + .peer:focus ~ .peer-focus\:text-blue-600 { --tw-text-opacity: 1; color: rgb(37 99 235 / var(--tw-text-opacity)); } @media (prefers-color-scheme: dark) { - .dark\:border-gray-600 { --tw-border-opacity: 1; border-color: rgb(75 85 99 / var(--tw-border-opacity)); @@ -2169,7 +2614,6 @@ body { } @media (min-width: 640px) { - .sm\:inline { display: inline; } @@ -2190,7 +2634,6 @@ body { } @media (min-width: 768px) { - .md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } @@ -2201,7 +2644,6 @@ body { } @media (min-width: 1024px) { - .lg\:m-4 { margin: 1rem; } @@ -2265,14 +2707,12 @@ body { } @media (min-width: 1280px) { - .xl\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } } @media (min-width: 1536px) { - .\32xl\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } diff --git a/website/public/css/tailwind.css b/website/public/css/tailwind.css index 9317ec6..ad25d64 100644 --- a/website/public/css/tailwind.css +++ b/website/public/css/tailwind.css @@ -43,50 +43,4 @@ body { .logo { display: none; } -} - -/* - :root { - --bg: #18191C; - --blue-color-hover: #4554F2; - --bg-section-hover: #27282D; - --color-result-shadow: #1E2023; - --bg-button-dark: #1E2023; - --bg-button-dark-hover: #26282B; - --bg-footer: #27282D; - --form-background: #18191C; - --form-input: #1E2023; - --input-disabled: #26282B; - --tooltip-bg: #000; -} - -[data-theme="light"] { - --bg-card: #D4D5D7; - --bg-section: #5865F2; - --bg-section-hover: #ECECEC; - --text-section-hover: #000; - --text-section: #fff; - --bg-body: #F5F5F5; - --button-green: #5865F2; - --button-green-hover: #4554F2; - --button-text-section: #fff; - --button-text: #000; - --color-result-shadow: #ECECEC; - --color-result-text: #000; - --body-text: #000; - --body-icon: #5865F2; - --bg-button-dark: #ECECEC; - --bg-button-dark-hover: #C7C6C6; - --bg-footer: #515CDA; - --footer-text: #fff; - --footer-text-hover: #18191C; - --color-dropdown: #D4D5D7; - --button-text-section: #fff; - --form-background: #D4D5D7; - --form-input: #ECECEC; - --input-disabled: #C7C6C6; - --label-color: #000; - --input-color: #000; - --tooltip-bg: #000; - --tooltip-text: #fff; -}*/ \ No newline at end of file +} \ No newline at end of file diff --git a/website/routers/admin/index.js b/website/routers/admin/index.js index 3f7b8fc..0b00495 100644 --- a/website/routers/admin/index.js +++ b/website/routers/admin/index.js @@ -25,14 +25,23 @@ router.get('/', async function (req, res) { } }) -router.get('/bot/:d', async function (req, res) { +router.get('/bot/:d/:f', async function (req, res) { if (req.user) { if (global.config.users.verificator.includes(req.user.id) || global.config.users.owner.includes(req.user.id)) { const bot = await bots.find({ id: req.params.d }); - res.render('admin/bot', { - user: req.user, - bots: bot - }); + if (req.params.f == 'reject') { + res.render('admin/bot', { + user: req.user, + bots: bot, + reject: true + }); + } else if (req.params.f == 'accept') { + res.render('admin/bot', { + user: req.user, + bots: bot, + accept: true + }); + } } else { res.redirect('/'); } @@ -42,4 +51,83 @@ router.get('/bot/:d', async function (req, res) { } }) +router.get('/bot/:d/:f', async function (req, res) { + if (req.user) { + if (global.config.users.verificator.includes(req.user.id) || global.config.users.owner.includes(req.user.id)) { + var bot = await bots.findOne({ id: req.params.d }); + if (!bot) { + return res.redirect('/'); + } + if (req.params.f == 'reject') { + res.render('admin/bot', { + user: req.user, + bots: bot, + accept: true + }); + } else if (req.params.f == 'verify') { + res.render('admin/bot', { + user: req.user, + bots: bot, + verify: true + }); + } else { + res.redirect('/admin'); + } + } else { + res.redirect('/'); + } + } else { + req.session.backURL = req.originalUrl; + res.redirect('/auth'); + } +}) + +router.post('/bot/:d/:f', async function (req, res) { + if (req.user) { + if (global.config.users.verificator.includes(req.user.id) || global.config.users.owner.includes(req.user.id)) { + var bot = await bots.findOne({ id: req.params.d }); + if (!bot) { + res.redirect('/admin'); + } + if (req.params.f == 'reject') { + bot.owners.forEach(async function (owner) { + global.client.users.fetch(owner).then(async function (user) { + try { + user.send(`Your bot ${bot.name} has been rejected by the admin. With the reason: ${req.body.reason}`); + global.client.channels.cache.get(global.config.bot.channels.new).send(`${bot.name} has been rejected by the admin. With the reason: ${req.body.reason}`); + } + catch (e) { + } + }) + }) + var rem = await bots.findOneAndDelete({ id: req.params.d }) + if (rem) { + res.redirect('/admin'); + } else { + res.redirect('/admin'); + } + + } else if (req.params.f == 'verify') { + bot.verified = true; + bot.save(); + bot.owners.forEach(async function (owner) { + global.client.users.fetch(owner).then(async function (user) { + try { + user.send(`Your bot ${bot.name} has been accepted by the admin.`); + global.client.channels.cache.get(global.config.bot.channels.new).send(`${bot.name} has been accepted by the admin. View it at: https://botscord.xyz/bot/${bot.id}`); + } + catch (e) { + } + }) + }) + res.redirect('/admin'); + } + } else { + res.redirect('/'); + } + } else { + req.session.backURL = req.originalUrl; + res.redirect('/auth'); + } +}) module.exports = router; \ No newline at end of file diff --git a/website/routers/bot/index.js b/website/routers/bot/index.js index 3f45049..f3fd8de 100644 --- a/website/routers/bot/index.js +++ b/website/routers/bot/index.js @@ -5,6 +5,9 @@ var votes = require('../../../models/votes'); const client = require('../../index'); var getIP = require('ipware')().get_ip; var geoip = require('geoip-lite'); +var showdown = require('showdown'), + converter = new showdown.Converter() +const sanitizeHtml = require('sanitize-html'); function makeid(length) { var result = ''; @@ -22,7 +25,11 @@ router.get('/', function () { }) router.get('/add', function (req, res) { if (req.user) { - res.render('bot/add', { user: req.user }); + res.render('bot/add', { + user: req.user, + message: req.session.message || undefined, + error: req.session.error || undefined, + }); return } else { req.session.backURL = req.originalUrl; @@ -81,63 +88,96 @@ router.get('/:botID', async function (req, res) { req.session.error = "No bot found"; return res.redirect('/'); } - let referresURL = String(req.headers.referer).replace("undefined", "Unkown").split('.').join(','); - await bots.updateOne({ - id: req.params.botID - }, { - $inc: { - analytics_visitors: 1 + if (bot.verified == false) { + if(!req.user) { + req.backURL = req.originalUrl; + return res.redirect('/auth'); } - }) - - var ipInfo = getIP(req); - var ip = ipInfo.clientIp; - var geo = geoip.lookup(ip); - - if (geo) { - let CountryCode = geo.country || "TR" + if (bot.owners.includes(req.user.id)) { + let coowner = new Array() + await bot.owners.forEach(async function (a) { + try { + var b = await global.bsl.users.fetch(a) + } catch (e) { + } + if (!b) return; + coowner.push(b) + }) + var html = converter.makeHtml(bot.long_description); + html = sanitizeHtml(html) + res.render('bot/index', { + bot: bot, + user: req.user, + owners: coowner, + bota: await global.bsl.users.fetch(bot.id), + description: html + }); + } else { + req.session.error = "Bot not verified"; + return res.redirect('/'); + } + } else { + let referresURL = String(req.headers.referer).replace("undefined", "Unkown").split('.').join(','); await bots.updateOne({ id: req.params.botID }, { $inc: { - [`country.${CountryCode}`]: 1 + analytics_visitors: 1 } }) - } - await bots.updateOne({ - id: req.params.botID - }, { - $inc: { - [`analytics.${referresURL}`]: 1 + + var ipInfo = getIP(req); + var ip = ipInfo.clientIp; + var geo = geoip.lookup(ip); + + if (geo) { + let CountryCode = geo.country || "TR" + await bots.updateOne({ + id: req.params.botID + }, { + $inc: { + [`country.${CountryCode}`]: 1 + } + }) } - }) - let coowner = new Array() - await bot.owners.forEach(async function (a) { + await bots.updateOne({ + id: req.params.botID + }, { + $inc: { + [`analytics.${referresURL}`]: 1 + } + }) + let coowner = new Array() + await bot.owners.forEach(async function (a) { + try { + var b = await global.bsl.users.fetch(a) + } catch (e) { + } + if (!b) return; + coowner.push(b) + }) try { - var b = await global.bsl.users.fetch(a) + var bota = await global.bsl.users.fetch(bot.id) } catch (e) { + if (!bota) { + req.session.error = "No bot found"; + return res.redirect('/'); + } } - if (!b) return; - coowner.push(b) - }) - try { - var bota = await global.bsl.users.fetch(bot.id) - } catch (e) { if (!bota) { req.session.error = "No bot found"; return res.redirect('/'); } + var html = converter.makeHtml(bot.long_description); + html = sanitizeHtml(html) + res.render('bot/index', { + bot: bot, + user: req.user, + owners: coowner, + bota: await global.bsl.users.fetch(bot.id), + description: html + }); } - if (!bota) { - req.session.error = "No bot found"; - return res.redirect('/'); - } - res.render('bot/index', { - bot: bot, - user: req.user, - owners: coowner, - bota: bota - }); }) }) @@ -155,11 +195,17 @@ router.get('/:botID/settings', async function (req, res) { req.session.error = "No bot found"; return res.redirect('/'); } - res.render('bot/edit', { - bot: bot, - user: req.user, - }); - + if (bot.owners.includes(req.user.id)) { + res.render('bot/edit', { + bot: bot, + user: req.user, + message: req.session.message || undefined, + error: req.session.error || undefined, + }); + } else { + req.session.error = "You are not the owner of this bot"; + res.redirect('/'); + } }); } }); @@ -178,12 +224,18 @@ router.get('/:botID/analytics', async function (req, res) { req.session.error = "No bot found"; return res.redirect('/'); } - res.render('bot/analytics', { - bot: bot, - user: req.user, - bota: await global.bsl.users.fetch(bot.id) - }); - + if (bot.owners.includes(req.user.id)) { + res.render('bot/analytics', { + bot: bot, + user: req.user, + bota: await global.bsl.users.fetch(bot.id), + message: req.session.message || undefined, + error: req.session.error || undefined, + }); + } else { + req.session.error = "You are not the owner of this bot"; + res.redirect('/'); + } }); } }); @@ -203,25 +255,65 @@ router.post('/:botID/settings', async function (req, res) { return res.redirect('/'); } if (!bot.owners.includes(req.user.id)) { - - req.session.error = "You do not have permission to edit this bot"; return res.redirect('/'); } - bot.name = req.body.bot_name; - bot.description = req.body.bot_short; - bot.long_description = req.body.bot_description; - bot.save(function (err) { + bots.findOne({ vanity: req.body.bot_vanity }, async function (err, bot2) { if (err) { console.log(err); - req.session.error = "Something went wrong"; - res.redirect('/'); + return res.redirect('/'); + } + if (bot2) { + if (bot2.id != bot.id) { + req.session.error = "This vanity is already in use"; + return res.redirect('/'); + } else { + + bot.name = req.body.bot_name; + bot.description = req.body.bot_short; + bot.long_description = req.body.bot_description; + bot.vanity = req.body.bot_vanity.toLowerCase(); + bot.save(function (err) { + if (err) { + console.log(err); + req.session.error = "Something went wrong"; + res.redirect('/'); + } else { + req.session.message = "Bot updated"; + res.redirect('/bot/' + req.params.botID + '/settings'); + } + }); + } } else { - req.session.message = "Bot updated"; - res.redirect('/'); + servers.findOne({ vanity: req.body.bot_vanity }, async function (err, server) { + if (err) { + console.log(err); + return res.redirect('/'); + } + if (server) { + req.session.error = "This vanity is already in use"; + return res.redirect('/'); + } else { + + bot.name = req.body.bot_name; + bot.description = req.body.bot_short; + bot.long_description = req.body.bot_description; + bot.vanity = req.body.bot_vanity.toLowerCase(); + bot.save(function (err) { + if (err) { + console.log(err); + req.session.error = "Something went wrong"; + res.redirect('/'); + } else { + req.session.message = "Bot updated"; + res.redirect('/bot/' + req.params.botID + '/settings'); + } + }); + } + }); } }); - }); + }) } }); router.get('/:botID/vote', async function (req, res) { @@ -264,13 +356,13 @@ router.get('/:botID/vote', async function (req, res) { if (err) { console.log(err); req.session.error = "Something went wrong"; - return res.redirect('/'); + return res.redirect('/bot/' + req.params.botID); } }) global.client.channels.cache.get(global.config.bot.channels.vote).send(`${req.user.username} has voted for bot: ${bot.name} | `); req.session.message = "Vote added"; - return res.redirect('/'); + return res.redirect('/bot/' + req.params.botID); }) } else { // add vote to database @@ -283,7 +375,7 @@ router.get('/:botID/vote', async function (req, res) { if (err) { console.log(err); req.session.error = "Something went wrong"; - return res.redirect('/'); + return res.redirect('/bot/' + req.params.botID); } else { if (bot.votes) { bot.votes = 1; @@ -294,11 +386,11 @@ router.get('/:botID/vote', async function (req, res) { if (err) { console.log(err); req.session.error = "Something went wrong"; - return res.redirect('/'); + return res.redirect('/bot/' + req.params.botID); } else { global.client.channels.cache.get(global.config.bot.channels.vote).send(`${req.user.username} has voted for bot: ${bot.name} | `); req.session.message = "Vote added"; - return res.redirect('/'); + return res.redirect('/bot/' + req.params.botID); } }) } @@ -309,4 +401,29 @@ router.get('/:botID/vote', async function (req, res) { } }) +router.get('/:botID/invite', async function (req, res) { + bots.findOne({ id: req.params.botID }, async function (err, bot) { + if (err) { + console.log(err); + return res.redirect('/'); + } + if (!bot) { + req.session.error = "No bot found"; + return res.redirect('/'); + } + if (!bot.invite) { + var invite = "https://discord.com/oauth2/authorize?client_id=" + bot.id + "&scope=bot&permissions=8"; + return res.render('bot/join', { + bot: bot, + invite: invite, + }) + } + return res.render('bot/join', { + bot: bot, + invite: bot.invite, + }) + }) +}) + + module.exports = router; \ No newline at end of file diff --git a/website/routers/servers/index.js b/website/routers/servers/index.js index 06ee77f..ab91fe4 100644 --- a/website/routers/servers/index.js +++ b/website/routers/servers/index.js @@ -2,6 +2,7 @@ var express = require('express'), router = express.Router(); var servers = require('../../../models/server'); var votes = require('../../../models/votes'); +var bots = require('../../../models/bot'); const client = require('../../../index'); const Discord = require('discord.js'); var showdown = require('showdown'), @@ -167,13 +168,13 @@ router.get('/:server', async function (req, res) { }) }) -router.get('/:server/settings',async function (req, res) { +router.get('/:server/settings', async function (req, res) { if (!req.user) { req.session.backURL = req.originalUrl; res.redirect('/auth'); return; } - servers.findOne({ id: req.params.server },async function (err, server) { + servers.findOne({ id: req.params.server }, async function (err, server) { if (err) { console.log(err); return res.redirect('/'); @@ -188,7 +189,9 @@ router.get('/:server/settings',async function (req, res) { res.render('server/edit', { user: req.user, server: server, - serverr: serverr + serverr: serverr, + message: req.session.message || undefined, + error: req.session.error || undefined, }); } else { req.session.error = "You don't have permission to edit this server"; @@ -206,7 +209,7 @@ router.post('/:server/settings', async function (req, res) { req.session.backURL = req.originalUrl; res.redirect('/auth'); } - servers.findOne({ id: req.params.server }, function (err, server) { + servers.findOne({ id: req.params.server }, async function (err, server) { if (err) { console.log(err); return res.redirect('/'); @@ -215,21 +218,62 @@ router.post('/:server/settings', async function (req, res) { req.session.error = "No server found"; return res.redirect('/'); } - var serverr = global.client.guilds.cache.get(server.id) + var serverr = await global.bsl.guilds.cache.get(server.id) if (serverr.members.cache.get(req.user.id)) { if (serverr.members.cache.get(req.user.id).permissions.has('ADMINISTRATOR')) { - server.description = req.body.server_short; - server.long_description = req.body.server_description; - server.tags = req.body.tags; - server.webhook = req.body.server_webhook; - server.save(function (err) { + servers.findOne({ vanity: req.body.server_vanity }, async function (err, server2) { if (err) { console.log(err); - req.session.error = "Something went wrong"; - res.redirect('/'); + return res.redirect('/server/' + req.params.server + '/settings'); + } + if (server2) { + if (server2.id != req.params.server) { + req.session.error = "Vanity already exists"; + return res.redirect('/server/' + req.params.server + '/settings'); + } else { + server.description = req.body.server_short; + server.long_description = req.body.server_description; + server.tags = req.body.tags; + server.webhook = req.body.server_webhook; + server.vanity = req.body.server_vanity.toLowerCase(); + server.save(function (err) { + if (err) { + console.log(err); + req.session.error = "Something went wrong"; + res.redirect('/server/' + req.params.server + '/settings'); + } else { + req.session.message = "Server edited"; + res.redirect('/server/' + req.params.server + '/settings'); + } + }); + } } else { - req.session.message = "Server edited"; - res.redirect('/'); + bots.findOne({ vanity: req.body.server_vanity }, async function (err, bot) { + if (err) { + console.log(err); + return res.redirect('/server/' + req.params.server + '/settings'); + } + if (bot) { + req.session.error = "Vanity already exists"; + return res.redirect('/server/' + req.params.server + '/settings'); + } else { + server.description = req.body.server_short; + server.long_description = req.body.server_description; + server.tags = req.body.tags; + server.webhook = req.body.server_webhook; + server.vanity = req.body.server_vanity.toLowerCase(); + server.save(function (err) { + if (err) { + console.log(err); + req.session.error = "Something went wrong"; + res.redirect('/server/' + req.params.server + '/settings'); + } else { + req.session.message = "Server edited"; + res.redirect('/server/' + req.params.server + '/settings'); + } + }); + } + }) } }); } else { @@ -300,7 +344,7 @@ router.get('/:server/vote', function (req, res) { } global.client.channels.cache.get(global.config.bot.channels.vote).send(`${req.user.username} has voted for server ${bot.name} | `); req.session.message = "Vote added"; - return res.redirect('/'); + return res.redirect('/bot/' + bot.id); }) } else { // add vote to database @@ -365,7 +409,7 @@ router.get('/:server/join', async function (req, res) { res.render('server/join', { url: urlInvite, server: server, - serverr:await global.bsl.guilds.cache.get(server.id) + serverr: await global.bsl.guilds.cache.get(server.id) }); }); }) diff --git a/website/views/admin/bot.ejs b/website/views/admin/bot.ejs index e1f6903..a163f0e 100644 --- a/website/views/admin/bot.ejs +++ b/website/views/admin/bot.ejs @@ -1,39 +1,16 @@ <%- include("../includes/header.ejs", { title: "Bot" + bots.name}) %> -
- - - - - - - - - - - <% var nbots = bots.filter(bot => bot.verified == false); %> - <% nbots.forEach(function(bot) { %> - - - - - - - <% }) %> - -
- Bot Name - - BotID - - Bot Description - - Owner -
- <%= bot.name %> - - <%= bot.id %> - - <%= bot.description %> - - <%= bot.owner %> -
\ No newline at end of file +
+ <% if(typeof reject != "undefined") { %> +
+

Are you sure you want to reject this bot?

+

Reason:

+ + +
+ <% } %> + <% if(typeof verify != "undefined") { %> +
+

Are you sure you want to verify this bot?

+ +
+ <% } %> \ No newline at end of file diff --git a/website/views/admin/index.ejs b/website/views/admin/index.ejs index b26d159..311fb86 100644 --- a/website/views/admin/index.ejs +++ b/website/views/admin/index.ejs @@ -15,12 +15,15 @@ Owner + + Verify + - <% var nbots = bots.filter(bot => bot.verified == false); %> + <% var nbots = bots.filter(bot => bot.verified == false); %> <% nbots.forEach(function(bot) { %> - + <%= bot.name %> @@ -33,6 +36,16 @@ <%= bot.owner %> + +
+ +
+ + <% }) %> diff --git a/website/views/bot/edit.ejs b/website/views/bot/edit.ejs index 0ac3990..38cc29a 100644 --- a/website/views/bot/edit.ejs +++ b/website/views/bot/edit.ejs @@ -16,14 +16,27 @@ -

+
+
+ + + https://botscord.xyz/i/ +
+ +

This token can be used to access your bot via our api

-

Access api docs

- +

Access api docs

- +
+ + +<%- include('../includes/footer.ejs') %> \ No newline at end of file diff --git a/website/views/error.ejs b/website/views/error.ejs index 4e55447..80e0177 100644 --- a/website/views/error.ejs +++ b/website/views/error.ejs @@ -6,4 +6,5 @@

Error: <%= errorr %>

- \ No newline at end of file + +
\ No newline at end of file diff --git a/website/views/includes/header.ejs b/website/views/includes/header.ejs index 10aece4..9c949a9 100644 --- a/website/views/includes/header.ejs +++ b/website/views/includes/header.ejs @@ -97,8 +97,8 @@