Files
metabuilder/scss/components/conflict-features.scss
2026-03-09 22:30:41 +00:00

896 lines
19 KiB
SCSS

// Conflict resolution feature components — BEM with MD3 CSS custom properties
// Covers: conflict-card, conflict-indicator, conflict-stats, github-status,
// error-panel, demo-header, demo-stats-row, info-section
// ─── Conflict Card ──────────────────────────────────────────────────────────
.conflict-card {
background: var(--mat-sys-surface-container);
border: 1px solid color-mix(in srgb, var(--mat-sys-error) 30%, transparent);
border-radius: 8px;
transition: border-color 0.15s ease;
&:hover {
border-color: color-mix(in srgb, var(--mat-sys-error) 50%, transparent);
}
&--resolved {
border-color: color-mix(in srgb, var(--mat-sys-primary) 30%, transparent);
opacity: 0.7;
&:hover {
border-color: color-mix(in srgb, var(--mat-sys-primary) 50%, transparent);
}
}
&__header {
padding: 12px 16px 12px;
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
}
&__header-content {
display: flex;
align-items: flex-start;
gap: 12px;
flex: 1;
min-width: 0;
}
&__entity-icon {
margin-top: 2px;
color: var(--mat-sys-primary);
&--remote {
color: var(--mat-sys-on-surface-variant);
}
}
&__info {
flex: 1;
min-width: 0;
}
&__title {
font-size: 14px;
font-weight: 500;
font-family: monospace;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
color: var(--mat-sys-on-surface);
margin: 0;
}
&__meta {
display: flex;
align-items: center;
gap: 8px;
margin-top: 4px;
}
&__time {
font-size: 11px;
color: var(--mat-sys-on-surface-variant);
}
&__body {
padding: 0 16px 16px;
display: flex;
flex-direction: column;
gap: 16px;
}
&__versions-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
}
&__version {
display: flex;
flex-direction: column;
gap: 8px;
}
&__version-header {
display: flex;
align-items: center;
gap: 8px;
}
&__version-label {
font-size: 13px;
font-weight: 500;
color: var(--mat-sys-on-surface);
margin: 0;
}
&__version-content {
background: color-mix(in srgb, var(--mat-sys-on-surface) 6%, transparent);
border-radius: 6px;
padding: 12px;
display: flex;
flex-direction: column;
gap: 4px;
}
&__version-time {
display: flex;
align-items: center;
gap: 6px;
font-size: 11px;
color: var(--mat-sys-on-surface-variant);
}
&__version-json {
font-size: 11px;
font-family: monospace;
overflow: hidden;
text-overflow: ellipsis;
color: var(--mat-sys-primary);
margin: 0;
&--remote {
color: var(--mat-sys-on-surface-variant);
}
}
&__actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
&__action-btn {
flex: 1;
min-width: 120px;
}
}
// ─── Conflict Indicator ─────────────────────────────────────────────────────
.conflict-indicator {
position: relative;
display: inline-flex;
align-items: center;
&__icon {
color: var(--mat-sys-error);
animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
&__count-bubble {
position: absolute;
top: -4px;
right: -4px;
background: var(--mat-sys-error);
color: var(--mat-sys-surface);
font-size: 10px;
font-weight: 700;
border-radius: 9999px;
width: 16px;
height: 16px;
display: flex;
align-items: center;
justify-content: center;
line-height: 1;
}
&__badge {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 3px 10px;
border-radius: 9999px;
font-size: 12px;
font-weight: 500;
background: var(--mat-sys-error);
color: var(--mat-sys-surface);
cursor: pointer;
transition: background-color 0.15s ease;
animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
&:hover {
background: color-mix(in srgb, var(--mat-sys-error) 85%, black);
}
}
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
// ─── Conflict Stats ─────────────────────────────────────────────────────────
.conflict-stats {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16px;
@media (max-width: 768px) {
grid-template-columns: 1fr;
}
&__card {
background: var(--mat-sys-surface-container);
border: 1px solid var(--mat-sys-outline-variant);
border-radius: 8px;
padding: 20px 16px;
&--success {
background: color-mix(in srgb, #16a34a 5%, var(--mat-sys-surface-container));
border-color: color-mix(in srgb, #16a34a 20%, transparent);
}
&--info {
background: color-mix(in srgb, var(--mat-sys-primary) 5%, var(--mat-sys-surface-container));
border-color: color-mix(in srgb, var(--mat-sys-primary) 20%, transparent);
}
&--error {
background: color-mix(in srgb, var(--mat-sys-error) 5%, var(--mat-sys-surface-container));
border-color: color-mix(in srgb, var(--mat-sys-error) 20%, transparent);
}
}
&__card-inner {
display: flex;
align-items: center;
justify-content: space-between;
}
&__card-body {
display: flex;
flex-direction: column;
gap: 4px;
}
&__value {
font-size: 28px;
font-weight: 700;
color: var(--mat-sys-on-surface);
line-height: 1;
&--success { color: #16a34a; }
&--info { color: var(--mat-sys-primary); }
&--error { color: var(--mat-sys-error); }
}
&__label {
font-size: 11px;
color: var(--mat-sys-on-surface-variant);
}
&__icon {
color: var(--mat-sys-on-surface-variant);
&--success { color: #16a34a; }
&--info { color: var(--mat-sys-primary); }
&--error { color: var(--mat-sys-error); }
}
&__progress {
margin-top: 8px;
height: 6px;
border-radius: 3px;
background: color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent);
overflow: hidden;
}
&__progress-fill {
height: 100%;
border-radius: 3px;
background: var(--mat-sys-primary);
transition: width 0.3s ease;
}
}
// ─── GitHub Build Status ─────────────────────────────────────────────────────
.github-status {
background: var(--mat-sys-surface-container);
border: 1px solid var(--mat-sys-outline-variant);
border-radius: 8px;
overflow: hidden;
&__header {
padding: 16px 20px;
border-bottom: 1px solid var(--mat-sys-outline-variant);
}
&__title {
display: flex;
align-items: center;
gap: 8px;
font-size: 14px;
font-weight: 600;
color: var(--mat-sys-on-surface);
margin: 0 0 4px;
}
&__description {
font-size: 12px;
color: var(--mat-sys-on-surface-variant);
margin: 0;
}
&__body {
padding: 16px 20px;
display: flex;
flex-direction: column;
gap: 12px;
}
&__loading {
font-size: 13px;
color: var(--mat-sys-on-surface-variant);
}
&__error {
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
color: var(--mat-sys-error);
}
&__empty {
font-size: 13px;
color: var(--mat-sys-on-surface-variant);
}
&__list {
display: flex;
flex-direction: column;
gap: 10px;
}
&__item {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 12px;
border: 1px solid var(--mat-sys-outline-variant);
border-radius: 6px;
background: var(--mat-sys-surface);
}
&__item-info {
min-width: 0;
flex: 1;
}
&__item-row {
display: flex;
align-items: center;
gap: 8px;
}
&__item-name {
font-size: 13px;
font-weight: 500;
color: var(--mat-sys-on-surface);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin: 0;
}
&__item-meta {
font-size: 11px;
color: var(--mat-sys-on-surface-variant);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-top: 2px;
}
&__badge {
display: inline-flex;
align-items: center;
padding: 2px 8px;
border-radius: 12px;
font-size: 11px;
font-weight: 500;
&--success {
background: color-mix(in srgb, #16a34a 12%, transparent);
color: #16a34a;
}
&--failure,
&--error {
background: color-mix(in srgb, var(--mat-sys-error) 12%, transparent);
color: var(--mat-sys-error);
}
&--pending,
&--in-progress {
background: color-mix(in srgb, var(--mat-sys-primary) 12%, transparent);
color: var(--mat-sys-primary);
}
&--neutral {
background: color-mix(in srgb, var(--mat-sys-on-surface-variant) 12%, transparent);
color: var(--mat-sys-on-surface-variant);
}
}
&__footer {
padding: 12px 20px;
border-top: 1px solid var(--mat-sys-outline-variant);
}
&__footer-link {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
padding: 6px 12px;
border: 1px solid var(--mat-sys-outline-variant);
border-radius: 6px;
font-size: 13px;
color: var(--mat-sys-on-surface);
text-decoration: none;
background: transparent;
transition: background-color 0.15s ease;
&:hover {
background: color-mix(in srgb, var(--mat-sys-on-surface) 6%, transparent);
}
}
}
// ─── Error Panel ─────────────────────────────────────────────────────────────
.error-panel {
height: 100%;
display: flex;
flex-direction: column;
background: var(--mat-sys-surface);
&__header {
flex-shrink: 0;
padding: 16px 24px;
background: var(--mat-sys-surface-container);
border-bottom: 1px solid var(--mat-sys-outline-variant);
}
&__header-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
}
&__title-group {
display: flex;
align-items: center;
gap: 10px;
}
&__title {
font-size: 18px;
font-weight: 700;
color: var(--mat-sys-on-surface);
margin: 0;
}
&__badge {
font-size: 11px;
font-weight: 600;
padding: 2px 8px;
border-radius: 999px;
&--error { background: color-mix(in srgb, #ef4444 15%, transparent); color: #ef4444; }
&--warning { background: color-mix(in srgb, #f59e0b 15%, transparent); color: #d97706; }
}
&__actions {
display: flex;
align-items: center;
gap: 8px;
}
&__scroll-body {
flex: 1;
overflow-y: auto;
}
&__inner {
padding: 24px;
display: flex;
flex-direction: column;
gap: 12px;
}
&__empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 12px;
padding: 48px 24px;
text-align: center;
}
&__empty-text {
font-size: 14px;
color: var(--mat-sys-on-surface-variant);
margin: 0;
}
&__ok-icon { color: #16a34a; }
&__spin-icon { color: var(--mat-sys-primary); animation: skeleton-pulse 1.2s ease-in-out infinite; }
&__list {
display: flex;
flex-direction: column;
gap: 8px;
}
&__item {
background: var(--mat-sys-surface-container);
border: 1px solid var(--mat-sys-outline-variant);
border-radius: 8px;
padding: 12px 16px;
display: flex;
flex-direction: column;
gap: 6px;
}
&__item-meta {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
&__severity {
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
padding: 1px 6px;
border-radius: 4px;
&--error { background: color-mix(in srgb, #ef4444 15%, transparent); color: #ef4444; }
&--warning { background: color-mix(in srgb, #f59e0b 15%, transparent); color: #d97706; }
&--info { background: color-mix(in srgb, var(--mat-sys-primary) 15%, transparent); color: var(--mat-sys-primary); }
}
&__filename {
font-size: 12px;
font-weight: 600;
color: var(--mat-sys-on-surface);
font-family: monospace;
}
&__lineno {
font-size: 12px;
color: var(--mat-sys-on-surface-variant);
font-family: monospace;
}
&__message {
font-size: 13px;
color: var(--mat-sys-on-surface);
margin: 0;
}
&__suggestion {
font-size: 12px;
color: var(--mat-sys-on-surface-variant);
margin: 0;
font-style: italic;
}
}
// ─── Demo Header ─────────────────────────────────────────────────────────────
.demo-header {
display: flex;
flex-direction: column;
gap: 8px;
&__title {
margin: 0;
font-size: 32px;
font-weight: 700;
background: linear-gradient(
90deg,
var(--mat-sys-primary),
color-mix(in srgb, var(--mat-sys-primary) 70%, var(--mat-sys-on-surface-variant))
);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;
}
&__subtitle {
margin: 0;
font-size: 14px;
color: var(--mat-sys-on-surface-variant);
}
}
// ─── Demo Stats Row ───────────────────────────────────────────────────────────
.demo-stats-row {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16px;
@media (max-width: 768px) {
grid-template-columns: 1fr;
}
&__card {
background: color-mix(in srgb, var(--mat-sys-surface-container) 50%, transparent);
border: 1px solid var(--mat-sys-outline-variant);
border-radius: 8px;
padding: 20px 16px;
&--success {
background: color-mix(in srgb, #16a34a 5%, var(--mat-sys-surface-container));
border-color: color-mix(in srgb, #16a34a 20%, transparent);
}
&--info {
background: color-mix(in srgb, var(--mat-sys-primary) 5%, var(--mat-sys-surface-container));
border-color: color-mix(in srgb, var(--mat-sys-primary) 20%, transparent);
}
}
&__card-inner {
display: flex;
flex-direction: column;
gap: 4px;
}
&__card-row {
display: flex;
align-items: flex-start;
justify-content: space-between;
}
&__label {
font-size: 12px;
color: var(--mat-sys-on-surface-variant);
margin: 0;
}
&__value {
font-size: 28px;
font-weight: 700;
color: var(--mat-sys-on-surface);
line-height: 1;
&--success { color: #16a34a; }
&--info { color: var(--mat-sys-primary); }
}
&__icon {
color: var(--mat-sys-on-surface-variant);
&--success { color: #16a34a; }
&--info { color: var(--mat-sys-primary); }
}
&__progress {
margin-top: 8px;
height: 6px;
border-radius: 3px;
background: color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent);
overflow: hidden;
}
&__progress-fill {
height: 100%;
border-radius: 3px;
background: var(--mat-sys-primary);
transition: width 0.3s ease;
}
}
// ─── Info Section ─────────────────────────────────────────────────────────────
.info-section {
display: flex;
flex-direction: column;
gap: 16px;
&__heading {
display: flex;
flex-direction: column;
gap: 4px;
}
&__title {
margin: 0 0 4px;
font-size: 16px;
font-weight: 600;
color: var(--mat-sys-on-surface);
}
&__description {
margin: 0;
font-size: 13px;
color: var(--mat-sys-on-surface-variant);
}
&__divider {
height: 1px;
background: var(--mat-sys-outline-variant);
border: none;
margin: 0;
}
&__content {
display: flex;
flex-direction: column;
gap: 10px;
}
&__row {
display: flex;
align-items: center;
justify-content: space-between;
}
&__row-label {
font-size: 13px;
color: var(--mat-sys-on-surface);
}
&__row-value {
font-size: 13px;
font-family: monospace;
color: var(--mat-sys-on-surface-variant);
}
}
// ─── Conflict Resolution Page ─────────────────────────────────────────────────
.conflict-resolution-page {
height: 100%;
display: flex;
flex-direction: column;
background: var(--mat-sys-surface);
&__header-section {
flex-shrink: 0;
border-bottom: 1px solid var(--mat-sys-outline-variant);
background: color-mix(in srgb, var(--mat-sys-surface-container) 50%, transparent);
}
&__header-content {
padding: 24px;
display: flex;
flex-direction: column;
gap: 16px;
}
&__title {
margin: 0 0 8px;
font-size: 24px;
font-weight: 700;
font-family: monospace;
color: var(--mat-sys-on-surface);
}
&__description {
margin: 0;
font-size: 13px;
color: var(--mat-sys-on-surface-variant);
}
&__inline-stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
}
&__stat-tile {
padding: 12px;
border-radius: 6px;
background: color-mix(in srgb, var(--mat-sys-on-surface) 6%, transparent);
}
&__stat-label {
font-size: 11px;
color: var(--mat-sys-on-surface-variant);
margin: 0 0 4px;
}
&__stat-value {
font-size: 22px;
font-weight: 700;
color: var(--mat-sys-on-surface);
line-height: 1;
margin: 0;
}
&__main-content {
flex: 1;
overflow: hidden;
padding: 24px;
}
&__content-wrapper {
height: 100%;
display: flex;
flex-direction: column;
gap: 16px;
}
&__actions {
display: flex;
gap: 8px;
}
&__list-container {
flex: 1;
overflow: auto;
border-radius: 6px;
border: 1px solid var(--mat-sys-outline-variant);
}
&__empty-state {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
padding: 24px;
}
&__empty-inner {
text-align: center;
}
&__empty-icon {
display: block;
margin: 0 auto 8px;
color: var(--mat-sys-on-surface-variant);
}
&__empty-title {
margin: 0 0 4px;
font-size: 16px;
font-weight: 600;
color: var(--mat-sys-on-surface);
}
&__empty-desc {
margin: 0;
font-size: 13px;
color: var(--mat-sys-on-surface-variant);
}
&__conflicts-list {
padding: 16px;
display: flex;
flex-direction: column;
gap: 8px;
}
}
// ─── Conflict Resolution Demo ─────────────────────────────────────────────────
.conflict-resolution-demo {
display: flex;
flex-direction: column;
gap: 24px;
padding: 24px;
&__title {
margin: 0 0 8px;
font-size: 22px;
font-weight: 700;
color: var(--mat-sys-on-surface);
}
}