| 自定义 CSS |
/* ==========================================================================
Heimdall Modern UI Theme
- Glass morphism, modern shadows, hover micro-interactions
- Dark mode toggle support (data-theme="light|dark")
- Improved typography & spacing system
========================================================================== */
:root {
/* Typography */
--hm-font-sans: 'Inter', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei',
system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
--hm-font-mono: 'JetBrains Mono', 'SF Mono', Menlo, Consolas, monospace;
/* Spacing scale (4px base) */
--hm-space-1: 4px;
--hm-space-2: 8px;
--hm-space-3: 12px;
--hm-space-4: 16px;
--hm-space-5: 20px;
--hm-space-6: 24px;
--hm-space-8: 32px;
/* Radius */
--hm-radius-sm: 8px;
--hm-radius-md: 14px;
--hm-radius-lg: 20px;
--hm-radius-pill: 999px;
/* Glass effect */
--hm-glass-bg: rgba(20, 22, 30, 0.45);
--hm-glass-bg-strong: rgba(20, 22, 30, 0.65);
--hm-glass-border: rgba(255, 255, 255, 0.12);
--hm-glass-border-hover: rgba(255, 255, 255, 0.22);
--hm-glass-blur: 18px;
/* Shadows */
--hm-shadow-sm: 0 2px 6px rgba(0, 0, 0, 0.18);
--hm-shadow-md: 0 8px 24px rgba(0, 0, 0, 0.28);
--hm-shadow-lg: 0 14px 40px rgba(0, 0, 0, 0.38);
--hm-shadow-glow: 0 0 0 1px rgba(255, 255, 255, 0.06),
0 12px 28px rgba(0, 0, 0, 0.35);
/* Accent palette */
--hm-accent: #6ea8ff;
--hm-accent-2: #a684ff;
--hm-success: #34d399;
--hm-danger: #f87171;
--hm-warning: #fbbf24;
/* Text on glass */
--hm-text: #f5f7fa;
--hm-text-muted: rgba(245, 247, 250, 0.7);
/* Motion */
--hm-ease: cubic-bezier(0.22, 1, 0.36, 1);
--hm-dur-fast: 160ms;
--hm-dur: 280ms;
}
/* Light theme overrides (for /items, /settings, etc. panels and optional light dash) */
:root[data-hm-theme='light'] {
--hm-glass-bg: rgba(255, 255, 255, 0.6);
--hm-glass-bg-strong: rgba(255, 255, 255, 0.85);
--hm-glass-border: rgba(20, 22, 30, 0.08);
--hm-glass-border-hover: rgba(20, 22, 30, 0.16);
--hm-text: #1a1d24;
--hm-text-muted: rgba(26, 29, 36, 0.65);
}
/* ---------- Base typography ---------- */
html, body {
font-family: var(--hm-font-sans);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
}
/* Subtle ambient gradient overlay on top of the background image for richer depth */
#app::before {
content: '';
position: fixed;
inset: 0;
pointer-events: none;
z-index: 0;
background:
radial-gradient(1200px 600px at 10% 0%, rgba(110, 168, 255, 0.18), transparent 60%),
radial-gradient(900px 600px at 90% 100%, rgba(166, 132, 255, 0.16), transparent 55%),
linear-gradient(180deg, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.45));
}
#app > * { position: relative; z-index: 1; }
/* ==========================================================================
Item tiles (cards)
========================================================================== */
.item-container {
/* Stagger-friendly: opacity controlled by JS via .hm-in */
opacity: 0;
transform: translateY(14px);
transition: opacity var(--hm-dur) var(--hm-ease),
transform var(--hm-dur) var(--hm-ease);
}
.item-container.hm-in {
opacity: 1;
transform: translateY(0);
}
.item {
border-radius: var(--hm-radius-md) !important;
border: 1px solid var(--hm-glass-border) !important;
background-image: linear-gradient(
135deg,
rgba(255, 255, 255, 0.18) 0%,
rgba(255, 255, 255, 0.04) 60%,
rgba(0, 0, 0, 0.12) 100%
) !important;
box-shadow: var(--hm-shadow-sm);
backdrop-filter: blur(var(--hm-glass-blur)) saturate(140%);
-webkit-backdrop-filter: blur(var(--hm-glass-blur)) saturate(140%);
transition:
transform var(--hm-dur) var(--hm-ease),
box-shadow var(--hm-dur) var(--hm-ease),
border-color var(--hm-dur) var(--hm-ease) !important;
overflow: hidden;
position: relative;
}
/* Soft top highlight */
.item::before {
content: '';
position: absolute;
inset: 0;
pointer-events: none;
background: linear-gradient(
180deg,
rgba(255, 255, 255, 0.14),
rgba(255, 255, 255, 0) 35%
);
opacity: 0.85;
transition: opacity var(--hm-dur) var(--hm-ease);
}
/* Soften the decorative right circle */
.item::after {
opacity: 0.35 !important;
transition: opacity var(--hm-dur) var(--hm-ease);
}
.item:hover {
transform: translateY(-4px);
box-shadow: var(--hm-shadow-lg);
border-color: var(--hm-glass-border-hover) !important;
}
.item:hover::before { opacity: 1; }
.item:hover::after { opacity: 0.55 !important; }
.item .details .title {
font-weight: 600;
letter-spacing: 0.01em;
}
.item .app-icon {
transition: transform var(--hm-dur) var(--hm-ease),
filter var(--hm-dur) var(--hm-ease);
filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.25));
}
.item:hover .app-icon {
transform: scale(1.06) rotate(-2deg);
}
/* Edit pencil button */
.item-edit {
transition: transform var(--hm-dur) var(--hm-ease),
background-color var(--hm-dur) var(--hm-ease) !important;
}
.item-edit:hover {
transform: scale(1.08);
}
/* ==========================================================================
Category title (when treat_tags_as=categories)
========================================================================== */
.category .title {
font-weight: 600 !important;
letter-spacing: 0.04em;
position: relative;
padding-bottom: 10px !important;
}
.category .title::after {
content: '';
position: absolute;
left: 50%;
bottom: 0;
transform: translateX(-50%);
width: 56px;
height: 3px;
border-radius: var(--hm-radius-pill);
background: linear-gradient(90deg, var(--hm-accent), var(--hm-accent-2));
opacity: 0.85;
}
/* ==========================================================================
Search form (modernized one-piece glass pill)
Structure:
.searchform > form > #search-container.input-container
[ <select name="provider"> ] <- only when multiple providers
<input class="homesearch" name="q">
<button type="submit">Search</button>
(#search-autocomplete is injected by JS inside #search-container)
========================================================================== */
.searchform {
/* outer chrome: just a centering frame, no extra padding/background */
display: flex !important;
align-self: center !important;
margin: 56px auto !important;
padding: 0 !important;
background: transparent !important;
border: 0 !important;
box-shadow: none !important;
width: 100% !important;
max-width: 680px !important;
position: relative;
z-index: 4;
}
.searchform:has(input[name='provider'][type='hidden']) {
max-width: 560px !important;
}
.searchform form { width: 100%; }
/* The unified glass pill */
.searchform #search-container,
.searchform .input-container {
position: relative;
display: flex !important;
align-items: stretch;
width: 100%;
height: 56px;
padding: 6px;
gap: 6px;
background: rgba(20, 22, 30, 0.42) !important;
border: 1px solid var(--hm-glass-border) !important;
border-radius: var(--hm-radius-pill) !important;
backdrop-filter: blur(20px) saturate(160%);
-webkit-backdrop-filter: blur(20px) saturate(160%);
box-shadow:
0 1px 0 rgba(255, 255, 255, 0.08) inset,
var(--hm-shadow-md) !important;
transition:
border-color var(--hm-dur) var(--hm-ease),
box-shadow var(--hm-dur) var(--hm-ease),
background-color var(--hm-dur) var(--hm-ease);
overflow: visible;
}
.searchform .input-container:focus-within {
border-color: rgba(110, 168, 255, 0.55) !important;
background: rgba(20, 22, 30, 0.55) !important;
box-shadow:
0 0 0 4px rgba(110, 168, 255, 0.20),
0 1px 0 rgba(255, 255, 255, 0.10) inset,
var(--hm-shadow-md) !important;
}
/* Provider select – flat, transparent, fits the pill */
.searchform .input-container select[name='provider'] {
flex: 0 0 auto;
align-self: center;
height: 100%;
padding: 0 36px 0 18px !important;
margin: 0 !important;
border: 0 !important;
border-radius: var(--hm-radius-pill) !important;
background: rgba(255, 255, 255, 0.06) !important;
color: var(--hm-text) !important;
font: inherit;
font-size: 14px;
font-weight: 500;
letter-spacing: 0.01em;
cursor: pointer;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>") !important;
background-repeat: no-repeat !important;
background-position: right 14px center !important;
background-size: 12px 12px !important;
transition: background-color var(--hm-dur-fast) var(--hm-ease);
}
.searchform .input-container select[name='provider']:hover {
background-color: rgba(255, 255, 255, 0.12) !important;
}
.searchform .input-container select[name='provider']:focus {
outline: none !important;
background-color: rgba(255, 255, 255, 0.14) !important;
}
.searchform .input-container select[name='provider'] option {
background: #1c1f29;
color: var(--hm-text);
}
/* The text input – fully transparent, integrated */
.searchform .input-container input[name='q'],
.searchform .input-container .homesearch {
flex: 1 1 auto;
height: 100% !important;
min-width: 0;
padding: 0 20px !important;
margin: 0 !important;
border: 0 !important;
border-radius: var(--hm-radius-pill) !important;
background: transparent !important;
color: var(--hm-text) !important;
font-size: 16px;
font-weight: 500;
letter-spacing: 0.01em;
box-shadow: none !important;
}
.searchform .input-container input[name='q']::placeholder {
color: var(--hm-text-muted) !important;
font-weight: 400;
}
.searchform .input-container input[name='q']:focus {
outline: none !important;
}
/* Submit button – pill, gradient accent, icon-ish */
.searchform .input-container button[type='submit'],
.searchform .input-container button {
position: relative !important;
right: auto !important;
top: auto !important;
flex: 0 0 auto;
align-self: center;
height: calc(100% - 0px);
min-width: 44px;
padding: 0 20px !important;
margin: 0 !important;
border: 0 !important;
border-radius: var(--hm-radius-pill) !important;
line-height: 1 !important;
font-size: 13px !important;
font-weight: 600 !important;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #fff !important;
background: linear-gradient(135deg, var(--hm-accent), var(--hm-accent-2)) !important;
box-shadow:
0 4px 12px rgba(110, 168, 255, 0.35),
0 1px 0 rgba(255, 255, 255, 0.25) inset;
cursor: pointer;
transition:
transform var(--hm-dur-fast) var(--hm-ease),
box-shadow var(--hm-dur-fast) var(--hm-ease),
filter var(--hm-dur-fast) var(--hm-ease) !important;
}
.searchform .input-container button:hover {
transform: translateY(-1px);
filter: brightness(1.08);
box-shadow:
0 6px 16px rgba(110, 168, 255, 0.45),
0 1px 0 rgba(255, 255, 255, 0.3) inset;
}
.searchform .input-container button:active {
transform: translateY(0);
filter: brightness(0.96);
}
/* ---------- Autocomplete dropdown – attach visually to the pill ---------- */
.searchform #search-container #search-autocomplete,
.searchform .input-container #search-autocomplete {
position: absolute !important;
top: calc(100% + 8px) !important;
left: 0 !important;
right: 0 !important;
width: auto !important;
background: var(--hm-glass-bg-strong) !important;
color: var(--hm-text) !important;
border: 1px solid var(--hm-glass-border) !important;
border-radius: var(--hm-radius-md) !important;
backdrop-filter: blur(20px) saturate(160%);
-webkit-backdrop-filter: blur(20px) saturate(160%);
box-shadow: var(--hm-shadow-lg) !important;
overflow: hidden;
animation: hm-ac-in 200ms var(--hm-ease) both;
}
@keyframes hm-ac-in {
from { opacity: 0; transform: translateY(-4px); }
to { opacity: 1; transform: translateY(0); }
}
#search-autocomplete .autocomplete-item {
padding: 12px 18px !important;
font-size: 14px;
color: var(--hm-text) !important;
border-bottom: 1px solid rgba(255, 255, 255, 0.06) !important;
transition: background-color var(--hm-dur-fast) var(--hm-ease),
color var(--hm-dur-fast) var(--hm-ease);
}
#search-autocomplete .autocomplete-item:last-child {
border-bottom: 0 !important;
}
#search-autocomplete .autocomplete-item:hover {
background: rgba(110, 168, 255, 0.18) !important;
}
/* jQuery UI autocomplete fallback (kept consistent) */
.ui-autocomplete {
background: var(--hm-glass-bg-strong) !important;
color: var(--hm-text) !important;
border: 1px solid var(--hm-glass-border) !important;
border-radius: var(--hm-radius-md) !important;
backdrop-filter: blur(20px) saturate(160%);
-webkit-backdrop-filter: blur(20px) saturate(160%);
box-shadow: var(--hm-shadow-lg) !important;
overflow: hidden;
padding: 4px !important;
margin: 8px 0 0 0 !important;
}
.ui-autocomplete .ui-menu-item,
.ui-autocomplete .ui-menu-item-wrapper {
color: var(--hm-text) !important;
background: transparent !important;
padding: 10px 14px !important;
border-radius: var(--hm-radius-sm) !important;
border: 0 !important;
transition: background-color var(--hm-dur-fast) var(--hm-ease);
}
.ui-autocomplete .ui-menu-item-wrapper:hover,
.ui-autocomplete .ui-state-active,
.ui-autocomplete .ui-state-hover {
background: rgba(110, 168, 255, 0.18) !important;
color: #fff !important;
border: 0 !important;
}
/* Light-theme adjustments */
:root[data-hm-theme='light'] .searchform .input-container {
background: rgba(255, 255, 255, 0.78) !important;
border-color: rgba(20, 22, 30, 0.08) !important;
}
:root[data-hm-theme='light'] .searchform .input-container input[name='q'],
:root[data-hm-theme='light'] .searchform .input-container .homesearch {
color: #1a1d24 !important;
}
:root[data-hm-theme='light'] .searchform .input-container input[name='q']::placeholder {
color: rgba(26, 29, 36, 0.5) !important;
}
:root[data-hm-theme='light'] .searchform .input-container select[name='provider'] {
color: #1a1d24 !important;
background-color: rgba(20, 22, 30, 0.05) !important;
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%231a1d24' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>") !important;
}
:root[data-hm-theme='light'] .searchform #search-container #search-autocomplete,
:root[data-hm-theme='light'] .searchform .input-container #search-autocomplete,
:root[data-hm-theme='light'] .ui-autocomplete {
background: rgba(255, 255, 255, 0.92) !important;
color: #1a1d24 !important;
border-color: rgba(20, 22, 30, 0.08) !important;
}
:root[data-hm-theme='light'] #search-autocomplete .autocomplete-item {
color: #1a1d24 !important;
border-bottom-color: rgba(20, 22, 30, 0.06) !important;
}
/* Mobile */
@media (max-width: 640px) {
.searchform { margin: 28px 16px !important; max-width: none !important; }
.searchform .input-container { height: 52px; padding: 5px; }
.searchform .input-container input[name='q'] { font-size: 15px; padding: 0 14px !important; }
.searchform .input-container button { padding: 0 14px !important; font-size: 12px !important; }
.searchform .input-container select[name='provider'] {
padding: 0 28px 0 12px !important; font-size: 13px;
background-position: right 8px center !important;
}
}
/* ==========================================================================
Tag list
========================================================================== */
.taglist .tag {
background: var(--hm-glass-bg) !important;
border: 1px solid var(--hm-glass-border) !important;
border-radius: var(--hm-radius-pill) !important;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
padding: 6px 14px !important;
font-weight: 500;
letter-spacing: 0.02em;
transition:
transform var(--hm-dur-fast) var(--hm-ease),
background-color var(--hm-dur-fast) var(--hm-ease),
border-color var(--hm-dur-fast) var(--hm-ease),
opacity var(--hm-dur-fast) var(--hm-ease) !important;
}
.taglist .tag:hover {
transform: translateY(-2px);
border-color: var(--hm-glass-border-hover) !important;
opacity: 1 !important;
}
.taglist .tag.active,
.taglist .tag.current,
.taglist .tag[data-active='true'] {
background: linear-gradient(135deg, var(--hm-accent), var(--hm-accent-2)) !important;
border-color: transparent !important;
color: #fff !important;
}
/* ==========================================================================
Side navigation
========================================================================== */
nav.sidenav {
background: var(--hm-glass-bg-strong) !important;
backdrop-filter: blur(22px) saturate(160%);
-webkit-backdrop-filter: blur(22px) saturate(160%);
border-right: 1px solid var(--hm-glass-border);
box-shadow: var(--hm-shadow-lg);
}
nav.sidenav h2 {
color: var(--hm-text);
font-weight: 600;
letter-spacing: 0.04em;
}
nav.sidenav #pinlist li {
border-radius: var(--hm-radius-sm);
transition: background-color var(--hm-dur-fast) var(--hm-ease);
padding: 8px 12px;
}
nav.sidenav #pinlist li:hover {
background: rgba(255, 255, 255, 0.06);
}
/* ==========================================================================
App header bar
========================================================================== */
.appheader {
background: var(--hm-glass-bg-strong) !important;
backdrop-filter: blur(16px) saturate(140%);
-webkit-backdrop-filter: blur(16px) saturate(140%);
border-bottom: 1px solid var(--hm-glass-border);
box-shadow: var(--hm-shadow-md);
}
/* ==========================================================================
Config buttons (bottom-right floating)
========================================================================== */
#config-buttons {
gap: 8px;
display: flex;
flex-direction: column;
align-items: flex-end;
}
#config-buttons a.config {
background: var(--hm-glass-bg-strong) !important;
border: 1px solid var(--hm-glass-border) !important;
border-radius: var(--hm-radius-md) !important;
backdrop-filter: blur(14px) saturate(140%);
-webkit-backdrop-filter: blur(14px) saturate(140%);
box-shadow: var(--hm-shadow-sm);
transition:
transform var(--hm-dur-fast) var(--hm-ease),
background-color var(--hm-dur-fast) var(--hm-ease),
box-shadow var(--hm-dur-fast) var(--hm-ease) !important;
}
#config-buttons a.config:hover {
transform: translateY(-2px) scale(1.04);
box-shadow: var(--hm-shadow-md);
border-color: var(--hm-glass-border-hover) !important;
}
#config-buttons a.config i {
color: var(--hm-text);
}
/* Custom dark-mode toggle button (injected by JS) */
#hm-theme-toggle {
cursor: pointer;
}
/* ==========================================================================
Management panels (items, settings, tags lists)
========================================================================== */
.module-container {
border: 1px solid var(--hm-glass-border) !important;
border-radius: var(--hm-radius-lg) !important;
box-shadow: var(--hm-shadow-lg) !important;
background: rgba(255, 255, 255, 0.96) !important;
overflow: hidden;
}
.module-container > header,
.module-container > footer {
background: linear-gradient(180deg, #f8fafc, #eef1f6) !important;
border-color: rgba(20, 22, 30, 0.06) !important;
}
.module-container input[type='text'],
.module-container input[type='url'],
.module-container input[type='email'],
.module-container input[type='password'],
.module-container input[type='number'],
.module-container textarea,
.module-container select {
border-radius: var(--hm-radius-sm) !important;
border: 1px solid #dbe0ea !important;
transition: border-color var(--hm-dur-fast) var(--hm-ease),
box-shadow var(--hm-dur-fast) var(--hm-ease) !important;
}
.module-container input:focus,
.module-container textarea:focus,
.module-container select:focus {
border-color: var(--hm-accent) !important;
box-shadow: 0 0 0 3px rgba(110, 168, 255, 0.18) !important;
outline: none !important;
}
.module-container .btn,
.module-container button[type='submit'] {
border-radius: var(--hm-radius-sm) !important;
font-weight: 600;
letter-spacing: 0.02em;
transition: transform var(--hm-dur-fast) var(--hm-ease),
filter var(--hm-dur-fast) var(--hm-ease) !important;
}
.module-container .btn:hover,
.module-container button[type='submit']:hover {
transform: translateY(-1px);
filter: brightness(1.06);
}
/* Tables inside module-container */
.module-container table tbody tr {
transition: background-color var(--hm-dur-fast) var(--hm-ease);
}
.module-container table tbody tr:hover {
background: rgba(110, 168, 255, 0.06);
}
/* Cap height of long textarea values (e.g. Custom CSS / Custom JS) so rows
* stay scannable and the edit button stays easy to click. */
.module-container table td > pre {
max-height: 180px;
overflow: auto;
margin: 0;
padding: 10px 12px;
background: #f5f7fb;
border: 1px solid #e3e7ef;
border-radius: var(--hm-radius-sm);
font-family: var(--hm-font-mono);
font-size: 12px;
line-height: 1.55;
color: #2f3340;
white-space: pre-wrap;
word-break: break-word;
position: relative;
}
.module-container table td > pre::-webkit-scrollbar {
width: 8px;
height: 8px;
}
.module-container table td > pre::-webkit-scrollbar-thumb {
background: rgba(20, 22, 30, 0.25);
border-radius: var(--hm-radius-pill);
}
/* Keep the value cell aligned to the top so a tall <pre> doesn't push the
* edit column off-center for long rows. */
.module-container table td {
vertical-align: top;
}
/* ==========================================================================
User selection / login
========================================================================== */
.userlist .user {
background: var(--hm-glass-bg-strong) !important;
border: 1px solid var(--hm-glass-border) !important;
border-radius: var(--hm-radius-lg) !important;
backdrop-filter: blur(18px) saturate(140%);
-webkit-backdrop-filter: blur(18px) saturate(140%);
box-shadow: var(--hm-shadow-lg) !important;
transition: transform var(--hm-dur) var(--hm-ease),
box-shadow var(--hm-dur) var(--hm-ease) !important;
}
.userlist .user:hover {
transform: translateY(-6px);
}
.userlist .user img,
.userlist .user .user-img {
border: 4px solid rgba(255, 255, 255, 0.85) !important;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.35);
}
/* ==========================================================================
Toast / alert messages
========================================================================== */
.message-container .alert {
border-radius: var(--hm-radius-md) !important;
border: 1px solid var(--hm-glass-border) !important;
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
box-shadow: var(--hm-shadow-md);
animation: hm-toast-in 380ms var(--hm-ease) both;
}
@keyframes hm-toast-in {
from { opacity: 0; transform: translateY(-8px); }
to { opacity: 1; transform: translateY(0); }
}
/* ==========================================================================
Scrollbar polish
========================================================================== */
* {
scrollbar-width: thin;
scrollbar-color: rgba(255, 255, 255, 0.18) transparent;
}
*::-webkit-scrollbar { width: 10px; height: 10px; }
*::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.18);
border-radius: var(--hm-radius-pill);
border: 2px solid transparent;
background-clip: padding-box;
}
*::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.32);
background-clip: padding-box;
}
/* ==========================================================================
Responsive
========================================================================== */
@media (max-width: 768px) {
.item-container {
flex: 0 0 calc(100% - 40px) !important;
width: calc(100% - 40px) !important;
max-width: 360px;
margin: 10px auto !important;
}
.searchform {
max-width: calc(100% - 32px) !important;
margin-left: auto !important;
margin-right: auto !important;
}
#config-buttons {
right: 12px !important;
bottom: 12px !important;
}
}
@media (max-width: 480px) {
.module-container { margin: 12px !important; }
}
/* Honor users who prefer reduced motion */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
.item-container { opacity: 1 !important; transform: none !important; }
}
|
|