Files
scrying-pool/styles/components/_participant-card.less
T
2026-05-23 18:23:48 +02:00

109 lines
4.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* styles/components/_participant-card.less
*
* 80×100px card tile used in the Director's Board grid.
* All selectors scoped under .scrying-pool.
* Uses --sp-* tokens only — no Foundry --color-* / --font-* / --border-* tokens.
*/
.scrying-pool .participant-card {
width: 80px;
height: 100px;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
border: 2px solid var(--sp-border);
border-radius: 4px;
background: var(--sp-surface);
cursor: pointer;
overflow: hidden;
transition:
border-color var(--sp-transition-state),
background-color var(--sp-transition-state);
// ── State ring colour + shape signals (second-signal rule) ──────────────
&.sp-state-active { border-color: var(--sp-state-active-border); border-style: solid; background: var(--sp-state-active-bg); }
&.sp-state-hidden { border-color: var(--sp-state-hidden-border); border-style: dashed; background: var(--sp-state-hidden-bg); }
&.sp-state-self-muted { border-color: var(--sp-state-self-muted-border); border-style: solid; background: var(--sp-state-self-muted-bg); }
&.sp-state-offline { border-color: var(--sp-state-offline-border); border-style: none; background: var(--sp-state-offline-bg); }
&.sp-state-cam-lost { border-color: var(--sp-state-cam-lost-border); border-style: dashed; background: var(--sp-state-cam-lost-bg); }
&.sp-state-reconnecting { border-color: var(--sp-state-reconnecting-border); border-style: solid; background: var(--sp-state-reconnecting-bg); }
&.sp-state-never-connected { border-color: var(--sp-state-never-connected-border); border-style: none; background: var(--sp-state-never-connected-bg); }
&.sp-state-ghost { border-color: var(--sp-state-ghost-border); border-style: dotted; background: var(--sp-state-ghost-bg); }
&.sp-state-pending { border-color: var(--sp-state-pending-border); border-style: solid; background: var(--sp-state-pending-bg); }
// ── Avatar ──────────────────────────────────────────────────────────────
&__avatar {
width: 48px;
height: 48px;
margin: 8px auto 4px;
flex-shrink: 0;
img {
width: 100%;
height: 100%;
border-radius: 50%;
object-fit: cover;
display: block;
}
}
// ── Name (12px, 2-line truncate) ─────────────────────────────────────────
&__name {
font-size: 12px;
line-height: 1.2;
text-align: center;
color: var(--sp-text-primary);
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
padding: 0 4px;
margin: 0;
width: 100%;
word-break: break-word;
}
// ── Toggle overlay (shown on hover / focus-within) ───────────────────────
&__toggle {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
background: var(--sp-badge-bg);
color: var(--sp-badge-text);
border: none;
border-radius: 2px;
cursor: pointer;
opacity: 0;
transition: opacity var(--sp-transition-state);
font-size: 18px;
padding: 0;
&:focus-visible {
opacity: 1;
}
}
&:hover &__toggle,
&:focus-within &__toggle {
opacity: 1;
}
// ── Focus ring (inherits module-wide pattern from tokens/_focus.less) ────
&:focus-visible {
outline: none;
box-shadow: var(--sp-focus-ring), 0 0 0 4px var(--sp-surface);
}
}
// ── Reduced motion ────────────────────────────────────────────────────────
@media (prefers-reduced-motion: reduce) {
.scrying-pool .participant-card {
transition: none;
&__toggle { transition: none; }
}
}