First Version

This commit is contained in:
2026-07-10 15:02:09 +01:00
commit 38494a85a9
562 changed files with 196313 additions and 0 deletions
+150
View File
@@ -0,0 +1,150 @@
/* Agent Inbox page — desktop layout. Card styles live in inbox-cards.css. */
agent-inbox-page {
display: none;
flex: 1;
min-width: 0;
overflow: hidden;
}
/* ── Page panel (shell shared with other full-page views) ── */
.page-panel {
display: flex;
flex-direction: column;
height: 100%;
width: 100%;
}
.page-panel-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 20px;
min-height: 54px;
border-bottom: 1px solid var(--bs-border-color);
background: var(--bs-tertiary-bg);
flex-shrink: 0;
}
.page-panel-header h5 {
margin: 0;
font-weight: 700;
font-size: 1.05rem;
display: flex;
align-items: center;
gap: 8px;
}
/* ── Refresh button ── */
.inbox-refresh-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 34px;
height: 34px;
border-radius: 8px;
border: 1px solid var(--bs-border-color);
background: transparent;
color: var(--bs-secondary-color);
font-size: 1rem;
cursor: pointer;
transition: all 0.15s ease;
}
.inbox-refresh-btn:hover {
background: var(--bs-body-bg);
color: var(--bs-body-color);
border-color: var(--bs-secondary-color);
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);
}
.inbox-refresh-btn:active { transform: scale(0.94); }
/* ── Grid container ── */
.inbox-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
gap: 16px;
padding: 20px;
align-content: start;
overflow-y: auto;
flex: 1;
}
/* ── Section headers (span full grid width) ── */
.inbox-section-header {
grid-column: 1 / -1;
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 4px;
margin-top: 8px;
}
.inbox-section-header:first-child { margin-top: 0; }
.inbox-section-header h6 {
margin: 0;
font-weight: 600;
font-size: 0.95rem;
color: var(--bs-body-color);
}
.inbox-section-header .section-line {
flex: 1;
height: 1px;
background: var(--bs-border-color);
}
.inbox-section-header .badge {
font-size: 0.7rem;
padding: 2px 8px;
}
/* ── Bootstrap btn inside card footer ── */
.inbox-card-footer .btn {
flex: 1;
font-weight: 600;
font-size: 0.82rem;
padding: 7px 12px;
border-radius: 8px;
}
/* ── Mobile tweaks ── */
@media (max-width: 600px) {
.page-panel-header {
padding: 12px 14px;
min-height: 50px;
}
.inbox-grid {
grid-template-columns: 1fr;
padding: 12px;
gap: 12px;
}
.inbox-card-body { padding: 12px; }
.inbox-card-footer {
flex-direction: column;
}
.approval-footer {
grid-template-columns: 1fr;
}
.inbox-card-footer .btn {
width: 100%;
}
.inbox-answer-send {
width: 100%;
justify-content: center;
}
}
+298
View File
@@ -0,0 +1,298 @@
/* ── Agents page layout ───────────────────────────────────────────────────── */
agents-page {
display: none;
flex-direction: column;
flex: 1;
overflow-y: auto;
padding: 1.5rem 2rem;
background: var(--bs-body-bg);
}
.agents-page {
display: flex;
flex-direction: column;
width: 100%;
}
.agents-page-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 0.75rem;
}
/* ── Info banner ─────────────────────────────────────────────────────────── */
.agent-info-banner {
display: flex;
gap: 0.65rem;
align-items: flex-start;
font-size: 0.82rem;
line-height: 1.5;
padding: 0.8rem 1rem;
margin-bottom: 1.5rem;
border-radius: 8px;
background: rgba(var(--bs-primary-rgb), 0.06);
border: 1px solid rgba(var(--bs-primary-rgb), 0.15);
color: var(--bs-body-color);
}
.agent-info-banner-icon {
font-size: 1.1rem;
color: var(--bs-primary);
line-height: 1.4;
flex-shrink: 0;
}
.agent-info-banner-body p {
font-size: 0.82rem;
}
.agent-info-banner-body code {
font-size: 0.82em;
background: rgba(var(--bs-primary-rgb), 0.08);
padding: 0.08em 0.35em;
border-radius: 3px;
}
/* ── Agent cards (list view) ─────────────────────────────────────────────── */
.agent-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 0.75rem;
}
.agent-card {
border: 1px solid var(--bs-border-color);
border-radius: 8px;
padding: 0.5rem 0.5rem;
cursor: pointer;
transition: border-color 0.15s, box-shadow 0.15s;
background: var(--bs-body-bg);
}
.agent-card:hover {
border-color: var(--bs-primary);
box-shadow: 0 0 0 3px rgba(var(--bs-primary-rgb), 0.1);
}
.agent-card-body {
display: flex;
gap: 0.85rem;
align-items: flex-start;
}
.agent-card-icon {
width: 120px;
height: 160px;
border-radius: 8px;
object-fit: cover;
flex-shrink: 0;
background: var(--bs-tertiary-bg);
}
.agent-card-content {
flex: 1;
min-width: 0;
}
.agent-card-header {
display: flex;
align-items: baseline;
gap: 0.5rem;
margin-bottom: 0.35rem;
}
.agent-card-name {
font-weight: 600;
font-size: 0.95rem;
}
.agent-card-id {
font-size: 0.72rem;
font-family: var(--bs-font-monospace);
}
.agent-card-desc {
font-size: 0.82rem;
margin-bottom: 0.5rem;
line-height: 1.4;
}
.agent-card-meta {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.4rem;
}
.agent-meta-item {
display: flex;
align-items: center;
gap: 0.25rem;
font-size: 0.78rem;
}
/* ── Shared pills & dots ─────────────────────────────────────────────────── */
.agent-strength-dot {
display: inline-block;
width: 9px;
height: 9px;
border-radius: 50%;
flex-shrink: 0;
}
.agent-scope-pill {
display: inline-block;
font-size: 0.7rem;
padding: 0.1rem 0.45rem;
border-radius: 999px;
background: var(--bs-secondary-bg);
color: var(--bs-secondary-color);
border: 1px solid var(--bs-border-color);
}
/* ── Detail view ─────────────────────────────────────────────────────────── */
.agent-detail {
display: flex;
flex-direction: column;
gap: 0;
}
.agent-detail-header {
margin-bottom: 1.5rem;
}
.agent-detail-title-row {
display: flex;
align-items: flex-start;
gap: 1.25rem;
margin-top: 0.3rem;
}
.agent-detail-icon {
width: 240px;
height: 312px;
border-radius: 10px;
object-fit: cover;
flex-shrink: 0;
background: var(--bs-tertiary-bg);
border: 1px solid var(--bs-border-color);
}
.agent-detail-title {
font-size: 1.35rem;
font-weight: 700;
margin: 0 0 0.25rem;
}
.agent-detail-body {
display: flex;
flex-direction: column;
gap: 2rem;
}
.agent-section-title {
font-size: 0.8rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--bs-secondary-color);
margin-bottom: 0.75rem;
padding-bottom: 0.4rem;
border-bottom: 1px solid var(--bs-border-color);
}
/* List view — agents grouped by role (Chat / Task Executors). */
.agent-group + .agent-group {
margin-top: 1.5rem;
}
.agent-group-title {
font-size: 0.8rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--bs-secondary-color);
margin-bottom: 0.6rem;
}
/* ── Meta table ──────────────────────────────────────────────────────────── */
.agent-meta-table {
font-size: 0.85rem;
border-collapse: collapse;
}
.agent-meta-key {
color: var(--bs-secondary-color);
padding-right: 1.25rem;
padding-bottom: 0.35rem;
white-space: nowrap;
vertical-align: top;
}
/* ── Model resolution table ──────────────────────────────────────────────── */
.agent-model-table {
font-size: 0.83rem;
}
.agent-model-rank {
font-size: 0.75rem;
width: 2rem;
}
.agent-model-id {
font-family: var(--bs-font-monospace);
font-size: 0.78rem;
max-width: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.agent-model-row--first td {
background: rgba(var(--bs-success-rgb), 0.06);
}
/* ── System prompt ───────────────────────────────────────────────────────── */
.agent-prompt-body {
font-size: 0.88rem;
line-height: 1.6;
border: 1px solid var(--bs-border-color);
border-radius: 6px;
padding: 1rem 1.25rem;
background: var(--bs-secondary-bg);
max-height: 520px;
overflow-y: auto;
}
.agent-prompt-body h1,
.agent-prompt-body h2,
.agent-prompt-body h3 {
font-size: 1em;
font-weight: 700;
margin-top: 1em;
}
.agent-prompt-body code {
font-size: 0.82em;
}
.agent-prompt-body pre {
background: var(--bs-tertiary-bg);
border-radius: 4px;
padding: 0.6rem 0.8rem;
overflow-x: auto;
}
.agent-prompt-body ul,
.agent-prompt-body ol {
padding-left: 1.4em;
}
+469
View File
@@ -0,0 +1,469 @@
/* ── Approval Groups page ──────────────────────────────────────────────────── */
approval-groups-page {
display: none; /* toggled by JS */
flex: 1;
min-width: 0;
overflow-y: auto;
border-right: 1px solid var(--toolbar-border, #e5e9f0);
}
/* ── Dark mode overrides for action colors (shared with rules page) ─────────── */
@media (prefers-color-scheme: dark) {
.apr-card {
--apr-action-bg: rgba(234,179,8,0.18);
--apr-action-color: #fbbf24;
}
.apr-card[data-action="allow"] {
--apr-action-bg: rgba(34,197,94,0.18);
--apr-action-color: #4ade80;
}
.apr-card[data-action="deny"] {
--apr-action-bg: rgba(239,68,68,0.18);
--apr-action-color: #f87171;
}
}
/* ── Page shell ── */
.apr-page {
display: flex;
flex-direction: column;
height: 100%;
width: 100%;
max-width: 100%;
}
.apr-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 20px;
min-height: 54px;
border-bottom: 1px solid var(--bs-border-color);
background: var(--bs-tertiary-bg);
flex-shrink: 0;
gap: 12px;
}
.apr-title {
margin: 0;
font-weight: 700;
font-size: 1.05rem;
display: flex;
align-items: center;
gap: 8px;
}
.apr-header-right {
display: flex;
align-items: center;
gap: 10px;
}
.apr-header-count {
font-size: 0.76rem;
font-weight: 500;
color: var(--bs-secondary-color);
}
/* ── Card list ── */
.apr-card-list {
padding: 16px 20px;
overflow-y: auto;
flex: 1;
display: flex;
flex-direction: column;
gap: 10px;
}
/* ── Single card ── */
.apr-card {
background: var(--bs-body-bg);
border: 1px solid var(--bs-border-color);
border-radius: 10px;
padding: 14px 16px;
display: flex;
flex-direction: column;
gap: 8px;
transition: border-color 0.15s, box-shadow 0.15s;
}
.apr-card:hover {
border-color: color-mix(in srgb, var(--apr-action-color, #a16207) 40%, var(--bs-border-color));
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);
}
/* ── Row 1: action badge + pattern + priority + actions ── */
.apr-card-row1 {
display: flex;
align-items: center;
gap: 10px;
}
.apr-action-badge {
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 0.72rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.03em;
padding: 0.25em 0.65em;
border-radius: 5px;
flex-shrink: 0;
background: var(--apr-action-bg, rgba(234,179,8,0.12));
color: var(--apr-action-color, #a16207);
}
.apr-action-badge i {
font-size: 0.7rem;
}
.apr-pattern {
font-family: var(--bs-font-monospace, monospace);
font-size: 0.82rem;
font-weight: 500;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
background: var(--bs-tertiary-bg, rgba(0,0,0,0.02));
padding: 0.1em 0.45em;
border-radius: 4px;
}
.apr-priority-badge {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 0.72rem;
font-weight: 500;
color: var(--bs-secondary-color, #6b7280);
flex-shrink: 0;
white-space: nowrap;
padding: 0.2em 0.5em;
background: var(--bs-tertiary-bg, #f0f2f5);
border-radius: 5px;
}
.apr-priority-badge i {
font-size: 0.65rem;
}
.apr-card-actions {
display: flex;
gap: 2px;
flex-shrink: 0;
margin-left: auto;
}
.apr-btn-icon {
display: flex;
align-items: center;
justify-content: center;
width: 30px;
height: 30px;
border: none;
background: transparent;
color: var(--bs-secondary-color, #9ca3af);
border-radius: 6px;
cursor: pointer;
font-size: 0.85rem;
transition: all 0.1s;
}
.apr-btn-icon:hover {
background: var(--bs-tertiary-bg, #f0f2f5);
color: var(--bs-body-color, #374151);
}
.apr-btn-edit:hover {
color: var(--bs-primary, #0d6efd);
background: var(--bs-primary-bg-subtle, #eef2ff);
}
.apr-btn-delete:hover {
color: var(--bs-danger, #dc3545);
background: var(--bs-danger-bg-subtle, #fef0f0);
}
/* ── Row 2 / Row 3 ── */
.apr-card-row2 {
padding-left: 0;
}
.apr-card-row3 {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
/* ── Tags ── */
.apr-tag {
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 0.74rem;
font-weight: 500;
padding: 0.2em 0.6em;
border-radius: 5px;
background: var(--bs-tertiary-bg, #f0f2f5);
color: var(--bs-secondary-color, #6b7280);
white-space: nowrap;
}
.apr-tag i {
font-size: 0.7rem;
}
.apr-tag code {
font-size: inherit;
background: transparent;
padding: 0;
color: inherit;
}
.apr-tag-note {
max-width: 280px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* ── Empty state ── */
.apr-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 48px 20px;
color: var(--bs-secondary-color, #9ca3af);
gap: 8px;
flex: 1;
}
.apr-empty i {
font-size: 2rem;
opacity: 0.4;
}
.apr-empty p {
margin: 0;
font-size: 0.9rem;
}
/* ── Form ── */
.apr-form {
margin: 16px 20px 0;
border: 1px solid var(--bs-border-color);
border-radius: 10px;
overflow: hidden;
background: var(--bs-body-bg);
flex-shrink: 0;
}
.apr-form-header {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 16px;
font-weight: 600;
font-size: 0.9rem;
background: var(--bs-tertiary-bg);
border-bottom: 1px solid var(--bs-border-color);
}
.apr-form-close {
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border: none;
background: transparent;
color: var(--bs-secondary-color);
border-radius: 6px;
margin-left: auto;
cursor: pointer;
font-size: 1.1rem;
}
.apr-form-close:hover {
background: var(--bs-secondary-bg, rgba(128,128,128,0.1));
color: var(--bs-body-color);
}
.apr-form-body {
padding: 1.25rem;
}
.apr-form-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
padding-top: 1rem;
margin-top: 0.5rem;
border-top: 1px solid var(--bs-border-color);
}
/* ── Tool picker (used inside Override/LowPrio form) ── */
.apr-tool-picker {
border: 1px solid var(--bs-border-color, #dee2e6);
border-radius: 6px;
padding: 0.5rem;
background: var(--bs-tertiary-bg, rgba(0,0,0,0.02));
}
.apr-tool-list {
max-height: 240px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 1px;
}
.apr-tool-group-label {
font-size: 0.7rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--bs-secondary-color, #6c757d);
padding: 0.4rem 0.4rem 0.1rem;
margin-top: 0.25rem;
}
.apr-tool-item {
display: flex;
align-items: baseline;
gap: 0.6rem;
width: 100%;
padding: 0.3rem 0.4rem;
border: none;
border-radius: 4px;
background: transparent;
text-align: left;
cursor: pointer;
color: var(--bs-body-color);
transition: background 0.12s;
}
.apr-tool-item:hover {
background: var(--bs-secondary-bg, rgba(128,128,128,0.1));
}
.apr-tool-item.selected {
background: var(--bs-primary-bg-subtle, #cfe2ff);
color: var(--bs-primary, #0d6efd);
}
.apr-tool-name {
font-size: 0.78rem;
flex-shrink: 0;
}
.apr-tool-desc {
font-size: 0.75rem;
color: var(--bs-secondary-color, #6c757d);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* ── Group card ── */
.apr-group-card {
cursor: pointer;
}
.apr-group-card:hover {
border-color: var(--bs-primary, #0d6efd);
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);
}
.apr-group-name {
font-weight: 600;
font-size: 0.92rem;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.apr-group-default-badge {
display: inline-flex;
align-items: center;
font-size: 0.68rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.04em;
padding: 0.2em 0.55em;
border-radius: 4px;
flex-shrink: 0;
background: var(--bs-secondary-bg, rgba(100,116,139,0.15));
color: var(--bs-secondary-color, #64748b);
}
/* ── Mobile ── */
@media (max-width: 600px) {
.apr-header {
padding: 10px 14px;
min-height: 50px;
}
.apr-card-list {
padding: 10px 12px;
gap: 8px;
}
.apr-card {
padding: 12px;
gap: 6px;
}
.apr-card-row1 {
gap: 7px;
}
.apr-action-badge {
font-size: 0.66rem;
padding: 0.2em 0.5em;
}
.apr-card-actions {
gap: 0;
}
.apr-btn-icon {
width: 28px;
height: 28px;
font-size: 0.8rem;
}
.apr-tag {
font-size: 0.7rem;
}
.apr-tag-note {
max-width: 180px;
}
.apr-form {
margin: 10px 12px 0;
}
.apr-form-body {
padding: 1rem;
}
}
+373
View File
@@ -0,0 +1,373 @@
/* ── Approval Rules (per-group view) ───────────────────────────────────────── */
approval-rules-page {
display: none; /* toggled by JS */
flex: 1;
min-width: 0;
overflow-y: auto;
border-right: 1px solid var(--toolbar-border, #e5e9f0);
}
/* ── Rules body ── */
.apr-rules-body {
flex: 1;
overflow-y: auto;
display: flex;
flex-direction: column;
min-height: 0;
}
/* ── Side panels (Override / Low Priority) ── */
.apr-side-panel {
flex-shrink: 0;
border-bottom: 1px solid var(--bs-border-color);
}
.apr-side-panel-header {
display: flex;
align-items: center;
gap: 8px;
padding: 9px 20px;
cursor: pointer;
user-select: none;
background: var(--bs-tertiary-bg);
transition: background 0.12s;
}
.apr-side-panel-header:hover {
background: color-mix(in srgb, var(--bs-tertiary-bg) 80%, var(--bs-border-color));
}
.apr-panel-icon {
font-size: 0.78rem;
color: var(--bs-secondary-color);
}
.apr-panel-title {
font-weight: 600;
font-size: 0.85rem;
}
.apr-panel-subtitle {
font-size: 0.7rem;
color: var(--bs-secondary-color);
}
.apr-count-badge {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 20px;
height: 18px;
font-size: 0.68rem;
font-weight: 700;
padding: 0 5px;
border-radius: 9px;
background: var(--bs-secondary-bg);
color: var(--bs-secondary-color);
}
.apr-panel-add-btn {
font-size: 0.75rem;
padding: 2px 8px;
margin-left: auto;
flex-shrink: 0;
}
.apr-side-panel-body {
padding: 10px 16px 12px;
display: flex;
flex-direction: column;
gap: 8px;
}
.apr-side-panel-body .apr-form {
margin: 0 0 4px;
}
.apr-panel-empty {
font-size: 0.8rem;
color: var(--bs-secondary-color);
padding: 4px 4px 2px;
}
/* ── Tool matrix ── */
.apr-matrix {
display: flex;
flex-direction: column;
border-bottom: 1px solid var(--bs-border-color);
flex-shrink: 0;
}
.apr-matrix-header {
display: flex;
align-items: baseline;
gap: 8px;
padding: 9px 20px;
background: var(--bs-body-bg);
border-top: 2px solid var(--bs-border-color);
border-bottom: 1px solid var(--bs-border-color);
flex-shrink: 0;
}
.apr-matrix-title {
font-weight: 700;
font-size: 0.85rem;
}
.apr-matrix-subtitle {
font-size: 0.7rem;
color: var(--bs-secondary-color);
}
.apr-matrix-body {
overflow: visible;
}
/* ── Category sections ── */
.apr-cat-section {
border-bottom: 1px solid var(--bs-border-color);
}
.apr-cat-section:last-child {
border-bottom: none;
}
.apr-cat-header {
display: flex;
align-items: center;
gap: 8px;
padding: 7px 20px;
cursor: pointer;
user-select: none;
transition: background 0.1s;
}
.apr-cat-header:hover {
background: var(--bs-tertiary-bg);
}
.apr-cat-chevron {
font-size: 0.65rem;
color: var(--bs-secondary-color);
width: 10px;
flex-shrink: 0;
}
.apr-cat-name {
font-weight: 600;
font-size: 0.8rem;
}
.apr-cat-desc {
font-size: 0.7rem;
color: var(--bs-secondary-color);
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.apr-cat-count {
font-size: 0.7rem;
font-weight: 500;
color: var(--bs-primary, #0d6efd);
}
.apr-cat-count--muted {
color: var(--bs-secondary-color);
font-weight: 400;
}
.apr-cat-body {
display: none;
padding: 2px 0 4px;
}
.apr-cat-section--open .apr-cat-body {
display: block;
}
/* ── Tool rows ── */
.apr-tool-row {
display: flex;
align-items: center;
gap: 10px;
padding: 4px 20px 4px 36px;
transition: background 0.1s;
min-height: 34px;
}
.apr-tool-row:hover {
background: var(--bs-tertiary-bg);
}
.apr-matrix-tool-name {
font-size: 0.76rem;
font-weight: 500;
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: default;
}
/* ── 4-state chip toggle ── */
.apr-chip-group {
display: inline-flex;
border: 1px solid var(--bs-border-color);
border-radius: 5px;
overflow: hidden;
flex-shrink: 0;
}
.apr-chip {
display: inline-flex;
align-items: center;
padding: 3px 9px;
font-size: 0.7rem;
font-weight: 600;
border: none;
border-right: 1px solid var(--bs-border-color);
background: var(--bs-body-bg);
color: var(--bs-secondary-color);
cursor: pointer;
transition: background 0.1s, color 0.1s;
white-space: nowrap;
letter-spacing: 0.01em;
}
.apr-chip:last-child {
border-right: none;
}
.apr-chip:hover {
background: var(--bs-tertiary-bg);
color: var(--bs-body-color);
}
.apr-chip[data-action="unset"].active {
background: var(--bs-secondary-bg);
color: var(--bs-body-color);
font-weight: 700;
}
.apr-chip[data-action="allow"].active {
background: rgba(34,197,94,0.15);
color: #16a34a;
}
.apr-chip[data-action="require"].active {
background: rgba(234,179,8,0.15);
color: #a16207;
}
.apr-chip[data-action="deny"].active {
background: rgba(239,68,68,0.15);
color: #dc2626;
}
@media (prefers-color-scheme: dark) {
.apr-chip[data-action="allow"].active { background: rgba(34,197,94,0.22); color: #4ade80; }
.apr-chip[data-action="require"].active { background: rgba(234,179,8,0.22); color: #fbbf24; }
.apr-chip[data-action="deny"].active { background: rgba(239,68,68,0.22); color: #f87171; }
}
/* ── Default action bar ── */
.apr-default-bar {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 20px;
border-top: 2px solid var(--bs-border-color);
background: var(--bs-tertiary-bg);
flex-shrink: 0;
flex-wrap: wrap;
}
.apr-default-label {
display: flex;
align-items: center;
gap: 5px;
font-size: 0.82rem;
flex-shrink: 0;
}
.apr-default-hint {
font-weight: 400;
color: var(--bs-secondary-color);
margin-left: 2px;
}
.apr-default-unset {
font-size: 0.72rem;
color: var(--bs-secondary-color);
font-style: italic;
}
/* ── File System panel ── */
.apr-fs-row {
display: flex;
align-items: center;
gap: 10px;
min-height: 34px;
}
.apr-fs-row-icon {
font-size: 0.8rem;
color: var(--bs-secondary-color);
flex-shrink: 0;
}
.apr-fs-path {
flex: 1;
min-width: 0;
font-size: 0.78rem;
font-weight: 500;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.apr-fs-select {
width: auto;
flex-shrink: 0;
font-size: 0.76rem;
}
.apr-fs-path-input {
flex: 1;
min-width: 0;
}
.apr-fs-add {
padding-top: 8px;
margin-top: 2px;
border-top: 1px dashed var(--bs-border-color);
}
.apr-fs-add-btn {
flex-shrink: 0;
}
.apr-fs-default {
padding-top: 8px;
margin-top: 2px;
border-top: 1px solid var(--bs-border-color);
}
.apr-fs-default-label {
font-weight: 600;
font-size: 0.82rem;
flex: 1;
}
+107
View File
@@ -0,0 +1,107 @@
config-page {
display: none;
flex-direction: column;
flex: 1;
overflow-y: auto;
padding: 1.5rem 2rem;
background: var(--bs-body-bg);
}
.config-page {
display: flex;
flex-direction: column;
width: 100%;
}
.config-page-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 0.75rem;
}
.config-sets {
display: flex;
flex-direction: column;
gap: 2rem;
max-width: 680px;
}
.config-set {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.config-set-header {
padding-bottom: 0.5rem;
border-bottom: 1px solid var(--bs-border-color);
}
.config-set-name {
font-size: 1rem;
font-weight: 700;
}
.config-set-desc {
font-size: 0.8rem;
color: var(--bs-secondary-color, #6c757d);
margin-top: 0.1rem;
}
.config-rows {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.config-row {
display: flex;
flex-direction: column;
gap: 0.5rem;
padding: 1rem;
border: 1px solid var(--bs-border-color);
border-radius: 0.5rem;
background: var(--bs-body-bg);
}
.config-row-name {
font-weight: 600;
font-size: 0.9rem;
}
.config-row-desc {
font-size: 0.8rem;
color: var(--bs-secondary-color, #6c757d);
}
.config-row-control {
display: flex;
gap: 0.5rem;
align-items: center;
}
.config-input {
flex: 1;
max-width: 400px;
}
.config-save-btn {
white-space: nowrap;
min-width: 64px;
}
.config-bool-switch {
display: flex;
align-items: center;
gap: 0.5rem;
margin: 0;
padding: 0;
}
.config-bool-switch .form-check-input {
cursor: pointer;
width: 2.5em;
height: 1.25em;
margin: 0;
}
+219
View File
@@ -0,0 +1,219 @@
/* ── Input area ────────────────────────────────────────────────────────────── */
.copilot-input-area {
padding: 0.6rem 0.75rem 0.75rem;
border-top: 1px solid var(--toolbar-border);
flex-shrink: 0;
}
.copilot-composer {
position: relative;
display: flex;
flex-direction: column;
border: 1px solid var(--toolbar-border);
border-radius: 0.6rem;
background: var(--msg-assistant-bg);
transition: border-color 0.15s;
}
.copilot-composer:focus-within {
border-color: #6366f1;
box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.12);
}
.copilot-textarea {
resize: none;
border: none;
outline: none;
background: transparent;
font-size: 0.85rem;
line-height: 1.55;
padding: 0.6rem 0.75rem 0.4rem;
min-height: 2.6rem;
max-height: 14rem;
overflow-y: auto;
color: inherit;
width: 100%;
box-sizing: border-box;
}
/* ── Toolbar ───────────────────────────────────────────────────────────────── */
.copilot-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.3rem 0.4rem;
border-top: 1px solid var(--toolbar-border);
gap: 0.3rem;
}
.copilot-toolbar-left,
.copilot-toolbar-right {
display: flex;
align-items: center;
gap: 0.25rem;
}
.copilot-toolbar-btn {
display: flex;
align-items: center;
justify-content: center;
width: 1.8rem;
height: 1.8rem;
padding: 0;
border: none;
border-radius: 0.4rem;
background: transparent;
color: var(--placeholder-color);
font-size: 0.85rem;
cursor: pointer;
transition: background 0.12s, color 0.12s;
}
.copilot-toolbar-btn:hover {
background: var(--sidebar-hover);
color: var(--text-primary, #1e293b);
}
/* ── Model pill + dropdown ─────────────────────────────────────────────────── */
.copilot-model-wrap {
position: relative;
}
.copilot-model-pill {
display: flex;
align-items: center;
gap: 0.3rem;
padding: 0.2rem 0.5rem;
border: 1px solid transparent;
border-radius: 999px;
background: transparent;
font-size: 0.75rem;
color: var(--placeholder-color);
cursor: pointer;
transition: background 0.12s, border-color 0.12s, color 0.12s;
white-space: nowrap;
}
.copilot-model-pill:hover,
.copilot-model-pill.open {
background: rgba(99, 102, 241, 0.08);
border-color: rgba(99, 102, 241, 0.3);
color: #6366f1;
}
.copilot-model-pill i:first-child {
font-size: 0.75rem;
color: #6366f1;
}
.copilot-model-overlay {
position: fixed;
inset: 0;
z-index: 99;
}
.copilot-model-dropdown {
position: absolute;
bottom: calc(100% + 6px);
left: 0;
background: var(--msg-assistant-bg);
border: 1px solid var(--toolbar-border);
border-radius: 0.5rem;
padding: 0.3rem 0;
min-width: 160px;
z-index: 100;
box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12);
}
.copilot-model-item {
display: block;
width: 100%;
padding: 0.3rem 0.75rem;
background: transparent;
border: none;
text-align: left;
font-size: 0.8rem;
cursor: pointer;
color: inherit;
transition: background 0.1s;
}
.copilot-model-item:hover { background: rgba(99, 102, 241, 0.07); }
.copilot-model-item.active { color: #6366f1; font-weight: 600; }
/* ── Slash-command autocomplete ─────────────────────────────────────────────── */
.copilot-cmd-menu {
position: absolute;
bottom: calc(100% + 6px);
left: 0;
right: 0;
background: var(--msg-assistant-bg);
border: 1px solid var(--toolbar-border);
border-radius: 0.5rem;
padding: 0.25rem 0;
max-height: 15rem;
overflow-y: auto;
z-index: 100;
box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12);
}
.copilot-cmd-item {
display: flex;
align-items: baseline;
gap: 0.5rem;
width: 100%;
padding: 0.3rem 0.75rem;
background: transparent;
border: none;
text-align: left;
font-size: 0.8rem;
cursor: pointer;
color: inherit;
transition: background 0.1s;
}
.copilot-cmd-item:hover,
.copilot-cmd-item.active { background: rgba(99, 102, 241, 0.1); }
.copilot-cmd-name { font-weight: 600; color: #6366f1; white-space: nowrap; }
.copilot-cmd-desc {
color: var(--text-muted, #888);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* ── Send / stop button ────────────────────────────────────────────────────── */
.copilot-send-btn {
display: flex;
align-items: center;
justify-content: center;
width: 1.9rem;
height: 1.9rem;
padding: 0;
border: none;
border-radius: 0.45rem;
background: #6366f1;
color: #fff;
font-size: 0.8rem;
cursor: pointer;
transition: background 0.12s;
flex-shrink: 0;
}
.copilot-send-btn:hover { background: #4f46e5; }
.copilot-send-btn--stop { background: #dc2626; }
.copilot-send-btn--stop:hover { background: #b91c1c; }
.copilot-send-btn--recording { background: #dc2626; animation: copilot-pulse 1s ease-in-out infinite; }
.copilot-send-btn--recording:hover { background: #b91c1c; }
@keyframes copilot-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.65; }
}
+585
View File
@@ -0,0 +1,585 @@
/* ── Messages container ────────────────────────────────────────────────────── */
.copilot-messages {
flex: 1;
overflow-y: auto;
padding: 1rem;
display: flex;
flex-direction: column;
gap: 0.65rem;
}
/* ── Message bubbles ───────────────────────────────────────────────────────── */
.copilot-msg {
padding: 0.6rem 0.9rem;
border-radius: 0.75rem;
font-size: 0.85rem;
line-height: 1.55;
max-width: 88%;
}
.copilot-msg.assistant {
background: var(--msg-assistant-bg);
color: var(--msg-assistant-text);
align-self: flex-start;
border-bottom-left-radius: 0.2rem;
}
.copilot-msg.user {
background: var(--msg-user-bg);
color: var(--msg-user-text);
align-self: flex-end;
border-bottom-right-radius: 0.2rem;
}
.copilot-msg.error {
background: #fef2f2;
color: #991b1b;
align-self: flex-start;
border-bottom-left-radius: 0.2rem;
font-size: 0.82rem;
}
@media (prefers-color-scheme: dark) {
.copilot-msg.error {
background: #2d1515;
color: #fca5a5;
}
}
.copilot-msg.info {
background: #f0f9ff;
color: #0369a1;
align-self: flex-start;
border-bottom-left-radius: 0.2rem;
font-size: 0.80rem;
}
@media (prefers-color-scheme: dark) {
.copilot-msg.info {
background: #0c1e2d;
color: #7dd3fc;
}
}
.copilot-msg--failed {
opacity: 0.6;
}
.copilot-failed-badge {
color: #dc2626;
font-size: 0.75rem;
margin-right: 0.35rem;
flex-shrink: 0;
}
.copilot-thinking {
opacity: 0.65;
}
.copilot-token-count {
margin-top: 0.3rem;
font-size: 0.7rem;
color: var(--placeholder-color);
opacity: 0.6;
font-style: normal;
font-family: var(--font-mono);
letter-spacing: 0.02em;
}
/* ── Tool call blocks ──────────────────────────────────────────────────────── */
.copilot-tool {
font-size: 0.78rem;
}
/* Pending approval needs to stand out */
.copilot-tool--pending {
border: 1px solid var(--toolbar-border);
border-radius: 0.4rem;
border-left: 3px solid #f59e0b;
}
.copilot-tool-header {
display: flex;
align-items: center;
gap: 0.35rem;
width: 100%;
padding: 0.15rem 0.25rem;
background: transparent;
border: none;
cursor: pointer;
text-align: left;
font-size: 0.78rem;
color: var(--placeholder-color);
transition: color 0.12s;
}
.copilot-tool--pending .copilot-tool-header {
padding: 0.4rem 0.6rem;
}
.copilot-tool-header:hover {
color: inherit;
}
.copilot-tool-status {
display: flex;
align-items: center;
flex-shrink: 0;
font-size: 0.7rem;
}
.copilot-tool-name {
font-weight: 400;
font-family: var(--bs-font-monospace);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
min-width: 0;
}
.copilot-tool-name code {
font-family: inherit;
font-size: inherit;
background: rgba(0,0,0,0.06);
border-radius: 0.2rem;
padding: 0 0.25em;
}
@media (prefers-color-scheme: dark) {
.copilot-tool-name code {
background: rgba(255,255,255,0.08);
}
}
/* A file path that opens the file viewer. Reads as a code chip but acts as a link. */
.copilot-tool-name .copilot-tool-path,
.copilot-tool-path {
font-family: var(--bs-font-monospace);
font-size: inherit;
color: #6366f1;
cursor: pointer;
border-radius: 0.2rem;
padding: 0 0.25em;
background: rgba(99,102,241,0.10);
text-decoration: none;
}
.copilot-tool-path:hover {
text-decoration: underline;
background: rgba(99,102,241,0.18);
}
.copilot-tool-body {
border-top: 1px solid var(--toolbar-border);
display: flex;
flex-direction: column;
gap: 0;
}
.copilot-tool-section {
display: flex;
flex-direction: column;
padding: 0.4rem 0.6rem;
}
.copilot-tool-section + .copilot-tool-section {
border-top: 1px solid var(--toolbar-border);
}
.copilot-tool-label {
font-size: 0.68rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
margin-bottom: 0.25rem;
color: var(--placeholder-color);
}
.copilot-tool-label--done { color: #16a34a; }
.copilot-tool-label--error { color: #dc2626; }
.copilot-tool-pre {
font-size: 0.72rem;
font-family: var(--bs-font-monospace);
white-space: pre-wrap;
word-break: break-all;
margin: 0;
padding: 0.35rem 0.5rem;
background: rgba(0, 0, 0, 0.04);
border-radius: 0.25rem;
max-height: 200px;
overflow-y: auto;
}
@media (prefers-color-scheme: dark) {
.copilot-tool-pre {
background: rgba(255, 255, 255, 0.04);
}
}
.copilot-tool-pre--error { color: #dc2626; }
/* Structured (`result_type === 'json'`) results: keep JSON readable (don't break
mid-token) and flag the typed payload with a left accent. */
.copilot-tool-pre--json {
word-break: normal;
overflow-x: auto;
border-left: 2px solid var(--bs-info, #0dcaf0);
}
/* ── Markdown rendering ────────────────────────────────────────────────────── */
.copilot-markdown { max-width: 100%; }
.copilot-markdown > *:first-child { margin-top: 0; }
.copilot-markdown > *:last-child { margin-bottom: 0; }
.copilot-markdown h1,
.copilot-markdown h2,
.copilot-markdown h3,
.copilot-markdown h4 {
font-size: 0.9rem;
font-weight: 700;
margin: 0.75rem 0 0.3rem;
line-height: 1.3;
}
.copilot-markdown p { margin: 0.4rem 0; }
.copilot-markdown ul,
.copilot-markdown ol {
margin: 0.4rem 0;
padding-left: 1.4rem;
}
.copilot-markdown li { margin: 0.15rem 0; }
.copilot-markdown code {
font-family: var(--bs-font-monospace);
font-size: 0.78rem;
background: rgba(0, 0, 0, 0.08);
padding: 0.1em 0.35em;
border-radius: 0.25rem;
}
@media (prefers-color-scheme: dark) {
.copilot-markdown code { background: rgba(255, 255, 255, 0.1); }
}
.copilot-markdown pre {
background: rgba(0, 0, 0, 0.06);
border-radius: 0.4rem;
padding: 0.65rem 0.85rem;
overflow-x: auto;
margin: 0.5rem 0;
font-size: 0.78rem;
}
@media (prefers-color-scheme: dark) {
.copilot-markdown pre { background: rgba(255, 255, 255, 0.06); }
}
.copilot-markdown pre code { background: none; padding: 0; font-size: inherit; }
.copilot-markdown blockquote {
border-left: 3px solid #6366f1;
margin: 0.5rem 0;
padding: 0.3rem 0.75rem;
color: var(--placeholder-color);
font-style: italic;
}
.copilot-markdown hr {
border: none;
border-top: 1px solid var(--toolbar-border);
margin: 0.6rem 0;
}
.copilot-markdown a { color: #6366f1; text-decoration: underline; }
.copilot-markdown strong { font-weight: 700; }
.copilot-markdown em { font-style: italic; }
/* Keep wide content inside the bubble so it never stretches the message list
(which would let the whole page pan sideways). Images shrink to the bubble
width; tables become their own horizontal scroll box. Code blocks (`pre`)
already scroll within themselves (overflow-x: auto above). */
.copilot-markdown img {
max-width: 100%;
height: auto;
border-radius: 0.4rem;
}
.copilot-markdown table {
display: block;
max-width: 100%;
overflow-x: auto;
border-collapse: collapse;
}
/* ── Approval panel ────────────────────────────────────────────────────────── */
.copilot-approval {
border: 1px solid var(--toolbar-border);
border-radius: 0.5rem;
font-size: 0.82rem;
}
.copilot-approval--approved { border-color: #16a34a; }
.copilot-approval--rejected { border-color: #dc2626; }
.copilot-approval-header {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.45rem 0.75rem;
background: var(--msg-assistant-bg);
font-size: 0.8rem;
flex-wrap: wrap;
}
.copilot-approval-path {
font-family: var(--bs-font-monospace);
font-size: 0.75rem;
color: #6366f1;
}
.copilot-approval-actions {
display: flex;
flex-direction: column;
gap: 0.4rem;
padding: 0.5rem 0.75rem;
border-top: 1px solid var(--toolbar-border);
}
.copilot-approval-btns {
display: flex;
gap: 0.4rem;
}
.copilot-reject-note {
font-size: 0.8rem;
resize: none;
}
.copilot-clarification-title {
font-weight: 600;
font-size: 0.82rem;
color: var(--text-primary, #1e293b);
}
.copilot-clarification-question {
font-size: 0.82rem;
color: var(--text-secondary, #475569);
}
.copilot-clarification-chips {
display: flex;
flex-wrap: wrap;
gap: 0.3rem;
}
.copilot-chip {
font-size: 0.75rem;
padding: 0.15rem 0.5rem;
border-radius: 999px;
}
.copilot-clarification-input-row {
display: flex;
align-items: flex-start;
gap: 0.4rem;
}
/* ── Diff view ─────────────────────────────────────────────────────────────── */
.copilot-diff {
font-family: var(--bs-font-monospace);
font-size: 0.72rem;
line-height: 1.5;
white-space: pre;
overflow-x: auto;
max-height: 320px;
overflow-y: auto;
margin: 0;
padding: 0.5rem 0;
background: transparent;
border-top: 1px solid var(--toolbar-border);
}
.diff-added {
display: block;
background: rgba(22, 163, 74, 0.12);
color: #15803d;
padding: 0 0.75rem;
}
.diff-removed {
display: block;
background: rgba(220, 38, 38, 0.1);
color: #b91c1c;
padding: 0 0.75rem;
text-decoration: line-through;
opacity: 0.85;
}
.diff-unchanged {
display: block;
padding: 0 0.75rem;
color: var(--placeholder-color);
}
.diff-ellipsis {
display: block;
padding: 0.1rem 0.75rem;
color: var(--placeholder-color);
font-style: italic;
background: rgba(0, 0, 0, 0.03);
text-align: center;
}
@media (prefers-color-scheme: dark) {
.diff-added { color: #4ade80; }
.diff-removed { color: #f87171; }
.diff-ellipsis { background: rgba(255, 255, 255, 0.03); }
}
/* ── Agent trace ───────────────────────────────────────────────────────────── */
.copilot-agent,
.copilot-agent-end {
border: 1px solid rgba(99, 102, 241, 0.2);
border-radius: 0.5rem;
font-size: 0.78rem;
overflow: clip;
margin-left: calc(var(--agent-depth, 0) * 1rem);
}
.copilot-agent-header {
display: flex;
align-items: center;
gap: 0.45rem;
padding: 0.35rem 0.65rem;
background: rgba(99, 102, 241, 0.12);
color: var(--msg-assistant-text);
}
.copilot-agent-header i {
font-size: 0.85rem;
flex-shrink: 0;
color: #6366f1;
}
.copilot-agent-header strong {
color: #6366f1;
font-weight: 600;
}
.copilot-agent-badge {
margin-left: auto;
font-size: 0.67rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
padding: 0.1rem 0.4rem;
border-radius: 0.25rem;
}
.copilot-agent-badge.running {
background: rgba(234, 179, 8, 0.15);
color: #b45309;
}
.copilot-agent-badge.done {
background: rgba(22, 163, 74, 0.12);
color: #15803d;
}
.copilot-agent-preview {
font-size: 0.75rem;
font-family: var(--bs-font-monospace);
white-space: pre-wrap;
word-break: break-word;
margin: 0;
padding: 0.45rem 0.65rem;
color: var(--placeholder-color);
border-top: 1px solid rgba(99, 102, 241, 0.15);
max-height: 120px;
overflow-y: auto;
background: rgba(99, 102, 241, 0.05);
}
.copilot-agent-preview--result {
color: var(--msg-assistant-text);
opacity: 0.8;
}
@media (prefers-color-scheme: dark) {
.copilot-agent-badge.running { background: rgba(234, 179, 8, 0.2); color: #fbbf24; }
.copilot-agent-badge.done { background: rgba(22, 163, 74, 0.18); color: #4ade80; }
.copilot-agent-header { background: rgba(99, 102, 241, 0.1); }
}
/* ── Attachment chips (composer pending + sent user bubble) ──────────────────── */
.attach-chips {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
padding: 0.4rem 0.5rem;
}
/* Inside a user bubble the chips sit below the text with a little top spacing. */
.copilot-msg.user .attach-chips {
padding: 0.4rem 0 0;
}
.attach-chip {
display: inline-flex;
align-items: center;
gap: 0.35rem;
max-width: 100%;
padding: 0.2rem 0.45rem;
border: 1px solid var(--toolbar-border);
border-radius: 0.5rem;
background: var(--msg-assistant-bg);
font-size: 0.75rem;
line-height: 1.2;
}
.attach-chip--clickable { cursor: pointer; }
.attach-chip--clickable:hover { border-color: #6366f1; }
.attach-chip--uploading { opacity: 0.7; }
.attach-chip .bi { font-size: 0.85rem; flex-shrink: 0; }
.attach-chip-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 12rem;
}
.attach-chip-size {
color: var(--placeholder-color);
flex-shrink: 0;
}
.attach-chip-remove {
display: inline-flex;
align-items: center;
justify-content: center;
width: 1.1rem;
height: 1.1rem;
padding: 0;
border: none;
border-radius: 0.3rem;
background: transparent;
color: var(--placeholder-color);
cursor: pointer;
flex-shrink: 0;
}
.attach-chip-remove:hover { background: var(--sidebar-hover); color: #dc2626; }
+130
View File
@@ -0,0 +1,130 @@
/* ── Copilot panel ─────────────────────────────────────────────────────────── */
app-copilot {
display: flex;
flex-direction: column;
position: relative;
width: var(--copilot-width);
height: 100%;
border-left: 1px solid var(--toolbar-border);
background: var(--copilot-bg);
flex-shrink: 0;
}
app-copilot.collapsed {
width: 0;
min-width: 0;
border: none;
overflow: hidden;
}
.copilot-resize-handle {
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 5px;
cursor: col-resize;
z-index: 20;
transition: background 0.15s;
}
.copilot-resize-handle:hover,
.copilot-resize-handle:active {
background: rgba(99, 102, 241, 0.35);
}
.copilot-expand-btn {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
flex: 1;
background: transparent;
border: none;
cursor: pointer;
color: #6366f1;
font-size: 1.1rem;
writing-mode: vertical-rl;
padding: 1rem 0;
}
.copilot-expand-btn:hover {
background: var(--sidebar-hover);
}
.copilot-collapse-btn {
flex-shrink: 0;
padding: 0.2rem 0.4rem;
line-height: 1;
}
.copilot-header {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.7rem 1rem;
border-bottom: 1px solid var(--toolbar-border);
font-weight: 600;
font-size: 0.875rem;
flex-shrink: 0;
}
.copilot-header i {
font-size: 1rem;
color: #6366f1;
}
/* ── Tabs (General + project chats) ─────────────────────────────────────────── */
.copilot-tabs {
display: flex;
align-items: stretch;
gap: 2px;
padding: 0 0.5rem;
border-bottom: 1px solid var(--toolbar-border);
overflow-x: auto;
flex-shrink: 0;
}
.copilot-tab {
display: flex;
align-items: center;
gap: 0.35rem;
max-width: 160px;
padding: 0.4rem 0.6rem;
font-size: 0.78rem;
cursor: pointer;
border-bottom: 2px solid transparent;
color: var(--bs-secondary-color, #6c757d);
white-space: nowrap;
}
.copilot-tab:hover {
background: var(--toolbar-border);
}
.copilot-tab--active {
color: var(--bs-body-color, inherit);
border-bottom-color: #6366f1;
font-weight: 600;
}
.copilot-tab-label {
overflow: hidden;
text-overflow: ellipsis;
}
.copilot-tab-close {
border: none;
background: none;
padding: 0;
line-height: 1;
cursor: pointer;
color: inherit;
opacity: 0.6;
flex-shrink: 0;
}
.copilot-tab-close:hover {
opacity: 1;
}
+83
View File
@@ -0,0 +1,83 @@
/* ── Agent selection dialog ─────────────────────────────────────────────────── */
.agent-dialog-backdrop {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.45);
z-index: 1050;
display: flex;
align-items: center;
justify-content: center;
}
.agent-dialog {
background: var(--bs-body-bg);
border: 1px solid var(--bs-border-color);
border-radius: 3px;
padding: 1.25rem;
min-width: 320px;
max-width: 420px;
width: 100%;
box-shadow: 0 8px 32px rgba(0,0,0,0.25);
}
.agent-dialog--ticket {
min-width: 480px;
max-width: 620px;
}
.agent-dialog-title {
font-weight: 600;
font-size: 1rem;
margin-bottom: 1rem;
}
.agent-dialog-list {
display: flex;
flex-direction: column;
gap: 0.5rem;
margin-bottom: 1.25rem;
}
.agent-dialog-option {
display: flex;
align-items: flex-start;
gap: 0.6rem;
padding: 0.6rem 0.75rem;
border-radius: 6px;
border: 1px solid var(--bs-border-color);
cursor: pointer;
transition: border-color 0.15s, background 0.15s;
}
.agent-dialog-option input[type="radio"] {
margin-top: 0.2rem;
flex-shrink: 0;
}
.agent-dialog-option.selected {
border-color: var(--bs-primary);
background: var(--bs-primary-bg-subtle, rgba(13,110,253,0.08));
}
.agent-dialog-info {
display: flex;
flex-direction: column;
gap: 0.15rem;
}
.agent-dialog-name {
font-weight: 600;
font-size: 0.9rem;
}
.agent-dialog-desc {
font-size: 0.78rem;
opacity: 0.7;
}
.agent-dialog-actions {
display: flex;
justify-content: flex-end;
gap: 0.5rem;
}
+221
View File
@@ -0,0 +1,221 @@
/* ── File viewer page ───────────────────────────────────────────────────────── */
.fv-page {
flex-direction: column;
min-height: 0;
}
.fv-title {
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
font-size: 0.95rem;
font-weight: 500;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
opacity: 0.9;
margin: 0;
/* RTL flips the ellipsis to the *start*, so a long path keeps its tail (the
filename) visible — `<bdi>` around the path preserves left-to-right order. */
direction: rtl;
text-align: left;
flex: 1 1 auto;
min-width: 0;
}
.fv-download-btn {
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
padding: 0 !important;
border-radius: 6px !important;
flex-shrink: 0;
}
.fv-body {
flex: 1 1 auto;
overflow: auto;
position: relative;
min-height: 0;
}
.fv-state {
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
padding: 2rem;
font-size: 0.9rem;
}
/* ── Markdown preview ────────────────────────────────────────────────────────── */
.fv-md {
max-width: 100%;
padding: 1.5rem 2rem;
line-height: 1.6;
font-size: 0.8rem;
}
.fv-md > *:first-child { margin-top: 0; }
.fv-md > *:last-child { margin-bottom: 0; }
.fv-md h1,
.fv-md h2,
.fv-md h3,
.fv-md h4 { margin: 1.2rem 0 0.5rem; line-height: 1.3; }
.fv-md h1 { font-size: 1.5em; }
.fv-md h2 { font-size: 1.3em; }
.fv-md h3 { font-size: 1.15em; }
.fv-md h4 { font-size: 1em; }
.fv-md p { margin: 0.5rem 0; }
.fv-md ul,
.fv-md ol { margin: 0.5rem 0; padding-left: 1.5rem; }
.fv-md li { margin: 0.2rem 0; }
.fv-md code {
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
font-size: 0.85em;
background: var(--bs-secondary-bg);
padding: 0.1rem 0.35rem;
border-radius: 3px;
}
.fv-md pre {
background: var(--bs-secondary-bg);
padding: 0.85rem 1rem;
border-radius: 6px;
overflow: auto;
margin: 0.75rem 0;
}
.fv-md pre code { background: none; padding: 0; font-size: inherit; }
.fv-md blockquote {
border-left: 3px solid var(--bs-border-color);
margin: 0.75rem 0;
padding: 0.25rem 0 0.25rem 1rem;
color: var(--bs-secondary-color);
}
.fv-md hr { border: none; border-top: 1px solid var(--bs-border-color); margin: 1.25rem 0; }
.fv-md a { color: #6366f1; text-decoration: underline; }
.fv-md strong { font-weight: 700; }
.fv-md em { font-style: italic; }
.fv-md img { max-width: 100%; border-radius: 4px; }
.fv-md table {
border-collapse: collapse;
margin: 0.75rem 0;
}
.fv-md th,
.fv-md td {
border: 1px solid var(--bs-border-color);
padding: 0.4rem 0.6rem;
}
/* ── Code/text preview ───────────────────────────────────────────────────────── */
.fv-code {
margin: 0;
padding: 1.25rem 1.5rem;
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
font-size: 0.85rem;
line-height: 1.55;
white-space: pre;
overflow: auto;
background: var(--bs-secondary-bg);
color: var(--bs-body-color);
min-height: 100%;
tab-size: 4;
}
/* Header action buttons (mode toggle + download) sit in one row. */
.fv-header-actions {
display: flex;
align-items: center;
gap: 0.4rem;
flex-shrink: 0;
}
/* ── PDF preview ─────────────────────────────────────────────────────────────── */
.fv-pdf {
width: 100%;
height: 100%;
border: none;
display: block;
}
/* ── HTML live preview ───────────────────────────────────────────────────────── */
/* Rendered in an origin-isolated iframe (srcdoc + sandbox="allow-scripts").
White canvas so pages that don't set their own background stay legible. */
.fv-html {
width: 100%;
height: 100%;
border: none;
display: block;
background: #fff;
}
/* ── LaTeX compile-error banner (shown above the source fallback) ─────────────── */
.fv-compile-error {
margin: 0;
padding: 0.5rem 1.5rem;
background: var(--bs-warning-bg-subtle, #fff3cd);
border-bottom: 1px solid var(--bs-border-color);
font-size: 0.85rem;
}
.fv-compile-error > summary {
cursor: pointer;
user-select: none;
padding: 0.25rem 0;
}
.fv-compile-error > pre {
margin: 0.5rem 0 0.75rem;
padding: 0.75rem 1rem;
max-height: 40vh;
overflow: auto;
background: var(--bs-secondary-bg);
border-radius: 6px;
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
font-size: 0.8rem;
white-space: pre-wrap;
word-break: break-word;
}
/* ── Image preview ───────────────────────────────────────────────────────────── */
.fv-image-wrap {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
padding: 1rem;
background: var(--bs-secondary-bg);
}
.fv-image {
max-width: 100%;
max-height: 100%;
object-fit: contain;
border-radius: 4px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);
}
/* SVG renders in a sandboxed iframe; the SVG root fills the iframe viewport and
scales to its viewBox. White canvas so light-on-transparent SVGs stay legible. */
.fv-svg {
width: 100%;
height: 100%;
border: none;
background: #fff;
border-radius: 4px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);
}
+420
View File
@@ -0,0 +1,420 @@
/* ── Home page ─────────────────────────────────────────────────────────────── */
home-page {
display: none;
flex-direction: column;
flex: 1;
overflow-y: auto;
}
.home-page {
padding: 1rem 2.5rem 2rem;
width: 100%;
box-sizing: border-box;
}
/* ── Debug toggle ──────────────────────────────────────────────────────────── */
.home-debug-bar {
display: flex;
justify-content: flex-end;
margin-bottom: 0.75rem;
}
.home-debug-toggle {
display: flex;
align-items: center;
gap: 6px;
font-size: 0.78rem;
font-weight: 500;
color: var(--bs-secondary-color);
cursor: pointer;
user-select: none;
padding: 4px 8px;
border-radius: 6px;
transition: background 0.15s;
}
.home-debug-toggle:hover {
background: var(--bs-tertiary-bg);
}
.home-debug-toggle i { font-size: 0.82rem; }
/* ── Hero ──────────────────────────────────────────────────────────────────── */
.home-hero {
display: flex;
align-items: center;
gap: 1.25rem;
margin-bottom: 1.25rem;
padding-bottom: 1.25rem;
border-bottom: 1px solid var(--bs-border-color);
}
.home-hero-image {
flex-shrink: 0;
width: 72px;
height: 72px;
border-radius: 50%;
overflow: hidden;
border: 3px solid var(--bs-border-color);
background: var(--bs-tertiary-bg);
display: flex;
align-items: center;
justify-content: center;
}
.home-hero-image img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.home-hero-text {
flex: 1;
min-width: 0;
}
.home-hero-title {
font-size: 1.4rem;
font-weight: 700;
margin: 0 0 0.2rem;
line-height: 1.2;
}
.home-hero-desc {
font-size: 0.85rem;
color: var(--bs-secondary-color);
margin: 0 0 0.5rem;
line-height: 1.4;
}
.home-hero-status {
display: inline-flex;
align-items: center;
gap: 7px;
font-size: 0.82rem;
font-weight: 500;
padding: 0.3em 0.8em;
border-radius: 20px;
}
.home-hero-status--online {
color: var(--bs-success, #16a34a);
background: color-mix(in srgb, var(--bs-success, #22c55e) 10%, transparent);
}
.home-hero-status--warn {
color: #b45309;
background: color-mix(in srgb, #f59e0b 12%, transparent);
}
.home-hero-status--error {
color: var(--bs-danger, #dc2626);
background: color-mix(in srgb, var(--bs-danger, #ef4444) 10%, transparent);
}
.home-hero-status--loading {
color: var(--bs-secondary-color);
background: var(--bs-tertiary-bg);
}
.home-hero-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: currentColor;
animation: home-pulse 2s ease-in-out infinite;
}
@keyframes home-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.35; }
}
/* ── Banner (no models / all offline) ─────────────────────────────────────── */
.home-banner {
display: flex;
align-items: center;
gap: 1rem;
padding: 1rem 1.25rem;
border-radius: 10px;
margin-bottom: 1.75rem;
font-size: 0.88rem;
line-height: 1.45;
}
.home-banner--error {
background: color-mix(in srgb, var(--bs-danger) 10%, transparent);
border: 1px solid color-mix(in srgb, var(--bs-danger) 30%, transparent);
color: var(--bs-body-color);
}
.home-banner-icon {
font-size: 1.5rem;
color: var(--bs-danger);
flex-shrink: 0;
}
.home-banner-body {
flex: 1;
}
/* ── Section title ─────────────────────────────────────────────────────────── */
.home-section-title {
display: flex;
align-items: center;
gap: 8px;
font-size: 0.82rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--bs-secondary-color);
margin-bottom: 1rem;
}
.home-section-title i { font-size: 0.9rem; }
/* ── Inbox embedded in home: no own scroll, no padding ─────────────────────── */
.home-page .inbox-grid {
overflow: visible;
flex: none;
padding: 0;
margin-bottom: 2rem;
}
.home-page .inbox-empty {
height: auto;
padding: 0.5rem 1rem;
flex-direction: row;
gap: 8px;
justify-content: flex-start;
margin-bottom: 1.5rem;
}
.home-page .inbox-empty i {
font-size: 0.9rem;
margin-bottom: 0;
opacity: 0.5;
}
.home-page .inbox-empty p {
font-size: 0.82rem;
}
/* ── Honcho tip ────────────────────────────────────────────────────────────── */
.home-tip {
display: flex;
align-items: flex-start;
gap: 12px;
padding: 12px 14px;
border-radius: 10px;
border: 1px solid color-mix(in srgb, #f59e0b 40%, transparent);
background: color-mix(in srgb, #f59e0b 8%, transparent);
margin-bottom: 1.5rem;
font-size: 0.85rem;
}
.home-tip-icon {
font-size: 1.1rem;
color: #b45309;
flex-shrink: 0;
margin-top: 2px;
}
.home-tip-body {
display: flex;
flex-direction: column;
gap: 3px;
line-height: 1.4;
}
.home-tip-body strong {
font-weight: 600;
font-size: 0.88rem;
color: var(--bs-body-color);
}
.home-tip-body span {
color: var(--bs-secondary-color);
font-size: 0.8rem;
}
/* ── Guide cards ───────────────────────────────────────────────────────────── */
.home-guide {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.home-card {
border: 1px solid var(--bs-border-color);
border-radius: 10px;
padding: 0.85rem 1rem;
display: flex;
gap: 0.85rem;
align-items: flex-start;
background: var(--bs-body-bg);
transition: box-shadow 0.15s ease, border-color 0.15s ease;
}
.home-card:hover {
box-shadow: 0 2px 10px rgba(0,0,0,0.07);
border-color: var(--home-card-color, var(--bs-border-color));
}
.home-card-icon {
width: 34px;
height: 34px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
background: color-mix(in srgb, var(--home-card-color, #0d6efd) 12%, transparent);
color: var(--home-card-color, #0d6efd);
font-size: 1rem;
}
.home-card-body { flex: 1; min-width: 0; }
.home-card-title {
font-size: 0.88rem;
font-weight: 600;
margin: 0 0 0.2rem;
}
.home-card-desc {
font-size: 0.78rem;
color: var(--bs-secondary-color);
margin: 0;
line-height: 1.4;
}
/* ── LLM Stats ─────────────────────────────────────────────────────────────── */
.home-section-period {
font-weight: 400;
font-size: 0.75rem;
color: var(--bs-secondary-color);
text-transform: none;
letter-spacing: 0;
margin-left: 2px;
}
.home-stats-range {
display: flex;
gap: 2px;
}
.home-stats-range-btn {
padding: 2px 8px;
font-size: 0.72rem;
font-weight: 500;
border: 1px solid var(--bs-border-color);
border-radius: 5px;
background: transparent;
color: var(--bs-secondary-color);
cursor: pointer;
transition: background 0.12s, color 0.12s, border-color 0.12s;
text-transform: none;
letter-spacing: 0;
}
.home-stats-range-btn:hover {
background: var(--bs-tertiary-bg);
color: var(--bs-body-color);
}
.home-stats-range-btn.active {
background: var(--bs-primary);
border-color: var(--bs-primary);
color: #fff;
}
.home-stats-loading,
.home-stats-empty {
display: flex;
align-items: center;
gap: 8px;
font-size: 0.85rem;
color: var(--bs-secondary-color);
padding: 1.5rem 0.5rem;
margin-bottom: 2rem;
}
.home-stats-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
margin-bottom: 2rem;
}
.home-stat-card {
border: 1px solid var(--bs-border-color);
border-radius: 10px;
padding: 0.9rem 1rem 0.75rem;
background: var(--bs-body-bg);
}
.home-stat-card-title {
font-size: 0.78rem;
font-weight: 600;
color: var(--bs-secondary-color);
margin-bottom: 0.6rem;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.home-stat-canvas-wrap {
position: relative;
height: 160px;
}
.home-stat-canvas-wrap canvas {
display: block;
}
/* ── Responsive ────────────────────────────────────────────────────────────── */
@media (max-width: 600px) {
.home-page {
padding: 1.25rem 1rem;
}
.home-body {
gap: 1.25rem;
}
.home-hero {
flex-direction: column;
text-align: center;
gap: 1rem;
margin-bottom: 1.5rem;
padding-bottom: 1.5rem;
}
.home-hero-image {
width: 90px;
height: 90px;
}
.home-hero-title { font-size: 1.4rem; }
.home-hero-desc { font-size: 0.85rem; }
.home-hero-status { font-size: 0.78rem; }
.home-guide {
grid-template-columns: 1fr;
}
.home-stats-grid {
grid-template-columns: 1fr;
}
}
+329
View File
@@ -0,0 +1,329 @@
/* ── Inbox card styles — shared between desktop and mobile ─────────────────── */
/* ── Card base ── */
.inbox-card {
border: 1px solid var(--bs-border-color);
border-radius: 10px;
background: var(--bs-body-bg);
overflow: hidden;
display: flex;
flex-direction: column;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
transition: box-shadow 0.15s ease, transform 0.15s ease;
}
.inbox-card:hover {
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
transform: translateY(-1px);
}
.approval-card { border-left: 4px solid var(--bs-warning); }
.clarification-card { border-left: 4px solid var(--bs-info); }
/* ── Card header ── */
.inbox-card-header {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 14px;
background: var(--bs-tertiary-bg);
border-bottom: 1px solid var(--bs-border-color);
}
.inbox-card-header .badge {
font-size: 0.68rem;
font-weight: 600;
padding: 3px 8px;
letter-spacing: 0.3px;
text-transform: uppercase;
}
.inbox-card-origin {
font-size: 0.82rem;
font-weight: 600;
color: var(--bs-body-color);
flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.inbox-card-time {
font-size: 0.72rem;
color: var(--bs-secondary-color);
white-space: nowrap;
flex-shrink: 0;
}
/* ── Card body ── */
.inbox-card-body {
padding: 14px;
flex: 1;
display: flex;
flex-direction: column;
}
/* ── Approval: tool name + args ── */
.inbox-tool-name {
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 10px;
font-size: 0.95rem;
}
.inbox-tool-name strong { font-size: 1rem; }
.inbox-agent-tag {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 0.75rem;
color: var(--bs-secondary-color);
background: var(--bs-tertiary-bg);
border-radius: 4px;
padding: 2px 8px;
margin-left: auto;
white-space: nowrap;
border: 1px solid var(--bs-border-color);
}
.inbox-args-structured {
display: flex;
flex-direction: column;
gap: 6px;
margin-bottom: 8px;
}
.inbox-arg-row {
display: flex;
gap: 8px;
font-size: 0.82rem;
align-items: baseline;
}
.inbox-arg-key {
color: var(--bs-secondary-color);
font-weight: 600;
min-width: 70px;
flex-shrink: 0;
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 0.3px;
}
.inbox-arg-value {
font-family: ui-monospace, 'SF Mono', 'Cascadia Code', monospace;
font-size: 0.82rem;
word-break: break-all;
color: var(--bs-body-color);
}
.inbox-args-toggle {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 0.75rem;
color: var(--bs-secondary-color);
cursor: pointer;
background: none;
border: none;
padding: 2px 0;
margin-top: 4px;
transition: color 0.12s ease;
}
.inbox-args-toggle:hover { color: var(--bs-body-color); }
.inbox-args-raw {
font-size: 0.72rem;
background: var(--bs-tertiary-bg);
border-radius: 6px;
padding: 10px;
max-height: 180px;
overflow: auto;
margin: 6px 0 0;
white-space: pre-wrap;
display: none;
border: 1px solid var(--bs-border-color);
}
.inbox-args-raw.open { display: block; }
/* ── Clarification ── */
.inbox-card-title {
font-weight: 700;
font-size: 1rem;
margin-bottom: 6px;
color: var(--bs-body-color);
}
.inbox-question {
font-size: 0.88rem;
color: var(--bs-secondary-color);
margin-bottom: 12px;
line-height: 1.45;
}
.inbox-chips {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-bottom: 12px;
}
.inbox-chip {
font-size: 0.78rem;
padding: 4px 14px;
border-radius: 20px;
border: 1px solid var(--bs-border-color);
background: var(--bs-tertiary-bg);
color: var(--bs-body-color);
cursor: pointer;
transition: all 0.12s ease;
-webkit-tap-highlight-color: transparent;
}
.inbox-chip:hover {
background: var(--bs-info);
border-color: var(--bs-info);
color: #fff;
}
.inbox-answer-area {
margin-top: auto;
display: flex;
flex-direction: column;
gap: 8px;
}
.inbox-answer-input {
width: 100%;
border: 1px solid var(--bs-border-color);
border-radius: 8px;
padding: 10px 12px;
font-size: 0.85rem;
background: var(--bs-body-bg);
color: var(--bs-body-color);
resize: none;
min-height: 40px;
box-sizing: border-box;
font-family: inherit;
}
.inbox-answer-input:focus {
outline: none;
border-color: var(--bs-info);
box-shadow: 0 0 0 2px rgba(13, 202, 240, 0.15);
}
.inbox-answer-send {
align-self: flex-end;
display: inline-flex;
align-items: center;
gap: 6px;
padding: 8px 20px;
font-size: 0.82rem;
font-weight: 600;
border-radius: 8px;
border: none;
background: var(--bs-info);
color: #000;
cursor: pointer;
transition: filter 0.12s ease, transform 0.1s ease;
-webkit-tap-highlight-color: transparent;
}
.inbox-answer-send:hover { filter: brightness(1.1); }
.inbox-answer-send:active { transform: scale(0.96); }
/* ── Card footer ── */
.inbox-card-footer {
display: flex;
gap: 8px;
padding: 10px 14px;
border-top: 1px solid var(--bs-border-color);
background: var(--bs-tertiary-bg);
}
.approval-footer {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
}
/* ── Bypass timed dropdown ── */
.inbox-bypass-wrap {
position: relative;
}
.inbox-bypass-wrap .btn {
width: 100%;
}
.inbox-bypass-menu {
display: none;
position: absolute;
bottom: calc(100% + 4px);
left: 0;
right: 0;
background: var(--bs-body-bg);
border: 1px solid var(--bs-border-color);
border-radius: 8px;
overflow: hidden;
z-index: 200;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
}
.inbox-bypass-menu.open { display: block; }
.inbox-bypass-menu button {
display: block;
width: 100%;
padding: 9px 14px;
text-align: left;
background: none;
border: none;
font-size: 0.82rem;
font-weight: 600;
color: var(--bs-body-color);
cursor: pointer;
transition: background 0.1s;
}
.inbox-bypass-menu button + button {
border-top: 1px solid var(--bs-border-color);
}
.inbox-bypass-menu button:hover {
background: var(--bs-tertiary-bg);
}
/* ── Empty state ── */
.inbox-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 40px;
color: var(--bs-secondary-color);
}
.inbox-empty i {
font-size: 2.5rem;
margin-bottom: 12px;
opacity: 0.5;
}
.inbox-empty p {
margin: 0;
font-size: 0.9rem;
}
+351
View File
@@ -0,0 +1,351 @@
/* ── LLM Providers page ─────────────────────────────────────────────────────── */
.pv-page {
display: flex;
flex-direction: column;
height: 100%;
width: 100%;
max-width: 100%;
}
.pv-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 20px;
min-height: 54px;
border-bottom: 1px solid var(--bs-border-color);
background: var(--bs-tertiary-bg);
flex-shrink: 0;
gap: 12px;
}
.pv-title {
margin: 0;
font-weight: 700;
font-size: 1.05rem;
display: flex;
align-items: center;
gap: 8px;
}
.pv-header-right {
display: flex;
align-items: center;
gap: 10px;
}
.pv-header-count {
font-size: 0.76rem;
font-weight: 500;
color: var(--bs-secondary-color);
}
/* ── Card list ── */
.pv-card-list {
padding: 16px 20px;
overflow-y: auto;
flex: 1;
display: flex;
flex-direction: column;
gap: 10px;
}
/* ── Single card ── */
.pv-card {
background: var(--bs-body-bg);
border: 1px solid var(--bs-border-color);
border-radius: 10px;
padding: 14px 16px;
display: flex;
flex-direction: column;
gap: 8px;
transition: border-color 0.15s, box-shadow 0.15s;
}
.pv-card:hover {
border-color: color-mix(in srgb, var(--pv-color, #0d6efd) 50%, var(--bs-border-color));
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);
}
/* ── Row 1: icon + name + badge + count + actions ── */
.pv-card-row1 {
display: flex;
align-items: center;
gap: 10px;
}
.pv-card-icon {
width: 34px;
height: 34px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
font-size: 1rem;
}
.pv-card-name {
font-weight: 600;
font-size: 0.9rem;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.pv-card-type-badge {
font-size: 0.62rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
padding: 0.2em 0.6em;
border-radius: 4px;
flex-shrink: 0;
white-space: nowrap;
color: var(--pv-color, #0d6efd);
background: color-mix(in srgb, var(--pv-color, #0d6efd) 12%, transparent);
}
.pv-card-count {
font-size: 0.74rem;
font-weight: 500;
color: var(--bs-secondary-color);
flex-shrink: 0;
white-space: nowrap;
display: flex;
align-items: center;
gap: 3px;
}
.pv-card-actions {
display: flex;
gap: 2px;
flex-shrink: 0;
margin-left: auto;
}
.pv-btn-icon {
display: flex;
align-items: center;
justify-content: center;
width: 30px;
height: 30px;
border: none;
background: transparent;
color: var(--bs-secondary-color, #9ca3af);
border-radius: 6px;
cursor: pointer;
font-size: 0.85rem;
transition: all 0.1s;
}
.pv-btn-icon:hover {
background: var(--bs-tertiary-bg, #f0f2f5);
color: var(--bs-body-color, #374151);
}
.pv-btn-edit:hover {
color: var(--bs-primary, #0d6efd);
background: var(--bs-primary-bg-subtle, #eef2ff);
}
.pv-btn-delete:hover {
color: var(--bs-danger, #dc3545);
background: var(--bs-danger-bg-subtle, #fef0f0);
}
/* ── Row 2: description ── */
.pv-card-row2 {
padding-left: 44px;
}
.pv-card-desc {
font-size: 0.82rem;
color: var(--bs-secondary-color);
line-height: 1.4;
}
/* ── Row 3: tags (API key, base URL, date) ── */
.pv-card-row3 {
display: flex;
align-items: center;
gap: 8px;
padding-left: 44px;
flex-wrap: wrap;
}
.pv-card-tag {
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 0.74rem;
font-weight: 500;
padding: 0.2em 0.6em;
border-radius: 5px;
white-space: nowrap;
}
.pv-card-tag i {
font-size: 0.7rem;
}
.pv-tag-ok {
background: color-mix(in srgb, var(--bs-success, #22c55e) 12%, transparent);
color: var(--bs-success, #16a34a);
}
.pv-tag-missing {
background: color-mix(in srgb, var(--bs-warning, #eab308) 12%, transparent);
color: var(--bs-warning, #ca8a04);
}
.pv-tag-url {
background: var(--bs-tertiary-bg, #f0f2f5);
color: var(--bs-secondary-color, #6b7280);
max-width: 260px;
overflow: hidden;
}
.pv-card-url-text {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.pv-tag-date {
background: var(--bs-tertiary-bg, #f0f2f5);
color: var(--bs-secondary-color, #6b7280);
}
/* ── Empty state ── */
.pv-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 48px 20px;
color: var(--bs-secondary-color, #9ca3af);
gap: 8px;
flex: 1;
}
.pv-empty i {
font-size: 2rem;
opacity: 0.4;
}
.pv-empty p {
margin: 0;
font-size: 0.9rem;
}
/* ── Modal ── */
.pv-modal {
width: 100%;
max-width: 480px;
max-height: calc(100vh - 100px);
overflow-y: auto;
padding: 1.5rem;
}
.pv-modal-header {
display: flex;
align-items: center;
gap: 8px;
font-weight: 600;
font-size: 1rem;
margin-bottom: 1.25rem;
}
.pv-modal-close {
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border: none;
background: transparent;
color: var(--bs-secondary-color);
border-radius: 6px;
margin-left: auto;
cursor: pointer;
font-size: 1.1rem;
}
.pv-modal-close:hover {
background: var(--bs-tertiary-bg);
color: var(--bs-body-color);
}
.pv-modal-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
padding-top: 0.5rem;
border-top: 1px solid var(--bs-border-color);
}
/* ── Mobile ── */
@media (max-width: 600px) {
.pv-header {
padding: 10px 14px;
min-height: 50px;
}
.pv-card-list {
padding: 10px 12px;
gap: 8px;
}
.pv-card {
padding: 12px;
gap: 6px;
}
.pv-card-row1 {
gap: 7px;
}
.pv-card-icon {
width: 30px;
height: 30px;
font-size: 0.9rem;
}
.pv-card-actions {
gap: 0;
}
.pv-btn-icon {
width: 28px;
height: 28px;
font-size: 0.8rem;
}
.pv-card-row2 {
padding-left: 37px;
}
.pv-card-row3 {
padding-left: 37px;
gap: 6px;
}
.pv-card-tag {
font-size: 0.7rem;
}
.pv-tag-url {
max-width: 180px;
}
}
+621
View File
@@ -0,0 +1,621 @@
/* ── LLM Requests page ──────────────────────────────────────────────────────── */
llm-requests-page {
display: none;
flex-direction: column;
flex: 1;
min-width: 0;
overflow-y: auto;
border-right: 1px solid var(--toolbar-border, #e5e9f0);
}
.llmr-page {
padding: 1.5rem 2rem;
width: 100%;
box-sizing: border-box;
display: flex;
flex-direction: column;
gap: 1.25rem;
}
/* ── Header ─────────────────────────────────────────────────────────────────── */
.llmr-header {
display: flex;
align-items: center;
gap: 0.75rem;
border-bottom: 1px solid var(--bs-border-color);
padding-bottom: 1rem;
}
.llmr-title {
font-size: 1.25rem;
font-weight: 600;
margin: 0;
display: flex;
align-items: center;
gap: 0.5rem;
}
.llmr-title i { color: var(--bs-secondary-color); }
.llmr-total-badge {
margin-left: auto;
font-size: 0.78rem;
color: var(--bs-secondary-color);
background: var(--bs-tertiary-bg);
padding: 2px 10px;
border-radius: 20px;
}
/* ── Filters ─────────────────────────────────────────────────────────────────── */
.llmr-filters {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
align-items: flex-end;
padding: 0.875rem 1rem;
background: var(--bs-tertiary-bg);
border: 1px solid var(--bs-border-color);
border-radius: 8px;
}
.llmr-filter-group {
display: flex;
flex-direction: column;
gap: 4px;
}
.llmr-filter-label {
font-size: 0.72rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--bs-secondary-color);
}
.llmr-filter-group input {
width: 160px;
}
.llmr-filter-group input[type="date"] {
width: 140px;
}
.llmr-filter-actions {
display: flex;
gap: 0.5rem;
padding-bottom: 1px;
}
/* ── State (loading / empty / error) ────────────────────────────────────────── */
.llmr-state {
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
padding: 3rem 1rem;
color: var(--bs-secondary-color);
font-size: 0.88rem;
}
.llmr-state i { font-size: 1.1rem; }
.llmr-state--error { color: var(--bs-danger); }
/* ── Table ───────────────────────────────────────────────────────────────────── */
.llmr-table-wrap {
overflow-x: auto;
}
.llmr-table {
font-size: 0.82rem;
margin: 0;
}
.llmr-table thead th {
font-size: 0.72rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--bs-secondary-color);
border-bottom-width: 1px;
white-space: nowrap;
}
.llmr-table tbody tr:hover td { background: var(--bs-tertiary-bg); }
.llmr-row--error td { color: var(--bs-danger); }
.llmr-row--error-detail td {
font-size: 0.78rem;
color: var(--bs-danger);
padding-top: 0;
border-top: none;
background: color-mix(in srgb, var(--bs-danger) 5%, transparent);
}
.llmr-row--error-detail i { margin-right: 4px; }
.llmr-model {
max-width: 180px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-family: var(--bs-font-monospace);
font-size: 0.78rem;
}
.llmr-date {
white-space: nowrap;
color: var(--bs-secondary-color);
}
.llmr-num {
font-variant-numeric: tabular-nums;
font-family: var(--bs-font-monospace);
font-size: 0.78rem;
}
.llmr-cache-hit { color: var(--bs-success); font-weight: 600; }
.llmr-badge-agent,
.llmr-badge-source {
display: inline-block;
font-size: 0.7rem;
font-weight: 500;
padding: 1px 7px;
border-radius: 4px;
background: var(--bs-tertiary-bg);
color: var(--bs-secondary-color);
font-family: var(--bs-font-monospace);
}
.llmr-badge-agent { color: #7c3aed; background: color-mix(in srgb, #7c3aed 10%, transparent); }
.llmr-badge-source { color: #0369a1; background: color-mix(in srgb, #0369a1 10%, transparent); }
/* ── Pagination ──────────────────────────────────────────────────────────────── */
.llmr-pagination {
display: flex;
align-items: center;
justify-content: center;
gap: 0.75rem;
padding: 0.5rem 0 1rem;
}
.llmr-page-info {
font-size: 0.82rem;
color: var(--bs-secondary-color);
}
/* ── Clickable rows ──────────────────────────────────────────────────────────── */
.llmr-row--clickable { cursor: pointer; }
.llmr-row--clickable:hover td { background: var(--bs-tertiary-bg); }
/* ── Detail — back bar ───────────────────────────────────────────────────────── */
.llmr-detail-back {
display: flex;
align-items: center;
gap: 0.75rem;
padding-bottom: 1rem;
border-bottom: 1px solid var(--bs-border-color);
}
.llmr-detail-title {
font-size: 1rem;
font-weight: 600;
color: var(--bs-body-color);
display: flex;
align-items: center;
gap: 0.4rem;
}
.llmr-detail-id {
font-family: var(--bs-font-monospace);
font-weight: 400;
color: var(--bs-secondary-color);
}
/* ── Detail — stat bar ───────────────────────────────────────────────────────── */
.llmr-detail-statbar {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
padding: 0.625rem 0.875rem;
background: var(--bs-tertiary-bg);
border: 1px solid var(--bs-border-color);
border-radius: 8px;
}
.llmr-detail-model {
font-family: var(--bs-font-monospace);
font-size: 0.78rem;
color: var(--bs-body-color);
font-weight: 500;
}
.llmr-detail-sep {
flex: 1;
}
.llmr-detail-stat {
display: inline-flex;
align-items: center;
gap: 0.25rem;
font-size: 0.8rem;
color: var(--bs-secondary-color);
font-variant-numeric: tabular-nums;
}
.llmr-detail-stat i { font-size: 0.78rem; }
.llmr-detail-stat--cache {
color: var(--bs-success);
font-weight: 600;
}
.llmr-detail-date {
font-size: 0.78rem;
color: var(--bs-secondary-color);
white-space: nowrap;
}
.llmr-detail-pill {
font-size: 0.7rem;
font-weight: 500;
padding: 1px 7px;
border-radius: 4px;
background: var(--bs-tertiary-bg);
color: var(--bs-secondary-color);
font-family: var(--bs-font-monospace);
}
.llmr-detail-pill--stack {
color: #b45309;
background: color-mix(in srgb, #b45309 10%, transparent);
}
.llmr-detail-error-badge {
font-size: 0.72rem;
font-weight: 600;
color: var(--bs-danger);
display: inline-flex;
align-items: center;
gap: 0.25rem;
}
.llmr-detail-error-box {
font-size: 0.82rem;
color: var(--bs-danger);
background: color-mix(in srgb, var(--bs-danger) 5%, transparent);
border: 1px solid color-mix(in srgb, var(--bs-danger) 20%, transparent);
border-radius: 6px;
padding: 0.5rem 0.75rem;
display: flex;
align-items: flex-start;
gap: 0.5rem;
}
/* ── Purged payload banner ───────────────────────────────────────────────────── */
.llmr-purged-banner {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.84rem;
color: var(--bs-warning-text-emphasis);
background: var(--bs-warning-bg-subtle);
border: 1px solid var(--bs-warning-border-subtle);
border-radius: 6px;
padding: 0.6rem 0.875rem;
}
/* ── Collapsible sections ────────────────────────────────────────────────────── */
.llmr-section {
border: 1px solid var(--bs-border-color);
border-radius: 8px;
overflow: hidden;
}
.llmr-section-header {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.625rem 0.875rem;
cursor: pointer;
user-select: none;
background: var(--bs-tertiary-bg);
transition: background 0.1s;
}
.llmr-section-header:hover { background: color-mix(in srgb, var(--bs-tertiary-bg) 80%, var(--bs-border-color)); }
.llmr-section-chevron { color: var(--bs-secondary-color); font-size: 0.7rem; }
.llmr-section-title {
font-size: 0.82rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--bs-secondary-color);
}
.llmr-section-badge {
margin-left: auto;
font-size: 0.7rem;
font-weight: 500;
padding: 1px 8px;
border-radius: 20px;
background: var(--bs-border-color);
color: var(--bs-secondary-color);
}
.llmr-section-body {
display: none;
padding: 0.875rem;
border-top: 1px solid var(--bs-border-color);
background: var(--bs-body-bg);
}
.llmr-section--open .llmr-section-body { display: block; }
/* ── Key-value table ─────────────────────────────────────────────────────────── */
.llmr-kv-table {
width: 100%;
border-collapse: collapse;
font-size: 0.82rem;
}
.llmr-kv-key {
width: 200px;
padding: 3px 12px 3px 0;
font-family: var(--bs-font-monospace);
font-size: 0.78rem;
color: var(--bs-secondary-color);
vertical-align: top;
white-space: nowrap;
}
.llmr-kv-val {
padding: 3px 0;
word-break: break-word;
vertical-align: top;
}
/* ── System prompt ───────────────────────────────────────────────────────────── */
.llmr-system-md {
font-size: 0.88rem;
line-height: 1.6;
max-height: 60vh;
overflow-y: auto;
}
/* ── Conversation messages ───────────────────────────────────────────────────── */
.llmr-msg-list {
display: flex;
flex-direction: column;
gap: 0.625rem;
}
.llmr-msg {
border-radius: 6px;
border: 1px solid var(--bs-border-color);
border-left-width: 3px;
overflow: hidden;
}
.llmr-msg--user { border-left-color: #0369a1; }
.llmr-msg--assistant { border-left-color: #7c3aed; }
.llmr-msg--system { border-left-color: #b45309; }
.llmr-msg--unknown { border-left-color: var(--bs-secondary-color); }
.llmr-msg-role {
font-size: 0.7rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
padding: 4px 10px;
background: var(--bs-tertiary-bg);
border-bottom: 1px solid var(--bs-border-color);
}
.llmr-msg--user .llmr-msg-role { color: #0369a1; }
.llmr-msg--assistant .llmr-msg-role { color: #7c3aed; }
.llmr-msg--system .llmr-msg-role { color: #b45309; }
.llmr-msg-body {
padding: 0.625rem 0.75rem;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
/* ── Text block (plain preformatted) ─────────────────────────────────────────── */
.llmr-text-block {
font-size: 0.8rem;
font-family: var(--bs-font-monospace);
white-space: pre-wrap;
word-break: break-word;
margin: 0;
padding: 0;
background: transparent;
border: none;
color: var(--bs-body-color);
max-height: 500px;
overflow-y: auto;
}
/* ── Tool blocks ─────────────────────────────────────────────────────────────── */
.llmr-tool-block {
border: 1px solid var(--bs-border-color);
border-radius: 5px;
overflow: hidden;
font-size: 0.8rem;
}
.llmr-tool-block--use { border-left: 3px solid #0891b2; }
.llmr-tool-block--result { border-left: 3px solid #059669; }
.llmr-tool-block--error { border-left: 3px solid var(--bs-danger); }
.llmr-tool-block-header {
display: flex;
align-items: center;
gap: 0.4rem;
padding: 4px 8px;
background: var(--bs-tertiary-bg);
cursor: pointer;
user-select: none;
}
.llmr-tool-block-header:hover { background: color-mix(in srgb, var(--bs-tertiary-bg) 70%, var(--bs-border-color)); }
.llmr-tool-block--use .llmr-tool-block-header i:first-child { color: #0891b2; }
.llmr-tool-block--result .llmr-tool-block-header i:first-child { color: #059669; }
.llmr-tool-name {
font-family: var(--bs-font-monospace);
font-size: 0.78rem;
font-weight: 600;
}
.llmr-tool-id {
font-family: var(--bs-font-monospace);
font-size: 0.7rem;
color: var(--bs-secondary-color);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 160px;
}
.llmr-tool-toggle { color: var(--bs-secondary-color); font-size: 0.75rem; }
.llmr-tool-preview {
font-family: var(--bs-font-monospace);
font-size: 0.72rem;
color: var(--bs-secondary-color);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1;
min-width: 0;
}
.llmr-tool-expanded {
border-top: 1px solid var(--bs-border-color);
}
.llmr-tool-section-label {
font-size: 0.68rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--bs-secondary-color);
padding: 4px 8px 2px;
background: var(--bs-tertiary-bg);
border-bottom: 1px solid var(--bs-border-color);
display: flex;
align-items: center;
gap: 0.4rem;
}
.llmr-tool-section-label--result { color: #059669; }
/* ── Tool definitions list ───────────────────────────────────────────────────── */
.llmr-tool-def-list {
display: flex;
flex-direction: column;
gap: 4px;
}
.llmr-tool-def {
border: 1px solid var(--bs-border-color);
border-left: 3px solid #0891b2;
border-radius: 5px;
overflow: hidden;
}
.llmr-tool-def-header {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 5px 8px;
background: var(--bs-tertiary-bg);
cursor: pointer;
user-select: none;
}
.llmr-tool-def-header:hover {
background: color-mix(in srgb, var(--bs-tertiary-bg) 70%, var(--bs-border-color));
}
.llmr-tool-def-desc {
font-size: 0.75rem;
color: var(--bs-secondary-color);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1;
min-width: 0;
}
.llmr-tool-pre {
font-size: 0.75rem;
font-family: var(--bs-font-monospace);
white-space: pre-wrap;
word-break: break-word;
margin: 0;
padding: 0.5rem 0.75rem;
background: var(--bs-tertiary-bg);
border-top: 1px solid var(--bs-border-color);
max-height: 400px;
overflow-y: auto;
}
/* ── Reasoning block ─────────────────────────────────────────────────────────── */
.llmr-reasoning-block {
border: 1px solid #7c3aed44;
border-left: 3px solid #7c3aed;
border-radius: 5px;
overflow: hidden;
font-size: 0.8rem;
}
.llmr-reasoning-header {
display: flex;
align-items: center;
gap: 0.4rem;
padding: 4px 8px;
background: color-mix(in srgb, #7c3aed 8%, var(--bs-tertiary-bg));
cursor: pointer;
user-select: none;
color: #7c3aed;
font-family: var(--bs-font-monospace);
font-size: 0.78rem;
font-weight: 600;
}
.llmr-reasoning-header:hover {
background: color-mix(in srgb, #7c3aed 15%, var(--bs-tertiary-bg));
}
.llmr-reasoning-body {
border-top: 1px solid #7c3aed44;
color: var(--bs-secondary-color);
}
+641
View File
@@ -0,0 +1,641 @@
:root {
--mobile-nav-height: 60px;
--mobile-chat-size: 56px;
--mobile-bg: #ffffff;
--mobile-nav-bg: #ffffff;
--mobile-nav-border: #dee2e6;
--mobile-nav-color: #6c757d;
--mobile-nav-active: #0d6efd;
--mobile-chat-bg: #0d6efd;
/* Grouped-list surfaces: a faintly recessed list "well" with raised cards
on top, so a card reads as elevated even where it shares the page colour. */
--mobile-list-bg: #f4f4f7;
--mobile-card-bg: #ffffff;
--mobile-card-border: #ececf1;
--mobile-card-shadow: 0 1px 2px rgba(16, 24, 40, 0.06), 0 6px 16px rgba(16, 24, 40, 0.05);
/* Raised neutral surface for the chat composer + assistant bubbles, kept
grey/neutral on purpose so the mobile chat doesn't inherit the desktop's
indigo-tinted --msg-assistant-bg (which reads as purple in dark mode). */
--mobile-surface: #f2f2f7;
--mobile-surface-text: #1c1c1e;
}
[data-bs-theme="dark"] {
--mobile-bg: #1c1c1e;
--mobile-nav-bg: #1c1c1e;
--mobile-nav-border: #3a3a3c;
--mobile-nav-color: #8e8e93;
--mobile-nav-active: #6ea8fe;
--mobile-chat-bg: #0d6efd;
--mobile-surface: #2c2c2e;
--mobile-surface-text: #e5e5ea;
/* Dark: recess the list below the page colour, raise cards above it. */
--mobile-list-bg: #161618;
--mobile-card-bg: #2c2c2e;
--mobile-card-border: #3a3a3c;
--mobile-card-shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 4px 14px rgba(0, 0, 0, 0.3);
}
body {
background: var(--mobile-bg);
color-scheme: light dark;
}
/* Account for iOS status bar overlay (black-translucent) */
#mobile-root {
padding-top: env(safe-area-inset-top);
}
/* Native shell (?native=true): the HTML bottom nav is hidden and the native
chrome owns the status bar + tab bar, so drop the web-side safe-area insets it
would otherwise double-apply. */
mobile-app[data-native] #mobile-root { padding-top: 0; }
mobile-app[data-native] .chat-page-input-area { padding-bottom: 10px; }
/* ── Section header ─────────────────────────────────── */
.mobile-section-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 16px;
border-bottom: 1px solid var(--mobile-nav-border);
flex-shrink: 0;
}
.mobile-section-title {
font-size: 1.05rem;
font-weight: 700;
color: var(--bs-body-color, #212529);
display: flex;
align-items: center;
gap: 8px;
}
.mobile-alert-error {
margin: 12px 16px;
padding: 10px 14px;
background: #f8d7da;
color: #842029;
border-radius: 8px;
font-size: 0.85rem;
}
/* Refresh button in section headers (agent-inbox.css isn't loaded on mobile). */
.inbox-refresh-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 34px;
height: 34px;
padding: 0;
border: 1px solid var(--mobile-nav-border);
border-radius: 8px;
background: transparent;
color: var(--mobile-nav-color);
font-size: 1rem;
cursor: pointer;
-webkit-tap-highlight-color: transparent;
}
.inbox-refresh-btn:active { transform: scale(0.94); }
/* ── Inbox ──────────────────────────────────────────── */
.mobile-inbox {
display: flex;
flex-direction: column;
height: 100%;
}
.mobile-inbox-list {
flex: 1;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
padding: 12px 16px;
display: flex;
flex-direction: column;
gap: 12px;
}
.inbox-section-label {
font-size: 0.8rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--mobile-nav-color);
display: flex;
align-items: center;
gap: 8px;
margin-top: 4px;
}
/* ── Footer buttons ──────────────────────────────────── */
.inbox-btn {
flex: 1;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
padding: 12px;
font-size: 0.9rem;
font-weight: 600;
border-radius: 10px;
border: none;
cursor: pointer;
-webkit-tap-highlight-color: transparent;
}
.inbox-btn-approve {
background: #198754;
color: #fff;
}
.inbox-btn-reject {
background: transparent;
color: #dc3545;
border: 1.5px solid #dc3545;
}
/* ── Empty state override (full-height inside mobile-inbox) ── */
.mobile-inbox .inbox-empty {
flex: 1;
height: auto;
padding: 40px 20px;
}
#mobile-root {
display: flex;
flex-direction: column;
height: 100%;
height: 100dvh;
}
.mobile-content {
flex: 1;
min-height: 0;
overflow: hidden;
display: flex;
flex-direction: column;
}
/* ── Coming soon ────────────────────────────────────── */
.mobile-coming-soon {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 12px;
height: 100%;
color: var(--mobile-nav-color);
}
.mobile-coming-soon i { font-size: 2.5rem; opacity: 0.35; }
.mobile-coming-soon p {
margin: 0;
font-size: 0.95rem;
font-weight: 500;
opacity: 0.6;
}
/* ── Bottom nav ─────────────────────────────────────── */
.mobile-nav {
display: flex;
align-items: center;
justify-content: space-around;
height: var(--mobile-nav-height);
background: var(--mobile-nav-bg);
border-top: 1px solid var(--mobile-nav-border);
padding-bottom: env(safe-area-inset-bottom);
position: relative;
z-index: 100;
}
.mobile-nav-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 2px;
flex: 1;
height: 100%;
cursor: pointer;
color: var(--mobile-nav-color);
font-size: 0.62rem;
user-select: none;
-webkit-tap-highlight-color: transparent;
transition: color 0.15s;
}
.mobile-nav-item.active {
color: var(--mobile-nav-active);
}
.mobile-nav-item i {
font-size: 1.3rem;
line-height: 1;
}
/* ── Center chat FAB ────────────────────────────────── */
.mobile-nav-item.chat-btn {
position: relative;
top: -14px;
flex: 1.2;
}
.chat-fab {
width: var(--mobile-chat-size);
height: var(--mobile-chat-size);
border-radius: 50%;
background: var(--mobile-chat-bg);
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.25);
transition: transform 0.15s, box-shadow 0.15s;
}
.chat-fab i {
font-size: 1.5rem;
color: #fff !important;
}
.mobile-nav-item.chat-btn.active .chat-fab {
box-shadow: 0 4px 14px rgba(13, 110, 253, 0.45);
transform: scale(1.06);
}
.mobile-nav-item.chat-btn span {
margin-top: 6px;
font-size: 0.6rem;
}
/* ── Chat page ──────────────────────────────────────── */
.chat-page {
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
overflow: hidden;
}
/* Wider bubbles on narrow screens */
.chat-page .copilot-msg {
max-width: 96%;
/* Allow the bubble to shrink below its content's intrinsic width so inner
scroll containers (code/diff/table) collapse and scroll internally instead
of widening the bubble past the viewport. */
min-width: 0;
font-size: 0.92rem;
}
/* Assistant bubbles use a neutral surface instead of the desktop's indigo-tinted
--msg-assistant-bg, which clashed with the mobile neutral palette. */
.chat-page .copilot-msg.assistant {
background: var(--mobile-surface);
color: var(--mobile-surface-text);
}
.chat-page-header-actions {
display: flex;
align-items: center;
gap: 8px;
}
.chat-page-messages {
flex: 1;
min-height: 0;
overflow-y: auto;
/* Clip horizontally: wide content (code blocks, tables, diffs) scrolls inside
its own bubble box, so the message list itself never pans sideways. Without
this, `overflow-y: auto` makes the unset x-axis compute to `auto` too. */
overflow-x: hidden;
-webkit-overflow-scrolling: touch;
padding: 12px 14px;
display: flex;
flex-direction: column;
gap: 8px;
}
.chat-page-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 10px;
height: 100%;
color: var(--mobile-nav-color);
}
.chat-page-empty i {
font-size: 2rem;
opacity: 0.4;
}
.chat-page-empty p {
margin: 0;
font-size: 0.9rem;
opacity: 0.6;
}
.chat-page-input-area {
padding: 10px 12px;
padding-bottom: calc(10px + env(safe-area-inset-bottom, 0px));
border-top: 1px solid var(--mobile-nav-border);
background: var(--mobile-bg);
flex-shrink: 0;
}
/* Unified composer: a single bordered box wrapping the textarea and the
toolbar below it, mirroring the desktop copilot (.copilot-composer). Uses
the neutral mobile surface so it matches the assistant bubbles. */
.chat-page-composer {
display: flex;
flex-direction: column;
border: 1px solid var(--mobile-nav-border);
border-radius: 0.75rem;
background: var(--mobile-surface);
transition: border-color 0.15s, box-shadow 0.15s;
}
.chat-page-composer:focus-within {
border-color: var(--accent);
box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.12);
}
.chat-page-textarea {
display: block;
width: 100%;
box-sizing: border-box;
resize: none;
border: none;
outline: none;
background: transparent;
color: inherit;
font-size: 0.95rem;
line-height: 1.4;
padding: 12px 14px 6px;
min-height: 44px;
max-height: 120px;
overflow-y: auto;
}
/* ── Composer toolbar (below the textarea) ─────────────────────────────────── */
.chat-page-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.4rem;
padding: 6px 8px;
}
.chat-page-toolbar-left,
.chat-page-toolbar-right {
display: flex;
align-items: center;
gap: 6px;
}
/* Model selector — a native <select> styled as a subtle pill, opening the
OS-native picker for the best touch ergonomics. */
.chat-page-model-pill {
appearance: none;
-webkit-appearance: none;
max-width: 150px;
padding: 5px 26px 5px 10px;
border: 1px solid transparent;
border-radius: 999px;
background-color: transparent;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 16 16' fill='%2394a3b8'%3E%3Cpath d='M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 8px center;
font-size: 0.78rem;
color: var(--mobile-nav-color);
cursor: pointer;
}
.chat-page-model-pill:focus,
.chat-page-model-pill:hover {
border-color: rgba(99, 102, 241, 0.3);
}
/* ── Mic + send buttons ────────────────────────────────────────────────────── */
.chat-page-mic-btn,
.chat-page-send {
width: 40px;
height: 40px;
border: none;
border-radius: 50%;
padding: 0;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
font-size: 1rem;
color: #fff;
cursor: pointer;
-webkit-tap-highlight-color: transparent;
}
.chat-page-mic-btn {
background: var(--accent);
}
.chat-page-mic-btn:active { transform: scale(0.94); }
.chat-page-send {
background: var(--accent);
}
.chat-page-send:active { transform: scale(0.94); }
.chat-page-send--stop {
background: #dc2626;
}
.chat-page-mic-btn--recording {
background: #dc2626;
animation: chat-page-pulse 1s ease-in-out infinite;
}
@keyframes chat-page-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.65; }
}
/* MCP dropdown opens upward on mobile */
.chat-page-gear-dropdown {
bottom: 100%;
top: auto;
margin-bottom: 6px;
}
/* ── Chat header back button (inside a project) ─────── */
.chat-page-back {
display: inline-flex;
align-items: center;
justify-content: center;
width: 30px;
height: 30px;
margin-right: 2px;
padding: 0;
border: none;
border-radius: 8px;
background: transparent;
color: var(--mobile-nav-active);
font-size: 1.1rem;
cursor: pointer;
-webkit-tap-highlight-color: transparent;
}
/* ── Projects ───────────────────────────────────────── */
.mobile-projects {
display: flex;
flex-direction: column;
height: 100%;
}
.mobile-projects-list {
flex: 1;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
padding: 14px 16px calc(14px + env(safe-area-inset-bottom));
background: var(--mobile-list-bg);
display: flex;
flex-direction: column;
gap: 12px;
}
.mobile-projects .inbox-empty {
flex: 1;
height: auto;
padding: 40px 20px;
background: var(--mobile-list-bg);
}
.project-card {
display: flex;
align-items: center;
gap: 14px;
padding: 13px 14px;
border: 1px solid var(--mobile-card-border);
border-radius: 16px;
background: var(--mobile-card-bg);
box-shadow: var(--mobile-card-shadow);
cursor: pointer;
-webkit-tap-highlight-color: transparent;
transition: transform 0.12s ease, border-color 0.12s, box-shadow 0.12s;
}
.project-card:active {
transform: scale(0.985);
border-color: var(--mobile-nav-active);
box-shadow: 0 0 0 1px var(--mobile-nav-active);
}
/* Rounded gradient "app icon" tile — the main visual anchor for each card. */
.project-card-icon {
flex-shrink: 0;
width: 44px;
height: 44px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.3rem;
color: #fff;
background: linear-gradient(135deg, var(--accent, #6366f1), var(--accent-hover, #4f46e5));
box-shadow: 0 2px 8px rgba(99, 102, 241, 0.35);
}
.project-card-main {
flex: 1;
min-width: 0;
}
.project-card-name {
font-size: 1rem;
font-weight: 650;
line-height: 1.25;
color: var(--mobile-surface-text, #1c1c1e);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.project-card-desc {
margin-top: 3px;
font-size: 0.82rem;
line-height: 1.35;
color: var(--mobile-nav-color);
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.project-card-chevron {
color: var(--mobile-nav-color);
font-size: 0.95rem;
flex-shrink: 0;
opacity: 0.6;
}
/* ── File viewer (mobile) ───────────────────────────── */
/* Full-height column: fixed header + scrollable body. The body content classes
(.fv-md / .fv-code / .fv-pdf / .fv-image-wrap / .fv-state / ...) come from the
shared css/file-viewer.css, loaded by mobile.html. */
.mobile-file-viewer {
display: flex;
flex-direction: column;
height: 100%;
min-height: 0;
}
/* Let the title (and its filename child) shrink so the ellipsis kicks in. */
.mobile-file-viewer .mobile-section-title { min-width: 0; flex: 1; }
.mobile-file-viewer .fv-body {
flex: 1;
min-height: 0;
}
/* Filename: monospace, single line with ellipsis, leaving room for the back
button. Full path is on the element's title attribute. */
.fv-mobile-name {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
font-size: 0.92rem;
font-weight: 500;
/* Ellipsise the start so a long filename keeps its tail (extension) visible;
`<bdi>` around the name preserves left-to-right order. */
direction: rtl;
text-align: left;
}
/* Let the title group shrink so the name ellipsises and the download button
stays pinned to the right of the header. */
.mobile-file-viewer .mobile-section-title {
flex: 1 1 auto;
min-width: 0;
}
+58
View File
@@ -0,0 +1,58 @@
/* ── Models hub landing page ────────────────────────────────────────────────── */
.models-hub {
padding: 2rem 2.5rem;
width: 100%;
}
.models-hub-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 1rem;
margin-top: 1.5rem;
}
.models-type-card {
border: 1px solid var(--bs-border-color);
border-radius: 10px;
padding: 1.25rem;
cursor: pointer;
transition: box-shadow 0.15s, border-color 0.15s;
background: var(--bs-body-bg);
text-align: left;
width: 100%;
}
.models-type-card:hover {
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
border-color: var(--bs-primary);
}
.models-type-card-icon {
font-size: 1.5rem;
margin-bottom: 0.6rem;
color: var(--bs-primary);
}
.models-type-card-title {
font-weight: 600;
font-size: 1rem;
margin-bottom: 0.35rem;
}
.models-type-card-desc {
font-size: 0.82rem;
color: var(--bs-secondary-color);
margin-bottom: 0.75rem;
line-height: 1.4;
}
.models-type-card-count {
font-size: 0.8rem;
font-weight: 500;
color: var(--bs-secondary-color);
}
.models-type-card-count.has-models {
color: var(--bs-success);
}
+36
View File
@@ -0,0 +1,36 @@
/* ── Image generation models section ───────────────────────────────────────── */
.ig-source-badge {
font-size: 0.6rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
padding: 0.18em 0.55em;
border-radius: 4px;
flex-shrink: 0;
white-space: nowrap;
}
.ig-source-plugin {
background: color-mix(in srgb, #7c3aed 14%, transparent);
color: #7c3aed;
}
.ig-source-cloud {
background: var(--bs-secondary-bg, #f0f2f5);
color: var(--bs-secondary-color, #6b7280);
}
.ig-priority-tag {
font-size: 0.72rem;
font-weight: 500;
color: var(--bs-secondary-color, #9ca3af);
}
.ig-card-desc {
font-size: 0.82rem;
color: var(--bs-secondary-color);
line-height: 1.4;
padding-left: 0;
padding-top: 2px;
}
+510
View File
@@ -0,0 +1,510 @@
/* ── LLM models section ─────────────────────────────────────────────────────── */
/* ── Page shell ── */
.llm-page {
padding: 0;
max-width: 100%;
display: flex;
flex-direction: column;
height: 100%;
}
.llm-page-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 20px;
min-height: 54px;
border-bottom: 1px solid var(--bs-border-color);
background: var(--bs-tertiary-bg);
flex-shrink: 0;
gap: 12px;
}
.llm-header-left {
display: flex;
align-items: center;
gap: 10px;
min-width: 0;
}
.back-btn {
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
padding: 0 !important;
border-radius: 6px !important;
flex-shrink: 0;
}
.back-btn i {
font-size: 1rem;
line-height: 1;
}
.llm-page-title {
font-size: 1.05rem;
font-weight: 700;
margin: 0;
display: flex;
align-items: center;
gap: 8px;
}
.llm-page-count {
font-size: 0.76rem;
color: var(--bs-secondary-color);
font-weight: 500;
}
/* ── Card list ── */
.llm-card-list {
padding: 16px 20px;
overflow-y: auto;
flex: 1;
display: flex;
flex-direction: column;
gap: 10px;
}
/* ── Single card ── */
.llm-card {
background: var(--bs-body-bg);
border: 1px solid var(--bs-border-color);
border-radius: 10px;
padding: 14px 16px;
display: flex;
flex-direction: column;
gap: 6px;
transition: border-color 0.15s, box-shadow 0.15s;
}
.llm-card:hover {
border-color: var(--bs-primary-border-subtle, #9ec5fe);
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);
}
/* ── Row 1: move btns + dots + name + badge + actions ── */
.llm-card-row1 {
display: flex;
align-items: center;
gap: 10px;
}
.llm-move-btns {
display: flex;
flex-direction: column;
gap: 2px;
flex-shrink: 0;
}
.llm-move-btn {
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 20px;
border: none;
background: transparent;
color: var(--bs-secondary-color, #9ca3af);
cursor: pointer;
border-radius: 4px;
font-size: 0.6rem;
padding: 0;
line-height: 1;
transition: background 0.1s, color 0.1s;
}
.llm-move-btn:hover:not(:disabled) {
background: var(--bs-tertiary-bg, #f0f2f5);
color: var(--bs-body-color, #374151);
}
.llm-move-btn:active:not(:disabled) {
background: var(--bs-border-color, #e2e6ee);
}
.llm-move-btn:disabled {
opacity: 0.25;
cursor: default;
}
/* Strength & status dots */
.llm-strength-dot {
display: inline-block;
width: 10px;
height: 10px;
border-radius: 50%;
cursor: default;
flex-shrink: 0;
}
/* Name */
.llm-card-name {
font-weight: 600;
font-size: 0.9rem;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Badge "default" */
.llm-card-badge {
font-size: 0.58rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.04em;
padding: 0.15em 0.5em;
border-radius: 4px;
background: var(--bs-primary-bg-subtle, #eef2ff);
color: var(--bs-primary, #4f46e5);
flex-shrink: 0;
white-space: nowrap;
}
/* Action buttons */
.llm-card-actions {
display: flex;
gap: 2px;
flex-shrink: 0;
margin-left: auto;
}
.llm-btn-icon {
display: flex;
align-items: center;
justify-content: center;
width: 30px;
height: 30px;
border: none;
background: transparent;
color: var(--bs-secondary-color, #9ca3af);
border-radius: 6px;
cursor: pointer;
font-size: 0.85rem;
transition: all 0.1s;
}
.llm-btn-icon:hover {
background: var(--bs-tertiary-bg, #f0f2f5);
color: var(--bs-body-color, #374151);
}
.llm-btn-edit:hover {
color: var(--bs-primary, #0d6efd);
background: var(--bs-primary-bg-subtle, #eef2ff);
}
.llm-btn-delete:hover {
color: var(--bs-danger, #dc3545);
background: var(--bs-danger-bg-subtle, #fef0f0);
}
/* ── Row 2: meta info (indented under name) ── */
.llm-card-row2 {
display: flex;
align-items: center;
gap: 12px;
padding-left: 38px;
font-size: 0.78rem;
color: var(--bs-secondary-color, #6b7280);
flex-wrap: wrap;
}
.llm-provider-name {
font-weight: 500;
}
.llm-model-id {
font-family: var(--bs-font-monospace, monospace);
font-size: 0.74rem;
color: var(--bs-secondary-color, #9ca3af);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 280px;
}
.llm-price-tag {
font-size: 0.74rem;
font-weight: 600;
color: var(--bs-success, #16a34a);
white-space: nowrap;
}
/* ── Row 3: scope pills (indented) ── */
.llm-card-row3 {
display: flex;
align-items: center;
gap: 4px;
padding-left: 38px;
flex-wrap: wrap;
}
.llm-scope-pill {
display: inline-block;
font-size: 0.65rem;
font-weight: 500;
padding: 0.15em 0.5em;
border-radius: 4px;
background: var(--bs-secondary-bg, #f0f2f5);
color: var(--bs-secondary-color, #6b7280);
}
.llm-params-pill {
background: #6366f1 !important;
color: #fff !important;
}
/* ── Empty state ── */
.llm-empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 48px 20px;
color: var(--bs-secondary-color, #9ca3af);
gap: 8px;
flex: 1;
}
.llm-empty-state i {
font-size: 2rem;
opacity: 0.4;
}
.llm-empty-state p {
margin: 0;
font-size: 0.9rem;
}
/* ── Mobile tweaks ── */
@media (max-width: 600px) {
.llm-page-header {
padding: 10px 14px;
min-height: 50px;
}
.llm-card-list {
padding: 10px 12px;
gap: 8px;
}
.llm-card {
padding: 12px 12px;
gap: 5px;
}
.llm-card-row1 {
gap: 7px;
}
.llm-move-btn {
width: 24px;
height: 18px;
font-size: 0.55rem;
}
.llm-card-actions {
gap: 0;
}
.llm-btn-icon {
width: 28px;
height: 28px;
font-size: 0.8rem;
}
.llm-card-row2 {
padding-left: 31px;
gap: 8px;
font-size: 0.74rem;
}
.llm-card-row3 {
padding-left: 31px;
}
}
/* ── Modal ── */
.llm-modal {
width: 100%;
max-width: 520px;
max-height: calc(100vh - 100px);
overflow-y: auto;
}
.llm-modal-title {
font-weight: 600;
font-size: 1rem;
margin-bottom: 1.25rem;
}
.llm-modal-wide {
max-width: 680px;
}
/* ── Scope checkbox grid ── */
.llm-scope-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0.35rem 1rem;
}
/* ── Provider picker grid ── */
.llm-provider-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: 0.75rem;
}
.llm-provider-card {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 1rem 0.75rem;
border: 1px solid var(--bs-border-color);
border-radius: 8px;
background: var(--bs-body-bg);
cursor: pointer;
transition: border-color 0.15s, background 0.15s;
text-align: center;
}
.llm-provider-card:hover {
border-color: var(--bs-primary);
background: var(--bs-primary-bg-subtle, rgba(13,110,253,0.06));
}
.llm-provider-card-name {
font-weight: 600;
font-size: 0.85rem;
}
/* ── OpenRouter model list ── */
.llm-or-model-list {
border: 1px solid var(--bs-border-color);
border-radius: 6px;
max-height: 240px;
overflow-y: auto;
}
.llm-or-model-row {
display: flex;
flex-direction: column;
gap: 0.15rem;
padding: 0.45rem 0.75rem;
cursor: pointer;
border-bottom: 1px solid var(--bs-border-color);
transition: background 0.1s;
}
.llm-or-model-row:last-child {
border-bottom: none;
}
.llm-or-model-row:hover {
background: var(--bs-tertiary-bg, rgba(0,0,0,0.04));
}
.llm-or-model-row.selected {
background: var(--bs-primary-bg-subtle, rgba(13,110,253,0.1));
border-left: 3px solid var(--bs-primary);
}
.llm-or-model-name {
font-size: 0.82rem;
font-weight: 500;
}
.llm-or-model-meta {
display: flex;
gap: 0.75rem;
align-items: center;
}
.llm-or-price {
font-size: 0.72rem;
font-weight: 600;
color: var(--bs-success, #198754);
background: var(--bs-success-bg-subtle, rgba(25,135,84,0.1));
padding: 0.05em 0.35em;
border-radius: 3px;
}
/* ── TTS remote model picker ─────────────────────────────────────────────── */
.tts-model-pick-list {
display: flex;
flex-direction: column;
gap: 0.5rem;
max-height: 420px;
overflow-y: auto;
}
.tts-model-pick-item {
display: flex;
flex-direction: column;
align-items: flex-start;
padding: 0.65rem 0.85rem;
border: 1px solid var(--bs-border-color);
border-radius: 8px;
background: var(--bs-body-bg);
cursor: pointer;
text-align: left;
transition: border-color 0.15s, background 0.15s;
}
.tts-model-pick-item:hover {
border-color: var(--bs-primary);
background: var(--bs-primary-bg-subtle, rgba(13,110,253,0.06));
}
.tts-model-pick-name {
font-weight: 600;
font-size: 0.85rem;
}
.tts-model-pick-desc {
font-size: 0.78rem;
color: var(--bs-secondary-color);
margin-top: 0.2rem;
}
.tts-model-pick-langs {
font-size: 0.72rem;
color: var(--bs-secondary-color);
margin-top: 0.15rem;
font-style: italic;
}
.tts-model-pick-row1 {
display: flex;
align-items: baseline;
gap: 0.5rem;
width: 100%;
}
.tts-model-pick-cost {
margin-left: auto;
font-size: 0.75rem;
font-weight: 600;
color: var(--bs-secondary-color);
white-space: nowrap;
}
+84
View File
@@ -0,0 +1,84 @@
/* ── Custom element display + layout shell ──────────────────────────────────── */
tasks-page {
display: none; /* toggled by JS */
flex-direction: column;
flex: 1;
min-width: 0;
min-height: 0;
overflow: hidden;
border-right: 1px solid var(--toolbar-border, #e5e9f0);
}
task-running-section,
task-cron-jobs-section,
task-scheduled-section,
task-history-section {
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
min-width: 0;
}
llm-providers-page,
models-hub-page {
display: none; /* toggled by JS */
flex: 1;
min-width: 0;
overflow-y: auto;
border-right: 1px solid var(--toolbar-border, #e5e9f0);
}
models-llm-section,
models-transcribe-section,
models-image-section {
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
min-width: 0;
}
projects-page {
display: none; /* toggled by JS */
flex-direction: column;
flex: 1;
min-width: 0;
min-height: 0;
overflow: hidden;
border-right: 1px solid var(--toolbar-border, #e5e9f0);
}
project-list-section,
project-board-section {
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
min-width: 0;
}
session-detail-page,
tic-sessions-page,
file-viewer-page {
display: none; /* toggled by JS */
flex-direction: column;
flex: 1;
min-width: 0;
min-height: 0;
overflow: hidden;
border-right: 1px solid var(--toolbar-border, #e5e9f0);
}
/* ── Workspace placeholder ──────────────────────────────────────────────────── */
.app-workspace {
display: flex;
flex: 1;
min-width: 0;
align-items: center;
justify-content: center;
color: var(--placeholder-color, #94a3b8);
font-size: 0.9rem;
}
+132
View File
@@ -0,0 +1,132 @@
/* ── Project list page ─────────────────────────────────────────────────────── */
.project-page {
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
width: 100%;
}
.project-page-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 20px;
min-height: 54px;
border-bottom: 1px solid var(--bs-border-color);
background: var(--bs-tertiary-bg);
flex-shrink: 0;
}
.project-page-title {
margin: 0;
font-weight: 700;
font-size: 1.05rem;
display: flex;
align-items: center;
gap: 8px;
}
/* ── Grid ── */
.project-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 16px;
padding: 20px;
align-content: start;
overflow-y: auto;
flex: 1;
}
/* ── Card ── */
.project-card {
display: flex;
flex-direction: column;
gap: 8px;
background: var(--bs-body-bg);
border: 1px solid var(--bs-border-color);
border-radius: 10px;
padding: 16px;
cursor: pointer;
transition: border-color 0.15s, box-shadow 0.15s;
}
.project-card:hover {
border-color: var(--bs-primary-border-subtle, #9ec5fe);
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);
}
.project-card-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 8px;
}
.project-card-title {
font-weight: 600;
font-size: 0.95rem;
line-height: 1.3;
flex: 1;
min-width: 0;
}
.project-card-actions {
display: flex;
gap: 4px;
flex-shrink: 0;
}
.project-card-icon-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border: none;
border-radius: 6px;
background: transparent;
color: var(--bs-secondary-color);
opacity: 0.6;
cursor: pointer;
transition: opacity 0.12s, background 0.12s;
}
.project-card-icon-btn:hover {
opacity: 1;
background: var(--bs-secondary-bg);
}
.project-card-icon-btn--danger:hover {
color: var(--bs-danger, #dc3545);
background: rgba(220, 53, 69, 0.08);
}
.project-card-path {
font-size: 0.78rem;
color: var(--bs-secondary-color);
font-family: var(--bs-font-monospace, monospace);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.project-card-desc {
font-size: 0.82rem;
color: var(--bs-secondary-color);
line-height: 1.4;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.project-card-meta {
font-size: 0.72rem;
color: var(--bs-secondary-color);
margin-top: auto;
padding-top: 4px;
}
+252
View File
@@ -0,0 +1,252 @@
/* ── Tab bar ────────────────────────────────────────────────────────────────── */
.project-tab-bar {
display: flex;
gap: 0;
padding: 0 20px;
border-bottom: 1px solid var(--bs-border-color);
background: var(--bs-tertiary-bg);
flex-shrink: 0;
}
.project-tab {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 9px 16px;
font-size: 0.82rem;
font-weight: 500;
color: var(--bs-secondary-color);
background: none;
border: none;
border-bottom: 2px solid transparent;
margin-bottom: -1px;
cursor: pointer;
transition: color 0.15s, border-color 0.15s;
white-space: nowrap;
}
.project-tab:hover {
color: var(--bs-body-color);
}
.project-tab--active {
color: var(--bs-primary, #0d6efd);
border-bottom-color: var(--bs-primary, #0d6efd);
}
/* ── Ticket list (scrollable container) ─────────────────────────────────────── */
.ticket-list {
display: flex;
flex-direction: column;
flex: 1;
overflow-y: auto;
padding: 20px;
gap: 0;
}
/* ── Section header ─────────────────────────────────────────────────────────── */
.ticket-section {
display: flex;
flex-direction: column;
gap: 8px;
margin-bottom: 24px;
}
.ticket-section-header {
display: flex;
align-items: center;
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--bs-secondary-color);
padding: 4px 0 6px;
border-bottom: 1px solid var(--bs-border-color);
margin-bottom: 4px;
}
.ticket-section-header--running {
color: var(--bs-primary, #0d6efd);
border-bottom-color: var(--bs-primary-border-subtle, #9ec5fe);
}
.ticket-section-header--completed {
color: #198754;
border-bottom-color: rgba(25, 135, 84, 0.25);
}
[data-bs-theme="dark"] .ticket-section-header--completed {
color: #75b798;
}
.ticket-section-empty {
font-size: 0.8rem;
color: var(--bs-secondary-color);
opacity: 0.5;
padding: 8px 0;
}
/* ── Ticket card ────────────────────────────────────────────────────────────── */
.ticket-card {
display: flex;
flex-direction: column;
gap: 6px;
width: 100%;
background: var(--bs-body-bg);
border: 1px solid var(--bs-border-color);
border-left: 3px solid var(--bs-border-color);
border-radius: 6px;
padding: 12px 16px;
transition: box-shadow 0.15s;
}
.ticket-card:hover {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.07);
}
.ticket-card--running {
border-left-color: var(--bs-primary, #0d6efd);
}
.ticket-card--done {
border-left-color: #198754;
}
.ticket-card--failed {
border-left-color: #dc3545;
}
.ticket-card-header {
display: flex;
align-items: center;
gap: 8px;
}
.ticket-card-title {
font-weight: 600;
font-size: 0.92rem;
line-height: 1.35;
flex: 1;
min-width: 0;
word-break: break-word;
}
.ticket-card-desc {
font-size: 0.8rem;
color: var(--bs-secondary-color);
line-height: 1.45;
white-space: pre-wrap;
cursor: pointer;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.ticket-card-desc--expanded {
display: block;
-webkit-line-clamp: unset;
overflow: visible;
}
.ticket-card-meta {
display: flex;
align-items: center;
gap: 12px;
font-size: 0.74rem;
color: var(--bs-secondary-color);
flex-wrap: wrap;
}
.ticket-card-actions {
display: flex;
align-items: center;
gap: 6px;
margin-top: 2px;
flex-wrap: wrap;
}
.ticket-card-btn {
font-size: 0.72rem;
padding: 2px 8px;
line-height: 1.5;
}
.ticket-card-running-label {
font-size: 0.78rem;
color: var(--bs-secondary-color);
}
.ticket-card-session-link {
font-size: 0.78rem;
font-family: var(--bs-font-monospace, monospace);
margin-left: auto;
}
.ticket-card-session-btn {
font-family: var(--bs-font-monospace, monospace);
font-size: 0.75rem;
}
/* ── Result / Error area ────────────────────────────────────────────────────── */
.ticket-card-result {
border-radius: 4px;
padding: 12px 14px;
overflow-y: auto;
margin-top: 4px;
}
.ticket-card-result--success {
background: rgba(25, 135, 84, 0.06);
border: 1px solid rgba(25, 135, 84, 0.2);
}
.ticket-card-result--error {
background: rgba(220, 53, 69, 0.06);
border: 1px solid rgba(220, 53, 69, 0.2);
}
.ticket-result-markdown {
font-size: 0.85rem;
line-height: 1.6;
color: var(--bs-body-color);
}
/* Constrain markdown elements inside result */
.ticket-result-markdown p:last-child {
margin-bottom: 0;
}
.ticket-result-markdown pre {
font-size: 0.8rem;
border-radius: 4px;
padding: 8px 10px;
background: var(--bs-tertiary-bg);
overflow-x: auto;
}
.ticket-result-markdown code:not(pre > code) {
font-size: 0.82em;
padding: 1px 4px;
border-radius: 3px;
background: var(--bs-tertiary-bg);
}
.ticket-result-error {
font-size: 0.78rem;
font-family: var(--bs-font-monospace, monospace);
line-height: 1.45;
margin: 0;
white-space: pre-wrap;
word-break: break-word;
color: #58151c;
}
[data-bs-theme="dark"] .ticket-result-error {
color: #ea868f;
}
+259
View File
@@ -0,0 +1,259 @@
/* ── Sidebar ───────────────────────────────────────────────────────────────── */
app-sidebar {
display: flex;
flex-direction: column;
width: var(--sidebar-width);
height: 100%;
background: var(--sidebar-bg);
flex-shrink: 0;
padding: 1.25rem 0 1rem;
overflow-y: auto;
}
.sidebar-brand {
display: flex;
align-items: center;
gap: 0.55rem;
padding: 0 1rem 1.25rem;
color: var(--sidebar-brand-color);
font-size: 0.95rem;
font-weight: 600;
letter-spacing: 0.01em;
}
.sidebar-brand i {
font-size: 1.1rem;
opacity: 0.85;
}
.sidebar-brand-icon {
width: 22px;
height: 22px;
border-radius: 5px;
object-fit: cover;
flex-shrink: 0;
}
.sidebar-divider {
border-color: var(--sidebar-divider);
margin: 0.85rem 1rem;
opacity: 1;
}
.sidebar-section-toggle {
display: flex;
align-items: center;
gap: 0.4rem;
width: 100%;
background: none;
border: none;
padding: 0.2rem 1rem 0.2rem 0.85rem;
font-size: 0.7rem;
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--sidebar-label-color);
cursor: pointer;
margin-top: 0.5rem;
}
.sidebar-section-toggle:hover {
color: var(--bs-body-color);
}
.sidebar-section-toggle i {
font-size: 0.65rem;
}
.sidebar-section-count {
margin-left: auto;
font-size: 0.65rem;
opacity: 0.6;
}
.sidebar-nav {
display: flex;
flex-direction: column;
gap: 0.1rem;
padding: 0 0.5rem;
}
.sidebar-nav--sessions .sidebar-link {
align-items: flex-start;
padding-top: 0.35rem;
padding-bottom: 0.35rem;
}
.sidebar-link {
display: flex;
align-items: center;
gap: 0.6rem;
padding: 0.20rem 0.30rem;
color: var(--sidebar-text);
text-decoration: none;
font-size: 0.875rem;
border-radius: 0.25rem;
transition: background 0.12s, color 0.12s;
}
.sidebar-link i {
font-size: 0.95rem;
width: 1.1rem;
text-align: center;
opacity: 0.8;
}
.sidebar-link-name {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.sidebar-link:hover {
background: var(--sidebar-hover);
color: var(--sidebar-text-active);
}
.sidebar-link.active {
background: var(--sidebar-active-bg);
color: var(--sidebar-text-active);
font-weight: 500;
border-radius: 0.25rem;
}
.sidebar-link.active i {
opacity: 1;
}
.sidebar-session-meta {
display: flex;
align-items: center;
gap: 0.4rem;
}
.sidebar-session-date {
font-size: 0.72rem;
opacity: 0.55;
line-height: 1.2;
}
.sidebar-agent-badge {
font-size: 0.62rem;
font-weight: 600;
letter-spacing: 0.02em;
text-transform: uppercase;
opacity: 0.6;
background: var(--bs-secondary-bg, rgba(128,128,128,0.15));
border-radius: 3px;
padding: 0 4px;
line-height: 1.6;
}
.sidebar-session-preview {
display: block;
font-size: 0.78rem;
opacity: 0.85;
line-height: 1.3;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 160px;
}
/* ── Submenu (Task Manager) ── */
.sidebar-link-chevron {
margin-left: auto;
font-size: 0.7rem !important;
width: auto !important;
opacity: 0.55;
transition: transform 0.15s;
}
.sidebar-submenu {
display: flex;
flex-direction: column;
gap: 0.05rem;
padding: 0.1rem 0 0.1rem 1.25rem;
}
.sidebar-sublink {
display: flex;
align-items: center;
gap: 0.55rem;
padding: 0.18rem 0.40rem;
color: var(--sidebar-text);
text-decoration: none;
font-size: 0.84rem;
border-radius: 0.25rem;
transition: background 0.12s, color 0.12s;
}
.sidebar-sublink i {
font-size: 0.82rem;
width: 1rem;
text-align: center;
opacity: 0.7;
}
.sidebar-sublink:hover {
background: var(--sidebar-hover);
color: var(--sidebar-text-active);
}
.sidebar-sublink.active {
background: var(--sidebar-active-bg);
color: var(--sidebar-text-active);
font-weight: 500;
}
.sidebar-sublink.active i {
opacity: 1;
}
/* ── Project quick-links in sidebar ── */
.sidebar-project-link {
display: flex;
align-items: center;
gap: 0.4rem;
padding: 0.18rem 0.40rem;
color: var(--sidebar-text);
text-decoration: none;
font-size: 0.82rem;
border-radius: 0.25rem;
transition: background 0.12s, color 0.12s;
cursor: pointer;
}
.sidebar-project-link:hover {
background: var(--sidebar-hover);
color: var(--sidebar-text-active);
}
.sidebar-project-name {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 0.81rem;
}
.sidebar-project-chat-btn {
display: none;
background: none;
border: none;
padding: 0 0.15rem;
color: inherit;
opacity: 0.6;
cursor: pointer;
font-size: 0.8rem;
line-height: 1;
}
.sidebar-project-link:hover .sidebar-project-chat-btn {
display: flex;
align-items: center;
}
+374
View File
@@ -0,0 +1,374 @@
/* ── Tasks page ──────────────────────────────────────────────────────────────── */
.task-page {
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
width: 100%;
}
.task-page-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 20px;
min-height: 54px;
border-bottom: 1px solid var(--bs-border-color);
background: var(--bs-tertiary-bg);
flex-shrink: 0;
}
.task-page-title {
margin: 0;
font-weight: 700;
font-size: 1.05rem;
display: flex;
align-items: center;
gap: 8px;
}
/* ── Empty state ── */
.task-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
flex: 1;
padding: 40px;
color: var(--bs-secondary-color);
}
.task-empty i {
font-size: 2.5rem;
margin-bottom: 12px;
opacity: 0.5;
}
.task-empty p {
margin: 0;
font-size: 0.9rem;
}
.task-empty code {
font-size: 0.82rem;
}
/* ── Grid ── */
.task-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
gap: 16px;
padding: 20px;
align-content: start;
overflow-y: auto;
flex: 1;
}
/* ── Card ── */
.task-card {
display: flex;
flex-direction: column;
gap: 10px;
background: var(--bs-body-bg);
border: 1px solid var(--bs-border-color);
border-radius: 10px;
padding: 16px;
transition: border-color 0.15s, box-shadow 0.15s;
}
.task-card:hover {
border-color: var(--bs-primary-border-subtle, #9ec5fe);
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);
}
.task-card--disabled {
opacity: 0.6;
}
/* ── Card header ── */
.task-card-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 8px;
}
.task-card-title-row {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
min-width: 0;
}
.task-card-title {
font-weight: 600;
font-size: 0.92rem;
line-height: 1.3;
}
/* ── Badges ── */
.task-badge {
font-size: 0.62rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
padding: 0.15em 0.55em;
border-radius: 4px;
white-space: nowrap;
}
.task-badge--oneshot {
background: var(--bs-secondary-bg, #e9ecef);
color: var(--bs-secondary-color, #6c757d);
}
.task-badge--cron {
background: rgba(99, 102, 241, 0.12);
color: var(--bs-primary, #6366f1);
}
.task-badge--sync {
background: rgba(99, 102, 241, 0.12);
color: var(--bs-primary, #6366f1);
}
.task-badge--async {
background: rgba(34, 197, 94, 0.12);
color: #16a34a;
}
.task-badge--running {
background: rgba(34, 197, 94, 0.15);
color: #15803d;
}
.task-badge--idle {
background: var(--bs-secondary-bg, rgba(128,128,128,0.12));
color: var(--bs-secondary-color, #6c757d);
}
.task-badge--disabled {
background: rgba(220, 53, 69, 0.1);
color: var(--bs-danger, #dc3545);
}
.task-badge--pending {
background: rgba(13, 110, 253, 0.12);
color: var(--bs-primary, #0d6efd);
}
/* ── Delete button ── */
.task-card-delete {
display: inline-flex;
align-items: center;
justify-content: center;
width: 30px;
height: 30px;
border: none;
border-radius: 6px;
background: transparent;
color: var(--bs-danger, #dc3545);
opacity: 0.5;
cursor: pointer;
flex-shrink: 0;
transition: all 0.12s;
}
.task-card-delete:hover {
opacity: 1;
background: var(--bs-danger-bg-subtle, rgba(220,53,69,0.08));
}
/* ── Card description ── */
.task-card-desc {
font-size: 0.82rem;
color: var(--bs-secondary-color);
line-height: 1.4;
}
/* ── Cron expression box ── */
.task-card-expr {
display: flex;
align-items: flex-start;
gap: 8px;
background: var(--bs-tertiary-bg, rgba(0,0,0,0.02));
border: 1px solid var(--bs-border-color);
border-radius: 6px;
padding: 8px 10px;
}
.task-card-expr i {
color: var(--bs-primary, #0d6efd);
flex-shrink: 0;
margin-top: 2px;
}
.task-card-expr-text {
display: flex;
flex-direction: column;
gap: 3px;
min-width: 0;
}
.task-card-human {
font-size: 0.88rem;
font-weight: 500;
line-height: 1.35;
}
.task-card-raw {
font-family: var(--bs-font-monospace, monospace);
font-size: 0.7rem;
color: var(--bs-secondary-color);
word-break: break-all;
line-height: 1.3;
background: transparent;
padding: 0;
}
/* ── Meta info ── */
.task-card-meta {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4px 16px;
font-size: 0.78rem;
}
.task-card-meta-item {
display: flex;
flex-direction: column;
gap: 1px;
}
.task-card-meta-label {
font-size: 0.68rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--bs-secondary-color);
}
.task-card-meta-value {
color: var(--bs-body-color);
}
a.task-card-session-link {
color: var(--bs-primary);
text-decoration: none;
font-family: var(--bs-font-monospace);
}
a.task-card-session-link:hover {
text-decoration: underline;
}
.task-card-meta-item--full {
grid-column: 1 / -1;
}
.task-card-select {
font-size: 0.78rem;
padding: 2px 6px;
border: 1px solid var(--bs-border-color);
border-radius: 4px;
background: var(--bs-body-bg);
color: var(--bs-body-color);
cursor: pointer;
width: 100%;
max-width: 220px;
}
/* ── Card footer ── */
.task-card-footer {
display: flex;
align-items: center;
justify-content: flex-end;
padding-top: 6px;
border-top: 1px solid var(--bs-border-color);
margin-top: auto;
}
.task-card-toggle {
display: flex;
align-items: center;
gap: 6px;
cursor: pointer;
}
.task-card-toggle-label {
font-size: 0.78rem;
font-weight: 500;
user-select: none;
}
/* ── Running card highlight ── */
.task-card--running {
border-color: rgba(34, 197, 94, 0.4);
box-shadow: 0 0 0 1px rgba(34, 197, 94, 0.15);
}
.task-running-elapsed {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 10px;
background: rgba(34, 197, 94, 0.07);
border: 1px solid rgba(34, 197, 94, 0.2);
border-radius: 6px;
font-size: 0.92rem;
font-weight: 600;
color: #15803d;
}
.task-running-elapsed i {
font-size: 0.95rem;
}
.task-running-since {
font-size: 0.76rem;
font-weight: 400;
opacity: 0.7;
margin-left: auto;
}
/* ── Kill button ── */
.task-kill-btn {
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
width: 26px;
height: 26px;
padding: 0;
border: 1px solid rgba(220, 53, 69, 0.35);
border-radius: 5px;
background: transparent;
color: var(--bs-danger, #dc3545);
cursor: pointer;
font-size: 0.75rem;
transition: background 0.15s, border-color 0.15s, opacity 0.15s;
line-height: 1;
}
.task-kill-btn:hover:not(:disabled) {
background: rgba(220, 53, 69, 0.1);
border-color: var(--bs-danger, #dc3545);
}
.task-kill-btn:disabled {
opacity: 0.45;
cursor: not-allowed;
}
+83
View File
@@ -0,0 +1,83 @@
/* ── History table ──────────────────────────────────────────────────────────── */
.task-history-table-wrap {
flex: 1;
overflow-y: auto;
padding: 16px 20px;
}
.task-history-table {
width: 100%;
border-collapse: collapse;
font-size: 0.85rem;
}
.task-history-table thead th {
font-size: 0.68rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--bs-secondary-color);
padding: 6px 10px;
border-bottom: 1px solid var(--bs-border-color);
text-align: left;
white-space: nowrap;
background: var(--bs-tertiary-bg);
position: sticky;
top: 0;
z-index: 1;
}
.task-history-row {
cursor: pointer;
border-bottom: 1px solid var(--bs-border-color-translucent, rgba(0,0,0,0.06));
transition: background 0.1s;
}
.task-history-row:hover,
.task-history-row--expanded {
background: var(--bs-tertiary-bg);
}
.task-history-row td {
padding: 8px 10px;
vertical-align: middle;
}
.task-history-title {
font-weight: 500;
max-width: 220px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.task-history-chevron {
font-size: 0.72rem;
opacity: 0.5;
}
.task-history-detail td {
padding: 6px 10px 14px;
background: var(--bs-tertiary-bg);
}
.task-history-error {
font-size: 0.82rem;
color: var(--bs-danger, #dc3545);
margin-bottom: 6px;
}
.task-history-response pre {
font-size: 0.78rem;
white-space: pre-wrap;
word-break: break-word;
margin: 0;
max-height: 240px;
overflow-y: auto;
background: var(--bs-body-bg);
border: 1px solid var(--bs-border-color);
border-radius: 6px;
padding: 10px 12px;
line-height: 1.5;
}
+71
View File
@@ -0,0 +1,71 @@
/* ── Top navigation bar ────────────────────────────────────────────────────── */
app-topbar {
display: flex;
align-items: center;
height: var(--topbar-height);
background: var(--sidebar-bg);
border-bottom: 1px solid var(--sidebar-divider);
padding: 0 1rem;
flex-shrink: 0;
user-select: none;
}
.topbar-title {
font-size: 0.8rem;
font-weight: 600;
color: var(--sidebar-brand-color);
letter-spacing: 0.02em;
}
.topbar-spacer {
flex: 1;
}
.topbar-theme-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
border: none;
border-radius: 5px;
background: transparent;
color: var(--sidebar-text);
cursor: pointer;
transition: color 0.15s, background 0.15s;
padding: 0;
}
.topbar-theme-btn:hover {
color: var(--sidebar-text-active);
background: var(--sidebar-hover);
}
.topbar-theme-btn i {
font-size: 0.85rem;
}
.topbar-copilot-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
border: none;
border-radius: 5px;
background: transparent;
color: #6366f1;
cursor: pointer;
transition: color 0.15s, background 0.15s;
padding: 0;
margin-right: 0.25rem;
}
.topbar-copilot-btn:hover {
background: var(--sidebar-hover);
}
.topbar-copilot-btn i {
font-size: 0.9rem;
}
+131
View File
@@ -0,0 +1,131 @@
/* ── Layout variables ──────────────────────────────────────────────────────── */
:root {
--topbar-height: 32px;
--sidebar-width: 220px;
--copilot-width: 420px;
/* Brand accent */
--accent: #6366f1;
--accent-hover: #4f46e5;
/* Sidebar — indigo, dark in both modes */
--sidebar-bg: #1a1740;
--sidebar-hover: rgba(255, 255, 255, 0.06);
--sidebar-active-bg: rgba(99, 102, 241, 0.22);
--sidebar-label-color: #4a4880;
--sidebar-text: #9b99d4;
--sidebar-text-active: #e0e7ff;
--sidebar-divider: rgba(255, 255, 255, 0.07);
--sidebar-brand-color: #e0e7ff;
/* Main area — light mode */
--toolbar-border: #e2e8f0;
--placeholder-color: #94a3b8;
--copilot-bg: #f8fafc;
/* Copilot messages — light mode */
--msg-assistant-bg: #e8ecf8;
--msg-assistant-text: #1e293b;
--msg-user-bg: #6366f1;
--msg-user-text: #ffffff;
/* Card surfaces */
--card-bg: #ffffff;
--card-border: #dde1f0;
--card-shadow: 0 1px 3px rgba(99, 102, 241, 0.08), 0 1px 2px rgba(0, 0, 0, 0.05);
--card-radius: 3px;
/* Bootstrap overrides */
--bs-primary: #6366f1;
--bs-primary-rgb: 99, 102, 241;
--bs-link-color: #6366f1;
--bs-link-color-rgb: 99, 102, 241;
--bs-body-bg: #eef0f8;
--bs-body-bg-rgb: 238, 240, 248;
--bs-secondary-bg: #e4e7f2;
--bs-tertiary-bg: #f4f5fb;
--bs-border-color: #dde1f0;
}
[data-bs-theme="dark"] {
--sidebar-bg: #0e0c22;
--sidebar-hover: rgba(255, 255, 255, 0.05);
--sidebar-active-bg: rgba(99, 102, 241, 0.18);
--sidebar-label-color: #2a2860;
--sidebar-text: #6360b8;
--sidebar-text-active: #c7d2fe;
--sidebar-divider: rgba(255, 255, 255, 0.06);
--sidebar-brand-color: #c7d2fe;
--toolbar-border: #1e1b3a;
--placeholder-color: #4a4880;
--copilot-bg: #13112a;
--msg-assistant-bg: #1a1830;
--msg-assistant-text: #c7d2fe;
--msg-user-bg: #4f46e5;
--msg-user-text: #ffffff;
--bs-primary: #818cf8;
--bs-primary-rgb: 129, 140, 248;
--bs-link-color: #818cf8;
--bs-link-color-rgb: 129, 140, 248;
--bs-body-bg: #111128;
--bs-body-bg-rgb: 17, 17, 40;
--bs-secondary-bg: #1a1838;
--bs-tertiary-bg: #1e1c3e;
--bs-border-color: #2a2850;
/* Card surfaces — dark mode */
--card-bg: #1d1b3e;
--card-border: #2e2b58;
--card-shadow: 0 2px 10px rgba(0, 0, 0, 0.5), 0 1px 3px rgba(0, 0, 0, 0.4);
}
/* ── Reset ─────────────────────────────────────────────────────────────────── */
*,
*::before,
*::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family: 'Inter', var(--bs-font-sans-serif);
font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11';
}
/* ── Root layout ───────────────────────────────────────────────────────────── */
#app {
display: flex;
flex-direction: column;
height: 100vh;
overflow: hidden;
}
.app-body {
display: flex;
flex: 1;
overflow: hidden;
}
/* ── Global card surface ────────────────────────────────────────────────────── */
.agent-card,
.llm-card,
.model-card,
.models-type-card,
.inbox-card,
.approval-card,
.clarification-card,
.approval-rule-card,
.task-card {
background: var(--card-bg) !important;
border-color: var(--card-border) !important;
border-radius: var(--card-radius) !important;
box-shadow: var(--card-shadow) !important;
}