UNPKG

realtimecursor

Version:

Real-time collaboration system with cursor tracking and approval workflow

81 lines (70 loc) 1.45 kB
.realtimecursor-cursor { position: fixed; pointer-events: none; z-index: 9999; } .realtimecursor-pointer { width: 12px; height: 12px; border-radius: 50%; box-shadow: 0 0 5px rgba(0,0,0,0.3); } .realtimecursor-name { padding: 2px 6px; border-radius: 4px; font-size: 12px; margin-top: 4px; white-space: nowrap; color: #fff; } .realtimecursor-text-cursor { position: absolute; pointer-events: none; z-index: 9998; } .realtimecursor-caret { width: 2px; height: 20px; animation: realtimecursor-blink 1s infinite; } .realtimecursor-flag { position: absolute; top: -18px; left: -8px; width: 18px; height: 18px; border-radius: 4px; display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: bold; color: #fff; } @keyframes realtimecursor-blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } } .realtimecursor-typing-indicator { display: inline-block; margin-left: 5px; } .realtimecursor-dot { display: inline-block; width: 4px; height: 4px; border-radius: 50%; background-color: #6b7280; margin: 0 1px; animation: realtimecursor-typing 1.4s infinite both; } .realtimecursor-dot:nth-child(2) { animation-delay: 0.2s; } .realtimecursor-dot:nth-child(3) { animation-delay: 0.4s; } @keyframes realtimecursor-typing { 0%, 100% { opacity: 0.2; transform: translateY(0); } 50% { opacity: 0.8; transform: translateY(-2px); } }