vojo/src/index.css

217 lines
6.3 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 for the CHANNEL layout (groups / channels /
thread drawer). The 1-1 Stream layout's incoming bubble does NOT use this
— it binds directly to `color.Surface.Container` (the composer surface).
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;
/* DM 1-1 «VS Code chat» redesign tokens (see
docs/plans/dm_stream_vscode_redesign.md). Light-theme defaults here;
dark overrides in `.dark-theme`.
* stream-name-own — own author label colour AND own rail dots (strong
neutral «white»: black light / white dark). Used by
StreamName and by useDotColor's own resting dot.
* stream-name-peer — peer author label colour (brand purple — the Dawn
lavender accent).
* dot-neutral — gray rail dot for PEER (incoming) dots. (Own dots use
stream-name-own; green = my-read-awaiting-reply, gold =
mention, red = my-failed are folds tokens in useDotColor.)
NB: the incoming-bubble fill is NOT a var — `StreamBubble` binds it to
`color.Surface.Container` so it always matches the composer card. */
--vojo-stream-name-own: #000000;
--vojo-stream-name-peer: #5b6aff;
--vojo-dot-neutral: #9aa0aa;
--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;
/* Subtle gray hairline so the thin rail reads against the #0d0e11
chat surface (was pure #000000, which vanished into the bg). */
--vojo-timeline-rail: #2a2e38;
/* DM 1-1 «VS Code chat» redesign — dark palette. (Incoming-bubble fill
binds to color.Surface.Container in StreamBubble, not a var here.)
Own nick + own dots = white; peer nick = #9580ff Dawn brand lavender;
peer dots = gray (dot-neutral). */
--vojo-stream-name-own: #ffffff;
--vojo-stream-name-peer: #9580ff;
--vojo-dot-neutral: #6b7280;
--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;
}
}