diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index be1b0f0..deda917 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -12,5 +12,10 @@ + + + + + \ No newline at end of file diff --git a/darkmode.css b/darkmode.css new file mode 100644 index 0000000..9bcd48c --- /dev/null +++ b/darkmode.css @@ -0,0 +1,229 @@ +/* Default */ +.theme { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-tap-highlight-color: transparent; +} +.icon, +.toggle { + z-index: 1; +} +.icon, +.icon-part { + position: absolute; +} +.icon { + display: block; + top: 0.75em; + left: 0.75em; + width: 1.5em; + height: 1.5em; + -webkit-transition: var(--trans-dur); + transition: var(--trans-dur); +} +.icon-part { + border-radius: 50%; + -webkit-box-shadow: 0.4em -0.4em 0 0.5em var(--white) inset; + box-shadow: 0.4em -0.4em 0 0.5em var(--white) inset; + top: calc(50% - 0.5em); + left: calc(50% - 0.5em); + width: 1em; + height: 1em; + -webkit-transition: opacity var(--trans-dur) ease-in-out, + -webkit-box-shadow var(--trans-dur) ease-in-out, + -webkit-transform var(--trans-dur) ease-in-out; + transition: opacity var(--trans-dur) ease-in-out, + -webkit-box-shadow var(--trans-dur) ease-in-out, + -webkit-transform var(--trans-dur) ease-in-out; + transition: box-shadow var(--trans-dur) ease-in-out, + opacity var(--trans-dur) ease-in-out, + transform var(--trans-dur) ease-in-out; + transition: box-shadow var(--trans-dur) ease-in-out, + opacity var(--trans-dur) ease-in-out, + transform var(--trans-dur) ease-in-out, + -webkit-box-shadow var(--trans-dur) ease-in-out, + -webkit-transform var(--trans-dur) ease-in-out; + -webkit-transform: scale(0.5); + -ms-transform: scale(0.5); + transform: scale(0.5); +} +.icon-part ~ .icon-part { + background-color: var(--white); + border-radius: 0.05em; + top: 50%; + left: calc(50% - 0.05em); + -webkit-transform: rotate(0deg) translateY(0.5em); + -ms-transform: rotate(0deg) translateY(0.5em); + transform: rotate(0deg) translateY(0.5em); + -webkit-transform-origin: 50% 0; + -ms-transform-origin: 50% 0; + transform-origin: 50% 0; + width: 0.1em; + height: 0.2em; +} +.icon-part:nth-child(3) { + -webkit-transform: rotate(45deg) translateY(0.45em); + -ms-transform: rotate(45deg) translateY(0.45em); + transform: rotate(45deg) translateY(0.45em); +} +.icon-part:nth-child(4) { + -webkit-transform: rotate(90deg) translateY(0.45em); + -ms-transform: rotate(90deg) translateY(0.45em); + transform: rotate(90deg) translateY(0.45em); +} +.icon-part:nth-child(5) { + -webkit-transform: rotate(135deg) translateY(0.45em); + -ms-transform: rotate(135deg) translateY(0.45em); + transform: rotate(135deg) translateY(0.45em); +} +.icon-part:nth-child(6) { + -webkit-transform: rotate(180deg) translateY(0.45em); + -ms-transform: rotate(180deg) translateY(0.45em); + transform: rotate(180deg) translateY(0.45em); +} +.icon-part:nth-child(7) { + -webkit-transform: rotate(225deg) translateY(0.45em); + -ms-transform: rotate(225deg) translateY(0.45em); + transform: rotate(225deg) translateY(0.45em); +} +.icon-part:nth-child(8) { + -webkit-transform: rotate(270deg) translateY(0.5em); + -ms-transform: rotate(270deg) translateY(0.5em); + transform: rotate(270deg) translateY(0.5em); +} +.icon-part:nth-child(9) { + -webkit-transform: rotate(315deg) translateY(0.5em); + -ms-transform: rotate(315deg) translateY(0.5em); + transform: rotate(315deg) translateY(0.5em); +} +.label, +.toggle, +.toggle-wrap { + position: relative; +} +.toggle, +.toggle:before { + display: block; +} +.toggle { + background-color: hsl(48,90%,85%); + border-radius: 25% / 50%; + -webkit-box-shadow: 0 0 0 0.125em var(--secondary); + box-shadow: 0 0 0 0.125em var(--secondary); + padding: 0.25em !important; + width: 6em; + height: 3em; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + -webkit-transition: background-color var(--trans-dur) ease-in-out, + -webkit-box-shadow 0.15s ease-in-out, + -webkit-transform var(--trans-dur) ease-in-out; + transition: background-color var(--trans-dur) ease-in-out, + -webkit-box-shadow 0.15s ease-in-out, + -webkit-transform var(--trans-dur) ease-in-out; + transition: background-color var(--trans-dur) ease-in-out, + box-shadow 0.15s ease-in-out, + transform var(--trans-dur) ease-in-out; + transition: background-color var(--trans-dur) ease-in-out, + box-shadow 0.15s ease-in-out, + transform var(--trans-dur) ease-in-out, + -webkit-box-shadow 0.15s ease-in-out, + -webkit-transform var(--trans-dur) ease-in-out; +} +.toggle:before { + background-color: var(--yellow); + border-radius: 50%; + content: ""; + width: 2.5em; + height: 2.5em; + -webkit-transition: 0.3s; + transition: 0.3s; +} +.toggle:focus { + -webkit-box-shadow: 0 0 0 0.125em var(--theme-blue); + box-shadow: 0 0 0 0.125em var(--theme-blue); + outline: transparent; +} +/* Checked */ +.toggle:checked { + background-color: var(--theme-dark-blue); +} +.toggle:checked:before, +.toggle:checked ~ .icon { + -webkit-transform: translateX(3em); + -ms-transform: translateX(3em); + transform: translateX(3em); +} +.toggle:checked:before { + background-color: var(--theme-blue); +} +.toggle:checked ~ .icon .icon-part:nth-child(1) { + -webkit-box-shadow: 0.2em -0.2em 0 0.2em var(--white) inset; + box-shadow: 0.2em -0.2em 0 0.2em var(--white) inset; + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + top: 0.25em; + left: 0.25em; +} +.toggle:checked ~ .icon .icon-part ~ .icon-part { + opacity: 0; +} +.toggle:checked ~ .icon .icon-part:nth-child(2) { + -webkit-transform: rotate(45deg) translateY(0.8em); + -ms-transform: rotate(45deg) translateY(0.8em); + transform: rotate(45deg) translateY(0.8em); +} +.toggle:checked ~ .icon .icon-part:nth-child(3) { + -webkit-transform: rotate(90deg) translateY(0.8em); + -ms-transform: rotate(90deg) translateY(0.8em); + transform: rotate(90deg) translateY(0.8em); +} +.toggle:checked ~ .icon .icon-part:nth-child(4) { + -webkit-transform: rotate(135deg) translateY(0.8em); + -ms-transform: rotate(135deg) translateY(0.8em); + transform: rotate(135deg) translateY(0.8em); +} +.toggle:checked ~ .icon .icon-part:nth-child(5) { + -webkit-transform: rotate(180deg) translateY(0.8em); + -ms-transform: rotate(180deg) translateY(0.8em); + transform: rotate(180deg) translateY(0.8em); +} +.toggle:checked ~ .icon .icon-part:nth-child(6) { + -webkit-transform: rotate(225deg) translateY(0.8em); + -ms-transform: rotate(225deg) translateY(0.8em); + transform: rotate(225deg) translateY(0.8em); +} +.toggle:checked ~ .icon .icon-part:nth-child(7) { + -webkit-transform: rotate(270deg) translateY(0.8em); + -ms-transform: rotate(270deg) translateY(0.8em); + transform: rotate(270deg) translateY(0.8em); +} +.toggle:checked ~ .icon .icon-part:nth-child(8) { + -webkit-transform: rotate(315deg) translateY(0.8em); + -ms-transform: rotate(315deg) translateY(0.8em); + transform: rotate(315deg) translateY(0.8em); +} +.toggle:checked ~ .icon .icon-part:nth-child(9) { + -webkit-transform: rotate(360deg) translateY(0.8em); + -ms-transform: rotate(360deg) translateY(0.8em); + transform: rotate(360deg) translateY(0.8em); +} +.toggle-wrap { + margin: 0 0.75em; +} +@supports selector(:focus-visible) { + .toggle:focus { + -webkit-box-shadow: 0 0 0 0.125em var(--secondary); + box-shadow: 0 0 0 0.125em var(--secondary); + } + .toggle:focus-visible { + -webkit-box-shadow: 0 0 0 0.125em var(--theme-blue); + box-shadow: 0 0 0 0.125em var(--theme-blue); + } +} \ No newline at end of file diff --git a/darkmode.js b/darkmode.js new file mode 100644 index 0000000..d3dd910 --- /dev/null +++ b/darkmode.js @@ -0,0 +1,35 @@ +document.getElementById("theme").addEventListener("click", toggleDarkMode, false) + +refreshDarkMode() + +function toggleDarkMode() { + if (getCookie("darkMode") === "on") document.cookie = "darkMode=off"; + else document.cookie = "darkMode=on"; + refreshDarkMode(); +} + +function refreshDarkMode() { + let darkMode = getCookie("darkMode") === "on"; + if (darkMode) { + document.body.classList.add("dark-theme"); + document.getElementById("theme").checked = true; + } else { + if (document.body.classList.contains("dark-theme")) { + document.body.classList.remove("dark-theme"); + } + document.getElementById("theme").checked = false; + } +} + +function getCookie(cookieName) { + let cookieArray = document.cookie.split(";"); + for (let i = 0; i < cookieArray.length; i++) { + let cookie = cookieArray[i].split("="); + if (cookie[0].trim() === cookieName) { + return cookie[1]; + } + } + console.warn("Cookie \"" + cookieName + "\" does not exist"); + document.cookie = cookieName + "="; + return ""; +} \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..a752343 Binary files /dev/null and b/favicon.ico differ diff --git a/index.html b/index.html index 9b53a25..65d19ee 100644 --- a/index.html +++ b/index.html @@ -1,9 +1,10 @@ - + + CAIU Signature Card + \ No newline at end of file diff --git a/install/index.html b/install/index.html new file mode 100644 index 0000000..691025d --- /dev/null +++ b/install/index.html @@ -0,0 +1,58 @@ + + + + + + + + Install Card + + + +
+ + + +
+ +
+
+ + + + +
+
+

