1421 lines
31 KiB
CSS
1421 lines
31 KiB
CSS
@import "tailwindcss";
|
|
|
|
@source "../app/src/**/*.rs";
|
|
@source "../../ui/app_crates/registry/src/ui/button.rs";
|
|
@source "../../ui/crates/icons/src/**/*.rs";
|
|
|
|
:root {
|
|
--cowa-page-bg: #f7f8fa;
|
|
--cowa-surface: #ffffff;
|
|
--cowa-surface-subtle: #f2f3f5;
|
|
--cowa-control-bg: #f7f8fa;
|
|
--cowa-border: #e5e6eb;
|
|
--cowa-border-strong: #c9cdd4;
|
|
--cowa-text-primary: #1d2129;
|
|
--cowa-text-secondary: #4e5969;
|
|
--cowa-text-tertiary: #86909c;
|
|
--cowa-primary: #1874ff;
|
|
--cowa-primary-hover: #0f66e8;
|
|
--cowa-primary-soft: #e7efff;
|
|
--cowa-success-bg: #e8ffea;
|
|
--cowa-success-text: #00b42a;
|
|
--cowa-danger-bg: #ffece8;
|
|
--cowa-danger-text: #f53f3f;
|
|
--cowa-radius: 4px;
|
|
--cowa-control-h: 32px;
|
|
--cowa-row-h: 40px;
|
|
--cowa-topbar-h: 60px;
|
|
--cowa-sidebar-w: 196px;
|
|
--cowa-header-brand-w: 190px;
|
|
|
|
--radius: var(--cowa-radius);
|
|
--background: var(--cowa-page-bg);
|
|
--foreground: var(--cowa-text-primary);
|
|
--card: var(--cowa-surface);
|
|
--muted: var(--cowa-surface-subtle);
|
|
--muted-foreground: var(--cowa-text-tertiary);
|
|
--primary: var(--cowa-primary);
|
|
--primary-foreground: #ffffff;
|
|
--secondary: #ffffff;
|
|
--secondary-foreground: var(--cowa-text-secondary);
|
|
--accent: var(--cowa-primary-soft);
|
|
--accent-foreground: var(--cowa-primary);
|
|
--border: var(--cowa-border);
|
|
--ring: var(--cowa-primary);
|
|
}
|
|
|
|
@theme inline {
|
|
--radius-md: var(--radius);
|
|
--radius-lg: var(--radius);
|
|
--color-background: var(--background);
|
|
--color-foreground: var(--foreground);
|
|
--color-card: var(--card);
|
|
--color-muted: var(--muted);
|
|
--color-muted-foreground: var(--muted-foreground);
|
|
--color-primary: var(--primary);
|
|
--color-primary-foreground: var(--primary-foreground);
|
|
--color-secondary: var(--secondary);
|
|
--color-secondary-foreground: var(--secondary-foreground);
|
|
--color-accent: var(--accent);
|
|
--color-accent-foreground: var(--accent-foreground);
|
|
--color-border: var(--border);
|
|
--color-ring: var(--ring);
|
|
}
|
|
|
|
@layer base {
|
|
* {
|
|
@apply box-border border-border;
|
|
}
|
|
|
|
html,
|
|
body {
|
|
@apply m-0 min-h-screen bg-background text-foreground antialiased;
|
|
font-family:
|
|
"Inter", "PingFang SC", "Microsoft YaHei", "Noto Sans CJK SC",
|
|
system-ui, sans-serif;
|
|
font-size: 14px;
|
|
letter-spacing: 0;
|
|
}
|
|
|
|
button,
|
|
input {
|
|
font: inherit;
|
|
}
|
|
|
|
a {
|
|
color: inherit;
|
|
text-decoration: none;
|
|
}
|
|
}
|
|
|
|
@layer components {
|
|
.cowa-shell {
|
|
@apply min-h-screen bg-background text-[14px] text-foreground;
|
|
min-height: 100dvh;
|
|
padding-top: var(--cowa-topbar-h);
|
|
}
|
|
|
|
.cowa-shell-collapsed {
|
|
--cowa-sidebar-w: 48px;
|
|
}
|
|
|
|
.cowa-sidebar {
|
|
@apply fixed left-0 z-20 flex flex-col border-r bg-white;
|
|
top: var(--cowa-topbar-h);
|
|
width: var(--cowa-sidebar-w);
|
|
height: calc(100vh - var(--cowa-topbar-h));
|
|
height: calc(100dvh - var(--cowa-topbar-h));
|
|
border-color: var(--cowa-border);
|
|
transition: width 0.2s ease;
|
|
}
|
|
|
|
.cowa-brand {
|
|
@apply flex h-[60px] items-center;
|
|
gap: 10px;
|
|
padding: 0 16px;
|
|
width: var(--cowa-header-brand-w);
|
|
color: #0b1e43;
|
|
font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
|
|
font-size: 20px;
|
|
font-weight: 600;
|
|
line-height: 28px;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.cowa-brand-logo {
|
|
@apply block shrink-0;
|
|
width: 32px;
|
|
height: 32px;
|
|
}
|
|
|
|
.cowa-nav {
|
|
@apply flex flex-1 flex-col gap-1 px-2 py-2;
|
|
overflow: visible;
|
|
}
|
|
|
|
.cowa-nav-group {
|
|
@apply relative w-full;
|
|
}
|
|
|
|
.cowa-nav-item,
|
|
.cowa-nav-subitem,
|
|
.cowa-nav-flyout-item {
|
|
@apply flex h-10 items-center rounded text-sm font-medium leading-[22px] transition-colors;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-nav-item {
|
|
@apply w-full gap-2 overflow-hidden border-0 bg-transparent px-3 text-left;
|
|
}
|
|
|
|
.cowa-nav-label {
|
|
@apply min-w-0 flex-1 truncate;
|
|
}
|
|
|
|
.cowa-nav-caret {
|
|
width: 14px;
|
|
height: 14px;
|
|
flex-shrink: 0;
|
|
color: var(--cowa-text-tertiary);
|
|
transition: transform 0.2s ease;
|
|
}
|
|
|
|
.cowa-nav-item[aria-expanded="true"] .cowa-nav-caret {
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
.cowa-nav-sublist {
|
|
@apply mt-1 flex flex-col gap-1;
|
|
}
|
|
|
|
.cowa-nav-subitem {
|
|
@apply ml-7 px-2 font-medium;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-nav-item:hover,
|
|
.cowa-nav-subitem:hover,
|
|
.cowa-nav-flyout-item:hover {
|
|
background: var(--cowa-surface-subtle);
|
|
}
|
|
|
|
.cowa-nav-item-active,
|
|
.cowa-nav-subitem-active,
|
|
.cowa-nav-flyout-item-active {
|
|
background: var(--cowa-primary-soft);
|
|
color: var(--cowa-primary);
|
|
}
|
|
|
|
.cowa-nav-item-has-active-child {
|
|
color: var(--cowa-primary);
|
|
}
|
|
|
|
.cowa-nav-flyout {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 100%;
|
|
z-index: 40;
|
|
min-width: 160px;
|
|
margin-left: 8px;
|
|
padding: 6px;
|
|
border: 1px solid var(--cowa-border);
|
|
border-radius: 4px;
|
|
background: #fff;
|
|
box-shadow: 0 8px 24px rgb(29 33 41 / 12%);
|
|
opacity: 0;
|
|
visibility: hidden;
|
|
pointer-events: none;
|
|
transition:
|
|
opacity 0.12s ease,
|
|
visibility 0s linear 0.12s;
|
|
}
|
|
|
|
/* Transparent bridge that fills the gap between the icon and the flyout so
|
|
the cursor never leaves the hover zone while moving onto the menu. */
|
|
.cowa-nav-flyout::before {
|
|
content: "";
|
|
position: absolute;
|
|
top: 0;
|
|
left: -16px;
|
|
width: 16px;
|
|
height: 100%;
|
|
}
|
|
|
|
.cowa-nav-flyout-title {
|
|
@apply px-2 pb-1 text-xs font-medium;
|
|
color: var(--cowa-text-tertiary);
|
|
}
|
|
|
|
.cowa-nav-flyout-item {
|
|
@apply px-2 font-medium;
|
|
}
|
|
|
|
.cowa-shell-collapsed .cowa-nav {
|
|
@apply items-center px-1;
|
|
}
|
|
|
|
.cowa-shell-collapsed .cowa-nav-group {
|
|
@apply flex justify-center;
|
|
}
|
|
|
|
.cowa-shell-collapsed .cowa-nav-item {
|
|
@apply h-10 w-9 justify-center px-0;
|
|
}
|
|
|
|
.cowa-shell-collapsed .cowa-nav-label,
|
|
.cowa-shell-collapsed .cowa-nav-caret {
|
|
display: none;
|
|
}
|
|
|
|
.cowa-shell-collapsed .cowa-nav-group:hover .cowa-nav-flyout,
|
|
.cowa-shell-collapsed .cowa-nav-group:focus-within .cowa-nav-flyout {
|
|
opacity: 1;
|
|
visibility: visible;
|
|
pointer-events: auto;
|
|
transition:
|
|
opacity 0.12s ease,
|
|
visibility 0s;
|
|
}
|
|
|
|
.cowa-sidebar-footer {
|
|
@apply flex h-12 items-center justify-end border-t px-2 text-xs;
|
|
border-color: var(--cowa-border);
|
|
color: var(--cowa-text-tertiary);
|
|
}
|
|
|
|
.cowa-sidebar-toggle {
|
|
@apply inline-flex h-9 w-9 items-center justify-center rounded border-0 bg-transparent p-0 transition-colors;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-sidebar-toggle:hover {
|
|
background: var(--cowa-surface-subtle);
|
|
color: var(--cowa-primary);
|
|
}
|
|
|
|
.cowa-sidebar-toggle-icon {
|
|
width: 18px;
|
|
height: 18px;
|
|
}
|
|
|
|
.cowa-shell-collapsed .cowa-sidebar-footer {
|
|
@apply justify-center px-1;
|
|
}
|
|
|
|
.cowa-main {
|
|
@apply min-w-0 overflow-hidden;
|
|
margin-left: var(--cowa-sidebar-w);
|
|
height: calc(100vh - var(--cowa-topbar-h));
|
|
height: calc(100dvh - var(--cowa-topbar-h));
|
|
min-height: 0;
|
|
transition: margin-left 0.2s ease;
|
|
}
|
|
|
|
.cowa-topbar {
|
|
@apply fixed left-0 right-0 top-0 z-30 grid h-[60px] items-center border-b bg-white;
|
|
grid-template-columns: var(--cowa-header-brand-w) minmax(0, 1fr);
|
|
border-color: var(--cowa-border);
|
|
}
|
|
|
|
.cowa-topbar-main {
|
|
@apply flex min-w-0 items-center justify-between gap-4;
|
|
padding: 0 16px;
|
|
}
|
|
|
|
.cowa-module-tabs {
|
|
@apply flex min-w-0 flex-1 items-center gap-2 overflow-x-auto;
|
|
scrollbar-width: none;
|
|
}
|
|
|
|
.cowa-module-tabs::-webkit-scrollbar {
|
|
display: none;
|
|
}
|
|
|
|
.cowa-module-tab {
|
|
@apply inline-flex shrink-0 items-center justify-center font-medium transition-colors;
|
|
height: 40px;
|
|
gap: 6px;
|
|
padding: 0 14px;
|
|
border-radius: 4px;
|
|
color: var(--cowa-text-primary);
|
|
font-size: 16px;
|
|
line-height: 22px;
|
|
}
|
|
|
|
.cowa-module-tab-icon,
|
|
.cowa-nav-icon {
|
|
width: 14px;
|
|
height: 14px;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.cowa-breadcrumb-icon,
|
|
.cowa-control-icon,
|
|
.cowa-page-control-icon {
|
|
width: 12px;
|
|
height: 12px;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.cowa-module-tab:hover {
|
|
background: var(--cowa-surface-subtle);
|
|
}
|
|
|
|
.cowa-module-tab-active {
|
|
background: var(--cowa-primary);
|
|
color: #fff;
|
|
}
|
|
|
|
.cowa-user-menu {
|
|
@apply relative flex shrink-0 items-center;
|
|
}
|
|
|
|
.cowa-user-trigger {
|
|
@apply flex h-10 items-center gap-3 rounded border-0 bg-transparent p-0 transition-colors;
|
|
color: var(--cowa-text-tertiary);
|
|
cursor: pointer;
|
|
}
|
|
|
|
.cowa-user-trigger:hover {
|
|
color: var(--cowa-primary);
|
|
}
|
|
|
|
.cowa-avatar {
|
|
@apply flex shrink-0 items-center justify-center rounded-full text-sm font-medium text-white;
|
|
width: 32px;
|
|
height: 32px;
|
|
background: linear-gradient(135deg, #1874ff 0%, #00b2ff 100%);
|
|
}
|
|
|
|
.cowa-user-meta {
|
|
@apply flex flex-col items-start gap-px;
|
|
}
|
|
|
|
.cowa-user-name {
|
|
color: var(--cowa-text-primary);
|
|
font-size: 14px;
|
|
font-weight: 500;
|
|
line-height: 18px;
|
|
}
|
|
|
|
.cowa-user-city {
|
|
color: var(--cowa-text-tertiary);
|
|
font-size: 12px;
|
|
line-height: 14px;
|
|
}
|
|
|
|
.cowa-user-chevron {
|
|
width: 12px;
|
|
height: 12px;
|
|
color: var(--cowa-text-tertiary);
|
|
}
|
|
|
|
.cowa-user-dropdown {
|
|
position: absolute;
|
|
top: calc(100% + 8px);
|
|
right: 0;
|
|
z-index: 50;
|
|
width: 220px;
|
|
padding: 4px 0;
|
|
border: 1px solid var(--cowa-border);
|
|
border-radius: 4px;
|
|
background: #fff;
|
|
box-shadow: 0 8px 24px rgb(29 33 41 / 14%);
|
|
opacity: 0;
|
|
pointer-events: none;
|
|
transform: translateY(-4px);
|
|
transition:
|
|
opacity 0.16s ease,
|
|
transform 0.16s ease;
|
|
}
|
|
|
|
.cowa-user-menu:hover .cowa-user-dropdown,
|
|
.cowa-user-menu:focus-within .cowa-user-dropdown {
|
|
opacity: 1;
|
|
pointer-events: auto;
|
|
transform: translateY(0);
|
|
}
|
|
|
|
.cowa-user-dropdown-label {
|
|
@apply px-3 pb-1 pt-2 text-xs font-medium;
|
|
color: var(--cowa-text-tertiary);
|
|
}
|
|
|
|
.cowa-user-dropdown-info {
|
|
@apply px-3 py-1 text-sm font-medium;
|
|
color: var(--cowa-text-primary);
|
|
word-break: break-all;
|
|
}
|
|
|
|
.cowa-user-dropdown-divider {
|
|
@apply my-1 h-px;
|
|
background: var(--cowa-border);
|
|
}
|
|
|
|
.cowa-user-dropdown-item {
|
|
@apply flex h-9 w-full items-center gap-2 border-0 bg-transparent px-3 text-left text-sm transition-colors;
|
|
color: var(--cowa-text-primary);
|
|
}
|
|
|
|
.cowa-user-dropdown-item:hover {
|
|
background: var(--cowa-surface-subtle);
|
|
}
|
|
|
|
.cowa-user-dropdown-icon {
|
|
width: 14px;
|
|
height: 14px;
|
|
flex-shrink: 0;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-modal-backdrop {
|
|
@apply fixed inset-0 z-[60] flex items-center justify-center;
|
|
background: rgb(29 33 41 / 45%);
|
|
}
|
|
|
|
.cowa-password-modal {
|
|
width: 440px;
|
|
max-width: calc(100vw - 32px);
|
|
border-radius: 4px;
|
|
background: #fff;
|
|
box-shadow: 0 16px 48px rgb(29 33 41 / 20%);
|
|
}
|
|
|
|
.cowa-password-modal h2 {
|
|
@apply m-0 border-b px-5 py-4 text-base font-medium;
|
|
border-color: var(--cowa-border);
|
|
color: var(--cowa-text-primary);
|
|
}
|
|
|
|
.cowa-password-modal p {
|
|
@apply m-0 px-5 pt-4 text-sm;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-password-form {
|
|
@apply flex flex-col gap-3 px-5 pb-5 pt-4;
|
|
}
|
|
|
|
.cowa-password-form label {
|
|
@apply flex flex-col gap-1 text-sm;
|
|
color: var(--cowa-text-primary);
|
|
}
|
|
|
|
.cowa-password-form input {
|
|
@apply h-8 rounded border px-3 outline-none transition-colors;
|
|
border-color: var(--cowa-border);
|
|
background: #fff;
|
|
}
|
|
|
|
.cowa-password-form input:focus {
|
|
border-color: var(--cowa-primary);
|
|
}
|
|
|
|
.cowa-password-actions {
|
|
@apply mt-1 flex justify-end gap-3;
|
|
}
|
|
|
|
.cowa-password-cancel,
|
|
.cowa-password-submit {
|
|
@apply h-8 rounded border px-3 text-sm transition-colors;
|
|
}
|
|
|
|
.cowa-password-cancel {
|
|
border-color: var(--cowa-border);
|
|
background: #fff;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-password-submit {
|
|
border-color: var(--cowa-primary);
|
|
background: var(--cowa-primary);
|
|
color: #fff;
|
|
}
|
|
|
|
.cowa-content {
|
|
@apply flex h-full min-h-0 flex-col overflow-hidden p-4;
|
|
}
|
|
|
|
.cowa-breadcrumb {
|
|
@apply mb-2 flex h-6 items-center gap-1 text-xs;
|
|
color: var(--cowa-text-tertiary);
|
|
}
|
|
|
|
.cowa-breadcrumb strong {
|
|
@apply font-medium;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-work-surface {
|
|
@apply flex flex-1 flex-col bg-white px-4 pt-4;
|
|
min-height: 0;
|
|
}
|
|
|
|
.terminal-page-shell {
|
|
@apply overflow-hidden rounded border;
|
|
border-color: var(--cowa-border);
|
|
padding-right: 4px;
|
|
padding-bottom: 4px;
|
|
}
|
|
|
|
.terminal-shell-card {
|
|
@apply flex flex-1 flex-col gap-4 rounded border bg-white;
|
|
border-color: var(--cowa-border);
|
|
min-height: 0;
|
|
height: 100%;
|
|
padding: 18px;
|
|
box-shadow: 0 12px 32px rgb(29 33 41 / 6%);
|
|
}
|
|
|
|
.terminal-header {
|
|
@apply flex flex-wrap items-start justify-between gap-3;
|
|
}
|
|
|
|
.terminal-title {
|
|
margin: 0;
|
|
color: #0f172a;
|
|
font-family: "IBM Plex Sans", "PingFang SC", "Microsoft YaHei", sans-serif;
|
|
font-size: 20px;
|
|
font-weight: 600;
|
|
line-height: 28px;
|
|
}
|
|
|
|
.terminal-subtitle {
|
|
margin: 4px 0 0;
|
|
color: var(--cowa-text-secondary);
|
|
font-size: 13px;
|
|
line-height: 20px;
|
|
}
|
|
|
|
.terminal-badge {
|
|
@apply inline-flex items-center rounded-full;
|
|
min-height: 28px;
|
|
padding: 0 12px;
|
|
background: #eef6ff;
|
|
color: #1456cc;
|
|
font-size: 12px;
|
|
font-weight: 600;
|
|
line-height: 18px;
|
|
}
|
|
|
|
.terminal-status-stack {
|
|
@apply flex flex-col items-end gap-2;
|
|
}
|
|
|
|
.terminal-metrics {
|
|
color: var(--cowa-text-tertiary);
|
|
font-size: 12px;
|
|
line-height: 16px;
|
|
}
|
|
|
|
.terminal-screen {
|
|
@apply relative min-h-0 flex-1 overflow-y-auto overflow-x-hidden rounded;
|
|
min-height: 250px; /* 12 rows * 18px + 16px vertical padding + 1px border */
|
|
padding: 16px;
|
|
border: 1px solid #17202f;
|
|
background:
|
|
radial-gradient(circle at top right, rgb(56 189 248 / 11%), transparent 28%),
|
|
linear-gradient(180deg, #0b1220 0%, #0f172a 100%);
|
|
box-shadow: inset 0 1px 0 rgb(255 255 255 / 4%);
|
|
outline: none;
|
|
color: var(--terminal-fg, #dbeafe);
|
|
font-family: var(
|
|
--terminal-font-family,
|
|
"JetBrains Mono", "Fira Code", "Cascadia Code", "SFMono-Regular",
|
|
"Consolas", monospace
|
|
);
|
|
font-size: var(--terminal-font-size, 13px);
|
|
line-height: var(--terminal-line-height, 18px);
|
|
white-space: pre;
|
|
letter-spacing: 0;
|
|
scrollbar-gutter: stable;
|
|
scrollbar-width: thin;
|
|
scrollbar-color: rgb(148 163 184 / 60%) transparent;
|
|
}
|
|
|
|
.terminal-screen:focus-within {
|
|
border-color: #38bdf8;
|
|
box-shadow:
|
|
inset 0 1px 0 rgb(255 255 255 / 4%),
|
|
0 0 0 3px rgb(56 189 248 / 15%);
|
|
}
|
|
|
|
.terminal-ime {
|
|
position: absolute;
|
|
z-index: 100;
|
|
opacity: 0;
|
|
background: transparent;
|
|
color: transparent;
|
|
caret-color: transparent;
|
|
border: none;
|
|
outline: none;
|
|
resize: none;
|
|
padding: 0;
|
|
margin: 0;
|
|
overflow: hidden;
|
|
pointer-events: auto;
|
|
font-family: inherit;
|
|
font-size: 1px;
|
|
line-height: 1px;
|
|
}
|
|
|
|
.terminal-canvas {
|
|
position: absolute;
|
|
left: 0;
|
|
z-index: 0;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.terminal-text {
|
|
margin: 0;
|
|
min-height: 100%;
|
|
color: var(--terminal-fg, #dbeafe);
|
|
font-family: var(
|
|
--terminal-font-family,
|
|
"JetBrains Mono", "Fira Code", "Cascadia Code", "SFMono-Regular",
|
|
"Consolas", monospace
|
|
);
|
|
font-size: var(--terminal-font-size, 13px);
|
|
line-height: var(--terminal-line-height, 18px);
|
|
white-space: pre-wrap;
|
|
word-break: break-word;
|
|
}
|
|
|
|
.terminal-grid {
|
|
position: relative;
|
|
display: block;
|
|
min-height: 100%;
|
|
user-select: none;
|
|
}
|
|
|
|
.terminal-row {
|
|
position: relative;
|
|
z-index: 1;
|
|
height: var(--terminal-line-height, 18px);
|
|
min-height: var(--terminal-line-height, 18px);
|
|
max-height: var(--terminal-line-height, 18px);
|
|
overflow: hidden;
|
|
white-space: pre;
|
|
}
|
|
|
|
.terminal-segment {
|
|
display: inline-block;
|
|
overflow: hidden;
|
|
vertical-align: top;
|
|
white-space: pre;
|
|
}
|
|
|
|
.terminal-cursor {
|
|
position: relative;
|
|
animation: var(--terminal-cursor-blink, none) 1s steps(2, start) infinite;
|
|
}
|
|
|
|
.terminal-cursor::after {
|
|
position: absolute;
|
|
inset: 0;
|
|
display: block;
|
|
content: "";
|
|
pointer-events: none;
|
|
background: var(--terminal-cursor-bg, #dbeafe);
|
|
}
|
|
|
|
.terminal-shell-card[style*="--terminal-cursor-style:block"] .terminal-cursor {
|
|
background: var(--terminal-cursor-bg, #dbeafe) !important;
|
|
color: var(--terminal-cursor-fg, #0f172a) !important;
|
|
box-shadow: 0 0 0 1px rgb(219 234 254 / 30%);
|
|
}
|
|
|
|
.terminal-shell-card[style*="--terminal-cursor-style:block"] .terminal-cursor::after {
|
|
display: none;
|
|
}
|
|
|
|
.terminal-shell-card[style*="--terminal-cursor-style:underline"] .terminal-cursor::after {
|
|
top: auto;
|
|
height: 3px;
|
|
}
|
|
|
|
.terminal-shell-card[style*="--terminal-cursor-style:bar"] .terminal-cursor::after {
|
|
right: auto;
|
|
width: 2px;
|
|
}
|
|
|
|
@keyframes terminal-cursor-blink {
|
|
50% {
|
|
opacity: 0;
|
|
}
|
|
}
|
|
|
|
/* Absolute-positioning virtual scroll: the sizer holds the full content
|
|
height so the scroll geometry is constant; the rows layer is translated
|
|
to the visible window's offset. */
|
|
.terminal-virtual-sizer {
|
|
display: block;
|
|
width: 100%;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.terminal-virtual-rows {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
right: 0;
|
|
will-change: transform;
|
|
}
|
|
|
|
.terminal-selection {
|
|
position: absolute;
|
|
background: var(--terminal-selection-bg, rgb(56 189 248 / 30%));
|
|
pointer-events: none;
|
|
z-index: 1;
|
|
}
|
|
|
|
.terminal-search-match {
|
|
position: absolute;
|
|
background: rgb(250 204 21 / 28%);
|
|
box-shadow: inset 0 0 0 1px rgb(250 204 21 / 55%);
|
|
pointer-events: none;
|
|
z-index: 1;
|
|
}
|
|
|
|
.terminal-link-hitbox {
|
|
position: absolute;
|
|
display: block;
|
|
padding: 0;
|
|
border: 0;
|
|
border-bottom: 1px solid rgb(125 211 252 / 75%);
|
|
background: transparent;
|
|
cursor: pointer;
|
|
z-index: 3;
|
|
}
|
|
|
|
.terminal-link-hitbox:hover {
|
|
background: rgb(125 211 252 / 14%);
|
|
}
|
|
|
|
.terminal-measure {
|
|
position: absolute;
|
|
left: -9999px;
|
|
top: 0;
|
|
white-space: pre;
|
|
font-family: var(
|
|
--terminal-font-family,
|
|
"JetBrains Mono", "Fira Code", "Cascadia Code", "SFMono-Regular",
|
|
"Consolas", monospace
|
|
);
|
|
font-size: var(--terminal-font-size, 13px);
|
|
line-height: var(--terminal-line-height, 18px);
|
|
pointer-events: none;
|
|
opacity: 0;
|
|
}
|
|
|
|
.terminal-screen::-webkit-scrollbar {
|
|
width: 10px;
|
|
}
|
|
|
|
.terminal-screen::-webkit-scrollbar-track {
|
|
background: transparent;
|
|
}
|
|
|
|
.terminal-screen::-webkit-scrollbar-thumb {
|
|
border: 2px solid transparent;
|
|
border-radius: 999px;
|
|
background: rgb(148 163 184 / 55%);
|
|
background-clip: padding-box;
|
|
}
|
|
|
|
.cowa-page-heading {
|
|
@apply flex items-start justify-between gap-4 pb-3;
|
|
}
|
|
|
|
.cowa-page-heading h1 {
|
|
@apply m-0 text-base font-medium;
|
|
color: var(--cowa-text-primary);
|
|
line-height: 24px;
|
|
}
|
|
|
|
.cowa-page-heading p {
|
|
@apply m-0 pt-1 text-sm;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-page-heading > span {
|
|
@apply shrink-0 rounded px-2 py-1 text-xs;
|
|
background: var(--cowa-primary-soft);
|
|
color: var(--cowa-primary);
|
|
}
|
|
|
|
.cowa-summary-grid {
|
|
@apply mb-4 grid gap-3;
|
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
}
|
|
|
|
.cowa-summary-card {
|
|
@apply flex h-16 flex-col justify-center rounded border px-4;
|
|
border-color: var(--cowa-border);
|
|
background: #fff;
|
|
}
|
|
|
|
.cowa-summary-card span {
|
|
@apply text-xs;
|
|
color: var(--cowa-text-tertiary);
|
|
}
|
|
|
|
.cowa-summary-card strong {
|
|
@apply pt-1 text-xl font-semibold;
|
|
color: var(--cowa-text-primary);
|
|
line-height: 26px;
|
|
}
|
|
|
|
.cowa-summary-card-blue {
|
|
border-left: 3px solid var(--cowa-primary);
|
|
}
|
|
|
|
.cowa-summary-card-green {
|
|
border-left: 3px solid var(--cowa-success-text);
|
|
}
|
|
|
|
.cowa-summary-card-orange {
|
|
border-left: 3px solid #ff7d00;
|
|
}
|
|
|
|
.cowa-query {
|
|
@apply grid items-center gap-x-9 gap-y-3;
|
|
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
min-height: 52px;
|
|
}
|
|
|
|
.cowa-form-item {
|
|
@apply flex h-8 min-w-0 items-center;
|
|
}
|
|
|
|
.cowa-form-label {
|
|
@apply shrink-0 text-sm font-normal;
|
|
width: 80px;
|
|
color: var(--cowa-text-primary);
|
|
}
|
|
|
|
.cowa-control {
|
|
@apply h-8 min-w-0 flex-1 rounded border px-3 text-sm outline-none transition-colors;
|
|
width: 240px;
|
|
max-width: 240px;
|
|
border-color: var(--cowa-border);
|
|
background: var(--cowa-control-bg);
|
|
color: var(--cowa-text-primary);
|
|
}
|
|
|
|
.cowa-control::placeholder {
|
|
color: var(--cowa-text-tertiary);
|
|
}
|
|
|
|
.cowa-control:focus {
|
|
border-color: var(--cowa-primary);
|
|
background: #fff;
|
|
}
|
|
|
|
.cowa-select {
|
|
@apply inline-flex items-center justify-between text-left;
|
|
color: var(--cowa-text-tertiary);
|
|
}
|
|
|
|
.cowa-query-actions {
|
|
@apply flex h-8 items-center justify-end gap-5;
|
|
}
|
|
|
|
.cowa-link-action {
|
|
@apply h-8 border-0 bg-transparent p-0 text-sm font-normal;
|
|
color: var(--cowa-primary);
|
|
}
|
|
|
|
.cowa-btn {
|
|
@apply h-8 rounded px-3 py-0 text-sm font-normal shadow-none transition-colors;
|
|
}
|
|
|
|
.cowa-btn-primary {
|
|
background: var(--cowa-primary);
|
|
color: #fff;
|
|
}
|
|
|
|
.cowa-btn-primary:hover {
|
|
background: var(--cowa-primary-hover);
|
|
}
|
|
|
|
.cowa-btn-secondary {
|
|
border-color: var(--cowa-border);
|
|
background: #fff;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-divider {
|
|
@apply mt-3 h-px w-full;
|
|
background: var(--cowa-border);
|
|
}
|
|
|
|
.cowa-toolbar {
|
|
@apply flex h-14 items-center;
|
|
}
|
|
|
|
.cowa-toolbar-between {
|
|
@apply justify-between;
|
|
}
|
|
|
|
.cowa-list-title {
|
|
@apply flex items-center gap-2;
|
|
}
|
|
|
|
.cowa-list-title strong {
|
|
@apply text-base font-medium;
|
|
color: var(--cowa-text-primary);
|
|
}
|
|
|
|
.cowa-list-title span {
|
|
@apply text-xs;
|
|
color: var(--cowa-text-tertiary);
|
|
}
|
|
|
|
.cowa-project-query {
|
|
align-items: start;
|
|
}
|
|
|
|
.cowa-project-list {
|
|
@apply flex min-h-0 flex-1 flex-col overflow-hidden;
|
|
max-height: 100%;
|
|
}
|
|
|
|
.cowa-project-list-meta {
|
|
@apply mb-3 flex items-center justify-between text-xs;
|
|
color: var(--cowa-text-tertiary);
|
|
}
|
|
|
|
.cowa-project-banner {
|
|
@apply mb-3 flex items-start gap-3 rounded border px-4 py-3 text-sm;
|
|
border-color: color-mix(in srgb, var(--cowa-danger-text) 18%, var(--cowa-border));
|
|
background: color-mix(in srgb, var(--cowa-danger-bg) 68%, white);
|
|
color: var(--cowa-danger-text);
|
|
}
|
|
|
|
.cowa-project-banner span {
|
|
@apply text-xs;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-project-scroll {
|
|
@apply min-h-0 flex-1 overflow-y-auto pr-1;
|
|
max-height: 100%;
|
|
scrollbar-gutter: stable;
|
|
scrollbar-width: thin;
|
|
scrollbar-color: var(--cowa-border-strong) transparent;
|
|
}
|
|
|
|
.cowa-project-scroll::-webkit-scrollbar {
|
|
width: 8px;
|
|
}
|
|
|
|
.cowa-project-scroll::-webkit-scrollbar-track {
|
|
background: transparent;
|
|
}
|
|
|
|
.cowa-project-scroll::-webkit-scrollbar-thumb {
|
|
border: 2px solid #fff;
|
|
border-radius: 999px;
|
|
background: var(--cowa-border-strong);
|
|
}
|
|
|
|
.cowa-project-grid {
|
|
@apply grid gap-3;
|
|
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
|
padding-bottom: 4px;
|
|
}
|
|
|
|
.cowa-project-card {
|
|
@apply flex min-h-[144px] flex-col justify-between gap-1.5 rounded border bg-white p-3 transition-colors;
|
|
border-color: var(--cowa-border);
|
|
box-shadow: none;
|
|
}
|
|
|
|
.cowa-project-card:hover {
|
|
border-color: #c7dcff;
|
|
background: #fcfdff;
|
|
}
|
|
|
|
.cowa-project-card-top {
|
|
@apply flex items-start gap-2.5;
|
|
}
|
|
|
|
.cowa-project-cover {
|
|
@apply flex h-[68px] w-[68px] shrink-0 items-center justify-center overflow-hidden rounded;
|
|
}
|
|
|
|
.cowa-project-cover-image {
|
|
@apply block h-full w-full;
|
|
}
|
|
|
|
.cowa-project-card-main {
|
|
@apply min-w-0 flex-1;
|
|
}
|
|
|
|
.cowa-project-title-row {
|
|
@apply flex min-w-0 items-center gap-1.5;
|
|
}
|
|
|
|
.cowa-project-title {
|
|
@apply min-w-0 flex-1 truncate text-sm font-medium;
|
|
color: var(--cowa-primary);
|
|
}
|
|
|
|
.cowa-project-title:hover {
|
|
color: var(--cowa-primary-hover);
|
|
}
|
|
|
|
.cowa-project-status {
|
|
@apply inline-flex h-5 max-w-[92px] shrink-0 items-center truncate rounded-full px-2.5 text-xs font-medium;
|
|
color: #fff;
|
|
}
|
|
|
|
.cowa-project-status-info {
|
|
background: #1874ff;
|
|
}
|
|
|
|
.cowa-project-status-prelabel {
|
|
background: #15aabf;
|
|
}
|
|
|
|
.cowa-project-status-success {
|
|
background: #40c057;
|
|
}
|
|
|
|
.cowa-project-status-warning {
|
|
background: #fab005;
|
|
}
|
|
|
|
.cowa-project-status-danger {
|
|
background: #fa5252;
|
|
}
|
|
|
|
.cowa-project-status-terminate {
|
|
background: rgb(250 82 82 / 10%);
|
|
color: #fa5252;
|
|
}
|
|
|
|
.cowa-project-meta {
|
|
@apply mt-1 flex items-center gap-1.5 text-sm;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-project-meta-icon {
|
|
@apply h-3.5 w-3.5 shrink-0;
|
|
color: var(--cowa-text-tertiary);
|
|
}
|
|
|
|
.cowa-project-meta strong {
|
|
@apply min-w-0 truncate font-normal;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-project-remark {
|
|
@apply m-0 mt-1 block truncate text-xs;
|
|
color: var(--cowa-text-tertiary);
|
|
line-height: 20px;
|
|
}
|
|
|
|
.cowa-project-embedding-row {
|
|
@apply mt-1 flex items-center justify-between gap-3;
|
|
}
|
|
|
|
.cowa-project-embedding-label {
|
|
@apply shrink-0 text-xs font-medium;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-project-embedding-badge {
|
|
@apply inline-flex h-6 shrink-0 items-center rounded-full px-2.5 text-xs font-medium;
|
|
}
|
|
|
|
.cowa-project-embedding-success {
|
|
background: var(--cowa-success-bg);
|
|
color: var(--cowa-success-text);
|
|
}
|
|
|
|
.cowa-project-embedding-muted {
|
|
background: var(--cowa-surface-subtle);
|
|
color: var(--cowa-text-tertiary);
|
|
}
|
|
|
|
.cowa-project-embedding-info {
|
|
background: var(--cowa-primary-soft);
|
|
color: var(--cowa-primary);
|
|
}
|
|
|
|
.cowa-project-embedding-warning {
|
|
background: #fef5e7;
|
|
color: #ff7d00;
|
|
}
|
|
|
|
.cowa-project-actions {
|
|
@apply mt-1 flex items-center justify-between gap-1.5 border-t pt-1.5;
|
|
border-color: var(--cowa-border);
|
|
}
|
|
|
|
.cowa-project-actions a {
|
|
@apply flex h-7 flex-1 items-center justify-center rounded;
|
|
color: var(--cowa-primary);
|
|
}
|
|
|
|
.cowa-project-actions a:hover {
|
|
background: var(--cowa-primary-soft);
|
|
}
|
|
|
|
.cowa-project-actions a.is-disabled {
|
|
pointer-events: none;
|
|
color: var(--cowa-border-strong);
|
|
}
|
|
|
|
.cowa-project-action-icon {
|
|
@apply h-4 w-4;
|
|
}
|
|
|
|
.cowa-project-pagination {
|
|
@apply mt-3 flex h-12 shrink-0 items-center justify-between border-t px-4 text-xs;
|
|
border-color: var(--cowa-border);
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-project-empty,
|
|
.cowa-project-state {
|
|
@apply flex min-h-[220px] flex-col items-center justify-center gap-2 rounded border text-sm;
|
|
border-color: var(--cowa-border);
|
|
color: var(--cowa-text-tertiary);
|
|
}
|
|
|
|
.cowa-project-state-error {
|
|
color: var(--cowa-danger-text);
|
|
}
|
|
|
|
.cowa-project-state-error span {
|
|
@apply max-w-[720px] text-center text-xs;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-project-spinner {
|
|
@apply h-5 w-5 rounded-full border-2;
|
|
border-color: var(--cowa-border);
|
|
border-top-color: var(--cowa-primary);
|
|
animation: cowa-spin 0.8s linear infinite;
|
|
}
|
|
|
|
@keyframes cowa-spin {
|
|
to {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
|
|
.cowa-table-wrap {
|
|
@apply w-full overflow-hidden;
|
|
border: 1px solid var(--cowa-border);
|
|
border-bottom: 0;
|
|
}
|
|
|
|
.cowa-table {
|
|
@apply w-full border-collapse bg-white text-left text-sm;
|
|
table-layout: fixed;
|
|
}
|
|
|
|
.cowa-table thead tr {
|
|
height: var(--cowa-row-h);
|
|
background: var(--cowa-surface-subtle);
|
|
}
|
|
|
|
.cowa-table th {
|
|
@apply h-10 border-b px-4 text-sm font-medium;
|
|
border-color: var(--cowa-border);
|
|
color: var(--cowa-text-primary);
|
|
background: var(--cowa-surface-subtle);
|
|
}
|
|
|
|
.cowa-table tbody tr {
|
|
height: var(--cowa-row-h);
|
|
transition: background-color 0.2s ease;
|
|
}
|
|
|
|
.cowa-table tbody tr:hover {
|
|
background: #fafbfc;
|
|
}
|
|
|
|
.cowa-table td {
|
|
@apply h-10 border-b px-4 align-middle text-sm;
|
|
border-color: var(--cowa-border);
|
|
color: var(--cowa-text-primary);
|
|
}
|
|
|
|
.cowa-table th:nth-child(1),
|
|
.cowa-table td:nth-child(1) {
|
|
width: 18%;
|
|
}
|
|
|
|
.cowa-table th:nth-child(2),
|
|
.cowa-table td:nth-child(2) {
|
|
width: 10%;
|
|
}
|
|
|
|
.cowa-table th:nth-child(3),
|
|
.cowa-table td:nth-child(3) {
|
|
width: 15%;
|
|
}
|
|
|
|
.cowa-table th:nth-child(4),
|
|
.cowa-table td:nth-child(4) {
|
|
width: 18%;
|
|
}
|
|
|
|
.cowa-table th:nth-child(5),
|
|
.cowa-table td:nth-child(5) {
|
|
width: 17%;
|
|
}
|
|
|
|
.cowa-table th:nth-child(6),
|
|
.cowa-table td:nth-child(6) {
|
|
width: 14%;
|
|
}
|
|
|
|
.cowa-table th:nth-child(7),
|
|
.cowa-table td:nth-child(7) {
|
|
width: 16%;
|
|
}
|
|
|
|
.cowa-table-action-head {
|
|
@apply text-center;
|
|
}
|
|
|
|
.cowa-table td:nth-child(7) {
|
|
@apply whitespace-nowrap;
|
|
}
|
|
|
|
.cowa-ellipsis {
|
|
@apply truncate;
|
|
}
|
|
|
|
.cowa-status {
|
|
@apply inline-flex h-6 items-center rounded px-2 text-xs font-normal;
|
|
}
|
|
|
|
.cowa-status-enabled {
|
|
background: var(--cowa-success-bg);
|
|
color: var(--cowa-success-text);
|
|
}
|
|
|
|
.cowa-status-disabled {
|
|
background: var(--cowa-danger-bg);
|
|
color: var(--cowa-danger-text);
|
|
}
|
|
|
|
.cowa-row-actions {
|
|
@apply flex items-center justify-center whitespace-nowrap text-xs;
|
|
}
|
|
|
|
.cowa-row-actions a {
|
|
@apply px-2 leading-none;
|
|
color: var(--cowa-primary);
|
|
}
|
|
|
|
.cowa-row-actions a + a {
|
|
border-left: 1px solid var(--cowa-border);
|
|
}
|
|
|
|
.cowa-row-actions .danger {
|
|
color: var(--cowa-danger-text);
|
|
}
|
|
|
|
.cowa-pagination {
|
|
@apply flex h-14 items-center justify-between border-x border-b bg-white px-4 text-xs;
|
|
border-color: var(--cowa-border);
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-page-controls {
|
|
@apply flex items-center gap-2;
|
|
}
|
|
|
|
.cowa-page-icon,
|
|
.cowa-page-number {
|
|
@apply flex h-8 min-w-8 items-center justify-center rounded border-0 bg-transparent px-2 text-xs transition-colors;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-page-icon:disabled,
|
|
.cowa-page-number:disabled {
|
|
color: var(--cowa-border-strong);
|
|
cursor: not-allowed;
|
|
}
|
|
|
|
.cowa-page-icon:hover,
|
|
.cowa-page-number:hover {
|
|
background: var(--cowa-surface-subtle);
|
|
}
|
|
|
|
.cowa-page-number.active {
|
|
background: var(--cowa-primary-soft);
|
|
color: var(--cowa-primary);
|
|
}
|
|
|
|
.cowa-page-more {
|
|
@apply px-1;
|
|
color: var(--cowa-text-tertiary);
|
|
}
|
|
|
|
.cowa-page-size {
|
|
@apply ml-1 flex h-8 items-center gap-1 rounded border bg-white px-2 text-xs;
|
|
border-color: var(--cowa-border);
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-page-size-select {
|
|
@apply h-7 rounded border bg-white px-2 text-xs outline-none;
|
|
border-color: var(--cowa-border);
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
|
|
.cowa-empty {
|
|
@apply flex flex-col items-start gap-3 py-10;
|
|
}
|
|
|
|
.cowa-empty h1 {
|
|
@apply m-0 text-lg font-medium;
|
|
}
|
|
|
|
.cowa-empty p {
|
|
@apply m-0 text-sm;
|
|
color: var(--cowa-text-secondary);
|
|
}
|
|
}
|
|
|
|
@media (max-width: 1100px) {
|
|
.cowa-sidebar {
|
|
@apply hidden;
|
|
}
|
|
|
|
.cowa-main {
|
|
margin-left: 0;
|
|
}
|
|
|
|
.cowa-topbar {
|
|
grid-template-columns: minmax(0, 1fr);
|
|
}
|
|
|
|
.cowa-brand {
|
|
@apply hidden;
|
|
}
|
|
|
|
.cowa-query {
|
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
}
|
|
}
|
|
|
|
@media (max-width: 720px) {
|
|
.cowa-topbar-main {
|
|
@apply gap-2 px-3;
|
|
}
|
|
|
|
.cowa-module-tabs {
|
|
@apply min-w-0 flex-1 gap-2 overflow-x-auto;
|
|
}
|
|
|
|
.cowa-module-tab {
|
|
@apply shrink-0 px-3;
|
|
}
|
|
|
|
.cowa-user-menu {
|
|
@apply hidden;
|
|
}
|
|
|
|
.cowa-content {
|
|
@apply p-3;
|
|
}
|
|
|
|
.cowa-query {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
|
|
.cowa-query-actions {
|
|
@apply justify-start;
|
|
}
|
|
}
|