Dash
Items
自定义 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 group (treat_tags_as = categories) – liquid glass panel Notes: - Do NOT set width / overflow:hidden on the panel: the tile tooltip is absolutely positioned ABOVE the tile (bottom:120px), so it would be clipped. Width is driven by content, like the original .category. ========================================================================== */ .category.item-containerz { position: relative; margin: 18px 10px; padding: 18px 18px 10px; border-radius: var(--hm-radius-lg); border: 1px solid var(--hm-glass-border); background: linear-gradient(135deg, rgba(255, 255, 255, 0.10) 0%, rgba(255, 255, 255, 0.04) 40%, rgba(0, 0, 0, 0.10) 100%), rgba(20, 22, 30, 0.32); backdrop-filter: blur(22px) saturate(170%); -webkit-backdrop-filter: blur(22px) saturate(170%); box-shadow: 0 1px 0 rgba(255, 255, 255, 0.10) inset, 0 -1px 0 rgba(0, 0, 0, 0.18) inset, var(--hm-shadow-md); transition: transform var(--hm-dur) var(--hm-ease), box-shadow var(--hm-dur) var(--hm-ease), border-color var(--hm-dur) var(--hm-ease), background-position 900ms var(--hm-ease); /* No overflow:hidden – tooltips above tiles must remain visible. */ } /* Top sheen via a localized gradient layer that respects the rounded corners * (no absolute pseudo-element needed, so nothing escapes to clip). */ .category.item-containerz::before { content: ''; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; background: linear-gradient(180deg, rgba(255, 255, 255, 0.16), rgba(255, 255, 255, 0) 35%); opacity: 0.85; transition: opacity var(--hm-dur) var(--hm-ease); z-index: 0; } .category.item-containerz:hover { transform: translateY(-2px); border-color: var(--hm-glass-border-hover); box-shadow: 0 1px 0 rgba(255, 255, 255, 0.14) inset, 0 -1px 0 rgba(0, 0, 0, 0.22) inset, var(--hm-shadow-lg); background-position: 100% 0, 0 0; } .category.item-containerz:hover::before { opacity: 1; } /* Title inside the panel – sits above the sheen layer */ .category.item-containerz > .title { position: relative; z-index: 1; margin: 0 0 12px; padding: 0 !important; font-size: 15px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--hm-text); } .category.item-containerz > .title a { color: inherit !important; text-decoration: none; opacity: 0.9; transition: opacity var(--hm-dur-fast) var(--hm-ease); } .category.item-containerz > .title a:hover { opacity: 1; } /* Tiles must layer above the sheen pseudo-element */ .category.item-containerz > .item-container { position: relative; z-index: 1; } /* Light theme */ :root[data-hm-theme='light'] .category.item-containerz { background: linear-gradient(135deg, rgba(255, 255, 255, 0.65) 0%, rgba(255, 255, 255, 0.45) 60%, rgba(255, 255, 255, 0.30) 100%); border-color: rgba(20, 22, 30, 0.08); } :root[data-hm-theme='light'] .category.item-containerz > .title { color: #1a1d24; } /* ========================================================================== 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; } /* ========================================================================== Keyboard-only focus dim The upstream stylesheet uses :focus-within to dim non-focused tiles and config buttons, which also fires on mouse click and looks like a bug. Restore the original a11y intent but only when the user is actually using the keyboard (i.e. :focus-visible). ========================================================================== */ /* 1. Cancel the upstream :focus-within dim/outline */ #sortable:focus-within .item:focus-within { outline: 0 !important; } #sortable:focus-within .item:not(:focus-within) { opacity: 1 !important; } #config-buttons:focus-within a:focus { border: 0 !important; } #config-buttons:focus-within a:not(:focus-within) { opacity: 1 !important; } /* 2. Re-apply the dim/highlight only for keyboard focus */ #sortable:has(.item :focus-visible) .item:not(:has(:focus-visible)), #sortable:has(.item:focus-visible) .item:not(:focus-visible) { opacity: 0.4 !important; } #sortable .item:has(:focus-visible), #sortable .item:focus-visible { outline: 1px solid rgba(255, 255, 255, 0.57) !important; opacity: 1 !important; } #config-buttons:has(a:focus-visible) a:not(:focus-visible) { opacity: 0.4 !important; } #config-buttons a:focus-visible { border: 1px solid rgba(255, 255, 255, 0.57) !important; opacity: 1 !important; } #config-buttons { transition: gap var(--hm-dur) var(--hm-ease); } #config-buttons > a.config { transition: opacity var(--hm-dur) var(--hm-ease), transform var(--hm-dur) var(--hm-ease), max-height var(--hm-dur) var(--hm-ease), margin var(--hm-dur) var(--hm-ease), background-color var(--hm-dur-fast) var(--hm-ease), box-shadow var(--hm-dur-fast) var(--hm-ease) !important; transform-origin: bottom right; will-change: transform, opacity; } #config-buttons.hm-collapsed > a.config:not(#hm-cfg-toggle) { opacity: 0; transform: translateX(16px) scale(0.6); max-height: 0 !important; height: 0 !important; margin: 0 !important; padding: 0 !important; border-width: 0 !important; pointer-events: none; visibility: hidden; } /* The toggle button itself – icon rotates to indicate state */ #hm-cfg-toggle i { transition: transform var(--hm-dur) var(--hm-ease); } #config-buttons:not(.hm-collapsed) #hm-cfg-toggle i { transform: rotate(180deg); } /* ========================================================================== Responsive ========================================================================== */ @media (max-width: 768px) { #sortable { justify-content: center !important; } .item-container { flex: 0 0 auto !important; width: calc(100% - 32px) !important; max-width: 360px !important; margin: 10px !important; /* symmetric – flex parent centers */ } .category.item-containerz { margin: 14px 8px !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; } }
仪表盘
用户
应用列表
标签列表
设置