Files
homepage/custom.css
T
2026-03-21 16:00:00 +01:00

568 lines
12 KiB
CSS
Executable File

/* ============================================================================
HOMEPAGE CUSTOM CSS - OPTIMIZED
============================================================================ */
:root {
/* Theme colors */
--dominant-color: #1a3a3a;
--accent-color: #00c8a0;
--accent-color-dim: #00c8a050;
--bg-color: #18191a;
--bg-color-light: #1e2021;
--text-color: #ffffff;
/* Derived properties using dynamic colors */
--card-border: 3.5px solid var(--dominant-color);
--card-border-hover: var(--accent-color);
--card-border-focus: var(--accent-color);
--card-bg: var(--bg-color);
--card-bg-hover: var(--accent-color-dim);
--text-shadow: 0 0 10px var(--bg-color);
--transition: background-color 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
--focus-ring: 0 0 8px var(--accent-color-dim);
--font-family-base: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
--base-font-size: 14px;
--card-padding: 0;
--card-margin: 0;
--border-radius: 1.5rem;
}
/* ============================================================================
NAVIGATION TABS
============================================================================ */
#myTab {
display: flex;
gap: 60px;
margin: 0 150px 30px;
padding: 0;
font: 18px/2 var(--font-family-base);
background: none;
backdrop-filter: none;
}
#myTabContent,
.tab-content,
.dropdown-area,
.tabcontent {
margin: 0;
padding: 0;
}
.tabcontent {
position: relative;
width: 100%;
height: 100%;
inset: 0;
display: none;
overflow-y: auto;
opacity: 0;
visibility: hidden;
transition: opacity 0.3s ease, visibility 0.3s ease;
}
.tabcontent.active {
display: block;
opacity: 1;
visibility: visible;
margin: 12px 0 15px;
}
[id$="-tab"] {
position: relative;
display: flex;
align-items: center;
justify-content: center;
min-height: 60px;
margin: 0;
border: var(--card-border);
border-radius: var(--border-radius);
background-color: #18191a;
text-align: center;
text-shadow: var(--text-shadow);
text-transform: uppercase;
font-weight: 700;
white-space: nowrap;
cursor: pointer;
user-select: none;
transition: var(--transition);
-webkit-tap-highlight-color: transparent;
contain: layout style paint;
will-change: background-color, border-color;
backface-visibility: hidden;
transform: translateZ(0);
}
[id$="-tab"]::before {
content: "";
position: absolute;
inset: -5px;
background-color: var(--card-bg);
border-radius: var(--border-radius);
z-index: -1;
}
[id$="-tab"]:hover {
background-color: #1e2021;
border-color: var(--card-border-hover);
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
[id$="-tab"].tab-focused,
[id$="-tab"].active {
background-color: #1e2021;
border-color: var(--card-border-focus);
outline: none;
box-shadow: var(--focus-ring);
}
/* ============================================================================
SERVICE CARDS
============================================================================ */
.service-card {
position: relative;
display: flex;
flex-direction: column;
border: var(--card-border);
border-radius: var(--border-radius);
background-color: #18191a;
text-shadow: var(--text-shadow);
font-weight: 400;
white-space: nowrap;
transition: var(--transition);
contain: layout style paint;
will-change: background-color, border-color;
content-visibility: auto;
contain-intrinsic-size: auto 200px;
backface-visibility: hidden;
transform: translateZ(0);
}
.service-card::before {
content: "";
position: absolute;
inset: -5px;
background-color: var(--card-bg);
border-radius: var(--border-radius);
z-index: -1;
}
.service-card:hover {
background-color: #1e2021;
border-color: var(--card-border-hover);
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.service-card > :is(div, span, h1, h2, h3, h4, h5, h6, p):first-child:not(.service-container),
.bookmark,
.widget-container {
font-weight: 700;
text-transform: uppercase;
}
.service-card > :first-child:not(.service-container),
.service-card > .service-header,
.service-card > .service-title {
margin-bottom: 1px;
}
.service-card > :nth-child(2):not(.service-header):not(.service-title),
.service-card > .service-body,
.service-card > .service-content {
margin-top: 1px;
}
.service-card:has(iframe) .service-container {
margin-top: 0;
padding-top: 0;
}
.service-card a:-moz-any-link {
background-color: transparent;
}
.service-card :is(a:focus, a:hover, div[onclick]:hover) {
background-color: transparent;
outline: none;
}
.service-icon img {
width: 12px;
height: 12px;
vertical-align: middle;
}
.service-block {
position: relative;
border: 2px solid darkslategrey;
border-radius: var(--border-radius);
}
.service-block:has(iframe) {
border: none;
}
.service-block:has(.epl),
.service-block:has(.uptime),
.service-block:has(.todo) {
border-color: #191c1d;
}
/* ============================================================================
INFORMATION WIDGETS
============================================================================ */
#information-widgets {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin-bottom: 12px;
}
#information-widgets-right {
margin-right: 10px;
}
.information-widget-greeting {
flex-grow: 1.5;
}
.information-widget-resources {
position: relative;
}
.information-widget-resource {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
margin: 0 auto;
text-align: center;
text-transform: uppercase;
font-weight: 700;
}
#information-widgets > * {
position: relative;
border: none;
border-radius: var(--border-radius);
backdrop-filter: none;
text-shadow: var(--text-shadow);
text-transform: uppercase;
font-weight: 700;
white-space: nowrap;
transition: var(--transition);
contain: layout;
will-change: transform;
content-visibility: auto;
contain-intrinsic-size: auto 200px;
backface-visibility: hidden;
transform: translateZ(0);
}
#information-widgets > *::before {
display: none;
}
#information-widgets > *:is(:hover, :focus) {
background-color: transparent !important;
border-color: transparent !important;
box-shadow: none !important;
backdrop-filter: none !important;
}
/* ============================================================================
IFRAME CONTAINERS
============================================================================ */
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 - OPTIMIZED SELECTORS
============================================================================ */
#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: var(--text-shadow);
font-size: 12px;
font-weight: 400;
}
#headlessui-disclosure-panel-\:r6\: > ul:first-child > li:first-child > div:first-child > div:first-child {
margin: -100px;
}
/* ============================================================================
ANIMATIONS
============================================================================ */
@keyframes updatePulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.7;
}
}
@keyframes loadingBar {
0% {
width: 0;
opacity: 0.5;
}
50% {
opacity: 1;
}
100% {
width: 100%;
opacity: 0.5;
}
}
.service-card.updating {
animation: updatePulse 0.5s ease-in-out;
}
.service-card.loading::after {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: var(--card-border-hover);
animation: loadingBar 2s linear infinite;
}
/* ============================================================================
UTILITY CLASSES
============================================================================ */
.container {
max-width: 90%;
}
.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;
}
/* ============================================================================
RESPONSIVE DESIGN
============================================================================ */
@media (max-width: 768px) {
:root {
--card-padding: 10px;
--card-margin: 3px;
}
#myTab {
flex-direction: column;
gap: 5px;
margin: 0;
padding: 0;
}
[id$="-tab"] {
width: 100%;
padding: 15px;
text-align: center;
justify-content: center;
align-items: center;
}
.tabcontent {
margin: 0;
padding: 0;
}
.service-card,
[id$="-tab"] {
font-size: 14px;
}
.hide-on-mobile {
display: none !important;
height: 0 !important;
min-height: 0 !important;
margin: 0 !important;
padding: 0 !important;
border: none !important;
}
}
@media (max-width: 480px) {
#myTab {
gap: 3px;
}
.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 — gleicher Look wie Service Cards
Homepage rendert Bookmarks als <a> Tags mit Tailwind-Klassen
============================================================================ */
.service-block a[href],
#bookmarks a[href] {
border: var(--card-border);
border-radius: var(--border-radius);
background-color: var(--bg-color-light);
text-shadow: var(--text-shadow);
transition: var(--transition);
}
.service-block a[href]:hover,
#bookmarks a[href]:hover {
background-color: var(--bg-color);
border-color: var(--card-border-hover);
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}