/* === TRAE Work Design Tokens === */ :root { /* radius */ --radius-0: 0px; --radius-2: 2px; --radius-4: 4px; --radius-6: 6px; --radius-8: 8px; --radius-10: 10px; --radius-12: 12px; --radius-16: 16px; --radius-20: 20px; --radius-24: 24px; --radius-32: 32px; --radius-full: 999px; --radius-xs: var(--radius-2); --radius-sm: var(--radius-4); --radius-md: var(--radius-6); --radius-lg: var(--radius-8); --radius-xl: var(--radius-10); --border-width-default: 1px; /* spacers */ --spacer-0: 0px; --spacer-2: 2px; --spacer-3: 3px; --spacer-4: 4px; --spacer-6: 6px; --spacer-8: 8px; --spacer-10: 10px; --spacer-12: 12px; --spacer-16: 16px; --spacer-20: 20px; --spacer-24: 24px; --spacer-32: 32px; --spacer-40: 40px; --spacer-48: 48px; --spacer-64: 64px; /* icon sizes */ --icon-size-12: 12px; --icon-size-14: 14px; --icon-size-16: 16px; --icon-size-20: 20px; --icon-size-24: 24px; /* font */ --font-family-default: "SF Pro Text", "PingFang SC", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; --font-family-heading: "SF Pro", "PingFang SC", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; --font-family-metric: "Inter", "SF Pro Text", "PingFang SC", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; --font-family-mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace; --font-weight-default: 400; --font-weight-code: 450; --font-weight-medium: 500; --font-weight-strong: 600; --font-family-base: var(--font-family-default); --font-family-heading-alias: var(--font-family-heading); --font-family-mono-alias: var(--font-family-mono); /* body */ --body-xs-font-family: var(--font-family-default); --body-xs-font-size: 10px; --body-xs-font-weight: 400; --body-xs-line-height: 14px; --body-xs-letter-spacing: 0; --body-xs-strong-font-family: var(--font-family-default); --body-xs-strong-font-size: 10px; --body-xs-strong-font-weight: 500; --body-xs-strong-line-height: 14px; --body-xs-strong-letter-spacing: 0; --body-sm-font-family: var(--font-family-default); --body-sm-font-size: 11px; --body-sm-font-weight: 400; --body-sm-line-height: 16px; --body-sm-letter-spacing: 0; --body-sm-strong-font-family: var(--font-family-default); --body-sm-strong-font-size: 11px; --body-sm-strong-font-weight: 500; --body-sm-strong-line-height: 16px; --body-sm-strong-letter-spacing: 0; --body-md-font-family: var(--font-family-default); --body-md-font-size: 12px; --body-md-font-weight: 400; --body-md-line-height: 18px; --body-md-letter-spacing: 0; --body-md-strong-font-family: var(--font-family-default); --body-md-strong-font-size: 12px; --body-md-strong-font-weight: 500; --body-md-strong-line-height: 18px; --body-md-strong-letter-spacing: 0; --body-base-font-family: var(--font-family-default); --body-base-font-size: 14px; --body-base-font-weight: 400; --body-base-line-height: 20px; --body-base-letter-spacing: -0.02em; --body-base-strong-font-family: var(--font-family-default); --body-base-strong-font-size: 14px; --body-base-strong-font-weight: 500; --body-base-strong-line-height: 20px; --body-base-strong-letter-spacing: -0.02em; --body-lg-font-family: var(--font-family-default); --body-lg-font-size: 18px; --body-lg-font-weight: 400; --body-lg-line-height: 28px; --body-lg-letter-spacing: -0.02em; /* heading */ --heading-3xs-font-family: var(--font-family-default); --heading-3xs-font-size: 11px; --heading-3xs-font-weight: 600; --heading-3xs-line-height: 16px; --heading-3xs-letter-spacing: 0; --heading-2xs-font-family: var(--font-family-default); --heading-2xs-font-size: 12px; --heading-2xs-font-weight: 600; --heading-2xs-line-height: 18px; --heading-2xs-letter-spacing: 0; --heading-xs-font-family: var(--font-family-default); --heading-xs-font-size: 13px; --heading-xs-font-weight: 600; --heading-xs-line-height: 20px; --heading-xs-letter-spacing: 0; --heading-sm-font-family: var(--font-family-default); --heading-sm-font-size: 16px; --heading-sm-font-weight: 600; --heading-sm-line-height: 24px; --heading-sm-letter-spacing: 0; --heading-md-font-family: var(--font-family-heading); --heading-md-font-size: 20px; --heading-md-font-weight: 600; --heading-md-line-height: 28px; --heading-md-letter-spacing: 0; --heading-lg-font-family: var(--font-family-heading); --heading-lg-font-size: 22px; --heading-lg-font-weight: 600; --heading-lg-line-height: 30px; --heading-lg-letter-spacing: 0; --heading-xl-font-family: var(--font-family-heading); --heading-xl-font-size: 24px; --heading-xl-font-weight: 600; --heading-xl-line-height: 32px; --heading-xl-letter-spacing: 0; --heading-2xl-font-family: var(--font-family-heading); --heading-2xl-font-size: 28px; --heading-2xl-font-weight: 600; --heading-2xl-line-height: 36px; --heading-2xl-letter-spacing: 0; --heading-3xl-font-family: var(--font-family-heading); --heading-3xl-font-size: 32px; --heading-3xl-font-weight: 600; --heading-3xl-line-height: 40px; --heading-3xl-letter-spacing: 0; --heading-display-font-family: var(--font-family-heading); --heading-display-font-size: 52px; --heading-display-font-weight: 600; --heading-display-line-height: 60px; --heading-display-letter-spacing: -0.03em; --heading-display-sm-font-family: var(--font-family-heading); --heading-display-sm-font-size: 40px; --heading-display-sm-font-weight: 600; --heading-display-sm-line-height: 48px; --heading-display-sm-letter-spacing: -0.02em; /* code */ --code-editor-font-family: var(--font-family-mono); --code-editor-font-size: 13px; --code-editor-font-weight: 450; --code-editor-line-height: 20px; --code-terminal-font-family: var(--font-family-mono); --code-terminal-font-size: 12px; --code-terminal-font-weight: 450; --code-terminal-line-height: 18px; --code-text: #17181A; --code-doc: #8393A3; --code-link: #2F74FF; --code-number: #E54595; --code-action: #5F36B2; --code-instruction: #B15EF2; --code-function: #FF5D4D; --code-constant: #175CE6; --code-parameter: #4DA621; --code-attribute: #C99100; --code-tag: #E24864; /* bg */ --bg-base-default: #FFFFFF; --bg-base-secondary: #F5F5F5; --bg-base-tertiary: #E5E5E5; --bg-overlay-l1: rgba(115, 115, 115, 0.08); --bg-overlay-l2: rgba(115, 115, 115, 0.12); --bg-overlay-l3: rgba(115, 115, 115, 0.16); --bg-overlay-l4: rgba(115, 115, 115, 0.20); --bg-white: #FFFFFF; --bg-menu: #FFFFFF; --bg-tooltip: #FFFFFF; --bg-invert: #262626; --bg-invert-hover: #404040; --bg-invert-active: #171717; --bg-invert-disabled: rgba(115, 115, 115, 0.20); --color-background: var(--bg-base-default); --color-surface: var(--bg-base-secondary); --color-surface-variant: var(--bg-base-tertiary); --color-overlay-1: var(--bg-overlay-l1); --color-overlay-2: var(--bg-overlay-l2); --color-overlay-3: var(--bg-overlay-l3); --color-overlay-4: var(--bg-overlay-l4); --color-card: var(--bg-base-secondary); --color-tooltip: var(--bg-tooltip); --color-menu: var(--bg-menu); /* bg-brand */ --bg-brand: #4B3FE3; --bg-brand-hover: #6A6FFF; --bg-brand-active: #3F31C6; --bg-brand-disabled: rgba(75, 63, 227, 0.22); --bg-brand-popup: rgba(170, 183, 255, 0.36); --color-primary: var(--bg-brand); --color-primary-hover: var(--bg-brand-hover); --color-primary-disabled: var(--bg-brand-disabled); --color-primary-soft: var(--bg-brand-popup); --color-accent: var(--bg-brand); /* text */ --text-default: #171717; --text-default-hover: #262626; --text-default-active: #262626; --text-secondary: #404040; --text-secondary-hover: #171717; --text-secondary-active: #171717; --text-tertiary: #737373; --text-disabled: #A1A1A1; --text-onbrand: #FFFFFF; --text-onaccent: #FFFFFF; --text-white: #FFFFFF; --color-foreground: var(--text-default); --color-foreground-hover: var(--text-default-hover); --color-on-surface: var(--text-default); --color-on-surface-variant: var(--text-secondary); --color-muted-foreground: var(--text-secondary); --color-disabled-foreground: var(--text-disabled); --color-on-primary: var(--text-onbrand); --text-brand: #4B3FE3; --text-brand-hover: #6A6FFF; /* icon */ --icon-default: #262626; --icon-default-hover: #171717; --icon-default-active: #171717; --icon-secondary: #404040; --icon-secondary-hover: #262626; --icon-secondary-active: #262626; --icon-tertiary: #737373; --icon-disabled: #A1A1A1; --icon-onbrand: #FFFFFF; --icon-onaccent: #FFFFFF; --icon-white: #FFFFFF; --icon-brand: #4B3FE3; --icon-brand-hover: #6A6FFF; /* border */ --border-neutral-l1: rgba(115, 115, 115, 0.12); --border-neutral-l2: rgba(115, 115, 115, 0.18); --border-neutral-l3: rgba(115, 115, 115, 0.36); --border-contrast: #000000; --border-brand: #4B3FE3; --color-border: var(--border-neutral-l1); --color-border-strong: var(--border-neutral-l2); --color-border-stronger: var(--border-neutral-l3); --color-border-contrast: var(--border-contrast); --color-outline: var(--border-neutral-l1); /* accent */ --accent-teal: #00B983; --accent-coral: #FF6B45; --accent-amber: #F2A90C; --accent-lime: #5FC000; --accent-cyan: #00B6F5; --accent-blue: #3F85FF; --accent-magenta: #F53CFF; --accent-violet: #9570FF; --accent-slate: #747E94; /* status */ --status-primary-default: #2F74FF; --status-primary-hover: #4C88FF; --status-primary-active: #1759DD; --status-primary-surface-l1: rgba(47, 116, 255, 0.12); --status-primary-surface-l2: rgba(47, 116, 255, 0.18); --status-primary-surface-l3: rgba(47, 116, 255, 0.36); --status-success-default: #15A877; --status-success-hover: #2FB287; --status-success-active: #1E8B56; --status-success-surface-l1: rgba(64, 176, 139, 0.12); --status-success-surface-l2: rgba(64, 176, 139, 0.18); --status-success-surface-l3: rgba(64, 176, 139, 0.36); --status-alert-default: #FEA900; --status-alert-hover: #FFB700; --status-alert-active: #E59100; --status-alert-surface-l1: rgba(254, 169, 0, 0.14); --status-alert-surface-l2: rgba(254, 169, 0, 0.20); --status-alert-surface-l3: rgba(254, 169, 0, 0.36); --status-warning-default: #E27900; --status-warning-hover: #F39A35; --status-warning-active: #C46F11; --status-warning-surface-l1: rgba(226, 121, 0, 0.12); --status-warning-surface-l2: rgba(226, 121, 0, 0.16); --status-warning-surface-l3: rgba(226, 121, 0, 0.36); --status-error-default: #E8463A; --status-error-hover: #EA574C; --status-error-active: #C9382F; --status-error-surface-l1: rgba(232, 70, 58, 0.12); --status-error-surface-l2: rgba(232, 70, 58, 0.16); --status-error-surface-l3: rgba(232, 70, 58, 0.36); --color-info: var(--status-primary-default); --color-success: var(--status-success-default); --color-warning: var(--status-warning-default); --color-error: var(--status-error-default); --color-error-soft: var(--status-error-surface-l1); /* brand */ --brand-50: #F2F7FF; --brand-100: #E5EAFF; --brand-200: #CFD8FF; --brand-300: #AAB7FF; --brand-400: #8894FF; --brand-500: #6A6FFF; --brand-600: #4B3FE3; --brand-700: #3F31C6; --brand-800: #2C2290; --brand-900: #1A1759; --brand-950: #010109; --brand-grey-50: #FAFAFA; --brand-grey-100: #F5F5F5; --brand-grey-200: #E5E5E5; --brand-grey-300: #D4D4D4; --brand-grey-400: #A1A1A1; --brand-grey-500: #737373; --brand-grey-600: #525252; --brand-grey-700: #404040; --brand-grey-800: #262626; --brand-grey-900: #171717; --brand-grey-950: #0A0A0A; --brand-green-100: var(--brand-50); --brand-green-200: var(--brand-100); --brand-green-300: var(--brand-200); --brand-green-400: var(--brand-300); --brand-green-500: var(--brand-600); --brand-green-600: var(--brand-500); --brand-green-700: var(--brand-700); --brand-green-800: var(--brand-800); --brand-green-900: var(--brand-900); --brand-green-1000: var(--brand-950); --brand-red-100: #FFE5E5; --brand-red-200: #FFCCCC; --brand-red-300: #FFB2B2; --brand-red-400: #FF9999; --brand-red-500: #FF8080; --brand-red-600: #FF6464; --brand-red-700: #E63737; --brand-red-800: #CB1010; --brand-red-900: #8F0505; --brand-red-1000: #4D0000; --brand-yellow-100: #FFF6E5; --brand-yellow-200: #FFECCC; --brand-yellow-300: #FFE3B2; --brand-yellow-400: #FFDA99; --brand-yellow-500: #FFD080; --brand-yellow-600: #FFC864; --brand-yellow-700: #E6A637; --brand-yellow-800: #CB8710; --brand-yellow-900: #8F5C05; --brand-yellow-1000: #4D3000; --brand-blue-100: #E5F3FF; --brand-blue-200: #CCE6FF; --brand-blue-300: #B2DAFF; --brand-blue-400: #99CEFF; --brand-blue-500: #80C1FF; --brand-blue-600: #64B4FF; --brand-blue-700: #3792E6; --brand-blue-800: #1071CB; --brand-blue-900: #054C8F; --brand-blue-1000: #00284D; --brand-purple-100: #E8E5FF; --brand-purple-200: #D2CCFF; --brand-purple-300: #BBB2FF; --brand-purple-400: #A599FF; --brand-purple-500: #8E80FF; --brand-purple-600: #7864FF; --brand-purple-700: #4C37E6; --brand-purple-800: #2610CB; --brand-purple-900: #15058F; --brand-purple-1000: #09004D; --brand-neutral-grey-100: #F2F2F2; --brand-neutral-grey-200: #E3E3E3; --brand-neutral-grey-300: #D6D6D6; --brand-neutral-grey-400: #C7C7C7; --brand-neutral-grey-500: #BABABA; --brand-neutral-grey-600: #ABABAB; --brand-neutral-grey-700: #8A8A8A; --brand-neutral-grey-800: #686868; --brand-neutral-grey-900: #474747; --brand-neutral-grey-1000: #262626; --brand-blue-grey-100: #F1EFF4; --brand-blue-grey-200: #E0E1E6; --brand-blue-grey-300: #CFD3D8; --brand-blue-grey-400: #BFC5CA; --brand-blue-grey-500: #B0B5BA; --brand-blue-grey-600: #A0A6AB; --brand-blue-grey-700: #80898E; --brand-blue-grey-800: #5E696E; --brand-blue-grey-900: #404A4F; --brand-blue-grey-1000: #21262B; --brand-green-grey-100: #F1F4F4; --brand-green-grey-200: #E0E6E6; --brand-green-grey-300: #CFD8D8; --brand-green-grey-400: #BFCACA; --brand-green-grey-500: #B0BABA; --brand-green-grey-600: #A0ABAB; --brand-green-grey-700: #808E8E; --brand-green-grey-800: #5E6E6E; --brand-green-grey-900: #404F4F; --brand-green-grey-1000: #212B2B; /* generic fallback */ --font-family: var(--font-family-default); --font-size: var(--body-xs-font-size); --font-weight: var(--body-xs-font-weight); --line-height: var(--body-xs-line-height); /* viz */ --viz-series-brand: var(--bg-brand); --viz-series-brand-soft: var(--brand-300); --viz-series-brand-mid: var(--brand-500); --viz-series-brand-deep: var(--brand-700); --viz-series-neutral: var(--brand-grey-500); --viz-series-coral: #F87454; --viz-series-amber: #EDAA45; --viz-series-mint: #1DC981; --viz-series-teal: #59E8E8; --viz-series-sky: #22A5F7; --viz-series-violet: #B655FC; --viz-series-magenta: #FB9DD7; --viz-series-indigo: #B6A3FF; --viz-series-lime: #A6EA39; --viz-series-slate: #859EAD; --viz-ui-bg-chart: var(--bg-menu); --viz-ui-bg-tooltip: var(--bg-tooltip); --viz-ui-chart-title: var(--text-default); --viz-ui-chart-subtitle: var(--text-secondary); --viz-ui-chart-axis: var(--border-neutral-l2); --viz-ui-chart-tick: var(--text-secondary); --viz-ui-legend-label: var(--text-secondary); --viz-ui-legend-value: var(--text-default); /* special */ --special-white: #FFFFFF; --special-black: #000000; --special-bgtabsoverlay: rgba(255, 255, 255, 0.12); --special-bggoldoverlay: rgba(210, 181, 19, 0.12); /* layout aliases */ --brand-1: var(--brand-600); --brand-2: var(--brand-500); --brand-3: var(--brand-300); --brand-4: var(--brand-100); --site-canvas: var(--bg-base-default); --bg-layout-1: var(--bg-base-secondary); --bg-layout-2: var(--bg-overlay-l1); --border-1: var(--border-neutral-l1); } /* === Reset === */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: var(--font-family-default); background: var(--bg-base-secondary); color: var(--text-default); height: 100vh; overflow: hidden; } /* === App Layout === */ .app-layout { display: flex; height: 100vh; } /* === Sidebar === */ .sidebar { width: 220px; background: #fff; border-right: 1px solid var(--border-neutral-l1); display: flex; flex-direction: column; flex-shrink: 0; transition: width 0.2s; overflow: hidden; } .sidebar.collapsed { width: 0; border-right: none; } .sidebar-header { padding: 20px 16px 12px; display: flex; align-items: center; gap: 10px; border-bottom: 1px solid var(--bg-overlay-l1); } .sidebar-logo { font-size: 24px; } .sidebar-title { font-size: var(--heading-sm-font-size); font-weight: var(--heading-sm-font-weight); color: var(--text-default); line-height: var(--heading-sm-line-height); } .sidebar-nav { flex: 1; overflow-y: auto; padding: 8px 0; } .nav-section { padding: 0 8px; } .nav-section-title { font-size: var(--body-md-font-size); color: var(--text-tertiary); padding: 8px 12px 4px; font-weight: 500; } .nav-item { display: flex; align-items: center; gap: 8px; padding: 8px 12px; border-radius: var(--radius-6); cursor: pointer; font-size: var(--body-base-font-size); color: var(--text-secondary); transition: all 0.15s; } .nav-item:hover { background: var(--bg-base-secondary); color: var(--text-default); } .nav-item.active { background: var(--bg-overlay-l2); color: var(--text-default); font-weight: 500; } .nav-icon { font-size: 16px; width: 20px; text-align: center; } .nav-label { flex: 1; } .nav-count { font-size: var(--body-md-font-size); color: var(--text-tertiary); background: var(--bg-overlay-l1); padding: 1px 6px; border-radius: var(--radius-8); } .nav-item.active .nav-count { background: var(--bg-overlay-l3); color: var(--text-secondary); } .nav-divider { height: 1px; background: var(--bg-overlay-l1); margin: 8px 16px; } .sidebar-footer { padding: 12px; border-top: 1px solid var(--bg-overlay-l1); } /* === Main Area === */ .main-area { flex: 1; display: flex; flex-direction: column; overflow: hidden; min-width: 0; } /* === Top Bar === */ .topbar { height: 56px; background: #fff; border-bottom: 1px solid var(--border-neutral-l1); display: flex; align-items: center; padding: 0 16px; gap: 16px; flex-shrink: 0; } .topbar-left { display: flex; align-items: center; gap: 12px; } .topbar-center { display: flex; align-items: center; } .topbar-right { display: flex; align-items: center; gap: 12px; margin-left: auto; } .btn-icon { width: 32px; height: 32px; border: none; background: none; font-size: 18px; cursor: pointer; border-radius: var(--radius-6); display: flex; align-items: center; justify-content: center; } .btn-icon:hover { background: var(--bg-overlay-l1); } .breadcrumb { display: flex; align-items: center; gap: 6px; font-size: var(--body-base-font-size); } .breadcrumb-item { color: var(--text-secondary); cursor: pointer; } .breadcrumb-item:hover { color: var(--text-default); } .breadcrumb-item.active { color: var(--text-default); font-weight: 500; } .breadcrumb-sep { color: var(--text-tertiary); } /* Slider */ .slider-group { display: flex; align-items: center; gap: 8px; } .slider-label { font-size: var(--body-md-font-size); color: var(--text-tertiary); } .slider-group input[type="range"] { width: 120px; accent-color: var(--bg-brand); } /* View Toggle */ .view-toggle { display: flex; border: 1px solid var(--border-neutral-l1); border-radius: var(--radius-6); overflow: hidden; } .view-btn { width: 32px; height: 30px; border: none; background: #fff; font-size: 16px; cursor: pointer; display: flex; align-items: center; justify-content: center; } .view-btn.active { background: var(--bg-overlay-l3); color: var(--text-default); } .view-btn:hover:not(.active) { background: var(--bg-base-secondary); } .search-box input { padding: 6px 12px; border: 1px solid var(--border-neutral-l1); border-radius: var(--radius-6); background: var(--bg-base-default); font-size: var(--body-md-font-size); width: 220px; } .search-box input:focus { outline: none; border-color: var(--border-contrast); background: #fff; } /* Buttons */ .btn { padding: 6px 14px; border: none; border-radius: var(--radius-6); cursor: pointer; font-size: var(--body-md-font-size); font-weight: var(--font-weight-medium); transition: all 0.15s; white-space: nowrap; } .btn-upload { background: var(--bg-brand); color: var(--text-onbrand); } .btn-upload:hover { background: var(--bg-brand-active); } .btn-block { width: 100%; text-align: center; padding: 10px; font-size: var(--body-base-font-size); } .btn-analyze { background: var(--bg-overlay-l1); color: var(--text-default); border: 1px solid var(--border-neutral-l1); } .btn-analyze:hover { background: var(--border-neutral-l1); } .btn-analyze:disabled { opacity: 0.5; cursor: not-allowed; } .btn-export { background: var(--status-success-default); color: var(--text-onaccent); } .btn-export:hover { background: var(--status-success-active); } .btn-analyze-selected { background: var(--bg-overlay-l1); color: var(--text-default); border: 1px solid var(--border-neutral-l1); } .btn-delete-selected { background: var(--status-error-default); color: var(--text-onaccent); } .btn-delete-selected:hover { background: var(--status-error-active); } .btn-restore { background: var(--status-success-default); color: var(--text-onaccent); } .btn-restore:hover { background: var(--status-success-active); } .btn-permanent-delete { background: var(--status-error-default); color: var(--text-onaccent); } .btn-permanent-delete:hover { background: var(--status-error-active); } .btn-clear { background: var(--bg-overlay-l1); color: var(--text-default); } .btn-clear:hover { background: var(--border-neutral-l1); } /* === Filter Bar === */ .filterbar { height: 40px; background: #fff; border-bottom: 1px solid var(--bg-overlay-l1); display: flex; align-items: center; padding: 0 16px; gap: 16px; font-size: var(--body-md-font-size); color: var(--text-secondary); flex-shrink: 0; } .filter-group { display: flex; align-items: center; gap: 4px; } .filter-group input, .filter-group select { padding: 4px 8px; border: 1px solid var(--border-neutral-l1); border-radius: var(--radius-4); font-size: var(--body-md-font-size); background: #fff; } .filter-group input:focus, .filter-group select:focus { outline: none; border-color: var(--border-contrast); } .filter-results { margin-left: auto; color: var(--text-tertiary); font-size: var(--body-md-font-size); } .btn-select-all { background: var(--bg-overlay-l1); border: 1px solid var(--border-neutral-l1); color: var(--text-default); font-size: var(--body-md-font-size); } .btn-select-all:hover { border-color: var(--bg-brand); color: var(--bg-brand); } /* === Content Area === */ .content-area { flex: 1; display: flex; flex-direction: column; overflow: hidden; } .grid-container { flex: 1; overflow-y: auto; padding: 16px; } /* === Grid === */ .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 12px; } .empty-state { text-align: center; padding: 80px; color: var(--text-tertiary); font-size: 16px; } /* === Card === */ .card { background: #fff; border-radius: var(--radius-8); overflow: hidden; border: 2px solid transparent; cursor: pointer; transition: all 0.15s; position: relative; } .card:hover { box-shadow: 0 2px 12px rgba(0,0,0,0.08); } .card.selected { border-color: var(--border-brand); box-shadow: 0 0 0 2px var(--bg-brand-popup); } /* Thumbnail */ .card-thumb-wrapper { position: relative; aspect-ratio: 9/16; background: var(--bg-overlay-l1); } .card-thumb { width: 100%; height: 100%; object-fit: cover; display: block; } .card-play { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 44px; height: 44px; background: rgba(0,0,0,0.5); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 18px; color: #fff; opacity: 0; transition: opacity 0.2s; pointer-events: none; } .card:hover .card-play { opacity: 1; } /* Tags on thumbnail */ .card-tags-top { position: absolute; top: 6px; left: 6px; right: 6px; display: flex; justify-content: space-between; pointer-events: none; } .card-tag { padding: 2px 6px; border-radius: var(--radius-4); font-size: var(--body-sm-font-size); font-weight: 500; backdrop-filter: blur(4px); } .tag-category { background: var(--bg-brand-popup); color: var(--text-brand); } .tag-duration { background: rgba(0,0,0,0.5); color: #fff; } .tag-screener { background: rgba(0,0,0,0.5); color: #fff; } .tag-screener.keep { background: var(--status-success-surface-l1); color: var(--status-success-default); } .tag-screener.review { background: var(--status-alert-surface-l1); color: var(--status-alert-default); } .tag-screener.delete { background: var(--status-error-surface-l1); color: var(--status-error-default); } /* Checkbox */ .card-check { position: absolute; bottom: 6px; right: 6px; width: 22px; height: 22px; background: rgba(255,255,255,0.85); border: 2px solid var(--text-tertiary); border-radius: var(--radius-4); display: flex; align-items: center; justify-content: center; font-size: var(--body-md-font-size); z-index: 3; cursor: pointer; color: transparent; transition: all 0.15s; pointer-events: auto; } .card-check:hover { border-color: var(--bg-brand); } .card-check.checked { background: var(--bg-brand); border-color: var(--bg-brand); color: var(--text-onbrand); } /* Card Body */ .card-body { padding: 8px 10px; } .card-title { font-size: var(--body-md-font-size); font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--text-default); margin-bottom: 2px; } .card-desc { font-size: var(--body-sm-font-size); color: var(--text-tertiary); line-height: var(--body-sm-line-height); max-height: 2.8em; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } .card-meta { display: flex; gap: 8px; font-size: var(--body-sm-font-size); color: var(--text-tertiary); margin-top: 4px; } /* === List View === */ .grid.list-view { grid-template-columns: 1fr; gap: 4px; } .grid.list-view .card { display: flex; flex-direction: row; border-radius: var(--radius-6); } .grid.list-view .card-thumb-wrapper { width: 80px; aspect-ratio: 9/16; flex-shrink: 0; } .grid.list-view .card-body { flex: 1; display: flex; align-items: center; gap: 16px; } .grid.list-view .card-title { flex: 1; margin-bottom: 0; } .grid.list-view .card-meta { flex-shrink: 0; } /* === Pagination === */ .pagination { display: flex; align-items: center; justify-content: center; gap: 4px; padding: 12px; border-top: 1px solid var(--bg-overlay-l1); background: #fff; flex-shrink: 0; } .page-btn { width: 32px; height: 32px; border: 1px solid var(--border-neutral-l1); border-radius: var(--radius-4); background: #fff; color: var(--text-default); cursor: pointer; font-size: var(--body-md-font-size); display: flex; align-items: center; justify-content: center; } .page-btn:hover:not(:disabled) { border-color: var(--bg-brand); color: var(--bg-brand); } .page-btn.active { background: var(--bg-overlay-l3); color: var(--text-default); border-color: var(--border-neutral-l2); } .page-btn:disabled { opacity: 0.3; cursor: not-allowed; } .page-info { font-size: var(--body-md-font-size); color: var(--text-tertiary); margin-right: 8px; } /* === Selected Bar === */ .selected-bar { position: fixed; bottom: 0; left: 220px; right: 0; background: #fff; padding: 12px 20px; display: flex; align-items: center; gap: 16px; border-top: 2px solid var(--border-brand); box-shadow: 0 -2px 8px rgba(0,0,0,0.06); z-index: 100; font-size: var(--body-base-font-size); } /* === Modal === */ .modal { position: fixed; inset: 0; background: rgba(0,0,0,0.6); z-index: 200; display: none; align-items: center; justify-content: center; } .modal.active { display: flex; } .modal-overlay { position: absolute; inset: 0; cursor: pointer; } .modal-content { background: #fff; border-radius: var(--radius-12); box-shadow: 0 24px 64px color-mix(in srgb, var(--text-default) 14%, transparent); overflow: hidden; max-width: 900px; width: 90%; position: relative; z-index: 10; } .modal-close { position: absolute; top: 10px; right: 14px; background: none; border: none; color: var(--text-secondary); font-size: 24px; cursor: pointer; z-index: 10; width: 32px; height: 32px; border-radius: 50%; display: flex; align-items: center; justify-content: center; } .modal-close:hover { background: var(--bg-overlay-l1); } .modal-content video { width: auto; max-height: 75vh; max-width: 45vh; margin: 0 auto; display: block; background: #000; aspect-ratio: 9/16; } /* Modal Tabs */ .modal-tabs { display: flex; border-bottom: 1px solid var(--border-neutral-l1); } .modal-tab { flex: 1; padding: 12px; border: none; background: none; font-size: var(--body-base-font-size); color: var(--text-secondary); cursor: pointer; transition: all 0.15s; border-bottom: 2px solid transparent; } .modal-tab:hover { color: var(--text-default); background: var(--bg-base-default); } .modal-tab.active { color: var(--text-default); border-bottom-color: var(--icon-default); font-weight: 500; } .modal-tab-content { min-height: 200px; max-height: 70vh; overflow-y: auto; } .modal-tab-content video { max-height: 60vh; } /* Clip Toolbar */ .clip-toolbar { background: var(--bg-base-default); border-top: 1px solid var(--border-neutral-l1); padding: 10px 16px; } .clip-timeline-wrapper { margin-bottom: 10px; } .clip-timeline { position: relative; height: 32px; background: var(--bg-overlay-l2); border-radius: var(--radius-4); cursor: pointer; overflow: hidden; } .clip-selection { position: absolute; top: 0; height: 100%; background: var(--bg-brand-popup); border-left: 2px solid var(--bg-brand); border-right: 2px solid var(--bg-brand); pointer-events: none; } .clip-marker { position: absolute; top: 0; width: 12px; height: 100%; cursor: ew-resize; z-index: 5; } .clip-marker-in { left: 0; background: var(--bg-brand); border-radius: var(--radius-4) 0 0 var(--radius-4); } .clip-marker-out { right: 0; background: var(--bg-brand); border-radius: 0 var(--radius-4) var(--radius-4) 0; } .clip-playhead { position: absolute; top: 0; width: 3px; height: 100%; background: var(--status-error-default); z-index: 10; pointer-events: none; } .clip-played { position: absolute; top: 0; height: 100%; background: rgba(0,0,0,0.15); pointer-events: none; } .clip-timeaxis { display: flex; justify-content: space-between; font-size: var(--body-xs-font-size); color: var(--text-tertiary); margin-top: 2px; padding: 0 2px; } .clip-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; } .clip-sep { color: var(--text-tertiary); font-size: 16px; } .clip-time { font-family: monospace; font-size: var(--body-md-font-size); color: var(--text-secondary); background: #fff; padding: 4px 8px; border-radius: var(--radius-4); border: 1px solid var(--border-neutral-l1); min-width: 80px; } .clip-duration { font-size: var(--body-md-font-size); color: var(--text-tertiary); } .btn-clip-set { background: #fff; border: 1px solid var(--border-neutral-l1); color: var(--text-default); padding: 5px 12px; font-size: var(--body-md-font-size); } .btn-clip-set:hover { border-color: var(--bg-brand); color: var(--bg-brand); } .btn-clip-split { background: var(--status-alert-default); color: var(--text-default); padding: 5px 14px; font-size: var(--body-md-font-size); font-weight: 500; } .btn-clip-split:hover { background: var(--status-alert-active); } .btn-clip-play { background: var(--bg-brand); color: var(--text-onbrand); padding: 5px 14px; font-size: var(--body-md-font-size); font-weight: 500; } .btn-clip-play:hover { background: var(--bg-brand-active); } .btn-clip-save { background: var(--status-success-default); color: var(--text-onaccent); padding: 5px 14px; font-size: var(--body-md-font-size); font-weight: 500; } .btn-clip-save:hover { background: var(--status-success-active); } .btn-clip-add { background: #fff; border: 1px solid var(--border-neutral-l1); color: var(--text-default); padding: 5px 14px; font-size: var(--body-md-font-size); } .btn-clip-add:hover { border-color: var(--bg-brand); color: var(--bg-brand); } .clip-list { margin-top: 8px; max-height: 120px; overflow-y: auto; } .clip-list-item { display: flex; align-items: center; justify-content: space-between; padding: 6px 10px; background: #fff; border: 1px solid var(--border-neutral-l1); border-radius: var(--radius-4); margin-bottom: 4px; font-size: var(--body-md-font-size); } .clip-list-item .clip-info { color: var(--text-secondary); } .clip-list-item .clip-remove { color: var(--status-error-default); cursor: pointer; } /* Report Container */ .report-container { padding: 20px 24px; } .report-section { margin-bottom: 20px; } .report-section-title { font-size: var(--body-md-font-size); font-weight: 600; color: var(--text-brand); margin-bottom: 10px; padding-bottom: 6px; border-bottom: 1px solid var(--border-neutral-l1); } .report-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 12px; } .report-item { background: var(--bg-base-default); border-radius: var(--radius-8); padding: 12px; } .report-label { font-size: var(--body-md-font-size); color: var(--text-tertiary); margin-bottom: 4px; } .report-value { font-size: 16px; font-weight: 600; color: var(--text-default); } .report-value.good { color: var(--status-success-default); } .report-value.warn { color: var(--status-alert-default); } .report-value.bad { color: var(--status-error-default); } .report-bar { height: 6px; background: var(--border-neutral-l1); border-radius: 3px; margin-top: 6px; overflow: hidden; } .report-bar-fill { height: 100%; border-radius: 3px; transition: width 0.3s; } .report-decision { text-align: center; padding: 20px; background: var(--bg-base-default); border-radius: var(--radius-10); margin-bottom: 16px; } .report-decision-badge { display: inline-block; padding: 8px 24px; border-radius: 20px; font-size: 18px; font-weight: 600; color: var(--text-onaccent); } .report-decision-badge.keep { background: var(--status-success-default); } .report-decision-badge.review { background: var(--status-alert-default); color: var(--text-default); } .report-decision-badge.delete { background: var(--status-error-default); } .report-decision-score { font-size: 36px; font-weight: 700; font-family: var(--font-family-metric); margin: 8px 0 4px; } .report-decision-reason { font-size: var(--body-md-font-size); color: var(--text-secondary); } .report-desc { background: var(--bg-base-default); border-radius: var(--radius-8); padding: 12px 16px; font-size: var(--body-base-font-size); color: var(--text-default); line-height: var(--body-base-line-height); } .report-issues { list-style: none; padding: 0; } .report-issues li { padding: 6px 0; font-size: var(--body-md-font-size); color: var(--text-secondary); border-bottom: 1px solid var(--bg-overlay-l1); } .report-issues li:last-child { border-bottom: none; } .report-issues li::before { content: "• "; color: var(--status-error-default); } .report-no-data { text-align: center; padding: 40px; color: var(--text-tertiary); font-size: var(--body-base-font-size); } /* Scene Analysis */ .scene-section { margin-top: 16px; } .waste-stats-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 8px; } .waste-stat-item { background: var(--bg-base-default); border-radius: var(--radius-8); padding: 12px; text-align: center; } .waste-stat-num { font-size: 24px; font-weight: 700; } .waste-stat-label { font-size: var(--body-md-font-size); color: var(--text-tertiary); margin-top: 2px; } .waste-stat-num.total { color: var(--text-default); } .waste-stat-num.keep { color: var(--status-success-default); } .waste-stat-num.trim { color: var(--status-alert-default); } .waste-stat-num.waste { color: var(--status-error-default); } .scene-card.waste { border-left-color: var(--status-error-default); background: var(--status-error-surface-l1); } .scene-card.trim { border-left-color: var(--status-alert-default); } .scene-card.highlight { border-left-color: var(--status-success-default); background: var(--status-success-surface-l1); } .scene-suggestion { display: inline-block; padding: 2px 8px; border-radius: var(--radius-4); font-size: var(--body-sm-font-size); font-weight: 600; } .scene-suggestion.keep { background: var(--status-success-surface-l1); color: var(--status-success-default); } .scene-suggestion.highlight { background: var(--status-success-surface-l1); color: var(--status-success-default); } .scene-suggestion.waste { background: var(--status-error-surface-l1); color: var(--status-error-default); } .scene-suggestion.trim { background: var(--status-alert-surface-l1); color: var(--status-warning-default); } .scene-card { background: var(--bg-base-default); border-radius: var(--radius-8); padding: 14px; margin-bottom: 10px; border-left: 4px solid var(--bg-brand); } .scene-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; } .scene-title { font-weight: 600; font-size: var(--body-base-font-size); color: var(--text-default); } .scene-meta { display: flex; gap: 8px; font-size: var(--body-md-font-size); color: var(--text-tertiary); } .scene-tag { padding: 2px 8px; border-radius: var(--radius-4); font-size: var(--body-sm-font-size); font-weight: 500; } .scene-tag.type { background: var(--bg-brand-popup); color: var(--bg-brand); } .scene-tag.usage { background: var(--status-alert-surface-l1); color: var(--status-warning-default); } .scene-tag.quality { background: var(--status-success-surface-l1); color: var(--status-success-default); } .scene-tag.quality.low { background: var(--status-error-surface-l1); color: var(--status-error-default); } .scene-desc { font-size: var(--body-md-font-size); color: var(--text-secondary); line-height: 1.5; } .scene-thumb-wrapper { position: relative; width: 80px; aspect-ratio: 9/16; flex-shrink: 0; border-radius: var(--radius-6); overflow: hidden; background: var(--bg-overlay-l1); } .scene-thumb { width: 100%; height: 100%; object-fit: cover; display: block; } .scene-thumb-play { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 28px; height: 28px; background: rgba(0,0,0,0.5); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: var(--body-md-font-size); color: #fff; opacity: 0; transition: opacity 0.2s; } .scene-card:hover .scene-thumb-play { opacity: 1; } .scene-loading { text-align: center; padding: 20px; color: var(--text-tertiary); font-size: var(--body-md-font-size); } .scene-loading::after { content: ""; display: inline-block; width: 16px; height: 16px; border: 2px solid var(--border-neutral-l1); border-top-color: var(--bg-brand); border-radius: 50%; animation: spin 0.8s linear infinite; margin-left: 8px; vertical-align: middle; } @keyframes spin { to { transform: rotate(360deg); } } .modal-info { padding: 16px 20px; font-size: var(--body-base-font-size); color: var(--text-secondary); display: flex; gap: 16px; flex-wrap: wrap; } .modal-info .info-item { display: flex; align-items: center; gap: 4px; } .modal-info .info-label { color: var(--text-tertiary); } .modal-info .info-value { color: var(--text-default); font-weight: 500; } .modal-info .info-full { flex-basis: 100%; margin-top: 4px; } .modal-actions { padding: 12px 20px; display: flex; gap: 10px; border-top: 1px solid var(--bg-overlay-l1); } .btn-analyze-modal { background: var(--bg-brand); color: var(--text-onbrand); padding: 8px 20px; font-size: var(--body-base-font-size); } .btn-analyze-modal:hover { background: var(--bg-brand-active); } .btn-analyze-modal:disabled { background: var(--text-tertiary); cursor: not-allowed; } .btn-prev, .btn-next { background: var(--bg-overlay-l1); color: var(--text-default); padding: 8px 16px; font-size: var(--body-base-font-size); } .btn-prev:hover, .btn-next:hover { background: var(--border-neutral-l1); } /* === Upload Modal === */ .upload-header { padding: 20px 24px 0; } .upload-header h2 { font-size: var(--heading-sm-font-size); margin-bottom: 4px; } .upload-header p { font-size: var(--body-md-font-size); color: var(--text-tertiary); } .upload-body { padding: 16px 24px 24px; } .upload-dropzone { border: 2px dashed var(--border-neutral-l2); border-radius: var(--radius-10); padding: 40px; text-align: center; cursor: pointer; transition: all 0.2s; margin-bottom: 16px; position: relative; } .upload-dropzone:hover, .upload-dropzone.dragover { border-color: var(--bg-brand); } .dropzone-icon { font-size: 40px; margin-bottom: 8px; } .upload-dropzone p { color: var(--text-tertiary); font-size: var(--body-base-font-size); } .upload-link { color: var(--bg-brand); cursor: pointer; text-decoration: underline; } .upload-category { display: flex; align-items: center; gap: 8px; margin-bottom: 16px; font-size: var(--body-base-font-size); } .upload-category input { flex: 1; padding: 8px 12px; border: 1px solid var(--border-neutral-l1); border-radius: var(--radius-6); font-size: var(--body-base-font-size); } .upload-category input:focus { outline: none; border-color: var(--bg-brand); } .upload-filelist { max-height: 200px; overflow-y: auto; margin-bottom: 16px; } .upload-file { display: flex; align-items: center; justify-content: space-between; padding: 8px 12px; background: var(--bg-base-default); border-radius: var(--radius-6); margin-bottom: 4px; font-size: var(--body-md-font-size); } .upload-file-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .upload-file-size { color: var(--text-tertiary); margin-left: 12px; white-space: nowrap; } .upload-file-remove { color: var(--status-error-default); cursor: pointer; margin-left: 12px; } .upload-progress { margin-bottom: 16px; } .upload-result { padding: 12px; border-radius: var(--radius-6); margin-bottom: 16px; font-size: var(--body-base-font-size); } .upload-result.success { background: var(--status-success-surface-l1); color: var(--status-success-default); } .upload-result.error { background: var(--status-error-surface-l1); color: var(--status-error-default); } .btn-upload-submit { width: 100%; padding: 12px; background: var(--bg-brand); color: var(--text-onbrand); font-size: 15px; font-weight: 500; } .btn-upload-submit:hover:not(:disabled) { background: var(--bg-brand-active); } .btn-upload-submit:disabled { background: var(--border-neutral-l1); color: var(--text-tertiary); cursor: not-allowed; } /* === Task Panel === */ .task-panel { position: fixed; top: 0; left: 220px; width: 360px; height: 100vh; background: #fff; border-right: 1px solid var(--border-neutral-l1); box-shadow: 4px 0 16px rgba(0,0,0,0.08); z-index: 280; display: flex; flex-direction: column; } .task-panel-header { padding: 16px 20px; border-bottom: 1px solid var(--border-neutral-l1); display: flex; align-items: center; justify-content: space-between; font-size: 16px; font-weight: 600; } .task-panel-body { flex: 1; overflow-y: auto; padding: 12px; } .task-card { background: var(--bg-base-default); border-radius: var(--radius-8); padding: 14px; margin-bottom: 10px; border-left: 4px solid var(--border-neutral-l1); } .task-card.running { border-left-color: var(--bg-brand); background: var(--bg-brand-popup); } .task-card.completed { border-left-color: var(--status-success-default); } .task-card.failed { border-left-color: var(--status-error-default); } .task-card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px; } .task-type { font-size: var(--body-md-font-size); font-weight: 500; color: var(--text-default); } .task-status { font-size: var(--body-sm-font-size); padding: 2px 8px; border-radius: var(--radius-10); font-weight: 500; } .task-status.running { background: var(--bg-brand-popup); color: var(--text-brand); } .task-status.completed { background: var(--status-success-surface-l1); color: var(--status-success-default); } .task-status.failed { background: var(--status-error-surface-l1); color: var(--status-error-default); } .task-progress { height: 4px; background: var(--bg-overlay-l2); border-radius: 2px; margin: 8px 0; overflow: hidden; } .task-progress-fill { height: 100%; background: var(--bg-brand); border-radius: 2px; transition: width 0.3s; } .task-detail { font-size: var(--body-md-font-size); color: var(--text-tertiary); } .task-time { font-size: var(--body-sm-font-size); color: var(--text-tertiary); margin-top: 4px; } .task-empty { text-align: center; padding: 40px; color: var(--text-tertiary); font-size: var(--body-base-font-size); } /* === Progress Overlay === */ .progress-overlay { position: fixed; top: 0; left: 220px; right: 0; background: #fff; padding: 12px 20px; z-index: 290; border-bottom: 1px solid var(--border-neutral-l1); } .progress-bar { height: 4px; background: var(--bg-overlay-l2); border-radius: 2px; overflow: hidden; margin-bottom: 6px; } .progress-fill { height: 100%; background: var(--bg-brand); width: 0%; transition: width 0.3s; } .progress-text { font-size: var(--body-md-font-size); color: var(--text-secondary); } /* === Voice Clone - Class Toggle (零侵入) === */ body.vc-active .topbar, body.vc-active .filterbar, body.vc-active .content-area { display: none !important; } body.vc-active #voiceClonePanel { display: block !important; } body.vc-active .selected-bar { display: none !important; } #voiceClonePanel { display: none; } /* === Voice Clone Panel === */ .vc-container { max-width: 720px; margin: 0 auto; padding: 32px 24px; } .vc-header h2 { margin: 0 0 4px; font-size: 24px; } .vc-subtitle { margin: 0; color: var(--text-secondary); font-size: 14px; } .vc-section { margin-top: 24px; } .vc-section-title { font-size: 14px; font-weight: 600; color: var(--text-secondary); margin-bottom: 10px; } /* Upload Zone */ .vc-upload-zone { position: relative; border: 2px dashed var(--border-default); border-radius: 12px; padding: 40px 20px; text-align: center; cursor: pointer; transition: all 0.2s; background: var(--bg-base-secondary); } .vc-upload-zone:hover, .vc-upload-zone.dragover { border-color: var(--accent-blue); background: rgba(var(--accent-blue-rgb, 56,132,244), 0.06); } .vc-upload-icon { font-size: 40px; margin-bottom: 8px; } .vc-upload-text { font-size: 15px; color: var(--text-default); } .vc-upload-hint { font-size: 12px; color: var(--text-tertiary); margin-top: 6px; } .vc-file-info { display: flex; align-items: center; gap: 10px; margin-top: 12px; padding: 10px 14px; background: var(--bg-base-secondary); border-radius: 8px; font-size: 14px; } .vc-file-icon { font-size: 20px; } .vc-file-name { flex: 1; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .vc-file-type { color: var(--text-tertiary); font-size: 12px; } /* Presets */ .vc-preset-group { display: flex; gap: 8px; flex-wrap: wrap; } .vc-preset-btn { padding: 8px 16px; border-radius: 20px; border: 1px solid var(--border-default); background: var(--bg-base); color: var(--text-secondary); cursor: pointer; font-size: 13px; transition: all 0.15s; } .vc-preset-btn:hover { border-color: var(--accent-blue); color: var(--text-default); } .vc-preset-btn.active { background: var(--accent-blue); color: #fff; border-color: var(--accent-blue); } /* Text Input */ .vc-textarea { width: 100%; padding: 12px 14px; border-radius: 8px; border: 1px solid var(--border-default); background: var(--bg-base); color: var(--text-default); font-size: 14px; font-family: inherit; resize: vertical; box-sizing: border-box; } .vc-textarea:focus { outline: none; border-color: var(--accent-blue); } /* Advanced Settings */ .vc-section-toggle { display: flex; justify-content: space-between; align-items: center; padding: 10px 14px; background: var(--bg-base-secondary); border-radius: 8px; cursor: pointer; font-size: 14px; color: var(--text-secondary); } .vc-section-toggle:hover { background: var(--bg-overlay-l1); } .vc-advanced { margin-top: 10px; padding: 16px; background: var(--bg-base-secondary); border-radius: 8px; } .vc-slider-group { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; } .vc-slider-group:last-child { margin-bottom: 0; } .vc-slider-group label { width: 70px; font-size: 13px; color: var(--text-secondary); flex-shrink: 0; } .vc-slider-group input[type="range"] { flex: 1; accent-color: var(--accent-blue); } .vc-slider-value { width: 36px; text-align: right; font-size: 13px; color: var(--text-default); font-variant-numeric: tabular-nums; } /* Switch Toggle */ .vc-switch { position: relative; display: inline-block; width: 40px; height: 22px; cursor: pointer; } .vc-switch input { opacity: 0; width: 0; height: 0; } .vc-switch-slider { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: var(--border-default); border-radius: 22px; transition: 0.2s; } .vc-switch-slider:before { content: ""; position: absolute; width: 16px; height: 16px; left: 3px; bottom: 3px; background: #fff; border-radius: 50%; transition: 0.2s; } .vc-switch input:checked + .vc-switch-slider { background: var(--accent-blue); } .vc-switch input:checked + .vc-switch-slider:before { transform: translateX(18px); } /* Generate Button */ .btn-vc-generate { width: 100%; padding: 14px; border-radius: 10px; border: none; background: var(--accent-blue); color: #fff; font-size: 16px; font-weight: 600; cursor: pointer; transition: all 0.2s; } .btn-vc-generate:hover:not(:disabled) { filter: brightness(1.1); transform: translateY(-1px); } .btn-vc-generate:disabled { opacity: 0.5; cursor: not-allowed; } /* Loading */ .vc-loading { display: flex; align-items: center; gap: 12px; padding: 16px; background: var(--bg-base-secondary); border-radius: 8px; margin-top: 16px; } .vc-spinner { width: 20px; height: 20px; border: 2px solid var(--border-default); border-top-color: var(--accent-blue); border-radius: 50%; animation: vc-spin 0.8s linear infinite; } @keyframes vc-spin { to { transform: rotate(360deg); } } /* Error */ .vc-error { padding: 12px 16px; background: rgba(239,68,68,0.1); color: #ef4444; border-radius: 8px; margin-top: 12px; font-size: 14px; } /* Player */ .vc-player { margin-top: 20px; padding: 20px; background: var(--bg-base-secondary); border-radius: 12px; } .vc-player-header { font-weight: 600; margin-bottom: 14px; font-size: 15px; } .vc-player-controls { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; } .btn-vc-play, .btn-vc-stop, .btn-vc-save { padding: 8px 16px; border-radius: 8px; border: 1px solid var(--border-default); background: var(--bg-base); color: var(--text-default); cursor: pointer; font-size: 13px; transition: all 0.15s; white-space: nowrap; } .btn-vc-play:hover, .btn-vc-stop:hover, .btn-vc-save:hover { border-color: var(--accent-blue); } .btn-vc-play.playing { background: var(--accent-blue); color: #fff; border-color: var(--accent-blue); } .vc-progress-wrapper { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 200px; } .vc-progress { flex: 1; accent-color: var(--accent-blue); } .vc-time { font-size: 12px; color: var(--text-tertiary); font-variant-numeric: tabular-nums; min-width: 36px; } .vc-speed-group { display: flex; gap: 4px; } .vc-speed-btn { padding: 4px 10px; border-radius: 6px; border: 1px solid var(--border-default); background: var(--bg-base); color: var(--text-secondary); cursor: pointer; font-size: 12px; transition: all 0.15s; } .vc-speed-btn:hover { border-color: var(--accent-blue); } .vc-speed-btn.active { background: var(--accent-blue); color: #fff; border-color: var(--accent-blue); }