Files
2026-03-21 19:28:12 +01:00

600 lines
13 KiB
CSS
Executable File

/* ============================================================================
KalliLab — FINAL CUSTOM CSS
Header CSS removed completely / everything else kept
============================================================================ */
:root {
--kl-bg: #071015;
--kl-panel: rgba(8, 14, 19, 0.78);
--kl-panel-2: rgba(11, 19, 24, 0.86);
--kl-card: rgba(11, 19, 25, 0.72);
--kl-card-hover: rgba(14, 24, 31, 0.78);
--kl-tab: rgba(9, 16, 22, 0.78);
--kl-tab-hover: rgba(12, 22, 28, 0.82);
--kl-tab-active: rgba(10, 22, 26, 0.84);
--kl-border: rgba(118, 181, 187, 0.12);
--kl-border-strong: rgba(0, 200, 160, 0.34);
--kl-border-active: rgba(74, 219, 196, 0.62);
--kl-text: #e8fbfb;
--kl-text-soft: rgba(220, 243, 243, 0.74);
--kl-text-dim: rgba(182, 215, 215, 0.54);
--kl-shadow: 0 12px 30px rgba(0, 0, 0, 0.22);
--kl-glow: 0 0 18px rgba(0, 200, 160, 0.14);
--kl-glow-strong: 0 0 24px rgba(0, 200, 160, 0.22);
--kl-radius: 18px;
--kl-radius-sm: 14px;
--kl-font-ui: "Inter", "Segoe UI", system-ui, sans-serif;
--kl-font-tech: "JetBrains Mono", "Consolas", monospace;
--kl-transition: 180ms ease;
}
/* ============================================================================
BASE
============================================================================ */
html,
body {
background: #050c10;
color: var(--kl-text);
font-family: var(--kl-font-ui);
}
body::before {
content: "";
position: fixed;
inset: 0;
pointer-events: none;
background:
radial-gradient(circle at top center, rgba(0, 200, 160, 0.06), transparent 32%),
linear-gradient(180deg, rgba(4, 10, 14, 0.18), rgba(4, 10, 14, 0.48));
z-index: 0;
}
.container,
main,
#page_container {
position: relative;
z-index: 1;
}
.container {
max-width: 94%;
}
/* ============================================================================
TABS
============================================================================ */
#myTab {
display: flex;
gap: 18px;
margin: 0 24px 22px;
padding: 0;
background: transparent;
backdrop-filter: none;
}
#myTabContent,
.tab-content,
.dropdown-area,
.tabcontent {
margin: 0;
padding: 0;
}
[id$="-tab"] {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 50px;
min-width: 180px;
padding: 0 22px;
border: 1px solid var(--kl-border);
border-radius: 16px;
background: linear-gradient(180deg, rgba(10, 18, 24, 0.72), rgba(7, 13, 18, 0.82));
color: var(--kl-text-soft);
font-family: var(--kl-font-ui);
font-size: 0.95rem;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
cursor: pointer;
user-select: none;
transition:
border-color var(--kl-transition),
background var(--kl-transition),
box-shadow var(--kl-transition),
color var(--kl-transition);
}
[id$="-tab"]:hover {
color: var(--kl-text);
border-color: rgba(0, 200, 160, 0.28);
background: linear-gradient(180deg, var(--kl-tab-hover), rgba(8, 15, 20, 0.88));
box-shadow: var(--kl-glow);
transform: none;
}
[id$="-tab"].tab-focused,
[id$="-tab"].active,
[id$="-tab"][aria-selected="true"] {
color: var(--kl-text);
border-color: var(--kl-border-active);
background: linear-gradient(180deg, var(--kl-tab-active), rgba(7, 14, 18, 0.9));
box-shadow: var(--kl-glow-strong);
transform: none;
}
.tabcontent {
position: relative;
width: 100%;
height: 100%;
display: none;
overflow-y: auto;
opacity: 0;
visibility: hidden;
transition: opacity 220ms ease, visibility 220ms ease;
}
.tabcontent.active {
display: block;
opacity: 1;
visibility: visible;
margin: 0;
}
/* ============================================================================
GROUP TITLES
============================================================================ */
.service-group,
.services-group,
.bookmarks-group,
.widget-group {
margin-bottom: 18px;
}
h2,
.group-title,
.section-title {
color: var(--kl-text-soft);
font-family: var(--kl-font-ui);
font-size: 0.88rem;
font-weight: 700;
letter-spacing: 0.14em;
text-transform: uppercase;
}
/* ============================================================================
SERVICE CARDS
============================================================================ */
.service-card {
position: relative;
display: flex;
flex-direction: column;
border: 1px solid var(--kl-border);
border-radius: var(--kl-radius);
background: linear-gradient(180deg, rgba(12, 20, 26, 0.72), rgba(8, 14, 18, 0.72));
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.03),
var(--kl-shadow);
color: var(--kl-text);
text-shadow: none;
font-weight: 500;
white-space: normal;
overflow: hidden;
transition:
border-color var(--kl-transition),
background var(--kl-transition),
box-shadow var(--kl-transition);
}
.service-card::before {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(74, 219, 196, 0.03), transparent 36%);
pointer-events: none;
}
.service-card:hover {
border-color: var(--kl-border-strong);
background: linear-gradient(180deg, rgba(14, 24, 31, 0.78), rgba(9, 16, 21, 0.78));
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.04),
0 14px 34px rgba(0, 0, 0, 0.26),
0 0 0 1px rgba(0, 200, 160, 0.05),
0 0 18px rgba(0, 200, 160, 0.1);
transform: none;
}
.service-card a {
color: inherit;
text-decoration: none;
}
.service-header,
.service-title,
.card-title {
color: var(--kl-text) !important;
font-family: var(--kl-font-ui);
font-weight: 700 !important;
letter-spacing: 0.03em;
}
.service-description,
.card-description,
.service-card p {
color: var(--kl-text-dim) !important;
}
.service-icon img {
width: 18px;
height: 18px;
border-radius: 5px;
}
.service-container {
color: var(--kl-text-soft);
}
.service-block {
position: relative;
border: none;
border-radius: var(--kl-radius);
background: transparent;
}
.service-card .status,
.service-status,
.card-status {
font-family: var(--kl-font-tech);
font-size: 0.8rem;
color: var(--kl-text-soft);
}
/* ============================================================================
IFRAMES / SPECIALS
============================================================================ */
iframe {
width: 100%;
border: 0;
background-color: transparent;
}
.home-assistant {
height: 960px;
margin: -20px -20px 0;
}
.todo {
height: 455px;
margin: -18px 0 0;
}
.ha-calendar {
height: 995px;
margin-top: -10px;
}
.epl-calendar {
height: 520px;
margin: -40px 0 0;
pointer-events: none;
}
.glance {
height: 905px;
margin: 0 0 -40px;
}
.epl {
height: 1014px;
margin: -30px -80px 0;
}
/* ============================================================================
CUSTOM LISTS
============================================================================ */
#upcominggames .flex.flex-row.text-right,
#tautulli_recent_movies .flex.flex-row.text-right,
#tautulli_recent_shows .flex.flex-row.text-right {
display: flex;
align-items: center;
justify-content: flex-start;
gap: 0;
margin: -1.8px 0 -0.9px 10px;
border-radius: 0.5rem;
text-align: left;
font-weight: 400;
}
#upcominggames .flex.flex-row.text-right > div,
#tautulli_recent_movies .flex.flex-row.text-right > div,
#tautulli_recent_shows .flex.flex-row.text-right > div {
position: relative;
display: inline-block;
width: 60px;
padding-left: 0;
text-align: left;
font-weight: 400;
}
#upcominggames .flex.flex-row.text-right > div:first-child,
#tautulli_recent_movies .flex.flex-row.text-right > div:first-child,
#tautulli_recent_shows .flex.flex-row.text-right > div:first-child {
margin-right: 23px;
}
#upcominggames .flex.flex-row.text-right > div:last-child,
#tautulli_recent_movies .flex.flex-row.text-right > div:last-child,
#tautulli_recent_shows .flex.flex-row.text-right > div:last-child {
margin-left: -18px;
}
#upcomingtv span > span:first-child {
padding-left: 8px;
}
#upcominggames .flex.flex-row.text-right > div:first-child::after,
#tautulli_recent_shows .flex.flex-row.text-right > div:first-child::after,
#tautulli_recent_movies .flex.flex-row.text-right > div:first-child::after {
content: "";
position: absolute;
left: 50px;
top: 50%;
display: inline-block;
width: 8px;
height: 8px;
border-radius: 0.5rem;
transform: translateY(-50%);
}
#upcominggames .flex.flex-row.text-right > div:first-child::after {
background-color: #0078d4;
}
#tautulli_recent_shows .flex.flex-row.text-right > div:first-child::after {
background-color: #00cbfe;
}
#tautulli_recent_movies .flex.flex-row.text-right > div:first-child::after {
background-color: #f59e0b;
}
#upcominggames .service-container > div > div,
#tautulli_recent_movies .service-container > div > div,
#tautulli_recent_shows .service-container > div > div {
display: block;
margin: 3px 3px 1px;
border-radius: 0.4rem;
text-align: left;
text-shadow: none;
font-size: 12px;
font-weight: 400;
}
/* ============================================================================
UTILITIES
============================================================================ */
.flex {
display: flex;
}
.flex-row {
flex-direction: row;
}
.text-right {
text-align: right;
}
.text-left {
text-align: left;
}
.text-center {
text-align: center;
}
.w-full {
width: 100%;
}
.relative {
position: relative;
}
.active {
opacity: 1;
visibility: visible;
}
/* ============================================================================
ANIMATIONS
============================================================================ */
@keyframes updatePulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.74;
}
}
@keyframes loadingBar {
0% {
width: 0;
opacity: 0.45;
}
50% {
opacity: 1;
}
100% {
width: 100%;
opacity: 0.45;
}
}
.service-card.updating {
animation: updatePulse 0.5s ease-in-out;
}
.service-card.loading::after {
content: "";
position: absolute;
top: 0;
left: 0;
height: 2px;
background: linear-gradient(90deg, rgba(0, 200, 160, 0.2), rgba(74, 219, 196, 0.9));
animation: loadingBar 2s linear infinite;
}
/* ============================================================================
RESPONSIVE
============================================================================ */
@media (max-width: 768px) {
#myTab {
flex-direction: column;
gap: 8px;
margin: 0 12px 18px;
}
[id$="-tab"] {
width: 100%;
min-width: 0;
}
.container {
max-width: 100%;
}
.service-card,
[id$="-tab"] {
font-size: 14px;
}
}
@media (max-width: 480px) {
.service-card,
[id$="-tab"] {
font-size: 12px;
}
}
@media (prefers-reduced-motion: no-preference) {
* {
scroll-behavior: smooth;
}
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
/* ============================================================================
BOOKMARKS — FINAL MATCH TO MAIN CARDS
============================================================================ */
/* Haupt-Balken */
#bookmarks a[href],
.service-block a[href] {
position: relative;
border: 1px solid var(--kl-border) !important;
border-radius: 14px;
background: linear-gradient(
180deg,
rgba(12, 20, 26, 0.72),
rgba(8, 14, 18, 0.72)
) !important;
backdrop-filter: blur(6px);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.03),
var(--kl-shadow);
transition:
border-color var(--kl-transition),
background var(--kl-transition),
box-shadow var(--kl-transition);
overflow: hidden;
}
/* leichter Glow Layer wie bei Cards */
#bookmarks a[href]::before,
.service-block a[href]::before {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(
135deg,
rgba(74, 219, 196, 0.04),
transparent 40%
);
pointer-events: none;
}
/* Hover exakt wie Main Cards */
#bookmarks a[href]:hover,
.service-block a[href]:hover {
border-color: var(--kl-border-strong) !important;
background: linear-gradient(
180deg,
rgba(14, 24, 31, 0.78),
rgba(9, 16, 21, 0.78)
) !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.04),
0 14px 34px rgba(0, 0, 0, 0.26),
0 0 0 1px rgba(0, 200, 160, 0.05),
0 0 18px rgba(0, 200, 160, 0.1);
}
/* Text sauber wie oben */
#bookmarks a[href] * {
color: var(--kl-text-soft) !important;
font-weight: 500;
}
#bookmarks a[href]:hover * {
color: var(--kl-text) !important;
}
/* Icons etwas cleaner */
#bookmarks img {
border-radius: 6px;
opacity: 0.9;
}
/* leichte Separation zwischen Reihen */
#bookmarks .flex,
#bookmarks .grid {
gap: 10px;
}