@font-face { font-family: Twemoji; src: url('../public/font/Twemoji.Mozilla.v15.1.0.woff2') format('woff2'); font-display: swap; } :root { --tc-link: hsl(213deg 100% 45%); /* user mxid colors */ --mx-uc-1: hsl(208, 100%, 45%); --mx-uc-2: hsl(302, 100%, 30%); --mx-uc-3: hsl(163, 100%, 30%); --mx-uc-4: hsl(343, 100%, 45%); --mx-uc-5: hsl(24, 100%, 45%); --mx-uc-6: hsl(181, 100%, 30%); --mx-uc-7: hsl(242, 100%, 45%); --mx-uc-8: hsl(94, 100%, 35%); /* Horseshoe void seam — see `src/app/styles/horseshoe.ts`. The :root default is the light-theme value; `.dark-theme` overrides below. */ --vojo-horseshoe-void: #d6d6e3; /* Peer (not-own) bubble bg — every «чужое» message reshades to this, in 1-1 DMs, groups, channels alike. Light: slight off-white step from #ffffff. Dark override below. */ --vojo-peer-bubble-bg: #f5f5fa; /* Stream timeline rail (vertical line through dots) + day-divider horizontal segments. Light: hairline cool-grey; dark overrides below. */ --vojo-timeline-rail: #e8e8f2; --font-emoji: 'Twemoji_DISABLED'; --font-secondary: 'InterVariable', var(--font-emoji), sans-serif; } .dark-theme { --tc-link: hsl(213deg 100% 80%); --mx-uc-1: hsl(208, 100%, 75%); --mx-uc-2: hsl(301, 100%, 80%); --mx-uc-3: hsl(163, 100%, 70%); --mx-uc-4: hsl(343, 100%, 75%); --mx-uc-5: hsl(24, 100%, 70%); --mx-uc-6: hsl(181, 100%, 60%); --mx-uc-7: hsl(243, 100%, 80%); --mx-uc-8: hsl(94, 100%, 80%); --vojo-horseshoe-void: #000000; --vojo-peer-bubble-bg: #000000; --vojo-timeline-rail: #000000; --font-secondary: 'InterVariable', var(--font-emoji), sans-serif; } html { height: 100%; overflow: hidden; } body { margin: 0; padding: 0; height: 100%; overflow: hidden; /* Cold-start fallback before `app/styles/global.css.ts` parses + the ThemeManager mounts and binds `--vojo-safe-area-bg` to the active palette's Background.Container token. The literal `#0d0e11` matches dark; the @media block below mirrors it for light so a light-theme user doesn't see a dark flash in the safe-area zone. */ background-color: var(--vojo-safe-area-bg, #0d0e11); font-family: var(--font-secondary); font-size: 16px; font-weight: 400; /*Why font-variant-ligatures => https://github.com/rsms/inter/issues/222 */ font-variant-ligatures: no-contextual; } @media (prefers-color-scheme: light) { body { background-color: var(--vojo-safe-area-bg, #f2f2f7); } } #root { width: 100%; height: 100%; display: flex; flex-direction: column; /* Top & bottom insets are intentionally zero: each screen extends its own bg through the system-bar zones (status bar at top, gesture pill at bottom). Top-anchored UI pads itself down by `--vojo-safe-top` (see `app/styles/global.css.ts`) — covered: PageHeader, PageNavHeader (chat / chat-list headers via recipe), AuthLayout root. Side insets stay so app chrome clears display cutouts on devices with one. */ padding: 0 env(safe-area-inset-right) 0 env(safe-area-inset-left); } *, *::before, *::after { box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-tap-highlight-color: transparent; } a { color: var(--tc-link); text-decoration: none; } a:hover { text-decoration: underline; } [data-mx-spoiler][aria-pressed='true'] a { color: transparent; pointer-events: none; } b { font-weight: 500; } label { margin: 0; padding: 0; } button, textarea { margin: 0; padding: 0; background-color: transparent; color: inherit; font-family: inherit; font-size: inherit; font-weight: inherit; line-height: inherit; letter-spacing: inherit; border: none; } button { max-width: 100%; text-transform: none; text-align: inherit; overflow: visible; -webkit-appearance: button; } textarea, input, input[type], input[type='text'], input[type='username'], input[type='password'], input[type='email'], input[type='checkbox'] { -webkit-appearance: none; -moz-appearance: none; appearance: none; } textarea { color: inherit; word-spacing: inherit; } audio:not([controls]) { display: none !important; } /* * Orbit-sweep border for the incoming-call horseshoe. * * Animating a conic-gradient angle requires the property to be registered * via @property — otherwise CSS treats custom properties as untyped * strings and the animation snaps instead of interpolating. Defined here * (rather than in vanilla-extract) because @property has no first-class * binding in @vanilla-extract/css. The keyframe is paired with it so * both halves stay in one place. */ @property --vojo-orbit-angle { syntax: ''; initial-value: 0deg; inherits: false; } @keyframes vojo-orbit-sweep { to { --vojo-orbit-angle: 360deg; } }