aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--api/git.js23
-rw-r--r--api/v1.js67
-rw-r--r--app.js89
-rw-r--r--dist/app.2e5e74f9.css5995
-rw-r--r--dist/app.9232838b.js693
-rw-r--r--dist/app.html11
-rw-r--r--package.json9
-rw-r--r--src/app.html11
-rw-r--r--src/index.html34
-rw-r--r--src/js/app.js191
-rw-r--r--src/scss/style.scss50
-rw-r--r--yarn.lock12
13 files changed, 7088 insertions, 100 deletions
diff --git a/.gitignore b/.gitignore
index 62935ec..4c7f0fe 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
.parcel-cache
-node_modules \ No newline at end of file
+node_modules
+settings.yml \ No newline at end of file
diff --git a/api/git.js b/api/git.js
index 59f7371..72ca5a1 100644
--- a/api/git.js
+++ b/api/git.js
@@ -30,9 +30,9 @@ function execGit(path, action , format, args = "")
});
}
-async function getLog(path)
+async function getLog(base_dir, path)
{
- let log = await execGit(path, "log", log_format);
+ let log = await execGit(`${base_dir}/${path}`, "log", log_format);
if(!log["error"]) {
log["data"] = log["data"].split('\n');
@@ -118,5 +118,22 @@ function getBasicRepoInfo(base_dir, repo_dirs)
});
}
+function getRepos(base_dir)
+{
+ return new Promise((resolve) =>
+ {
+ fs.readdir(base_dir, async (err, content) =>
+ {
+ if(err) {
+ resolve({ "error": err });
+ return;
+ }
+ resolve({ "data": content });
+ });
+ });
+}
+
module.exports.getLog = getLog;
-module.exports.getBasicRepoInfo = getBasicRepoInfo; \ No newline at end of file
+module.exports.getBasicRepoInfo = getBasicRepoInfo;
+module.exports.getRepos = getRepos;
+module.exports.getRepoFile = getRepoFile; \ No newline at end of file
diff --git a/api/v1.js b/api/v1.js
index 75509ad..7358d3b 100644
--- a/api/v1.js
+++ b/api/v1.js
@@ -1,52 +1,63 @@
const express = require("express");
const git = require("./git");
const sanitization = require("./sanitization");
-const fs = require('fs');
const router = express.Router();
-const base_dir="/home/hampus/Projects/"
+
+router.get("/info", function(req, res)
+{
+ res.json({ "data": req.settings });
+ return;
+});
router.get("/repos", async function(req, res)
{
- fs.readdir(base_dir, async (err, repo_dirs) =>
- {
- if(err) {
- throw err;
- }
- repo_dirs = repo_dirs.filter(repo => repo.endsWith(".git"));
+ let repo_dirs = await git.getRepos(req.settings["base_dir"]);
- console.log("Repo dirs: " + repo_dirs);
+ if(repo_dirs["error"]) {
+ res.status(500).send("Internal server error!");
+ return;
+ }
- const repos = await git.getBasicRepoInfo(base_dir, repo_dirs);
+ repo_dirs = repo_dirs["data"].filter(repo => repo.endsWith(".git"));
+ const repos = await git.getBasicRepoInfo(req.settings["base_dir"], repo_dirs);
+ res.json({ "data": repos });
+});
- console.log("I v1.js\n" + JSON.stringify(repos) + "\n");
+router.get("/repos/:repo", async function(req, res)
+{
+ if(!sanitization.sanitizeRepoName(req.params.repo)) {
+ res.status(400).json({ "error": "Unacceptable git repository name!" });
+ return;
+ }
+ const repo = `${req.params.repo}.git`;
+ const desc = await git.getRepoFile(req.settings["base_dir"], repo, "description");
- res.json({ "data": repos });
- });
+ res.json({ "data": { "name": req.params.repo, "description": desc } });
});
router.get("/repos/:repo/log", async function(req, res)
{
- if(sanitization.sanitizeRepoName(req.params.repo)) {
- const repo = `${req.params.repo}.git`;
- const log = await git.getLog(`${base_dir}/${repo}`);
+ if(!sanitization.sanitizeRepoName(req.params.repo)) {
+ res.status(400).json({ "error": "Unacceptable git repository name!" });
+ return;
+ }
+ const repo = `${req.params.repo}.git`;
+ const log = await git.getLog(req.settings["base_dir"], repo);
- if(log["error"]) {
- if(typeof log["error"] === "string") {
- res.status(500).json({ "error": log["error"] });
- return;
- }
- switch(log["error"]) {
- case 404:
- res.status(404).json({ "error": "Git repository doesn't exist!" });
- return;
- }
+ if(log["error"]) {
+ if(typeof log["error"] === "string") {
+ res.status(500).json({ "error": log["error"] });
return;
}
- res.json(log);
+ switch(log["error"]) {
+ case 404:
+ res.status(404).json({ "error": "Git repository doesn't exist!" });
+ return;
+ }
return;
}
- res.status(400).json({ "error": "Unacceptable git repository name!" });
+ res.json(log);
});
module.exports = router; \ No newline at end of file
diff --git a/app.js b/app.js
index 66b7cd8..51c8958 100644
--- a/app.js
+++ b/app.js
@@ -1,14 +1,85 @@
const express = require("express");
const api = require("./api/v1");
+const git = require("./api/git");
+const yaml = require('js-yaml');
+const fs = require('fs');
+const { exit } = require("process");
-/*
-const now = new Date();
-const commit = new Date(1611497751 * 1000);
-console.log(now);
-console.log(commit)
-console.log(differenceInDays(now, commit));
-*/
+let settings;
+
+try {
+ settings = yaml.load(fs.readFileSync("./settings.yml", 'utf8'));
+} catch(e) {
+ throw(e);
+}
+
+const mandatory_settings = ["host", "port", "title", "about", "base_dir"];
+const missing_settings_key = mandatory_settings.find(key => settings.hasOwnProperty(key) === false);
+if(missing_settings_key) {
+ console.error(`Error: missing key in settings.yml: ${missing_settings_key}`);
+ exit(1);
+}
const app = express();
-app.use("/api/v1", api);
-app.listen(1337); \ No newline at end of file
+
+app.get(/.*\.(css|js|ico)$/, (req, res, next) =>
+{
+ fs.access(`dist${req.path}`, err =>
+ {
+ if(err) {
+ next();
+ return;
+ }
+ res.sendFile(`dist${req.path}`, { root: __dirname });
+ });
+});
+
+app.use("/api/v1", (req, res, next) =>
+{
+ req.settings = settings;
+ next();
+}, api);
+
+app.use("/:repo", async (req, res, next) =>
+{
+ let repo_dirs = await git.getRepos(settings["base_dir"]);
+
+ if(repo_dirs["error"]) {
+ res.status(500).send("Internal server error!");
+ return;
+ }
+
+ if(!repo_dirs["data"].includes(req.params.repo)) {
+ res.status(404).send("404: Page not found");
+ return;
+ }
+ next();
+})
+
+app.get("/:repo", (req, res, next) =>
+{
+ res.redirect(`/${req.params.repo}/log`);
+});
+
+app.get("/:repo/:page", (req, res, next) =>
+{
+ const pages = ["log", "refs", "tree"];
+ if(!pages.includes(req.params.page)) {
+ next();
+ return;
+ }
+
+ res.sendFile("dist/app.html", { root: __dirname });
+});
+
+app.get("/", (req, res) =>
+{
+ res.sendFile("dist/app.html", { root: __dirname });
+});
+
+app.use((req, res) =>
+{
+ res.status(404).send("404: Page not found");
+});
+
+app.listen(settings["port"], settings["host"], () => console.log(`App is running on ${settings["host"]}:${settings["port"]}`)); \ No newline at end of file
diff --git a/dist/app.2e5e74f9.css b/dist/app.2e5e74f9.css
new file mode 100644
index 0000000..bc98703
--- /dev/null
+++ b/dist/app.2e5e74f9.css
@@ -0,0 +1,5995 @@
+@import url("https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;600;700&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Oxygen:wght@300&display=swap");
+.align-baseline {
+ vertical-align: baseline !important;
+}
+.align-top {
+ vertical-align: top !important;
+}
+.align-middle {
+ vertical-align: middle !important;
+}
+.align-bottom {
+ vertical-align: bottom !important;
+}
+.align-text-bottom {
+ vertical-align: text-bottom !important;
+}
+.align-text-top {
+ vertical-align: text-top !important;
+}
+.float-start {
+ float: left !important;
+}
+.float-end {
+ float: right !important;
+}
+.float-none {
+ float: none !important;
+}
+.overflow-auto {
+ overflow: auto !important;
+}
+.overflow-hidden {
+ overflow: hidden !important;
+}
+.overflow-visible {
+ overflow: visible !important;
+}
+.overflow-scroll {
+ overflow: scroll !important;
+}
+.d-inline {
+ display: inline !important;
+}
+.d-inline-block {
+ display: inline-block !important;
+}
+.d-block {
+ display: block !important;
+}
+.d-grid {
+ display: grid !important;
+}
+.d-table {
+ display: table !important;
+}
+.d-table-row {
+ display: table-row !important;
+}
+.d-table-cell {
+ display: table-cell !important;
+}
+.d-flex {
+ display: flex !important;
+}
+.d-inline-flex {
+ display: inline-flex !important;
+}
+.d-none {
+ display: none !important;
+}
+.shadow {
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
+}
+.shadow-sm {
+ box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
+}
+.shadow-lg {
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
+}
+.shadow-none {
+ box-shadow: none !important;
+}
+.position-static {
+ position: static !important;
+}
+.position-relative {
+ position: relative !important;
+}
+.position-absolute {
+ position: absolute !important;
+}
+.position-fixed {
+ position: fixed !important;
+}
+.position-sticky {
+ position: sticky !important;
+}
+.top-0 {
+ top: 0 !important;
+}
+.top-50 {
+ top: 50% !important;
+}
+.top-100 {
+ top: 100% !important;
+}
+.bottom-0 {
+ bottom: 0 !important;
+}
+.bottom-50 {
+ bottom: 50% !important;
+}
+.bottom-100 {
+ bottom: 100% !important;
+}
+.start-0 {
+ left: 0 !important;
+}
+.start-50 {
+ left: 50% !important;
+}
+.start-100 {
+ left: 100% !important;
+}
+.end-0 {
+ right: 0 !important;
+}
+.end-50 {
+ right: 50% !important;
+}
+.end-100 {
+ right: 100% !important;
+}
+.translate-middle {
+ transform: translate(-50%, -50%) !important;
+}
+.translate-middle-x {
+ transform: translateX(-50%) !important;
+}
+.translate-middle-y {
+ transform: translateY(-50%) !important;
+}
+.border {
+ border: 1px solid #dee2e6 !important;
+}
+.border-0 {
+ border: 0 !important;
+}
+.border-top {
+ border-top: 1px solid #dee2e6 !important;
+}
+.border-top-0 {
+ border-top: 0 !important;
+}
+.border-end {
+ border-right: 1px solid #dee2e6 !important;
+}
+.border-end-0 {
+ border-right: 0 !important;
+}
+.border-bottom {
+ border-bottom: 1px solid #dee2e6 !important;
+}
+.border-bottom-0 {
+ border-bottom: 0 !important;
+}
+.border-start {
+ border-left: 1px solid #dee2e6 !important;
+}
+.border-start-0 {
+ border-left: 0 !important;
+}
+.border-primary {
+ border-color: #0d6efd !important;
+}
+.border-secondary {
+ border-color: #6c757d !important;
+}
+.border-success {
+ border-color: #198754 !important;
+}
+.border-info {
+ border-color: #0dcaf0 !important;
+}
+.border-warning {
+ border-color: #ffc107 !important;
+}
+.border-danger {
+ border-color: #dc3545 !important;
+}
+.border-light {
+ border-color: #f8f9fa !important;
+}
+.border-dark {
+ border-color: #212529 !important;
+}
+.border-white {
+ border-color: #fff !important;
+}
+.border-1 {
+ border-width: 1px !important;
+}
+.border-2 {
+ border-width: 2px !important;
+}
+.border-3 {
+ border-width: 3px !important;
+}
+.border-4 {
+ border-width: 4px !important;
+}
+.border-5 {
+ border-width: 5px !important;
+}
+.w-25 {
+ width: 25% !important;
+}
+.w-50 {
+ width: 50% !important;
+}
+.w-75 {
+ width: 75% !important;
+}
+.w-100 {
+ width: 100% !important;
+}
+.w-auto {
+ width: auto !important;
+}
+.mw-100 {
+ max-width: 100% !important;
+}
+.vw-100 {
+ width: 100vw !important;
+}
+.min-vw-100 {
+ min-width: 100vw !important;
+}
+.h-25 {
+ height: 25% !important;
+}
+.h-50 {
+ height: 50% !important;
+}
+.h-75 {
+ height: 75% !important;
+}
+.h-100 {
+ height: 100% !important;
+}
+.h-auto {
+ height: auto !important;
+}
+.mh-100 {
+ max-height: 100% !important;
+}
+.vh-100 {
+ height: 100vh !important;
+}
+.min-vh-100 {
+ min-height: 100vh !important;
+}
+.flex-fill {
+ flex: 1 1 auto !important;
+}
+.flex-row {
+ flex-direction: row !important;
+}
+.flex-column {
+ flex-direction: column !important;
+}
+.flex-row-reverse {
+ flex-direction: row-reverse !important;
+}
+.flex-column-reverse {
+ flex-direction: column-reverse !important;
+}
+.flex-grow-0 {
+ flex-grow: 0 !important;
+}
+.flex-grow-1 {
+ flex-grow: 1 !important;
+}
+.flex-shrink-0 {
+ flex-shrink: 0 !important;
+}
+.flex-shrink-1 {
+ flex-shrink: 1 !important;
+}
+.flex-wrap {
+ flex-wrap: wrap !important;
+}
+.flex-nowrap {
+ flex-wrap: nowrap !important;
+}
+.flex-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+}
+.gap-0 {
+ gap: 0 !important;
+}
+.gap-1 {
+ gap: 0.25rem !important;
+}
+.gap-2 {
+ gap: 0.5rem !important;
+}
+.gap-3 {
+ gap: 1rem !important;
+}
+.gap-4 {
+ gap: 1.5rem !important;
+}
+.gap-5 {
+ gap: 3rem !important;
+}
+.justify-content-start {
+ justify-content: flex-start !important;
+}
+.justify-content-end {
+ justify-content: flex-end !important;
+}
+.justify-content-center {
+ justify-content: center !important;
+}
+.justify-content-between {
+ justify-content: space-between !important;
+}
+.justify-content-around {
+ justify-content: space-around !important;
+}
+.justify-content-evenly {
+ justify-content: space-evenly !important;
+}
+.align-items-start {
+ align-items: flex-start !important;
+}
+.align-items-end {
+ align-items: flex-end !important;
+}
+.align-items-center {
+ align-items: center !important;
+}
+.align-items-baseline {
+ align-items: baseline !important;
+}
+.align-items-stretch {
+ align-items: stretch !important;
+}
+.align-content-start {
+ align-content: flex-start !important;
+}
+.align-content-end {
+ align-content: flex-end !important;
+}
+.align-content-center {
+ align-content: center !important;
+}
+.align-content-between {
+ align-content: space-between !important;
+}
+.align-content-around {
+ align-content: space-around !important;
+}
+.align-content-stretch {
+ align-content: stretch !important;
+}
+.align-self-auto {
+ align-self: auto !important;
+}
+.align-self-start {
+ align-self: flex-start !important;
+}
+.align-self-end {
+ align-self: flex-end !important;
+}
+.align-self-center {
+ align-self: center !important;
+}
+.align-self-baseline {
+ align-self: baseline !important;
+}
+.align-self-stretch {
+ align-self: stretch !important;
+}
+.order-first {
+ order: -1 !important;
+}
+.order-0 {
+ order: 0 !important;
+}
+.order-1 {
+ order: 1 !important;
+}
+.order-2 {
+ order: 2 !important;
+}
+.order-3 {
+ order: 3 !important;
+}
+.order-4 {
+ order: 4 !important;
+}
+.order-5 {
+ order: 5 !important;
+}
+.order-last {
+ order: 6 !important;
+}
+.m-0 {
+ margin: 0 !important;
+}
+.m-1 {
+ margin: 0.25rem !important;
+}
+.m-2 {
+ margin: 0.5rem !important;
+}
+.m-3 {
+ margin: 1rem !important;
+}
+.m-4 {
+ margin: 1.5rem !important;
+}
+.m-5 {
+ margin: 3rem !important;
+}
+.m-auto {
+ margin: auto !important;
+}
+.mx-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+}
+.mx-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+}
+.mx-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+}
+.mx-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+}
+.mx-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+}
+.mx-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+}
+.mx-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+}
+.my-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+.my-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+}
+.my-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+}
+.my-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+}
+.my-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+}
+.my-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+}
+.my-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+}
+.mt-0 {
+ margin-top: 0 !important;
+}
+.mt-1 {
+ margin-top: 0.25rem !important;
+}
+.mt-2 {
+ margin-top: 0.5rem !important;
+}
+.mt-3 {
+ margin-top: 1rem !important;
+}
+.mt-4 {
+ margin-top: 1.5rem !important;
+}
+.mt-5 {
+ margin-top: 3rem !important;
+}
+.mt-auto {
+ margin-top: auto !important;
+}
+.me-0 {
+ margin-right: 0 !important;
+}
+.me-1 {
+ margin-right: 0.25rem !important;
+}
+.me-2 {
+ margin-right: 0.5rem !important;
+}
+.me-3 {
+ margin-right: 1rem !important;
+}
+.me-4 {
+ margin-right: 1.5rem !important;
+}
+.me-5 {
+ margin-right: 3rem !important;
+}
+.me-auto {
+ margin-right: auto !important;
+}
+.mb-0 {
+ margin-bottom: 0 !important;
+}
+.mb-1 {
+ margin-bottom: 0.25rem !important;
+}
+.mb-2 {
+ margin-bottom: 0.5rem !important;
+}
+.mb-3 {
+ margin-bottom: 1rem !important;
+}
+.mb-4 {
+ margin-bottom: 1.5rem !important;
+}
+.mb-5 {
+ margin-bottom: 3rem !important;
+}
+.mb-auto {
+ margin-bottom: auto !important;
+}
+.ms-0 {
+ margin-left: 0 !important;
+}
+.ms-1 {
+ margin-left: 0.25rem !important;
+}
+.ms-2 {
+ margin-left: 0.5rem !important;
+}
+.ms-3 {
+ margin-left: 1rem !important;
+}
+.ms-4 {
+ margin-left: 1.5rem !important;
+}
+.ms-5 {
+ margin-left: 3rem !important;
+}
+.ms-auto {
+ margin-left: auto !important;
+}
+.p-0 {
+ padding: 0 !important;
+}
+.p-1 {
+ padding: 0.25rem !important;
+}
+.p-2 {
+ padding: 0.5rem !important;
+}
+.p-3 {
+ padding: 1rem !important;
+}
+.p-4 {
+ padding: 1.5rem !important;
+}
+.p-5 {
+ padding: 3rem !important;
+}
+.px-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+}
+.px-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+}
+.px-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+}
+.px-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+}
+.px-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+}
+.px-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+}
+.py-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+}
+.py-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+}
+.py-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+}
+.py-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+}
+.py-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+}
+.py-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+}
+.pt-0 {
+ padding-top: 0 !important;
+}
+.pt-1 {
+ padding-top: 0.25rem !important;
+}
+.pt-2 {
+ padding-top: 0.5rem !important;
+}
+.pt-3 {
+ padding-top: 1rem !important;
+}
+.pt-4 {
+ padding-top: 1.5rem !important;
+}
+.pt-5 {
+ padding-top: 3rem !important;
+}
+.pe-0 {
+ padding-right: 0 !important;
+}
+.pe-1 {
+ padding-right: 0.25rem !important;
+}
+.pe-2 {
+ padding-right: 0.5rem !important;
+}
+.pe-3 {
+ padding-right: 1rem !important;
+}
+.pe-4 {
+ padding-right: 1.5rem !important;
+}
+.pe-5 {
+ padding-right: 3rem !important;
+}
+.pb-0 {
+ padding-bottom: 0 !important;
+}
+.pb-1 {
+ padding-bottom: 0.25rem !important;
+}
+.pb-2 {
+ padding-bottom: 0.5rem !important;
+}
+.pb-3 {
+ padding-bottom: 1rem !important;
+}
+.pb-4 {
+ padding-bottom: 1.5rem !important;
+}
+.pb-5 {
+ padding-bottom: 3rem !important;
+}
+.ps-0 {
+ padding-left: 0 !important;
+}
+.ps-1 {
+ padding-left: 0.25rem !important;
+}
+.ps-2 {
+ padding-left: 0.5rem !important;
+}
+.ps-3 {
+ padding-left: 1rem !important;
+}
+.ps-4 {
+ padding-left: 1.5rem !important;
+}
+.ps-5 {
+ padding-left: 3rem !important;
+}
+.font-monospace {
+ font-family: var(--bs-font-monospace) !important;
+}
+.fs-1 {
+ font-size: calc(1.3125rem + 0.75vw) !important;
+}
+.fs-2 {
+ font-size: calc(1.275rem + 0.3vw) !important;
+}
+.fs-3 {
+ font-size: calc(1.25625rem + 0.075vw) !important;
+}
+.fs-4 {
+ font-size: 1.05rem !important;
+}
+.fs-5 {
+ font-size: 0.84375rem !important;
+}
+.fs-6 {
+ font-size: 0.75rem !important;
+}
+.fst-italic {
+ font-style: italic !important;
+}
+.fst-normal {
+ font-style: normal !important;
+}
+.fw-light {
+ font-weight: 300 !important;
+}
+.fw-lighter {
+ font-weight: lighter !important;
+}
+.fw-normal {
+ font-weight: 400 !important;
+}
+.fw-bold {
+ font-weight: 700 !important;
+}
+.fw-bolder {
+ font-weight: bolder !important;
+}
+.lh-1 {
+ line-height: 1 !important;
+}
+.lh-sm {
+ line-height: 1.25 !important;
+}
+.lh-base {
+ line-height: 1.5 !important;
+}
+.lh-lg {
+ line-height: 2 !important;
+}
+.text-start {
+ text-align: left !important;
+}
+.text-end {
+ text-align: right !important;
+}
+.text-center {
+ text-align: center !important;
+}
+.text-decoration-none {
+ text-decoration: none !important;
+}
+.text-decoration-underline {
+ text-decoration: underline !important;
+}
+.text-decoration-line-through {
+ text-decoration: line-through !important;
+}
+.text-lowercase {
+ text-transform: lowercase !important;
+}
+.text-uppercase {
+ text-transform: uppercase !important;
+}
+.text-capitalize {
+ text-transform: capitalize !important;
+}
+.text-wrap {
+ white-space: normal !important;
+}
+.text-nowrap {
+ white-space: nowrap !important;
+}
+/* rtl:begin:remove */
+.text-break {
+ word-wrap: break-word !important;
+ word-break: break-word !important;
+}
+/* rtl:end:remove */
+.text-primary {
+ color: #0d6efd !important;
+}
+.text-secondary {
+ color: #6c757d !important;
+}
+.text-success {
+ color: #198754 !important;
+}
+.text-info {
+ color: #0dcaf0 !important;
+}
+.text-warning {
+ color: #ffc107 !important;
+}
+.text-danger {
+ color: #dc3545 !important;
+}
+.text-light {
+ color: #f8f9fa !important;
+}
+.text-dark {
+ color: #212529 !important;
+}
+.text-white {
+ color: #fff !important;
+}
+.text-body {
+ color: #212529 !important;
+}
+.text-muted {
+ color: #6c757d !important;
+}
+.text-black-50 {
+ color: rgba(0, 0, 0, 0.5) !important;
+}
+.text-white-50 {
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+.text-reset {
+ color: inherit !important;
+}
+.bg-primary {
+ background-color: #0d6efd !important;
+}
+.bg-secondary {
+ background-color: #6c757d !important;
+}
+.bg-success {
+ background-color: #198754 !important;
+}
+.bg-info {
+ background-color: #0dcaf0 !important;
+}
+.bg-warning {
+ background-color: #ffc107 !important;
+}
+.bg-danger {
+ background-color: #dc3545 !important;
+}
+.bg-light {
+ background-color: #f8f9fa !important;
+}
+.bg-dark {
+ background-color: #212529 !important;
+}
+.bg-body {
+ background-color: #fff !important;
+}
+.bg-white {
+ background-color: #fff !important;
+}
+.bg-transparent {
+ background-color: transparent !important;
+}
+.bg-gradient {
+ background-image: var(--bs-gradient) !important;
+}
+.user-select-all {
+ user-select: all !important;
+}
+.user-select-auto {
+ user-select: auto !important;
+}
+.user-select-none {
+ user-select: none !important;
+}
+.pe-none {
+ pointer-events: none !important;
+}
+.pe-auto {
+ pointer-events: auto !important;
+}
+.rounded {
+ border-radius: 0.25rem !important;
+}
+.rounded-0 {
+ border-radius: 0 !important;
+}
+.rounded-1 {
+ border-radius: 0.2rem !important;
+}
+.rounded-2 {
+ border-radius: 0.25rem !important;
+}
+.rounded-3 {
+ border-radius: 0.3rem !important;
+}
+.rounded-circle {
+ border-radius: 50% !important;
+}
+.rounded-pill {
+ border-radius: 50rem !important;
+}
+.rounded-top {
+ border-top-left-radius: 0.25rem !important;
+ border-top-right-radius: 0.25rem !important;
+}
+.rounded-end {
+ border-top-right-radius: 0.25rem !important;
+ border-bottom-right-radius: 0.25rem !important;
+}
+.rounded-bottom {
+ border-bottom-right-radius: 0.25rem !important;
+ border-bottom-left-radius: 0.25rem !important;
+}
+.rounded-start {
+ border-bottom-left-radius: 0.25rem !important;
+ border-top-left-radius: 0.25rem !important;
+}
+.visible {
+ visibility: visible !important;
+}
+.invisible {
+ visibility: hidden !important;
+}
+@media (min-width: 576px) {
+ .float-sm-start {
+ float: left !important;
+ }
+
+ .float-sm-end {
+ float: right !important;
+ }
+
+ .float-sm-none {
+ float: none !important;
+ }
+
+ .d-sm-inline {
+ display: inline !important;
+ }
+
+ .d-sm-inline-block {
+ display: inline-block !important;
+ }
+
+ .d-sm-block {
+ display: block !important;
+ }
+
+ .d-sm-grid {
+ display: grid !important;
+ }
+
+ .d-sm-table {
+ display: table !important;
+ }
+
+ .d-sm-table-row {
+ display: table-row !important;
+ }
+
+ .d-sm-table-cell {
+ display: table-cell !important;
+ }
+
+ .d-sm-flex {
+ display: flex !important;
+ }
+
+ .d-sm-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .d-sm-none {
+ display: none !important;
+ }
+
+ .flex-sm-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .flex-sm-row {
+ flex-direction: row !important;
+ }
+
+ .flex-sm-column {
+ flex-direction: column !important;
+ }
+
+ .flex-sm-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .flex-sm-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .flex-sm-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .flex-sm-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .flex-sm-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .flex-sm-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .flex-sm-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .flex-sm-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .flex-sm-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .gap-sm-0 {
+ gap: 0 !important;
+ }
+
+ .gap-sm-1 {
+ gap: 0.25rem !important;
+ }
+
+ .gap-sm-2 {
+ gap: 0.5rem !important;
+ }
+
+ .gap-sm-3 {
+ gap: 1rem !important;
+ }
+
+ .gap-sm-4 {
+ gap: 1.5rem !important;
+ }
+
+ .gap-sm-5 {
+ gap: 3rem !important;
+ }
+
+ .justify-content-sm-start {
+ justify-content: flex-start !important;
+ }
+
+ .justify-content-sm-end {
+ justify-content: flex-end !important;
+ }
+
+ .justify-content-sm-center {
+ justify-content: center !important;
+ }
+
+ .justify-content-sm-between {
+ justify-content: space-between !important;
+ }
+
+ .justify-content-sm-around {
+ justify-content: space-around !important;
+ }
+
+ .justify-content-sm-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .align-items-sm-start {
+ align-items: flex-start !important;
+ }
+
+ .align-items-sm-end {
+ align-items: flex-end !important;
+ }
+
+ .align-items-sm-center {
+ align-items: center !important;
+ }
+
+ .align-items-sm-baseline {
+ align-items: baseline !important;
+ }
+
+ .align-items-sm-stretch {
+ align-items: stretch !important;
+ }
+
+ .align-content-sm-start {
+ align-content: flex-start !important;
+ }
+
+ .align-content-sm-end {
+ align-content: flex-end !important;
+ }
+
+ .align-content-sm-center {
+ align-content: center !important;
+ }
+
+ .align-content-sm-between {
+ align-content: space-between !important;
+ }
+
+ .align-content-sm-around {
+ align-content: space-around !important;
+ }
+
+ .align-content-sm-stretch {
+ align-content: stretch !important;
+ }
+
+ .align-self-sm-auto {
+ align-self: auto !important;
+ }
+
+ .align-self-sm-start {
+ align-self: flex-start !important;
+ }
+
+ .align-self-sm-end {
+ align-self: flex-end !important;
+ }
+
+ .align-self-sm-center {
+ align-self: center !important;
+ }
+
+ .align-self-sm-baseline {
+ align-self: baseline !important;
+ }
+
+ .align-self-sm-stretch {
+ align-self: stretch !important;
+ }
+
+ .order-sm-first {
+ order: -1 !important;
+ }
+
+ .order-sm-0 {
+ order: 0 !important;
+ }
+
+ .order-sm-1 {
+ order: 1 !important;
+ }
+
+ .order-sm-2 {
+ order: 2 !important;
+ }
+
+ .order-sm-3 {
+ order: 3 !important;
+ }
+
+ .order-sm-4 {
+ order: 4 !important;
+ }
+
+ .order-sm-5 {
+ order: 5 !important;
+ }
+
+ .order-sm-last {
+ order: 6 !important;
+ }
+
+ .m-sm-0 {
+ margin: 0 !important;
+ }
+
+ .m-sm-1 {
+ margin: 0.25rem !important;
+ }
+
+ .m-sm-2 {
+ margin: 0.5rem !important;
+ }
+
+ .m-sm-3 {
+ margin: 1rem !important;
+ }
+
+ .m-sm-4 {
+ margin: 1.5rem !important;
+ }
+
+ .m-sm-5 {
+ margin: 3rem !important;
+ }
+
+ .m-sm-auto {
+ margin: auto !important;
+ }
+
+ .mx-sm-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .mx-sm-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .mx-sm-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .mx-sm-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .mx-sm-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .mx-sm-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .mx-sm-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .my-sm-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .my-sm-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .my-sm-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .my-sm-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .my-sm-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .my-sm-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .my-sm-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .mt-sm-0 {
+ margin-top: 0 !important;
+ }
+
+ .mt-sm-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .mt-sm-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .mt-sm-3 {
+ margin-top: 1rem !important;
+ }
+
+ .mt-sm-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .mt-sm-5 {
+ margin-top: 3rem !important;
+ }
+
+ .mt-sm-auto {
+ margin-top: auto !important;
+ }
+
+ .me-sm-0 {
+ margin-right: 0 !important;
+ }
+
+ .me-sm-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .me-sm-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .me-sm-3 {
+ margin-right: 1rem !important;
+ }
+
+ .me-sm-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .me-sm-5 {
+ margin-right: 3rem !important;
+ }
+
+ .me-sm-auto {
+ margin-right: auto !important;
+ }
+
+ .mb-sm-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .mb-sm-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .mb-sm-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .mb-sm-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .mb-sm-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .mb-sm-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .mb-sm-auto {
+ margin-bottom: auto !important;
+ }
+
+ .ms-sm-0 {
+ margin-left: 0 !important;
+ }
+
+ .ms-sm-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .ms-sm-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .ms-sm-3 {
+ margin-left: 1rem !important;
+ }
+
+ .ms-sm-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .ms-sm-5 {
+ margin-left: 3rem !important;
+ }
+
+ .ms-sm-auto {
+ margin-left: auto !important;
+ }
+
+ .p-sm-0 {
+ padding: 0 !important;
+ }
+
+ .p-sm-1 {
+ padding: 0.25rem !important;
+ }
+
+ .p-sm-2 {
+ padding: 0.5rem !important;
+ }
+
+ .p-sm-3 {
+ padding: 1rem !important;
+ }
+
+ .p-sm-4 {
+ padding: 1.5rem !important;
+ }
+
+ .p-sm-5 {
+ padding: 3rem !important;
+ }
+
+ .px-sm-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .px-sm-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .px-sm-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .px-sm-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .px-sm-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .px-sm-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .py-sm-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .py-sm-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .py-sm-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .py-sm-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .py-sm-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .py-sm-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .pt-sm-0 {
+ padding-top: 0 !important;
+ }
+
+ .pt-sm-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .pt-sm-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .pt-sm-3 {
+ padding-top: 1rem !important;
+ }
+
+ .pt-sm-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .pt-sm-5 {
+ padding-top: 3rem !important;
+ }
+
+ .pe-sm-0 {
+ padding-right: 0 !important;
+ }
+
+ .pe-sm-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .pe-sm-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .pe-sm-3 {
+ padding-right: 1rem !important;
+ }
+
+ .pe-sm-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .pe-sm-5 {
+ padding-right: 3rem !important;
+ }
+
+ .pb-sm-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .pb-sm-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .pb-sm-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .pb-sm-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .pb-sm-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .pb-sm-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .ps-sm-0 {
+ padding-left: 0 !important;
+ }
+
+ .ps-sm-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .ps-sm-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .ps-sm-3 {
+ padding-left: 1rem !important;
+ }
+
+ .ps-sm-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .ps-sm-5 {
+ padding-left: 3rem !important;
+ }
+
+ .text-sm-start {
+ text-align: left !important;
+ }
+
+ .text-sm-end {
+ text-align: right !important;
+ }
+
+ .text-sm-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 768px) {
+ .float-md-start {
+ float: left !important;
+ }
+
+ .float-md-end {
+ float: right !important;
+ }
+
+ .float-md-none {
+ float: none !important;
+ }
+
+ .d-md-inline {
+ display: inline !important;
+ }
+
+ .d-md-inline-block {
+ display: inline-block !important;
+ }
+
+ .d-md-block {
+ display: block !important;
+ }
+
+ .d-md-grid {
+ display: grid !important;
+ }
+
+ .d-md-table {
+ display: table !important;
+ }
+
+ .d-md-table-row {
+ display: table-row !important;
+ }
+
+ .d-md-table-cell {
+ display: table-cell !important;
+ }
+
+ .d-md-flex {
+ display: flex !important;
+ }
+
+ .d-md-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .d-md-none {
+ display: none !important;
+ }
+
+ .flex-md-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .flex-md-row {
+ flex-direction: row !important;
+ }
+
+ .flex-md-column {
+ flex-direction: column !important;
+ }
+
+ .flex-md-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .flex-md-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .flex-md-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .flex-md-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .flex-md-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .flex-md-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .flex-md-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .flex-md-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .flex-md-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .gap-md-0 {
+ gap: 0 !important;
+ }
+
+ .gap-md-1 {
+ gap: 0.25rem !important;
+ }
+
+ .gap-md-2 {
+ gap: 0.5rem !important;
+ }
+
+ .gap-md-3 {
+ gap: 1rem !important;
+ }
+
+ .gap-md-4 {
+ gap: 1.5rem !important;
+ }
+
+ .gap-md-5 {
+ gap: 3rem !important;
+ }
+
+ .justify-content-md-start {
+ justify-content: flex-start !important;
+ }
+
+ .justify-content-md-end {
+ justify-content: flex-end !important;
+ }
+
+ .justify-content-md-center {
+ justify-content: center !important;
+ }
+
+ .justify-content-md-between {
+ justify-content: space-between !important;
+ }
+
+ .justify-content-md-around {
+ justify-content: space-around !important;
+ }
+
+ .justify-content-md-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .align-items-md-start {
+ align-items: flex-start !important;
+ }
+
+ .align-items-md-end {
+ align-items: flex-end !important;
+ }
+
+ .align-items-md-center {
+ align-items: center !important;
+ }
+
+ .align-items-md-baseline {
+ align-items: baseline !important;
+ }
+
+ .align-items-md-stretch {
+ align-items: stretch !important;
+ }
+
+ .align-content-md-start {
+ align-content: flex-start !important;
+ }
+
+ .align-content-md-end {
+ align-content: flex-end !important;
+ }
+
+ .align-content-md-center {
+ align-content: center !important;
+ }
+
+ .align-content-md-between {
+ align-content: space-between !important;
+ }
+
+ .align-content-md-around {
+ align-content: space-around !important;
+ }
+
+ .align-content-md-stretch {
+ align-content: stretch !important;
+ }
+
+ .align-self-md-auto {
+ align-self: auto !important;
+ }
+
+ .align-self-md-start {
+ align-self: flex-start !important;
+ }
+
+ .align-self-md-end {
+ align-self: flex-end !important;
+ }
+
+ .align-self-md-center {
+ align-self: center !important;
+ }
+
+ .align-self-md-baseline {
+ align-self: baseline !important;
+ }
+
+ .align-self-md-stretch {
+ align-self: stretch !important;
+ }
+
+ .order-md-first {
+ order: -1 !important;
+ }
+
+ .order-md-0 {
+ order: 0 !important;
+ }
+
+ .order-md-1 {
+ order: 1 !important;
+ }
+
+ .order-md-2 {
+ order: 2 !important;
+ }
+
+ .order-md-3 {
+ order: 3 !important;
+ }
+
+ .order-md-4 {
+ order: 4 !important;
+ }
+
+ .order-md-5 {
+ order: 5 !important;
+ }
+
+ .order-md-last {
+ order: 6 !important;
+ }
+
+ .m-md-0 {
+ margin: 0 !important;
+ }
+
+ .m-md-1 {
+ margin: 0.25rem !important;
+ }
+
+ .m-md-2 {
+ margin: 0.5rem !important;
+ }
+
+ .m-md-3 {
+ margin: 1rem !important;
+ }
+
+ .m-md-4 {
+ margin: 1.5rem !important;
+ }
+
+ .m-md-5 {
+ margin: 3rem !important;
+ }
+
+ .m-md-auto {
+ margin: auto !important;
+ }
+
+ .mx-md-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .mx-md-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .mx-md-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .mx-md-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .mx-md-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .mx-md-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .mx-md-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .my-md-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .my-md-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .my-md-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .my-md-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .my-md-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .my-md-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .my-md-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .mt-md-0 {
+ margin-top: 0 !important;
+ }
+
+ .mt-md-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .mt-md-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .mt-md-3 {
+ margin-top: 1rem !important;
+ }
+
+ .mt-md-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .mt-md-5 {
+ margin-top: 3rem !important;
+ }
+
+ .mt-md-auto {
+ margin-top: auto !important;
+ }
+
+ .me-md-0 {
+ margin-right: 0 !important;
+ }
+
+ .me-md-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .me-md-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .me-md-3 {
+ margin-right: 1rem !important;
+ }
+
+ .me-md-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .me-md-5 {
+ margin-right: 3rem !important;
+ }
+
+ .me-md-auto {
+ margin-right: auto !important;
+ }
+
+ .mb-md-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .mb-md-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .mb-md-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .mb-md-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .mb-md-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .mb-md-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .mb-md-auto {
+ margin-bottom: auto !important;
+ }
+
+ .ms-md-0 {
+ margin-left: 0 !important;
+ }
+
+ .ms-md-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .ms-md-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .ms-md-3 {
+ margin-left: 1rem !important;
+ }
+
+ .ms-md-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .ms-md-5 {
+ margin-left: 3rem !important;
+ }
+
+ .ms-md-auto {
+ margin-left: auto !important;
+ }
+
+ .p-md-0 {
+ padding: 0 !important;
+ }
+
+ .p-md-1 {
+ padding: 0.25rem !important;
+ }
+
+ .p-md-2 {
+ padding: 0.5rem !important;
+ }
+
+ .p-md-3 {
+ padding: 1rem !important;
+ }
+
+ .p-md-4 {
+ padding: 1.5rem !important;
+ }
+
+ .p-md-5 {
+ padding: 3rem !important;
+ }
+
+ .px-md-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .px-md-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .px-md-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .px-md-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .px-md-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .px-md-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .py-md-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .py-md-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .py-md-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .py-md-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .py-md-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .py-md-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .pt-md-0 {
+ padding-top: 0 !important;
+ }
+
+ .pt-md-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .pt-md-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .pt-md-3 {
+ padding-top: 1rem !important;
+ }
+
+ .pt-md-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .pt-md-5 {
+ padding-top: 3rem !important;
+ }
+
+ .pe-md-0 {
+ padding-right: 0 !important;
+ }
+
+ .pe-md-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .pe-md-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .pe-md-3 {
+ padding-right: 1rem !important;
+ }
+
+ .pe-md-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .pe-md-5 {
+ padding-right: 3rem !important;
+ }
+
+ .pb-md-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .pb-md-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .pb-md-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .pb-md-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .pb-md-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .pb-md-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .ps-md-0 {
+ padding-left: 0 !important;
+ }
+
+ .ps-md-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .ps-md-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .ps-md-3 {
+ padding-left: 1rem !important;
+ }
+
+ .ps-md-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .ps-md-5 {
+ padding-left: 3rem !important;
+ }
+
+ .text-md-start {
+ text-align: left !important;
+ }
+
+ .text-md-end {
+ text-align: right !important;
+ }
+
+ .text-md-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 992px) {
+ .float-lg-start {
+ float: left !important;
+ }
+
+ .float-lg-end {
+ float: right !important;
+ }
+
+ .float-lg-none {
+ float: none !important;
+ }
+
+ .d-lg-inline {
+ display: inline !important;
+ }
+
+ .d-lg-inline-block {
+ display: inline-block !important;
+ }
+
+ .d-lg-block {
+ display: block !important;
+ }
+
+ .d-lg-grid {
+ display: grid !important;
+ }
+
+ .d-lg-table {
+ display: table !important;
+ }
+
+ .d-lg-table-row {
+ display: table-row !important;
+ }
+
+ .d-lg-table-cell {
+ display: table-cell !important;
+ }
+
+ .d-lg-flex {
+ display: flex !important;
+ }
+
+ .d-lg-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .d-lg-none {
+ display: none !important;
+ }
+
+ .flex-lg-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .flex-lg-row {
+ flex-direction: row !important;
+ }
+
+ .flex-lg-column {
+ flex-direction: column !important;
+ }
+
+ .flex-lg-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .flex-lg-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .flex-lg-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .flex-lg-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .flex-lg-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .flex-lg-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .flex-lg-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .flex-lg-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .flex-lg-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .gap-lg-0 {
+ gap: 0 !important;
+ }
+
+ .gap-lg-1 {
+ gap: 0.25rem !important;
+ }
+
+ .gap-lg-2 {
+ gap: 0.5rem !important;
+ }
+
+ .gap-lg-3 {
+ gap: 1rem !important;
+ }
+
+ .gap-lg-4 {
+ gap: 1.5rem !important;
+ }
+
+ .gap-lg-5 {
+ gap: 3rem !important;
+ }
+
+ .justify-content-lg-start {
+ justify-content: flex-start !important;
+ }
+
+ .justify-content-lg-end {
+ justify-content: flex-end !important;
+ }
+
+ .justify-content-lg-center {
+ justify-content: center !important;
+ }
+
+ .justify-content-lg-between {
+ justify-content: space-between !important;
+ }
+
+ .justify-content-lg-around {
+ justify-content: space-around !important;
+ }
+
+ .justify-content-lg-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .align-items-lg-start {
+ align-items: flex-start !important;
+ }
+
+ .align-items-lg-end {
+ align-items: flex-end !important;
+ }
+
+ .align-items-lg-center {
+ align-items: center !important;
+ }
+
+ .align-items-lg-baseline {
+ align-items: baseline !important;
+ }
+
+ .align-items-lg-stretch {
+ align-items: stretch !important;
+ }
+
+ .align-content-lg-start {
+ align-content: flex-start !important;
+ }
+
+ .align-content-lg-end {
+ align-content: flex-end !important;
+ }
+
+ .align-content-lg-center {
+ align-content: center !important;
+ }
+
+ .align-content-lg-between {
+ align-content: space-between !important;
+ }
+
+ .align-content-lg-around {
+ align-content: space-around !important;
+ }
+
+ .align-content-lg-stretch {
+ align-content: stretch !important;
+ }
+
+ .align-self-lg-auto {
+ align-self: auto !important;
+ }
+
+ .align-self-lg-start {
+ align-self: flex-start !important;
+ }
+
+ .align-self-lg-end {
+ align-self: flex-end !important;
+ }
+
+ .align-self-lg-center {
+ align-self: center !important;
+ }
+
+ .align-self-lg-baseline {
+ align-self: baseline !important;
+ }
+
+ .align-self-lg-stretch {
+ align-self: stretch !important;
+ }
+
+ .order-lg-first {
+ order: -1 !important;
+ }
+
+ .order-lg-0 {
+ order: 0 !important;
+ }
+
+ .order-lg-1 {
+ order: 1 !important;
+ }
+
+ .order-lg-2 {
+ order: 2 !important;
+ }
+
+ .order-lg-3 {
+ order: 3 !important;
+ }
+
+ .order-lg-4 {
+ order: 4 !important;
+ }
+
+ .order-lg-5 {
+ order: 5 !important;
+ }
+
+ .order-lg-last {
+ order: 6 !important;
+ }
+
+ .m-lg-0 {
+ margin: 0 !important;
+ }
+
+ .m-lg-1 {
+ margin: 0.25rem !important;
+ }
+
+ .m-lg-2 {
+ margin: 0.5rem !important;
+ }
+
+ .m-lg-3 {
+ margin: 1rem !important;
+ }
+
+ .m-lg-4 {
+ margin: 1.5rem !important;
+ }
+
+ .m-lg-5 {
+ margin: 3rem !important;
+ }
+
+ .m-lg-auto {
+ margin: auto !important;
+ }
+
+ .mx-lg-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .mx-lg-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .mx-lg-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .mx-lg-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .mx-lg-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .mx-lg-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .mx-lg-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .my-lg-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .my-lg-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .my-lg-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .my-lg-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .my-lg-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .my-lg-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .my-lg-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .mt-lg-0 {
+ margin-top: 0 !important;
+ }
+
+ .mt-lg-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .mt-lg-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .mt-lg-3 {
+ margin-top: 1rem !important;
+ }
+
+ .mt-lg-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .mt-lg-5 {
+ margin-top: 3rem !important;
+ }
+
+ .mt-lg-auto {
+ margin-top: auto !important;
+ }
+
+ .me-lg-0 {
+ margin-right: 0 !important;
+ }
+
+ .me-lg-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .me-lg-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .me-lg-3 {
+ margin-right: 1rem !important;
+ }
+
+ .me-lg-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .me-lg-5 {
+ margin-right: 3rem !important;
+ }
+
+ .me-lg-auto {
+ margin-right: auto !important;
+ }
+
+ .mb-lg-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .mb-lg-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .mb-lg-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .mb-lg-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .mb-lg-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .mb-lg-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .mb-lg-auto {
+ margin-bottom: auto !important;
+ }
+
+ .ms-lg-0 {
+ margin-left: 0 !important;
+ }
+
+ .ms-lg-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .ms-lg-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .ms-lg-3 {
+ margin-left: 1rem !important;
+ }
+
+ .ms-lg-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .ms-lg-5 {
+ margin-left: 3rem !important;
+ }
+
+ .ms-lg-auto {
+ margin-left: auto !important;
+ }
+
+ .p-lg-0 {
+ padding: 0 !important;
+ }
+
+ .p-lg-1 {
+ padding: 0.25rem !important;
+ }
+
+ .p-lg-2 {
+ padding: 0.5rem !important;
+ }
+
+ .p-lg-3 {
+ padding: 1rem !important;
+ }
+
+ .p-lg-4 {
+ padding: 1.5rem !important;
+ }
+
+ .p-lg-5 {
+ padding: 3rem !important;
+ }
+
+ .px-lg-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .px-lg-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .px-lg-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .px-lg-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .px-lg-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .px-lg-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .py-lg-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .py-lg-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .py-lg-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .py-lg-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .py-lg-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .py-lg-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .pt-lg-0 {
+ padding-top: 0 !important;
+ }
+
+ .pt-lg-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .pt-lg-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .pt-lg-3 {
+ padding-top: 1rem !important;
+ }
+
+ .pt-lg-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .pt-lg-5 {
+ padding-top: 3rem !important;
+ }
+
+ .pe-lg-0 {
+ padding-right: 0 !important;
+ }
+
+ .pe-lg-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .pe-lg-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .pe-lg-3 {
+ padding-right: 1rem !important;
+ }
+
+ .pe-lg-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .pe-lg-5 {
+ padding-right: 3rem !important;
+ }
+
+ .pb-lg-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .pb-lg-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .pb-lg-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .pb-lg-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .pb-lg-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .pb-lg-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .ps-lg-0 {
+ padding-left: 0 !important;
+ }
+
+ .ps-lg-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .ps-lg-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .ps-lg-3 {
+ padding-left: 1rem !important;
+ }
+
+ .ps-lg-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .ps-lg-5 {
+ padding-left: 3rem !important;
+ }
+
+ .text-lg-start {
+ text-align: left !important;
+ }
+
+ .text-lg-end {
+ text-align: right !important;
+ }
+
+ .text-lg-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 1200px) {
+ .float-xl-start {
+ float: left !important;
+ }
+
+ .float-xl-end {
+ float: right !important;
+ }
+
+ .float-xl-none {
+ float: none !important;
+ }
+
+ .d-xl-inline {
+ display: inline !important;
+ }
+
+ .d-xl-inline-block {
+ display: inline-block !important;
+ }
+
+ .d-xl-block {
+ display: block !important;
+ }
+
+ .d-xl-grid {
+ display: grid !important;
+ }
+
+ .d-xl-table {
+ display: table !important;
+ }
+
+ .d-xl-table-row {
+ display: table-row !important;
+ }
+
+ .d-xl-table-cell {
+ display: table-cell !important;
+ }
+
+ .d-xl-flex {
+ display: flex !important;
+ }
+
+ .d-xl-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .d-xl-none {
+ display: none !important;
+ }
+
+ .flex-xl-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .flex-xl-row {
+ flex-direction: row !important;
+ }
+
+ .flex-xl-column {
+ flex-direction: column !important;
+ }
+
+ .flex-xl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .flex-xl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .flex-xl-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .flex-xl-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .flex-xl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .flex-xl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .flex-xl-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .flex-xl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .flex-xl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .gap-xl-0 {
+ gap: 0 !important;
+ }
+
+ .gap-xl-1 {
+ gap: 0.25rem !important;
+ }
+
+ .gap-xl-2 {
+ gap: 0.5rem !important;
+ }
+
+ .gap-xl-3 {
+ gap: 1rem !important;
+ }
+
+ .gap-xl-4 {
+ gap: 1.5rem !important;
+ }
+
+ .gap-xl-5 {
+ gap: 3rem !important;
+ }
+
+ .justify-content-xl-start {
+ justify-content: flex-start !important;
+ }
+
+ .justify-content-xl-end {
+ justify-content: flex-end !important;
+ }
+
+ .justify-content-xl-center {
+ justify-content: center !important;
+ }
+
+ .justify-content-xl-between {
+ justify-content: space-between !important;
+ }
+
+ .justify-content-xl-around {
+ justify-content: space-around !important;
+ }
+
+ .justify-content-xl-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .align-items-xl-start {
+ align-items: flex-start !important;
+ }
+
+ .align-items-xl-end {
+ align-items: flex-end !important;
+ }
+
+ .align-items-xl-center {
+ align-items: center !important;
+ }
+
+ .align-items-xl-baseline {
+ align-items: baseline !important;
+ }
+
+ .align-items-xl-stretch {
+ align-items: stretch !important;
+ }
+
+ .align-content-xl-start {
+ align-content: flex-start !important;
+ }
+
+ .align-content-xl-end {
+ align-content: flex-end !important;
+ }
+
+ .align-content-xl-center {
+ align-content: center !important;
+ }
+
+ .align-content-xl-between {
+ align-content: space-between !important;
+ }
+
+ .align-content-xl-around {
+ align-content: space-around !important;
+ }
+
+ .align-content-xl-stretch {
+ align-content: stretch !important;
+ }
+
+ .align-self-xl-auto {
+ align-self: auto !important;
+ }
+
+ .align-self-xl-start {
+ align-self: flex-start !important;
+ }
+
+ .align-self-xl-end {
+ align-self: flex-end !important;
+ }
+
+ .align-self-xl-center {
+ align-self: center !important;
+ }
+
+ .align-self-xl-baseline {
+ align-self: baseline !important;
+ }
+
+ .align-self-xl-stretch {
+ align-self: stretch !important;
+ }
+
+ .order-xl-first {
+ order: -1 !important;
+ }
+
+ .order-xl-0 {
+ order: 0 !important;
+ }
+
+ .order-xl-1 {
+ order: 1 !important;
+ }
+
+ .order-xl-2 {
+ order: 2 !important;
+ }
+
+ .order-xl-3 {
+ order: 3 !important;
+ }
+
+ .order-xl-4 {
+ order: 4 !important;
+ }
+
+ .order-xl-5 {
+ order: 5 !important;
+ }
+
+ .order-xl-last {
+ order: 6 !important;
+ }
+
+ .m-xl-0 {
+ margin: 0 !important;
+ }
+
+ .m-xl-1 {
+ margin: 0.25rem !important;
+ }
+
+ .m-xl-2 {
+ margin: 0.5rem !important;
+ }
+
+ .m-xl-3 {
+ margin: 1rem !important;
+ }
+
+ .m-xl-4 {
+ margin: 1.5rem !important;
+ }
+
+ .m-xl-5 {
+ margin: 3rem !important;
+ }
+
+ .m-xl-auto {
+ margin: auto !important;
+ }
+
+ .mx-xl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .mx-xl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .mx-xl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .mx-xl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .mx-xl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .mx-xl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .mx-xl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .my-xl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .my-xl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .my-xl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .my-xl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .my-xl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .my-xl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .my-xl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .mt-xl-0 {
+ margin-top: 0 !important;
+ }
+
+ .mt-xl-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .mt-xl-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .mt-xl-3 {
+ margin-top: 1rem !important;
+ }
+
+ .mt-xl-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .mt-xl-5 {
+ margin-top: 3rem !important;
+ }
+
+ .mt-xl-auto {
+ margin-top: auto !important;
+ }
+
+ .me-xl-0 {
+ margin-right: 0 !important;
+ }
+
+ .me-xl-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .me-xl-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .me-xl-3 {
+ margin-right: 1rem !important;
+ }
+
+ .me-xl-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .me-xl-5 {
+ margin-right: 3rem !important;
+ }
+
+ .me-xl-auto {
+ margin-right: auto !important;
+ }
+
+ .mb-xl-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .mb-xl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .mb-xl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .mb-xl-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .mb-xl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .mb-xl-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .mb-xl-auto {
+ margin-bottom: auto !important;
+ }
+
+ .ms-xl-0 {
+ margin-left: 0 !important;
+ }
+
+ .ms-xl-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .ms-xl-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .ms-xl-3 {
+ margin-left: 1rem !important;
+ }
+
+ .ms-xl-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .ms-xl-5 {
+ margin-left: 3rem !important;
+ }
+
+ .ms-xl-auto {
+ margin-left: auto !important;
+ }
+
+ .p-xl-0 {
+ padding: 0 !important;
+ }
+
+ .p-xl-1 {
+ padding: 0.25rem !important;
+ }
+
+ .p-xl-2 {
+ padding: 0.5rem !important;
+ }
+
+ .p-xl-3 {
+ padding: 1rem !important;
+ }
+
+ .p-xl-4 {
+ padding: 1.5rem !important;
+ }
+
+ .p-xl-5 {
+ padding: 3rem !important;
+ }
+
+ .px-xl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .px-xl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .px-xl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .px-xl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .px-xl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .px-xl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .py-xl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .py-xl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .py-xl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .py-xl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .py-xl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .py-xl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .pt-xl-0 {
+ padding-top: 0 !important;
+ }
+
+ .pt-xl-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .pt-xl-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .pt-xl-3 {
+ padding-top: 1rem !important;
+ }
+
+ .pt-xl-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .pt-xl-5 {
+ padding-top: 3rem !important;
+ }
+
+ .pe-xl-0 {
+ padding-right: 0 !important;
+ }
+
+ .pe-xl-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .pe-xl-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .pe-xl-3 {
+ padding-right: 1rem !important;
+ }
+
+ .pe-xl-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .pe-xl-5 {
+ padding-right: 3rem !important;
+ }
+
+ .pb-xl-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .pb-xl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .pb-xl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .pb-xl-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .pb-xl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .pb-xl-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .ps-xl-0 {
+ padding-left: 0 !important;
+ }
+
+ .ps-xl-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .ps-xl-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .ps-xl-3 {
+ padding-left: 1rem !important;
+ }
+
+ .ps-xl-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .ps-xl-5 {
+ padding-left: 3rem !important;
+ }
+
+ .text-xl-start {
+ text-align: left !important;
+ }
+
+ .text-xl-end {
+ text-align: right !important;
+ }
+
+ .text-xl-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 1400px) {
+ .float-xxl-start {
+ float: left !important;
+ }
+
+ .float-xxl-end {
+ float: right !important;
+ }
+
+ .float-xxl-none {
+ float: none !important;
+ }
+
+ .d-xxl-inline {
+ display: inline !important;
+ }
+
+ .d-xxl-inline-block {
+ display: inline-block !important;
+ }
+
+ .d-xxl-block {
+ display: block !important;
+ }
+
+ .d-xxl-grid {
+ display: grid !important;
+ }
+
+ .d-xxl-table {
+ display: table !important;
+ }
+
+ .d-xxl-table-row {
+ display: table-row !important;
+ }
+
+ .d-xxl-table-cell {
+ display: table-cell !important;
+ }
+
+ .d-xxl-flex {
+ display: flex !important;
+ }
+
+ .d-xxl-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .d-xxl-none {
+ display: none !important;
+ }
+
+ .flex-xxl-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .flex-xxl-row {
+ flex-direction: row !important;
+ }
+
+ .flex-xxl-column {
+ flex-direction: column !important;
+ }
+
+ .flex-xxl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .flex-xxl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .flex-xxl-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .flex-xxl-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .flex-xxl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .flex-xxl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .flex-xxl-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .flex-xxl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .flex-xxl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .gap-xxl-0 {
+ gap: 0 !important;
+ }
+
+ .gap-xxl-1 {
+ gap: 0.25rem !important;
+ }
+
+ .gap-xxl-2 {
+ gap: 0.5rem !important;
+ }
+
+ .gap-xxl-3 {
+ gap: 1rem !important;
+ }
+
+ .gap-xxl-4 {
+ gap: 1.5rem !important;
+ }
+
+ .gap-xxl-5 {
+ gap: 3rem !important;
+ }
+
+ .justify-content-xxl-start {
+ justify-content: flex-start !important;
+ }
+
+ .justify-content-xxl-end {
+ justify-content: flex-end !important;
+ }
+
+ .justify-content-xxl-center {
+ justify-content: center !important;
+ }
+
+ .justify-content-xxl-between {
+ justify-content: space-between !important;
+ }
+
+ .justify-content-xxl-around {
+ justify-content: space-around !important;
+ }
+
+ .justify-content-xxl-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .align-items-xxl-start {
+ align-items: flex-start !important;
+ }
+
+ .align-items-xxl-end {
+ align-items: flex-end !important;
+ }
+
+ .align-items-xxl-center {
+ align-items: center !important;
+ }
+
+ .align-items-xxl-baseline {
+ align-items: baseline !important;
+ }
+
+ .align-items-xxl-stretch {
+ align-items: stretch !important;
+ }
+
+ .align-content-xxl-start {
+ align-content: flex-start !important;
+ }
+
+ .align-content-xxl-end {
+ align-content: flex-end !important;
+ }
+
+ .align-content-xxl-center {
+ align-content: center !important;
+ }
+
+ .align-content-xxl-between {
+ align-content: space-between !important;
+ }
+
+ .align-content-xxl-around {
+ align-content: space-around !important;
+ }
+
+ .align-content-xxl-stretch {
+ align-content: stretch !important;
+ }
+
+ .align-self-xxl-auto {
+ align-self: auto !important;
+ }
+
+ .align-self-xxl-start {
+ align-self: flex-start !important;
+ }
+
+ .align-self-xxl-end {
+ align-self: flex-end !important;
+ }
+
+ .align-self-xxl-center {
+ align-self: center !important;
+ }
+
+ .align-self-xxl-baseline {
+ align-self: baseline !important;
+ }
+
+ .align-self-xxl-stretch {
+ align-self: stretch !important;
+ }
+
+ .order-xxl-first {
+ order: -1 !important;
+ }
+
+ .order-xxl-0 {
+ order: 0 !important;
+ }
+
+ .order-xxl-1 {
+ order: 1 !important;
+ }
+
+ .order-xxl-2 {
+ order: 2 !important;
+ }
+
+ .order-xxl-3 {
+ order: 3 !important;
+ }
+
+ .order-xxl-4 {
+ order: 4 !important;
+ }
+
+ .order-xxl-5 {
+ order: 5 !important;
+ }
+
+ .order-xxl-last {
+ order: 6 !important;
+ }
+
+ .m-xxl-0 {
+ margin: 0 !important;
+ }
+
+ .m-xxl-1 {
+ margin: 0.25rem !important;
+ }
+
+ .m-xxl-2 {
+ margin: 0.5rem !important;
+ }
+
+ .m-xxl-3 {
+ margin: 1rem !important;
+ }
+
+ .m-xxl-4 {
+ margin: 1.5rem !important;
+ }
+
+ .m-xxl-5 {
+ margin: 3rem !important;
+ }
+
+ .m-xxl-auto {
+ margin: auto !important;
+ }
+
+ .mx-xxl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .mx-xxl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .mx-xxl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .mx-xxl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .mx-xxl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .mx-xxl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .mx-xxl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .my-xxl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .my-xxl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .my-xxl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .my-xxl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .my-xxl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .my-xxl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .my-xxl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .mt-xxl-0 {
+ margin-top: 0 !important;
+ }
+
+ .mt-xxl-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .mt-xxl-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .mt-xxl-3 {
+ margin-top: 1rem !important;
+ }
+
+ .mt-xxl-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .mt-xxl-5 {
+ margin-top: 3rem !important;
+ }
+
+ .mt-xxl-auto {
+ margin-top: auto !important;
+ }
+
+ .me-xxl-0 {
+ margin-right: 0 !important;
+ }
+
+ .me-xxl-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .me-xxl-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .me-xxl-3 {
+ margin-right: 1rem !important;
+ }
+
+ .me-xxl-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .me-xxl-5 {
+ margin-right: 3rem !important;
+ }
+
+ .me-xxl-auto {
+ margin-right: auto !important;
+ }
+
+ .mb-xxl-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .mb-xxl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .mb-xxl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .mb-xxl-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .mb-xxl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .mb-xxl-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .mb-xxl-auto {
+ margin-bottom: auto !important;
+ }
+
+ .ms-xxl-0 {
+ margin-left: 0 !important;
+ }
+
+ .ms-xxl-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .ms-xxl-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .ms-xxl-3 {
+ margin-left: 1rem !important;
+ }
+
+ .ms-xxl-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .ms-xxl-5 {
+ margin-left: 3rem !important;
+ }
+
+ .ms-xxl-auto {
+ margin-left: auto !important;
+ }
+
+ .p-xxl-0 {
+ padding: 0 !important;
+ }
+
+ .p-xxl-1 {
+ padding: 0.25rem !important;
+ }
+
+ .p-xxl-2 {
+ padding: 0.5rem !important;
+ }
+
+ .p-xxl-3 {
+ padding: 1rem !important;
+ }
+
+ .p-xxl-4 {
+ padding: 1.5rem !important;
+ }
+
+ .p-xxl-5 {
+ padding: 3rem !important;
+ }
+
+ .px-xxl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .px-xxl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .px-xxl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .px-xxl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .px-xxl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .px-xxl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .py-xxl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .py-xxl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .py-xxl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .py-xxl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .py-xxl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .py-xxl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .pt-xxl-0 {
+ padding-top: 0 !important;
+ }
+
+ .pt-xxl-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .pt-xxl-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .pt-xxl-3 {
+ padding-top: 1rem !important;
+ }
+
+ .pt-xxl-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .pt-xxl-5 {
+ padding-top: 3rem !important;
+ }
+
+ .pe-xxl-0 {
+ padding-right: 0 !important;
+ }
+
+ .pe-xxl-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .pe-xxl-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .pe-xxl-3 {
+ padding-right: 1rem !important;
+ }
+
+ .pe-xxl-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .pe-xxl-5 {
+ padding-right: 3rem !important;
+ }
+
+ .pb-xxl-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .pb-xxl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .pb-xxl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .pb-xxl-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .pb-xxl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .pb-xxl-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .ps-xxl-0 {
+ padding-left: 0 !important;
+ }
+
+ .ps-xxl-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .ps-xxl-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .ps-xxl-3 {
+ padding-left: 1rem !important;
+ }
+
+ .ps-xxl-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .ps-xxl-5 {
+ padding-left: 3rem !important;
+ }
+
+ .text-xxl-start {
+ text-align: left !important;
+ }
+
+ .text-xxl-end {
+ text-align: right !important;
+ }
+
+ .text-xxl-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 1200px) {
+ .fs-1 {
+ font-size: 1.875rem !important;
+ }
+
+ .fs-2 {
+ font-size: 1.5rem !important;
+ }
+
+ .fs-3 {
+ font-size: 1.3125rem !important;
+ }
+}
+@media print {
+ .d-print-inline {
+ display: inline !important;
+ }
+
+ .d-print-inline-block {
+ display: inline-block !important;
+ }
+
+ .d-print-block {
+ display: block !important;
+ }
+
+ .d-print-grid {
+ display: grid !important;
+ }
+
+ .d-print-table {
+ display: table !important;
+ }
+
+ .d-print-table-row {
+ display: table-row !important;
+ }
+
+ .d-print-table-cell {
+ display: table-cell !important;
+ }
+
+ .d-print-flex {
+ display: flex !important;
+ }
+
+ .d-print-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .d-print-none {
+ display: none !important;
+ }
+}
+.nav {
+ display: flex;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+.nav-link {
+ display: block;
+ padding: 0.5rem 1rem;
+ text-decoration: none;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .nav-link {
+ transition: none;
+ }
+}
+.nav-link.disabled {
+ color: #6c757d;
+ pointer-events: none;
+ cursor: default;
+}
+.nav-tabs {
+ border-bottom: 1px solid #dee2e6;
+}
+.nav-tabs .nav-link {
+ margin-bottom: -1px;
+ background: none;
+ border: 1px solid transparent;
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
+}
+.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
+ border-color: #e9ecef #e9ecef #dee2e6;
+ isolation: isolate;
+}
+.nav-tabs .nav-link.disabled {
+ color: #6c757d;
+ background-color: transparent;
+ border-color: transparent;
+}
+.nav-tabs .nav-link.active,
+.nav-tabs .nav-item.show .nav-link {
+ color: #495057;
+ background-color: #fff;
+ border-color: #dee2e6 #dee2e6 #fff;
+}
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.nav-pills .nav-link {
+ background: none;
+ border: 0;
+ border-radius: 0.25rem;
+}
+.nav-pills .nav-link.active,
+.nav-pills .show > .nav-link {
+ color: #fff;
+ background-color: #0d6efd;
+}
+.nav-fill > .nav-link,
+.nav-fill .nav-item {
+ flex: 1 1 auto;
+ text-align: center;
+}
+.nav-justified > .nav-link,
+.nav-justified .nav-item {
+ flex-basis: 0;
+ flex-grow: 1;
+ text-align: center;
+}
+.nav-fill .nav-item .nav-link,
+.nav-justified .nav-item .nav-link {
+ width: 100%;
+}
+.tab-content > .tab-pane {
+ display: none;
+}
+.tab-content > .active {
+ display: block;
+}
+.navbar {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+.navbar > .container-xxl, .navbar > .container-xl, .navbar > .container-lg, .navbar > .container-md, .navbar > .container-sm, .navbar > .container,
+.navbar > .container-fluid {
+ display: flex;
+ flex-wrap: inherit;
+ align-items: center;
+ justify-content: space-between;
+}
+.navbar-brand {
+ padding-top: 0.3125rem;
+ padding-bottom: 0.3125rem;
+ margin-right: 1rem;
+ font-size: 1.25rem;
+ text-decoration: none;
+ white-space: nowrap;
+}
+.navbar-nav {
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+.navbar-nav .nav-link {
+ padding-right: 0;
+ padding-left: 0;
+}
+.navbar-nav .dropdown-menu {
+ position: static;
+}
+.navbar-text {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+.navbar-collapse {
+ flex-basis: 100%;
+ flex-grow: 1;
+ align-items: center;
+}
+.navbar-toggler {
+ padding: 0.25rem 0.75rem;
+ font-size: 1.25rem;
+ line-height: 1;
+ background-color: transparent;
+ border: 1px solid transparent;
+ border-radius: 0.25rem;
+ transition: box-shadow 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .navbar-toggler {
+ transition: none;
+ }
+}
+.navbar-toggler:hover {
+ text-decoration: none;
+}
+.navbar-toggler:focus {
+ text-decoration: none;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem;
+}
+.navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: 100%;
+}
+.navbar-nav-scroll {
+ max-height: var(--bs-scroll-height, 75vh);
+ overflow-y: auto;
+}
+@media (min-width: 576px) {
+ .navbar-expand-sm {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-sm .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: 1rem;
+ padding-left: 1rem;
+ }
+ .navbar-expand-sm .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-sm .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-sm .navbar-toggler {
+ display: none;
+ }
+}
+@media (min-width: 768px) {
+ .navbar-expand-md {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-md .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-md .navbar-nav .nav-link {
+ padding-right: 1rem;
+ padding-left: 1rem;
+ }
+ .navbar-expand-md .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-md .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-md .navbar-toggler {
+ display: none;
+ }
+}
+@media (min-width: 992px) {
+ .navbar-expand-lg {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-lg .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: 1rem;
+ padding-left: 1rem;
+ }
+ .navbar-expand-lg .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-lg .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-lg .navbar-toggler {
+ display: none;
+ }
+}
+@media (min-width: 1200px) {
+ .navbar-expand-xl {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-xl .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-xl .navbar-nav .nav-link {
+ padding-right: 1rem;
+ padding-left: 1rem;
+ }
+ .navbar-expand-xl .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-xl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-xl .navbar-toggler {
+ display: none;
+ }
+}
+@media (min-width: 1400px) {
+ .navbar-expand-xxl {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-xxl .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-xxl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-xxl .navbar-nav .nav-link {
+ padding-right: 1rem;
+ padding-left: 1rem;
+ }
+ .navbar-expand-xxl .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-xxl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-xxl .navbar-toggler {
+ display: none;
+ }
+}
+.navbar-expand {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+}
+.navbar-expand .navbar-nav {
+ flex-direction: row;
+}
+.navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute;
+}
+.navbar-expand .navbar-nav .nav-link {
+ padding-right: 1rem;
+ padding-left: 1rem;
+}
+.navbar-expand .navbar-nav-scroll {
+ overflow: visible;
+}
+.navbar-expand .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+}
+.navbar-expand .navbar-toggler {
+ display: none;
+}
+.navbar-light .navbar-brand {
+ color: rgba(0, 0, 0, 0.9);
+}
+.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {
+ color: rgba(0, 0, 0, 0.9);
+}
+.navbar-light .navbar-nav .nav-link {
+ color: rgba(0, 0, 0, 0.55);
+}
+.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {
+ color: rgba(0, 0, 0, 0.7);
+}
+.navbar-light .navbar-nav .nav-link.disabled {
+ color: rgba(0, 0, 0, 0.3);
+}
+.navbar-light .navbar-nav .show > .nav-link,
+.navbar-light .navbar-nav .nav-link.active {
+ color: rgba(0, 0, 0, 0.9);
+}
+.navbar-light .navbar-toggler {
+ color: rgba(0, 0, 0, 0.55);
+ border-color: rgba(0, 0, 0, 0.1);
+}
+.navbar-light .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+.navbar-light .navbar-text {
+ color: rgba(0, 0, 0, 0.55);
+}
+.navbar-light .navbar-text a,
+.navbar-light .navbar-text a:hover,
+.navbar-light .navbar-text a:focus {
+ color: rgba(0, 0, 0, 0.9);
+}
+.navbar-dark .navbar-brand {
+ color: #fff;
+}
+.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {
+ color: #fff;
+}
+.navbar-dark .navbar-nav .nav-link {
+ color: rgba(255, 255, 255, 0.55);
+}
+.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {
+ color: rgba(255, 255, 255, 0.75);
+}
+.navbar-dark .navbar-nav .nav-link.disabled {
+ color: rgba(255, 255, 255, 0.25);
+}
+.navbar-dark .navbar-nav .show > .nav-link,
+.navbar-dark .navbar-nav .nav-link.active {
+ color: #fff;
+}
+.navbar-dark .navbar-toggler {
+ color: rgba(255, 255, 255, 0.55);
+ border-color: rgba(255, 255, 255, 0.1);
+}
+.navbar-dark .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+.navbar-dark .navbar-text {
+ color: rgba(255, 255, 255, 0.55);
+}
+.navbar-dark .navbar-text a,
+.navbar-dark .navbar-text a:hover,
+.navbar-dark .navbar-text a:focus {
+ color: #fff;
+}
+.container,
+.container-fluid,
+.container-xxl,
+.container-xl,
+.container-lg,
+.container-md,
+.container-sm {
+ width: 100%;
+ padding-right: var(--bs-gutter-x, 0.75rem);
+ padding-left: var(--bs-gutter-x, 0.75rem);
+ margin-right: auto;
+ margin-left: auto;
+}
+@media (min-width: 576px) {
+ .container-sm, .container {
+ max-width: 540px;
+ }
+}
+@media (min-width: 768px) {
+ .container-md, .container-sm, .container {
+ max-width: 720px;
+ }
+}
+@media (min-width: 992px) {
+ .container-lg, .container-md, .container-sm, .container {
+ max-width: 960px;
+ }
+}
+@media (min-width: 1200px) {
+ .container-xl, .container-lg, .container-md, .container-sm, .container {
+ max-width: 1140px;
+ }
+}
+@media (min-width: 1400px) {
+ .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {
+ max-width: 1320px;
+ }
+}
+.row {
+ --bs-gutter-x: 1.5rem;
+ --bs-gutter-y: 0;
+ display: flex;
+ flex-wrap: wrap;
+ margin-top: calc(var(--bs-gutter-y) * -1);
+ margin-right: calc(var(--bs-gutter-x) / -2);
+ margin-left: calc(var(--bs-gutter-x) / -2);
+}
+.row > * {
+ flex-shrink: 0;
+ width: 100%;
+ max-width: 100%;
+ padding-right: calc(var(--bs-gutter-x) / 2);
+ padding-left: calc(var(--bs-gutter-x) / 2);
+ margin-top: var(--bs-gutter-y);
+}
+.col {
+ flex: 1 0 0%;
+}
+.row-cols-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+}
+.row-cols-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+}
+.row-cols-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+}
+.row-cols-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+}
+.row-cols-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+}
+.row-cols-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+}
+.row-cols-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+}
+.col-auto {
+ flex: 0 0 auto;
+ width: auto;
+}
+.col-1 {
+ flex: 0 0 auto;
+ width: 8.3333333333%;
+}
+.col-2 {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+}
+.col-3 {
+ flex: 0 0 auto;
+ width: 25%;
+}
+.col-4 {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+}
+.col-5 {
+ flex: 0 0 auto;
+ width: 41.6666666667%;
+}
+.col-6 {
+ flex: 0 0 auto;
+ width: 50%;
+}
+.col-7 {
+ flex: 0 0 auto;
+ width: 58.3333333333%;
+}
+.col-8 {
+ flex: 0 0 auto;
+ width: 66.6666666667%;
+}
+.col-9 {
+ flex: 0 0 auto;
+ width: 75%;
+}
+.col-10 {
+ flex: 0 0 auto;
+ width: 83.3333333333%;
+}
+.col-11 {
+ flex: 0 0 auto;
+ width: 91.6666666667%;
+}
+.col-12 {
+ flex: 0 0 auto;
+ width: 100%;
+}
+.offset-1 {
+ margin-left: 8.3333333333%;
+}
+.offset-2 {
+ margin-left: 16.6666666667%;
+}
+.offset-3 {
+ margin-left: 25%;
+}
+.offset-4 {
+ margin-left: 33.3333333333%;
+}
+.offset-5 {
+ margin-left: 41.6666666667%;
+}
+.offset-6 {
+ margin-left: 50%;
+}
+.offset-7 {
+ margin-left: 58.3333333333%;
+}
+.offset-8 {
+ margin-left: 66.6666666667%;
+}
+.offset-9 {
+ margin-left: 75%;
+}
+.offset-10 {
+ margin-left: 83.3333333333%;
+}
+.offset-11 {
+ margin-left: 91.6666666667%;
+}
+.g-0,
+.gx-0 {
+ --bs-gutter-x: 0;
+}
+.g-0,
+.gy-0 {
+ --bs-gutter-y: 0;
+}
+.g-1,
+.gx-1 {
+ --bs-gutter-x: 0.25rem;
+}
+.g-1,
+.gy-1 {
+ --bs-gutter-y: 0.25rem;
+}
+.g-2,
+.gx-2 {
+ --bs-gutter-x: 0.5rem;
+}
+.g-2,
+.gy-2 {
+ --bs-gutter-y: 0.5rem;
+}
+.g-3,
+.gx-3 {
+ --bs-gutter-x: 1rem;
+}
+.g-3,
+.gy-3 {
+ --bs-gutter-y: 1rem;
+}
+.g-4,
+.gx-4 {
+ --bs-gutter-x: 1.5rem;
+}
+.g-4,
+.gy-4 {
+ --bs-gutter-y: 1.5rem;
+}
+.g-5,
+.gx-5 {
+ --bs-gutter-x: 3rem;
+}
+.g-5,
+.gy-5 {
+ --bs-gutter-y: 3rem;
+}
+@media (min-width: 576px) {
+ .col-sm {
+ flex: 1 0 0%;
+ }
+
+ .row-cols-sm-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .row-cols-sm-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .row-cols-sm-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .row-cols-sm-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .row-cols-sm-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .row-cols-sm-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .row-cols-sm-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-sm-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .col-sm-1 {
+ flex: 0 0 auto;
+ width: 8.3333333333%;
+ }
+
+ .col-sm-2 {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-sm-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .col-sm-4 {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .col-sm-5 {
+ flex: 0 0 auto;
+ width: 41.6666666667%;
+ }
+
+ .col-sm-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .col-sm-7 {
+ flex: 0 0 auto;
+ width: 58.3333333333%;
+ }
+
+ .col-sm-8 {
+ flex: 0 0 auto;
+ width: 66.6666666667%;
+ }
+
+ .col-sm-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .col-sm-10 {
+ flex: 0 0 auto;
+ width: 83.3333333333%;
+ }
+
+ .col-sm-11 {
+ flex: 0 0 auto;
+ width: 91.6666666667%;
+ }
+
+ .col-sm-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .offset-sm-0 {
+ margin-left: 0;
+ }
+
+ .offset-sm-1 {
+ margin-left: 8.3333333333%;
+ }
+
+ .offset-sm-2 {
+ margin-left: 16.6666666667%;
+ }
+
+ .offset-sm-3 {
+ margin-left: 25%;
+ }
+
+ .offset-sm-4 {
+ margin-left: 33.3333333333%;
+ }
+
+ .offset-sm-5 {
+ margin-left: 41.6666666667%;
+ }
+
+ .offset-sm-6 {
+ margin-left: 50%;
+ }
+
+ .offset-sm-7 {
+ margin-left: 58.3333333333%;
+ }
+
+ .offset-sm-8 {
+ margin-left: 66.6666666667%;
+ }
+
+ .offset-sm-9 {
+ margin-left: 75%;
+ }
+
+ .offset-sm-10 {
+ margin-left: 83.3333333333%;
+ }
+
+ .offset-sm-11 {
+ margin-left: 91.6666666667%;
+ }
+
+ .g-sm-0,
+.gx-sm-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .g-sm-0,
+.gy-sm-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .g-sm-1,
+.gx-sm-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .g-sm-1,
+.gy-sm-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .g-sm-2,
+.gx-sm-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .g-sm-2,
+.gy-sm-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .g-sm-3,
+.gx-sm-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .g-sm-3,
+.gy-sm-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .g-sm-4,
+.gx-sm-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .g-sm-4,
+.gy-sm-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .g-sm-5,
+.gx-sm-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .g-sm-5,
+.gy-sm-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+@media (min-width: 768px) {
+ .col-md {
+ flex: 1 0 0%;
+ }
+
+ .row-cols-md-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .row-cols-md-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .row-cols-md-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .row-cols-md-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .row-cols-md-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .row-cols-md-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .row-cols-md-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-md-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .col-md-1 {
+ flex: 0 0 auto;
+ width: 8.3333333333%;
+ }
+
+ .col-md-2 {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-md-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .col-md-4 {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .col-md-5 {
+ flex: 0 0 auto;
+ width: 41.6666666667%;
+ }
+
+ .col-md-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .col-md-7 {
+ flex: 0 0 auto;
+ width: 58.3333333333%;
+ }
+
+ .col-md-8 {
+ flex: 0 0 auto;
+ width: 66.6666666667%;
+ }
+
+ .col-md-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .col-md-10 {
+ flex: 0 0 auto;
+ width: 83.3333333333%;
+ }
+
+ .col-md-11 {
+ flex: 0 0 auto;
+ width: 91.6666666667%;
+ }
+
+ .col-md-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .offset-md-0 {
+ margin-left: 0;
+ }
+
+ .offset-md-1 {
+ margin-left: 8.3333333333%;
+ }
+
+ .offset-md-2 {
+ margin-left: 16.6666666667%;
+ }
+
+ .offset-md-3 {
+ margin-left: 25%;
+ }
+
+ .offset-md-4 {
+ margin-left: 33.3333333333%;
+ }
+
+ .offset-md-5 {
+ margin-left: 41.6666666667%;
+ }
+
+ .offset-md-6 {
+ margin-left: 50%;
+ }
+
+ .offset-md-7 {
+ margin-left: 58.3333333333%;
+ }
+
+ .offset-md-8 {
+ margin-left: 66.6666666667%;
+ }
+
+ .offset-md-9 {
+ margin-left: 75%;
+ }
+
+ .offset-md-10 {
+ margin-left: 83.3333333333%;
+ }
+
+ .offset-md-11 {
+ margin-left: 91.6666666667%;
+ }
+
+ .g-md-0,
+.gx-md-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .g-md-0,
+.gy-md-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .g-md-1,
+.gx-md-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .g-md-1,
+.gy-md-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .g-md-2,
+.gx-md-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .g-md-2,
+.gy-md-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .g-md-3,
+.gx-md-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .g-md-3,
+.gy-md-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .g-md-4,
+.gx-md-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .g-md-4,
+.gy-md-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .g-md-5,
+.gx-md-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .g-md-5,
+.gy-md-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+@media (min-width: 992px) {
+ .col-lg {
+ flex: 1 0 0%;
+ }
+
+ .row-cols-lg-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .row-cols-lg-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .row-cols-lg-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .row-cols-lg-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .row-cols-lg-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .row-cols-lg-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .row-cols-lg-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-lg-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .col-lg-1 {
+ flex: 0 0 auto;
+ width: 8.3333333333%;
+ }
+
+ .col-lg-2 {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-lg-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .col-lg-4 {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .col-lg-5 {
+ flex: 0 0 auto;
+ width: 41.6666666667%;
+ }
+
+ .col-lg-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .col-lg-7 {
+ flex: 0 0 auto;
+ width: 58.3333333333%;
+ }
+
+ .col-lg-8 {
+ flex: 0 0 auto;
+ width: 66.6666666667%;
+ }
+
+ .col-lg-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .col-lg-10 {
+ flex: 0 0 auto;
+ width: 83.3333333333%;
+ }
+
+ .col-lg-11 {
+ flex: 0 0 auto;
+ width: 91.6666666667%;
+ }
+
+ .col-lg-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .offset-lg-0 {
+ margin-left: 0;
+ }
+
+ .offset-lg-1 {
+ margin-left: 8.3333333333%;
+ }
+
+ .offset-lg-2 {
+ margin-left: 16.6666666667%;
+ }
+
+ .offset-lg-3 {
+ margin-left: 25%;
+ }
+
+ .offset-lg-4 {
+ margin-left: 33.3333333333%;
+ }
+
+ .offset-lg-5 {
+ margin-left: 41.6666666667%;
+ }
+
+ .offset-lg-6 {
+ margin-left: 50%;
+ }
+
+ .offset-lg-7 {
+ margin-left: 58.3333333333%;
+ }
+
+ .offset-lg-8 {
+ margin-left: 66.6666666667%;
+ }
+
+ .offset-lg-9 {
+ margin-left: 75%;
+ }
+
+ .offset-lg-10 {
+ margin-left: 83.3333333333%;
+ }
+
+ .offset-lg-11 {
+ margin-left: 91.6666666667%;
+ }
+
+ .g-lg-0,
+.gx-lg-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .g-lg-0,
+.gy-lg-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .g-lg-1,
+.gx-lg-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .g-lg-1,
+.gy-lg-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .g-lg-2,
+.gx-lg-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .g-lg-2,
+.gy-lg-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .g-lg-3,
+.gx-lg-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .g-lg-3,
+.gy-lg-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .g-lg-4,
+.gx-lg-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .g-lg-4,
+.gy-lg-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .g-lg-5,
+.gx-lg-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .g-lg-5,
+.gy-lg-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+@media (min-width: 1200px) {
+ .col-xl {
+ flex: 1 0 0%;
+ }
+
+ .row-cols-xl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .row-cols-xl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .row-cols-xl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .row-cols-xl-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .row-cols-xl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .row-cols-xl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .row-cols-xl-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-xl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .col-xl-1 {
+ flex: 0 0 auto;
+ width: 8.3333333333%;
+ }
+
+ .col-xl-2 {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-xl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .col-xl-4 {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .col-xl-5 {
+ flex: 0 0 auto;
+ width: 41.6666666667%;
+ }
+
+ .col-xl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .col-xl-7 {
+ flex: 0 0 auto;
+ width: 58.3333333333%;
+ }
+
+ .col-xl-8 {
+ flex: 0 0 auto;
+ width: 66.6666666667%;
+ }
+
+ .col-xl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .col-xl-10 {
+ flex: 0 0 auto;
+ width: 83.3333333333%;
+ }
+
+ .col-xl-11 {
+ flex: 0 0 auto;
+ width: 91.6666666667%;
+ }
+
+ .col-xl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .offset-xl-0 {
+ margin-left: 0;
+ }
+
+ .offset-xl-1 {
+ margin-left: 8.3333333333%;
+ }
+
+ .offset-xl-2 {
+ margin-left: 16.6666666667%;
+ }
+
+ .offset-xl-3 {
+ margin-left: 25%;
+ }
+
+ .offset-xl-4 {
+ margin-left: 33.3333333333%;
+ }
+
+ .offset-xl-5 {
+ margin-left: 41.6666666667%;
+ }
+
+ .offset-xl-6 {
+ margin-left: 50%;
+ }
+
+ .offset-xl-7 {
+ margin-left: 58.3333333333%;
+ }
+
+ .offset-xl-8 {
+ margin-left: 66.6666666667%;
+ }
+
+ .offset-xl-9 {
+ margin-left: 75%;
+ }
+
+ .offset-xl-10 {
+ margin-left: 83.3333333333%;
+ }
+
+ .offset-xl-11 {
+ margin-left: 91.6666666667%;
+ }
+
+ .g-xl-0,
+.gx-xl-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .g-xl-0,
+.gy-xl-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .g-xl-1,
+.gx-xl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .g-xl-1,
+.gy-xl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .g-xl-2,
+.gx-xl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .g-xl-2,
+.gy-xl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .g-xl-3,
+.gx-xl-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .g-xl-3,
+.gy-xl-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .g-xl-4,
+.gx-xl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .g-xl-4,
+.gy-xl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .g-xl-5,
+.gx-xl-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .g-xl-5,
+.gy-xl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+@media (min-width: 1400px) {
+ .col-xxl {
+ flex: 1 0 0%;
+ }
+
+ .row-cols-xxl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .row-cols-xxl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .row-cols-xxl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .row-cols-xxl-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .row-cols-xxl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .row-cols-xxl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .row-cols-xxl-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-xxl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .col-xxl-1 {
+ flex: 0 0 auto;
+ width: 8.3333333333%;
+ }
+
+ .col-xxl-2 {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-xxl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .col-xxl-4 {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .col-xxl-5 {
+ flex: 0 0 auto;
+ width: 41.6666666667%;
+ }
+
+ .col-xxl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .col-xxl-7 {
+ flex: 0 0 auto;
+ width: 58.3333333333%;
+ }
+
+ .col-xxl-8 {
+ flex: 0 0 auto;
+ width: 66.6666666667%;
+ }
+
+ .col-xxl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .col-xxl-10 {
+ flex: 0 0 auto;
+ width: 83.3333333333%;
+ }
+
+ .col-xxl-11 {
+ flex: 0 0 auto;
+ width: 91.6666666667%;
+ }
+
+ .col-xxl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .offset-xxl-0 {
+ margin-left: 0;
+ }
+
+ .offset-xxl-1 {
+ margin-left: 8.3333333333%;
+ }
+
+ .offset-xxl-2 {
+ margin-left: 16.6666666667%;
+ }
+
+ .offset-xxl-3 {
+ margin-left: 25%;
+ }
+
+ .offset-xxl-4 {
+ margin-left: 33.3333333333%;
+ }
+
+ .offset-xxl-5 {
+ margin-left: 41.6666666667%;
+ }
+
+ .offset-xxl-6 {
+ margin-left: 50%;
+ }
+
+ .offset-xxl-7 {
+ margin-left: 58.3333333333%;
+ }
+
+ .offset-xxl-8 {
+ margin-left: 66.6666666667%;
+ }
+
+ .offset-xxl-9 {
+ margin-left: 75%;
+ }
+
+ .offset-xxl-10 {
+ margin-left: 83.3333333333%;
+ }
+
+ .offset-xxl-11 {
+ margin-left: 91.6666666667%;
+ }
+
+ .g-xxl-0,
+.gx-xxl-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .g-xxl-0,
+.gy-xxl-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .g-xxl-1,
+.gx-xxl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .g-xxl-1,
+.gy-xxl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .g-xxl-2,
+.gx-xxl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .g-xxl-2,
+.gy-xxl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .g-xxl-3,
+.gx-xxl-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .g-xxl-3,
+.gy-xxl-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .g-xxl-4,
+.gx-xxl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .g-xxl-4,
+.gy-xxl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .g-xxl-5,
+.gx-xxl-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .g-xxl-5,
+.gy-xxl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+body {
+ background-color: #121212;
+ color: #ffffff;
+ font-family: "Open Sans", sans-serif;
+}
+ul {
+ list-style-type: none;
+ padding: 0;
+}
+li {
+ margin-bottom: 25px;
+}
+li div h2 {
+ margin: 0px;
+}
+p {
+ margin: 0px;
+}
+#title {
+ font-family: "Oxygen", sans-serif;
+ font-weight: 300;
+}
+#about {
+ font-weight: 300;
+ padding-left: 1px;
+}
+#projects-search {
+ align-items: center;
+}
+#projects-search form {
+ display: flex;
+ align-items: center;
+ height: 35px;
+}
+#projects-search form input[type=search] {
+ margin-right: 15px;
+}
+#repos {
+ margin-top: 25px;
+}
+.repo-last-updated {
+ display: block;
+ font-weight: 300;
+ font-style: italic;
+}
+input[type=submit] {
+ background-color: #0947ba;
+ color: #ffffff;
+ border: 0px;
+ border-radius: 7px;
+ padding: 8px 15px 8px 15px;
+}
+a {
+ color: #ffffff;
+ text-decoration: none;
+}
+a:hover {
+ color: #0947ba;
+}
+@media (max-width: 1200px) {
+ .fs-1 {
+ font-size: calc(1.375rem + 0.667vw) !important;
+ }
+
+ .fs-2 {
+ font-size: calc(1.325rem + 1.584vw) !important;
+ }
+
+ .fs-3 {
+ font-size: calc(1.3rem + 0.017vw) !important;
+ }
+
+ .fs-4 {
+ font-size: calc(0.75rem + 0.4vw) !important;
+ }
+}
diff --git a/dist/app.9232838b.js b/dist/app.9232838b.js
new file mode 100644
index 0000000..5291d8a
--- /dev/null
+++ b/dist/app.9232838b.js
@@ -0,0 +1,693 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+(function(modules, entry, mainEntry, parcelRequireName, globalName) {
+ /* eslint-disable no-undef */
+ var globalObject =
+ typeof globalThis !== 'undefined'
+ ? globalThis
+ : typeof self !== 'undefined'
+ ? self
+ : typeof window !== 'undefined'
+ ? window
+ : typeof global !== 'undefined'
+ ? global
+ : {};
+ /* eslint-enable no-undef */
+
+ // Save the require from previous bundle to this closure if any
+ var previousRequire =
+ typeof globalObject[parcelRequireName] === 'function' &&
+ globalObject[parcelRequireName];
+
+ var cache = previousRequire.cache || {};
+ // Do not use `require` to prevent Webpack from trying to bundle this call
+ var nodeRequire =
+ typeof module !== 'undefined' &&
+ typeof module.require === 'function' &&
+ module.require.bind(module);
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire =
+ typeof globalObject[parcelRequireName] === 'function' &&
+ globalObject[parcelRequireName];
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error("Cannot find module '" + name + "'");
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+ localRequire.cache = {};
+
+ var module = (cache[name] = new newRequire.Module(name));
+
+ modules[name][0].call(
+ module.exports,
+ localRequire,
+ module,
+ module.exports,
+ this
+ );
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x) {
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x) {
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function(id, exports) {
+ modules[id] = [
+ function(require, module) {
+ module.exports = exports;
+ },
+ {},
+ ];
+ };
+
+ Object.defineProperty(newRequire, 'root', {
+ get: function() {
+ return globalObject[parcelRequireName];
+ },
+ });
+
+ globalObject[parcelRequireName] = newRequire;
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (mainEntry) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(mainEntry);
+
+ // CommonJS
+ if (typeof exports === 'object' && typeof module !== 'undefined') {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === 'function' && define.amd) {
+ define(function() {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+})({"4KKVL":[function(require,module,exports) {
+var HMR_HOST = null;
+var HMR_PORT = 1234;
+var HMR_SECURE = false;
+var HMR_ENV_HASH = "d751713988987e9331980363e24189ce";
+module.bundle.HMR_BUNDLE_ID = "45f70d85e946827dd417192a9232838b";
+// @flow
+/*global HMR_HOST, HMR_PORT, HMR_ENV_HASH, HMR_SECURE*/
+/*::
+import type {
+HMRAsset,
+HMRMessage,
+} from '@parcel/reporter-dev-server/src/HMRServer.js';
+interface ParcelRequire {
+(string): mixed;
+cache: {|[string]: ParcelModule|};
+hotData: mixed;
+Module: any;
+parent: ?ParcelRequire;
+isParcelRequire: true;
+modules: {|[string]: [Function, {|[string]: string|}]|};
+HMR_BUNDLE_ID: string;
+root: ParcelRequire;
+}
+interface ParcelModule {
+hot: {|
+data: mixed,
+accept(cb: (Function) => void): void,
+dispose(cb: (mixed) => void): void,
+// accept(deps: Array<string> | string, cb: (Function) => void): void,
+// decline(): void,
+_acceptCallbacks: Array<(Function) => void>,
+_disposeCallbacks: Array<(mixed) => void>,
+|};
+}
+declare var module: {bundle: ParcelRequire, ...};
+declare var HMR_HOST: string;
+declare var HMR_PORT: string;
+declare var HMR_ENV_HASH: string;
+declare var HMR_SECURE: boolean;
+*/
+var OVERLAY_ID = '__parcel__error__overlay__';
+var OldModule = module.bundle.Module;
+function Module(moduleName) {
+ OldModule.call(this, moduleName);
+ this.hot = {
+ data: module.bundle.hotData,
+ _acceptCallbacks: [],
+ _disposeCallbacks: [],
+ accept: function (fn) {
+ this._acceptCallbacks.push(fn || (function () {}));
+ },
+ dispose: function (fn) {
+ this._disposeCallbacks.push(fn);
+ }
+ };
+ module.bundle.hotData = undefined;
+}
+module.bundle.Module = Module;
+var checkedAssets, /*: {|[string]: boolean|}*/
+acceptedAssets, /*: {|[string]: boolean|}*/
+/*: {|[string]: boolean|}*/
+assetsToAccept;
+function getHostname() {
+ return HMR_HOST || (location.protocol.indexOf('http') === 0 ? location.hostname : 'localhost');
+}
+function getPort() {
+ return HMR_PORT || location.port;
+}
+// eslint-disable-next-line no-redeclare
+var parent = module.bundle.parent;
+if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') {
+ var hostname = getHostname();
+ var port = getPort();
+ var protocol = HMR_SECURE || location.protocol == 'https:' && !(/localhost|127.0.0.1|0.0.0.0/).test(hostname) ? 'wss' : 'ws';
+ var ws = new WebSocket(protocol + '://' + hostname + (port ? ':' + port : '') + '/');
+ // $FlowFixMe
+ ws.onmessage = function (event) /*: {data: string, ...}*/
+ {
+ checkedAssets = {
+ /*: {|[string]: boolean|}*/
+ };
+ acceptedAssets = {
+ /*: {|[string]: boolean|}*/
+ };
+ assetsToAccept = [];
+ var data = /*: HMRMessage*/
+ JSON.parse(event.data);
+ if (data.type === 'update') {
+ // Remove error overlay if there is one
+ removeErrorOverlay();
+ let assets = data.assets.filter(asset => asset.envHash === HMR_ENV_HASH);
+ // Handle HMR Update
+ var handled = false;
+ assets.forEach(asset => {
+ var didAccept = asset.type === 'css' || asset.type === 'js' && hmrAcceptCheck(module.bundle.root, asset.id, asset.depsByBundle);
+ if (didAccept) {
+ handled = true;
+ }
+ });
+ if (handled) {
+ console.clear();
+ assets.forEach(function (asset) {
+ hmrApply(module.bundle.root, asset);
+ });
+ for (var i = 0; i < assetsToAccept.length; i++) {
+ var id = assetsToAccept[i][1];
+ if (!acceptedAssets[id]) {
+ hmrAcceptRun(assetsToAccept[i][0], id);
+ }
+ }
+ } else {
+ window.location.reload();
+ }
+ }
+ if (data.type === 'error') {
+ // Log parcel errors to console
+ for (let ansiDiagnostic of data.diagnostics.ansi) {
+ let stack = ansiDiagnostic.codeframe ? ansiDiagnostic.codeframe : ansiDiagnostic.stack;
+ console.error('🚨 [parcel]: ' + ansiDiagnostic.message + '\n' + stack + '\n\n' + ansiDiagnostic.hints.join('\n'));
+ }
+ // Render the fancy html overlay
+ removeErrorOverlay();
+ var overlay = createErrorOverlay(data.diagnostics.html);
+ // $FlowFixMe
+ document.body.appendChild(overlay);
+ }
+ };
+ ws.onerror = function (e) {
+ console.error(e.message);
+ };
+ ws.onclose = function (e) {
+ if (undefined !== 'test') {
+ console.warn('[parcel] 🚨 Connection to the HMR server was lost');
+ }
+ };
+}
+function removeErrorOverlay() {
+ var overlay = document.getElementById(OVERLAY_ID);
+ if (overlay) {
+ overlay.remove();
+ console.log('[parcel] ✨ Error resolved');
+ }
+}
+function createErrorOverlay(diagnostics) {
+ var overlay = document.createElement('div');
+ overlay.id = OVERLAY_ID;
+ let errorHTML = '<div style="background: black; opacity: 0.85; font-size: 16px; color: white; position: fixed; height: 100%; width: 100%; top: 0px; left: 0px; padding: 30px; font-family: Menlo, Consolas, monospace; z-index: 9999;">';
+ for (let diagnostic of diagnostics) {
+ let stack = diagnostic.codeframe ? diagnostic.codeframe : diagnostic.stack;
+ errorHTML += `
+ <div>
+ <div style="font-size: 18px; font-weight: bold; margin-top: 20px;">
+ 🚨 ${diagnostic.message}
+ </div>
+ <pre>
+ ${stack}
+ </pre>
+ <div>
+ ${diagnostic.hints.map(hint => '<div>' + hint + '</div>').join('')}
+ </div>
+ </div>
+ `;
+ }
+ errorHTML += '</div>';
+ overlay.innerHTML = errorHTML;
+ return overlay;
+}
+function getParents(bundle, id) /*: Array<[ParcelRequire, string]>*/
+{
+ var modules = bundle.modules;
+ if (!modules) {
+ return [];
+ }
+ var parents = [];
+ var k, d, dep;
+ for (k in modules) {
+ for (d in modules[k][1]) {
+ dep = modules[k][1][d];
+ if (dep === id || Array.isArray(dep) && dep[dep.length - 1] === id) {
+ parents.push([bundle, k]);
+ }
+ }
+ }
+ if (bundle.parent) {
+ parents = parents.concat(getParents(bundle.parent, id));
+ }
+ return parents;
+}
+function updateLink(link) {
+ var newLink = link.cloneNode();
+ newLink.onload = function () {
+ if (link.parentNode !== null) {
+ // $FlowFixMe
+ link.parentNode.removeChild(link);
+ }
+ };
+ newLink.setAttribute('href', // $FlowFixMe
+ link.getAttribute('href').split('?')[0] + '?' + Date.now());
+ // $FlowFixMe
+ link.parentNode.insertBefore(newLink, link.nextSibling);
+}
+var cssTimeout = null;
+function reloadCSS() {
+ if (cssTimeout) {
+ return;
+ }
+ cssTimeout = setTimeout(function () {
+ var links = document.querySelectorAll('link[rel="stylesheet"]');
+ for (var i = 0; i < links.length; i++) {
+ // $FlowFixMe[incompatible-type]
+ var href = /*: string*/
+ links[i].getAttribute('href');
+ var hostname = getHostname();
+ var servedFromHMRServer = hostname === 'localhost' ? new RegExp('^(https?:\\/\\/(0.0.0.0|127.0.0.1)|localhost):' + getPort()).test(href) : href.indexOf(hostname + ':' + getPort());
+ var absolute = (/^https?:\/\//i).test(href) && href.indexOf(window.location.origin) !== 0 && !servedFromHMRServer;
+ if (!absolute) {
+ updateLink(links[i]);
+ }
+ }
+ cssTimeout = null;
+ }, 50);
+}
+function hmrApply(bundle, /*: ParcelRequire*/
+asset) /*: HMRAsset*/
+{
+ var modules = bundle.modules;
+ if (!modules) {
+ return;
+ }
+ if (asset.type === 'css') {
+ reloadCSS();
+ return;
+ }
+ let deps = asset.depsByBundle[bundle.HMR_BUNDLE_ID];
+ if (deps) {
+ var fn = new Function('require', 'module', 'exports', asset.output);
+ modules[asset.id] = [fn, deps];
+ } else if (bundle.parent) {
+ hmrApply(bundle.parent, asset);
+ }
+}
+function hmrAcceptCheck(bundle, /*: ParcelRequire*/
+id, /*: ParcelRequire*/
+/*: string*/
+depsByBundle) /*: ?{ [string]: { [string]: string } }*/
+{
+ var modules = bundle.modules;
+ if (!modules) {
+ return;
+ }
+ if (depsByBundle && !depsByBundle[bundle.HMR_BUNDLE_ID]) {
+ // If we reached the root bundle without finding where the asset should go,
+ // there's nothing to do. Mark as "accepted" so we don't reload the page.
+ if (!bundle.parent) {
+ return true;
+ }
+ return hmrAcceptCheck(bundle.parent, id, depsByBundle);
+ }
+ if (checkedAssets[id]) {
+ return;
+ }
+ checkedAssets[id] = true;
+ var cached = bundle.cache[id];
+ assetsToAccept.push([bundle, id]);
+ if (cached && cached.hot && cached.hot._acceptCallbacks.length) {
+ return true;
+ }
+ return getParents(module.bundle.root, id).some(function (v) {
+ return hmrAcceptCheck(v[0], v[1], null);
+ });
+}
+function hmrAcceptRun(bundle, /*: ParcelRequire*/
+id) /*: string*/
+{
+ var cached = bundle.cache[id];
+ bundle.hotData = {};
+ if (cached && cached.hot) {
+ cached.hot.data = bundle.hotData;
+ }
+ if (cached && cached.hot && cached.hot._disposeCallbacks.length) {
+ cached.hot._disposeCallbacks.forEach(function (cb) {
+ cb(bundle.hotData);
+ });
+ }
+ delete bundle.cache[id];
+ bundle(id);
+ cached = bundle.cache[id];
+ if (cached && cached.hot && cached.hot._acceptCallbacks.length) {
+ cached.hot._acceptCallbacks.forEach(function (cb) {
+ var assetsToAlsoAccept = cb(function () {
+ return getParents(module.bundle.root, id);
+ });
+ if (assetsToAlsoAccept && assetsToAccept.length) {
+ assetsToAccept.push.apply(assetsToAccept, assetsToAlsoAccept);
+ }
+ });
+ }
+ acceptedAssets[id] = true;
+}
+
+},{}],"6Q6as":[function(require,module,exports) {
+function request(method, source, data = null)
+{
+ return new Promise(function (resolve, reject){
+ let xhr = new XMLHttpRequest();
+ xhr.open(method, source, true);
+ xhr.setRequestHeader("Content-Type", "application/json");
+ xhr.send(data);
+
+ xhr.onload = function()
+ {
+ if(this.status >= 200 && this.status < 300){
+ resolve(xhr.response);
+ }
+ resolve({ status: this.status, statusText: xhr.statusText });
+ };
+ xhr.onerror = () =>
+ {
+ resolve({ status: this.status, statusText: xhr.statusText });
+ }
+ });
+}
+
+async function buildHeader(container, endpoint, title_text, about_text, repo_page = false)
+{
+ const info = JSON.parse(await request("GET", `http://localhost:1337/api/v1/${endpoint}`))["data"];
+
+ const row_div = document.createElement("div");
+ row_div.classList.add("row", "mx-0");
+
+ const col_div = document.createElement("div");
+ col_div.classList.add("col", "ms-4", "mt-2");
+ col_div.setAttribute("id", "header");
+
+ const title = document.createElement("a");
+ title.classList.add("fs-1");
+ title.setAttribute("id", "title");
+ title.setAttribute("href", "/");
+ title.appendChild(document.createTextNode(info[title_text]));
+
+ const about = document.createElement("p");
+ about.setAttribute("id", "about");
+ about.classList.add("mb-3", "fs-4")
+ about.appendChild(document.createTextNode(info[about_text]));
+
+ col_div.appendChild(title);
+ col_div.appendChild(about);
+
+ if(repo_page) {
+ buildBackSVG(col_div);
+ }
+
+ row_div.appendChild(col_div);
+
+ container.appendChild(row_div);
+}
+
+function buildProjectsHeader(container)
+{
+ const row_div = document.createElement("div");
+ row_div.classList.add("row", "mx-0", "mt-5");
+
+ // Title column
+ const title_col_div = document.createElement("div");
+ title_col_div.classList.add("col", "ms-4");
+ title_col_div.setAttribute("id", "projects-header");
+
+ const projects_title = document.createElement("p");
+ projects_title.classList.add("fs-1");
+ projects_title.appendChild(document.createTextNode("Projects"));
+
+ title_col_div.appendChild(projects_title);
+
+ // Search column
+ const search_col_div = document.createElement("div");
+ search_col_div.classList.add("col", "d-flex", "justify-content-end");
+ search_col_div.setAttribute("id", "projects-search");
+
+ const form = document.createElement("form");
+ const search = document.createElement("input");
+ search.setAttribute("type", "search");
+ search.setAttribute("name", "q");
+ const submit = document.createElement("input");
+ submit.setAttribute("type", "submit");
+ submit.setAttribute("value", "Search");
+
+ form.appendChild(search);
+ form.appendChild(submit);
+ search_col_div.appendChild(form);
+
+ row_div.appendChild(title_col_div);
+ row_div.appendChild(search_col_div);
+
+ container.appendChild(row_div);
+}
+
+async function buildProjects(container)
+{
+ const row_div = document.createElement("div");
+ row_div.classList.add("row", "mx-0");
+
+ const col_div = document.createElement("div");
+ col_div.classList.add("col", "ms-4");
+
+ const list = document.createElement("ul");
+ list.setAttribute("id", "repos");
+
+ const repos = JSON.parse(await request("GET", "http://localhost:1337/api/v1/repos"))["data"];
+
+ const params = new URLSearchParams(window.location.search);
+ const search = params.get("q");
+
+ for(const [key, value] of Object.entries(repos)) {
+ const li = document.createElement("li");
+ const repo_div = document.createElement("div");
+
+ const repo_title = document.createElement("p");
+ const link = document.createElement("a");
+ link.setAttribute("href", key);
+ link.appendChild(document.createTextNode(key));
+ repo_title.appendChild(link);
+ repo_title.classList.add("fs-3");
+
+ const repo_last_updated = document.createElement("span");
+ repo_last_updated.appendChild(document.createTextNode(`Last updated about ${value["last_updated"]} ago`));
+ repo_last_updated.classList.add("repo-last-updated", "fs-4");
+
+ const repo_desc = document.createElement("span");
+ repo_desc.appendChild(document.createTextNode(value["description"]));
+ repo_desc.classList.add("fs-4");
+
+ repo_div.appendChild(repo_title)
+ repo_div.appendChild(repo_last_updated)
+ repo_div.appendChild(repo_desc)
+
+ li.appendChild(repo_div);
+
+ if(search !== null) {
+ if(key.indexOf(search) != -1) {
+ list.appendChild(li);
+ }
+ }
+ else {
+ list.appendChild(li);
+ }
+ }
+
+ col_div.appendChild(list);
+ row_div.appendChild(col_div);
+ container.appendChild(row_div);
+}
+
+function buildRepoNavbar(container, repo, page)
+{
+ const row_div = document.createElement("div");
+ row_div.classList.add("row", "mx-0");
+
+ const col_div = document.createElement("div");
+ col_div.classList.add("col", "ms-3");
+ col_div.setAttribute("id", "repo-navbar");
+
+ const nav = document.createElement("nav");
+ nav.classList.add("navbar", "navbar-expand", "navbar-dark");
+
+ const nav_container = document.createElement("div");
+ nav_container.classList.add("container-fluid", "px-0");
+
+ const nav_collapse = document.createElement("div");
+ nav_collapse.classList.add("collapse", "navbar-collapse");
+
+ const nav_nav = document.createElement("ul");
+ nav_nav.classList.add("navbar-nav");
+
+ const nav_items = ["log", "refs", "tree"];
+
+ nav_items.forEach(item =>
+ {
+ const item_li = document.createElement("li");
+ item_li.classList.add("nav-item");
+
+ const item_link = document.createElement("a");
+ item_link.classList.add("nav-link", "fs-3");
+ if(item === page) {
+ item_link.classList.add("active");
+ item_link.setAttribute("aria-current", "page");
+ }
+ item_link.setAttribute("href", `/${repo}/${item}`);
+ item_link.appendChild(document.createTextNode(item));
+
+ item_li.appendChild(item_link);
+
+ nav_nav.appendChild(item_li);
+ });
+
+ nav_collapse.appendChild(nav_nav);
+ nav_container.appendChild(nav_collapse);
+ nav.appendChild(nav_container);
+ col_div.appendChild(nav);
+ row_div.appendChild(col_div);
+ container.appendChild(row_div);
+}
+
+function buildBackSVG(container)
+{
+ const xmlns = "http://www.w3.org/2000/svg";
+
+ let svg = document.createElementNS(xmlns, "svg");
+
+ svg.setAttributeNS(null, "height", "24px");
+ svg.setAttributeNS(null, "width", "24px");
+ svg.setAttributeNS(null, "viewBox", "0 0 24 24");
+ svg.setAttributeNS(null, "fill", "#FFFFFF");
+
+ const path_one = document.createElementNS(xmlns, "path");
+ path_one.setAttributeNS(null, "d", "M0 0h24v24H0z");
+ path_one.setAttributeNS(null, "fill", "none");
+
+ const path_two = document.createElementNS(xmlns, "path");
+ path_two.setAttributeNS(null, "d", "M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z");
+
+ svg.appendChild(path_one);
+ svg.appendChild(path_two);
+ container.appendChild(svg);
+}
+
+document.addEventListener("DOMContentLoaded", async function ()
+{
+ let path = window.location.pathname;
+
+ if(path === "/") {
+ const container = document.getElementById("container");
+ await buildHeader(container, "info", "title", "about");
+ buildProjectsHeader(container);
+ buildProjects(container);
+ }
+
+ const path_valid_and_split = /\/([a-zA-Z0-9\.\-_]+)\/([a-z]+)$/;
+ if(path_valid_and_split.test(path)) {
+ path = path_valid_and_split.exec(path);
+ const repo = path[1];
+ const page = path[2];
+
+ const container = document.getElementById("container");
+
+ await buildHeader(container, `repos/${repo}`, "name", "description", true);
+ buildRepoNavbar(container, repo, page);
+ }
+});
+},{}]},["4KKVL","6Q6as"], "6Q6as", "parcelRequire0364")
+
diff --git a/dist/app.html b/dist/app.html
new file mode 100644
index 0000000..de84fae
--- /dev/null
+++ b/dist/app.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="stylesheet" href="/app.2e5e74f9.css">
+ <script type="text/javascript" src="/app.9232838b.js"></script>
+ </head>
+ <body>
+ <div id="container" class="container-fluid px-0"></div>
+ </body>
+</html> \ No newline at end of file
diff --git a/package.json b/package.json
index 5473045..26a2e08 100644
--- a/package.json
+++ b/package.json
@@ -2,18 +2,19 @@
"name": "nodejs-git-frontend",
"version": "1.0.0",
"description": "A simple git web-frontend made with nodejs",
- "main": "app.js",
+ "main": "dist/app.html",
"author": "HampusMat",
"license": "MIT",
"private": true,
"scripts": {
- "dev": "parcel src/index.html",
- "build": "parcel build src/index.html"
+ "dev": "parcel watch --no-source-maps src/app.html",
+ "build": "parcel build --no-source-maps src/app.html"
},
"dependencies": {
"bootstrap": "5.0.0-beta3",
"date-fns": "^2.21.1",
- "express": "5.0.0-alpha.8"
+ "express": "5.0.0-alpha.8",
+ "js-yaml": "^4.1.0"
},
"devDependencies": {
"@parcel/transformer-sass": "2.0.0-beta.2",
diff --git a/src/app.html b/src/app.html
new file mode 100644
index 0000000..b980ff8
--- /dev/null
+++ b/src/app.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="stylesheet" href="scss/style.scss">
+ <script type="text/javascript" src="js/app.js"></script>
+ </head>
+ <body>
+ <div id="container" class="container-fluid px-0"></div>
+ </body>
+</html> \ No newline at end of file
diff --git a/src/index.html b/src/index.html
deleted file mode 100644
index 0c607b3..0000000
--- a/src/index.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <link rel="stylesheet" href="scss/style.scss">
- <script type="text/javascript" src="js/app.js"></script>
- </head>
- <body>
- <div class="container-fluid px-0">
- <div class="row mx-0">
- <div class="col ms-4 mt-2" id="header">
- <a id="title" class="fs-1" href="/">HampusMat's Git Repository</a>
- <p id="about">The source code of various of my projects</p>
- </div>
- </div>
- <div class="row mx-0 mt-5">
- <div id="projects-header" class="col ms-5">
- <p class="fs-2">Projects</p>
- </div>
- <div id="projects-search" class="col d-flex justify-content-end">
- <form>
- <input type="search" name="q">
- <input type="submit" value="Search">
- </form>
- </div>
- </div>
- <div class="row mx-0">
- <div class="col ms-5">
- <ul id="repos"></ul>
- </div>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/src/js/app.js b/src/js/app.js
index d39d848..aa8ce9c 100644
--- a/src/js/app.js
+++ b/src/js/app.js
@@ -20,10 +20,90 @@ function request(method, source, data = null)
});
}
+async function buildHeader(container, endpoint, title_text, about_text, repo_page = false)
+{
+ const info = JSON.parse(await request("GET", `http://localhost:1337/api/v1/${endpoint}`))["data"];
-document.addEventListener("DOMContentLoaded", async function ()
+ const row_div = document.createElement("div");
+ row_div.classList.add("row", "mx-0");
+
+ const col_div = document.createElement("div");
+ col_div.classList.add("col", "ms-4", "mt-2");
+ col_div.setAttribute("id", "header");
+
+ const title = document.createElement("a");
+ title.classList.add("fs-1");
+ title.setAttribute("id", "title");
+ title.setAttribute("href", "/");
+ title.appendChild(document.createTextNode(info[title_text]));
+
+ const about = document.createElement("p");
+ about.setAttribute("id", "about");
+ about.classList.add("mb-3", "fs-4")
+ about.appendChild(document.createTextNode(info[about_text]));
+
+ col_div.appendChild(title);
+ col_div.appendChild(about);
+
+ if(repo_page) {
+ buildBackSVG(col_div);
+ }
+
+ row_div.appendChild(col_div);
+
+ container.appendChild(row_div);
+}
+
+function buildProjectsHeader(container)
+{
+ const row_div = document.createElement("div");
+ row_div.classList.add("row", "mx-0", "mt-5");
+
+ // Title column
+ const title_col_div = document.createElement("div");
+ title_col_div.classList.add("col", "ms-4");
+ title_col_div.setAttribute("id", "projects-header");
+
+ const projects_title = document.createElement("p");
+ projects_title.classList.add("fs-1");
+ projects_title.appendChild(document.createTextNode("Projects"));
+
+ title_col_div.appendChild(projects_title);
+
+ // Search column
+ const search_col_div = document.createElement("div");
+ search_col_div.classList.add("col", "d-flex", "justify-content-end");
+ search_col_div.setAttribute("id", "projects-search");
+
+ const form = document.createElement("form");
+ const search = document.createElement("input");
+ search.setAttribute("type", "search");
+ search.setAttribute("name", "q");
+ const submit = document.createElement("input");
+ submit.setAttribute("type", "submit");
+ submit.setAttribute("value", "Search");
+
+ form.appendChild(search);
+ form.appendChild(submit);
+ search_col_div.appendChild(form);
+
+ row_div.appendChild(title_col_div);
+ row_div.appendChild(search_col_div);
+
+ container.appendChild(row_div);
+}
+
+async function buildProjects(container)
{
- const list = document.getElementById("repos");
+ const row_div = document.createElement("div");
+ row_div.classList.add("row", "mx-0");
+
+ const col_div = document.createElement("div");
+ col_div.classList.add("col", "ms-4");
+
+ const list = document.createElement("ul");
+ list.setAttribute("id", "repos");
+
const repos = JSON.parse(await request("GET", "http://localhost:1337/api/v1/repos"))["data"];
const params = new URLSearchParams(window.location.search);
@@ -38,15 +118,15 @@ document.addEventListener("DOMContentLoaded", async function ()
link.setAttribute("href", key);
link.appendChild(document.createTextNode(key));
repo_title.appendChild(link);
- repo_title.classList.add("repo-title");
+ repo_title.classList.add("fs-3");
const repo_last_updated = document.createElement("span");
repo_last_updated.appendChild(document.createTextNode(`Last updated about ${value["last_updated"]} ago`));
- repo_last_updated.classList.add("repo-last-updated");
+ repo_last_updated.classList.add("repo-last-updated", "fs-4");
const repo_desc = document.createElement("span");
repo_desc.appendChild(document.createTextNode(value["description"]));
- repo_desc.classList.add("repo-desc");
+ repo_desc.classList.add("fs-4");
repo_div.appendChild(repo_title)
repo_div.appendChild(repo_last_updated)
@@ -63,4 +143,105 @@ document.addEventListener("DOMContentLoaded", async function ()
list.appendChild(li);
}
}
+
+ col_div.appendChild(list);
+ row_div.appendChild(col_div);
+ container.appendChild(row_div);
+}
+
+function buildRepoNavbar(container, repo, page)
+{
+ const row_div = document.createElement("div");
+ row_div.classList.add("row", "mx-0");
+
+ const col_div = document.createElement("div");
+ col_div.classList.add("col", "ms-3");
+ col_div.setAttribute("id", "repo-navbar");
+
+ const nav = document.createElement("nav");
+ nav.classList.add("navbar", "navbar-expand", "navbar-dark");
+
+ const nav_container = document.createElement("div");
+ nav_container.classList.add("container-fluid", "px-0");
+
+ const nav_collapse = document.createElement("div");
+ nav_collapse.classList.add("collapse", "navbar-collapse");
+
+ const nav_nav = document.createElement("ul");
+ nav_nav.classList.add("navbar-nav");
+
+ const nav_items = ["log", "refs", "tree"];
+
+ nav_items.forEach(item =>
+ {
+ const item_li = document.createElement("li");
+ item_li.classList.add("nav-item");
+
+ const item_link = document.createElement("a");
+ item_link.classList.add("nav-link", "fs-3");
+ if(item === page) {
+ item_link.classList.add("active");
+ item_link.setAttribute("aria-current", "page");
+ }
+ item_link.setAttribute("href", `/${repo}/${item}`);
+ item_link.appendChild(document.createTextNode(item));
+
+ item_li.appendChild(item_link);
+
+ nav_nav.appendChild(item_li);
+ });
+
+ nav_collapse.appendChild(nav_nav);
+ nav_container.appendChild(nav_collapse);
+ nav.appendChild(nav_container);
+ col_div.appendChild(nav);
+ row_div.appendChild(col_div);
+ container.appendChild(row_div);
+}
+
+function buildBackSVG(container)
+{
+ const xmlns = "http://www.w3.org/2000/svg";
+
+ let svg = document.createElementNS(xmlns, "svg");
+
+ svg.setAttributeNS(null, "height", "24px");
+ svg.setAttributeNS(null, "width", "24px");
+ svg.setAttributeNS(null, "viewBox", "0 0 24 24");
+ svg.setAttributeNS(null, "fill", "#FFFFFF");
+
+ const path_one = document.createElementNS(xmlns, "path");
+ path_one.setAttributeNS(null, "d", "M0 0h24v24H0z");
+ path_one.setAttributeNS(null, "fill", "none");
+
+ const path_two = document.createElementNS(xmlns, "path");
+ path_two.setAttributeNS(null, "d", "M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z");
+
+ svg.appendChild(path_one);
+ svg.appendChild(path_two);
+ container.appendChild(svg);
+}
+
+document.addEventListener("DOMContentLoaded", async function ()
+{
+ let path = window.location.pathname;
+
+ if(path === "/") {
+ const container = document.getElementById("container");
+ await buildHeader(container, "info", "title", "about");
+ buildProjectsHeader(container);
+ buildProjects(container);
+ }
+
+ const path_valid_and_split = /\/([a-zA-Z0-9\.\-_]+)\/([a-z]+)$/;
+ if(path_valid_and_split.test(path)) {
+ path = path_valid_and_split.exec(path);
+ const repo = path[1];
+ const page = path[2];
+
+ const container = document.getElementById("container");
+
+ await buildHeader(container, `repos/${repo}`, "name", "description", true);
+ buildRepoNavbar(container, repo, page);
+ }
}); \ No newline at end of file
diff --git a/src/scss/style.scss b/src/scss/style.scss
index 239194b..aa9bd02 100644
--- a/src/scss/style.scss
+++ b/src/scss/style.scss
@@ -5,17 +5,30 @@
@import "../../node_modules/bootstrap/scss/variables";
@import "../../node_modules/bootstrap/scss/mixins";
+$font-size-base: 0.75rem;
+
+$h1-font-size: $font-size-base * 2.5;
+$h2-font-size: $font-size-base * 2;
+$h3-font-size: $font-size-base * 1.75;
+$h4-font-size: $font-size-base * 1.4;
+$h5-font-size: $font-size-base * 1.125;
+$h6-font-size: $font-size-base;
+
$font-sizes: (
- 1: 2.375rem,
- 2: 2.125rem,
- 3: 2rem,
- 4: 1.5rem,
- 5: 1.3125rem,
- 6: 1rem
+ 1: $h1-font-size,
+ 2: $h2-font-size,
+ 3: $h3-font-size,
+ 4: $h4-font-size,
+ 5: $h5-font-size,
+ 6: $h6-font-size
);
+$navbar-nav-link-padding-x: 1rem;
+
@import "../../node_modules/bootstrap/scss/utilities";
@import "../../node_modules/bootstrap/scss/utilities/api";
+@import "../../node_modules/bootstrap/scss/nav";
+@import "../../node_modules/bootstrap/scss/navbar";
@import "../../node_modules/bootstrap/scss/containers";
@import "../../node_modules/bootstrap/scss/grid";
@@ -51,7 +64,6 @@ p {
#about {
font-weight: 300;
- font-size: 1.125rem;
padding-left: 1px;
}
@@ -71,17 +83,8 @@ p {
margin-top: 25px;
}
-.repo-title {
- font-size: calc(1.0625rem + 0.25vw);
-}
-
-.repo-desc {
- font-size: calc(0.875rem + 0.05vw);
-}
-
.repo-last-updated {
display: block;
- font-size: calc(0.875rem + 0.05vw);
font-weight: 300;
font-style: italic;
}
@@ -100,4 +103,19 @@ a {
&:hover {
color: colors.$primary;
}
+}
+
+@media (max-width: 1200px) {
+ .fs-1 {
+ font-size: calc(1.375rem + 0.667vw) !important;
+ }
+ .fs-2 {
+ font-size: calc(1.325rem + 1.584vw) !important;
+ }
+ .fs-3 {
+ font-size: calc(1.3rem + 0.017vw) !important;
+ }
+ .fs-4 {
+ font-size: calc(0.75rem + 0.4vw) !important;
+ }
} \ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index 507ec4d..d039429 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1651,6 +1651,11 @@ argparse@^1.0.7:
dependencies:
sprintf-js "~1.0.2"
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
arr-diff@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
@@ -3935,6 +3940,13 @@ js-yaml@^3.13.1:
argparse "^1.0.7"
esprima "^4.0.0"
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"