2026-05-25 19:36:44 +08:00

1453 lines
33 KiB
CSS

.page-head {
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: var(--space-4);
margin-bottom: var(--space-5);
}
.page-title {
margin: 0;
font-size: var(--admin-font-size);
font-weight: 700;
}
.page-meta {
margin: var(--space-2) 0 0;
color: var(--text-tertiary);
font-size: var(--admin-font-size);
}
.page-actions {
display: flex;
align-items: center;
gap: var(--space-3);
}
.button {
display: inline-flex;
height: var(--control-height);
min-height: var(--control-height);
align-items: center;
justify-content: center;
gap: var(--space-2);
padding: 0 var(--space-3);
border: 1px solid var(--border);
border-radius: var(--radius-control);
background: var(--bg-card);
color: var(--text-secondary);
cursor: pointer;
font-size: var(--admin-font-size);
line-height: var(--admin-line-height);
white-space: nowrap;
transition:
background var(--motion-fast) var(--ease-standard),
border-color var(--motion-fast) var(--ease-standard),
box-shadow var(--motion-fast) var(--ease-standard),
color var(--motion-fast) var(--ease-standard),
transform var(--motion-base) var(--ease-emphasized);
}
.button:hover {
border-color: var(--primary-border-strong);
background: var(--bg-hover);
box-shadow: var(--shadow-soft);
color: var(--text-primary);
transform: translateY(-1px);
}
.button:active {
box-shadow: none;
transform: translateY(0) scale(0.985);
}
.button:disabled,
.icon-button:disabled {
cursor: not-allowed;
opacity: 0.42;
}
.button--primary {
border-color: var(--primary);
background: var(--primary);
color: var(--active-contrast);
}
.button--success {
color: var(--success);
}
.button--danger {
color: var(--danger);
}
.button.MuiButton-root {
height: var(--control-height);
min-height: var(--control-height);
padding: 0 var(--space-3);
border-radius: var(--radius-control);
font-size: var(--admin-font-size);
line-height: var(--admin-line-height);
text-transform: none;
}
.kpi-grid {
display: grid;
grid-template-columns: repeat(5, minmax(0, 1fr));
gap: var(--space-4);
}
.card {
border: 1px solid var(--border);
border-radius: var(--radius-card);
background: var(--bg-card);
}
.MuiTextField-root,
.MuiFormControl-root {
--admin-control-height: var(--control-height);
--admin-control-font-size: var(--admin-font-size);
--admin-control-line-height: var(--admin-line-height);
}
.region-select.MuiTextField-root,
.region-select.MuiFormControl-root {
width: 180px;
min-width: 180px;
flex: 0 0 180px;
}
.region-filter-control {
display: inline-flex;
min-width: 0;
flex: 0 0 auto;
align-items: center;
gap: var(--space-1);
}
.region-filter-control .region-select.MuiTextField-root,
.region-filter-control .region-select.MuiFormControl-root {
flex: 0 0 180px;
}
.MuiInputBase-root.MuiOutlinedInput-root:not(.MuiInputBase-multiline) {
height: var(--control-height);
min-height: var(--control-height);
}
.MuiInputBase-root.MuiOutlinedInput-root {
background: var(--bg-input);
backdrop-filter: var(--glass-blur);
-webkit-backdrop-filter: var(--glass-blur);
}
.MuiInputBase-root.MuiOutlinedInput-root:not(.MuiInputBase-multiline) .MuiInputBase-input {
box-sizing: border-box;
height: var(--control-height);
padding-top: 0;
padding-bottom: 0;
font-size: var(--admin-font-size);
line-height: var(--admin-line-height);
}
.MuiInputBase-root .MuiInputBase-input::placeholder {
font-size: var(--admin-font-size);
line-height: var(--admin-line-height);
}
.MuiInputBase-input:focus {
outline: 0;
}
.MuiTextField-root .MuiOutlinedInput-root,
.MuiFormControl-root .MuiOutlinedInput-root {
border-radius: var(--radius-control);
background: var(--bg-input);
backdrop-filter: var(--glass-blur);
color: var(--text-primary);
font-size: var(--admin-control-font-size);
line-height: var(--admin-control-line-height);
-webkit-backdrop-filter: var(--glass-blur);
}
.MuiTextField-root .MuiOutlinedInput-root:not(.MuiInputBase-multiline),
.MuiFormControl-root .MuiOutlinedInput-root:not(.MuiInputBase-multiline) {
height: var(--admin-control-height);
min-height: var(--admin-control-height);
}
.MuiTextField-root .MuiOutlinedInput-notchedOutline,
.MuiFormControl-root .MuiOutlinedInput-notchedOutline {
border-color: var(--border);
}
.MuiTextField-root .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline,
.MuiFormControl-root .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline {
border-color: var(--primary-border);
}
.MuiTextField-root .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline,
.MuiFormControl-root .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline {
border-color: var(--primary);
border-width: 1px;
}
.MuiInputBase-root.Mui-focused {
box-shadow: none;
}
.MuiTextField-root .MuiOutlinedInput-input,
.MuiFormControl-root .MuiOutlinedInput-input {
box-sizing: border-box;
height: var(--admin-control-height);
padding: 0 var(--space-3);
color: var(--text-primary);
font-size: var(--admin-control-font-size);
line-height: var(--admin-control-line-height);
}
.MuiTextField-root .MuiOutlinedInput-input::placeholder,
.MuiFormControl-root .MuiOutlinedInput-input::placeholder {
color: var(--text-tertiary);
font-size: var(--admin-control-font-size);
line-height: var(--admin-control-line-height);
opacity: 1;
}
.MuiTextField-root .MuiInputLabel-outlined,
.MuiFormControl-root .MuiInputLabel-outlined {
color: var(--text-tertiary);
font-size: var(--admin-control-font-size);
line-height: var(--admin-control-line-height);
transform: translate(14px, 8px) scale(1);
}
.MuiTextField-root .MuiInputLabel-outlined.MuiInputLabel-shrink,
.MuiFormControl-root .MuiInputLabel-outlined.MuiInputLabel-shrink {
transform: translate(14px, -8px) scale(0.75);
}
.MuiTextField-root .MuiFormLabel-root.Mui-focused,
.MuiFormControl-root .MuiFormLabel-root.Mui-focused {
color: var(--primary);
}
.MuiTextField-root .MuiSelect-select,
.MuiFormControl-root .MuiSelect-select {
display: flex;
box-sizing: border-box;
height: var(--admin-control-height);
min-height: var(--admin-control-height) !important;
align-items: center;
padding: 0 var(--space-8) 0 var(--space-3) !important;
font-size: var(--admin-control-font-size);
line-height: var(--admin-control-line-height);
}
.MuiTextField-root .MuiSelect-icon,
.MuiFormControl-root .MuiSelect-icon {
top: 50%;
color: var(--text-tertiary);
transform: translateY(-50%);
}
.MuiAutocomplete-root {
--admin-autocomplete-input-height: 24px;
}
.MuiAutocomplete-root .MuiOutlinedInput-root.MuiAutocomplete-inputRoot:not(.MuiInputBase-multiline) {
height: auto;
min-height: var(--control-height);
align-items: center;
flex-wrap: wrap;
gap: var(--space-1);
padding: 4px 40px 4px var(--space-2);
}
.MuiAutocomplete-root .MuiOutlinedInput-root.MuiAutocomplete-inputRoot .MuiAutocomplete-input {
flex: 1 0 12px;
width: auto !important;
min-width: 12px;
height: var(--admin-autocomplete-input-height);
padding: 0 !important;
line-height: var(--admin-autocomplete-input-height);
}
.MuiAutocomplete-root .MuiOutlinedInput-root.MuiAutocomplete-inputRoot .MuiAutocomplete-endAdornment {
top: 50%;
right: var(--space-2);
transform: translateY(-50%);
}
.MuiAutocomplete-root .MuiAutocomplete-tag {
--admin-multiselect-tag-bg: var(--admin-multiselect-tag-1);
display: inline-flex;
flex: 0 0 auto;
max-width: calc(100% - var(--space-2));
height: var(--admin-tag-height);
align-items: center;
margin: 0;
border: 1px solid var(--admin-multiselect-tag-border);
border-radius: var(--admin-tag-radius);
background: var(--admin-multiselect-tag-bg);
box-shadow: var(--admin-multiselect-tag-shadow);
color: var(--admin-multiselect-tag-color);
font-size: var(--admin-tag-font-size);
font-weight: var(--admin-tag-font-weight);
line-height: 1;
white-space: nowrap;
animation: row-enter var(--motion-base) var(--ease-emphasized) both;
transition:
box-shadow var(--motion-fast) var(--ease-standard),
filter var(--motion-fast) var(--ease-standard),
transform var(--motion-base) var(--ease-emphasized);
}
.MuiAutocomplete-root .MuiAutocomplete-tag:nth-of-type(6n + 2) {
--admin-multiselect-tag-bg: var(--admin-multiselect-tag-2);
}
.MuiAutocomplete-root .MuiAutocomplete-tag:nth-of-type(6n + 3) {
--admin-multiselect-tag-bg: var(--admin-multiselect-tag-3);
}
.MuiAutocomplete-root .MuiAutocomplete-tag:nth-of-type(6n + 4) {
--admin-multiselect-tag-bg: var(--admin-multiselect-tag-4);
}
.MuiAutocomplete-root .MuiAutocomplete-tag:nth-of-type(6n + 5) {
--admin-multiselect-tag-bg: var(--admin-multiselect-tag-5);
}
.MuiAutocomplete-root .MuiAutocomplete-tag:nth-of-type(6n) {
--admin-multiselect-tag-bg: var(--admin-multiselect-tag-6);
}
.MuiAutocomplete-root .MuiAutocomplete-tag:hover {
box-shadow: var(--admin-multiselect-tag-shadow-hover);
filter: saturate(1.06) brightness(1.03);
transform: translateY(-1px);
}
.MuiAutocomplete-root .MuiAutocomplete-tag:active {
transform: translateY(0) scale(0.98);
}
.MuiAutocomplete-root .MuiAutocomplete-tag .MuiChip-label {
overflow: hidden;
padding: 0 var(--admin-tag-padding-x);
text-overflow: ellipsis;
white-space: nowrap;
}
.MuiAutocomplete-root .MuiAutocomplete-tag .MuiChip-deleteIcon {
width: 18px;
height: 18px;
margin-right: var(--space-1);
border-radius: var(--radius-pill);
color: rgba(255, 255, 255, 0.9);
transition:
background var(--motion-fast) var(--ease-standard),
color var(--motion-fast) var(--ease-standard),
transform var(--motion-fast) var(--ease-emphasized);
}
.MuiAutocomplete-root .MuiAutocomplete-tag .MuiChip-deleteIcon:hover {
background: rgba(255, 255, 255, 0.16);
color: #ffffff;
transform: scale(1.08);
}
.admin-tag-list {
display: flex;
min-width: 0;
align-items: center;
flex-wrap: wrap;
gap: var(--space-2);
}
.admin-tag {
display: inline-flex;
flex: 0 0 auto;
max-width: 100%;
height: var(--admin-tag-height);
align-items: center;
gap: var(--admin-tag-gap);
overflow: hidden;
border: 1px solid var(--admin-tag-border);
border-radius: var(--admin-tag-radius);
background: var(--admin-tag-bg);
color: var(--admin-tag-color);
font-size: var(--admin-tag-font-size);
font-weight: var(--admin-tag-font-weight);
line-height: 1;
padding: 0 var(--admin-tag-padding-x);
text-overflow: ellipsis;
white-space: nowrap;
}
.MuiAutocomplete-popper .MuiAutocomplete-paper {
overflow: hidden;
border: 1px solid var(--border);
border-radius: var(--radius-control);
background: var(--bg-flyout);
box-shadow: var(--shadow-panel);
transform-origin: top center;
animation: autocomplete-pop-enter var(--motion-base) var(--ease-emphasized) both;
}
.MuiAutocomplete-popper[data-popper-placement*="top"] .MuiAutocomplete-paper {
transform-origin: bottom center;
animation-name: autocomplete-pop-enter-up;
}
.MuiAutocomplete-popper .MuiAutocomplete-listbox {
max-height: 280px;
padding: var(--space-1);
}
.MuiAutocomplete-popper .MuiAutocomplete-option {
min-height: var(--control-height);
border-radius: var(--radius-control);
color: var(--text-secondary);
font-size: var(--admin-font-size);
transition:
background var(--motion-fast) var(--ease-standard),
color var(--motion-fast) var(--ease-standard),
transform var(--motion-fast) var(--ease-emphasized);
}
.MuiAutocomplete-popper .MuiAutocomplete-option.Mui-focused,
.MuiAutocomplete-popper .MuiAutocomplete-option[aria-selected="true"] {
background: var(--primary-hover);
color: var(--text-primary);
transform: translateX(2px);
}
.MuiTextField-root .MuiOutlinedInput-root.MuiInputBase-multiline,
.MuiFormControl-root .MuiOutlinedInput-root.MuiInputBase-multiline {
align-items: flex-start;
padding: var(--space-2) var(--space-3);
}
.MuiTextField-root .MuiOutlinedInput-root.MuiInputBase-multiline .MuiOutlinedInput-input,
.MuiFormControl-root .MuiOutlinedInput-root.MuiInputBase-multiline .MuiOutlinedInput-input {
height: auto;
min-height: calc(var(--admin-line-height) * 2);
padding: 0;
line-height: var(--admin-control-line-height);
}
.MuiFormHelperText-root {
margin: var(--space-1) 0 0;
color: var(--text-tertiary);
font-size: var(--admin-font-size);
line-height: var(--admin-line-height);
}
.MuiMenuItem-root {
min-height: var(--control-height);
font-size: var(--admin-font-size);
}
@media (max-width: 760px) {
.region-select.MuiTextField-root,
.region-select.MuiFormControl-root {
width: 100%;
min-width: 0;
flex: 1 1 100%;
}
.region-filter-control {
width: 100%;
flex: 1 1 100%;
}
.region-filter-control .region-select.MuiTextField-root,
.region-filter-control .region-select.MuiFormControl-root {
width: auto;
min-width: 0;
flex: 1 1 auto;
}
}
.kpi-card {
min-height: 132px;
padding: var(--space-5);
animation: panel-enter var(--motion-slow) var(--ease-emphasized) both;
transition:
border-color var(--motion-base) var(--ease-standard),
box-shadow var(--motion-base) var(--ease-standard),
transform var(--motion-base) var(--ease-emphasized);
}
.kpi-grid .kpi-card:nth-child(2) {
animation-delay: 40ms;
}
.kpi-grid .kpi-card:nth-child(3) {
animation-delay: 80ms;
}
.kpi-grid .kpi-card:nth-child(4) {
animation-delay: 120ms;
}
.kpi-grid .kpi-card:nth-child(5) {
animation-delay: 160ms;
}
.kpi-card:hover,
.chart-card:hover,
.table-card:hover,
.server-rail:hover,
.inline-inspector:hover {
border-color: var(--primary-border-strong);
box-shadow: var(--shadow-panel);
transform: translateY(-2px);
}
.kpi-card__top {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-3);
}
.kpi-card__label,
.card-title {
color: var(--text-secondary);
font-size: var(--admin-font-size);
font-weight: 650;
}
.metric-icon {
display: grid;
width: var(--control-height);
height: var(--control-height);
place-items: center;
border-radius: var(--radius-control);
background: var(--primary-surface);
color: var(--primary);
transition:
background var(--motion-base) var(--ease-standard),
transform var(--motion-base) var(--ease-emphasized);
}
.kpi-card:hover .metric-icon {
transform: scale(1.08) rotate(-4deg);
}
.metric-icon--success {
background: var(--success-surface);
color: var(--success);
}
.metric-icon--warning {
background: var(--warning-surface);
color: var(--warning);
}
.metric-icon--info {
background: var(--info-surface);
color: var(--info);
}
.kpi-value {
margin-top: var(--space-5);
color: var(--text-primary);
font-size: var(--admin-font-size);
font-weight: 760;
line-height: 1;
}
.kpi-value span {
margin-left: var(--space-1);
font-size: var(--admin-font-size);
font-weight: 600;
}
.kpi-sub {
margin-top: var(--space-3);
color: var(--text-tertiary);
font-size: var(--admin-font-size);
}
.status-ok {
color: var(--success);
}
.status-warn {
color: var(--warning);
}
.status-danger {
color: var(--danger);
}
.status-badge {
display: inline-flex;
box-sizing: border-box;
flex: 0 0 auto;
max-width: 100%;
height: var(--admin-tag-height);
align-items: center;
gap: var(--admin-tag-gap);
padding: 0 var(--admin-tag-padding-x);
border: 1px solid var(--admin-tag-border) !important;
border-radius: var(--admin-tag-radius) !important;
background: var(--neutral-surface) !important;
color: var(--text-secondary) !important;
font-size: var(--admin-tag-font-size) !important;
font-weight: var(--admin-tag-font-weight) !important;
line-height: 1;
white-space: nowrap;
word-break: keep-all;
}
.status-point {
display: block;
flex: 0 0 var(--space-2);
width: var(--space-2);
height: var(--space-2);
border-radius: var(--radius-pill);
background: var(--stopped);
}
.status-badge.MuiChip-root {
gap: 0;
padding: 0;
}
.status-badge.MuiChip-root .MuiChip-icon {
margin-left: var(--admin-tag-padding-x);
margin-right: 0;
}
.status-badge.MuiChip-root .MuiChip-label {
overflow: hidden;
padding-left: var(--admin-tag-gap);
padding-right: var(--admin-tag-padding-x);
line-height: 1;
text-overflow: ellipsis;
white-space: nowrap;
}
.status-badge--running,
.status-badge--succeeded {
border-color: var(--success-border) !important;
background: var(--success-surface) !important;
color: var(--success) !important;
}
.status-badge--running .status-point,
.status-badge--succeeded .status-point {
background: var(--success);
box-shadow: 0 0 var(--space-3) var(--success-glow);
}
.status-badge--warning {
border-color: var(--warning-border) !important;
background: var(--warning-surface) !important;
color: var(--warning) !important;
}
.status-badge--warning .status-point {
background: var(--warning);
box-shadow: 0 0 var(--space-3) var(--warning-glow);
}
.status-badge--error,
.status-badge--danger {
border-color: var(--danger-border) !important;
background: var(--danger-surface) !important;
color: var(--danger) !important;
}
.status-badge--error .status-point,
.status-badge--danger .status-point {
background: var(--danger);
box-shadow: 0 0 var(--space-3) var(--danger-glow);
}
.status-badge--stopped {
background: var(--neutral-surface) !important;
color: var(--stopped) !important;
}
.panel-grid {
display: grid;
grid-template-columns: minmax(0, 1.35fr) minmax(340px, 0.65fr);
gap: var(--space-4);
margin-top: var(--space-4);
}
.table-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-4);
padding: var(--space-4) var(--space-5);
border-bottom: 1px solid var(--border);
}
.filter-row {
display: flex;
align-items: center;
gap: var(--space-2);
}
.filter-chip {
height: var(--status-height);
padding: 0 var(--space-3);
border: 1px solid var(--border);
border-radius: var(--radius-pill);
background: transparent;
color: var(--text-tertiary);
cursor: pointer;
font-size: var(--admin-font-size);
transition:
background var(--motion-fast) var(--ease-standard),
border-color var(--motion-fast) var(--ease-standard),
box-shadow var(--motion-fast) var(--ease-standard),
color var(--motion-fast) var(--ease-standard),
transform var(--motion-base) var(--ease-emphasized);
}
.filter-chip:hover {
box-shadow: var(--shadow-soft);
transform: translateY(-1px);
}
.filter-chip--active {
border-color: var(--primary-border-strong);
background: var(--primary-surface);
color: var(--text-primary);
}
.muted {
color: var(--text-tertiary);
}
.cell-stack {
display: grid;
min-width: 0;
gap: var(--space-1);
}
.cell-stack > * {
min-width: 0;
overflow-wrap: anywhere;
}
.row-actions {
display: flex;
align-items: center;
gap: var(--space-2);
}
.empty-state {
padding: var(--space-8) var(--space-5);
color: var(--text-tertiary);
text-align: center;
}
.login-page {
display: grid;
min-height: 100vh;
place-items: center;
padding: var(--space-6);
background: var(--login-gradient), var(--bg-page);
}
.login-panel {
display: grid;
width: min(420px, 100%);
gap: var(--space-6);
padding: var(--space-7);
border: 1px solid var(--border);
border-radius: var(--radius-card);
background: var(--bg-card);
box-shadow: var(--shadow-panel);
animation: panel-enter var(--motion-slow) var(--ease-emphasized) both;
}
.login-brand {
display: flex;
align-items: center;
gap: var(--space-3);
}
.login-brand h1 {
margin: 0;
color: var(--text-primary);
font-size: var(--admin-font-size);
}
.login-brand p {
margin: var(--space-1) 0 0;
color: var(--text-tertiary);
font-size: var(--admin-font-size);
}
.login-form,
.form-drawer {
display: grid;
gap: var(--space-4);
}
.form-drawer {
width: min(420px, 100vw);
padding: var(--space-6);
}
.form-drawer--wide {
width: min(560px, 100vw);
}
.form-drawer h2 {
margin: 0 0 var(--space-1);
color: var(--text-primary);
font-size: var(--admin-font-size);
}
.form-drawer__section {
display: grid;
gap: var(--space-3);
}
.form-drawer__section + .form-drawer__section {
padding-top: var(--space-4);
border-top: 1px solid var(--border-soft);
}
.form-drawer__section-title {
color: var(--text-secondary);
font-size: 13px;
font-weight: 700;
line-height: 18px;
}
.form-drawer__grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: var(--space-3);
}
.form-drawer__grid > .MuiTextField-root,
.form-drawer__grid > .MuiFormControl-root,
.form-drawer__grid > .MuiAutocomplete-root,
.form-drawer__grid > .MuiFormControlLabel-root {
width: 100%;
}
.form-drawer__section > .MuiFormControlLabel-root,
.form-drawer__grid > .MuiFormControlLabel-root {
min-height: var(--control-height);
margin: 0;
}
.form-drawer__actions {
display: flex;
justify-content: flex-end;
gap: var(--space-3);
padding-top: var(--space-2);
}
.side-drawer {
display: flex;
width: min(420px, 100vw);
min-height: 100%;
flex-direction: column;
gap: var(--space-4);
padding: var(--space-6);
background: var(--bg-card);
}
.side-drawer--wide {
width: min(560px, 100vw);
}
.side-drawer__header {
display: flex;
min-height: var(--control-height);
align-items: center;
justify-content: space-between;
gap: var(--space-3);
}
.side-drawer__title {
margin: 0;
color: var(--text-primary);
font-size: var(--admin-font-size);
font-weight: 800;
}
.side-drawer__body {
display: grid;
gap: var(--space-4);
}
.side-drawer__actions {
display: flex;
justify-content: flex-end;
gap: var(--space-3);
margin-top: auto;
padding-top: var(--space-2);
}
.form-section-title {
color: var(--text-secondary);
font-size: var(--admin-font-size);
font-weight: 700;
}
.permission-menu-list {
display: grid;
gap: var(--space-3);
}
.permission-menu-section {
display: grid;
gap: var(--space-2);
padding: var(--space-3);
border: 1px solid var(--border);
border-radius: var(--radius-card);
background: var(--bg-card);
}
.permission-menu-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-3);
min-height: var(--control-height);
}
.permission-menu-title {
color: var(--text-primary);
font-size: var(--admin-font-size);
font-weight: 700;
}
.permission-menu-actions {
display: inline-flex;
align-items: center;
gap: var(--space-3);
}
.permission-menu-toggle {
display: inline-flex;
align-items: center;
gap: var(--space-2);
color: var(--text-secondary);
font-size: var(--admin-font-size);
font-weight: 600;
white-space: nowrap;
}
.permission-menu-toggle .MuiCheckbox-root,
.permission-check .MuiCheckbox-root {
padding: 0;
}
.permission-menu-count {
color: var(--text-tertiary);
font-size: var(--admin-font-size);
white-space: nowrap;
}
.permission-section {
display: grid;
gap: var(--space-3);
}
.permission-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: var(--space-2);
}
.permission-grid--compact {
gap: var(--space-2);
}
.permission-check {
display: flex;
align-items: center;
gap: var(--space-2);
min-height: var(--control-height);
padding: 0 var(--space-3);
border: 1px solid var(--border);
border-radius: var(--radius-control);
background: var(--bg-card-strong);
color: var(--text-secondary);
font-size: var(--admin-font-size);
}
.batch-actions {
display: flex;
gap: var(--space-2);
}
.pagination-bar {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-2);
min-height: 32px;
margin-top: var(--space-2);
color: var(--text-tertiary);
font-size: 12px;
}
.pagination-bar__meta {
display: flex;
min-width: 0;
align-items: center;
gap: var(--space-2);
}
.pagination-bar__page-size-wrap {
display: inline-flex;
align-items: center;
gap: var(--space-1);
}
.pagination-bar__page-size {
width: 72px;
}
.pagination-bar__page-size .MuiInputBase-root {
height: 30px;
border-radius: var(--radius-control);
font-size: 12px;
}
.pagination-bar__page-size .MuiSelect-select.MuiInputBase-input {
padding-top: 4px;
padding-bottom: 4px;
}
.pagination-bar__actions {
display: flex;
align-items: center;
gap: var(--space-1);
}
.data-state {
display: grid;
min-height: 180px;
place-items: center;
gap: var(--space-3);
border: 1px solid var(--border);
border-radius: var(--radius-card);
background: var(--bg-card);
color: var(--text-tertiary);
}
.data-state--loading {
display: flex;
align-items: stretch;
justify-content: stretch;
padding: var(--space-4);
}
.data-state__skeleton {
display: grid;
width: 100%;
min-height: 360px;
grid-template-rows: auto minmax(0, 1fr);
gap: var(--space-4);
}
.data-state__skeleton-toolbar {
display: flex;
min-width: 0;
align-items: center;
justify-content: space-between;
gap: var(--space-4);
}
.data-state__skeleton-filters,
.data-state__skeleton-actions {
display: flex;
min-width: 0;
align-items: center;
flex-wrap: wrap;
gap: var(--space-3);
}
.data-state__skeleton-actions {
flex: 0 0 auto;
}
.data-state__skeleton-filter {
width: 150px;
height: var(--control-height);
}
.data-state__skeleton-reset,
.data-state__skeleton-action {
width: 84px;
height: var(--control-height);
}
.data-state__skeleton-table {
display: grid;
min-height: 0;
overflow: hidden;
border: 1px solid var(--border);
border-radius: var(--radius-card);
background: var(--bg-card);
}
.data-state__skeleton-head {
height: var(--table-head-height);
border-radius: 0;
background-color: var(--bg-card-strong);
}
.data-state__skeleton-row {
display: grid;
min-height: var(--table-row-height);
align-items: center;
grid-template-columns: minmax(180px, 1.35fr) minmax(100px, 0.7fr) minmax(140px, 0.95fr) minmax(90px, 0.55fr) minmax(54px, 0.35fr);
gap: var(--space-4);
padding: 0 var(--space-4);
border-top: 1px solid var(--row-border);
}
.data-state__skeleton-cell {
width: min(100%, 150px);
height: 18px;
}
.data-state__skeleton-cell--main {
width: min(100%, 220px);
}
.data-state__skeleton-cell--short {
width: 72px;
}
.data-state__skeleton-cell--action {
width: 34px;
height: 28px;
}
.data-state__title {
color: var(--text-secondary);
font-size: var(--admin-font-size);
font-weight: 650;
}
.admin-table {
--admin-table-cell-x: var(--space-3);
display: flex;
flex-direction: column;
width: max(100%, var(--admin-table-min-width, 900px));
min-height: 100%;
min-width: max(100%, var(--admin-table-min-width, 900px));
}
.admin-row {
display: grid;
flex: 0 0 auto;
align-items: center;
grid-template-columns: var(--admin-table-columns);
min-height: var(--table-row-height);
padding: 0;
border-bottom: 1px solid var(--row-border);
background: var(--bg-card);
color: var(--text-secondary);
column-gap: 0;
font-size: var(--admin-font-size);
animation: row-enter var(--motion-slow) var(--ease-emphasized) both;
}
.admin-row[role="button"] {
cursor: pointer;
}
.admin-row--head {
min-height: var(--table-head-height);
background: var(--bg-card-strong);
color: var(--text-tertiary);
font-size: var(--admin-font-size);
font-weight: 650;
}
.admin-row--load-more {
min-height: 36px;
color: var(--text-tertiary);
font-size: 12px;
}
.admin-row--load-more-done {
min-height: 1px;
}
.admin-cell--load-more {
grid-column: 1 / -1;
text-align: center;
}
.admin-row--load-more-sentinel {
min-height: 1px;
}
.admin-cell {
box-sizing: border-box;
min-width: 0;
padding: 0 var(--admin-table-cell-x);
overflow: hidden;
overflow-wrap: anywhere;
}
.admin-cell:first-child {
padding-left: var(--admin-table-cell-x);
}
.admin-cell:last-child {
padding-right: var(--admin-table-cell-x);
}
.admin-cell--head {
position: relative;
display: flex;
min-height: var(--table-head-height);
align-items: center;
padding-right: calc(var(--admin-table-cell-x) + 10px);
}
.admin-cell--head:last-child {
padding-right: calc(var(--admin-table-cell-x) + 10px);
}
.admin-cell__head-content {
display: flex;
width: 100%;
min-width: 0;
align-items: center;
gap: var(--space-2);
}
.admin-cell__head-label {
flex: 0 1 auto;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.admin-cell__head-filter {
color: var(--primary);
font-weight: 700;
}
.admin-cell__head-trigger {
display: inline-flex;
flex: 0 1 auto;
max-width: 100%;
min-width: 0;
align-items: center;
gap: var(--space-1);
padding: 0;
border: 0;
background: transparent;
color: inherit;
cursor: pointer;
font: inherit;
font-weight: inherit;
}
.admin-cell__head-trigger:hover,
.admin-cell__head-trigger--active {
color: var(--text-primary);
}
.admin-cell__head-icon {
flex: 0 0 auto;
color: var(--text-tertiary);
font-size: 16px;
}
.admin-cell__head-trigger--active .admin-cell__head-icon {
color: var(--primary);
}
.admin-table-filter-reset-wrap {
display: inline-flex;
flex: 0 0 auto;
margin-left: auto;
}
.admin-cell--fixed-left,
.admin-cell--fixed-right {
position: sticky;
z-index: 2;
display: flex;
min-height: var(--table-row-height);
align-items: center;
background: inherit;
}
.admin-cell--fixed-left {
left: 0;
box-shadow: 10px 0 18px -18px rgb(30 41 59 / 0.4);
}
.admin-cell--fixed-right {
right: 0;
box-shadow: -10px 0 18px -18px rgb(30 41 59 / 0.4);
}
.admin-row--head .admin-cell--fixed-left,
.admin-row--head .admin-cell--fixed-right {
z-index: 4;
min-height: var(--table-head-height);
background: inherit;
}
.admin-column-resizer {
position: absolute;
top: 9px;
right: 0;
bottom: 9px;
width: 10px;
padding: 0;
border: 0;
background: transparent;
cursor: col-resize;
touch-action: none;
}
.admin-column-resizer::after {
position: absolute;
top: 0;
right: 4px;
bottom: 0;
width: 1px;
border-radius: var(--radius-pill);
background: transparent;
content: "";
transition:
background var(--motion-fast) var(--ease-standard),
box-shadow var(--motion-fast) var(--ease-standard);
}
.admin-column-resizer:hover::after,
.admin-cell--resizing .admin-column-resizer::after {
background: var(--primary);
box-shadow: 0 0 0 1px var(--primary-surface);
}
.admin-table--resizing {
cursor: col-resize;
user-select: none;
}
.admin-table-filter-popover .MuiPopover-paper {
width: 240px;
overflow: hidden;
border: 1px solid var(--border);
border-radius: var(--radius-card);
background: var(--bg-flyout);
box-shadow: var(--shadow-panel);
}
.admin-table-filter {
display: grid;
gap: var(--space-2);
padding: var(--space-2);
}
.admin-table-filter__search.MuiTextField-root {
width: 100%;
}
.admin-table-filter__options {
max-height: 280px;
overflow: auto;
}
.admin-table-filter__actions {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: var(--space-2);
}
.admin-table-filter__options .MuiMenuItem-root {
min-height: 34px;
border-radius: var(--radius-control);
color: var(--text-secondary);
}
.admin-table-filter__options .MuiMenuItem-root.Mui-selected {
background: var(--primary-hover);
color: var(--text-primary);
}
.admin-table-filter__empty {
padding: var(--space-4) var(--space-2);
color: var(--text-tertiary);
font-size: var(--admin-font-size);
text-align: center;
}
.admin-table .empty-state--table {
flex: 1;
}
.table-frame {
display: flex;
flex: 1;
min-height: 0;
flex-direction: column;
background: var(--bg-card);
}
.table-frame .table-scroll {
flex: 1;
min-height: 0;
overflow: auto;
}
.table-frame .admin-row--head {
position: sticky;
top: 0;
z-index: 1;
}
.content-panel,
.table-frame,
.table-card {
overflow: hidden;
border: 1px solid var(--border);
border-radius: var(--radius-card);
background: var(--bg-card);
}
.content-panel {
display: flex;
flex: 1;
flex-direction: column;
min-height: 520px;
}
.empty-state--table {
min-height: 340px;
align-content: center;
}
.empty-state__title {
color: var(--text-secondary);
font-weight: 650;
}
.empty-state__action {
display: flex;
justify-content: center;
}