Files
Claude-Code-Workflow/ccw/src/templates/dashboard-css/07-managers.css

2108 lines
37 KiB
CSS

/* ==========================================
REFRESH BUTTON
========================================== */
.refresh-btn {
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s ease;
}
.refresh-btn:hover {
background: hsl(var(--muted));
}
.refresh-btn.refreshing svg {
animation: spin 1s linear infinite;
}
.refresh-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* ==========================================
MCP MANAGER STYLES
========================================== */
.mcp-manager {
width: 100%;
}
.mcp-section {
margin-bottom: 2rem;
width: 100%;
}
.mcp-server-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1rem;
width: 100%;
}
.mcp-server-card {
position: relative;
}
.mcp-server-card.opacity-60 {
opacity: 0.6;
}
.mcp-server-available {
border-style: dashed;
}
.mcp-server-available:hover {
border-style: solid;
}
/* MCP Toggle Switch */
.mcp-toggle {
position: relative;
display: inline-flex;
align-items: center;
}
.mcp-toggle input {
position: absolute;
opacity: 0;
width: 0;
height: 0;
}
.mcp-toggle > div {
width: 36px;
height: 20px;
background: hsl(var(--muted));
border-radius: 10px;
position: relative;
transition: background 0.2s;
}
.mcp-toggle > div::after {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: 16px;
height: 16px;
background: white;
border-radius: 50%;
transition: transform 0.2s;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
}
.mcp-toggle input:checked + div {
background: hsl(var(--success));
}
.mcp-toggle input:checked + div::after {
transform: translateX(16px);
}
.mcp-toggle input:focus + div {
box-shadow: 0 0 0 2px hsl(var(--primary) / 0.2);
}
/* MCP Projects List */
.mcp-projects-list {
max-height: 400px;
overflow-y: auto;
}
.mcp-project-item {
transition: background 0.15s;
}
.mcp-project-item:hover {
background: hsl(var(--hover));
}
.mcp-project-item.bg-primary-light {
background: hsl(var(--primary-light));
}
/* MCP Empty State */
.mcp-empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 120px;
}
/* MCP Server Details */
.mcp-server-details {
font-size: 0.875rem;
}
.mcp-server-details .font-mono {
font-family: var(--font-mono);
}
/* MCP Projects Table */
.mcp-projects-table {
overflow-x: auto;
}
.mcp-projects-table table {
border-collapse: collapse;
min-width: 100%;
}
.mcp-projects-table th {
white-space: nowrap;
}
.mcp-projects-table td {
vertical-align: middle;
}
.mcp-projects-table tr:hover {
background-color: hsl(var(--hover));
}
.mcp-projects-table .bg-primary-light\/30 {
background-color: hsl(var(--primary) / 0.08);
}
/* MCP Create Modal */
.mcp-modal {
animation: fadeIn 0.15s ease-out;
}
.mcp-modal-backdrop {
animation: fadeIn 0.15s ease-out;
}
.mcp-modal-content {
animation: slideUp 0.2s ease-out;
}
.mcp-modal.hidden {
display: none;
}
.mcp-modal .form-group label {
display: block;
margin-bottom: 0.25rem;
}
.mcp-modal input,
.mcp-modal textarea {
transition: border-color 0.15s, box-shadow 0.15s;
}
.mcp-modal input:focus,
.mcp-modal textarea:focus {
border-color: hsl(var(--primary));
box-shadow: 0 0 0 2px hsl(var(--primary) / 0.2);
}
/* MCP Tab Buttons */
.mcp-tab-btn {
cursor: pointer;
transition: all 0.2s;
color: hsl(var(--muted-foreground));
}
.mcp-tab-btn.active {
background: hsl(var(--background));
color: hsl(var(--foreground));
font-weight: 500;
}
.mcp-tab-btn:hover:not(.active) {
color: hsl(var(--foreground));
}
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
/* ==========================================
HOOK MANAGER STYLES
========================================== */
.hook-manager {
width: 100%;
}
.hook-section {
margin-bottom: 2rem;
width: 100%;
}
.hook-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 1rem;
width: 100%;
}
.hook-card {
position: relative;
}
.hook-details {
font-size: 0.875rem;
}
.hook-details .font-mono {
font-family: var(--font-mono);
}
.hook-templates-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1rem;
}
.hook-template-card {
transition: all 0.2s ease;
}
.hook-template-card:hover {
box-shadow: 0 4px 12px rgb(0 0 0 / 0.1);
}
/* Hook Empty State */
.hook-empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 120px;
}
/* Hook Modal */
.hook-modal {
animation: fadeIn 0.15s ease-out;
}
.hook-modal-backdrop {
animation: fadeIn 0.15s ease-out;
}
.hook-modal-content {
animation: slideUp 0.2s ease-out;
}
.hook-modal.hidden {
display: none;
}
.hook-modal .form-group label {
display: block;
margin-bottom: 0.25rem;
}
.hook-modal input,
.hook-modal textarea,
.hook-modal select {
transition: border-color 0.15s, box-shadow 0.15s;
}
.hook-modal input:focus,
.hook-modal textarea:focus,
.hook-modal select:focus {
border-color: hsl(var(--primary));
box-shadow: 0 0 0 2px hsl(var(--primary) / 0.2);
}
.hook-template-btn {
transition: all 0.15s ease;
}
.hook-template-btn:hover {
background: hsl(var(--hover));
border-color: hsl(var(--primary));
}
/* ==========================================
STATS SECTION & CAROUSEL
========================================== */
.stats-section {
min-height: 180px;
}
.stats-metrics {
width: 300px;
}
.stats-carousel {
position: relative;
}
.carousel-header {
height: 40px;
}
.carousel-btn {
transition: all 0.15s;
}
.carousel-btn:hover {
background: hsl(var(--hover));
}
/* Carousel dots indicator */
.carousel-dots {
display: flex;
align-items: center;
gap: 6px;
}
.carousel-dot {
cursor: pointer;
border: none;
padding: 0;
transition: all 0.2s ease;
}
.carousel-dot:focus {
outline: none;
box-shadow: 0 0 0 2px hsl(var(--primary) / 0.3);
}
.carousel-footer {
flex-shrink: 0;
}
.carousel-content {
position: relative;
overflow: hidden;
}
.carousel-slide {
position: absolute;
inset: 0;
}
.carousel-empty {
position: absolute;
inset: 0;
}
/* Carousel slide animations */
.carousel-fade-in {
animation: carouselFadeIn 0.3s ease-out forwards;
}
.carousel-slide-left {
animation: carouselSlideLeft 0.35s ease-out forwards;
}
.carousel-slide-right {
animation: carouselSlideRight 0.35s ease-out forwards;
}
@keyframes carouselFadeIn {
from {
opacity: 0;
transform: scale(0.98);
}
to {
opacity: 1;
transform: scale(1);
}
}
@keyframes carouselSlideLeft {
from {
opacity: 0;
transform: translateX(100%);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes carouselSlideRight {
from {
opacity: 0;
transform: translateX(-100%);
}
to {
opacity: 1;
transform: translateX(0);
}
}
/* Task card in carousel */
.carousel-slide .task-card {
height: 100%;
display: flex;
flex-direction: column;
}
.carousel-slide .task-timestamps {
flex-grow: 1;
}
.carousel-slide .task-session-info {
margin-top: auto;
}
/* Task status badge pulse for in_progress */
.task-status-badge {
transition: all 0.2s;
}
.bg-warning-light .task-status-badge {
animation: statusPulse 2s ease-in-out infinite;
}
@keyframes statusPulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.7;
}
}
/* Task highlight animation when navigating from carousel */
.task-highlight {
animation: taskHighlight 0.5s ease-out 3;
}
@keyframes taskHighlight {
0%, 100% {
background: transparent;
box-shadow: none;
}
50% {
background: hsl(var(--primary-light));
box-shadow: 0 0 0 3px hsl(var(--primary) / 0.3);
}
}
/* Line clamp utility */
.line-clamp-1 {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
}
.line-clamp-2 {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.line-clamp-3 {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* Highlight pulse effect */
.highlight-pulse {
animation: highlightPulse 0.5s ease-out 2;
}
@keyframes highlightPulse {
0%, 100% {
box-shadow: none;
}
50% {
box-shadow: 0 0 0 3px hsl(var(--primary) / 0.3);
}
}
/* ==========================================
NOTIFICATION BUBBLES
========================================== */
.notification-bubble {
position: fixed;
top: 70px;
right: 20px;
max-width: 280px;
padding: 8px 12px;
background: hsl(var(--card));
border: 1px solid hsl(var(--border));
border-radius: 6px;
box-shadow: 0 4px 12px rgb(0 0 0 / 0.12);
z-index: 1000;
display: flex;
align-items: center;
gap: 6px;
opacity: 0;
transform: translateX(100%);
transition: all 0.3s ease-out;
}
.notification-bubble.show {
opacity: 1;
transform: translateX(0);
}
.notification-bubble.fade-out {
opacity: 0;
transform: translateX(100%);
}
.notification-bubble:nth-child(2) {
top: 130px;
}
.notification-bubble:nth-child(3) {
top: 190px;
}
.notification-content {
display: flex;
align-items: center;
gap: 8px;
flex: 1;
}
.notification-icon {
font-size: 1rem;
}
.notification-message {
font-size: 0.8125rem;
color: hsl(var(--foreground));
flex: 1;
}
.notification-action {
padding: 4px 12px;
background: hsl(var(--primary));
color: hsl(var(--primary-foreground));
border: none;
border-radius: 4px;
font-size: 0.75rem;
font-weight: 500;
cursor: pointer;
transition: opacity 0.15s;
}
.notification-action:hover {
opacity: 0.9;
}
.notification-close {
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
background: transparent;
border: none;
color: hsl(var(--muted-foreground));
font-size: 1.25rem;
cursor: pointer;
border-radius: 4px;
transition: all 0.15s;
}
.notification-close:hover {
background: hsl(var(--hover));
color: hsl(var(--foreground));
}
/* Notification types */
.notification-success {
border-left: 3px solid hsl(var(--success));
}
.notification-warning {
border-left: 3px solid hsl(var(--warning));
}
.notification-error {
border-left: 3px solid hsl(var(--destructive));
}
.notification-info {
border-left: 3px solid hsl(var(--primary));
}
/* Responsive stats section */
@media (max-width: 768px) {
.stats-section {
flex-direction: column;
}
.stats-metrics {
width: 100%;
grid-template-columns: repeat(4, 1fr);
}
.stats-carousel {
min-height: 160px;
}
}
/* Exploration Object Rendering - Theme Compatible */
.exp-object {
display: flex;
flex-direction: column;
gap: 8px;
padding: 12px;
background: hsl(var(--muted));
border-radius: 8px;
border: 1px solid hsl(var(--border));
}
.exp-obj-field {
display: flex;
flex-wrap: wrap;
gap: 6px;
align-items: flex-start;
font-size: 13px;
line-height: 1.5;
}
.exp-obj-key {
font-weight: 600;
color: hsl(var(--muted-foreground));
min-width: 120px;
}
.exp-obj-val {
color: hsl(var(--foreground));
flex: 1;
}
.exp-obj-nested {
margin-left: 16px;
padding: 8px;
border-left: 2px solid hsl(var(--border));
}
.exp-obj-nested > .exp-obj-key {
display: block;
margin-bottom: 8px;
color: hsl(var(--primary));
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.exp-list {
margin: 4px 0 0 0;
padding-left: 20px;
list-style: disc;
}
.exp-list li {
font-size: 13px;
color: hsl(var(--foreground));
line-height: 1.6;
margin-bottom: 4px;
}
.exp-array-objects {
display: flex;
flex-direction: column;
gap: 10px;
}
.exp-object-item {
padding: 10px;
background: hsl(var(--card));
border-radius: 6px;
border: 1px solid hsl(var(--border));
}
.clarification-impact {
font-size: 12px;
color: hsl(var(--muted-foreground));
margin-top: 6px;
}
.priority-badge {
display: inline-block;
padding: 2px 8px;
border-radius: 4px;
font-size: 11px;
font-weight: 500;
text-transform: uppercase;
}
.priority-badge.priority-high {
background: hsl(var(--destructive) / 0.15);
color: hsl(var(--destructive));
}
.priority-badge.priority-medium {
background: hsl(var(--warning-light));
color: hsl(var(--warning));
}
.priority-badge.priority-low {
background: hsl(var(--success-light));
color: hsl(var(--success));
}
/* Conflict Tab Styles - Theme Compatible */
.conflict-tab-content {
padding: 16px;
}
.conflict-tab-header {
margin-bottom: 24px;
}
.conflict-tab-header h3 {
font-size: 18px;
font-weight: 600;
color: hsl(var(--foreground));
margin: 0 0 8px 0;
}
.conflict-meta-info {
display: flex;
gap: 16px;
font-size: 13px;
color: hsl(var(--muted-foreground));
}
.conflict-meta-info strong {
color: hsl(var(--foreground));
}
.conflict-section-title {
font-size: 15px;
font-weight: 600;
color: hsl(var(--foreground));
margin: 24px 0 12px 0;
padding-bottom: 8px;
border-bottom: 1px solid hsl(var(--border));
}
.conflict-cards-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 16px;
}
.conflict-card {
background: hsl(var(--card));
border: 1px solid hsl(var(--border));
border-radius: 12px;
padding: 16px;
transition: box-shadow 0.2s ease, border-color 0.2s ease;
}
.conflict-card:hover {
box-shadow: 0 4px 12px hsl(var(--foreground) / 0.08);
border-color: hsl(var(--primary));
}
.decision-card {
border-left: 3px solid hsl(var(--primary));
}
.resolved-card {
border-left: 3px solid hsl(var(--success));
}
.conflict-card-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
.conflict-card-label {
font-size: 14px;
font-weight: 600;
color: hsl(var(--foreground));
}
.conflict-card-id {
font-size: 13px;
font-weight: 600;
color: hsl(var(--primary));
font-family: monospace;
}
.conflict-category-tag {
padding: 3px 8px;
background: hsl(var(--muted));
color: hsl(var(--muted-foreground));
border-radius: 4px;
font-size: 11px;
font-weight: 500;
}
.conflict-card-choice {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 10px;
padding: 10px 12px;
background: hsl(var(--primary-light));
border-radius: 8px;
}
.choice-label {
font-size: 12px;
color: hsl(var(--muted-foreground));
}
.choice-value {
font-size: 14px;
font-weight: 600;
color: hsl(var(--primary));
}
.conflict-card-desc {
font-size: 13px;
color: hsl(var(--muted-foreground));
line-height: 1.5;
margin-bottom: 10px;
}
.conflict-card-brief {
font-size: 13px;
color: hsl(var(--foreground));
line-height: 1.5;
margin-bottom: 12px;
}
.conflict-card-implications {
margin-top: 10px;
padding-top: 10px;
border-top: 1px solid hsl(var(--border));
}
.conflict-card-implications .impl-label {
display: block;
font-size: 11px;
font-weight: 600;
color: hsl(var(--muted-foreground));
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 6px;
}
.conflict-card-implications ul {
margin: 0;
padding-left: 18px;
}
.conflict-card-implications li {
font-size: 12px;
color: hsl(var(--muted-foreground));
line-height: 1.5;
margin-bottom: 4px;
}
.conflict-card-strategy {
display: flex;
align-items: center;
gap: 8px;
margin-top: 12px;
padding-top: 12px;
border-top: 1px solid hsl(var(--border));
}
.conflict-card-strategy .strategy-label {
font-size: 12px;
color: hsl(var(--muted-foreground));
}
.strategy-tag {
padding: 4px 10px;
background: hsl(var(--success-light));
color: hsl(var(--success));
border-radius: 6px;
font-size: 12px;
font-weight: 500;
}
/* ==========================================
NOTIFICATION SIDEBAR (Right-Side Toolbar)
========================================== */
/* Sidebar Container - Compact floating panel */
.notif-sidebar {
position: fixed;
top: 60px;
right: 16px;
width: 320px;
max-width: 90vw;
max-height: 70vh;
background: hsl(var(--card));
border: 1px solid hsl(var(--border));
border-radius: 8px;
box-shadow: 0 8px 24px rgb(0 0 0 / 0.15);
z-index: 1100;
display: flex;
flex-direction: column;
transform: translateX(calc(100% + 20px));
opacity: 0;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.notif-sidebar.open {
transform: translateX(0);
opacity: 1;
}
/* Sidebar Header */
.notif-sidebar-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 14px;
border-bottom: 1px solid hsl(var(--border));
background: hsl(var(--muted) / 0.3);
border-radius: 8px 8px 0 0;
}
.notif-sidebar-title {
display: flex;
align-items: center;
gap: 8px;
font-size: 0.875rem;
font-weight: 600;
color: hsl(var(--foreground));
}
.notif-title-icon {
font-size: 1rem;
}
.notif-count-badge {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 18px;
height: 18px;
padding: 0 5px;
background: hsl(var(--primary));
color: hsl(var(--primary-foreground));
border-radius: 9px;
font-size: 0.6875rem;
font-weight: 600;
}
.notif-sidebar-close {
display: flex;
align-items: center;
justify-content: center;
width: 26px;
height: 26px;
background: transparent;
border: none;
border-radius: 4px;
color: hsl(var(--muted-foreground));
cursor: pointer;
transition: all 0.15s;
}
.notif-sidebar-close:hover {
background: hsl(var(--hover));
color: hsl(var(--foreground));
}
/* Sidebar Actions */
.notif-sidebar-actions {
display: flex;
gap: 6px;
padding: 8px 14px;
border-bottom: 1px solid hsl(var(--border));
background: hsl(var(--background));
}
.notif-action-btn {
display: flex;
align-items: center;
gap: 4px;
padding: 4px 10px;
background: hsl(var(--card));
border: 1px solid hsl(var(--border));
border-radius: 4px;
font-size: 0.75rem;
color: hsl(var(--muted-foreground));
cursor: pointer;
transition: all 0.15s;
}
.notif-action-btn:hover {
background: hsl(var(--hover));
color: hsl(var(--foreground));
border-color: hsl(var(--primary) / 0.5);
}
/* Sidebar Content */
.notif-sidebar-content {
flex: 1;
overflow-y: auto;
padding: 8px;
}
/* Empty State */
.notif-empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 32px 16px;
text-align: center;
}
.notif-empty-icon {
font-size: 2rem;
opacity: 0.3;
margin-bottom: 12px;
}
.notif-empty-text {
font-size: 0.875rem;
font-weight: 500;
color: hsl(var(--muted-foreground));
margin-bottom: 4px;
}
.notif-empty-hint {
font-size: 0.75rem;
color: hsl(var(--muted-foreground) / 0.7);
}
/* Notification Settings */
.notif-sidebar-settings {
padding: 8px 12px;
border-bottom: 1px solid hsl(var(--border));
background: hsl(var(--muted) / 0.3);
}
.notif-setting-item {
display: flex;
align-items: center;
gap: 8px;
cursor: pointer;
font-size: 0.75rem;
color: hsl(var(--muted-foreground));
}
.notif-setting-item input[type="checkbox"] {
width: 14px;
height: 14px;
cursor: pointer;
accent-color: hsl(var(--primary));
}
.notif-setting-label {
display: flex;
align-items: center;
gap: 6px;
}
.notif-setting-label svg {
opacity: 0.7;
}
/* Notification Items */
.notif-item {
padding: 8px 10px;
background: hsl(var(--card));
border: 1px solid hsl(var(--border));
border-radius: 6px;
margin-bottom: 6px;
transition: all 0.15s;
cursor: default;
}
.notif-item.has-details {
cursor: pointer;
}
.notif-item:hover {
border-color: hsl(var(--primary) / 0.3);
box-shadow: 0 2px 8px rgb(0 0 0 / 0.06);
}
.notif-item.read {
opacity: 0.7;
}
.notif-item.type-info {
border-left: 3px solid hsl(var(--primary));
}
.notif-item.type-success {
border-left: 3px solid hsl(var(--success));
}
.notif-item.type-warning {
border-left: 3px solid hsl(var(--warning));
}
.notif-item.type-error {
border-left: 3px solid hsl(var(--destructive));
}
.notif-item-header {
display: flex;
align-items: flex-start;
gap: 8px;
}
.notif-icon {
font-size: 0.9375rem;
flex-shrink: 0;
}
.notif-item-content {
flex: 1;
min-width: 0;
}
.notif-message {
display: block;
font-size: 0.8125rem;
font-weight: 500;
color: hsl(var(--foreground));
line-height: 1.3;
word-break: break-word;
}
.notif-source {
display: inline-block;
margin-top: 3px;
padding: 1px 6px;
background: hsl(var(--muted));
border-radius: 3px;
font-size: 0.625rem;
color: hsl(var(--muted-foreground));
font-family: var(--font-mono);
}
/* Expand Icon */
.notif-expand-icon {
flex-shrink: 0;
font-size: 0.625rem;
color: hsl(var(--muted-foreground));
opacity: 0.6;
transition: transform 0.2s;
}
.notif-item.expanded .notif-expand-icon {
transform: rotate(0deg);
}
/* Details Hint (collapsed state) */
.notif-details-hint {
margin-top: 4px;
font-size: 0.6875rem;
color: hsl(var(--muted-foreground));
opacity: 0.7;
font-style: italic;
}
/* Expanded Details */
.notif-details-expanded {
max-height: 300px;
overflow-y: auto;
}
/* Notification Details */
.notif-details {
margin-top: 6px;
padding: 6px 8px;
background: hsl(var(--muted) / 0.5);
border-radius: 4px;
font-size: 0.75rem;
color: hsl(var(--muted-foreground));
line-height: 1.4;
white-space: pre-wrap;
word-break: break-word;
font-family: var(--font-mono);
}
/* JSON Formatted Details */
.notif-details-json {
margin-top: 6px;
padding: 6px 8px;
background: hsl(var(--muted) / 0.5);
border-radius: 4px;
font-size: 0.75rem;
line-height: 1.4;
font-family: var(--font-mono);
}
.json-field {
padding: 2px 0;
}
.json-key {
color: hsl(var(--primary));
font-weight: 500;
}
.json-value {
color: hsl(var(--foreground));
}
.json-string {
color: hsl(142 71% 45%);
}
.json-number {
color: hsl(217 91% 60%);
}
.json-bool {
color: hsl(280 65% 60%);
}
.json-null {
color: hsl(var(--muted-foreground));
font-style: italic;
}
.json-object {
color: hsl(var(--muted-foreground));
}
.json-empty {
color: hsl(var(--muted-foreground));
font-style: italic;
}
.json-more {
color: hsl(var(--muted-foreground));
font-style: italic;
padding-top: 4px;
}
.json-array-item {
padding: 2px 0;
}
.json-index {
color: hsl(var(--muted-foreground));
font-size: 0.75rem;
margin-right: 6px;
}
/* Notification Meta */
.notif-meta {
margin-top: 6px;
padding-top: 6px;
border-top: 1px solid hsl(var(--border) / 0.5);
}
.notif-time {
font-size: 0.6875rem;
color: hsl(var(--muted-foreground));
}
/* Toggle Button (Right Edge) */
.notif-sidebar-toggle {
position: fixed;
top: 50%;
right: 0;
transform: translateY(-50%);
width: 40px;
height: 64px;
background: hsl(var(--card));
border: 1px solid hsl(var(--border));
border-right: none;
border-radius: 8px 0 0 8px;
box-shadow: -2px 0 8px rgb(0 0 0 / 0.1);
cursor: pointer;
z-index: 1050;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 4px;
transition: all 0.2s;
}
.notif-sidebar-toggle:hover {
width: 48px;
background: hsl(var(--hover));
}
.notif-sidebar-toggle.hidden {
transform: translateY(-50%) translateX(100%);
opacity: 0;
pointer-events: none;
}
.toggle-icon {
font-size: 1.25rem;
}
.toggle-badge {
display: none;
min-width: 18px;
height: 18px;
padding: 0 5px;
background: hsl(var(--destructive));
color: white;
border-radius: 9px;
font-size: 0.6875rem;
font-weight: 600;
align-items: center;
justify-content: center;
}
.toggle-badge[style*="display: flex"] {
display: flex;
}
/* Overlay */
.notif-sidebar-overlay {
position: fixed;
inset: 0;
background: rgb(0 0 0 / 0.4);
z-index: 1090;
opacity: 0;
visibility: hidden;
transition: all 0.3s;
}
.notif-sidebar-overlay.show {
opacity: 1;
visibility: visible;
}
/* Toast Notification */
.notif-toast {
position: fixed;
bottom: 20px;
right: 20px;
display: flex;
align-items: center;
gap: 8px;
padding: 8px 14px;
background: hsl(var(--card));
border: 1px solid hsl(var(--border));
border-radius: 6px;
box-shadow: 0 4px 12px rgb(0 0 0 / 0.15);
z-index: 1200;
transform: translateY(100px);
opacity: 0;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
max-width: 280px;
}
.notif-toast.show {
transform: translateY(0);
opacity: 1;
}
.notif-toast.type-info {
border-left: 3px solid hsl(var(--primary));
}
.notif-toast.type-success {
border-left: 3px solid hsl(var(--success));
}
.notif-toast.type-warning {
border-left: 3px solid hsl(var(--warning));
}
.notif-toast.type-error {
border-left: 3px solid hsl(var(--destructive));
}
.toast-icon {
font-size: 1rem;
}
.toast-message {
font-size: 0.8125rem;
color: hsl(var(--foreground));
max-width: 220px;
line-height: 1.3;
}
/* Responsive */
@media (max-width: 480px) {
.notif-sidebar {
width: 100vw;
max-width: 100vw;
}
.notif-sidebar-toggle {
top: auto;
bottom: 80px;
transform: translateY(0);
}
.notif-sidebar-toggle.hidden {
transform: translateX(100%);
}
.notif-toast {
left: 16px;
right: 16px;
bottom: 16px;
}
.toast-message {
max-width: none;
}
}
/* ==========================================
TASK QUEUE SIDEBAR (Right-Side Toolbar)
========================================== */
/* Sidebar Container - Compact floating panel (matches notif-sidebar) */
.task-queue-sidebar {
position: fixed;
top: 60px;
right: 16px;
width: 360px;
max-width: 90vw;
max-height: 70vh;
background: hsl(var(--card));
border: 1px solid hsl(var(--border));
border-radius: 8px;
box-shadow: 0 8px 24px rgb(0 0 0 / 0.15);
z-index: 1100;
display: flex;
flex-direction: column;
transform: translateX(calc(100% + 20px));
opacity: 0;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.task-queue-sidebar.open {
transform: translateX(0);
opacity: 1;
}
/* Sidebar Header */
.task-queue-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 14px;
border-bottom: 1px solid hsl(var(--border));
background: hsl(var(--muted) / 0.3);
border-radius: 8px 8px 0 0;
}
.task-queue-title {
display: flex;
align-items: center;
gap: 10px;
font-size: 1rem;
font-weight: 600;
color: hsl(var(--foreground));
}
.task-queue-title-icon {
font-size: 1.25rem;
}
.task-queue-count-badge {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 22px;
height: 22px;
padding: 0 6px;
background: hsl(var(--primary));
color: hsl(var(--primary-foreground));
border-radius: 11px;
font-size: 0.75rem;
font-weight: 600;
}
.task-queue-close {
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
background: transparent;
border: none;
border-radius: 6px;
color: hsl(var(--muted-foreground));
cursor: pointer;
transition: all 0.15s;
}
.task-queue-close:hover {
background: hsl(var(--hover));
color: hsl(var(--foreground));
}
/* Filters */
.task-queue-filters {
display: flex;
gap: 6px;
padding: 12px 20px;
border-bottom: 1px solid hsl(var(--border));
background: hsl(var(--muted) / 0.3);
}
.task-filter-btn {
padding: 6px 12px;
background: transparent;
border: 1px solid hsl(var(--border));
border-radius: 6px;
font-size: 0.8125rem;
color: hsl(var(--muted-foreground));
cursor: pointer;
transition: all 0.15s;
}
.task-filter-btn:hover {
background: hsl(var(--hover));
color: hsl(var(--foreground));
}
.task-filter-btn.active {
background: hsl(var(--primary));
color: hsl(var(--primary-foreground));
border-color: hsl(var(--primary));
}
/* Sidebar Content */
.task-queue-content {
flex: 1;
overflow-y: auto;
padding: 12px;
}
/* Empty State */
.task-queue-empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 48px 24px;
text-align: center;
}
.task-queue-empty-icon {
font-size: 3rem;
opacity: 0.3;
margin-bottom: 16px;
}
.task-queue-empty-text {
font-size: 1rem;
font-weight: 500;
color: hsl(var(--muted-foreground));
margin-bottom: 8px;
}
.task-queue-empty-hint {
font-size: 0.8125rem;
color: hsl(var(--muted-foreground) / 0.7);
}
/* Task Queue Items */
.task-queue-item {
padding: 14px 16px;
background: hsl(var(--card));
border: 1px solid hsl(var(--border));
border-radius: 10px;
margin-bottom: 10px;
cursor: pointer;
transition: all 0.15s;
}
.task-queue-item:hover {
border-color: hsl(var(--primary) / 0.4);
box-shadow: 0 2px 8px rgb(0 0 0 / 0.08);
transform: translateX(-2px);
}
.task-queue-item.status-in_progress {
border-left: 4px solid hsl(var(--warning));
background: hsl(var(--warning) / 0.05);
}
.task-queue-item.status-pending {
border-left: 4px solid hsl(var(--muted-foreground));
}
.task-queue-item.status-completed {
border-left: 4px solid hsl(var(--success));
opacity: 0.7;
}
.task-queue-item.status-skipped {
border-left: 4px solid hsl(var(--muted-foreground) / 0.5);
opacity: 0.5;
}
.task-queue-item-header {
display: flex;
align-items: flex-start;
gap: 12px;
}
.task-queue-status-icon {
font-size: 1.25rem;
flex-shrink: 0;
margin-top: 2px;
}
.task-queue-item-info {
flex: 1;
min-width: 0;
}
.task-queue-item-title {
display: block;
font-size: 0.9rem;
font-weight: 500;
color: hsl(var(--foreground));
line-height: 1.4;
word-break: break-word;
}
.task-queue-item-id {
display: block;
font-size: 0.75rem;
color: hsl(var(--muted-foreground));
font-family: var(--font-mono);
margin-top: 4px;
}
.task-queue-item-meta {
display: flex;
align-items: center;
gap: 8px;
margin-top: 10px;
flex-wrap: wrap;
}
.task-queue-session-tag {
padding: 3px 8px;
background: hsl(var(--muted));
border-radius: 4px;
font-size: 0.6875rem;
color: hsl(var(--muted-foreground));
font-family: var(--font-mono);
max-width: 180px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.task-queue-type-badge {
padding: 3px 8px;
border-radius: 4px;
font-size: 0.6875rem;
font-weight: 500;
text-transform: uppercase;
}
.task-queue-type-badge.type-workflow {
background: hsl(var(--primary) / 0.15);
color: hsl(var(--primary));
}
.task-queue-type-badge.type-lite {
background: hsl(var(--success) / 0.15);
color: hsl(var(--success));
}
.task-queue-type-badge.type-tdd {
background: hsl(280 65% 60% / 0.15);
color: hsl(280 65% 60%);
}
.task-queue-type-badge.type-test {
background: hsl(var(--warning) / 0.15);
color: hsl(var(--warning));
}
.task-queue-item-scope {
margin-top: 8px;
padding: 6px 10px;
background: hsl(var(--muted) / 0.5);
border-radius: 6px;
}
.task-queue-item-scope code {
font-size: 0.75rem;
color: hsl(var(--muted-foreground));
font-family: var(--font-mono);
word-break: break-all;
}
/* Toggle Button (Below Notification Toggle) */
.task-queue-toggle {
position: fixed;
top: calc(50% + 40px);
right: 0;
transform: translateY(-50%);
width: 40px;
height: 64px;
background: hsl(var(--card));
border: 1px solid hsl(var(--border));
border-right: none;
border-radius: 8px 0 0 8px;
box-shadow: -2px 0 8px rgb(0 0 0 / 0.1);
cursor: pointer;
z-index: 1050;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 4px;
transition: all 0.2s;
}
.task-queue-toggle:hover {
width: 48px;
background: hsl(var(--hover));
}
.task-queue-toggle.hidden {
transform: translateY(-50%) translateX(100%);
opacity: 0;
pointer-events: none;
}
.task-queue-toggle .toggle-icon {
font-size: 1.25rem;
}
.task-queue-toggle .toggle-badge {
display: none;
min-width: 18px;
height: 18px;
padding: 0 5px;
background: hsl(var(--warning));
color: white;
border-radius: 9px;
font-size: 0.6875rem;
font-weight: 600;
align-items: center;
justify-content: center;
}
.task-queue-toggle .toggle-badge[style*="display: flex"] {
display: flex;
}
.task-queue-toggle .toggle-badge.has-active {
background: hsl(var(--warning));
animation: taskPulse 2s ease-in-out infinite;
}
@keyframes taskPulse {
0%, 100% {
transform: scale(1);
}
50% {
transform: scale(1.1);
}
}
/* Overlay */
.task-queue-overlay {
position: fixed;
inset: 0;
background: rgb(0 0 0 / 0.4);
z-index: 1090;
opacity: 0;
visibility: hidden;
transition: all 0.3s;
}
.task-queue-overlay.show {
opacity: 1;
visibility: visible;
}
/* Adjust notification toggle position to be above task toggle */
.notif-sidebar-toggle {
top: calc(50% - 40px);
}
/* Responsive for Task Queue */
@media (max-width: 480px) {
.task-queue-sidebar {
width: 100vw;
max-width: 100vw;
}
.task-queue-toggle {
top: auto;
bottom: 80px;
transform: translateY(0);
}
.task-queue-toggle.hidden {
transform: translateX(100%);
}
.notif-sidebar-toggle {
bottom: 150px;
}
}
/* ==========================================
UPDATE TASKS SECTION - In CLI Tab
========================================== */
/* Section Container */
.update-tasks-section {
border-bottom: 1px solid hsl(var(--border));
padding-bottom: 12px;
margin-bottom: 12px;
}
.update-tasks-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 12px;
margin-bottom: 8px;
}
.update-tasks-title {
font-size: 0.8125rem;
font-weight: 600;
color: hsl(var(--foreground));
}
.update-tasks-clear-btn {
width: 28px;
height: 28px;
border: none;
background: transparent;
color: hsl(var(--muted-foreground));
border-radius: 6px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.15s;
}
.update-tasks-clear-btn:hover {
background: hsl(var(--destructive) / 0.1);
color: hsl(var(--destructive));
}
.update-tasks-list {
padding: 0 12px;
}
.update-tasks-empty {
display: flex;
flex-direction: column;
align-items: center;
padding: 16px;
text-align: center;
color: hsl(var(--muted-foreground));
}
.update-tasks-empty span {
font-size: 0.8125rem;
font-weight: 500;
}
.update-tasks-empty p {
font-size: 0.75rem;
margin: 4px 0 0;
}
/* CLI History Section */
.cli-history-section {
padding-top: 4px;
}
.cli-history-header {
display: flex;
align-items: center;
padding: 8px 12px;
margin-bottom: 8px;
}
.cli-history-title {
font-size: 0.8125rem;
font-weight: 600;
color: hsl(var(--foreground));
}
.cli-history-list {
padding: 0 12px;
}
/* Individual Update Task Item */
.update-task-item {
background: hsl(var(--background));
border: 1px solid hsl(var(--border));
border-radius: 8px;
padding: 10px 12px;
margin-bottom: 8px;
transition: all 0.15s ease;
}
.update-task-item:last-child {
margin-bottom: 0;
}
.update-task-item.status-pending {
border-left: 3px solid hsl(var(--muted-foreground));
}
.update-task-item.status-running {
border-left: 3px solid hsl(var(--warning));
background: hsl(var(--warning) / 0.05);
}
.update-task-item.status-completed {
border-left: 3px solid hsl(var(--success));
background: hsl(var(--success) / 0.05);
opacity: 0.8;
}
.update-task-item.status-failed {
border-left: 3px solid hsl(var(--destructive));
background: hsl(var(--destructive) / 0.05);
}
.update-task-header {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 8px;
}
.update-task-status {
font-size: 14px;
flex-shrink: 0;
}
.update-task-item.status-running .update-task-status {
animation: spin 1s linear infinite;
}
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.update-task-name {
flex: 1;
font-size: 0.8125rem;
font-weight: 500;
color: hsl(var(--foreground));
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.update-task-strategy {
font-size: 14px;
flex-shrink: 0;
}
.update-task-controls {
display: flex;
align-items: center;
gap: 6px;
}
.update-task-cli-select {
height: 28px;
padding: 0 8px;
font-size: 0.75rem;
border: 1px solid hsl(var(--border));
border-radius: 6px;
background: hsl(var(--background));
color: hsl(var(--foreground));
cursor: pointer;
transition: all 0.15s;
}
.update-task-cli-select:hover:not(:disabled) {
border-color: hsl(var(--primary));
}
.update-task-cli-select:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.update-task-btn {
width: 28px;
height: 28px;
border: none;
border-radius: 6px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.15s;
}
.update-task-start {
background: hsl(var(--primary));
color: hsl(var(--primary-foreground));
}
.update-task-start:hover {
background: hsl(var(--primary) / 0.9);
transform: scale(1.05);
}
.update-task-remove {
background: transparent;
color: hsl(var(--muted-foreground));
}
.update-task-remove:hover {
background: hsl(var(--destructive) / 0.1);
color: hsl(var(--destructive));
}
.update-task-stop {
background: hsl(var(--warning));
color: white;
}
.update-task-stop:hover {
background: hsl(var(--warning) / 0.9);
}
.update-task-message {
font-size: 0.6875rem;
color: hsl(var(--muted-foreground));
margin-top: 6px;
padding-top: 6px;
border-top: 1px solid hsl(var(--border));
}