Story 3.2 done

This commit is contained in:
2026-05-23 18:23:48 +02:00
parent d175f92806
commit a1e8886fce
66 changed files with 18258 additions and 1650 deletions
+108 -3
View File
@@ -1,3 +1,108 @@
// All selectors MUST be scoped under .scrying-pool.
// Use --sp-* tokens only — no Foundry --color-* / --font-* / --border-* tokens allowed.
// Implemented in story 1.5+.
/**
* 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; }
}
}