578 lines
13 KiB
CSS

.desktop-presence-page {
container-name: desktop-presence;
container-type: inline-size;
display: flex;
min-height: calc(100% - 46px);
flex-direction: column;
gap: var(--sycm-page-section-gap);
background: var(--sycm-bg-page-soft);
}
.desktop-presence-page__header {
display: flex;
align-items: center;
justify-content: space-between;
min-height: 84px;
gap: var(--sycm-space-lg);
margin: calc(var(--sycm-page-padding-y) * -1) calc(var(--sycm-page-padding-x) * -1) 0;
padding: 14px calc(var(--sycm-page-padding-x) + 2px);
border-bottom: 1px solid var(--sycm-border-base);
background: var(--sycm-bg-container);
}
.desktop-presence-page__heading > div {
display: flex;
align-items: center;
gap: 10px;
}
.desktop-presence-page__header h1 {
margin: 0;
color: var(--sycm-text-strong);
font-size: var(--sycm-font-size-page);
font-weight: var(--sycm-font-weight-semibold);
line-height: var(--sycm-line-height-tight);
letter-spacing: 0;
}
.desktop-presence-page__header p {
margin: 5px 0 0;
color: var(--sycm-text-secondary);
font-size: var(--sycm-font-size-caption);
}
.desktop-presence-live-label,
.desktop-presence-device-state {
display: inline-flex;
align-items: center;
gap: 6px;
color: var(--sycm-color-success);
font-size: var(--sycm-font-size-caption);
font-weight: var(--sycm-font-weight-medium);
white-space: nowrap;
}
.desktop-presence-live-label {
height: 22px;
border: 1px solid var(--sycm-color-success-border);
border-radius: var(--sycm-radius-pill);
padding: 0 8px;
background: var(--sycm-color-success-bg);
}
.desktop-presence-live-label i,
.desktop-presence-device-state i {
width: 6px;
height: 6px;
flex: 0 0 6px;
border-radius: 50%;
background: currentColor;
}
.desktop-presence-live-label i {
box-shadow: 0 0 0 4px rgba(27, 181, 116, 0.12);
animation: desktop-presence-pulse 2s ease-in-out infinite;
}
.desktop-presence-page__actions {
display: flex;
flex: 0 0 auto;
align-items: center;
gap: var(--sycm-space-sm);
}
.desktop-presence-sync-time {
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 2px;
}
.desktop-presence-sync-time span {
color: var(--sycm-text-tertiary);
font-size: var(--sycm-font-size-micro);
}
.desktop-presence-sync-time strong {
color: var(--sycm-text-secondary);
font-family: var(--sycm-font-family-number);
font-size: var(--sycm-font-size-caption);
font-weight: var(--sycm-font-weight-medium);
}
.desktop-presence-refresh.ant-btn {
width: var(--sycm-control-height);
min-width: var(--sycm-control-height);
padding: 0;
border-color: var(--sycm-border-base);
border-radius: var(--sycm-radius-md);
color: var(--sycm-text-secondary);
}
.desktop-presence-refresh.ant-btn:hover {
border-color: var(--sycm-color-primary);
background: var(--sycm-color-primary-soft);
color: var(--sycm-color-primary);
}
.desktop-presence-status-band {
display: grid;
min-height: 104px;
grid-template-columns: minmax(250px, 1.35fr) repeat(3, minmax(160px, 0.75fr));
align-items: stretch;
overflow: hidden;
border: 1px solid var(--sycm-border-base);
border-radius: var(--sycm-radius-lg);
background: var(--sycm-bg-container);
box-shadow: var(--sycm-shadow-card);
}
.desktop-presence-service,
.desktop-presence-metric {
display: flex;
min-width: 0;
align-items: center;
gap: 14px;
padding: 16px 20px;
border-right: 1px solid var(--sycm-border-light);
}
.desktop-presence-service {
position: relative;
background: #fbfffd;
}
.desktop-presence-service::before {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 3px;
background: var(--sycm-color-success);
content: '';
}
.desktop-presence-service.is-error {
background: #fffafa;
}
.desktop-presence-service.is-error::before {
background: var(--sycm-color-danger);
}
.desktop-presence-service__icon,
.desktop-presence-metric__icon,
.desktop-presence-device__icon {
display: grid;
place-items: center;
flex: 0 0 auto;
}
.desktop-presence-service__icon {
width: 42px;
height: 42px;
place-items: center;
border-radius: 50%;
background: var(--sycm-color-success-bg);
color: var(--sycm-color-success);
font-size: 20px;
}
.desktop-presence-service.is-error .desktop-presence-service__icon {
background: var(--sycm-color-danger-bg);
color: var(--sycm-color-danger);
}
.desktop-presence-service.is-loading .desktop-presence-service__icon .anticon {
animation: desktop-presence-spin 1s linear infinite;
}
.desktop-presence-service > div,
.desktop-presence-metric > div {
display: flex;
min-width: 0;
flex-direction: column;
gap: 2px;
}
.desktop-presence-service span,
.desktop-presence-metric > div > span {
color: var(--sycm-text-secondary);
font-size: var(--sycm-font-size-caption);
}
.desktop-presence-service strong {
color: var(--sycm-text-strong);
font-size: var(--sycm-font-size-body-strong);
font-weight: var(--sycm-font-weight-semibold);
}
.desktop-presence-service small {
color: var(--sycm-text-tertiary);
font-size: var(--sycm-font-size-micro);
}
.desktop-presence-metric:last-child {
border-right: 0;
}
.desktop-presence-metric__icon {
width: 36px;
height: 36px;
border-radius: var(--sycm-radius-lg);
background: var(--sycm-color-primary-soft);
color: var(--sycm-color-primary);
font-size: 18px;
}
.desktop-presence-metric.is-users .desktop-presence-metric__icon {
background: #eef8ff;
color: #1479b8;
}
.desktop-presence-metric.is-offline .desktop-presence-metric__icon {
background: var(--sycm-color-warning-bg);
color: var(--sycm-color-warning);
}
.desktop-presence-metric strong {
color: var(--sycm-text-strong);
font-family: var(--sycm-font-family-number);
font-size: 24px;
font-weight: var(--sycm-font-weight-semibold);
line-height: 1.15;
}
.desktop-presence-metric strong small {
margin-left: 5px;
color: var(--sycm-text-tertiary);
font-family: var(--sycm-font-family);
font-size: var(--sycm-font-size-caption);
font-weight: var(--sycm-font-weight-regular);
}
.desktop-presence-table-panel {
display: flex;
min-height: 410px;
flex: 1 1 auto;
flex-direction: column;
overflow: hidden;
border: 1px solid var(--sycm-border-base);
border-radius: var(--sycm-radius-lg);
}
.desktop-presence-table-panel > .sycm-business-panel__header {
min-height: 58px;
}
.desktop-presence-table-panel > .sycm-business-panel__body {
display: flex;
min-height: 0;
flex: 1 1 auto;
flex-direction: column;
padding: 0;
}
.desktop-presence-table-panel .ant-table-wrapper {
flex: 1 1 auto;
}
.desktop-presence-table-panel .ant-table,
.desktop-presence-table-panel .ant-table-container,
.desktop-presence-table-panel .ant-table-content {
border-radius: 0;
overflow-x: hidden !important;
}
.desktop-presence-table-panel .ant-table-thead > tr > th {
height: 38px;
padding: 8px 12px;
background: var(--sycm-bg-table-head);
color: var(--sycm-text-secondary);
font-size: var(--sycm-font-size-caption);
font-weight: var(--sycm-font-weight-medium);
}
.desktop-presence-table-panel .ant-table-tbody > tr > td {
min-height: 58px;
padding: 10px 12px;
border-bottom-color: var(--sycm-border-light);
vertical-align: middle;
}
.desktop-presence-table-panel .ant-table-tbody > tr:hover > td {
background: #fafcff;
}
.desktop-presence-table-panel .ant-table-placeholder > td {
height: clamp(300px, calc(100vh - 430px), 560px);
padding: 0 !important;
background: var(--sycm-bg-container) !important;
}
.desktop-presence-filter.ant-segmented {
border: 1px solid var(--sycm-border-light);
border-radius: var(--sycm-radius-md);
padding: 2px;
background: var(--sycm-bg-subtle);
color: var(--sycm-text-secondary);
font-size: var(--sycm-font-size-caption);
}
.desktop-presence-filter .ant-segmented-item {
min-width: 74px;
}
.desktop-presence-filter .ant-segmented-item-selected {
color: var(--sycm-text-strong);
font-weight: var(--sycm-font-weight-medium);
}
.desktop-presence-empty {
display: flex;
min-height: clamp(300px, calc(100vh - 430px), 560px);
align-items: center;
justify-content: center;
flex-direction: column;
padding: 36px 20px;
text-align: center;
}
.desktop-presence-empty__icon {
display: grid;
width: 58px;
height: 58px;
margin-bottom: 14px;
place-items: center;
border: 1px solid var(--sycm-color-primary-border);
border-radius: 50%;
background: var(--sycm-color-primary-soft);
color: var(--sycm-color-primary);
font-size: 25px;
}
.desktop-presence-empty strong {
color: var(--sycm-text-strong);
font-size: var(--sycm-font-size-body-strong);
font-weight: var(--sycm-font-weight-semibold);
}
.desktop-presence-empty p {
margin: 6px 0 10px;
color: var(--sycm-text-tertiary);
font-size: var(--sycm-font-size-caption);
}
.desktop-presence-empty .ant-btn {
color: var(--sycm-color-primary);
font-size: var(--sycm-font-size-caption);
}
.desktop-presence-user,
.desktop-presence-device,
.desktop-presence-version,
.desktop-presence-duration,
.desktop-presence-heartbeat {
display: flex;
min-width: 0;
align-items: center;
gap: 10px;
}
.desktop-presence-user > div,
.desktop-presence-device > div,
.desktop-presence-version,
.desktop-presence-duration,
.desktop-presence-heartbeat {
flex-direction: column;
align-items: flex-start;
gap: 2px;
}
.desktop-presence-user .ant-avatar {
flex: 0 0 36px;
background: var(--sycm-color-primary-soft);
color: var(--sycm-color-primary);
font-weight: var(--sycm-font-weight-semibold);
}
.desktop-presence-user strong,
.desktop-presence-device strong,
.desktop-presence-duration strong,
.desktop-presence-heartbeat strong {
color: var(--sycm-text-strong);
font-weight: 600;
}
.desktop-presence-user span,
.desktop-presence-device span,
.desktop-presence-version span,
.desktop-presence-duration span,
.desktop-presence-heartbeat span {
color: var(--sycm-text-tertiary);
font-size: var(--sycm-font-size-micro);
white-space: normal;
word-break: break-word;
}
.desktop-presence-user strong,
.desktop-presence-user span,
.desktop-presence-device strong,
.desktop-presence-device span,
.desktop-presence-version span {
overflow-wrap: anywhere;
}
.desktop-presence-device__icon {
width: 30px;
height: 30px;
border-radius: var(--sycm-radius-md);
background: var(--sycm-bg-subtle);
color: var(--sycm-text-secondary);
font-size: 15px;
}
.desktop-presence-version .ant-tag {
margin: 0;
border-color: var(--sycm-color-primary-border);
border-radius: var(--sycm-radius-sm);
background: var(--sycm-color-primary-soft);
color: var(--sycm-color-primary);
font-family: var(--sycm-font-family-number);
font-size: var(--sycm-font-size-micro);
}
.desktop-presence-department {
color: var(--sycm-text-secondary);
font-size: var(--sycm-font-size-caption);
overflow-wrap: anywhere;
}
.desktop-presence-ip {
display: inline-block;
border-radius: var(--sycm-radius-sm);
padding: 3px 6px;
background: var(--sycm-bg-subtle);
color: var(--sycm-text-secondary);
font-family: var(--sycm-font-family-number);
font-size: var(--sycm-font-size-micro);
word-break: break-all;
}
.desktop-presence-device-state {
justify-content: flex-start;
}
.desktop-presence-device-state.is-offline {
color: var(--sycm-text-tertiary);
}
.desktop-presence-row-offline > td {
background: #fcfcfd;
}
.desktop-presence-row-offline .desktop-presence-user .ant-avatar,
.desktop-presence-row-offline .desktop-presence-device__icon {
background: var(--sycm-bg-subtle);
color: var(--sycm-text-tertiary);
}
.desktop-presence-row-offline .desktop-presence-heartbeat strong {
color: var(--sycm-text-secondary);
}
.desktop-presence-heartbeat strong {
color: var(--sycm-color-success);
}
@keyframes desktop-presence-pulse {
0%,
100% {
box-shadow: 0 0 0 3px rgba(27, 181, 116, 0.1);
}
50% {
box-shadow: 0 0 0 6px rgba(27, 181, 116, 0.03);
}
}
@keyframes desktop-presence-spin {
to {
transform: rotate(360deg);
}
}
@container desktop-presence (max-width: 980px) {
.desktop-presence-status-band {
grid-template-columns: repeat(2, 1fr);
}
.desktop-presence-service,
.desktop-presence-metric {
border-bottom: 1px solid var(--sycm-border-light);
}
.desktop-presence-service,
.desktop-presence-metric:nth-child(3) {
border-right: 0;
}
.desktop-presence-metric:nth-child(3),
.desktop-presence-metric:last-child {
border-bottom: 0;
}
}
@container desktop-presence (max-width: 680px) {
.desktop-presence-page__header {
align-items: flex-start;
}
.desktop-presence-status-band {
grid-template-columns: 1fr;
}
.desktop-presence-service,
.desktop-presence-metric,
.desktop-presence-service:nth-child(n),
.desktop-presence-metric:nth-child(n) {
min-height: 82px;
border-right: 0;
border-bottom: 1px solid var(--sycm-border-light);
}
.desktop-presence-metric:last-child {
border-bottom: 0;
}
.desktop-presence-sync-time {
display: none;
}
.desktop-presence-table-panel > .sycm-business-panel__header {
align-items: flex-start;
flex-direction: column;
}
.desktop-presence-table-panel .sycm-business-panel__extra,
.desktop-presence-filter.ant-segmented {
width: 100%;
}
.desktop-presence-filter .ant-segmented-group {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.desktop-presence-filter .ant-segmented-item {
min-width: 0;
}
}
@media (prefers-reduced-motion: reduce) {
.desktop-presence-live-label i,
.desktop-presence-service.is-loading .desktop-presence-service__icon .anticon {
animation: none;
}
}