Dark mode ?
This commit is contained in:
parent
b9a7e7a2dd
commit
bca7ae0a8c
16
.idea/inspectionProfiles/Project_Default.xml
Normal file
16
.idea/inspectionProfiles/Project_Default.xml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="CssUnknownProperty" enabled="true" level="WARNING" enabled_by_default="true">
|
||||||
|
<option name="myCustomPropertiesEnabled" value="true" />
|
||||||
|
<option name="myIgnoreVendorSpecificProperties" value="false" />
|
||||||
|
<option name="myCustomPropertiesList">
|
||||||
|
<value>
|
||||||
|
<list size="1">
|
||||||
|
<item index="0" class="java.lang.String" itemvalue="transform" />
|
||||||
|
</list>
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
</inspection_tool>
|
||||||
|
</profile>
|
||||||
|
</component>
|
20
index.html
20
index.html
@ -5,6 +5,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
|
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
|
||||||
<link rel="stylesheet" href="stylesheet.css">
|
<link rel="stylesheet" href="stylesheet.css">
|
||||||
|
<link rel="stylesheet" href="/static/css/darkmode.css">
|
||||||
<title>*DEV* CAIU VCard Creator *DEV*</title>
|
<title>*DEV* CAIU VCard Creator *DEV*</title>
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
@ -40,6 +41,24 @@
|
|||||||
<input type="file" accept="image/png" class="nav-align" id="existingFile" name="existingFile">
|
<input type="file" accept="image/png" class="nav-align" id="existingFile" name="existingFile">
|
||||||
<button class="btn btn-primary nav-align" id="getFileDataBtn">Edit</button>
|
<button class="btn btn-primary nav-align" id="getFileDataBtn">Edit</button>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="nav-container">
|
||||||
|
<label for="theme" class="theme nav-align">
|
||||||
|
<span class="toggle-wrap">
|
||||||
|
<input id="theme" class="toggle" type="checkbox" role="switch" name="theme" value="dark">
|
||||||
|
<span class="icon">
|
||||||
|
<span class="icon-part"></span>
|
||||||
|
<span class="icon-part"></span>
|
||||||
|
<span class="icon-part"></span>
|
||||||
|
<span class="icon-part"></span>
|
||||||
|
<span class="icon-part"></span>
|
||||||
|
<span class="icon-part"></span>
|
||||||
|
<span class="icon-part"></span>
|
||||||
|
<span class="icon-part"></span>
|
||||||
|
<span class="icon-part"></span>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<main class="page contact-page">
|
<main class="page contact-page">
|
||||||
@ -104,6 +123,7 @@
|
|||||||
document.getElementById("checkBackendButton").addEventListener("click", checkBackend, false);
|
document.getElementById("checkBackendButton").addEventListener("click", checkBackend, false);
|
||||||
document.getElementById("getFileDataBtn").addEventListener("click", loadFromExistingCard, false);
|
document.getElementById("getFileDataBtn").addEventListener("click", loadFromExistingCard, false);
|
||||||
document.getElementById("formSubmit").addEventListener("click", submitForm, false);
|
document.getElementById("formSubmit").addEventListener("click", submitForm, false);
|
||||||
|
document.getElementById("theme").addEventListener("click", toggleDarkMode, false);
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
62
script.js
62
script.js
@ -37,7 +37,6 @@ function submitForm() {
|
|||||||
mode: 'cors',
|
mode: 'cors',
|
||||||
Headers: {
|
Headers: {
|
||||||
'Accept': 'image/png',
|
'Accept': 'image/png',
|
||||||
'Content-Type': 'application/json'
|
|
||||||
},
|
},
|
||||||
body: body
|
body: body
|
||||||
}).then(async response => {
|
}).then(async response => {
|
||||||
@ -46,18 +45,32 @@ function submitForm() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function loadFromExistingCard() {
|
function loadFromExistingCard() {
|
||||||
|
const data = new FormData();
|
||||||
|
data.append("card", document.getElementById("existingFile").files[0]);
|
||||||
|
|
||||||
fetchWithTimeout(backendUrl + "/backend/edit", {
|
fetchWithTimeout(backendUrl + "/backend/edit", {
|
||||||
timeout: 5000,
|
timeout: 5000,
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
mode: 'cors',
|
mode: 'cors',
|
||||||
Headers: {
|
headers: {
|
||||||
'Accept': 'application/json',
|
'Accept': 'application/json'
|
||||||
'Content-Type': 'image/png'
|
|
||||||
},
|
},
|
||||||
body: document.getElementById("existingFile").files[0]
|
body: data
|
||||||
}).then(response => response.json(res => {
|
}).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 getLocations() {
|
function getLocations() {
|
||||||
@ -161,4 +174,37 @@ function downloadImage(arrayBuffer) {
|
|||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
URL.revokeObjectURL(link.href);
|
URL.revokeObjectURL(link.href);
|
||||||
}, 100);
|
}, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleDarkMode() {
|
||||||
|
const darkMode = document.body.classList.contains("dark-theme");
|
||||||
|
if (darkMode) {
|
||||||
|
document.body.classList.remove("dark-theme");
|
||||||
|
} else {
|
||||||
|
document.body.classList.add("dark-theme");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCookie(cookieName) {
|
||||||
|
let cookieArray = document.cookie.split(";");
|
||||||
|
for (let i = 0; i < cookieArray.length; i++) {
|
||||||
|
let cookie = cookieArray[i].split("=");
|
||||||
|
if (cookie[0] === cookieName) {
|
||||||
|
return cookie[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log("Unable to get cookie ", cookieName);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function setCookie(cookieName, cookieValue) {
|
||||||
|
let cookieArray = document.cookie.split(";");
|
||||||
|
for (let i = 0; i < cookieArray.length; i++) {
|
||||||
|
let cookie = cookieArray[i].split("=");
|
||||||
|
if (cookie[0] === cookieName) {
|
||||||
|
cookie[1] = cookieValue;
|
||||||
|
document.getElementById("displayedUrl").innerHTML = "Current Backend Url: " + backendUrl;
|
||||||
|
console.log("Set backendUrl to ", backendUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
266
static/css/darkmode.css
Normal file
266
static/css/darkmode.css
Normal file
@ -0,0 +1,266 @@
|
|||||||
|
:root {
|
||||||
|
--trans-dur: 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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 hsl(0,0%,100%) inset;
|
||||||
|
box-shadow: 0.4em -0.4em 0 0.5em hsl(0,0%,100%) 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: hsl(0,0%,100%);
|
||||||
|
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: hsl(48,90%,55%);
|
||||||
|
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(--primary);
|
||||||
|
box-shadow: 0 0 0 0.125em var(--primary);
|
||||||
|
outline: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Checked */
|
||||||
|
.toggle:checked {
|
||||||
|
background-color: hsl(198,90%,15%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle:checked:before,
|
||||||
|
.toggle:checked ~ .icon {
|
||||||
|
-webkit-transform: translateX(3em);
|
||||||
|
-ms-transform: translateX(3em);
|
||||||
|
transform: translateX(3em);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle:checked:before {
|
||||||
|
background-color: hsl(198,90%,55%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle:checked ~ .icon .icon-part:nth-child(1) {
|
||||||
|
-webkit-box-shadow: 0.2em -0.2em 0 0.2em hsl(0,0%,100%) inset;
|
||||||
|
box-shadow: 0.2em -0.2em 0 0.2em hsl(0,0%,100%) 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(--primary);
|
||||||
|
box-shadow: 0 0 0 0.125em var(--primary);
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,18 @@
|
|||||||
|
:root {
|
||||||
|
--text-color: #212529;
|
||||||
|
--background-color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme {
|
||||||
|
--text-color: #ffffff;
|
||||||
|
--background-color: #212121;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
color: var(--text-color);
|
||||||
|
background-color: var(--background-color);
|
||||||
|
}
|
||||||
|
|
||||||
.nav-align {
|
.nav-align {
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
@ -41,9 +56,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.connected {
|
.connected {
|
||||||
background: #28a745;
|
background: var(--success);
|
||||||
}
|
}
|
||||||
|
|
||||||
.disconnected {
|
.disconnected {
|
||||||
background: #dc3545;
|
background: var(--danger);
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user