.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; } }