- Add a reusable ProjectNodeSelector component and hook RoutingTab to it for per-task node overrides - Move default node and unavailable-node policy controls into the dedicated Node Routing settings section - Add descriptive routing guidance text and project-level note in SettingsModal - Expand dashboard tests for routing tab behavior and node routing settings UX
164 lines
3.3 KiB
CSS
164 lines
3.3 KiB
CSS
/* === SettingsSyncLog === */
|
|
.settings-sync-log {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--space-sm);
|
|
}
|
|
|
|
.settings-sync-log__header {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: var(--space-xs);
|
|
cursor: pointer;
|
|
padding: var(--space-xs) 0;
|
|
border-radius: var(--radius-sm);
|
|
border: none;
|
|
background: transparent;
|
|
color: var(--text);
|
|
font: inherit;
|
|
text-align: left;
|
|
transition: background-color var(--transition-fast);
|
|
}
|
|
|
|
.settings-sync-log__header:hover {
|
|
background: var(--surface-hover);
|
|
}
|
|
|
|
.settings-sync-log__header:focus-visible {
|
|
outline: none;
|
|
box-shadow: var(--focus-ring-strong);
|
|
background: var(--surface-hover);
|
|
}
|
|
|
|
.settings-sync-log__chevron {
|
|
transform: rotate(0deg);
|
|
transition: transform var(--transition-fast);
|
|
}
|
|
|
|
.settings-sync-log__chevron--expanded {
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
.settings-sync-log__filters {
|
|
display: flex;
|
|
gap: var(--space-sm);
|
|
align-items: center;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.settings-sync-log__filters label {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: var(--space-xs);
|
|
font-size: 12px;
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
.settings-sync-log__filters select {
|
|
font-size: 12px;
|
|
padding: 4px 8px;
|
|
background: var(--surface);
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius-sm);
|
|
color: var(--text);
|
|
}
|
|
|
|
.settings-sync-log__filters select:focus {
|
|
outline: none;
|
|
border-color: var(--todo);
|
|
box-shadow: var(--focus-ring);
|
|
}
|
|
|
|
.settings-sync-log__list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
.settings-sync-log__entry {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: var(--space-sm);
|
|
padding: var(--space-xs) 0;
|
|
border-bottom: 1px solid var(--border);
|
|
}
|
|
|
|
.settings-sync-log__entry:last-child {
|
|
border-bottom: none;
|
|
}
|
|
|
|
.settings-sync-log__entry-timestamp {
|
|
font-size: 12px;
|
|
color: var(--text-muted);
|
|
min-width: 140px;
|
|
}
|
|
|
|
.settings-sync-log__entry-direction {
|
|
display: flex;
|
|
align-items: center;
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
.settings-sync-log__entry-result {
|
|
display: inline-flex;
|
|
padding: 2px 8px;
|
|
border-radius: 999px;
|
|
font-size: 11px;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.settings-sync-log__badge--success {
|
|
background: color-mix(in srgb, var(--color-success, #2da44e) 14%, transparent);
|
|
color: var(--color-success, #2da44e);
|
|
}
|
|
|
|
.settings-sync-log__badge--conflict {
|
|
background: color-mix(in srgb, #d29922 14%, transparent);
|
|
color: #d29922;
|
|
}
|
|
|
|
.settings-sync-log__badge--error {
|
|
background: color-mix(in srgb, var(--color-error, #cf222e) 14%, transparent);
|
|
color: var(--color-error, #cf222e);
|
|
}
|
|
|
|
.settings-sync-log__entry-node {
|
|
font-weight: 500;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.settings-sync-log__entry-details {
|
|
font-size: 12px;
|
|
color: var(--text-muted);
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
flex: 1;
|
|
}
|
|
|
|
.settings-sync-log__empty {
|
|
text-align: center;
|
|
color: var(--text-muted);
|
|
padding: var(--space-md);
|
|
font-size: 13px;
|
|
}
|
|
|
|
.node-badge {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
padding: 2px 8px;
|
|
border-radius: 999px;
|
|
background: color-mix(in srgb, var(--accent) 14%, transparent);
|
|
border: 1px solid color-mix(in srgb, var(--accent) 36%, transparent);
|
|
color: var(--text-muted);
|
|
font-size: 11px;
|
|
width: fit-content;
|
|
margin-top: 4px;
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.settings-sync-conflict-modal__diff-panel {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
}
|
|
|