vojo/src/app/features/room/RoomViewHeaderDm.css.ts

119 lines
4.2 KiB
TypeScript
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.

import { style } from '@vanilla-extract/css';
import { color, config, toRem } from 'folds';
// Tighten the header's left gutter so the avatar + title block sits
// further left than `PageHeader`'s desktop default (`S400` = 16px). We
// match the back-arrow icon-button's natural top/bottom clearance with
// `S200` (=8px) so its hover background looks symmetrically inset on all
// four sides. Right side padding is untouched, so the action buttons
// keep their inset.
export const HeaderShell = style({
paddingLeft: config.space.S200,
});
// Tap-target wrapper for the peer avatar — opens the user-room-profile sheet
// in 1:1 chrome. Reset native button styling so it sits flush with the
// surrounding header row.
export const PeerAvatarTrigger = style({
background: 'transparent',
border: 'none',
padding: 0,
cursor: 'pointer',
display: 'inline-flex',
alignItems: 'center',
justifyContent: 'center',
borderRadius: '50%',
flexShrink: 0,
':focus-visible': {
outline: `2px solid ${color.Primary.Main}`,
outlineOffset: 2,
},
});
export const PeerAvatarStatic = style({
display: 'inline-flex',
alignItems: 'center',
justifyContent: 'center',
flexShrink: 0,
});
// Title row: name + «онлайн» presence tag on a single line, identical on
// mobile and desktop. Name truncates first; the tag never shrinks. Vertical
// alignment is `center` so the tag sits on the visual midline of the room
// name regardless of the font-size delta between the H4/H5 name and the
// T200 tag text.
export const TitleRow = style({
display: 'flex',
alignItems: 'center',
gap: config.space.S200,
minWidth: 0,
});
export const RoomName = style({
minWidth: 0,
flexShrink: 1,
});
// Inline-flex chip with `alignItems: center` gives a true visual-center
// alignment of the lock icon with the «e2ee» glyphs (not the baseline-plus-
// x-height/2 approximation that `vertical-align: middle` produces on inline
// elements). The parent `TitleRow` is also `alignItems: center`, so the
// chip's outer midline lands on the room name's midline — both centerings
// are real, no baseline math involved.
export const E2eeChip = style({
display: 'inline-flex',
alignItems: 'center',
gap: '0.25em',
color: color.Success.Main,
flexShrink: 0,
whiteSpace: 'nowrap',
});
// Icon sized 1.1× down from the chip's font (per spec). `1em` makes it track
// the chip's text size automatically — no rem/px literal. The flex parent
// handles vertical centering, so no `vertical-align` nudge is needed here.
export const E2eeIcon = style({
width: 'calc(1em / 1.1)',
height: 'calc(1em / 1.1)',
});
// Subline row — flex container hosting the muted identifier (handle for
// 1:1, member-count for groups) and, in 1:1, the e2ee chip. The handle
// takes the flex-shrink budget so it ellipsises first under pressure;
// the chip stays at intrinsic width via its own `flex-shrink: 0`. Vertical
// alignment is `center` so the chip's icon-and-text inline-flex sits on
// the same midline as the handle text.
export const Subline = style({
marginTop: toRem(1),
display: 'flex',
alignItems: 'center',
gap: config.space.S200,
minWidth: 0,
});
// Muted handle / member-count segment — surface-on-container with `P400`
// fade, takes the entire flex-shrink budget so it ellipsises first under
// pressure. `min-width: 0` is required for `text-overflow` to engage on
// flex children. Mono font: matches the canon (the handle reads as an
// identifier, not prose).
export const SublineMuted = style({
color: color.Surface.OnContainer,
opacity: config.opacity.P400,
minWidth: 0,
flex: '0 1 auto',
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
fontFamily: 'ui-monospace, "JetBrains Mono Variable", "JetBrains Mono", monospace',
});
// «онлайн» presence tag — sibling of the room name in `TitleRow`. Same
// green as the e2ee chip (`color.Success.Main` = Dawn green `#7dd3a8`).
// `flex-shrink: 0` so the tag never collapses; `white-space: nowrap`
// prevents internal wrapping on tight viewports (the room name truncates
// first via `RoomName.flex-shrink: 1`).
export const OnlineTag = style({
color: color.Success.Main,
flexShrink: 0,
whiteSpace: 'nowrap',
});