align-items: center;
}
+.topbar .navbar {
+ padding: 0;
+ background: transparent !important;
+}
+
+.topbar .navbar-collapse {
+ justify-content: flex-end;
+ transition: height 0.2s ease;
+}
+
+.topbar .navbar-toggler {
+ border: none;
+}
+
+.topbar .navbar-toggler:focus {
+ box-shadow: none;
+}
+
.logo {
display: flex;
align-items: center;
font-style: italic;
}
-/* Griglia tile */
+/* ================================
+ Griglia tile
+ ================================ */
.tiles {
display: grid;
gap: 16px;
padding: 14px;
box-shadow: 0 3px 6px var(--shadow-soft);
transition: transform 0.1s ease, box-shadow 0.1s ease;
+ will-change: transform;
color: var(--text-dark);
+ --icon-color: var(--accent);
}
.tile:hover {
transform: translateY(-2px);
box-shadow: 0 4px 10px var(--shadow-strong);
border-color: var(--accent-hover);
+ --icon-color: var(--accent-hover);
}
.tile h3 {
/* Icone tile */
.tile-icon {
font-size: 28px;
- color: var(--accent);
margin-bottom: 4px;
+ color: var(--icon-color);
+}
+
+.tile-icon i {
+ color: inherit;
}
/* ================================
padding: 6px 14px;
font-size: 0.95rem;
line-height: 1;
+ vertical-align: middle;
+ --icon-color: currentColor;
+ transition: all 0.2s ease;
}
.btn-primary {
filter: brightness(0.9);
}
-.btn-outline-primary {
- color: var(--accent);
- border-color: var(--accent);
- background-color: transparent;
-}
-
-.btn-outline-primary:hover,
-.btn-outline-primary:focus {
- color: #fff;
- background-color: var(--accent);
- border-color: var(--accent);
-}
.btn-primary.btn-login {
width: 100%;
filter: none;
}
-.btn .icon {
- color: currentColor;
+.btn-outline-primary {
+ color: var(--accent);
+ border-color: var(--accent);
+ background-color: transparent;
}
-.btn .icon:hover {
- color: inherit;
+.btn-outline-primary:hover,
+.btn-outline-primary:focus {
+ color: #fff;
+ background-color: var(--accent);
+ border-color: var(--accent);
+}
+
+.btn-outline-danger:hover,
+.btn-outline-danger:focus {
+ color: #ffe5e8;
+ background-color: #dc3545;
+ border-color: #dc3545;
}
/* ================================
/* ================================
Icons
================================ */
-.icon {
+.icon,
+i.bi {
color: var(--icon-color);
display: inline-flex;
align-items: center;
}
-.icon:hover {
- color: var(--icon-color);
-}
-
.icon-static {
--icon-color-hover: var(--icon-color);
+ pointer-events: none;
margin-right: 6px;
}
cursor: pointer;
}
+.icon-action:hover {
+ color: var(--icon-color-hover);
+}
+
.icon-placeholder {
opacity: 0;
pointer-events: none;
Backup Table
================================ */
-.table tbody#backupList tr {
+.table tbody#backupList tr > td {
cursor: pointer;
transition: background-color 0.15s ease;
}
.toast.show {
opacity: 1;
+ pointer-events: auto;
}
/* ================================
margin-top: 18px;
}
+.modal-backdrop {
+ z-index: 1990;
+}
+
/* ================================
Modal "Add Host"
================================ */
margin-right: 0;
}
}
+
+/* ======================================
+ Bootstrap compatibility
+ ====================================== */
+a.tile,
+a.tile:hover {
+ text-decoration: none;
+ color: inherit;
+}
// -------------------------------------------------------
// IMPORT
// -------------------------------------------------------
-import { loadModals, showToast, showConfirmModal } from './common.js';
+import { loadModals, showToast, showConfirmModal, handleReload } from './common.js';
import { serviceIsAlive, serviceCheckHealth , serviceReloadDNS, serviceReloadDHCP, serviceBackupCreate, serviceBackupList, serviceBackupRestore, serviceDeleteBackup, serviceDownloadBackup, serviceUploadBackup } from './services.js';
// -------------------------------------------------------
const downloadBtn = document.createElement("button");
downloadBtn.className = "btn btn-sm btn-outline-primary me-2";
downloadBtn.title = "Download backup";
- downloadBtn.innerHTML = `<i class="bi bi-download text-primary"></i>`;
+ downloadBtn.innerHTML = `<i class="bi bi-download"></i>`;
downloadBtn.setAttribute("data-action", "downloadBackup");
downloadBtn.setAttribute("data-id", b.name);
tdActions.appendChild(downloadBtn);
const deleteBtn = document.createElement("button");
deleteBtn.className = "btn btn-sm btn-outline-danger";
deleteBtn.title = "Delete backup";
- deleteBtn.innerHTML = `<i class="bi bi-trash-fill text-danger"></i>`;
+ deleteBtn.innerHTML = `<i class="bi bi-trash-fill"></i>`;
deleteBtn.setAttribute("data-action", "deleteBackup");
deleteBtn.setAttribute("data-id", b.name);
tdActions.appendChild(deleteBtn);