/
spirzen
/
it-knowledge-base
Обзор
Документация
Войти
/
spirzen
/
it-knowledge-base
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
Mobile
src/components/SynchronousInteraction.module.css
343 строки
6 KB
Spirzen
Components Rework
19 май 2026, 19:17
19 май 2026, 19:17
d8d92a3
Код
Авторство
О чём код?
.root { --sync-client: var(--ifm-color-primary); --sync-server: #2e7d32; --sync-wait: #ed6c02; } .diagram { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 0.5rem; margin: 1rem 0; } @media (max-width: 600px) { .diagram { grid-template-columns: 1fr; gap: 0.5rem; } .track { min-height: 28px; min-width: unset; width: 100%; } .trackInner { flex-direction: row; } .trackArrow { transform: rotate(90deg); } } .node { position: relative; padding: 0.85rem 0.75rem; border-radius: 10px; border: 2px solid var(--demo-border, var(--ifm-color-emphasis-300)); background: var(--ifm-background-surface-color); text-align: center; transition: border-color 0.25s ease, box-shadow 0.25s ease, transform 0.25s ease; } .nodeIdle { opacity: 0.72; } .nodeActiveClient { border-color: var(--sync-client); box-shadow: 0 0 0 3px color-mix(in srgb, var(--sync-client) 22%, transparent); transform: translateY(-2px); } .nodeActiveServer { border-color: var(--sync-server); box-shadow: 0 0 0 3px color-mix(in srgb, var(--sync-server) 22%, transparent); transform: translateY(-2px); } .nodeBlocked { border-color: var(--sync-wait); box-shadow: 0 0 0 3px color-mix(in srgb, var(--sync-wait) 25%, transparent); } .nodeIcon { font-size: 1.5rem; line-height: 1; margin-bottom: 0.35rem; } .nodeTitle { margin: 0; font-size: 0.82rem; font-weight: 700; color: var(--ifm-color-content); } .nodeHint { margin: 0.25rem 0 0; font-size: 0.72rem; color: var(--demo-muted, var(--ifm-color-content-secondary)); line-height: 1.35; } .track { position: relative; min-width: 3rem; min-height: 2.5rem; display: flex; align-items: center; justify-content: center; } .trackInner { display: flex; flex-direction: column; align-items: center; gap: 0.15rem; width: 100%; } .trackLine { width: 100%; height: 3px; border-radius: 999px; background: var(--demo-border, var(--ifm-color-emphasis-300)); position: relative; overflow: visible; } .trackLineActive { background: linear-gradient( 90deg, var(--ifm-color-emphasis-300), var(--ifm-color-primary) ); } .trackLineWaiting { background: linear-gradient( 90deg, color-mix(in srgb, var(--sync-wait) 30%, transparent), var(--sync-wait), color-mix(in srgb, var(--sync-wait) 30%, transparent) ); animation: syncLineWait 1.2s ease-in-out infinite; } @keyframes syncLineWait { 0%, 100% { opacity: 0.55; } 50% { opacity: 1; } } .trackArrow { font-size: 0.85rem; color: var(--demo-muted, var(--ifm-color-content-secondary)); line-height: 1; } .packet { position: absolute; top: 50%; left: 0; width: 12px; height: 12px; margin-top: -6px; border-radius: 50%; background: var(--ifm-color-primary); box-shadow: 0 0 10px color-mix(in srgb, var(--ifm-color-primary) 55%, transparent); opacity: 0; pointer-events: none; } .packetVisible { opacity: 1; animation: syncPacketTravel var(--packet-duration, 1.2s) ease-in-out forwards; } .packetPaused { left: 50%; margin-left: -6px; animation: syncPacketPulse 1s ease-in-out infinite; } .packetVisible.packetPaused { animation: syncPacketPulse 1s ease-in-out infinite; } @keyframes syncPacketTravel { 0% { left: 0; transform: scale(0.85); } 15% { transform: scale(1.1); } 100% { left: calc(100% - 12px); transform: scale(1); } } @keyframes syncPacketPulse { 0%, 100% { transform: scale(1); box-shadow: 0 0 8px color-mix(in srgb, var(--sync-wait) 50%, transparent); } 50% { transform: scale(1.15); box-shadow: 0 0 14px color-mix(in srgb, var(--sync-wait) 70%, transparent); } } .packetReverse { animation-name: syncPacketTravelReverse; } @keyframes syncPacketTravelReverse { 0% { left: calc(100% - 12px); transform: scale(0.85); } 15% { transform: scale(1.1); } 100% { left: 0; transform: scale(1); } } .clientPanel { margin-top: 0.75rem; padding: 0.75rem; border-radius: 8px; border: 1px dashed color-mix(in srgb, var(--sync-wait) 50%, var(--demo-border)); background: color-mix(in srgb, var(--sync-wait) 10%, var(--ifm-background-surface-color)); animation: syncPanelIn 0.35s ease; } @keyframes syncPanelIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } } .clientPanelTitle { margin: 0 0 0.5rem; font-size: 0.8rem; font-weight: 700; color: var(--sync-wait); display: flex; align-items: center; gap: 0.35rem; } .clientPanelTitle::before { content: ''; width: 8px; height: 8px; border-radius: 50%; background: var(--sync-wait); animation: syncBlockPulse 0.9s ease-in-out infinite; } @keyframes syncBlockPulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } } .clientFrozen { margin: 0; font-size: 0.8rem; color: var(--ifm-color-content); font-family: var(--ifm-font-family-monospace); opacity: 0.55; text-decoration: line-through; } .clientStats { margin-top: 0.5rem; font-size: 0.75rem; color: var(--demo-muted, var(--ifm-color-content-secondary)); } .stageDesc { margin: 0.75rem 0 0; padding: 0.65rem 0.85rem; font-size: 0.85rem; line-height: 1.5; border-radius: 8px; background: var(--ifm-background-surface-color); border-left: 3px solid var(--ifm-color-primary); color: var(--ifm-color-content); } .controls { margin-top: 1rem; } .returnHint { grid-column: 1 / -1; margin: 0.35rem 0 0; font-size: 0.75rem; text-align: center; color: var(--demo-muted, var(--ifm-color-content-secondary)); } @media (prefers-reduced-motion: reduce) { .packetVisible { animation: none; left: calc(100% - 12px); opacity: 1; } .packetPaused.packetVisible { left: 50%; margin-left: -6px; } .packetReverse.packetVisible { left: 0; } .trackLineWaiting { animation: none; opacity: 1; } .clientPanel { animation: none; } .clientPanelTitle::before { animation: none; } .nodeActiveClient, .nodeActiveServer { transform: none; } }