Files
zclaw_openfang/admin-v2/src/styles/globals.css
iven 6cae768401
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
fix(desktop): session persistence — refresh/login/context/empty-content 4-bug fix
1. App.tsx: add restoreSession() call on startup to prevent redirect
   to login page after refresh (isRestoring guard + BootstrapScreen)
2. CloneManager: call syncAgents() after loadClones() to restore
   currentAgent and conversation history on app load
3. zclaw-memory: add get_or_create_session() so frontend session UUID
   is persisted directly — kernel no longer creates mismatched IDs
4. openai.rs: assistant message content must be non-empty for
   Kimi/Qwen APIs — replace empty content with meaningful placeholders

Also includes admin-v2 ModelServices unified page (merge providers +
models + API keys into expandable row layout)
2026-03-31 13:38:59 +08:00

236 lines
6.1 KiB
CSS

@import "tailwindcss";
/* ============================================================
ZCLAW Admin Design Tokens
DeerFlow-inspired warm neutral palette with brand accents
============================================================ */
@theme {
/* Brand Colors */
--color-brand-purple: #863bff;
--color-brand-blue: #47bfff;
--color-brand-gradient: linear-gradient(135deg, #863bff, #47bfff);
/* Neutral (warm stone palette) */
--color-neutral-50: #fafaf9;
--color-neutral-100: #f5f5f4;
--color-neutral-200: #e7e5e4;
--color-neutral-300: #d6d3d1;
--color-neutral-400: #a8a29e;
--color-neutral-500: #78716c;
--color-neutral-600: #57534e;
--color-neutral-700: #44403c;
--color-neutral-800: #292524;
--color-neutral-900: #1c1917;
--color-neutral-950: #0c0a09;
/* Semantic Colors */
--color-success: #22c55e;
--color-success-soft: #dcfce7;
--color-warning: #f59e0b;
--color-warning-soft: #fef3c7;
--color-error: #ef4444;
--color-error-soft: #fee2e2;
--color-info: #3b82f6;
--color-info-soft: #dbeafe;
/* Dark mode neutrals */
--color-dark-bg: #0c0a09;
--color-dark-surface: #1c1917;
--color-dark-card: #292524;
--color-dark-border: #44403c;
--color-dark-text: #fafaf9;
--color-dark-text-secondary: #a8a29e;
/* Spacing */
--spacing-sidebar-expanded: 16rem;
--spacing-sidebar-collapsed: 3rem;
--spacing-header-height: 3.5rem;
/* Border Radius */
--radius-sm: 6px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-xl: 16px;
/* Shadows */
--shadow-card: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04);
--shadow-card-hover: 0 4px 12px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.04);
--shadow-dropdown: 0 4px 16px rgba(0, 0, 0, 0.12);
--shadow-modal: 0 8px 32px rgba(0, 0, 0, 0.16);
/* Typography */
--font-sans: "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;
--font-mono: "JetBrains Mono", ui-monospace, monospace;
/* Transitions */
--transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
--transition-normal: 200ms cubic-bezier(0.4, 0, 0.2, 1);
--transition-slow: 300ms cubic-bezier(0.4, 0, 0.2, 1);
}
/* ============================================================
Base Styles
============================================================ */
html {
font-family: var(--font-sans);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body {
margin: 0;
background-color: var(--color-neutral-50);
color: var(--color-neutral-900);
transition: background-color var(--transition-normal), color var(--transition-normal);
}
/* Dark mode overrides */
html.dark body {
background-color: var(--color-dark-bg);
color: var(--color-dark-text);
}
/* Scrollbar styling */
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background-color: var(--color-neutral-300);
border-radius: 3px;
}
html.dark ::-webkit-scrollbar-thumb {
background-color: var(--color-dark-border);
}
/* Focus visible */
:focus-visible {
outline: 2px solid var(--color-brand-purple);
outline-offset: 2px;
border-radius: 4px;
}
/* Skip to content (accessibility) */
.skip-to-content {
position: absolute;
top: -100%;
left: 50%;
transform: translateX(-50%);
z-index: 9999;
padding: 8px 16px;
background: var(--color-brand-purple);
color: white;
border-radius: var(--radius-md);
font-size: 14px;
text-decoration: none;
transition: top var(--transition-fast);
}
.skip-to-content:focus {
top: 8px;
}
/* ============================================================
Ant Design Overrides (Light Mode)
============================================================ */
/* ProTable search area */
.ant-pro-table-search {
background-color: var(--color-neutral-50) !important;
border-bottom: 1px solid var(--color-neutral-200) !important;
}
/* Card styling */
.ant-card {
border-radius: var(--radius-lg) !important;
border: 1px solid var(--color-neutral-200) !important;
box-shadow: var(--shadow-card) !important;
}
.ant-card:hover {
box-shadow: var(--shadow-card-hover) !important;
}
/* Table styling */
.ant-table-wrapper .ant-table-thead > tr > th {
background-color: var(--color-neutral-50) !important;
font-weight: 600 !important;
color: var(--color-neutral-600) !important;
}
/* Modal styling */
.ant-modal .ant-modal-content {
border-radius: var(--radius-lg) !important;
}
/* Tag pill style */
.ant-tag {
border-radius: 9999px !important;
padding: 0 8px !important;
}
/* Form item */
.ant-form-item-label > label {
font-weight: 500 !important;
color: var(--color-neutral-700) !important;
}
/* ============================================================
Dark Mode — Ant Design Overrides
============================================================ */
html.dark .ant-card {
background-color: var(--color-dark-card) !important;
border-color: var(--color-dark-border) !important;
}
html.dark .ant-table-wrapper .ant-table-thead > tr > th {
background-color: var(--color-dark-surface) !important;
color: var(--color-dark-text-secondary) !important;
}
html.dark .ant-table-wrapper .ant-table-tbody > tr > td {
border-color: var(--color-dark-border) !important;
}
html.dark .ant-table-wrapper .ant-table-tbody > tr:hover > td {
background-color: rgba(134, 59, 255, 0.06) !important;
}
html.dark .ant-modal .ant-modal-content {
background-color: var(--color-dark-card) !important;
}
html.dark .ant-modal .ant-modal-header {
background-color: var(--color-dark-card) !important;
}
html.dark .ant-drawer .ant-drawer-content {
background-color: var(--color-dark-surface) !important;
}
html.dark .ant-form-item-label > label {
color: var(--color-dark-text-secondary) !important;
}
html.dark .ant-select-selector,
html.dark .ant-input,
html.dark .ant-input-number {
background-color: var(--color-dark-card) !important;
border-color: var(--color-dark-border) !important;
color: var(--color-dark-text) !important;
}
html.dark .ant-pro-table-search {
background-color: var(--color-dark-surface) !important;
border-color: var(--color-dark-border) !important;
}