vojo/src/index.css

189 lines
4.7 KiB
CSS

@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: '<angle>';
initial-value: 0deg;
inherits: false;
}
@keyframes vojo-orbit-sweep {
to {
--vojo-orbit-angle: 360deg;
}
}