Signature Card Installation Guide

+
Fig
+

P

+
+
Sec
+
+ + + + + + + \ No newline at end of file diff --git a/prod/favicon.ico b/prod/favicon.ico new file mode 100644 index 0000000..a752343 Binary files /dev/null and b/prod/favicon.ico differ diff --git a/prod/index.html b/prod/index.html new file mode 100644 index 0000000..97d3453 --- /dev/null +++ b/prod/index.html @@ -0,0 +1,119 @@ + + + + + + + + CAIU Signature Card + + + + + + +
+
+
+

Signature Card Creator

+
+ +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + +
+ + +
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/prod/logo.png b/prod/logo.png new file mode 100644 index 0000000..0930e72 Binary files /dev/null and b/prod/logo.png differ diff --git a/prod/script.js b/prod/script.js new file mode 100644 index 0000000..576c9c1 --- /dev/null +++ b/prod/script.js @@ -0,0 +1,160 @@ +function handleCheckbox() { + const extensionInput = document.getElementById("extensionInput"); + const directLineInput = document.getElementById("directLineInput"); + if (document.getElementById("directLineCheckbox").checked) { + extensionInput.style.display = "none"; + directLineInput.style.display = "block"; + document.getElementById("extension").value = ""; + } else { + extensionInput.style.display = "block"; + directLineInput.style.display = "none"; + document.getElementById("directLine").value = ""; + } +} + +let backendUrl = "https://vcard.caiu.org/backend" +let locations = JSON.parse("{}"); + +function loadLocations() { + let locationsList = document.getElementById("location"); + + fetchWithTimeout(backendUrl + "/data/locations", { + timeout: 5000, + method: 'GET', + mode: 'cors', + headers: { + 'Accept': 'application/json' + } + }).then(response => { + response.text().then(text => { + locations = JSON.parse(text); + locationsList.innerText = ""; + for (let i = 0; i < locations.length; i++) { + locationsList.options[locationsList.options.length] = new Option(locations[i].name, locations[i].id); + } + }) + }); +} + +function submitForm() { + let body = + "{" + + "\"name\":\"" + document.getElementById("full_name").value + "\"," + + "\"title\":\"" + document.getElementById("title").value + "\"," + + "\"email\":\"" + document.getElementById("email").value + "\"," + + "\"locationId\":\"" + document.getElementById("location").value + "\"," + + "\"extension\":\"" + document.getElementById("extension").value + "\"," + + "\"directNumber\":\"" + document.getElementById("directLine").value + "\"," + + "\"cellNumber\":\"" + document.getElementById("cellNumber").value + "\"," + + "\"size\":" + document.querySelector('input[name = outlookVer]:checked').value + + "}"; + + fetchWithTimeout(backendUrl + "/generate", { + timeout: 5000, + method: 'POST', + mode: 'cors', + Headers: { + 'Accept': 'image/png', + }, + body: body + }).then(async response => { + downloadImage(await response.arrayBuffer()); + }); + + document.getElementById("full_name").value = ""; + document.getElementById("title").value = ""; + document.getElementById("email").value = ""; + document.getElementById("extension").value = ""; + document.getElementById("directLine").value = ""; + document.getElementById("cellNumber").value = ""; +} + +function downloadImage(arrayBuffer) { + const blob = new Blob([arrayBuffer], { type: "image/png" }); + const cardElement = document.getElementById("vcard"); + const imgElement = document.getElementById("cardImg"); + + let urlCreator = window.URL || window.webkitURL; + let imageUrl = urlCreator.createObjectURL(blob); + + cardElement.href = imageUrl; + cardElement.style.display = 'unset'; + imgElement.src = imageUrl; + cardElement.download = "card.png"; + cardElement.click(); +} + +function loadFromExistingCard() { + const data = new FormData(); + data.append("card", document.getElementById("existingFile").files[0]); + + fetchWithTimeout(backendUrl + "/edit", { + timeout: 5000, + method: 'POST', + mode: 'cors', + headers: { + 'Accept': 'application/json' + }, + body: data + }).then(response => response.json()).then(json => { + document.getElementById("full_name").value = json.Name; + document.getElementById("title").value = json.Title; + document.getElementById("email").value = json.Email; + document.getElementById("location").value = json.Location; + if (json.Extension === "") { + let directLineCheckbox = document.getElementById("directLineCheckbox"); + if (directLineCheckbox.value === "on") { + document.getElementById("directLine").value = json.DirectNumber; + } + } else { + document.getElementById("extension").value = json.Extension; + } + document.getElementById("cellNumber").value = json.CellNumber; + }); +} + +function toggleDarkMode() { + if (getCookie("darkMode") === "on") document.cookie = "darkMode=off"; + else document.cookie = "darkMode=on"; + refreshDarkMode(); +} + +function refreshDarkMode() { + let darkMode = getCookie("darkMode") === "on"; + if (darkMode) { + document.body.classList.add("dark-theme"); + document.getElementById("theme").checked = true; + } else { + if (document.body.classList.contains("dark-theme")) { + document.body.classList.remove("dark-theme"); + } + document.getElementById("theme").checked = false; + } +} + +async function fetchWithTimeout(resource, options = {}) { + const { timeout = 8000 } = options; + const controller = new AbortController(); + const id = setTimeout(() => controller.abort(), timeout); + + const response = await fetch(resource, { + ...options, + signal: controller.signal + }); + clearTimeout(id); + + return response; +} + +function getCookie(cookieName) { + let cookieArray = document.cookie.split(";"); + for (let i = 0; i < cookieArray.length; i++) { + let cookie = cookieArray[i].split("="); + if (cookie[0].trim() === cookieName) { + return cookie[1]; + } + } + console.warn("Cookie \"" + cookieName + "\" does not exist"); + document.cookie = cookieName + "="; + return ""; +} \ No newline at end of file diff --git a/prod/stylesheet.css b/prod/stylesheet.css new file mode 100644 index 0000000..4f544e9 --- /dev/null +++ b/prod/stylesheet.css @@ -0,0 +1,538 @@ +:root { + --blue: #007bff; + --indigo: #6610f2; + --purple: #6f42c1; + --pink: #e83e8c; + --red: #dc3545; + --orange: #fd7e14; + --yellow: #ffc107; + --green: #28a745; + --teal: #20c997; + --cyan: #17a2b8; + --white: #fff; + --gray: #6c757d; + --gray-dark: #343a40; + --secondary: #6c757d; + --success: #28a745; + --info: #17a2b8; + --warning: #ffc107; + --danger: #dc3545; + --light: #f8f9fa; + --dark: #343a40; + + --theme-blue: #007bff; + --theme-dark-blue: hsl(198,90%,15%); + + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; + --font-family-monospace: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace; + --text-color: #212529; + --background-color: #ffffff; + --secondary-color: #f8f9fa !important; + --secondary-accent: #495057; + --trans-dur: 0.3s; +} +* { + -webkit-transition: background-color ease .5s, text-color ease .5s, color ease .5s; + -moz-transition: background-color ease .5s, text-color ease .5s, color ease .5s; + -ms-transition: background-color ease .5s, text-color ease .5s, color ease .5s; + -o-transition: background-color ease .5s, text-color ease .5s, color ease .5s; + transition: background-color ease .5s, text-color ease .5s, color ease .5s; +} +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; + font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + text-align: left; + color: var(--text-color); + background-color: var(--background-color); +} + +*, ::after, ::before { + box-sizing: border-box; +} + +article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +button, input, optgroup, select, textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, input { + overflow: visible; +} + +button, select { + text-transform: none; +} + +label { + display: inline-block; + margin-bottom: .5rem; +} + +input, textarea { + background-color: var(--secondary-color); +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: .5rem; +} +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { + margin-bottom: .5rem; + font-family: inherit; + font-weight: 500; + line-height: 1.2; + color: inherit; +} +.h1, h1 { + font-size: 2.5rem; +} +.h2, h2 { + font-size: 2rem; +} + +.btn { + display: inline-block; + font-weight: 400; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border: 1px solid transparent; + padding: .375rem .75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: .25rem; + transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; +} +.btn-primary { + color: #fff; + background-color: var(--theme-blue); + border-color: var(--theme-blue); +} +.btn:not(:disabled):not(.disabled) { + cursor: pointer; +} + +select.form-control:not([size]):not([multiple]) { + height: calc(2.25rem + 2px); +} + +input[type="checkbox"], input[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +[type="reset"], [type="submit"], button, html [type="button"] { + -webkit-appearance: button; +} + +/*--------------------------------------*/ + +.dark-theme { + --text-color: #ffffff; + --background-color: #28272d; + --secondary-color: #1f1e23 !important; + --secondary-accent: #181818; +} + +.text-center { + text-align: center !important; +} + +.mt-5, .my-5 { + margin-top: 1rem !important; +} + +.mb-5 { + margin-bottom: 1rem !important; +} + +.form-group { + margin-bottom: 1rem; +} +.form-control { + display: block; + width: 100%; + padding: .375rem .75rem; + font-size: 1rem; + line-height: 1.5; + color: var(--text-color); + background-color: var(--secondary-color); + background-clip: padding-box; + border: 1px solid #ced4da; + border-radius: .25rem; + + -webkit-transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out,background-color ease .5s, text-color ease .5s, color ease .5s; + -moz-transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out,background-color ease .5s, text-color ease .5s, color ease .5s; + -ms-transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out,background-color ease .5s, text-color ease .5s, color ease .5s; + -o-transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out,background-color ease .5s, text-color ease .5s, color ease .5s; + transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out,background-color ease .5s, text-color ease .5s, color ease .5s; +} + +.navbar { + background-color: var(--secondary-color); + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + padding: .5rem 1rem; +} + +.navbar-brand{ + display:inline-block; + padding-top:.3125rem; + padding-bottom:.3125rem; + margin-right:1rem; + font-size:1.25rem; + line-height:inherit; + white-space:nowrap +} + +.navbar-brand:focus, .navbar-brand:hover { + text-decoration:none; +} + +.nav-align { + width: fit-content; + vertical-align: middle; + padding-left: 20px; + padding-right: 20px; + float: right; + margin: 0; +} + +.nav-container { + display: inline-flex; + position: relative; + float: right; + align-items: center; +} + +.card { + margin: auto; + width: 24em; +} + +.circle { + width: 40px; + height: 40px; + border-radius: 50%; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + margin-right: 15px; + padding: 0 !important; +} + +.loading { + width: 40px; + height: 40px; + border: 5px solid var(--white ); + border-top: 5px solid var(--theme-blue); + border-radius: 50%; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + animation: spin 1.25s ease-in-out infinite; +} +@keyframes spin { + 0% { transform: rotate(0deg) } + 100% { transform: rotate(360deg) } +} + +.connected { + background: var(--success); +} +.disconnected { + background: var(--danger); +} + +/*--------------------------------------*/ + +.container { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 576px) { + .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container { + max-width: 1140px; + } +} + +/*---------------------------------------------*/ + +/* Default */ +.theme { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-tap-highlight-color: transparent; +} +.icon, +.toggle { + z-index: 1; +} +.icon, +.icon-part { + position: absolute; +} +.icon { + display: block; + top: 0.75em; + left: 0.75em; + width: 1.5em; + height: 1.5em; + -webkit-transition: var(--trans-dur); + transition: var(--trans-dur); +} +.icon-part { + border-radius: 50%; + -webkit-box-shadow: 0.4em -0.4em 0 0.5em var(--white) inset; + box-shadow: 0.4em -0.4em 0 0.5em var(--white) inset; + top: calc(50% - 0.5em); + left: calc(50% - 0.5em); + width: 1em; + height: 1em; + -webkit-transition: opacity var(--trans-dur) ease-in-out, + -webkit-box-shadow var(--trans-dur) ease-in-out, + -webkit-transform var(--trans-dur) ease-in-out; + transition: opacity var(--trans-dur) ease-in-out, + -webkit-box-shadow var(--trans-dur) ease-in-out, + -webkit-transform var(--trans-dur) ease-in-out; + transition: box-shadow var(--trans-dur) ease-in-out, + opacity var(--trans-dur) ease-in-out, + transform var(--trans-dur) ease-in-out; + transition: box-shadow var(--trans-dur) ease-in-out, + opacity var(--trans-dur) ease-in-out, + transform var(--trans-dur) ease-in-out, + -webkit-box-shadow var(--trans-dur) ease-in-out, + -webkit-transform var(--trans-dur) ease-in-out; + -webkit-transform: scale(0.5); + -ms-transform: scale(0.5); + transform: scale(0.5); +} +.icon-part ~ .icon-part { + background-color: var(--white); + border-radius: 0.05em; + top: 50%; + left: calc(50% - 0.05em); + -webkit-transform: rotate(0deg) translateY(0.5em); + -ms-transform: rotate(0deg) translateY(0.5em); + transform: rotate(0deg) translateY(0.5em); + -webkit-transform-origin: 50% 0; + -ms-transform-origin: 50% 0; + transform-origin: 50% 0; + width: 0.1em; + height: 0.2em; +} +.icon-part:nth-child(3) { + -webkit-transform: rotate(45deg) translateY(0.45em); + -ms-transform: rotate(45deg) translateY(0.45em); + transform: rotate(45deg) translateY(0.45em); +} +.icon-part:nth-child(4) { + -webkit-transform: rotate(90deg) translateY(0.45em); + -ms-transform: rotate(90deg) translateY(0.45em); + transform: rotate(90deg) translateY(0.45em); +} +.icon-part:nth-child(5) { + -webkit-transform: rotate(135deg) translateY(0.45em); + -ms-transform: rotate(135deg) translateY(0.45em); + transform: rotate(135deg) translateY(0.45em); +} +.icon-part:nth-child(6) { + -webkit-transform: rotate(180deg) translateY(0.45em); + -ms-transform: rotate(180deg) translateY(0.45em); + transform: rotate(180deg) translateY(0.45em); +} +.icon-part:nth-child(7) { + -webkit-transform: rotate(225deg) translateY(0.45em); + -ms-transform: rotate(225deg) translateY(0.45em); + transform: rotate(225deg) translateY(0.45em); +} +.icon-part:nth-child(8) { + -webkit-transform: rotate(270deg) translateY(0.5em); + -ms-transform: rotate(270deg) translateY(0.5em); + transform: rotate(270deg) translateY(0.5em); +} +.icon-part:nth-child(9) { + -webkit-transform: rotate(315deg) translateY(0.5em); + -ms-transform: rotate(315deg) translateY(0.5em); + transform: rotate(315deg) translateY(0.5em); +} +.label, +.toggle, +.toggle-wrap { + position: relative; +} +.toggle, +.toggle:before { + display: block; +} +.toggle { + background-color: hsl(48,90%,85%); + border-radius: 25% / 50%; + -webkit-box-shadow: 0 0 0 0.125em var(--secondary); + box-shadow: 0 0 0 0.125em var(--secondary); + padding: 0.25em !important; + width: 6em; + height: 3em; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + -webkit-transition: background-color var(--trans-dur) ease-in-out, + -webkit-box-shadow 0.15s ease-in-out, + -webkit-transform var(--trans-dur) ease-in-out; + transition: background-color var(--trans-dur) ease-in-out, + -webkit-box-shadow 0.15s ease-in-out, + -webkit-transform var(--trans-dur) ease-in-out; + transition: background-color var(--trans-dur) ease-in-out, + box-shadow 0.15s ease-in-out, + transform var(--trans-dur) ease-in-out; + transition: background-color var(--trans-dur) ease-in-out, + box-shadow 0.15s ease-in-out, + transform var(--trans-dur) ease-in-out, + -webkit-box-shadow 0.15s ease-in-out, + -webkit-transform var(--trans-dur) ease-in-out; +} +.toggle:before { + background-color: var(--yellow); + border-radius: 50%; + content: ""; + width: 2.5em; + height: 2.5em; + -webkit-transition: 0.3s; + transition: 0.3s; +} +.toggle:focus { + -webkit-box-shadow: 0 0 0 0.125em var(--theme-blue); + box-shadow: 0 0 0 0.125em var(--theme-blue); + outline: transparent; +} +/* Checked */ +.toggle:checked { + background-color: var(--theme-dark-blue); +} +.toggle:checked:before, +.toggle:checked ~ .icon { + -webkit-transform: translateX(3em); + -ms-transform: translateX(3em); + transform: translateX(3em); +} +.toggle:checked:before { + background-color: var(--theme-blue); +} +.toggle:checked ~ .icon .icon-part:nth-child(1) { + -webkit-box-shadow: 0.2em -0.2em 0 0.2em var(--white) inset; + box-shadow: 0.2em -0.2em 0 0.2em var(--white) inset; + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + top: 0.25em; + left: 0.25em; +} +.toggle:checked ~ .icon .icon-part ~ .icon-part { + opacity: 0; +} +.toggle:checked ~ .icon .icon-part:nth-child(2) { + -webkit-transform: rotate(45deg) translateY(0.8em); + -ms-transform: rotate(45deg) translateY(0.8em); + transform: rotate(45deg) translateY(0.8em); +} +.toggle:checked ~ .icon .icon-part:nth-child(3) { + -webkit-transform: rotate(90deg) translateY(0.8em); + -ms-transform: rotate(90deg) translateY(0.8em); + transform: rotate(90deg) translateY(0.8em); +} +.toggle:checked ~ .icon .icon-part:nth-child(4) { + -webkit-transform: rotate(135deg) translateY(0.8em); + -ms-transform: rotate(135deg) translateY(0.8em); + transform: rotate(135deg) translateY(0.8em); +} +.toggle:checked ~ .icon .icon-part:nth-child(5) { + -webkit-transform: rotate(180deg) translateY(0.8em); + -ms-transform: rotate(180deg) translateY(0.8em); + transform: rotate(180deg) translateY(0.8em); +} +.toggle:checked ~ .icon .icon-part:nth-child(6) { + -webkit-transform: rotate(225deg) translateY(0.8em); + -ms-transform: rotate(225deg) translateY(0.8em); + transform: rotate(225deg) translateY(0.8em); +} +.toggle:checked ~ .icon .icon-part:nth-child(7) { + -webkit-transform: rotate(270deg) translateY(0.8em); + -ms-transform: rotate(270deg) translateY(0.8em); + transform: rotate(270deg) translateY(0.8em); +} +.toggle:checked ~ .icon .icon-part:nth-child(8) { + -webkit-transform: rotate(315deg) translateY(0.8em); + -ms-transform: rotate(315deg) translateY(0.8em); + transform: rotate(315deg) translateY(0.8em); +} +.toggle:checked ~ .icon .icon-part:nth-child(9) { + -webkit-transform: rotate(360deg) translateY(0.8em); + -ms-transform: rotate(360deg) translateY(0.8em); + transform: rotate(360deg) translateY(0.8em); +} +.toggle-wrap { + margin: 0 0.75em; +} +@supports selector(:focus-visible) { + .toggle:focus { + -webkit-box-shadow: 0 0 0 0.125em var(--secondary); + box-shadow: 0 0 0 0.125em var(--secondary); + } + .toggle:focus-visible { + -webkit-box-shadow: 0 0 0 0.125em var(--theme-blue); + box-shadow: 0 0 0 0.125em var(--theme-blue); + } +} \ No newline at end of file diff --git a/script.js b/script.js index 3ccff6e..5004795 100644 --- a/script.js +++ b/script.js @@ -77,6 +77,14 @@ function downloadImage(arrayBuffer) { cardElement.click(); } +function getCardToEdit() { + let uploadDiv = document.getElementById("uploadDiv") + let fadeDiv = document.getElementById("fade") + uploadDiv.classList.remove("hidden") + fadeDiv.classList.remove("hidden") + +} + function loadFromExistingCard() { const data = new FormData(); data.append("card", document.getElementById("existingFile").files[0]); @@ -106,25 +114,6 @@ function loadFromExistingCard() { }); } -function toggleDarkMode() { - if (getCookie("darkMode") === "on") document.cookie = "darkMode=off"; - else document.cookie = "darkMode=on"; - refreshDarkMode(); -} - -function refreshDarkMode() { - let darkMode = getCookie("darkMode") === "on"; - if (darkMode) { - document.body.classList.add("dark-theme"); - document.getElementById("theme").checked = true; - } else { - if (document.body.classList.contains("dark-theme")) { - document.body.classList.remove("dark-theme"); - } - document.getElementById("theme").checked = false; - } -} - async function fetchWithTimeout(resource, options = {}) { const { timeout = 8000 } = options; const controller = new AbortController(); @@ -137,17 +126,4 @@ async function fetchWithTimeout(resource, options = {}) { clearTimeout(id); return response; -} - -function getCookie(cookieName) { - let cookieArray = document.cookie.split(";"); - for (let i = 0; i < cookieArray.length; i++) { - let cookie = cookieArray[i].split("="); - if (cookie[0].trim() === cookieName) { - return cookie[1]; - } - } - console.warn("Cookie \"" + cookieName + "\" does not exist"); - document.cookie = cookieName + "="; - return ""; } \ No newline at end of file diff --git a/stylesheet.css b/stylesheet.css index a1d3d05..a1dc5f9 100644 --- a/stylesheet.css +++ b/stylesheet.css @@ -21,7 +21,9 @@ --dark: #343a40; --theme-blue: #007bff; + --theme-blue-hover: #0064d9; --theme-dark-blue: hsl(198,90%,15%); + --theme-active: #002872; --breakpoint-xs: 0; --breakpoint-sm: 576px; @@ -31,11 +33,17 @@ --font-family-sans-serif: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; --font-family-monospace: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace; --text-color: #212529; + --text-color-neg: #ffffff; --background-color: #ffffff; --secondary-color: #f8f9fa !important; --secondary-accent: #495057; --trans-dur: 0.3s; } + +*, ::after, ::before { + box-sizing: inherit; +} + html { font-family: sans-serif; line-height: 1.15; @@ -51,27 +59,49 @@ body { color: var(--text-color); background-color: var(--background-color); } - -*, ::after, ::before { - box-sizing: border-box; +header { + display: flex; + justify-content: space-between; + align-items: center; + background-color: var(--secondary-color); } -article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section { - display: block; +footer { + text-align: center; + font-size: 12px; } -button, input, optgroup, select, textarea { +button { margin: 0; font-family: inherit; font-size: inherit; line-height: inherit; -} - -button, input { overflow: visible; + text-transform: none; } -button, select { +input { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; + overflow: visible; + background-color: var(--secondary-color); +} + +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; + background-color: var(--secondary-color); +} + +select { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; text-transform: none; } @@ -80,10 +110,6 @@ label { margin-bottom: .5rem; } -input, textarea { - background-color: var(--secondary-color); -} - h1, h2, h3, h4, h5, h6 { margin-top: 0; margin-bottom: .5rem; @@ -145,6 +171,7 @@ input[type="checkbox"], input[type="radio"] { .dark-theme { --text-color: #ffffff; + --text-color-neg: #212529; --background-color: #28272d; --secondary-color: #1f1e23 !important; --secondary-accent: #181818; @@ -154,11 +181,11 @@ input[type="checkbox"], input[type="radio"] { text-align: center !important; } -.mt-5, .my-5 { +.mt { margin-top: 1rem !important; } -.mb-5 { +.mb { margin-bottom: 1rem !important; } @@ -179,25 +206,53 @@ input[type="checkbox"], input[type="radio"] { transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out; } +.logo { + display: inline-block; + padding-top: 0.25em; + padding-bottom: 0.25em; + padding-left: 0.5em; +} + .navbar { - background-color: var(--secondary-color); - position: relative; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; - padding: .5rem 1rem; + margin-top: -5px; +} +.navbar ul { + list-style-type: none; + margin: 0; + padding: 0; + overflow: hidden; + background-color: var(--theme-blue); +} +.navbar li { + float: left; +} +.navbar li:first-child { + margin-left: 10em; +} +.navbar li:last-child { + margin-right: 10em; +} +.navbar li a { + display: block; + color: var(--white); + text-align: center; + padding: 1.5em; + text-decoration: none; +} +.navbar li a:hover:not(.active) { + background-color: var(--theme-blue-hover); +} +.active { + background-color: var(--theme-active); +} +.float-left { + float:left !important; +} +.float-right { + float: right !important; } .navbar-brand{ - display:inline-block; padding-top:.3125rem; padding-bottom:.3125rem; margin-right:1rem; @@ -210,57 +265,46 @@ input[type="checkbox"], input[type="radio"] { text-decoration:none; } -.nav-align { - width: fit-content; - vertical-align: middle; - padding-left: 20px; - padding-right: 20px; - float: right; - margin: 0; -} - -.nav-container { - display: inline-flex; - position: relative; - float: right; - align-items: center; -} - .card { margin: auto; width: 24em; } -.circle { - width: 40px; - height: 40px; - border-radius: 50%; - -moz-border-radius: 50%; - -webkit-border-radius: 50%; - margin-right: 15px; - padding: 0 !important; +.fade { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: white; + opacity: 50%; } -.loading { - width: 40px; - height: 40px; - border: 5px solid var(--white ); - border-top: 5px solid var(--theme-blue); - border-radius: 50%; - -moz-border-radius: 50%; - -webkit-border-radius: 50%; - animation: spin 1.25s ease-in-out infinite; -} -@keyframes spin { - 0% { transform: rotate(0deg) } - 100% { transform: rotate(360deg) } +.upload { + opacity: 100% !important; + border-radius: .5rem; + padding: 1em; + border: solid 2px var(--theme-dark-blue); + background-color: var(--background-color); + position: absolute; + width: 16em; + height: 9em; + left: 50%; + top: 14em; + margin-left: -9em; } -.connected { - background: var(--success); +.hidden { + display: none; } -.disconnected { - background: var(--danger); + +.dotted { + display: flex; + border: dotted 2px var(--theme-dark-blue); + width: 100%; + height: 100%; + text-align: center; + align-items: center; } /*--------------------------------------*/ @@ -292,235 +336,3 @@ input[type="checkbox"], input[type="radio"] { max-width: 1140px; } } - -/*---------------------------------------------*/ - -/* Default */ -.theme { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-tap-highlight-color: transparent; -} -.icon, -.toggle { - z-index: 1; -} -.icon, -.icon-part { - position: absolute; -} -.icon { - display: block; - top: 0.75em; - left: 0.75em; - width: 1.5em; - height: 1.5em; - -webkit-transition: var(--trans-dur); - transition: var(--trans-dur); -} -.icon-part { - border-radius: 50%; - -webkit-box-shadow: 0.4em -0.4em 0 0.5em var(--white) inset; - box-shadow: 0.4em -0.4em 0 0.5em var(--white) inset; - top: calc(50% - 0.5em); - left: calc(50% - 0.5em); - width: 1em; - height: 1em; - -webkit-transition: opacity var(--trans-dur) ease-in-out, - -webkit-box-shadow var(--trans-dur) ease-in-out, - -webkit-transform var(--trans-dur) ease-in-out; - transition: opacity var(--trans-dur) ease-in-out, - -webkit-box-shadow var(--trans-dur) ease-in-out, - -webkit-transform var(--trans-dur) ease-in-out; - transition: box-shadow var(--trans-dur) ease-in-out, - opacity var(--trans-dur) ease-in-out, - transform var(--trans-dur) ease-in-out; - transition: box-shadow var(--trans-dur) ease-in-out, - opacity var(--trans-dur) ease-in-out, - transform var(--trans-dur) ease-in-out, - -webkit-box-shadow var(--trans-dur) ease-in-out, - -webkit-transform var(--trans-dur) ease-in-out; - -webkit-transform: scale(0.5); - -ms-transform: scale(0.5); - transform: scale(0.5); -} -.icon-part ~ .icon-part { - background-color: var(--white); - border-radius: 0.05em; - top: 50%; - left: calc(50% - 0.05em); - -webkit-transform: rotate(0deg) translateY(0.5em); - -ms-transform: rotate(0deg) translateY(0.5em); - transform: rotate(0deg) translateY(0.5em); - -webkit-transform-origin: 50% 0; - -ms-transform-origin: 50% 0; - transform-origin: 50% 0; - width: 0.1em; - height: 0.2em; -} -.icon-part:nth-child(3) { - -webkit-transform: rotate(45deg) translateY(0.45em); - -ms-transform: rotate(45deg) translateY(0.45em); - transform: rotate(45deg) translateY(0.45em); -} -.icon-part:nth-child(4) { - -webkit-transform: rotate(90deg) translateY(0.45em); - -ms-transform: rotate(90deg) translateY(0.45em); - transform: rotate(90deg) translateY(0.45em); -} -.icon-part:nth-child(5) { - -webkit-transform: rotate(135deg) translateY(0.45em); - -ms-transform: rotate(135deg) translateY(0.45em); - transform: rotate(135deg) translateY(0.45em); -} -.icon-part:nth-child(6) { - -webkit-transform: rotate(180deg) translateY(0.45em); - -ms-transform: rotate(180deg) translateY(0.45em); - transform: rotate(180deg) translateY(0.45em); -} -.icon-part:nth-child(7) { - -webkit-transform: rotate(225deg) translateY(0.45em); - -ms-transform: rotate(225deg) translateY(0.45em); - transform: rotate(225deg) translateY(0.45em); -} -.icon-part:nth-child(8) { - -webkit-transform: rotate(270deg) translateY(0.5em); - -ms-transform: rotate(270deg) translateY(0.5em); - transform: rotate(270deg) translateY(0.5em); -} -.icon-part:nth-child(9) { - -webkit-transform: rotate(315deg) translateY(0.5em); - -ms-transform: rotate(315deg) translateY(0.5em); - transform: rotate(315deg) translateY(0.5em); -} -.label, -.toggle, -.toggle-wrap { - position: relative; -} -.toggle, -.toggle:before { - display: block; -} -.toggle { - background-color: hsl(48,90%,85%); - border-radius: 25% / 50%; - -webkit-box-shadow: 0 0 0 0.125em var(--secondary); - box-shadow: 0 0 0 0.125em var(--secondary); - padding: 0.25em !important; - width: 6em; - height: 3em; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - -webkit-transition: background-color var(--trans-dur) ease-in-out, - -webkit-box-shadow 0.15s ease-in-out, - -webkit-transform var(--trans-dur) ease-in-out; - transition: background-color var(--trans-dur) ease-in-out, - -webkit-box-shadow 0.15s ease-in-out, - -webkit-transform var(--trans-dur) ease-in-out; - transition: background-color var(--trans-dur) ease-in-out, - box-shadow 0.15s ease-in-out, - transform var(--trans-dur) ease-in-out; - transition: background-color var(--trans-dur) ease-in-out, - box-shadow 0.15s ease-in-out, - transform var(--trans-dur) ease-in-out, - -webkit-box-shadow 0.15s ease-in-out, - -webkit-transform var(--trans-dur) ease-in-out; -} -.toggle:before { - background-color: var(--yellow); - border-radius: 50%; - content: ""; - width: 2.5em; - height: 2.5em; - -webkit-transition: 0.3s; - transition: 0.3s; -} -.toggle:focus { - -webkit-box-shadow: 0 0 0 0.125em var(--theme-blue); - box-shadow: 0 0 0 0.125em var(--theme-blue); - outline: transparent; -} -/* Checked */ -.toggle:checked { - background-color: var(--theme-dark-blue); -} -.toggle:checked:before, -.toggle:checked ~ .icon { - -webkit-transform: translateX(3em); - -ms-transform: translateX(3em); - transform: translateX(3em); -} -.toggle:checked:before { - background-color: var(--theme-blue); -} -.toggle:checked ~ .icon .icon-part:nth-child(1) { - -webkit-box-shadow: 0.2em -0.2em 0 0.2em var(--white) inset; - box-shadow: 0.2em -0.2em 0 0.2em var(--white) inset; - -webkit-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - top: 0.25em; - left: 0.25em; -} -.toggle:checked ~ .icon .icon-part ~ .icon-part { - opacity: 0; -} -.toggle:checked ~ .icon .icon-part:nth-child(2) { - -webkit-transform: rotate(45deg) translateY(0.8em); - -ms-transform: rotate(45deg) translateY(0.8em); - transform: rotate(45deg) translateY(0.8em); -} -.toggle:checked ~ .icon .icon-part:nth-child(3) { - -webkit-transform: rotate(90deg) translateY(0.8em); - -ms-transform: rotate(90deg) translateY(0.8em); - transform: rotate(90deg) translateY(0.8em); -} -.toggle:checked ~ .icon .icon-part:nth-child(4) { - -webkit-transform: rotate(135deg) translateY(0.8em); - -ms-transform: rotate(135deg) translateY(0.8em); - transform: rotate(135deg) translateY(0.8em); -} -.toggle:checked ~ .icon .icon-part:nth-child(5) { - -webkit-transform: rotate(180deg) translateY(0.8em); - -ms-transform: rotate(180deg) translateY(0.8em); - transform: rotate(180deg) translateY(0.8em); -} -.toggle:checked ~ .icon .icon-part:nth-child(6) { - -webkit-transform: rotate(225deg) translateY(0.8em); - -ms-transform: rotate(225deg) translateY(0.8em); - transform: rotate(225deg) translateY(0.8em); -} -.toggle:checked ~ .icon .icon-part:nth-child(7) { - -webkit-transform: rotate(270deg) translateY(0.8em); - -ms-transform: rotate(270deg) translateY(0.8em); - transform: rotate(270deg) translateY(0.8em); -} -.toggle:checked ~ .icon .icon-part:nth-child(8) { - -webkit-transform: rotate(315deg) translateY(0.8em); - -ms-transform: rotate(315deg) translateY(0.8em); - transform: rotate(315deg) translateY(0.8em); -} -.toggle:checked ~ .icon .icon-part:nth-child(9) { - -webkit-transform: rotate(360deg) translateY(0.8em); - -ms-transform: rotate(360deg) translateY(0.8em); - transform: rotate(360deg) translateY(0.8em); -} -.toggle-wrap { - margin: 0 0.75em; -} -@supports selector(:focus-visible) { - .toggle:focus { - -webkit-box-shadow: 0 0 0 0.125em var(--secondary); - box-shadow: 0 0 0 0.125em var(--secondary); - } - .toggle:focus-visible { - -webkit-box-shadow: 0 0 0 0.125em var(--theme-blue); - box-shadow: 0 0 0 0.125em var(--theme-blue); - } -} \ No newline at end of file