@font-face { font-family: 'Inter UI'; src: url('./assets/fonts/nunito-latin-500-normal.woff2') format('woff2'); font-weight: 500; font-display: swap; } @font-face { font-family: 'Inter UI'; src: url('./assets/fonts/nunito-latin-700-normal.woff2') format('woff2'); font-weight: 700; font-display: swap; } @font-face { font-family: 'Noto Sans SC UI'; src: url('./assets/fonts/noto-sans-sc-chinese-simplified-500-normal.woff2') format('woff2'); font-weight: 500; font-display: swap; } @font-face { font-family: 'Noto Sans SC UI'; src: url('./assets/fonts/noto-sans-sc-chinese-simplified-700-normal.woff2') format('woff2'); font-weight: 700; font-display: swap; } :root { font-family: 'Inter UI', 'Noto Sans SC UI', 'PingFang SC', system-ui, sans-serif; color: #1c2738; background: #f3f5f8; --ink: #1c2738; --muted: #6f7c8f; --faint: #97a2b1; --line: #e0e5eb; --line-strong: #cfd7e1; --surface: #ffffff; --surface-soft: #f7f9fb; --canvas: #f3f5f8; --primary: #315bea; --primary-hover: #2449ce; --primary-soft: #eef2ff; --cyan: #0ca8b7; --success: #159570; --success-soft: #eaf8f3; --warning: #b87811; --warning-soft: #fff7e5; --danger: #cc514b; --danger-soft: #fff1f0; --radius: 14px; --radius-sm: 10px; --shadow-sm: 0 1px 2px rgba(20, 35, 55, 0.04); --shadow: 0 8px 25px rgba(20, 35, 55, 0.07); --shadow-lg: 0 18px 45px rgba(20, 35, 55, 0.12); /* Button system: one compact scale shared by every action control. */ --button-height: 2.375rem; --button-height-compact: 2.125rem; --button-height-large: 2.625rem; --icon-button-size: 2.5rem; --button-radius: 10px; --button-radius-compact: 8px; --button-focus-ring: #0f6e66; --button-primary-bg: #11776e; --button-primary-hover: #0f6e66; --button-primary-active: #0d5f58; --button-primary-text: #fffdf7; --button-secondary-bg: #fffdf7; --button-secondary-text: #584a38; --button-secondary-border: #bdb29d; --button-secondary-hover-bg: #ecfaf6; --button-secondary-hover-text: #0f6e66; --button-secondary-hover-border: #72cbbd; --button-danger-bg: #b64d48; --button-danger-hover: #a83f3a; --button-danger-active: #8f3531; --button-danger-text: #fffdf7; --button-disabled-bg: #ece6da; --button-disabled-text: #6f6350; --button-disabled-border: #d9d1bf; --field-height: 2.375rem; --field-radius: 10px; --field-border: var(--line-strong); --field-bg: #ffffff; --field-focus-border: var(--button-focus-ring); font-synthesis: none; text-rendering: optimizeLegibility; } * { box-sizing: border-box; } html { min-height: 100%; background: var(--canvas); } body { min-width: 20rem; min-height: 100vh; margin: 0; background: var(--canvas); } a { color: var(--primary); text-underline-offset: 3px; } button, input, select, textarea { font: inherit; color: inherit; } button, input, select, textarea, a { outline-offset: 2px; } :focus-visible { outline: 3px solid var(--button-focus-ring); outline-offset: 2px; } button, input, select, textarea { border: 1px solid var(--field-border); border-radius: var(--field-radius); background: var(--field-bg); } button { min-height: var(--button-height); border-radius: var(--button-radius); } input, select, textarea { min-height: var(--field-height); } input, select, textarea { padding: 0.55rem 0.75rem; } input:focus, select:focus, textarea:focus { border-color: var(--field-focus-border); box-shadow: none; outline: none; } button { display: inline-flex; align-items: center; justify-content: center; gap: 0.4rem; padding: 0.45rem 0.85rem; border-color: var(--button-secondary-border); color: var(--button-secondary-text); background: var(--button-secondary-bg); cursor: pointer; font-weight: 750; box-shadow: none; transition: border-color 150ms ease, color 150ms ease, background 150ms ease, box-shadow 150ms ease, transform 150ms ease; } button:hover:not(:disabled) { color: var(--button-secondary-hover-text); border-color: var(--button-secondary-hover-border); background: var(--button-secondary-hover-bg); } button:active:not(:disabled) { transform: translateY(1px); } button:disabled { cursor: not-allowed; color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); box-shadow: none; opacity: 1; } button[type='submit'], button.primary-action, a.primary-action { color: var(--button-primary-text); border-color: var(--button-primary-bg); background: var(--button-primary-bg); box-shadow: 0 3px 0 var(--button-primary-active); } button[type='submit']:hover:not(:disabled), button.primary-action:hover:not(:disabled), a.primary-action:hover { color: var(--button-primary-text); border-color: var(--button-primary-hover); background: var(--button-primary-hover); } h1, h2, h3 { margin-top: 0; color: var(--ink); line-height: 1.2; } h1 { margin-bottom: 0.35rem; font-size: clamp(1.55rem, 2.5vw, 2.15rem); letter-spacing: -0.035em; } h2 { font-size: 1.05rem; letter-spacing: -0.015em; } h3 { font-size: 0.9rem; } p { line-height: 1.55; } small { color: var(--muted); } code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; } .visually-hidden { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border: 0 !important; } .skip-link { position: fixed; top: -5rem; left: 1rem; z-index: 100; padding: 0.7rem 1rem; color: var(--button-primary-text); background: var(--primary); border-radius: 8px; } .skip-link:focus { top: 1rem; } .app-ambient { display: none; } /* Shell */ .app-shell { min-height: 100vh; } .app-topbar { position: sticky; top: 0; z-index: 30; min-height: 4.5rem; display: flex; align-items: center; gap: 1rem; padding: 0.65rem clamp(1rem, 2vw, 2rem); color: #dce5f2; border-bottom: 1px solid rgba(150, 170, 198, 0.14); background: rgba(19, 30, 48, 0.97); box-shadow: 0 4px 18px rgba(14, 25, 42, 0.16); backdrop-filter: blur(16px); } .product-name { display: inline-flex; align-items: center; gap: 0.7rem; text-decoration: none; } .product-mark { width: 2.65rem; height: 2.65rem; display: grid; place-items: center; flex: 0 0 auto; padding: 0.34rem; border: 1px solid rgba(255, 255, 255, 0.14); border-radius: 11px; background: rgba(255, 255, 255, 0.07); } .product-mark img { width: 100%; height: 100%; display: block; } .product-copy { display: grid; gap: 0.05rem; line-height: 1.15; } .product-copy strong { color: #fff; font-size: 1rem; } .topbar-actions { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; } .connection-status, .version-badge { padding: 0.3rem 0.6rem; color: #aebdd0; border: 1px solid rgba(154, 175, 201, 0.15); border-radius: 999px; background: rgba(255, 255, 255, 0.05); font-size: 0.76rem; } .sensitive-reveal-toggle { min-height: var(--button-height-compact); padding: 0 0.7rem; color: #cdd9e8; border: 1px solid rgba(154, 175, 201, 0.22); border-radius: 999px; background: rgba(255, 255, 255, 0.06); font-size: 0.76rem; font-weight: 700; } .sensitive-reveal-toggle:hover { color: #fff; background: rgba(255, 255, 255, 0.12); } .sensitive-reveal-toggle[aria-pressed='true'] { color: #2b3a4d; border-color: rgba(232, 181, 75, 0.6); background: #e8b54b; } .connection-status::before { content: ''; display: inline-block; width: 0.45rem; height: 0.45rem; margin-right: 0.4rem; border-radius: 50%; background: #32d49c; box-shadow: 0 0 0 3px rgba(50, 212, 156, 0.12); } .connection-status[data-state='connecting']::before, .connection-status[data-state='resetting']::before { background: #e8b54b; box-shadow: 0 0 0 3px rgba(232, 181, 75, 0.14); } .connection-status[data-state='reconnecting']::before, .connection-status[data-state='closed']::before { background: #e06d68; box-shadow: 0 0 0 3px rgba(224, 109, 104, 0.14); } .global-navigation { display: inline-flex; align-items: center; gap: 0.2rem; margin-inline: auto; padding: 0.25rem; border: 1px solid rgba(154, 175, 201, 0.18); border-radius: 10px; background: rgba(255, 255, 255, 0.05); } .global-navigation a { min-height: var(--button-height); display: inline-flex; align-items: center; gap: 0.4rem; padding: 0.4rem 0.7rem; color: #aebdd0; border-radius: var(--button-radius-compact); text-decoration: none; font-size: 0.82rem; font-weight: 700; } .global-navigation a:hover { color: #fff; background: rgba(49, 91, 234, 0.18); } .global-navigation a[aria-current='page'] { color: #fff; background: var(--primary); box-shadow: 0 4px 12px rgba(25, 54, 158, 0.32); } .global-navigation svg { width: 0.95rem; height: 0.95rem; } .app-layout { width: 100%; min-height: calc(100vh - 4.5rem); padding: clamp(0.7rem, 1.2vw, 1.2rem); } .app-layout-single { display: block; } main { width: 100%; min-width: 0; min-height: calc(100vh - 6rem); padding: clamp(1rem, 1.7vw, 1.65rem); border: 1px solid var(--line); border-radius: 18px; background: #fbfcfd; box-shadow: 0 5px 22px rgba(20, 35, 55, 0.055); } /* Shared page headers */ .fleet-heading, main > section > header, .page-heading { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; min-height: 4.6rem; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--line); } main > section > header p, .page-heading p { margin: 0.2rem 0 0; color: var(--muted); } .page-kicker, .eyebrow { margin: 0 0 0.18rem !important; color: var(--primary) !important; font-size: 0.66rem; font-weight: 900; letter-spacing: 0.13em; text-transform: uppercase; } .fleet-actions, .form-actions, .pagination, .fleet-card-actions { display: flex; align-items: center; gap: 0.55rem; flex-wrap: wrap; } .primary-action { min-height: var(--button-height); display: inline-flex; align-items: center; gap: 0.4rem; padding: 0.45rem 0.9rem; border-radius: var(--button-radius); font-weight: 750; text-decoration: none; } .selection-summary { color: var(--muted); font-size: 0.82rem; } .danger-button { color: var(--danger); border-color: #e8bbb8; background: var(--danger-soft); } .danger-button:hover:not(:disabled) { color: #a33d39; border-color: var(--danger); background: #ffe9e7; } .card-operation-success { color: var(--success); } .card-operation-error { color: var(--danger); } /* Fleet */ .fleet-workspace { display: grid; grid-template-columns: clamp(16.5rem, 17vw, 19rem) minmax(0, 1fr); align-items: start; gap: 1rem; } .fleet-workspace.is-sidebar-collapsed { grid-template-columns: 4rem minmax(0, 1fr); } .fleet-sidebar { position: sticky; top: 5.3rem; max-height: calc(100vh - 6.2rem); overflow: auto; padding: 0.85rem; border: 1px solid var(--line); border-radius: 14px; background: #fff; box-shadow: var(--shadow-sm); scrollbar-width: thin; } .fleet-sidebar-header { display: flex; align-items: center; justify-content: space-between; gap: 0.6rem; margin-bottom: 0.75rem; } .fleet-sidebar-header strong { font-size: 0.98rem; } .fleet-sidebar-toggle { width: var(--button-height-compact); min-width: var(--button-height-compact); height: var(--button-height-compact); min-height: var(--button-height-compact); display: grid; place-items: center; padding: 0; border-radius: 8px; color: var(--muted); } .fleet-sidebar-toggle > span:first-child { font-size: 1.3rem; line-height: 1; } .fleet-sidebar-toggle-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); } .fleet-sidebar-content { display: grid; gap: 0.8rem; } .fleet-sidebar.is-collapsed { width: auto; min-height: 8rem; padding: 0.65rem; overflow: visible; } .fleet-sidebar.is-collapsed .fleet-sidebar-header { justify-content: center; } .fleet-sidebar.is-collapsed .fleet-sidebar-header > div, .fleet-sidebar.is-collapsed .fleet-sidebar-content { display: none; } .fleet-status-summary { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.65rem; } .fleet-status-summary-rail { grid-template-columns: 1fr; } .fleet-status-summary > div { display: grid; gap: 0.15rem; padding: 0.75rem 0.85rem; border: 1px solid var(--line); border-left: 3px solid var(--primary); border-radius: 10px; background: var(--surface-soft); } .fleet-status-summary > div[data-tone='online'] { border-left-color: var(--success); } .fleet-status-summary > div[data-tone='cellular'] { border-left-color: var(--workbench-mint); } .fleet-status-summary > div[data-tone='attention'] { border-left-color: var(--warning); } .fleet-status-summary span { color: var(--muted); font-size: 0.75rem; } .fleet-status-summary strong { color: var(--ink); font-size: 1.5rem; line-height: 1.1; } .fleet-status-summary small { font-size: 0.68rem; } .fleet-cross-health { display: grid; gap: 0.5rem; margin-top: 0.6rem; } .fleet-cross-health-item { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; min-height: var(--button-height-compact); padding: 0.35rem 0.65rem; border: 1px solid var(--line); border-radius: var(--button-radius-compact); color: var(--ink); background: var(--surface-soft); text-decoration: none; font-size: 0.76rem; font-weight: 700; transition: border-color 0.15s ease; } .fleet-cross-health-item:hover { border-color: var(--primary); } .fleet-cross-health-item span { display: flex; align-items: center; gap: 0.4rem; min-width: 0; color: var(--muted); } .fleet-cross-health-item span svg { flex: 0 0 auto; width: 0.85rem; height: 0.85rem; } .fleet-cross-health-item strong { flex: 0 0 auto; color: var(--success); font-size: 0.88rem; font-variant-numeric: tabular-nums; } .fleet-cross-health-item strong[data-tone='attention'] { color: var(--warning); } /* The identity rail entry opens a drawer instead of a page, so it is a button dressed as a link. */ button.fleet-cross-health-item { width: 100%; font: inherit; text-align: left; cursor: pointer; } .fleet-toolbar { display: grid; gap: 0.7rem; } .fleet-search-field { position: relative; display: block; } .fleet-search-field input { width: 100%; padding-left: 2.35rem; padding-right: 3.7rem; } .fleet-search-glyph { position: absolute; left: 0.82rem; top: 50%; width: 0.78rem; height: 0.78rem; border: 2px solid var(--faint); border-radius: 50%; transform: translateY(-58%); pointer-events: none; } .fleet-search-glyph::after { content: ''; position: absolute; width: 0.42rem; height: 2px; right: -0.35rem; bottom: -0.18rem; border-radius: 99px; background: var(--faint); transform: rotate(45deg); } .fleet-search-clear { position: absolute; right: 0.28rem; top: 50%; min-height: var(--button-height-compact); padding: 0.25rem 0.55rem; transform: translateY(-50%); font-size: 0.75rem; } .fleet-status-chips { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.4rem; } .fleet-status-chip { min-height: var(--button-height-compact); display: flex; justify-content: space-between; gap: 0.4rem; padding: 0.35rem 0.55rem; border-radius: 8px; color: #536176; font-size: 0.78rem; } .fleet-status-chip:first-child { grid-column: 1 / -1; } .fleet-status-chip strong { min-width: 1.25rem; padding: 0.05rem 0.3rem; border-radius: 999px; background: #eef1f5; font-size: 0.72rem; } .fleet-status-chip.is-active { color: var(--primary); border-color: #aebdf2; background: var(--primary-soft); box-shadow: inset 3px 0 var(--primary); } .fleet-status-chip.is-active strong { color: #fff; background: var(--primary); } .fleet-active-filters { display: flex; gap: 0.35rem; flex-wrap: wrap; } .fleet-active-chip { min-height: var(--button-height-compact); max-width: 100%; display: inline-flex; gap: 0.35rem; padding: 0.25rem 0.5rem; color: var(--primary); border-color: #c7d2f7; background: var(--primary-soft); font-size: 0.72rem; } .fleet-active-chip span:first-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .fleet-clear-filters { min-height: var(--button-height-compact); padding: 0.25rem 0.5rem; color: var(--muted); font-size: 0.72rem; } .fleet-advanced-filters { padding-top: 0.65rem; border-top: 1px solid var(--line); } .fleet-advanced-filters summary { cursor: pointer; color: #4d5c70; font-size: 0.8rem; font-weight: 800; } .fleet-advanced-count { display: inline-grid; place-items: center; min-width: 1.25rem; margin-left: 0.35rem; padding: 0.05rem 0.3rem; color: #fff; border-radius: 999px; background: var(--primary); font-size: 0.7rem; } .fleet-advanced-filter-grid { display: grid; gap: 0.55rem; margin-top: 0.65rem; } .fleet-advanced-filter-grid label { display: grid; gap: 0.25rem; color: var(--muted); font-size: 0.72rem; font-weight: 700; } .fleet-advanced-filter-grid select { width: 100%; min-width: 0; } .batch-entry { display: grid; gap: 0.6rem; padding: 0.75rem; border: 1px solid #f0d9ac; border-radius: 10px; background: var(--warning-soft); } .batch-entry p { margin: 0.15rem 0 0; color: #85601f; font-size: 0.76rem; } .batch-entry-actions { display: flex; gap: 0.4rem; flex-wrap: wrap; } .batch-entry-actions button { min-height: var(--button-height-compact); font-size: 0.74rem; } .batch-progress { margin: 0; } .fleet-results-pane { min-width: 0; } .fleet-results-header { display: flex; align-items: center; justify-content: space-between; gap: 0.8rem; flex-wrap: wrap; min-height: 4rem; margin-bottom: 0.85rem; padding: 0.75rem 0.9rem; border: 1px solid var(--line); border-radius: 12px; background: #fff; } .fleet-results-header p { margin: 0; } .fleet-result-count { color: var(--muted); font-size: 0.8rem; } .fleet-result-count strong { color: var(--ink); font-size: 1rem; } .fleet-toolbar-controls, .fleet-select-all { display: flex; align-items: center; gap: 0.4rem; flex-wrap: wrap; } .fleet-toolbar-controls select, .fleet-select-all button { min-height: var(--button-height-compact); font-size: 0.77rem; } .fleet-card-section { margin: 0; } .fleet-card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 20.5rem), 1fr)); gap: 0.9rem; } .fleet-card { --card-accent: var(--success); position: relative; min-width: 0; min-height: 29rem; overflow: hidden; display: flex; flex-direction: column; gap: 0.7rem; padding: 1rem; border: 1px solid var(--line); border-radius: 14px; background: #fff; box-shadow: 0 5px 18px rgba(20, 35, 55, 0.055); transition: transform 180ms ease, border-color 180ms ease, box-shadow 180ms ease; } .fleet-card[data-status='offline'] { --card-accent: var(--danger); } .fleet-card[data-status='auth'] { --card-accent: var(--warning); } .fleet-card[data-status='unknown'] { --card-accent: #8995a5; } .fleet-card::before { content: ''; position: absolute; inset: 0 0 auto; height: 3px; background: var(--card-accent); } .fleet-card:hover { transform: translateY(-2px); border-color: color-mix(in srgb, var(--card-accent) 35%, var(--line)); box-shadow: var(--shadow); } .fleet-card.is-selected { border-color: #829cf1; box-shadow: 0 0 0 3px rgba(49, 91, 234, 0.1), var(--shadow); } .fleet-card-glow { display: none; } .fleet-card > header { display: flex; align-items: flex-start; justify-content: space-between; gap: 0.7rem; padding: 0.15rem 0 0.75rem; border-bottom: 1px solid var(--line); } .fleet-card-title-group { min-width: 0; display: flex; align-items: flex-start; gap: 0.55rem; } .fleet-card-select { display: grid; place-items: center; padding-top: 0.2rem; } .fleet-card-select input { width: 1rem; height: 1rem; accent-color: var(--primary); } .fleet-card-entry { color: inherit; text-decoration: none; } .fleet-card h2 { margin: 0; font-size: 1.1rem; } .fleet-card-entry-label { display: inline-flex; align-items: center; margin-top: 0.35rem; color: var(--primary); font-size: 0.72rem; font-weight: 800; } .fleet-card-entry-label::after { content: '→'; margin-left: 0.25rem; } .fleet-card-header-meta { display: grid; justify-items: end; gap: 0.3rem; } .status, .fleet-card-freshness { display: inline-flex; align-items: center; gap: 0.3rem; padding: 0.2rem 0.45rem; border: 1px solid transparent; border-radius: 7px; font-size: 0.68rem; font-weight: 800; } .status-dot { width: 0.4rem; height: 0.4rem; border-radius: 50%; background: currentColor; } .status-online { color: #10785b; border-color: #b9e5d7; background: var(--success-soft); } .status-offline { color: #ad4540; border-color: #edc2bf; background: var(--danger-soft); } .status-auth { color: #95600c; border-color: #ecd599; background: var(--warning-soft); } .status-unknown { color: #677588; border-color: #d7dee5; background: #f2f4f6; } .fleet-card-freshness-fresh { color: #10785b; background: var(--success-soft); } .fleet-card-freshness-stale { color: #95600c; background: var(--warning-soft); } .fleet-card-freshness-unknown { color: #758194; background: #f1f3f5; } .fleet-card-overview { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: end; gap: 0.75rem; padding: 0.75rem; border: 1px solid var(--line); border-radius: 10px; background: var(--surface-soft); } .fleet-card-kicker { display: block; margin-bottom: 0.2rem; color: var(--muted); font-size: 0.65rem; font-weight: 900; letter-spacing: 0.07em; text-transform: uppercase; } .fleet-card-origin-link, .fleet-card-origin-invalid { max-width: 100%; display: inline-flex; align-items: center; gap: 0.4rem; color: #30465f; text-decoration: none; font-size: 0.76rem; font-weight: 700; } .fleet-card-origin-link > span:first-child { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .fleet-origin-arrow { flex: 0 0 auto; color: var(--primary); } .fleet-card-origin-link:hover { color: var(--primary); } .fleet-card-origin-invalid { color: var(--danger); } .fleet-card-description { margin: 0; padding-left: 0.65rem; color: var(--muted); border-left: 2px solid var(--line-strong); font-size: 0.78rem; } .fleet-card-anomalies { margin: 0; padding: 0.45rem 0.55rem; color: #a3413c; border-radius: 8px; background: var(--danger-soft); font-size: 0.74rem; } .fleet-card-metrics { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.5rem; margin: 0; } .fleet-card-metrics > div { min-width: 0; display: grid; gap: 0.22rem; padding: 0.55rem 0.6rem; border: 1px solid var(--line); border-radius: 9px; background: #fff; } .fleet-card-metrics .fleet-card-phone { grid-column: 1 / -1; } .fleet-card-metrics dt { color: var(--muted); font-size: 0.65rem; font-weight: 700; } .fleet-card-metrics dd { min-width: 0; display: flex; align-items: center; justify-content: space-between; gap: 0.35rem; margin: 0; color: #2b3d53; font-size: 0.77rem; font-weight: 800; overflow-wrap: anywhere; } .fleet-card meter { width: 55%; height: 0.42rem; accent-color: var(--card-accent); } .capability-tags, .fleet-instance-tags { display: flex; flex-wrap: wrap; gap: 0.3rem; } .capability-tags { margin: 0; } .capability-tags span, .fleet-instance-tags span { padding: 0.16rem 0.42rem; border: 1px solid #d9e1f5; border-radius: 6px; color: #465d89; background: #f3f6fd; font-size: 0.65rem; font-weight: 700; } .fleet-card-sms { margin: 0; padding: 0.65rem; border: 1px solid #dbe5ee; border-radius: 9px; background: #f5f8fb; } .fleet-card-sms h3 { margin: 0 0 0.4rem; color: #536b85; font-size: 0.68rem; letter-spacing: 0.06em; text-transform: uppercase; } .fleet-card-sms dl { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.3rem 0.6rem; margin: 0; } .fleet-card-sms dl div:nth-child(3) { grid-column: 1 / -1; } .fleet-card-sms dt { color: var(--muted); font-size: 0.63rem; } .fleet-card-sms dd { margin: 0.08rem 0 0; color: #34485f; font-size: 0.73rem; overflow-wrap: anywhere; } .fleet-card-sms-empty { margin: 0; color: var(--muted); font-size: 0.74rem; } .fleet-card-admin-actions { margin-top: auto; padding-top: 0.7rem; border-top: 1px solid var(--line); } .fleet-card-admin-actions button { flex: 1 1 7rem; min-height: var(--button-height-compact); font-size: 0.75rem; } .fleet-card-section + .pagination { margin-top: 0.8rem; } .pagination { justify-content: flex-end; margin-top: 0.9rem; } .pagination button { min-height: var(--button-height-compact); } /* States and forms */ .state-panel { padding: 0.85rem 1rem; border: 1px solid var(--line); border-radius: 11px; color: #526176; background: var(--surface-soft); } .state-panel p { margin: 0 0 0.5rem; } .state-error { color: #a6423e; border-color: #ebc5c2; background: var(--danger-soft); } .instance-editor { max-width: 56rem; margin: 0 auto; } .instance-editor form, .settings-card { display: grid; gap: 0.9rem; padding: clamp(1rem, 2vw, 1.5rem); border: 1px solid var(--line); border-radius: 13px; background: #fff; box-shadow: var(--shadow-sm); } .instance-editor form label, .settings-card label, .jobs-toolbar label, .fleet-toolbar > label { display: grid; gap: 0.3rem; color: #536176; font-size: 0.8rem; font-weight: 700; } .instance-editor input, .instance-editor select, .settings-card input, .settings-card select { width: 100%; } .form-actions { padding-top: 0.75rem; border-top: 1px solid var(--line); } .danger-zone { margin-top: 1rem; padding: 1rem; border: 1px solid #ebc5c2; border-radius: 12px; background: #fff8f7; } .danger-zone h2 { color: #a6423e; } .toggle-row { display: flex !important; align-items: center; justify-content: space-between; gap: 1rem; } .toggle-row span { display: grid; gap: 0.2rem; } .toggle-row input[type='checkbox'] { width: 2.7rem; height: 1.35rem; } .auth-password-fields { display: grid; gap: 0.75rem; } /* Native system maintenance */ .system-maintenance { max-width: 78rem; } .maintenance-layout { display: grid; gap: 1rem; } .maintenance-card { min-width: 0; } .maintenance-card section { display: grid; gap: 1rem; } .maintenance-card h2 { margin: 0; } .maintenance-hint { margin: 0; color: var(--muted); font-size: 0.82rem; } .maintenance-summary { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0.7rem; margin: 0; } .maintenance-summary div { min-width: 0; padding: 0.72rem 0.8rem; border: 1px solid var(--line); border-radius: 10px; background: var(--surface-soft); } .maintenance-summary dt { color: var(--muted); font-size: 0.72rem; font-weight: 700; } .maintenance-summary dd { overflow: hidden; margin: 0.2rem 0 0; color: var(--ink); font-size: 0.95rem; font-weight: 800; text-overflow: ellipsis; white-space: nowrap; } .maintenance-components { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0.55rem; margin: 0; padding: 0; list-style: none; } .maintenance-components li { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; min-width: 0; padding: 0.55rem 0.65rem; border: 1px solid var(--line); border-radius: 9px; background: #fff; } .maintenance-components span { overflow: hidden; color: var(--muted); font-size: 0.76rem; text-overflow: ellipsis; white-space: nowrap; } .maintenance-components strong { color: var(--ink); font-size: 0.86rem; } .maintenance-storage-files strong { font-variant-numeric: tabular-nums; } .maintenance-storage-table td, .maintenance-storage-table th { font-variant-numeric: tabular-nums; } .maintenance-storage-table tfoot th, .maintenance-storage-table tfoot td { border-top: 2px solid var(--line); color: var(--ink); font-weight: 800; } .retention-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.8rem; } .retention-item { display: grid; grid-template-columns: minmax(0, 1fr) 4.1rem 5rem; align-items: end; gap: 0.5rem; padding: 0.75rem; border: 1px solid var(--line); border-radius: 10px; background: var(--surface-soft); } .retention-item .toggle-row { align-self: center; } .retention-item input[type='checkbox'] { width: 2.3rem; } .maintenance-actions { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 1rem; align-items: start; } .maintenance-actions fieldset { min-width: 0; margin: 0; border: 1px solid var(--line); border-radius: 10px; padding: 0.75rem; } .maintenance-actions legend { color: var(--muted); font-size: 0.76rem; font-weight: 800; padding: 0 0.35rem; } .cleanup-choice { display: flex !important; align-items: center; gap: 0.55rem; font-weight: 600 !important; } .cleanup-choice input { width: 1.1rem; height: 1.1rem; } .action-buttons { display: grid; gap: 0.55rem; min-width: 8.8rem; } .maintenance-backup-actions { display: flex; align-items: center; gap: 0.6rem; white-space: nowrap; } .maintenance-backup-actions a { min-height: var(--button-height-compact); display: inline-flex; align-items: center; gap: 0.35rem; padding: 0.3rem 0.7rem; color: var(--button-secondary-text); border: 1px solid var(--button-secondary-border); border-radius: var(--button-radius-compact); background: var(--button-secondary-bg); font-size: 0.76rem; font-weight: 750; text-decoration: none; } .maintenance-backup-actions a:hover { color: var(--button-secondary-hover-text); border-color: var(--button-secondary-hover-border); background: var(--button-secondary-hover-bg); } .dense-table code { color: var(--muted); font-size: 0.72rem; letter-spacing: 0; } .backup-directory { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.4rem; } .backup-directory span { color: var(--muted); font-size: 0.72rem; } .backup-directory code { min-width: 0; overflow-wrap: anywhere; color: var(--muted); font-size: 0.72rem; letter-spacing: 0; } .backup-note { display: block; margin-top: 0.15rem; overflow-wrap: anywhere; color: var(--muted); font-size: 0.7rem; } .backup-component-picker { display: grid; gap: 0.4rem; margin: 0; padding: 0.7rem 0.8rem 0.8rem; border: 1px solid var(--line); border-radius: 10px; } .backup-component-picker legend { padding: 0 0.35rem; color: var(--muted); font-size: 0.74rem; font-weight: 800; } .backup-component-choice { display: grid; grid-template-columns: auto 1fr; align-items: start; gap: 0.55rem; cursor: pointer; } .backup-component-choice input[type='checkbox'] { margin-top: 0.28rem; } .backup-component-text { display: grid; gap: 0.1rem; } .backup-component-text strong { display: flex; align-items: baseline; justify-content: space-between; gap: 0.6rem; font-size: 0.84rem; } .backup-component-text em { color: var(--muted); font-size: 0.72rem; font-style: normal; font-weight: 700; white-space: nowrap; } .backup-component-text small { color: var(--muted); font-size: 0.72rem; line-height: 1.45; } .backup-create-row { display: flex; flex-wrap: wrap; align-items: center; gap: 0.6rem; } .backup-create-row input[type='text'] { flex: 1 1 12rem; min-width: 0; padding: 0.45rem 0.6rem; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); color: var(--ink); font: inherit; font-size: 0.8rem; } .backup-components { display: inline-block; max-width: 16rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: bottom; } .backup-restore-panel { display: grid; gap: 0.5rem; padding: 0.8rem; border: 1px solid var(--line); border-radius: 10px; background: var(--surface-soft); } .backup-restore-panel h3 { margin: 0; font-size: 0.86rem; overflow-wrap: anywhere; } .backup-preview-panel { display: grid; gap: 0.6rem; padding: 0.8rem; border: 1px solid var(--line); border-radius: 10px; background: var(--surface-soft); } .backup-preview-panel h3 { margin: 0; font-size: 0.86rem; overflow-wrap: anywhere; } .backup-preview-grid { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 0.35rem 0.8rem; } .backup-preview-grid span { color: var(--muted); font-size: 0.72rem; } .backup-preview-grid strong { font-size: 0.78rem; min-width: 0; overflow-wrap: anywhere; } .backup-preview-components { margin: 0; padding-left: 1.1rem; display: grid; gap: 0.25rem; font-size: 0.78rem; } .backup-schedule { display: grid; gap: 0.6rem; padding-top: 0.4rem; border-top: 1px dashed var(--line); } .backup-schedule h3 { margin: 0; font-size: 0.86rem; } .backup-schedule-grid { display: flex; flex-wrap: wrap; gap: 0.5rem; } .backup-schedule-grid input, .backup-schedule-grid select { padding: 0.4rem 0.55rem; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); color: var(--ink); font: inherit; font-size: 0.78rem; } .discovery-card { margin-bottom: 1rem; } .discovery-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; } .discovery-head h2 { margin: 0; font-size: 0.95rem; } .discovery-progress { margin: 0; padding: 0.55rem 0.75rem; border: 1px dashed var(--line); border-radius: 9px; color: var(--muted); background: var(--surface-soft); font-size: 0.78rem; font-variant-numeric: tabular-nums; } .discovery-actions { text-align: right; white-space: nowrap; } .discovery-manual { display: flex; align-items: flex-end; flex-wrap: wrap; gap: 0.6rem; padding-top: 0.9rem; border-top: 1px solid var(--line); } .discovery-manual label { flex: 1 1 16rem; } .discovery-manual input { padding: 0.45rem 0.6rem; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); color: var(--ink); font: inherit; font-size: 0.8rem; } .discovery-probe { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 0.75rem; padding: 0.7rem 0.9rem; border: 1px solid var(--line); border-radius: 10px; background: var(--surface-soft); } .discovery-probe p { margin: 0; color: var(--muted); font-size: 0.8rem; } .connection-card { margin-bottom: 1rem; } .connection-head { display: flex; align-items: flex-start; justify-content: space-between; flex-wrap: wrap; gap: 1rem; } .connection-head h2 { margin: 0; font-size: 0.95rem; } .connection-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); gap: 0.9rem; } .connection-field { display: grid; gap: 0.3rem; } .connection-grid input { max-width: 9rem; } .connection-grid .maintenance-hint { font-weight: 400; } .connection-mode { display: grid; gap: 0.35rem; margin: 1rem 0 0; } .connection-mode-label { font-size: 0.8rem; font-weight: 700; } .connection-mode .connection-mode-control { max-width: 20rem; margin-bottom: 0; } .connection-mode .maintenance-hint { margin: 0; } .maintenance-notice, .maintenance-error { margin: 0; padding: 0.75rem 0.9rem; border-radius: 10px; font-weight: 700; } .maintenance-notice { color: var(--ink); background: var(--success-soft, #f0f7ee); } .maintenance-error { color: #a6423e; background: var(--danger-soft); } /* Console online update */ .system-maintenance > .update-card { margin-bottom: 1rem; } .update-card h2 { display: flex; align-items: center; gap: 0.45rem; } .update-card h2 svg { width: 1.05rem; height: 1.05rem; } .update-status-row { display: flex; align-items: center; flex-wrap: wrap; gap: 0.6rem; margin-bottom: 0.75rem; } .update-phase-message { font-weight: 700; line-height: 1.5; } .update-progress { display: flex; align-items: center; gap: 0.6rem; margin-bottom: 0.75rem; } .update-progress > div { flex: 1 1 auto; min-width: 8rem; } .update-progress strong { min-width: 3rem; font-variant-numeric: tabular-nums; } .update-summary { grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr)); } .update-release-summary { margin: 0.75rem 0 0; padding: 0.7rem 0.9rem; border: 1px dashed rgba(37, 59, 88, 0.18); border-radius: 10px; background: rgba(255, 255, 255, 0.55); font-size: 0.86rem; line-height: 1.6; white-space: pre-wrap; word-break: break-word; } .update-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.6rem; margin-top: 0.9rem; } .update-actions button svg { width: 0.95rem; height: 0.95rem; } /* Instance detail */ .instance-detail { display: grid; gap: 0.9rem; } .instance-context { padding: 1rem 1.1rem 0; border: 1px solid #253b58; border-radius: 15px; color: #d7e1ed; background: linear-gradient(145deg, #17283e, #122137); box-shadow: 0 9px 25px rgba(19, 32, 50, 0.13); } .instance-breadcrumb { color: #93b7ed; font-size: 0.78rem; text-decoration: none; } .instance-breadcrumb::before { content: '← '; } .instance-identity { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-top: 0.75rem; flex-wrap: wrap; } .instance-identity h1 { margin: 0; color: #fff; } .instance-identity code { display: inline-block; margin-top: 0.25rem; padding: 0.16rem 0.4rem; color: #9cafc5; border-radius: 5px; background: rgba(255, 255, 255, 0.06); font-size: 0.72rem; } .instance-context-badges { display: flex; gap: 0.35rem; flex-wrap: wrap; } .instance-context-badges span { padding: 0.22rem 0.48rem; color: #c4d3e2; border: 1px solid rgba(153, 177, 202, 0.18); border-radius: 7px; background: rgba(255, 255, 255, 0.06); font-size: 0.7rem; } .instance-header-actions { display: flex; align-items: center; justify-content: flex-end; gap: 0.6rem; margin-top: 0.65rem; color: #8fa4ba; font-size: 0.74rem; } .instance-header-actions a { min-height: var(--button-height-compact); display: inline-flex; align-items: center; padding: 0.3rem 0.55rem; color: var(--button-secondary-text); color: #d8e5f2; border: 1px solid var(--button-secondary-border); border-radius: var(--button-radius-compact); background: var(--button-secondary-bg); text-decoration: none; } .instance-header-actions a:hover { color: var(--button-secondary-hover-text); border-color: var(--button-secondary-hover-border); background: var(--button-secondary-hover-bg); } .instance-context nav { margin: 0.8rem -1.1rem 0; overflow-x: auto; border-top: 1px solid rgba(153, 177, 202, 0.12); } .instance-context nav ul { width: max-content; display: flex; gap: 0.15rem; margin: 0; padding: 0.45rem 1.1rem 0; list-style: none; } .instance-context nav a { min-height: var(--button-height); display: inline-flex; align-items: center; padding: 0.5rem 0.7rem; color: #95a9be; border-radius: var(--button-radius-compact) var(--button-radius-compact) 0 0; text-decoration: none; font-size: 0.78rem; font-weight: 800; } .instance-context nav a[aria-current='page'] { color: #fff; background: rgba(49, 91, 234, 0.28); box-shadow: inset 0 -2px #7795ff; } .instance-module-detail { min-width: 0; padding: clamp(1rem, 1.5vw, 1.35rem); border: 1px solid var(--line); border-radius: 14px; background: #fff; box-shadow: var(--shadow-sm); } .instance-module-detail > h2 { margin-bottom: 0.9rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--line); } [data-capability-state='degraded'] { padding: 0.7rem; color: #8b610e; border-radius: 8px; background: var(--warning-soft); } /* Generic module cards */ .overview-system, .cellular-module, .device-network-module, .calls-module, .esim-module, .notifications-module, .automation-module, .ota-module { display: grid; gap: 0.8rem; } .overview-grid, .cellular-grid, .device-network-grid, .calls-grid, .notifications-grid, .automation-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr)); gap: 0.75rem; } .overview-card, .cellular-card, .device-network-card, .calls-card, .esim-card, .notifications-card, .automation-card, .ota-card, .overview-operations { min-width: 0; padding: 0.9rem; border: 1px solid var(--line); border-radius: 11px; background: #fff; box-shadow: var(--shadow-sm); } .overview-card h2, .cellular-card h2, .device-network-card h2, .calls-card h2, .esim-card h2, .notifications-card h2, .automation-card h2, .ota-card h2, .overview-operations h2 { margin-bottom: 0.65rem; } .overview-card dl, .cellular-card dl, .device-network-card dl, .calls-card dl, .esim-card dl, .notifications-card dl, .automation-card dl, .ota-card dl { margin: 0; } .overview-card dl div, .cellular-card dl div, .device-network-card dl div, .calls-card dl div, .esim-card dl div, .notifications-card dl div, .automation-card dl div, .ota-card dl div { display: flex; justify-content: space-between; gap: 1rem; padding: 0.5rem 0; border-bottom: 1px solid #edf0f3; } .overview-card dl div:last-child, .cellular-card dl div:last-child, .device-network-card dl div:last-child, .calls-card dl div:last-child, .esim-card dl div:last-child, .notifications-card dl div:last-child, .automation-card dl div:last-child, .ota-card dl div:last-child { border-bottom: 0; } .cellular-card-note { margin: -0.2rem 0 0.6rem; color: var(--muted); font-size: 0.75rem; } .cell-location-payload { margin: 0 0 0.65rem; padding: 0.6rem 0.7rem; border: 1px solid var(--line); border-radius: 9px; background: #f7f8fa; color: #2b3a4d; font-family: var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace); font-size: 0.72rem; line-height: 1.5; white-space: pre-wrap; word-break: break-all; overflow-x: auto; } dt { color: var(--muted); font-size: 0.75rem; } dd { margin: 0; color: #2b3c51; font-weight: 750; text-align: right; overflow-wrap: anywhere; } .overview-operations { background: var(--surface-soft); } .device-module-state { margin-left: 0.5rem; color: var(--faint); font-size: 0.68rem; font-weight: 700; vertical-align: middle; } .device-action-card { grid-column: 1 / -1; background: var(--surface-soft); } .device-action-list { margin: 0; padding: 0; list-style: none; display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 17rem), 1fr)); gap: 0.6rem; align-items: start; } .device-action { min-width: 0; padding: 0.7rem 0.75rem; border: 1px solid var(--line); border-radius: 10px; background: #fff; } .device-action-r3 { border-color: #e8bbb8; background: var(--danger-soft); } .device-action-head { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; } .device-action-head button { min-width: 0; max-width: 100%; justify-content: flex-start; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .device-action-risk { display: inline-flex; align-items: center; gap: 0.2rem; flex: none; color: var(--faint); font-size: 0.66rem; font-weight: 800; } .device-action-r2 .device-action-risk { color: var(--warning); } .device-action-r3 .device-action-risk { color: var(--danger); } .device-action-note { margin: 0.4rem 0 0; color: var(--muted); font-size: 0.74rem; line-height: 1.5; } .device-action-banner { display: flex; gap: 0.4rem; align-items: flex-start; margin: 0.55rem 0 0; padding: 0.5rem 0.6rem; border: 1px solid rgba(168, 64, 59, 0.2); border-radius: 10px; color: #98393a; background: rgba(253, 233, 231, 0.72); font-size: 0.74rem; line-height: 1.5; } .device-action-banner svg { width: 0.9rem; height: 0.9rem; flex: none; margin-top: 0.1rem; } .device-action-held { display: flex; gap: 0.35rem; align-items: center; color: #a3413c; } .device-action-held svg { width: 0.85rem; height: 0.85rem; flex: none; } .device-action-form { display: grid; gap: 0.55rem; margin-top: 0.65rem; padding-top: 0.65rem; border-top: 1px dashed var(--line-strong); } .device-action-field { display: grid; gap: 0.25rem; } .device-action-field > span { color: var(--muted); font-size: 0.72rem; font-weight: 700; } .device-action-field input, .device-action-field select { min-width: 0; width: 100%; } .device-action-field small { color: var(--faint); font-size: 0.66rem; } .device-action-toggle { display: flex; align-items: center; gap: 0.45rem; color: var(--ink); font-size: 0.76rem; font-weight: 700; } .device-action-toggle input { flex: none; width: 1rem; height: 1rem; } .device-action-result { margin: 0.55rem 0 0; padding: 0.4rem 0.55rem; border-radius: 8px; font-size: 0.74rem; line-height: 1.5; overflow-wrap: anywhere; } .device-action-result.is-ok { color: #0f6f57; background: var(--success-soft); } .device-action-result.is-error { color: #a33d39; background: #ffe7e5; } .overview-resource-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr)); gap: 0.6rem; } .overview-resource-card { min-width: 0; min-height: 6rem; display: grid; align-content: center; gap: 0.3rem; padding: 0.75rem; border: 1px solid var(--line); border-radius: 10px; background: #fff; } .overview-resource-card span { color: var(--muted); font-size: 0.72rem; } .overview-resource-card strong { color: #24364b; font-size: 1.02rem; overflow-wrap: anywhere; } .overview-resource-card meter { width: 100%; height: 0.45rem; accent-color: var(--primary); } .overview-resource-phone { grid-column: span 2; } .device-network-grid article { padding: 0.75rem; border: 1px solid var(--line); border-radius: 9px; background: var(--surface-soft); } /* Tables and filters */ .fleet-toolbar:not([role='search']), .jobs-toolbar { display: flex; align-items: end; gap: 0.6rem; flex-wrap: wrap; margin: 0.8rem 0; padding: 0.8rem; border: 1px solid var(--line); border-radius: 11px; background: var(--surface-soft); } .fleet-toolbar:not([role='search']) label, .jobs-toolbar label { min-width: min(100%, 10rem); } .jobs-action-alert, .jobs-action-status { margin: 0.55rem 0 0; padding: 0.5rem 0.7rem; border-radius: 10px; font-size: 0.8rem; } .jobs-action-alert { border: 1px solid var(--danger); background: var(--danger-soft); color: var(--danger); } .jobs-action-status { border: 1px solid var(--line); background: var(--surface-soft); color: var(--muted); } .table-scroll { max-width: 100%; overflow: auto; border: 1px solid var(--line); border-radius: 11px; background: #fff; } .dense-table { width: 100%; border-collapse: collapse; font-size: 0.78rem; } .dense-table th, .dense-table td { padding: 0.7rem 0.75rem; border-bottom: 1px solid #e9edf1; text-align: left; vertical-align: top; } .dense-table th { position: sticky; top: 0; z-index: 1; color: #526176; background: #f2f5f7; font-size: 0.7rem; letter-spacing: 0.02em; } .dense-table th button { min-height: var(--button-height-compact); padding: 0.2rem 0.35rem; border: 0; background: transparent; box-shadow: none; } .dense-table tbody tr:hover { background: #f7f9fc; } .dense-table tbody tr:last-child td { border-bottom: 0; } main ul[aria-label='已配置实例'] { display: grid; grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr)); gap: 0.75rem; padding: 0; list-style: none; } main ul[aria-label='已配置实例'] > li { padding: 0.9rem; border: 1px solid var(--line); border-radius: 11px; background: #fff; } /* Messages */ .messages-workbench { min-height: 35rem; display: grid; grid-template-columns: minmax(15rem, 19rem) minmax(0, 1fr); overflow: hidden; border: 1px solid var(--line); border-radius: 12px; background: #fff; } .conversation-panel { min-width: 0; border-right: 1px solid var(--line); background: #fafbfc; } .conversation-panel-header, .conversation-detail-header { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; padding: 0.8rem; border-bottom: 1px solid var(--line); } .conversation-panel-header h2, .conversation-detail-header h2 { margin: 0; } .conversation-panel-header span, .conversation-detail-header small { color: var(--muted); font-size: 0.7rem; } .conversation-state { padding: 1rem; color: var(--muted); } .conversation-list, .message-thread { margin: 0; padding: 0; list-style: none; } .conversation-list { display: grid; gap: 0.2rem; padding: 0.45rem; } .conversation-entry { width: 100%; min-width: 0; display: grid; gap: 0.25rem; padding: 0.65rem; border: 0; border-radius: 8px; background: transparent; box-shadow: none; text-align: left; } .conversation-entry:hover, .conversation-entry[aria-pressed='true'] { color: var(--primary); background: var(--primary-soft); } .conversation-entry-title { display: flex; justify-content: space-between; gap: 0.5rem; } .conversation-entry time, .conversation-entry small { color: var(--muted); font-size: 0.66rem; } .conversation-entry > span:not(.conversation-entry-title) { overflow: hidden; color: #617085; font-size: 0.74rem; text-overflow: ellipsis; white-space: nowrap; } .conversation-detail { min-width: 0; display: flex; flex-direction: column; } .conversation-empty-state { margin: auto; padding: 2rem; color: var(--muted); text-align: center; } .message-thread { flex: 1; display: flex; flex-direction: column; gap: 0.65rem; overflow-y: auto; padding: 1rem; background: #f7f9fb; } .message-bubble { width: min(85%, 36rem); padding: 0.7rem 0.8rem; border: 1px solid var(--line); border-radius: 11px; background: #fff; } .message-bubble header { display: flex; justify-content: space-between; gap: 0.5rem; } .message-bubble header, .message-bubble small { color: var(--muted); font-size: 0.66rem; } .message-bubble p { margin: 0.45rem 0; color: #2d3d51; white-space: pre-wrap; } .message-发送 { align-self: flex-end; border-color: #cbd6fa; background: var(--primary-soft); } .message-收到 { align-self: flex-start; } .message-composer { padding: 0.8rem; border-top: 1px solid var(--line); background: #fff; } .message-composer label { display: grid; gap: 0.3rem; } .message-composer textarea { width: 100%; min-height: 5rem; resize: vertical; } .composer-footer { display: flex; align-items: center; justify-content: space-between; gap: 0.7rem; margin-top: 0.55rem; } .send-confirmation { margin-top: 0.65rem; padding: 0.7rem; border: 1px solid #ecd59c; border-radius: 9px; background: var(--warning-soft); } .dialog-backdrop { position: fixed; inset: 0; z-index: 60; display: grid; place-items: center; padding: 1rem; background: rgba(16, 28, 44, 0.48); backdrop-filter: blur(4px); } .new-conversation-dialog { width: min(100%, 28rem); padding: 1rem; border: 1px solid var(--line); border-radius: 13px; background: #fff; box-shadow: var(--shadow-lg); } .new-conversation-dialog label { display: grid; gap: 0.3rem; } .new-conversation-dialog input { width: 100%; } /* Auth */ .auth-screen { min-height: 100vh; display: grid; place-items: center; padding: 1.25rem; background: radial-gradient(circle at 20% 10%, rgba(49, 91, 234, 0.22), transparent 32rem), #142137; } .auth-card { width: min(100%, 27rem); padding: 1.5rem; color: #d7e1ed; border: 1px solid rgba(157, 177, 201, 0.18); border-radius: 15px; background: #1a2a41; box-shadow: 0 25px 65px rgba(6, 14, 26, 0.35); } .auth-card h1 { color: #fff; } .auth-card form { display: grid; gap: 0.75rem; margin-top: 1rem; } .auth-card input { width: 100%; } @media (max-width: 70rem) { .fleet-workspace, .fleet-workspace.is-sidebar-collapsed { grid-template-columns: 15.5rem minmax(0, 1fr); } .fleet-card-grid { grid-template-columns: repeat(auto-fill, minmax(min(100%, 19rem), 1fr)); } } @media (max-width: 60rem) { .app-topbar { flex-wrap: wrap; } .product-name { margin-right: auto; } .global-navigation { order: 3; width: 100%; justify-content: center; margin-inline: 0; } .fleet-workspace, .fleet-workspace.is-sidebar-collapsed { grid-template-columns: 1fr; } .fleet-sidebar { position: static; max-height: none; } .fleet-sidebar.is-collapsed { min-height: auto; } .fleet-sidebar.is-collapsed .fleet-sidebar-header { justify-content: space-between; } .fleet-sidebar.is-collapsed .fleet-sidebar-header > div { display: block; } .messages-workbench { grid-template-columns: 15rem minmax(0, 1fr); } } @media (max-width: 48rem) { .app-topbar { min-height: 0; gap: 0.55rem; padding: 0.55rem 0.75rem; } .connection-status { display: none; } .product-mark { width: 2.4rem; height: 2.4rem; } .global-navigation { justify-content: stretch; } .global-navigation a { flex: 1 1 0; justify-content: center; padding-inline: 0.35rem; } .app-layout { padding: 0.45rem; } main { min-height: calc(100vh - 5rem); padding: 0.8rem; border-radius: 13px; } .fleet-heading, main > section > header, .page-heading { align-items: flex-start; } .fleet-actions { width: 100%; } .fleet-results-header { align-items: stretch; } .fleet-toolbar-controls { width: 100%; } .fleet-card { min-height: 0; } .messages-workbench { min-height: 30rem; grid-template-columns: 1fr; } .conversation-panel { max-height: 17rem; overflow: auto; border-right: 0; border-bottom: 1px solid var(--line); } .instance-identity { align-items: flex-start; } .instance-context nav { margin-inline: -1.1rem; } .overview-resource-phone { grid-column: auto; } } /* Warm operations workbench: final operational surface rules. */ :root { --workbench-bg: #f3f0e7; --workbench-surface: #fffdf7; --workbench-surface-muted: #f8f4e8; --workbench-border: #d9d1bf; --workbench-border-strong: #bdb29d; --workbench-text: #584a38; --workbench-muted: #6f6350; --workbench-mint: #0f6e66; --workbench-mint-soft: #dff3e8; --workbench-yellow: #f7cd67; --workbench-warning-text: #825f0c; --workbench-warning-soft: #fdf1d2; --workbench-mint-border: #b3d7c6; --workbench-warning-border: #e5cd96; --workbench-danger-border: #e0b7b2; --workbench-danger: #b64d48; --workbench-danger-soft: #f9e5e2; font-family: Nunito, 'Noto Sans SC', -apple-system, BlinkMacSystemFont, 'PingFang SC', sans-serif; color: var(--workbench-text); background: var(--workbench-bg); } body, .app-shell { min-height: 100vh; color: var(--workbench-text); background: var(--workbench-bg); letter-spacing: 0; } .app-topbar { min-height: 3.5rem; height: 3.5rem; padding: 0 1rem; border: 0; border-bottom: 1px solid var(--workbench-border); background: var(--workbench-surface); box-shadow: none; backdrop-filter: none; } .product-name { min-width: 12rem; } .product-mark { width: 2rem; height: 2rem; border: 1px solid #d3ad4d; border-radius: 10px; background: var(--workbench-yellow); box-shadow: none; } .product-copy strong { color: var(--workbench-text); font-size: 0.9rem; line-height: 1.15; letter-spacing: 0; } .global-navigation { align-self: stretch; gap: 0.15rem; padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; backdrop-filter: none; } .global-navigation a { min-height: 3.5rem; padding: 0 0.85rem; border: 0; border-bottom: 2px solid transparent; border-radius: 0; color: var(--workbench-muted); background: transparent; transition: color 150ms ease, border-color 150ms ease, background-color 150ms ease; } .global-navigation a:hover { color: var(--workbench-text); background: var(--workbench-surface-muted); } .global-navigation a[aria-current='page'] { color: var(--workbench-mint); border-bottom-color: var(--workbench-mint); background: transparent; box-shadow: none; } .app-layout, .app-layout.app-layout-single { padding: 1.25rem clamp(1rem, 2vw, 1.5rem) 2rem; } main { padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; } .fleet-heading, .workbench-heading { min-height: 3.25rem; display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin: 0 0 0.9rem; padding: 0; border: 0; } .fleet-heading h1, .workbench-heading h1 { margin: 0; color: var(--workbench-text); font-size: 1.45rem; line-height: 1.2; font-weight: 800; letter-spacing: 0; } .fleet-heading p, .workbench-heading p { margin: 0.22rem 0 0; color: var(--workbench-muted); font-size: 0.82rem; } .fleet-actions, .topbar-actions { align-items: center; } button.primary-action, a.primary-action { min-height: var(--button-height); padding: 0.45rem 0.95rem; border: 1px solid var(--button-primary-bg); border-radius: var(--button-radius); color: var(--button-primary-text); background: var(--button-primary-bg); box-shadow: 0 3px 0 var(--button-primary-active); font: inherit; font-weight: 750; letter-spacing: 0; cursor: pointer; transition: border-color 150ms ease, color 150ms ease, background-color 150ms ease, box-shadow 150ms ease, transform 100ms ease; } button.primary-action:hover:not(:disabled), a.primary-action:hover { border-color: var(--button-primary-hover); background: var(--button-primary-hover); transform: translateY(-1px); } button.primary-action:active:not(:disabled), a.primary-action:active { border-color: var(--button-primary-active); background: var(--button-primary-active); box-shadow: 0 1px 0 var(--button-primary-active); transform: translateY(1px); } .fleet-workspace, .fleet-workspace.is-sidebar-collapsed { display: block; } .fleet-sidebar, .fleet-sidebar.is-collapsed { position: static; width: 100%; margin: 0 0 1rem; padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; backdrop-filter: none; } .fleet-sidebar-header { display: none; } .fleet-sidebar-content { display: grid; gap: 0.75rem; } .fleet-status-summary-rail { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); overflow: hidden; border: 1px solid var(--workbench-border); border-radius: 14px; background: var(--workbench-surface); } .fleet-status-summary > div { min-height: 3.4rem; padding: 0.65rem 0.85rem; border: 0; border-right: 1px solid var(--workbench-border); background: transparent; } .fleet-status-summary > div:last-child { border-right: 0; } .fleet-status-summary strong { color: var(--workbench-text); } .fleet-toolbar[role='search'] { padding: 0.7rem; border: 1px solid var(--workbench-border); border-radius: 14px; background: var(--workbench-surface); box-shadow: none; } .fleet-results-header { min-height: 2.8rem; padding: 0 0 0.65rem; border: 0; border-bottom: 1px solid var(--workbench-border); } .fleet-card-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.85rem; } .fleet-card, .fleet-card:hover, .fleet-card.is-selected { min-width: 0; padding: 1rem; border: 1px solid var(--workbench-border); border-radius: 16px; background: var(--workbench-surface); box-shadow: none; backdrop-filter: none; transform: none; } .fleet-card:hover { border-color: var(--workbench-border-strong); } .fleet-card.is-selected { border-color: var(--workbench-mint); background: #f4fbf7; box-shadow: inset 0 0 0 1px var(--workbench-mint); } .fleet-card > header { border-color: var(--workbench-border); } .fleet-node-avatar, .fleet-card[data-status] .fleet-node-avatar { box-shadow: none; } .fleet-card-sms { background: transparent; } .fleet-card-admin-actions { border-color: var(--workbench-border); } .batch-entry { border: 1px solid #a8d4c5; border-radius: 14px; background: var(--workbench-mint-soft); box-shadow: none; } .state-panel, .state-panel:hover { border: 1px solid var(--workbench-border); border-radius: 14px; background: var(--workbench-surface); box-shadow: none; backdrop-filter: none; } .app-footer { margin: 0; padding: 0.8rem 1rem; border-top: 1px solid var(--workbench-border); color: var(--workbench-muted); background: var(--workbench-surface); } .app-footer p { margin: 0 auto; padding: 0; } /* Automation */ .automation-workspace { min-width: 0; } .workbench-tabs { display: flex; gap: 0.2rem; margin-bottom: 0.85rem; border-bottom: 1px solid var(--workbench-border); } .workbench-tabs button { min-height: var(--button-height-large); padding: 0 0.75rem; border: 0; border-bottom: 2px solid transparent; border-radius: var(--button-radius-compact) var(--button-radius-compact) 0 0; color: var(--workbench-muted); background: transparent; font: inherit; font-size: 0.8rem; font-weight: 700; cursor: pointer; } .workbench-tabs button[aria-selected='true'] { color: var(--workbench-mint); border-bottom-color: var(--workbench-mint); } .automation-empty { min-height: 10rem; display: grid; place-content: center; gap: 0.35rem; padding: 1.5rem; border: 1px dashed var(--workbench-border-strong); border-radius: 14px; color: var(--workbench-muted); text-align: center; background: var(--workbench-surface-muted); } .automation-empty strong { color: var(--workbench-text); } .schedule-table-wrap { overflow: auto; border: 1px solid var(--workbench-border); border-radius: 14px; background: var(--workbench-surface); } .schedule-table { width: 100%; min-width: 56rem; border-collapse: collapse; font-size: 0.82rem; } .schedule-table th, .schedule-table td { padding: 0.72rem 0.75rem; border-bottom: 1px solid #e8e2d5; color: var(--workbench-text); text-align: left; vertical-align: middle; } .schedule-table thead th { color: var(--workbench-muted); background: var(--workbench-surface-muted); font-size: 0.72rem; font-weight: 800; } .schedule-table tbody tr:last-child > * { border-bottom: 0; } .schedule-table tbody tr:hover { background: #faf8f1; } .schedule-table th small { display: block; margin-top: 0.15rem; color: var(--workbench-muted); } .schedule-table code { font-family: ui-monospace, 'SFMono-Regular', Consolas, monospace; font-size: 0.76rem; } .operation-chip { display: inline-flex; min-height: 1.6rem; align-items: center; padding: 0 0.55rem; border: 1px solid #a8d4c5; border-radius: 999px; color: #176d64; background: var(--workbench-mint-soft); white-space: nowrap; } .operation-chip[data-operation='send-sms'] { color: #725912; border-color: #e5c86f; background: #fff3c9; } .operation-chip[data-operation='reboot-system'] { color: #8e3d39; border-color: #e7aaa6; background: var(--workbench-danger-soft); } .row-action-menu { position: relative; display: grid; justify-items: end; } button.row-action-trigger { width: var(--icon-button-size); min-height: var(--icon-button-size); display: grid; place-items: center; padding: 0; border-radius: var(--button-radius); } .row-action-trigger svg { width: 1rem; height: 1rem; } .row-actions { min-width: 8rem; display: grid; gap: 0.15rem; padding: 0.35rem; border: 1px solid var(--workbench-border); border-radius: 8px; background: var(--workbench-surface); box-shadow: 0 10px 24px rgba(68, 55, 38, 0.12); } .row-actions button { width: 100%; min-height: 2.75rem; text-align: left; border: 0; color: var(--workbench-mint); background: transparent; cursor: pointer; } .row-actions .danger-link { color: var(--workbench-danger); } .compact-switch { position: relative; display: inline-block; width: 2.75rem; height: 2.75rem; } .compact-switch input { position: absolute; opacity: 0; } .compact-switch span { position: absolute; top: 50%; left: 50%; width: 2.4rem; height: 1.45rem; transform: translate(-50%, -50%); border: 1px solid #bcb3a2; border-radius: 999px; background: #d9d3c7; transition: background-color 150ms ease; } .compact-switch span::after { content: ''; position: absolute; top: 0.15rem; left: 0.16rem; width: 1rem; height: 1rem; border-radius: 50%; background: #fff; transition: transform 150ms ease; } .compact-switch input:checked + span { border-color: var(--workbench-mint); background: var(--workbench-mint); } .compact-switch input:checked + span::after { transform: translateX(0.92rem); } .compact-switch input:focus-visible + span { outline: 3px solid var(--button-focus-ring); outline-offset: 2px; } .drawer-backdrop { position: fixed; z-index: 100; inset: 0; display: flex; justify-content: flex-end; background: rgba(56, 47, 36, 0.28); } .schedule-drawer { width: min(34rem, 100%); height: 100%; overflow: auto; border-left: 1px solid var(--workbench-border); background: var(--workbench-surface); box-shadow: -10px 0 28px rgba(56, 47, 36, 0.12); animation: drawer-in 180ms ease-out; } @keyframes drawer-in { from { opacity: 0; transform: translateX(1rem); } to { opacity: 1; transform: translateX(0); } } .schedule-drawer > header { position: sticky; z-index: 2; top: 0; display: flex; align-items: center; justify-content: space-between; padding: 1rem 1.1rem; border-bottom: 1px solid var(--workbench-border); background: var(--workbench-surface); } .schedule-drawer h2, .schedule-drawer h3 { margin: 0; color: var(--workbench-text); letter-spacing: 0; } .schedule-drawer h2 { font-size: 1.15rem; } .schedule-drawer h3 { margin-bottom: 0.75rem; font-size: 0.82rem; } button.icon-button, a.icon-button { width: var(--icon-button-size); height: var(--icon-button-size); min-height: var(--icon-button-size); padding: 0; border: 1px solid transparent; border-radius: var(--button-radius); color: var(--workbench-muted); background: var(--workbench-surface-muted); box-shadow: none; font-size: 1.2rem; cursor: pointer; } button.icon-button:hover:not(:disabled), a.icon-button:hover { color: var(--button-secondary-hover-text); border-color: var(--button-secondary-hover-border); background: var(--button-secondary-hover-bg); } .icon-button svg { width: 1.1rem; height: 1.1rem; } .schedule-drawer form > section, .schedule-drawer details { padding: 1rem 1.1rem; border-bottom: 1px solid var(--workbench-border); } .schedule-drawer label { display: grid; gap: 0.35rem; margin-top: 0.7rem; color: var(--workbench-muted); font-size: 0.75rem; font-weight: 700; } .schedule-drawer input, .schedule-drawer select, .schedule-drawer textarea { width: 100%; min-height: var(--button-height-large); padding: 0.58rem 0.72rem; border: 1px solid var(--workbench-border-strong); border-radius: var(--field-radius); color: var(--workbench-text); background: var(--field-bg); font: inherit; letter-spacing: 0; } .schedule-drawer textarea { resize: vertical; } .schedule-drawer input:focus, .schedule-drawer select:focus, .schedule-drawer textarea:focus { border-color: var(--field-focus-border); outline: 3px solid var(--button-focus-ring); } .field-block { margin-top: 0.7rem; } .field-block label { margin-top: 0; } .field-block .field-note { display: block; margin-top: 0.3rem; line-height: 1.5; } .inline-field { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0.45rem; } .inline-field button { min-height: var(--button-height-compact); border: 1px solid var(--workbench-border-strong); border-radius: 10px; color: var(--workbench-text); background: var(--workbench-surface-muted); cursor: pointer; } .field-note { margin: 0.45rem 0 0; color: var(--workbench-muted); font-size: 0.72rem; } .segmented-control { display: flex; gap: 0.25rem; margin-bottom: 0.7rem; padding: 0.22rem; border: 1px solid var(--workbench-border-strong); border-radius: 12px; background: var(--workbench-surface-muted); } .segmented-control button { flex: 1 1 0; min-height: var(--button-height-compact); padding: 0.3rem 0.7rem; border: 1px solid transparent; border-radius: var(--button-radius-compact); color: var(--button-secondary-text); background: transparent; font: inherit; font-size: 0.76rem; font-weight: 750; cursor: pointer; } .segmented-control button.is-active { border-color: var(--button-secondary-border); color: var(--button-secondary-text); background: var(--button-secondary-bg); } .segmented-control button:focus-visible { outline: 3px solid var(--button-focus-ring); } .weekday-picker { display: flex; flex-wrap: wrap; gap: 0.3rem 0.55rem; margin: 0 0 0.7rem; padding: 0.6rem 0.7rem; border: 1px solid var(--workbench-border); border-radius: 10px; } .weekday-picker legend { padding: 0 0.3rem; color: var(--workbench-muted); font-size: 0.72rem; font-weight: 700; } .weekday-option { display: inline-flex; gap: 0.25rem; align-items: center; margin: 0; font-size: 0.78rem; font-weight: 700; } .weekday-option input { width: auto; min-height: 1.1rem; accent-color: var(--workbench-mint); } .schedule-drawer input:disabled { color: var(--workbench-muted); background: var(--workbench-surface-muted); cursor: not-allowed; } .cron-preview { margin: 0.7rem 0 0; padding-left: 1.4rem; color: var(--workbench-muted); font-size: 0.76rem; } .risk-confirm { grid-template-columns: auto 1fr; align-items: start; padding: 0.65rem; border: 1px solid #e5c86f; border-radius: 10px; background: #fff3c9; } .risk-confirm input { width: 1.1rem; min-height: 1.1rem; margin-top: 0.1rem; } .risk-confirm:has(input:disabled) { opacity: 1; } .schedule-drawer .schedule-confirmation { background: #f3faf6; } .schedule-confirmation dl { display: grid; grid-template-columns: 1fr 1fr; gap: 0.65rem 1rem; margin: 0; } .schedule-confirmation dl > div { min-width: 0; } .schedule-confirmation dt { color: var(--workbench-muted); font-size: 0.68rem; font-weight: 700; } .schedule-confirmation dd { margin: 0.2rem 0 0; color: var(--workbench-text); font-size: 0.8rem; font-weight: 750; overflow-wrap: anywhere; } .schedule-drawer details summary { min-height: 2.5rem; display: flex; align-items: center; color: var(--workbench-text); font-weight: 800; cursor: pointer; } .advanced-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0 0.7rem; } .schedule-drawer form > footer { position: sticky; bottom: 0; display: flex; justify-content: flex-end; gap: 0.55rem; padding: 0.8rem 1.1rem; border-top: 1px solid var(--workbench-border); background: var(--workbench-surface); } .schedule-drawer form > footer > button:not(.primary-action) { min-height: 2.5rem; padding: 0 0.9rem; border: 1px solid var(--workbench-border-strong); border-radius: 10px; color: var(--workbench-text); background: #fff; cursor: pointer; } .organization-drawer > section { padding: 1rem 1.1rem; border-bottom: 1px solid var(--workbench-border); } .organization-alert { margin: 0.8rem 1.1rem 0; padding: 0.6rem 0.75rem; border: 1px solid #e0a3a3; border-radius: 10px; color: #98393a; background: #fdf0ef; font-size: 0.78rem; } .organization-editor { padding: 1rem 1.1rem; border-bottom: 1px solid var(--workbench-border); background: var(--workbench-surface-muted); } .organization-editor h3 { margin: 0 0 0.2rem; font-size: 0.86rem; } .organization-section-head { display: flex; align-items: center; justify-content: space-between; gap: 0.6rem; margin-bottom: 0.5rem; } .organization-add { display: inline-flex; gap: 0.35rem; align-items: center; min-height: var(--button-height-compact); padding: 0.3rem 0.7rem; border: 1px solid var(--workbench-border-strong); border-radius: var(--button-radius-compact); color: var(--button-secondary-text); background: var(--button-secondary-bg); font: inherit; font-size: 0.76rem; font-weight: 750; cursor: pointer; } .organization-add:hover { color: var(--button-secondary-hover-text); border-color: var(--button-secondary-hover-border); background: var(--button-secondary-hover-bg); } .organization-add svg { width: 0.85rem; height: 0.85rem; } .organization-list { margin: 0; padding: 0; list-style: none; } .organization-list > li { display: flex; gap: 0.5rem; align-items: center; padding: 0.55rem 0; border-bottom: 1px dashed var(--workbench-border); } .organization-list > li:last-child { border-bottom: 0; } .organization-row-main { display: grid; flex: 1 1 auto; gap: 0.15rem; min-width: 0; } .organization-row-main strong { display: flex; gap: 0.4rem; align-items: center; color: var(--workbench-text); font-size: 0.84rem; overflow-wrap: anywhere; } .organization-row-main small { color: var(--workbench-muted); font-size: 0.72rem; overflow-wrap: anywhere; } .organization-list .icon-button { width: var(--icon-button-size); height: var(--icon-button-size); flex: none; } .organization-list .icon-button svg { width: 0.9rem; height: 0.9rem; } .organization-list .icon-button.danger { color: var(--button-danger-bg); } .organization-list .icon-button:disabled { color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); opacity: 1; cursor: not-allowed; } .organization-empty { margin: 0; color: var(--workbench-muted); font-size: 0.78rem; } .identity-drawer .identity-summary { margin: 0.15rem 0 0; color: var(--workbench-muted); font-size: 0.74rem; } .identity-toolbar { display: flex; gap: 0.5rem; align-items: center; padding: 0.75rem 1.1rem; border-bottom: 1px solid var(--workbench-border); } .identity-toolbar button:first-child { min-height: var(--button-height-compact); display: inline-flex; align-items: center; gap: 0.35rem; padding: 0.3rem 0.7rem; border: 1px solid var(--workbench-border); border-radius: var(--button-radius-compact); color: var(--workbench-muted); background: #fff; font: inherit; font-size: 0.75rem; font-weight: 700; cursor: pointer; } .identity-toolbar button:first-child.is-active { color: #98393a; border-color: #e0a3a3; background: #fdf0ef; } .identity-notice { margin: 0.75rem 1.1rem 0; padding: 0.55rem 0.7rem; border: 1px solid var(--workbench-border-strong); border-radius: 10px; color: var(--workbench-text); background: var(--workbench-surface-muted); font-size: 0.76rem; } .identity-list { display: grid; gap: 0.7rem; margin: 0; padding: 0.9rem 1.1rem; list-style: none; } .identity-card { display: grid; gap: 0.55rem; padding: 0.8rem 0.85rem; border: 1px solid var(--workbench-border); border-radius: 12px; background: #fff; } .identity-card.identity-pending { border-color: #e0a3a3; background: #fdf6f5; } .identity-card-head { display: flex; gap: 0.5rem; align-items: center; justify-content: space-between; } .identity-card-head strong { color: var(--workbench-text); font-size: 0.86rem; overflow-wrap: anywhere; } .identity-fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.35rem 0.8rem; margin: 0; } .identity-fields > div { display: flex; gap: 0.4rem; align-items: baseline; min-width: 0; } .identity-fields dt { color: var(--workbench-muted); font-size: 0.7rem; white-space: nowrap; } .identity-fields dd { margin: 0; color: var(--workbench-text); font-size: 0.76rem; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; } .identity-changes, .identity-reasons { display: grid; gap: 0.3rem; margin: 0; padding: 0; list-style: none; font-size: 0.75rem; } .identity-changes li { display: flex; gap: 0.45rem; align-items: baseline; flex-wrap: wrap; } .identity-changes span { color: var(--workbench-muted); } .identity-changes s { color: #a3413c; } .identity-changes em { color: var(--workbench-text); font-style: normal; font-weight: 700; } .identity-reasons li { display: grid; gap: 0.15rem; color: #98393a; } .identity-reasons small { color: var(--workbench-muted); font-size: 0.72rem; overflow-wrap: anywhere; } .identity-fingerprints { display: flex; gap: 0.75rem; flex-wrap: wrap; margin: 0; color: var(--workbench-muted); font-size: 0.7rem; font-family: var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace); } .identity-actions { display: flex; gap: 0.5rem; justify-content: flex-end; } .identity-actions button { min-height: var(--button-height-compact); display: inline-flex; align-items: center; justify-content: center; gap: 0.35rem; padding: 0.3rem 0.7rem; border: 1px solid var(--button-secondary-border); border-radius: var(--button-radius-compact); color: var(--button-secondary-text); background: var(--button-secondary-bg); font: inherit; font-size: 0.76rem; font-weight: 750; cursor: pointer; } .identity-actions button:hover:not(:disabled) { color: var(--button-secondary-hover-text); border-color: var(--button-secondary-hover-border); background: var(--button-secondary-hover-bg); } .identity-actions button:disabled { color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); opacity: 1; cursor: not-allowed; } .identity-actions button.primary-action { color: var(--button-primary-text); border-color: var(--button-primary-bg); background: var(--button-primary-bg); } .identity-actions button.primary-action:hover:not(:disabled) { border-color: var(--button-primary-hover); background: var(--button-primary-hover); } .identity-actions button.primary-action:disabled { color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); } .identity-hint { margin: 0; padding: 0.8rem 1.1rem 1.1rem; border-top: 1px solid var(--workbench-border); color: var(--workbench-muted); font-size: 0.72rem; } .fleet-card-identity { display: grid; gap: 0.25rem; margin: 0; padding: 0.45rem 0.55rem; border: 1px solid rgba(168, 64, 59, 0.16); border-radius: 12px; background: rgba(253, 233, 231, 0.72); font-size: 0.74rem; } .fleet-card-identity small { color: #a3413c; } .device-context-drawer { max-width: min(34rem, 100%); } .device-context-eyebrow { display: flex; gap: 0.35rem; align-items: center; margin: 0; color: var(--workbench-muted); font-size: 0.7rem; font-weight: 700; text-transform: uppercase; } .device-context-content { padding: 1.1rem; } .device-context-section { margin-bottom: 1rem; padding: 0.85rem; border: 1px solid var(--workbench-border); border-radius: 8px; background: #fff; } .device-context-section dl { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.75rem; margin: 0; } .device-context-section dl > div { min-width: 0; } .device-context-section dt { margin-bottom: 0.2rem; color: var(--workbench-muted); font-size: 0.7rem; } .device-context-section dd { margin: 0; color: var(--workbench-text); font-size: 0.82rem; overflow-wrap: anywhere; } .device-context-section time { display: block; margin-top: 0.35rem; color: var(--workbench-muted); font-size: 0.72rem; } .device-context-actions { display: grid; grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr)); gap: 0.55rem; margin: 0; padding: 0; } .device-context-actions a { display: flex; gap: 0.45rem; align-items: center; min-height: 2.5rem; padding: 0 0.8rem; border: 1px solid var(--workbench-border); border-radius: 999px; color: var(--workbench-text); background: #fff; font-size: 0.78rem; font-weight: 700; text-decoration: none; } .device-context-actions a:hover { border-color: var(--workbench-border-strong); background: var(--workbench-surface-muted); } .device-context-primary { color: #fff; border-color: var(--workbench-mint); background: var(--workbench-mint); } .device-context-primary:hover { color: #fff; border-color: var(--workbench-mint); background: var(--workbench-mint); } .fleet-card-context-trigger { display: inline-flex; align-items: center; justify-content: center; width: var(--icon-button-size); height: var(--icon-button-size); min-height: var(--icon-button-size); border: 1px solid transparent; border-radius: 50%; color: var(--workbench-muted); background: transparent; cursor: pointer; } .fleet-card-context-trigger:hover { border-color: var(--workbench-border); color: var(--workbench-text); background: var(--workbench-surface-muted); } .device-context-backdrop { background: rgba(56, 47, 36, 0.24); backdrop-filter: blur(4px); } @media (max-width: 640px) { .device-context-section dl { grid-template-columns: minmax(0, 1fr); } } .color-picker { display: flex; flex-wrap: wrap; gap: 0.35rem; margin: 0.8rem 0 0; padding: 0; border: 0; } .color-picker legend { padding: 0; color: var(--workbench-muted); font-size: 0.75rem; font-weight: 700; } .color-picker button { display: inline-flex; gap: 0.3rem; align-items: center; padding: 0.3rem 0.55rem; border: 1px solid var(--workbench-border-strong); border-radius: 999px; background: #fff; cursor: pointer; } .color-picker button.is-active { border-color: var(--workbench-mint); box-shadow: 0 0 0 2px rgba(23, 143, 132, 0.18); } .color-swatch { width: 0.9rem; height: 0.9rem; border: 1px solid rgba(56, 47, 36, 0.18); border-radius: 4px; background: var(--workbench-surface-muted); } .color-swatch.color-default { background: repeating-linear-gradient( 135deg, #fff, #fff 3px, var(--workbench-border) 3px, var(--workbench-border) 6px ); } .color-swatch.color-coral { background: #f4623d; } .color-swatch.color-turquoise { background: #17a398; } .color-swatch.color-lime { background: #8fbf3f; } .color-swatch.color-yellow { background: #f2c14e; } .color-swatch.color-pink { background: #ef7fae; } .color-swatch.color-purple { background: #8d6fd1; } .color-swatch.color-blue { background: #3f8fd8; } @media (max-width: 70rem) { .fleet-card-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 48rem) { .app-topbar { height: auto; min-height: 3.5rem; flex-wrap: wrap; padding: 0.45rem 0.65rem; } .topbar-actions { margin-left: auto; } .global-navigation { order: 3; width: 100%; justify-content: stretch; } .global-navigation a { min-height: 2.75rem; flex: 1; justify-content: center; } .app-layout, .app-layout.app-layout-single { padding: 0.9rem 0.7rem 1.4rem; } .fleet-heading, .workbench-heading { align-items: flex-start; } .fleet-heading p, .workbench-heading p { display: none; } .fleet-status-summary-rail { display: grid; } .fleet-status-summary small { display: none; } .fleet-card-grid { grid-template-columns: 1fr; } .schedule-drawer { width: 100%; } .advanced-grid { grid-template-columns: 1fr; } .inline-field { grid-template-columns: 1fr; } } @media (prefers-reduced-motion: reduce) { .schedule-drawer { animation: none; } .primary-action, .global-navigation a, .workbench-tabs button, .compact-switch span, .compact-switch span::after { transition: none; } } @media (prefers-contrast: more) { .fleet-card, .fleet-sidebar, .schedule-table-wrap, .automation-empty, .schedule-drawer input, .schedule-drawer select, .schedule-drawer textarea { border-color: var(--workbench-text); } } @media (max-width: 34rem) { .version-badge { display: none; } .product-copy strong { font-size: 0.88rem; } .fleet-card-overview { grid-template-columns: 1fr; align-items: stretch; } .fleet-card-metrics { grid-template-columns: 1fr; } .fleet-card-metrics .fleet-card-phone { grid-column: auto; } .fleet-card-sms dl { grid-template-columns: 1fr; } .fleet-card-sms dl div:nth-child(3) { grid-column: auto; } .fleet-heading > *, .fleet-actions, .form-actions, .pagination { width: 100%; } } @media (max-width: 60rem) { .maintenance-summary, .maintenance-components { grid-template-columns: repeat(2, minmax(0, 1fr)); } .retention-grid { grid-template-columns: minmax(0, 1fr); } .maintenance-actions { grid-template-columns: minmax(0, 1fr); } } @media (max-width: 34rem) { .maintenance-summary, .maintenance-components { grid-template-columns: minmax(0, 1fr); } .retention-item { grid-template-columns: minmax(0, 1fr) 4rem 4.5rem; } .retention-item input[type='checkbox'] { width: 2rem; } } @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; } } /* Animal Island UI theme -------------------------------------------------- */ :root { font-family: Nunito, 'Noto Sans SC', 'PingFang SC', system-ui, sans-serif; color: #725d42; background: #e9f4df; --ink: #725d42; --muted: #756a58; --faint: #7d6f5c; --line: #ded4bf; --line-strong: #c9bda5; --surface: #fffdf5; --surface-soft: #f7f3df; --canvas: #e9f4df; --primary: #0f6e66; --primary-hover: #0d6259; --primary-soft: #e2f7f2; --cyan: #0f6e66; --success: #4a7d1f; --success-soft: #edf7df; --warning: #b58b0a; --warning-soft: #fff5cf; --danger: #a8403b; --danger-soft: #fde9e7; --field-bg: #fffdf7; --radius: 18px; --radius-sm: 14px; --shadow-sm: 0 2px 0 rgba(114, 93, 66, 0.08); --shadow: 0 8px 20px rgba(114, 93, 66, 0.09); --shadow-lg: 0 18px 38px rgba(114, 93, 66, 0.14); } * { letter-spacing: 0 !important; } html, body { background: var(--canvas); } body { color: var(--ink); } a { color: #0f6e66; } :focus-visible { outline-color: var(--button-focus-ring); } input:focus-visible, select:focus-visible, textarea:focus-visible { outline: 3px solid var(--button-focus-ring); border-color: #e5b70d; box-shadow: none; } button:not([class*='animal-']), input:not([class*='animal-']), select, textarea { border-color: var(--line-strong); border-radius: var(--button-radius); background: #fffdf7; } button:not([class*='animal-']):hover:not(:disabled) { color: var(--button-secondary-hover-text); border-color: var(--button-secondary-hover-border); background: var(--button-secondary-hover-bg); } /* * The primary action used to be declared with a bare `.primary-action` selector here, which * lost the cascade to `button:not([class*='animal-'])` above. That left white label text on the * cream secondary surface, so "立即投递" and "刷新" looked like empty pills. Every primary-action * rule now carries the element qualifier so it always outranks the generic button surface. */ button[type='submit']:not([class*='animal-']), button.primary-action, a.primary-action { min-height: var(--button-height); display: inline-flex; align-items: center; gap: 0.4rem; padding: 0.45rem 0.9rem; color: var(--button-primary-text); border-color: var(--button-primary-bg); border-radius: var(--button-radius); background: var(--button-primary-bg); font-size: 0.82rem; font-weight: 750; text-decoration: none; box-shadow: 0 3px 0 var(--button-primary-active); } button[type='submit']:not([class*='animal-']):hover:not(:disabled), button.primary-action:hover:not(:disabled), a.primary-action:hover { color: var(--button-primary-text); border-color: var(--button-primary-hover); background: var(--button-primary-hover); box-shadow: 0 4px 0 var(--button-primary-active); transform: translateY(-1px); } button[type='submit']:not([class*='animal-']):active:not(:disabled), button.primary-action:active:not(:disabled), a.primary-action:active { color: var(--button-primary-text); border-color: var(--button-primary-active); background: var(--button-primary-active); box-shadow: 0 1px 0 var(--button-primary-active); transform: translateY(1px); } button[type='submit']:not([class*='animal-']):disabled, button.primary-action:disabled, a.primary-action[aria-disabled='true'] { color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); box-shadow: none; transform: none; opacity: 1; } h1, h2, h3 { color: var(--ink); } h1 { font-size: clamp(1.35rem, 2vw, 1.8rem); } .app-cursor, .app-shell { min-height: 100vh; } .app-shell { position: relative; background: #e9f4df; } .app-topbar { min-height: 4.75rem; color: #725d42; border-bottom: 3px solid #56bda7; background: #a9dfc8; box-shadow: 0 5px 0 rgba(71, 139, 113, 0.18); backdrop-filter: none; } .product-name { color: #725d42; } .product-mark { border: 2px solid #d3a92f; border-radius: 15px; background: #f7cd67; box-shadow: 0 4px 0 #bf9230; } .product-mark::after { display: none; } .product-signal i { background: #725d42; box-shadow: none; } .product-copy strong { color: #634a31; font-size: 1.04rem; } .global-navigation { gap: 0.3rem; padding: 0.32rem; border: 2px solid rgba(114, 93, 66, 0.2); border-radius: 999px; background: rgba(255, 253, 245, 0.72); } .global-navigation a { min-height: 2.35rem; color: #78664e; border-radius: 999px; } .global-navigation a:hover { color: #725d42; background: #fff5cf; } .global-navigation a[aria-current='page'] { color: #725d42; background: #f7cd67; box-shadow: 0 3px 0 #c99b2f; } .topbar-actions { min-width: max-content; } .connection-status, .version-badge { padding: 0; border: 0; background: transparent; } .connection-status span[role='status']::before { content: ''; display: inline-block; width: 0.48rem; height: 0.48rem; margin-right: 0.38rem; border-radius: 50%; background: #0f6e66; } .connection-status::before { display: none; } .connection-status span[role='status'] { color: #356552; font-weight: 700; } .version-badge > span { color: #725d42; } .connection-status span[data-state='connecting']::before, .connection-status span[data-state='resetting']::before { background: #e5b70d; } .connection-status span[data-state='reconnecting']::before, .connection-status span[data-state='closed']::before { background: #a8403b; } .app-layout { min-height: auto; padding: clamp(1rem, 2vw, 2rem); } main { min-height: calc(100vh - 13rem); padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; } .fleet-heading, main > section > header, .page-heading { min-height: 5.5rem; margin-bottom: 1.4rem; padding: 0 0 1rem; border-bottom: 2px dashed #cabfa9; } .fleet-heading h1, main > section > header h1, .page-heading h1 { margin-bottom: 0.7rem; } .page-kicker, .eyebrow { color: #138f85 !important; } .fleet-workspace, .fleet-workspace.is-sidebar-collapsed { grid-template-columns: 17rem minmax(0, 1fr); gap: clamp(1rem, 2vw, 1.7rem); } .fleet-workspace.is-sidebar-collapsed { grid-template-columns: 4.5rem minmax(0, 1fr); } .fleet-sidebar { top: 6.2rem; padding: 1rem; border: 2px dashed #c7b99e; border-radius: 20px; background: #f7f3df; box-shadow: none; } .fleet-sidebar-header { padding-bottom: 0.85rem; border-bottom: 2px solid #ded3bd; } .fleet-sidebar-toggle { min-width: 2.25rem; padding-inline: 0.6rem; } .fleet-status-summary { gap: 0; } .fleet-status-summary > div { padding: 0.85rem 0.1rem; border: 0; border-bottom: 1px dashed #d7cbb4; border-radius: 0; background: transparent; box-shadow: none; } .fleet-status-summary > div[data-tone='online'] { border-color: #a9cf9a; background: transparent; } .fleet-status-summary > div[data-tone='attention'] { border-color: #e9b1a8; background: transparent; } .fleet-status-summary strong { color: #725d42; font-size: 1.55rem; } .fleet-toolbar { gap: 0.85rem; padding: 1rem 0 0; border: 0; background: transparent; } .fleet-search-field > span[class*='animal-wrapper'] { width: 100%; } .fleet-search-field input { min-height: auto; padding: 0; border: 0; background: transparent; } .fleet-search-glyph { position: static; color: #6f6350; transform: none; } .fleet-status-chips { gap: 0.45rem; } .fleet-status-chip { min-height: 2.15rem; border: 1.5px solid #d5c9b2; border-radius: 999px; color: #725d42; background: #fffdf5; box-shadow: 0 2px 0 #ded4bf; } .fleet-status-chip:first-child { border-radius: 999px; } .fleet-status-chip.is-active { color: #725d42; border-color: #e2b12e; background: #fff0ae; box-shadow: 0 3px 0 #d3a52b; } .fleet-active-chip, .fleet-clear-filters { border-radius: var(--button-radius-compact); } .fleet-active-chip { border-color: #8ad3c5; background: #e2f7f2; } .fleet-advanced-filters { padding-top: 0.65rem; border-top: 1px dashed #d5c9b2; } .fleet-advanced-filters summary { color: #725d42; } .fleet-advanced-filter-grid select, .fleet-toolbar-controls select { border-radius: 14px; background: #fffdf5; } .batch-entry { border: 2px dashed #e1b958; border-radius: 18px; background: #fff5cf; box-shadow: none; } .fleet-results-pane { min-width: 0; } .fleet-results-header { min-height: 4rem; margin-bottom: 1rem; padding-bottom: 0.85rem; border-bottom: 2px dashed #cabfa9; } .fleet-card-grid { grid-template-columns: repeat(auto-fill, minmax(min(100%, 20rem), 1fr)); gap: 1rem; } .fleet-card { min-height: 0; padding: 1.1rem 1.15rem; border-width: 2px; border-color: #cec0a4; border-radius: 20px; background-color: #f7f3df; box-shadow: none; } .fleet-card::before { width: 0.45rem; border-radius: 20px 0 0 20px; background: #0f6e66; } .fleet-card[data-status='offline']::before { background: #a8403b; } .fleet-card[data-status='auth']::before { background: #e5b70d; } .fleet-card[data-status='unknown']::before { background: #9b8d78; } .fleet-card:hover { border-color: #b9aa8e; box-shadow: none; transform: none; } .fleet-card.is-selected { border-color: #0f6e66; box-shadow: 0 0 0 3px rgba(15, 110, 102, 0.14); } .fleet-card-glow { display: none; } .fleet-card > header { border-bottom-color: #ded3bd; } .fleet-node-avatar { color: #725d42; border-radius: 14px; background: #f7cd67; box-shadow: 0 3px 0 #c99b2f; } .fleet-card[data-status='online'] .fleet-node-avatar { background: #82d5bb; box-shadow: 0 3px 0 #3da88c; } .fleet-card[data-status='offline'] .fleet-node-avatar { color: #fff; background: #e8847e; box-shadow: 0 3px 0 #bb4e4e; } /* Apple-inspired refinement: spatial restraint, materials, and direct feedback. */ :root { --apple-surface: rgba(255, 255, 255, 0.76); --apple-surface-strong: rgba(255, 255, 255, 0.9); --apple-hairline: rgba(101, 83, 59, 0.14); --apple-shadow: 0 1px 2px rgba(74, 61, 43, 0.05), 0 10px 30px rgba(74, 61, 43, 0.08); --apple-shadow-selected: 0 0 0 3px rgba(15, 110, 102, 0.16), 0 14px 34px rgba(37, 115, 103, 0.12); font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Noto Sans SC', 'PingFang SC', system-ui, sans-serif; --animal-font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Noto Sans SC', 'PingFang SC', system-ui, sans-serif; } .app-topbar { min-height: 4.25rem; border-bottom: 1px solid rgba(70, 132, 112, 0.18); background: rgba(231, 247, 238, 0.86); box-shadow: 0 5px 22px rgba(73, 111, 91, 0.08); backdrop-filter: blur(24px) saturate(145%); } .product-mark { border: 1px solid rgba(157, 119, 28, 0.28); border-radius: 13px; box-shadow: 0 4px 12px rgba(143, 105, 20, 0.14); } .global-navigation { border: 1px solid rgba(114, 93, 66, 0.14); background: rgba(255, 255, 255, 0.66); box-shadow: 0 2px 10px rgba(74, 61, 43, 0.05); backdrop-filter: blur(18px) saturate(140%); } .global-navigation a[aria-current='page'] { background: rgba(247, 205, 103, 0.78); box-shadow: 0 1px 2px rgba(122, 91, 21, 0.12); } .app-layout, .app-layout.app-layout-single { width: 100%; max-width: none; padding: clamp(0.85rem, 1.35vw, 1.45rem) clamp(0.8rem, 1.6vw, 1.75rem); } main { min-height: 0; } .fleet-heading, main > section > header, .page-heading { min-height: 0; margin-bottom: 1rem; padding-bottom: 0.85rem; border-bottom: 1px solid var(--apple-hairline); } .fleet-heading h1, main > section > header h1, .page-heading h1 { margin-bottom: 0.45rem; } .fleet-workspace, .fleet-workspace.is-sidebar-collapsed { gap: clamp(0.9rem, 1.25vw, 1.25rem); } .fleet-sidebar { top: 5.3rem; border: 1px solid rgba(147, 127, 95, 0.18); background: rgba(250, 247, 232, 0.78); box-shadow: 0 8px 28px rgba(77, 62, 43, 0.06); backdrop-filter: blur(22px) saturate(130%); } .fleet-sidebar-header, .fleet-results-header { border-bottom: 1px solid var(--apple-hairline); } .fleet-results-header { min-height: 0; padding: 0.2rem 0 0.75rem; border-radius: 0; background: transparent; box-shadow: none; } .fleet-card-grid { grid-template-columns: repeat(auto-fill, minmax(min(100%, 27rem), 1fr)); gap: clamp(0.85rem, 1.15vw, 1.15rem); } .fleet-card { gap: 0.8rem; padding: 1.15rem 1.2rem 1.05rem; border: 1px solid rgba(126, 105, 75, 0.16); border-radius: 22px; background: var(--apple-surface); box-shadow: var(--apple-shadow); backdrop-filter: blur(24px) saturate(125%); transition: border-color 180ms ease-out, box-shadow 180ms ease-out, background-color 180ms ease-out; } .fleet-card::before { display: none; } .fleet-card:hover { border-color: rgba(89, 119, 102, 0.25); background: rgba(255, 255, 255, 0.84); box-shadow: 0 2px 4px rgba(74, 61, 43, 0.05), 0 14px 36px rgba(74, 61, 43, 0.1); transform: none; } .fleet-card.is-selected { border-color: rgba(15, 110, 102, 0.7); background: rgba(247, 255, 252, 0.9); box-shadow: var(--apple-shadow-selected); } .fleet-card > header { align-items: center; padding: 0 0 0.85rem; border-bottom: 1px solid var(--apple-hairline); } .fleet-card-title-group { align-items: center; gap: 0.7rem; } .fleet-card-select { position: static; width: 2rem; height: 2rem; flex: 0 0 2rem; display: grid; place-items: center; padding: 0; border-radius: 50%; } .fleet-card-select input { width: 1.25rem; height: 1.25rem; display: grid; place-content: center; margin: 0; appearance: none; border: 1.5px solid rgba(114, 93, 66, 0.34); border-radius: 50%; background: rgba(255, 255, 255, 0.72); box-shadow: inset 0 1px 2px rgba(73, 58, 39, 0.08); cursor: pointer; transition: transform 100ms ease-out, border-color 160ms ease-out, background-color 160ms ease-out, box-shadow 160ms ease-out; } .fleet-card-select input::before { content: ''; width: 0.32rem; height: 0.58rem; border: solid #fff; border-width: 0 0.13rem 0.13rem 0; transform: rotate(45deg) scale(0); transform-origin: center; transition: transform 140ms ease-out; } .fleet-card-select input:checked { border-color: #0f6e66; background: #0f6e66; box-shadow: 0 2px 7px rgba(15, 110, 102, 0.24); } .fleet-card-select input:checked::before { transform: rotate(45deg) scale(1); } .fleet-card-select input:active { transform: scale(0.88); } .fleet-card-select input:focus-visible { outline: 3px solid var(--button-focus-ring); outline-offset: 2px; } .fleet-node-avatar, .fleet-card[data-status='auth'] .fleet-node-avatar, .fleet-card[data-status='unknown'] .fleet-node-avatar, .fleet-card[data-status='online'] .fleet-node-avatar, .fleet-card[data-status='offline'] .fleet-node-avatar { width: 2.6rem; height: 2.6rem; color: #5f543f; border: 1px solid rgba(105, 91, 66, 0.1); border-radius: 13px; background: rgba(235, 229, 207, 0.8); box-shadow: 0 2px 7px rgba(75, 61, 42, 0.08); } .fleet-card[data-status='online'] .fleet-node-avatar { background: rgba(174, 225, 208, 0.88); } .fleet-card[data-status='offline'] .fleet-node-avatar { color: #8d4b48; background: rgba(245, 206, 202, 0.88); } .fleet-card-entry { display: block; border-radius: 8px; } .fleet-card-entry:active { transform: translateY(1px); } .fleet-card h2 { font-size: 1.05rem; font-weight: 750; } .fleet-card-entry-label { margin-top: 0.24rem; font-size: 0.7rem; font-weight: 650; } .fleet-card-overview { display: block; padding: 0; border: 0; border-radius: 0; background: transparent; } .fleet-card-description { padding: 0; border: 0; color: #6f6350; line-height: 1.5; } .fleet-card-anomalies { border: 1px solid rgba(168, 64, 59, 0.18); border-radius: 12px; background: rgba(253, 233, 231, 0.72); } .fleet-card-metrics { gap: 0; padding-block: 0.2rem; border-top: 1px solid var(--apple-hairline); border-bottom: 1px solid var(--apple-hairline); } .fleet-card-metrics > div { padding: 0.7rem 0.65rem; border: 0; border-radius: 0; background: transparent; } .fleet-card-metrics > div:nth-child(even) { border-left: 1px solid var(--apple-hairline); } .fleet-card-metrics .fleet-card-phone { border-bottom: 1px solid var(--apple-hairline); } .fleet-card-metrics dt { color: #6f6350; font-size: 0.66rem; font-weight: 600; } .fleet-card-metrics dd { color: #5e513e; font-size: 0.78rem; font-weight: 700; } .fleet-card-sms { padding: 0.7rem 0; border: 0; border-radius: 0; background: transparent; } .fleet-card-sms h3 { color: #6f6350; font-weight: 650; } .fleet-card-admin-actions { gap: 0.55rem; padding-top: 0.8rem; border-top: 1px solid var(--apple-hairline); } .fleet-card-admin-actions button { min-height: var(--button-height-compact); transition: transform 100ms ease-out, opacity 100ms ease-out, border-color 160ms ease-out, background-color 160ms ease-out; } .fleet-card-admin-actions button:active:not(:disabled) { transform: scale(0.97); } .state-panel { padding: 1rem 1.1rem; border: 1px solid rgba(126, 105, 75, 0.18); border-radius: 16px; background: var(--apple-surface); box-shadow: 0 6px 22px rgba(74, 61, 43, 0.05); backdrop-filter: blur(18px); } .app-footer { margin-top: 0.25rem; } @media (max-width: 60rem) { .fleet-status-summary-rail { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); } .fleet-status-summary > div { padding: 0.65rem 0.75rem; border-bottom: 0; border-right: 1px solid var(--apple-hairline); } .fleet-status-summary > div:last-child { border-right: 0; } } @media (max-width: 48rem) { .app-layout { padding: 0.75rem; } .fleet-heading { gap: 0.75rem; } .fleet-sidebar { padding: 0.85rem; } .fleet-status-summary > div { padding-inline: 0.45rem; } .fleet-status-summary small { display: none; } .fleet-card { padding: 1rem; border-radius: 20px; } .fleet-card-title-group { gap: 0.55rem; } .fleet-card-select { width: 1.75rem; flex-basis: 1.75rem; } } @media (prefers-reduced-transparency: reduce) { .app-topbar, .global-navigation, .fleet-sidebar, .fleet-card, .state-panel { background: #fffdf5; backdrop-filter: none; } } @media (prefers-contrast: more) { .fleet-card, .fleet-sidebar, .state-panel { border-color: #725d42; } } .fleet-card-entry h2, .fleet-card h2 { color: #725d42; } .fleet-card-entry-label, .fleet-card-origin-link { color: #138f85; } .fleet-card-overview, .fleet-card-metrics, .fleet-card-sms { border-color: #ded3bd; } .fleet-card-metrics > div { border: 0; border-radius: 0; background: transparent; } .fleet-card-metrics dd { color: #725d42; } .fleet-card-sms { border-radius: 16px; background: #fff8dc; } .capability-tags span[class*='animal-'], .fleet-instance-tags span[class*='animal-'] { gap: 0.3rem; } .fleet-card-admin-actions { padding-top: 0.8rem; border-top: 1px dashed #d5c9b2; } .state-panel { border: 2px dashed #c9bda5; border-radius: 18px; background: #fffdf5; } .state-error { border-color: #e7a09a; background: #fde9e7; } .jobs-toolbar, .fleet-toolbar:not([role='search']) { border: 2px dashed #d3c6ac; border-radius: 18px; background: #f7f3df; box-shadow: none; } .table-scroll { border: 2px solid #d8cdb7; border-radius: 18px; background: #fffdf5; box-shadow: none; } .dense-table th { color: #725d42; background: #dff3e8; } .dense-table th, .dense-table td { border-color: #e5dcc9; } .dense-table tbody tr:hover { background: #fff8dc; } main ul[aria-label='已配置实例'] > li { border: 0; border-radius: 0; background: transparent; box-shadow: none; } main ul[aria-label='已配置实例'] > li > div[class*='animal-'] { height: 100%; } .settings-card, .editor-card { max-width: 48rem; border: 2px solid #d3c6ac; box-shadow: none; } .instance-editor form, .settings-card, .auth-settings { background: transparent; } .instance-editor form { padding: 0; border: 0; } .instance-detail { gap: 1.4rem; } .instance-context { border: 2px dashed #c7b99e; border-radius: 20px; background: #f7f3df; box-shadow: none; } .instance-context nav a { border-radius: 999px; } .instance-context nav a[aria-current='page'] { color: #725d42; background: #fff0ae; } .instance-module-detail { border: 0; border-radius: 0; background: transparent; box-shadow: none; } .danger-zone { border: 2px dashed #df827a; border-radius: 18px; background: #fde9e7; } .auth-screen { background: #dff3e8; } .auth-card { color: #725d42; border: 2px solid #c7b99e; border-radius: 20px; background: #f7f3df; box-shadow: 0 8px 0 rgba(114, 93, 66, 0.12); } .auth-card h1 { color: #725d42; } .app-footer { width: 100%; margin-top: 1rem; color: #725d42; text-align: center; } .app-footer p { width: min(100% - 2rem, 68rem); margin: 0 auto -0.25rem; padding: 0.7rem 1rem; font-size: 0.72rem; } .app-footer > div[class*='animal-'] { height: 5rem; } @media (max-width: 60rem) { .fleet-workspace, .fleet-workspace.is-sidebar-collapsed { grid-template-columns: 1fr; } .fleet-sidebar { position: static; } .fleet-sidebar.is-collapsed { padding: 0.65rem 1rem; } } @media (max-width: 48rem) { .app-topbar { padding: 0.65rem 0.75rem; } .global-navigation { border-radius: 18px; } .app-layout { padding: 1rem 0.75rem; } main { padding: 0; border-radius: 0; } .fleet-heading, main > section > header, .page-heading { align-items: flex-start; } .fleet-sidebar, .instance-context { border-radius: 18px; } .fleet-card-grid { grid-template-columns: 1fr; } .fleet-card { padding: 1rem; } } /* Iconography and node identity */ svg { display: block; } .product-mark { position: relative; overflow: hidden; background: linear-gradient(145deg, #6d87ff, #315bea); box-shadow: 0 8px 18px rgba(49, 91, 234, 0.28); } .product-mark::after { content: ''; position: absolute; width: 2.2rem; height: 2.2rem; right: -1.1rem; top: -1rem; border-radius: 50%; background: rgba(255, 255, 255, 0.16); } .product-signal { height: 1.25rem; display: flex; align-items: flex-end; gap: 0.16rem; transform: skew(-8deg); } .product-signal i { width: 0.24rem; border-radius: 99px; background: #fff; box-shadow: 0 0 8px rgba(255, 255, 255, 0.28); } .product-signal i:nth-child(1) { height: 0.42rem; opacity: 0.72; } .product-signal i:nth-child(2) { height: 0.78rem; opacity: 0.86; } .product-signal i:nth-child(3) { height: 1.16rem; } .primary-action, .fleet-card-admin-actions button { gap: 0.4rem; } .primary-action svg, .fleet-card-admin-actions button svg { width: 0.95rem; height: 0.95rem; } .fleet-sidebar-header strong, .fleet-status-summary span, .fleet-card-kicker, .fleet-card-metrics dt, .fleet-card-sms h3, .capability-tags span, .fleet-instance-tags span { display: inline-flex; align-items: center; gap: 0.32rem; } .fleet-sidebar-header strong svg, .fleet-status-summary span svg, .fleet-card-kicker svg, .fleet-card-metrics dt svg, .fleet-card-sms h3 svg, .capability-tags span svg, .fleet-instance-tags span svg { width: 0.82rem; height: 0.82rem; flex: 0 0 auto; } .fleet-sidebar-toggle svg { width: 1rem; height: 1rem; } .fleet-search-glyph { width: 1rem; height: 1rem; border: 0; border-radius: 0; color: var(--faint); transform: translateY(-50%); } .fleet-search-glyph::after { display: none; } .fleet-node-avatar { width: 2.55rem; height: 2.55rem; flex: 0 0 auto; display: grid; place-items: center; color: #fff; border-radius: 11px; background: linear-gradient( 145deg, color-mix(in srgb, var(--card-accent) 72%, #5f76db), var(--card-accent) ); box-shadow: 0 6px 14px color-mix(in srgb, var(--card-accent) 20%, transparent); font-size: 0.78rem; font-weight: 900; letter-spacing: 0.02em; } .fleet-card-select { position: absolute; left: 0.33rem; top: 0.36rem; z-index: 2; padding: 0; } .fleet-card-select input { margin: 0; } .fleet-card-entry-label svg { width: 0.75rem; height: 0.75rem; } .fleet-card-entry-label::after { display: none; } .fleet-origin-arrow { width: 0.82rem; height: 0.82rem; } .fleet-card-admin-actions button { display: inline-flex; align-items: center; justify-content: center; } /* Keep the final identity overrides aligned with the Animal Island palette. */ .product-mark { background: #f7cd67; box-shadow: 0 4px 0 #bf9230; } .product-mark::after { display: none; } .product-signal i { background: #725d42; box-shadow: none; } .fleet-search-glyph { position: static; color: #6f6350; transform: none; } .fleet-node-avatar, .fleet-card[data-status='auth'] .fleet-node-avatar, .fleet-card[data-status='unknown'] .fleet-node-avatar { color: #725d42; border-radius: 14px; background: #f7cd67; box-shadow: 0 3px 0 #c99b2f; } .fleet-card[data-status='online'] .fleet-node-avatar { background: #82d5bb; box-shadow: 0 3px 0 #3da88c; } .fleet-card[data-status='offline'] .fleet-node-avatar { color: #fff; background: #e8847e; box-shadow: 0 3px 0 #bb4e4e; } /* Final cascade guard for the Apple refinement. */ .product-mark { border: 1px solid rgba(157, 119, 28, 0.28); border-radius: 13px; background: #f7cd67; box-shadow: 0 4px 12px rgba(143, 105, 20, 0.14); } .fleet-card-select { position: static; width: 2rem; height: 2rem; flex: 0 0 2rem; display: grid; place-items: center; padding: 0; border-radius: 50%; } .fleet-card-select input { width: 1.25rem; height: 1.25rem; min-height: 1.25rem; margin: 0; } .fleet-card-metrics { grid-template-columns: repeat(3, minmax(0, 1fr)); } .fleet-card-metrics > div:nth-child(even) { border-left: 0; } .fleet-card-metrics > div:nth-child(n + 3) { border-left: 1px solid var(--apple-hairline); } .fleet-results-header { border: 0; border-bottom: 1px solid var(--apple-hairline); } .fleet-card-metrics dd > [role='progressbar'] { min-width: 0; } .fleet-metric-value { flex: 0 0 auto; white-space: nowrap; } .fleet-card-sms { padding: 0.7rem 0; border: 0; border-radius: 0; background: transparent; } .fleet-card-admin-actions { border-top: 1px solid var(--apple-hairline); } .state-panel { border: 1px solid rgba(126, 105, 75, 0.18); border-radius: 16px; background: var(--apple-surface); box-shadow: 0 6px 22px rgba(74, 61, 43, 0.05); } .app-footer { margin-top: 0.25rem; } .fleet-node-avatar, .fleet-card[data-status='auth'] .fleet-node-avatar, .fleet-card[data-status='unknown'] .fleet-node-avatar, .fleet-card[data-status='online'] .fleet-node-avatar, .fleet-card[data-status='offline'] .fleet-node-avatar { width: 2.6rem; height: 2.6rem; color: #5f543f; border: 1px solid rgba(105, 91, 66, 0.1); border-radius: 13px; background: rgba(235, 229, 207, 0.8); box-shadow: 0 2px 7px rgba(75, 61, 42, 0.08); } .fleet-card[data-status='online'] .fleet-node-avatar { background: rgba(174, 225, 208, 0.88); } .fleet-card[data-status='offline'] .fleet-node-avatar { color: #8d4b48; background: rgba(245, 206, 202, 0.88); } @media (max-width: 48rem) { .app-layout { padding: 0.75rem; } .fleet-status-summary-rail { display: none; } .fleet-heading > div:first-child > p { display: none; } .fleet-card-select { width: 1.75rem; flex-basis: 1.75rem; } .fleet-card-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); } .fleet-card-metrics > div:nth-child(n + 3) { border-left: 0; } .fleet-card-metrics > div:nth-child(odd):not(:first-child) { border-left: 1px solid var(--apple-hairline); } } /* Keep the approved workbench material above legacy experiments in this file. */ .app-topbar { min-height: 3.5rem; height: 3.5rem; border: 0; border-bottom: 1px solid var(--workbench-border); background: var(--workbench-surface); box-shadow: none; backdrop-filter: none; } .global-navigation { border: 0; border-radius: 0; background: transparent; box-shadow: none; backdrop-filter: none; } .global-navigation a[aria-current='page'] { color: var(--workbench-mint); border-bottom-color: var(--workbench-mint); background: transparent; box-shadow: none; } .app-layout, .app-layout.app-layout-single { padding: 1.25rem clamp(1rem, 2vw, 1.5rem) 2rem; } .fleet-workspace, .fleet-workspace.is-sidebar-collapsed { display: grid; grid-template-columns: 17rem minmax(0, 1fr); align-items: start; gap: clamp(0.9rem, 1.25vw, 1.25rem); } .fleet-workspace.is-sidebar-collapsed { grid-template-columns: 4.5rem minmax(0, 1fr); } .fleet-sidebar, .fleet-sidebar.is-collapsed { position: sticky; top: 5.3rem; width: auto; max-height: calc(100vh - 6.2rem); margin: 0; padding: 1rem; overflow: auto; border: 1px solid var(--workbench-border); border-radius: 12px; background: var(--workbench-surface-muted); box-shadow: none; backdrop-filter: none; } .fleet-sidebar.is-collapsed { padding: 0.65rem; overflow: visible; } .fleet-sidebar-header { display: flex; } .fleet-sidebar-content { display: grid; gap: 0.75rem; } .fleet-status-summary-rail { display: grid; grid-template-columns: 1fr; overflow: visible; border: 0; border-radius: 0; background: transparent; } .fleet-toolbar[role='search'] { padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; } .fleet-results-pane { min-width: 0; } .fleet-group-tabs { display: flex; align-items: center; gap: 0.25rem; min-width: 0; margin-bottom: 0.65rem; padding: 0.2rem 0 0.65rem; overflow-x: auto; border-bottom: 1px solid var(--workbench-border); scrollbar-width: thin; } .fleet-group-tabs button, .fleet-group-tabs button:hover:not(:disabled) { min-height: var(--button-height-compact); flex: 0 0 auto; padding: 0.3rem 0.7rem; border: 1px solid transparent; border-radius: var(--button-radius-compact); color: var(--button-secondary-text); background: transparent; font-size: 0.76rem; font-weight: 750; box-shadow: none; transform: none; transition: color 160ms ease, border-color 160ms ease, background-color 160ms ease; } .fleet-group-tabs button:hover:not(:disabled) { color: var(--button-secondary-hover-text); border-color: var(--button-secondary-hover-border); background: var(--button-secondary-hover-bg); } .fleet-group-tabs button.is-active, .fleet-group-tabs button.is-active:hover:not(:disabled) { color: var(--button-primary-hover); border-color: var(--button-primary-bg); background: var(--workbench-mint-soft); } .fleet-group-count { margin-left: 0.35rem; padding: 0 0.32rem; border-radius: 999px; color: var(--button-secondary-text); background: var(--workbench-surface-muted); font-size: 0.68rem; font-weight: 750; } .fleet-group-tabs button.is-active .fleet-group-count { color: var(--button-primary-hover); background: var(--button-secondary-bg); } .fleet-group-manage, .fleet-group-manage:hover:not(:disabled) { display: inline-flex; gap: 0.35rem; align-items: center; margin-left: auto; border-style: dashed; border-color: var(--workbench-border-strong); color: var(--button-secondary-text); background: var(--button-secondary-bg); font-size: 0.76rem; font-weight: 750; } .fleet-group-manage svg { width: 0.85rem; height: 0.85rem; } .fleet-instance-groups { display: flex; flex-wrap: wrap; gap: 0.3rem; } .fleet-subnavigation { display: flex; align-items: center; gap: 0.25rem; min-width: 0; margin-bottom: 0.65rem; padding: 0.2rem 0 0.65rem; overflow-x: auto; border-bottom: 1px solid var(--workbench-border); scrollbar-width: thin; } .fleet-subnavigation a { display: inline-flex; align-items: center; min-height: var(--button-height-compact); flex: 0 0 auto; padding: 0 0.72rem; border: 1px solid transparent; border-radius: 8px; color: var(--workbench-muted); background: transparent; text-decoration: none; font-size: 0.78rem; font-weight: 750; transition: color 160ms ease, border-color 160ms ease, background-color 160ms ease; } .fleet-subnavigation a:hover { color: var(--workbench-text); background: var(--workbench-surface-muted); } .fleet-subnavigation a[aria-current='page'] { color: #116f67; border-color: #b7ded4; background: var(--workbench-mint-soft); } .fleet-results-header { margin-bottom: 0.75rem; padding-bottom: 0.65rem; } .fleet-card-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.85rem; } @media (min-width: 80rem) { .fleet-card-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } } @media (min-width: 112rem) { .fleet-card-grid { grid-template-columns: repeat(5, minmax(0, 1fr)); } } .fleet-card, .fleet-card:hover, .fleet-card.is-selected { position: relative; display: flex; flex-direction: column; gap: 0; min-width: 0; padding: 1rem; overflow: visible; border: 1px solid var(--workbench-border); border-radius: 12px; background: var(--workbench-surface); box-shadow: none; backdrop-filter: none; transform: none; transition: transform 160ms ease, border-color 160ms ease, background-color 160ms ease; } .fleet-card:hover { border-color: var(--workbench-border-strong); background: #fffef9; transform: translateY(-1px); } .fleet-card.is-selected { border-color: var(--workbench-mint); background: #f4fbf7; box-shadow: inset 0 0 0 1px var(--workbench-mint); } .fleet-card-glow { display: none; } .fleet-card > header { display: flex; align-items: flex-start; justify-content: space-between; gap: 0.75rem; padding: 0; border: 0; } .fleet-card-title-group { display: flex; align-items: center; gap: 0.7rem; min-width: 0; flex: 1 1 auto; } .fleet-card-title-group > div { min-width: 0; } .fleet-card-entry { display: flex; flex-direction: column; align-items: flex-start; min-width: 0; } .fleet-card h2 { overflow: hidden; font-size: 1rem; font-weight: 800; line-height: 1.25; white-space: nowrap; text-overflow: ellipsis; } .fleet-card-entry-label { margin-top: 0.18rem; font-size: 0.68rem; font-weight: 700; } .fleet-card-version { display: block; max-width: 100%; margin-top: 0.08rem; overflow: hidden; color: var(--workbench-muted); font-size: 0.66rem; font-weight: 700; line-height: 1.25; white-space: nowrap; text-overflow: ellipsis; } .fleet-card-header-meta { display: flex; flex: 0 0 auto; align-items: center; justify-content: flex-end; gap: 0.2rem; } @media (min-width: 80rem) and (max-width: 111.999rem) { .fleet-card-header-meta { flex-direction: column; align-items: flex-end; gap: 0; } } .fleet-card-select { position: static; display: grid; width: 2.75rem; height: 2.75rem; flex: 0 0 2.75rem; place-items: center; margin: 0; padding: 0.5rem; border-radius: 50%; } .fleet-card-select input { width: 1.15rem; height: 1.15rem; min-height: 1.15rem; margin: 0; } .fleet-card-menu { position: relative; z-index: 4; flex: 0 0 auto; } button.fleet-card-menu-trigger, button.fleet-card-menu-trigger:hover:not(:disabled), button.fleet-card-menu-trigger:active:not(:disabled) { display: grid; width: var(--icon-button-size); height: var(--icon-button-size); min-height: var(--icon-button-size); place-items: center; padding: 0; border: 1px solid transparent; border-radius: var(--button-radius); color: var(--workbench-muted); border-color: transparent; background: transparent; box-shadow: none; transform: none; } button.fleet-card-menu-trigger:hover:not(:disabled) { color: var(--button-secondary-hover-text); border-color: var(--button-secondary-hover-border); background: var(--button-secondary-hover-bg); } button.fleet-card-menu-trigger:focus-visible { outline: 3px solid var(--button-focus-ring); outline-offset: 2px; } .fleet-card-menu-trigger svg { width: 1.05rem; height: 1.05rem; } .fleet-card-menu-panel { position: absolute; top: calc(100% + 0.3rem); right: 0; display: grid; width: max-content; min-width: 9.5rem; gap: 0.15rem; padding: 0.35rem; border: 1px solid var(--workbench-border); border-radius: 8px; background: var(--workbench-surface); box-shadow: 0 10px 24px rgba(68, 55, 38, 0.14); } .fleet-card-menu-panel button, .fleet-card-menu-panel .fleet-card-menu-item, .fleet-card-menu-panel button:hover:not(:disabled), .fleet-card-menu-panel button:active:not(:disabled) { display: flex; width: 100%; min-height: var(--button-height-compact); align-items: center; justify-content: flex-start; gap: 0.55rem; padding: 0.4rem 0.65rem; border: 0; border-radius: var(--button-radius-compact); color: var(--workbench-text); background: transparent; box-shadow: none; font-size: 0.76rem; font-weight: 700; text-align: left; text-decoration: none; transform: none; } .fleet-card-menu-panel button:hover:not(:disabled), .fleet-card-menu-panel .fleet-card-menu-item:hover { background: var(--workbench-surface-muted); } .fleet-card-menu-panel button:focus-visible, .fleet-card-menu-panel .fleet-card-menu-item:focus-visible { outline: 3px solid var(--button-focus-ring); outline-offset: -2px; } .fleet-card-menu-panel button svg, .fleet-card-menu-panel .fleet-card-menu-item svg { width: 0.95rem; height: 0.95rem; flex: 0 0 auto; } .fleet-card-menu-panel .fleet-card-menu-danger { color: var(--workbench-danger); } .fleet-card-metadata { display: grid; gap: 0.5rem; min-width: 0; margin-top: 0.78rem; } .fleet-card-origin-row { display: flex; min-width: 0; align-items: center; gap: 0.42rem; color: var(--workbench-muted); } .fleet-card-origin-row > svg { width: 0.82rem; height: 0.82rem; flex: 0 0 auto; } .fleet-card-access { flex: 0 0 auto; padding: 0.06rem 0.4rem; border: 1px solid var(--workbench-border); border-radius: 999px; background: var(--workbench-surface-muted); color: var(--workbench-muted); font-size: 0.62rem; font-weight: 700; letter-spacing: 0; } .fleet-card-access[data-kind='local'] { border-color: var(--workbench-mint-border); color: var(--workbench-mint); } .fleet-card-access[data-kind='wan'] { border-color: var(--workbench-warning-border); color: var(--workbench-warning-text); } .fleet-card-heartbeat { display: flex; min-width: 0; align-items: center; gap: 0.35rem; color: var(--workbench-muted); font-size: 0.69rem; font-weight: 700; } .fleet-card-heartbeat > svg { width: 0.82rem; height: 0.82rem; flex: 0 0 auto; } .fleet-card-heartbeat time { color: var(--workbench-text); font-variant-numeric: tabular-nums; } .fleet-card-heartbeat[data-stale='true'] > svg, .fleet-card-heartbeat[data-stale='true'] time { color: var(--workbench-warning-text); } .fleet-card-origin-link, .fleet-card-origin-invalid { max-width: 100%; font-size: 0.72rem; font-weight: 700; } .fleet-card-description, .fleet-card-anomalies { margin: 0; font-size: 0.72rem; line-height: 1.45; } .fleet-instance-tags, .capability-tags { display: flex; flex-wrap: wrap; gap: 0.3rem; margin: 0; } .fleet-card-hardware { display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(0, 0.8fr); gap: 0.85rem; margin: 0.78rem 0 0; padding: 0.62rem 0.7rem; border: 0; border-radius: 8px; background: var(--workbench-surface-muted); } .fleet-card-hardware > div { display: grid; min-width: 0; gap: 0.2rem; } .fleet-card-hardware > div:last-child { text-align: right; } .fleet-card-hardware > div:last-child dt { justify-content: flex-end; } .fleet-card-hardware dt, .fleet-card-hardware dd { min-width: 0; margin: 0; white-space: nowrap; } .fleet-card-hardware dt, .fleet-resource-label { display: flex; align-items: center; gap: 0.35rem; color: var(--workbench-muted); font-size: 0.69rem; font-weight: 700; } .fleet-card-hardware dt svg, .fleet-resource-label svg { width: 0.82rem; height: 0.82rem; flex: 0 0 auto; } .fleet-card-hardware dd { overflow: hidden; color: var(--workbench-text); font-size: 0.76rem; font-weight: 700; line-height: 1.35; white-space: nowrap; text-overflow: ellipsis; } .fleet-card-telemetry { display: grid; gap: 0.58rem; padding: 0.82rem 0 0.78rem; } .fleet-link-rail { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0.35rem; margin: 0.72rem 0 0; } .fleet-link-state { display: grid; min-width: 0; gap: 0.12rem; padding: 0.48rem 0.42rem; border: 1px solid var(--workbench-border); border-radius: 8px; background: rgba(255, 255, 255, 0.54); font-size: 0.64rem; line-height: 1.2; } .fleet-link-state > span { display: flex; min-width: 0; align-items: center; gap: 0.24rem; color: var(--workbench-muted); font-weight: 700; } .fleet-link-state strong { overflow: hidden; color: var(--workbench-text); font-size: 0.66rem; text-overflow: ellipsis; white-space: nowrap; } .fleet-link-dot { width: 0.42rem; height: 0.42rem; flex: 0 0 auto; border-radius: 50%; background: var(--workbench-muted); } .fleet-link-state[data-state='online'] .fleet-link-dot { background: var(--workbench-mint); } .fleet-link-state[data-state='offline'] .fleet-link-dot { background: #d1584e; } .fleet-cellular { display: grid; gap: 0.42rem; margin: 0.72rem 0 0; padding: 0.62rem 0.7rem; border: 1px solid var(--workbench-border); border-radius: 8px; background: rgba(255, 255, 255, 0.5); } .fleet-cellular-heading { display: flex; min-width: 0; align-items: baseline; justify-content: space-between; gap: 0.6rem; } .fleet-cellular-heading strong, .fleet-cellular-heading span { overflow: hidden; margin: 0; color: var(--workbench-text); font-size: 0.72rem; line-height: 1.3; text-overflow: ellipsis; white-space: nowrap; } .fleet-cellular-heading strong { font-weight: 800; } .fleet-cellular-heading span { flex: 0 1 auto; color: var(--workbench-muted); } .fleet-cellular-signal { min-width: 0; } .fleet-resource-row { display: grid; grid-template-columns: 4.1rem minmax(0, 1fr); align-items: center; gap: 0.65rem; min-width: 0; } .fleet-resource-meter { display: grid; grid-template-columns: minmax(0, 1fr) 3.2rem; align-items: center; gap: 0.55rem; min-width: 0; } .fleet-resource-meter [role='progressbar'] { min-width: 0; } .fleet-resource-meter [role='progressbar'] > div > div { height: 0.5rem; border: 1px solid #e5dcc8; background: #f1ebdd; box-shadow: inset 0 1px 2px rgba(114, 93, 66, 0.08); } .fleet-resource-meter [role='progressbar'] > div > div > div { background: var(--workbench-mint); background-image: none; animation: none; } .fleet-resource-meter strong, .fleet-resource-unavailable { color: var(--workbench-text); font-size: 0.72rem; font-variant-numeric: tabular-nums; text-align: right; white-space: nowrap; } .fleet-resource-unavailable { color: var(--workbench-muted); } .fleet-card-footer { display: flex; min-width: 0; min-height: 2.45rem; align-items: center; justify-content: space-between; gap: 0.75rem; margin: auto 0 0; padding: 0.72rem 0 0; border-top: 1px solid var(--workbench-border); } .fleet-card-footer-primary { display: flex; min-width: 0; align-items: center; gap: 0.42rem; overflow: hidden; color: var(--workbench-text); font-size: 0.72rem; font-weight: 700; white-space: nowrap; text-overflow: ellipsis; } .fleet-card-footer-primary > span { flex: 0 0 auto; overflow: hidden; text-overflow: ellipsis; } .fleet-card-footer-primary > span:last-child { min-width: 0; flex: 1 1 auto; } .fleet-card-footer-primary svg { width: 0.82rem; height: 0.82rem; flex: 0 0 auto; color: var(--workbench-mint); } .fleet-card-footer-time { flex: 0 0 auto; color: var(--workbench-muted); font-size: 0.68rem; font-variant-numeric: tabular-nums; font-weight: 700; white-space: nowrap; } .state-panel { border: 1px solid var(--workbench-border); border-radius: 14px; background: var(--workbench-surface); box-shadow: none; backdrop-filter: none; } .app-footer { margin: 0; padding: 0.8rem 1rem; border-top: 1px solid var(--workbench-border); background: var(--workbench-surface); } @media (max-width: 60rem) { .fleet-workspace, .fleet-workspace.is-sidebar-collapsed { grid-template-columns: 1fr; } .fleet-sidebar, .fleet-sidebar.is-collapsed { position: static; width: 100%; max-height: none; } .fleet-sidebar.is-collapsed { min-height: auto; padding: 0.65rem 1rem; } .fleet-sidebar.is-collapsed .fleet-sidebar-header { justify-content: space-between; } .fleet-sidebar.is-collapsed .fleet-sidebar-header > div { display: block; } .fleet-status-summary-rail { grid-template-columns: repeat(3, minmax(0, 1fr)); } } @media (max-width: 70rem) { .fleet-card-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 48rem) { .app-topbar { height: auto; } .app-layout, .app-layout.app-layout-single { padding: 0.9rem 0.7rem 1.4rem; } .fleet-status-summary-rail { display: grid; } .fleet-card-grid { grid-template-columns: 1fr; } .fleet-card-hardware { grid-template-columns: minmax(0, 1.15fr) minmax(0, 0.65fr) minmax(0, 0.7fr); } } @media (max-width: 35rem) { .fleet-resource-row { grid-template-columns: 3.75rem minmax(0, 1fr); gap: 0.45rem; } } @media (prefers-reduced-motion: reduce) { .fleet-card, .fleet-group-tabs button { transition: none; } .fleet-card:hover { transform: none; } } @media (min-width: 48rem) and (max-width: 70rem) { .fleet-card-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } /* Final automation cascade guard against the historical global button rules. */ .app-shell { display: flex; flex-direction: column; } .app-layout, .app-layout.app-layout-single { flex: 1 0 auto; } .automation-workspace button.primary-action { color: var(--button-primary-text); border-color: var(--button-primary-bg); background: var(--button-primary-bg); box-shadow: 0 3px 0 var(--button-primary-active); } .automation-workspace button.primary-action:hover:not(:disabled) { color: var(--button-primary-text); border-color: var(--button-primary-hover); background: var(--button-primary-hover); box-shadow: 0 4px 0 var(--button-primary-active); } .automation-workspace button.primary-action:disabled { color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); box-shadow: none; } .automation-workspace .workbench-tabs button, .automation-workspace .workbench-tabs button:hover:not(:disabled) { border: 0; border-bottom: 2px solid transparent; border-radius: 0; color: var(--workbench-muted); background: transparent; box-shadow: none; transform: none; } .automation-workspace .workbench-tabs button[aria-selected='true'], .automation-workspace .workbench-tabs button[aria-selected='true']:hover { color: var(--workbench-mint); border-bottom-color: var(--workbench-mint); } .automation-workspace .row-actions button, .automation-workspace .row-actions button:hover:not(:disabled) { min-height: var(--button-height-compact); padding: 0 0.45rem; border: 0; border-radius: 8px; color: var(--workbench-mint); background: transparent; box-shadow: none; transform: none; } .automation-workspace .row-actions .danger-link, .automation-workspace .row-actions .danger-link:hover:not(:disabled) { color: var(--workbench-danger); } .automation-workspace .row-action-trigger, .automation-workspace .row-action-trigger:hover:not(:disabled) { border: 1px solid var(--workbench-border); border-radius: 8px; color: var(--workbench-mint); background: transparent; box-shadow: none; transform: none; } .automation-workspace .schedule-table-wrap { overflow-x: auto; overflow-y: hidden; } /* Phone privacy controls share one stable row across all fleet card widths. */ .fleet-card-hardware { grid-template-columns: minmax(0, 1.4fr) minmax(4.75rem, 0.6fr) minmax(5.25rem, 0.7fr); gap: 0.35rem; padding: 0.72rem 0.45rem; } .fleet-card-hardware dt, .fleet-card-hardware dd { white-space: nowrap; } .fleet-card-hardware .fleet-card-phone { gap: 0.15rem; } .fleet-card-hardware .fleet-card-phone dd { display: flex; min-height: 2.5rem; align-items: center; gap: 0.25rem; } .fleet-card-phone-value { min-width: 0; flex: 1 1 auto; overflow: hidden; font-size: 0.7rem; font-variant-numeric: tabular-nums; white-space: nowrap; text-overflow: ellipsis; } .fleet-phone-privacy-toggle, .fleet-phone-privacy-toggle:hover:not(:disabled), .fleet-phone-privacy-toggle:active:not(:disabled) { position: relative; display: grid; width: var(--icon-button-size); height: var(--icon-button-size); min-height: var(--icon-button-size); flex: 0 0 var(--icon-button-size); place-items: center; padding: 0; border: 1px solid var(--workbench-border); border-radius: var(--button-radius); color: var(--workbench-muted); background: var(--button-secondary-bg); box-shadow: none; transform: none; } .fleet-phone-privacy-toggle::before { position: absolute; inset: -0.125rem; content: ''; } .fleet-phone-privacy-toggle:hover:not(:disabled) { color: var(--button-secondary-hover-text); border-color: var(--button-secondary-hover-border); background: var(--button-secondary-hover-bg); } .fleet-phone-privacy-toggle[aria-pressed='true'] { color: var(--button-primary-hover); border-color: var(--workbench-mint-border); background: var(--workbench-mint-soft); } .fleet-phone-privacy-toggle:focus-visible { outline: 3px solid var(--button-focus-ring); outline-offset: 2px; } .fleet-phone-privacy-toggle svg { width: 1rem; height: 1rem; } .fleet-card-footer-primary > span:last-child { font-variant-numeric: tabular-nums; } @media (min-width: 80rem) { .fleet-card-footer { display: grid; grid-template-columns: minmax(0, 1fr); } .fleet-card-footer-time { justify-self: end; } } .fleet-messages-page { min-width: 0; } .fleet-messages-summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(8.5rem, 1fr)); gap: 0.7rem; margin: 0 0 0.8rem; } .fleet-messages-summary > div { min-width: 0; display: grid; gap: 0.15rem; padding: 0.7rem 0.8rem; border: 1px solid var(--workbench-border); border-left: 3px solid var(--workbench-mint); border-radius: 12px; background: var(--workbench-surface); } .fleet-messages-summary span { display: flex; align-items: center; gap: 0.35rem; color: var(--workbench-muted); font-size: 0.7rem; font-weight: 750; } .fleet-messages-summary svg { width: 0.82rem; height: 0.82rem; } .fleet-messages-summary strong { min-width: 0; color: var(--workbench-text); font-size: 1.1rem; line-height: 1.2; overflow-wrap: anywhere; } .fleet-messages-summary > div[data-tone='online'] { border-left-color: var(--workbench-mint-soft); background: var(--workbench-surface-muted); } .fleet-messages-summary > div[data-tone='attention'] { border-left-color: var(--workbench-yellow); } .fleet-messages-filters { display: flex; flex-wrap: wrap; align-items: center; gap: 0.35rem; padding: 0 0 0.55rem; } .fleet-messages-filter-chip { min-height: var(--button-height-compact); display: inline-flex; align-items: center; gap: 0.3rem; padding: 0.3rem 0.7rem; border: 1px solid var(--workbench-border); border-radius: 999px; color: var(--button-secondary-text); background: var(--button-secondary-bg); font: inherit; font-size: 0.76rem; font-weight: 750; cursor: pointer; } .fleet-messages-filter-chip:hover { color: var(--button-secondary-hover-text); border-color: var(--button-secondary-hover-border); background: var(--button-secondary-hover-bg); } .fleet-messages-filter-chip[aria-pressed='true'] { color: var(--button-primary-hover); border-color: var(--button-primary-bg); background: var(--workbench-mint-soft); } .fleet-messages-layout { display: grid; grid-template-columns: minmax(9rem, 12rem) minmax(13rem, 18rem) minmax(0, 1fr); gap: 0.8rem; align-items: start; } .fleet-messages-devices, .fleet-messages-sessions, .fleet-messages-conversation { min-width: 0; padding: 0.9rem; border: 1px solid var(--workbench-border); border-radius: 14px; background: var(--workbench-surface); } .fleet-messages-devices { align-self: stretch; } .fleet-messages-sessions { display: flex; flex-direction: column; max-height: 44rem; } .fleet-messages-device-list { display: grid; gap: 0.35rem; } .fleet-messages-device-item { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; width: 100%; min-height: var(--button-height-compact); padding: 0.45rem 0.55rem; border: 1px solid var(--workbench-border-strong); border-radius: var(--button-radius-compact); color: var(--workbench-text); background: var(--workbench-surface-muted); font: inherit; font-size: 0.74rem; text-align: left; cursor: pointer; } .fleet-messages-device-item strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .fleet-messages-device-item small { flex: 0 0 auto; color: var(--workbench-mint); font-size: 0.62rem; font-weight: 800; } .fleet-messages-device-item[data-active] { border-color: var(--field-focus-border); background: var(--workbench-mint-soft); color: var(--workbench-mint); } .fleet-messages-device-item[data-unavailable] { color: var(--workbench-danger); border-color: var(--workbench-danger-border); background: var(--workbench-danger-soft); cursor: default; opacity: 1; } .fleet-messages-device-item[data-unavailable] small { color: var(--workbench-danger); } .fleet-messages-device-item[aria-disabled='true'] { pointer-events: none; } .fleet-messages-session-list { display: grid; gap: 0.4rem; margin: 0; padding: 0; list-style: none; overflow-y: auto; flex: 1; } .fleet-messages-session-item { display: grid; gap: 0.2rem; width: 100%; padding: 0.55rem 0.6rem; border: 1px solid var(--workbench-border); border-radius: 10px; color: var(--workbench-text); background: var(--workbench-surface-muted); font: inherit; text-align: left; cursor: pointer; } .fleet-messages-session-item[aria-current='true'] { border-color: var(--workbench-mint); background: var(--workbench-mint-soft); } .fleet-messages-session-item strong { color: var(--workbench-text); font-size: 0.78rem; } .fleet-messages-session-item p { margin: 0; color: var(--workbench-muted); font-size: 0.68rem; line-height: 1.4; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } .fleet-messages-session-item footer { display: flex; align-items: center; justify-content: space-between; gap: 0.4rem; color: var(--workbench-muted); font-size: 0.62rem; font-weight: 700; } .fleet-messages-session-node { color: var(--workbench-muted); font-size: 0.64rem; font-weight: 700; letter-spacing: 0.02em; } .fleet-messages-session-badge { display: inline-flex; align-items: center; justify-content: center; min-width: 1.15rem; height: 1.15rem; padding: 0 0.3rem; border-radius: 999px; background: var(--workbench-mint); color: #fffdf7; font-size: 0.6rem; font-weight: 800; line-height: 1; } .fleet-messages-conversation { display: flex; flex-direction: column; gap: 0.7rem; } .fleet-messages-conversation-header { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: 0.5rem; padding-bottom: 0.6rem; border-bottom: 1px solid var(--workbench-border); } .fleet-messages-conversation-header > div:first-child { min-width: 0; display: grid; gap: 0.15rem; } .fleet-messages-conversation-header h2 { margin: 0; color: var(--workbench-text); font-size: 0.94rem; overflow-wrap: anywhere; } .fleet-messages-conversation-header > div:first-child > span { color: var(--workbench-muted); font-size: 0.68rem; } .fleet-messages-panel-header { display: grid; gap: 0.25rem; margin-bottom: 0.75rem; } .fleet-messages-panel-header h2, .fleet-messages-messages-heading h2 { margin: 0; color: var(--workbench-text); font-size: 0.94rem; } .fleet-messages-panel-header span, .fleet-messages-messages-heading span { color: var(--workbench-muted); font-size: 0.68rem; } .fleet-messages-form { display: grid; gap: 0.7rem; } .fleet-messages-form label { display: grid; gap: 0.3rem; color: var(--workbench-muted); font-size: 0.72rem; font-weight: 750; } .fleet-messages-form input, .fleet-messages-form select, .fleet-messages-form textarea { width: 100%; min-width: 0; box-sizing: border-box; padding: 0.55rem 0.6rem; border: 1px solid var(--workbench-border-strong); border-radius: var(--button-radius-compact); color: var(--workbench-text); background: var(--workbench-surface-muted); font: inherit; font-size: 0.8rem; } .fleet-messages-form input:focus, .fleet-messages-form select:focus, .fleet-messages-form textarea:focus { border-color: var(--field-focus-border); outline: 3px solid var(--button-focus-ring); outline-offset: 1px; } .fleet-messages-form textarea { resize: vertical; line-height: 1.45; } .fleet-messages-form footer { display: flex; align-items: center; justify-content: space-between; gap: 0.55rem; color: var(--workbench-muted); font-size: 0.68rem; } .fleet-messages-form footer button, .fleet-messages-more, .fleet-messages-search button { display: inline-flex; align-items: center; justify-content: center; gap: 0.4rem; min-height: var(--button-height-compact); padding: 0.3rem 0.7rem; border: 1px solid var(--button-primary-bg); border-radius: var(--button-radius-compact); color: var(--workbench-surface); background: var(--workbench-mint); font: inherit; font-size: 0.74rem; font-weight: 800; cursor: pointer; } .fleet-messages-form footer button:disabled, .fleet-messages-more:disabled, .fleet-messages-search button:disabled { cursor: default; color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); opacity: 1; } .fleet-messages-form footer button svg, .fleet-messages-more svg, .fleet-messages-search button svg { width: 0.85rem; height: 0.85rem; } .fleet-messages-result { margin: 0.65rem 0 0; padding: 0.55rem 0.65rem; border: 1px solid var(--workbench-mint-border); border-radius: var(--button-radius-compact); color: var(--workbench-mint); background: var(--workbench-mint-soft); font-size: 0.72rem; font-weight: 750; } .fleet-messages-result.is-error { border-color: var(--workbench-danger-border); color: var(--workbench-danger); background: var(--workbench-danger-soft); } .fleet-messages-result.is-partial { border-color: var(--workbench-warning-border); color: var(--workbench-warning-text); background: var(--workbench-warning-soft); } .fleet-messages-composer { padding-top: 0.7rem; border-top: 1px solid var(--workbench-border); } /* Offline send queue under the SMS center: same card language, denser table body. */ .fleet-outbox { display: grid; gap: 0.7rem; margin-top: 1rem; padding: 0.9rem 1rem 1rem; border: 1px solid var(--workbench-border); border-radius: 14px; background: var(--workbench-surface); } .fleet-outbox-tools { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 0.5rem; } .fleet-outbox-flush { min-height: var(--button-height-compact); display: inline-flex; align-items: center; justify-content: center; gap: 0.35rem; padding: 0.3rem 0.7rem; border: 1px solid var(--button-primary-bg); border-radius: var(--button-radius-compact); color: var(--button-primary-text); background: var(--button-primary-bg); font: inherit; font-size: 0.72rem; font-weight: 800; cursor: pointer; } .fleet-outbox-flush:hover:not(:disabled) { border-color: var(--button-primary-hover); background: var(--button-primary-hover); color: var(--button-primary-text); } .fleet-outbox-flush:disabled { color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); opacity: 1; cursor: default; } .fleet-outbox-table { width: 100%; } .fleet-outbox-content { max-width: 22rem; overflow-wrap: anywhere; white-space: pre-wrap; } .fleet-outbox-error { display: block; margin-top: 0.15rem; color: var(--workbench-muted); font-size: 0.66rem; font-weight: 700; } .fleet-outbox-table td[data-state], .fleet-outbox-table span[data-state] { display: inline-flex; align-items: center; padding: 0.12rem 0.42rem; border-radius: 999px; background: var(--workbench-surface-muted); color: var(--workbench-muted); font-size: 0.66rem; font-weight: 800; } .fleet-outbox-table tr[data-status='queued'] span[data-state], .fleet-outbox-table tr[data-status='sending'] span[data-state] { background: color-mix(in srgb, var(--workbench-yellow) 38%, var(--workbench-surface-muted)); color: var(--workbench-muted); } .fleet-outbox-table tr[data-status='failed'] span[data-state] { background: var(--workbench-danger-soft); color: var(--workbench-danger); } .fleet-outbox-table tr[data-status='sent'] span[data-state] { background: var(--workbench-mint-soft); color: var(--workbench-mint); } .fleet-messages-messages-heading { display: flex; align-items: center; justify-content: space-between; gap: 0.7rem; margin-bottom: 0.75rem; } .fleet-messages-panel-header .fleet-messages-search { margin-top: 0.35rem; } .fleet-messages-messages-heading > div { min-width: 0; display: grid; gap: 0.2rem; } .fleet-messages-search { display: flex; gap: 0.4rem; } .fleet-messages-search input { width: min(100%, 15rem); min-width: 0; min-height: var(--button-height-compact); padding: 0.4rem 0.55rem; border: 1px solid var(--workbench-border-strong); border-radius: var(--button-radius-compact); color: var(--workbench-text); background: var(--workbench-surface-muted); font: inherit; font-size: 0.76rem; } .fleet-messages-search input:focus { border-color: var(--field-focus-border); outline: 3px solid var(--button-focus-ring); outline-offset: 1px; } .fleet-messages-search button { min-width: var(--icon-button-size); padding: 0; } .fleet-messages-message-tools { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.5rem; margin-bottom: 0.6rem; } .fleet-messages-select-all { display: inline-flex; align-items: center; gap: 0.35rem; min-height: 2rem; color: var(--workbench-muted); font-size: 0.7rem; font-weight: 750; cursor: pointer; } .fleet-messages-select-all input, .fleet-messages-message-check input { width: 0.9rem; height: 0.9rem; margin: 0; accent-color: var(--workbench-mint); } .fleet-messages-delete { display: inline-flex; align-items: center; justify-content: center; gap: 0.35rem; min-height: var(--button-height-compact); min-width: 8.2rem; padding: 0.3rem 0.7rem; border: 1px solid var(--button-danger-bg); border-radius: var(--button-radius-compact); color: var(--button-danger-text); background: var(--button-danger-bg); font: inherit; font-size: 0.76rem; font-weight: 750; cursor: pointer; } .fleet-messages-delete svg { width: 0.85rem; height: 0.85rem; } .fleet-messages-delete:disabled { cursor: default; color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); opacity: 1; } .fleet-messages-list { display: grid; gap: 0.55rem; margin: 0; padding: 0; list-style: none; } .fleet-messages-message { min-width: 0; display: grid; gap: 0.5rem; padding: 0.7rem; border: 1px solid var(--workbench-border); border-radius: 11px; background: var(--workbench-surface-muted); } .fleet-messages-message header { display: grid; grid-template-columns: auto auto minmax(0, 1fr) auto; align-items: center; gap: 0.45rem; } .fleet-messages-message-check { display: grid; min-height: 1.7rem; place-items: center; } .fleet-messages-message-icon { display: grid; width: 1.7rem; height: 1.7rem; place-items: center; border-radius: 8px; color: var(--workbench-mint); background: var(--workbench-mint-soft); } .fleet-messages-message-icon svg { width: 0.9rem; height: 0.9rem; } .fleet-messages-message header > div { min-width: 0; display: grid; gap: 0.15rem; } .fleet-messages-message header strong { min-width: 0; color: var(--workbench-text); font-size: 0.8rem; overflow-wrap: anywhere; } .fleet-messages-message header small, .fleet-messages-message time { color: var(--workbench-muted); font-size: 0.66rem; } .fleet-messages-message > p { margin: 0; color: var(--workbench-text); font-size: 0.78rem; line-height: 1.5; overflow-wrap: anywhere; white-space: pre-wrap; } .fleet-messages-message footer { display: flex; flex-wrap: wrap; align-items: center; gap: 0.35rem; padding-top: 0.45rem; border-top: 1px solid var(--workbench-border); color: var(--workbench-muted); font-size: 0.62rem; font-weight: 800; } .fleet-messages-message footer span { padding: 0.15rem 0.35rem; border: 1px solid var(--workbench-border); border-radius: 7px; background: var(--workbench-surface); } .fleet-messages-message footer span[data-state='incoming'], .fleet-messages-message footer span[data-state='received'] { color: var(--workbench-mint); border-color: var(--workbench-mint-border); background: var(--workbench-mint-soft); } .fleet-messages-message footer span[data-state='outgoing'], .fleet-messages-message footer span[data-state='sent'] { color: var(--workbench-warning-text); border-color: var(--workbench-warning-border); background: var(--workbench-warning-soft); } .fleet-messages-empty, .fleet-messages-loading-more { margin: 0; padding: 1rem 0; color: var(--workbench-muted); font-size: 0.76rem; } .fleet-messages-more { width: 100%; margin-top: 0.7rem; border-color: var(--workbench-border); color: var(--workbench-text); background: var(--workbench-surface-muted); } .fleet-messages-more:hover:not(:disabled) { border-color: var(--workbench-mint); color: var(--workbench-mint); } .fleet-notifications-page { min-width: 0; } .fleet-notifications-summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(9.5rem, 1fr)); gap: 0.7rem; margin: 0 0 0.8rem; } .fleet-notifications-summary > div { min-width: 0; display: grid; gap: 0.15rem; padding: 0.7rem 0.8rem; border: 1px solid var(--workbench-border); border-left: 3px solid var(--workbench-mint); border-radius: 12px; background: var(--workbench-surface); } .fleet-notifications-summary span { display: flex; align-items: center; gap: 0.35rem; color: var(--workbench-muted); font-size: 0.7rem; font-weight: 750; } .fleet-notifications-summary svg { width: 0.82rem; height: 0.82rem; } .fleet-notifications-summary strong { min-width: 0; color: var(--workbench-text); font-size: 1.35rem; line-height: 1.2; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; } .fleet-notifications-summary small { color: var(--workbench-muted); font-size: 0.66rem; overflow-wrap: anywhere; } .fleet-notifications-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.8rem; align-items: start; } .fleet-notifications-panel { min-width: 0; padding: 0.9rem; border: 1px solid var(--workbench-border); border-radius: 14px; background: var(--workbench-surface); } .fleet-notifications-panel-heading { display: flex; align-items: flex-start; justify-content: space-between; gap: 0.25rem; margin-bottom: 0.7rem; } .fleet-notifications-panel-heading > div { min-width: 0; display: grid; gap: 0.25rem; } .fleet-notifications-panel-heading h2 { margin: 0; color: var(--workbench-text); font-size: 0.94rem; } .fleet-notifications-panel-heading span { color: var(--workbench-muted); font-size: 0.68rem; } .fleet-notifications-retry-all { flex: 0 0 auto; min-height: var(--button-height-compact); display: inline-flex; align-items: center; gap: 0.35rem; padding: 0.3rem 0.7rem; border: 1px solid var(--button-primary-bg); border-radius: var(--button-radius-compact); color: var(--workbench-mint); background: var(--workbench-mint-soft); font-size: 0.76rem; font-weight: 750; } .fleet-notifications-retry-all:hover:not(:disabled) { border-color: var(--button-primary-hover); background: var(--button-primary-hover); color: var(--button-primary-text); } .fleet-notifications-retry-all:disabled { cursor: default; color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); opacity: 1; } .fleet-notifications-retry-all svg { width: 0.82rem; height: 0.82rem; } .fleet-notifications-counts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.5rem; margin: 0 0 0.7rem; } .fleet-notifications-counts div { min-width: 0; display: grid; gap: 0.15rem; padding: 0.55rem 0.6rem; border: 1px solid var(--workbench-border); border-radius: 10px; background: var(--workbench-surface-muted); } .fleet-notifications-counts div[data-state='ok'] { border-color: var(--workbench-mint-border); background: var(--workbench-mint-soft); } .fleet-notifications-counts div[data-state='warn'] { border-color: var(--workbench-warning-border); background: var(--workbench-warning-soft); } .fleet-notifications-counts div[data-state='attention'] { border-color: var(--workbench-danger-border); background: var(--workbench-danger-soft); } .fleet-notifications-counts dt { min-width: 0; color: var(--workbench-muted); font-size: 0.64rem; font-weight: 750; overflow-wrap: anywhere; } .fleet-notifications-counts dd { margin: 0; color: var(--workbench-text); font-size: 0.95rem; font-weight: 850; font-variant-numeric: tabular-nums; } .fleet-notification-channels { display: flex; flex-wrap: wrap; gap: 0.45rem; } .fleet-notification-channels span { min-width: 8rem; display: grid; gap: 0.2rem; padding: 0.55rem 0.65rem; border: 1px solid var(--workbench-border); border-radius: 10px; background: var(--workbench-surface-muted); } .fleet-notification-channels strong { min-width: 0; color: var(--workbench-text); font-size: 0.76rem; overflow-wrap: anywhere; } .fleet-notification-channels small { color: var(--workbench-muted); font-size: 0.66rem; } .fleet-notifications-empty { margin: 0; padding: 0.7rem 0; color: var(--workbench-muted); font-size: 0.76rem; } .fleet-notifications-stack { display: grid; gap: 0.8rem; } .fleet-switch { min-height: var(--button-height-compact); display: inline-flex; align-items: center; gap: 0.35rem; padding: 0.3rem 0.7rem; border: 1px solid var(--workbench-border-strong); border-radius: var(--button-radius-compact); color: var(--button-secondary-text); background: var(--button-secondary-bg); font: inherit; font-size: 0.76rem; font-weight: 750; letter-spacing: 0; cursor: pointer; } .fleet-switch:hover { color: var(--button-secondary-hover-text); border-color: var(--button-secondary-hover-border); background: var(--button-secondary-hover-bg); } .fleet-switch svg { width: 1.05rem; height: 1.05rem; } .fleet-switch[aria-pressed='true'] { border-color: var(--button-primary-bg); background: var(--workbench-mint-soft); color: var(--button-primary-hover); } .fleet-rate-limit-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.7rem; } .fleet-quiet-window { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto; gap: 0.7rem; align-items: end; margin-top: 0.7rem; padding: 0.55rem 0.65rem 0.65rem; border: 1px solid var(--workbench-border); border-radius: 10px; background: var(--workbench-surface-muted); } .fleet-quiet-window label { margin-top: 0; } .fleet-suppression-cell { display: flex; flex-wrap: wrap; align-items: center; gap: 0.3rem; color: var(--workbench-muted); font-size: 0.72rem; } .fleet-log-filters { display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem; margin-bottom: 0.7rem; padding: 0.6rem; border: 1px solid var(--workbench-border); border-radius: 10px; background: var(--workbench-surface-muted); } .fleet-log-filters select, .fleet-log-filters input { min-height: var(--button-height-compact); padding: 0.25rem 0.5rem; border: 1px solid var(--workbench-border-strong); border-radius: var(--button-radius-compact); font-size: 0.68rem; } .fleet-log-filters select { min-width: 7rem; } .fleet-log-filter-date { display: inline-flex; align-items: center; gap: 0.3rem; color: var(--workbench-muted); font-size: 0.66rem; font-weight: 800; } .fleet-log-retention { display: grid; gap: 0.45rem; } .fleet-diagnostics-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(17rem, 1fr)); gap: 0.7rem; } .fleet-diagnostics-card { min-width: 0; display: grid; gap: 0.5rem; padding: 0.75rem; border: 1px solid var(--workbench-border); border-left: 3px solid var(--workbench-mint); border-radius: 12px; background: var(--workbench-surface-muted); } .fleet-diagnostics-card[data-tone='warn'] { border-left-color: var(--workbench-yellow); } .fleet-diagnostics-card[data-tone='attention'] { border-left-color: var(--workbench-danger); } .fleet-diagnostics-card[data-tone='neutral'] { border-left-color: var(--workbench-border); } .fleet-diagnostics-card > header { min-width: 0; display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.35rem; } .fleet-diagnostics-card > header h3 { margin: 0; color: var(--workbench-text); font-size: 0.82rem; overflow-wrap: anywhere; } .fleet-diagnostics-card > header span { color: var(--workbench-muted); font-size: 0.66rem; overflow-wrap: anywhere; } .fleet-diagnostics-card > header em { padding: 0.05rem 0.35rem; border-radius: 999px; background: var(--workbench-surface); color: var(--workbench-muted); font-size: 0.6rem; font-style: normal; font-weight: 800; } .fleet-diagnostics-card .fleet-notifications-counts { margin: 0; } .fleet-diagnostics-failures { margin: 0; padding-left: 1rem; color: var(--workbench-muted); font-size: 0.64rem; display: grid; gap: 0.15rem; overflow-wrap: anywhere; } .fleet-log-retention-row { min-width: 0; display: flex; align-items: center; gap: 0.45rem; padding: 0.5rem 0.6rem; border: 1px solid var(--workbench-border); border-radius: 10px; background: var(--workbench-surface-muted); color: var(--workbench-text); font-size: 0.7rem; font-weight: 800; } .fleet-log-retention-row > span { min-width: 0; overflow-wrap: anywhere; } .fleet-log-retention-row input[type='checkbox'] { flex: 0 0 auto; min-height: 0; width: 1rem; height: 1rem; padding: 0; } .fleet-log-retention-row em { color: var(--workbench-muted); font-size: 0.66rem; font-style: normal; } .fleet-log-retention-value { width: 7.5rem; margin-left: auto; padding: 0.25rem 0.5rem; border: 1px solid var(--workbench-border-strong); border-radius: var(--button-radius-compact); font-size: 0.68rem; } .fleet-log-retention-value:disabled { color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); opacity: 1; } .fleet-log-retention-actions { display: flex; justify-content: flex-end; gap: 0.4rem; margin-top: 0.6rem; } .fleet-log-retention-actions .primary-action { min-height: var(--button-height-compact); display: inline-flex; align-items: center; gap: 0.35rem; padding: 0.3rem 0.75rem; font-size: 0.68rem; } .fleet-log-retention-actions .primary-action svg { width: 0.82rem; height: 0.82rem; } .fleet-notification-list, .fleet-notification-devices { display: grid; gap: 0.45rem; margin: 0; padding: 0; list-style: none; } .fleet-notification-entry { min-width: 0; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 0.5rem; padding: 0.55rem 0.6rem; border: 1px solid var(--workbench-border); border-radius: 10px; background: var(--workbench-surface-muted); } .fleet-notification-queue-entry { grid-template-columns: minmax(0, 1fr) auto auto; } .fleet-notification-entry > div { min-width: 0; display: grid; gap: 0.2rem; } .fleet-notification-entry strong { min-width: 0; color: var(--workbench-text); font-size: 0.76rem; overflow-wrap: anywhere; } .fleet-notification-entry small { min-width: 0; color: var(--workbench-muted); font-size: 0.64rem; overflow-wrap: anywhere; } .fleet-notification-entry > span { flex: 0 0 auto; padding: 0.18rem 0.4rem; border: 1px solid var(--workbench-border); border-radius: 7px; color: var(--workbench-muted); background: var(--workbench-surface); font-size: 0.64rem; font-weight: 800; } .fleet-notification-entry-actions { flex: 0 0 auto; display: flex; gap: 0.3rem; } .fleet-notification-entry-button { width: var(--icon-button-size); height: var(--icon-button-size); display: inline-flex; align-items: center; justify-content: center; padding: 0; border: 1px solid var(--workbench-border); border-radius: var(--button-radius-compact); color: var(--workbench-text); background: var(--workbench-surface); } .fleet-notification-entry-button:hover:not(:disabled) { border-color: var(--workbench-mint); color: var(--workbench-mint); } .fleet-notification-entry-button.is-danger:hover:not(:disabled) { border-color: var(--workbench-danger); color: var(--workbench-danger); } .fleet-notification-entry-button:disabled { color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); opacity: 1; cursor: default; } .fleet-notification-entry-button svg { width: 0.82rem; height: 0.82rem; } .fleet-notification-entry[data-tone='ok'] > span { color: var(--workbench-mint); border-color: var(--workbench-mint-border); background: var(--workbench-mint-soft); } .fleet-notification-entry[data-tone='warn'] > span { color: var(--workbench-warning-text); border-color: var(--workbench-warning-border); background: var(--workbench-warning-soft); } .fleet-notification-entry[data-tone='attention'] > span { color: var(--workbench-danger); border-color: var(--workbench-danger-border); background: var(--workbench-danger-soft); } .fleet-notifications-result { margin: 0; padding: 0.55rem 0.6rem; border: 1px solid var(--workbench-mint-border); border-radius: var(--button-radius-compact); color: var(--workbench-mint); background: var(--workbench-mint-soft); font-size: 0.7rem; line-height: 1.4; } .fleet-notifications-result.is-error { border-color: var(--workbench-danger-border); color: var(--workbench-danger); background: var(--workbench-danger-soft); } .fleet-notifications-result + .fleet-notifications-empty, .fleet-notifications-result + .fleet-notification-list { margin-top: 0.45rem; } .fleet-notification-devices li { min-width: 0; display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; padding: 0.5rem 0.6rem; border: 1px solid var(--workbench-border); border-radius: 10px; background: var(--workbench-surface-muted); } .fleet-notification-devices li[data-state='unavailable'], .fleet-notification-devices li[data-state='failed'] { border-color: var(--workbench-danger-border); background: var(--workbench-danger-soft); } .fleet-notification-devices li > span { min-width: 0; display: flex; align-items: center; gap: 0.4rem; color: var(--workbench-text); } .fleet-notification-devices li > span svg { flex: 0 0 auto; width: 0.85rem; height: 0.85rem; color: var(--workbench-mint); } .fleet-notification-devices li[data-state='unavailable'] > span svg, .fleet-notification-devices li[data-state='failed'] > span svg { color: var(--workbench-danger); } .fleet-notification-devices li strong { min-width: 0; font-size: 0.76rem; overflow-wrap: anywhere; } .fleet-notification-devices li > small { flex: 0 0 auto; padding: 0.18rem 0.4rem; border: 1px solid var(--workbench-border); border-radius: 7px; color: var(--workbench-muted); background: var(--workbench-surface); font-size: 0.62rem; font-weight: 800; } .fleet-notification-devices li[data-state='ready'] > small { color: var(--workbench-mint); border-color: var(--workbench-mint-border); background: var(--workbench-mint-soft); } .fleet-notification-devices li[data-state='unavailable'] > small, .fleet-notification-devices li[data-state='failed'] > small { color: var(--workbench-danger); border-color: var(--workbench-danger-border); background: var(--workbench-danger-soft); } .fleet-notification-devices li[data-tone='attention'] { border-color: var(--workbench-danger-border); background: var(--workbench-danger-soft); } .fleet-notification-devices li[data-tone='ok'] > small { color: var(--workbench-mint); border-color: var(--workbench-mint-border); background: var(--workbench-mint-soft); } .fleet-notification-devices li[data-tone='attention'] > small { color: var(--workbench-danger); border-color: var(--workbench-danger-border); background: var(--workbench-danger-soft); } .fleet-notification-channel-picker { display: flex; flex-wrap: wrap; gap: 0.4rem 0.55rem; } .fleet-notification-device-option { display: inline-flex; align-items: center; gap: 0.4rem; padding: 0.32rem 0.5rem; border: 1px solid var(--workbench-border); border-radius: var(--button-radius-compact); color: var(--workbench-text); background: var(--workbench-surface); font-size: 0.7rem; font-weight: 700; } .fleet-notification-device-option:hover { border-color: var(--workbench-mint); } .fleet-notification-device-option:has(input:checked) { border-color: var(--workbench-mint); background: var(--workbench-mint-soft); } .fleet-notification-device-option input { width: 0.85rem; height: 0.85rem; margin: 0; accent-color: var(--workbench-mint); } .fleet-notification-device-option span { display: inline-flex; align-items: baseline; gap: 0.35rem; } .fleet-notification-device-option small { color: var(--workbench-muted); font-size: 0.6rem; font-weight: 600; } .fleet-notification-entry-status { justify-self: end; } .fleet-status-note { margin-top: 0.8rem; color: var(--workbench-muted); font-size: 0.76rem; } .state-panel-button { min-height: var(--button-height-compact); margin-left: 0.6rem; padding: 0.3rem 0.7rem; } @media (min-width: 48rem) and (max-width: 75rem) { .fleet-messages-layout { grid-template-columns: minmax(9rem, 12rem) minmax(0, 1fr); } .fleet-messages-conversation { grid-column: 1 / -1; } } @media (max-width: 60rem) { .fleet-messages-layout { grid-template-columns: 1fr; } .fleet-messages-sessions { max-height: 20rem; } .fleet-notifications-grid { grid-template-columns: 1fr; } } @media (max-width: 34rem) { .fleet-messages-summary { grid-template-columns: 1fr; } .fleet-notifications-counts { grid-template-columns: repeat(2, minmax(0, 1fr)); } .fleet-rate-limit-grid { grid-template-columns: 1fr; } .fleet-quiet-window { grid-template-columns: 1fr; } .fleet-messages-messages-heading { align-items: stretch; flex-direction: column; } .fleet-messages-search { width: 100%; } .fleet-messages-search input { width: 100%; } .fleet-messages-message header { grid-template-columns: auto auto minmax(0, 1fr); } .fleet-messages-message time { grid-column: 3; grid-row: 2; } } /* Field blocks keep helper text out of the control's accessible name. */ .field-block { margin-top: 0.7rem; display: grid; gap: 0.2rem; } .field-block > label { margin-top: 0; } /* ========================================================================== Button system: shared scale for every action control. Appended last on purpose. The stylesheet accumulated five overlapping eras of button styling, and the older element-level rules out-rank single class selectors, so a later layer is the only way to make one coherent scale win. ========================================================================== */ /* Animal UI is themed through custom properties, which keeps us off its hashed classes. */ :root { --animal-primary-color: #11776e; --animal-primary-color-hover: #0f6e66; --animal-primary-color-active: #0d5f58; --animal-primary-color-bg: #dff3e8; --animal-error-color: #b64d48; --animal-error-color-hover: #c4635e; --animal-error-color-active: #8f3531; --animal-text-color: #584a38; --animal-text-color-secondary: #6f6350; --animal-text-color-muted: #6f6350; --animal-text-color-disabled: #6f6350; --animal-border-color: #bdb29d; --animal-border-color-hover: #0f6e66; --animal-border-color-light: #d9d1bf; --animal-bg-color: #fffdf7; --animal-bg-color-secondary: #f8f4e8; --animal-bg-color-disabled: #ece6da; --animal-height-sm: 34px; --animal-height-base: 38px; --animal-height-lg: 42px; --animal-border-radius-sm: 8px; --animal-border-radius-base: 10px; --animal-border-radius-lg: 12px; --animal-border-width: 1px; --animal-shadow-sm: none; --animal-shadow-base: 0 3px 0 rgba(13, 95, 88, 0.28); --animal-shadow-lg: 0 14px 30px rgba(74, 61, 43, 0.14); } [class*='animal-btn-'] { height: auto; min-height: var(--button-height); display: inline-flex; align-items: center; justify-content: center; gap: 0.4rem; padding: 0.45rem 0.9rem; border-width: 1px; border-radius: var(--button-radius); box-shadow: none; font-weight: 750; white-space: normal; } [class*='animal-btn-']:focus-visible { outline: 3px solid var(--button-focus-ring); outline-offset: 2px; } [class*='animal-btn-small'] { min-height: var(--button-height-compact); padding: 0.3rem 0.7rem; border-radius: var(--button-radius-compact); font-size: 0.76rem; } [class*='animal-btn-middle'] { min-height: var(--button-height); padding: 0.45rem 0.9rem; font-size: 0.82rem; } [class*='animal-btn-large'] { min-height: var(--button-height-large); padding: 0.55rem 1.1rem; } [class*='animal-btn-icon'] { width: var(--icon-button-size); height: var(--icon-button-size); min-height: var(--icon-button-size); padding: 0; } [class*='animal-btn-block'] { display: flex; width: 100%; } /* The library ships "primary" as the cream 3D card button; the console reserves it for the mint action. */ [class*='animal-btn-primary'] { color: var(--button-primary-text); border-color: var(--button-primary-bg); background: var(--button-primary-bg); box-shadow: 0 3px 0 var(--button-primary-active); } [class*='animal-btn-primary']:hover:not(:disabled) { color: var(--button-primary-text); border-color: var(--button-primary-hover); background: var(--button-primary-hover); box-shadow: 0 4px 0 var(--button-primary-active); transform: translateY(-1px); } [class*='animal-btn-primary']:active:not(:disabled) { color: var(--button-primary-text); border-color: var(--button-primary-active); background: var(--button-primary-active); box-shadow: 0 1px 0 var(--button-primary-active); transform: translateY(1px); } [class*='animal-btn-default'], [class*='animal-btn-dashed'] { color: var(--button-secondary-text); border-color: var(--button-secondary-border); background: var(--button-secondary-bg); } [class*='animal-btn-default']:hover:not(:disabled), [class*='animal-btn-dashed']:hover:not(:disabled) { color: var(--button-secondary-hover-text); border-color: var(--button-secondary-hover-border); background: var(--button-secondary-hover-bg); } [class*='animal-btn-text'], [class*='animal-btn-link'], [class*='animal-btn-ghost'] { color: var(--workbench-muted); border-color: transparent; background: transparent; box-shadow: none; } [class*='animal-btn-text']:hover:not(:disabled), [class*='animal-btn-link']:hover:not(:disabled), [class*='animal-btn-ghost']:hover:not(:disabled) { color: var(--button-secondary-hover-text); background: var(--button-secondary-hover-bg); } /* The library paints danger text/link buttons white on transparent, which is invisible here. */ [class*='animal-btn-danger'][class*='animal-btn-primary'] { color: var(--button-danger-text); border-color: var(--button-danger-bg); background: var(--button-danger-bg); box-shadow: 0 3px 0 var(--button-danger-active); } [class*='animal-btn-danger'][class*='animal-btn-primary']:hover:not(:disabled) { border-color: var(--button-danger-hover); background: var(--button-danger-hover); } [class*='animal-btn-danger'][class*='animal-btn-default'], [class*='animal-btn-danger'][class*='animal-btn-dashed'] { color: var(--button-danger-text); border-color: var(--button-danger-bg); background: var(--workbench-danger-soft); } [class*='animal-btn-danger'][class*='animal-btn-text'], [class*='animal-btn-danger'][class*='animal-btn-link'], [class*='animal-btn-danger'][class*='animal-btn-ghost'] { color: var(--button-danger-bg); background: transparent; } [class*='animal-btn-danger'][class*='animal-btn-text']:hover:not(:disabled), [class*='animal-btn-danger'][class*='animal-btn-link']:hover:not(:disabled), [class*='animal-btn-danger'][class*='animal-btn-ghost']:hover:not(:disabled) { color: var(--button-danger-hover); background: var(--workbench-danger-soft); } [class*='animal-btn-'][class*='animal-btn-loading'] { color: var(--button-primary-text); border-color: var(--button-primary-active); background: var(--button-primary-bg); } [class*='animal-btn-']:disabled { color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); box-shadow: none; opacity: 1; transform: none; } /* Compact actions: secondary controls that sit inside panels, tables and drawers. */ button.state-panel-button, button.fleet-log-retention-actions .primary-action, .fleet-log-retention-actions .primary-action, button.fleet-notifications-retry-all, button.fleet-messages-delete, button.fleet-messages-search button, .fleet-messages-search button, button.fleet-notification-entry-button, .identity-actions button, .device-context-actions a, .row-actions button, .pagination button, .batch-entry-actions button, .fleet-card-admin-actions button, .segmented-control button { min-height: var(--button-height-compact); gap: 0.35rem; padding: 0.3rem 0.7rem; border-radius: var(--button-radius-compact); font-size: 0.76rem; font-weight: 750; } /* Secondary action inside a panel: keep it on the mint accent without the heavy fill. */ button.fleet-notifications-retry-all, .fleet-notifications-retry-all { color: var(--button-primary-hover); border: 1px solid var(--button-primary-bg); background: var(--workbench-mint-soft); box-shadow: none; } button.fleet-notifications-retry-all:hover:not(:disabled), .fleet-notifications-retry-all:hover:not(:disabled) { color: var(--button-primary-text); border-color: var(--button-primary-hover); background: var(--button-primary-hover); } button.fleet-notifications-retry-all:disabled, .fleet-notifications-retry-all:disabled { color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); opacity: 1; } button.fleet-messages-search button, .fleet-messages-search button { color: var(--button-primary-text); border: 1px solid var(--button-primary-bg); background: var(--button-primary-bg); box-shadow: none; } button.fleet-messages-search button:hover:not(:disabled), .fleet-messages-search button:hover:not(:disabled) { border-color: var(--button-primary-hover); background: var(--button-primary-hover); } button.fleet-messages-search button:disabled, .fleet-messages-search button:disabled { color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); opacity: 1; } button.fleet-messages-delete, button.danger-button, .danger-button, button.row-actions button.is-danger { color: var(--button-danger-text); border: 1px solid var(--button-danger-bg); background: var(--button-danger-bg); box-shadow: 0 2px 0 var(--button-danger-active); } button.fleet-messages-delete:hover:not(:disabled), .danger-button:hover:not(:disabled) { color: var(--button-danger-text); border-color: var(--button-danger-hover); background: var(--button-danger-hover); } button.fleet-messages-delete:disabled, .danger-button:disabled { color: var(--button-disabled-text); border-color: var(--button-disabled-border); background: var(--button-disabled-bg); box-shadow: none; opacity: 1; } .identity-actions button, .device-context-actions a { color: var(--button-secondary-text); border: 1px solid var(--button-secondary-border); background: var(--button-secondary-bg); box-shadow: none; } .identity-actions button:hover:not(:disabled), .device-context-actions a:hover { color: var(--button-secondary-hover-text); border-color: var(--button-secondary-hover-border); background: var(--button-secondary-hover-bg); } .device-context-primary { color: var(--button-primary-text); border-color: var(--button-primary-bg); background: var(--button-primary-bg); } .device-context-primary:hover { border-color: var(--button-primary-hover); background: var(--button-primary-hover); } /* Filter chips stay pill shaped on purpose: they are toggles, not commands. */ .fleet-messages-filter-chip { min-height: var(--button-height-compact); padding: 0.3rem 0.7rem; color: var(--workbench-muted); border: 1px solid var(--workbench-border-strong); background: var(--workbench-surface); } .fleet-messages-filter-chip[aria-pressed='true'] { color: var(--button-primary-hover); border-color: var(--button-primary-bg); background: var(--workbench-mint-soft); } /* Tabs and segmented controls keep their own geometry, but share the height scale. */ .workbench-tabs button { min-height: var(--button-height-large); } .segmented-control button { border-radius: var(--button-radius-compact); } .segmented-control { border-radius: 12px; } button:focus-visible { outline: 3px solid var(--button-focus-ring); outline-offset: 2px; } @media (max-width: 34rem) { .workbench-heading > button.primary-action, .workbench-heading > a.primary-action { width: 100%; } button.state-panel-button, button.fleet-notifications-retry-all, button.fleet-messages-delete, .identity-actions button, .device-context-actions a { min-height: var(--button-height); flex: 1 1 auto; } }