:root { --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 24px; --space-6: 32px; --space-7: 48px; --space-8: 64px; --text-xs: 12px; --text-sm: 13px; --text-base: 14px; --text-md: 16px; --text-lg: 20px; --text-xl: 24px; --text-2xl: 32px; --weight-normal: 400; --weight-medium: 500; --leading-body: 1.6; --leading-heading: 1.3; --radius-sm: 8px; --radius-md: 12px; --radius-lg: 16px; --radius-pill: 999px; --duration-fast: 120ms; --duration-base: 200ms; --ease: cubic-bezier(0.2, 0, 0.2, 1); --z-base: 0; --z-sticky: 10; --z-dropdown: 20; --z-overlay: 30; --z-modal: 40; --z-toast: 50; --font-sans: -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; --font-mono: ui-monospace, "Cascadia Code", Consolas, monospace; } :root, [data-theme="light"] { --color-bg-page: #f7f7f5; --color-bg-surface: #ffffff; --color-bg-subtle: #f1efe8; --color-bg-inverse: #2c2c2a; --color-text-primary: #2c2c2a; --color-text-secondary: #5f5e5a; --color-text-tertiary: #6f6e6a; --color-text-inverse: #ffffff; --color-border-subtle: rgba(0, 0, 0, 0.08); --color-border-default: rgba(0, 0, 0, 0.15); --color-border-strong: rgba(0, 0, 0, 0.3); --color-accent: #185fa5; --color-accent-hover: #0c447c; --color-accent-subtle: #e6f1fb; --color-on-accent: #ffffff; --color-success: #0f6e56; --color-success-subtle: #e1f5ee; --color-warning: #854f0b; --color-warning-subtle: #faeeda; --color-danger: #a32d2d; --color-danger-subtle: #fcebeb; --color-focus-ring: #185fa5; --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06); --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08); } [data-theme="dark"] { --color-bg-page: #1b1b19; --color-bg-surface: #262624; --color-bg-subtle: #2f2f2c; --color-bg-inverse: #f1efe8; --color-text-primary: #f1efe8; --color-text-secondary: #b4b2a9; --color-text-tertiary: #9a9890; --color-text-inverse: #2c2c2a; --color-border-subtle: rgba(255, 255, 255, 0.1); --color-border-default: rgba(255, 255, 255, 0.18); --color-border-strong: rgba(255, 255, 255, 0.32); --color-accent: #85b7eb; --color-accent-hover: #b5d4f4; --color-accent-subtle: #0c447c; --color-on-accent: #042c53; --color-success: #5dcaa5; --color-success-subtle: #085041; --color-warning: #ef9f27; --color-warning-subtle: #633806; --color-danger: #f09595; --color-danger-subtle: #791f1f; --color-focus-ring: #85b7eb; --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4); --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.5); } * { box-sizing: border-box; } body { margin: 0; background: var(--color-bg-page); color: var(--color-text-primary); font-family: var(--font-sans); font-size: var(--text-base); font-weight: var(--weight-normal); line-height: var(--leading-body); } h1, h2, h3, h4 { margin: 0; font-weight: var(--weight-medium); line-height: var(--leading-heading); } h1 { font-size: var(--text-2xl); } h2 { font-size: var(--text-xl); } h3 { font-size: var(--text-lg); } h4 { font-size: var(--text-md); } p { margin: 0; } :focus-visible { outline: 2px solid var(--color-focus-ring); outline-offset: 2px; } button, a, input, select, textarea { font: inherit; color: inherit; } .btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2); min-height: 44px; padding: 0 var(--space-4); border: 1px solid transparent; border-radius: var(--radius-sm); font-size: var(--text-base); font-weight: var(--weight-medium); cursor: pointer; transition: background var(--duration-fast) var(--ease); } .btn:disabled { opacity: 0.5; cursor: not-allowed; } .btn-primary { background: var(--color-accent); color: var(--color-on-accent); } .btn-primary:hover:not(:disabled) { background: var(--color-accent-hover); } .btn-secondary { background: var(--color-bg-surface); border-color: var(--color-border-default); color: var(--color-text-primary); } .btn-secondary:hover:not(:disabled) { border-color: var(--color-border-strong); } .btn-ghost { background: transparent; color: var(--color-text-secondary); } .btn-ghost:hover:not(:disabled) { background: var(--color-bg-subtle); color: var(--color-text-primary); } .card { padding: var(--space-5); background: var(--color-bg-surface); border: 1px solid var(--color-border-default); border-radius: var(--radius-md); } .field { display: flex; flex-direction: column; gap: var(--space-2); } .field-label { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--color-text-secondary); } .input { min-height: 44px; padding: 0 var(--space-3); background: var(--color-bg-surface); border: 1px solid var(--color-border-default); border-radius: var(--radius-sm); font-size: var(--text-base); } .input:focus-visible { border-color: var(--color-accent); outline: 2px solid var(--color-focus-ring); outline-offset: 1px; } .input[aria-invalid="true"] { border-color: var(--color-danger); } .field-hint { font-size: var(--text-xs); color: var(--color-text-tertiary); } .field-error { font-size: var(--text-xs); color: var(--color-danger); } .stack { display: flex; flex-direction: column; } .stack-2 { gap: var(--space-2); } .stack-3 { gap: var(--space-3); } .stack-4 { gap: var(--space-4); } .stack-5 { gap: var(--space-5); } .stack-6 { gap: var(--space-6); } .row { display: flex; align-items: center; } .row-2 { gap: var(--space-2); } .row-3 { gap: var(--space-3); } .row-4 { gap: var(--space-4); } .muted { color: var(--color-text-secondary); } .hint { color: var(--color-text-tertiary); font-size: var(--text-xs); } .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .skeleton { background: var(--color-bg-subtle); border-radius: var(--radius-sm); animation: pulse 1.2s var(--ease) infinite; } @media (prefers-reduced-motion: no-preference) { @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.55; } } } @media (prefers-reduced-motion: reduce) { * { animation: none !important; transition: none !important; } } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }