Move app to apps/web-react in pnpm workspace layout

This commit is contained in:
Kalle
2026-08-16 09:20:33 +03:00
parent 7e365ccfcf
commit bbc8ea57af
2913 changed files with 227 additions and 250 deletions

View File

@@ -0,0 +1,659 @@
/** biome-ignore-all lint/style/noDescendingSpecificity: Biome v2 migration */
@layer base {
* {
margin: 0;
overflow-wrap: break-word;
}
html {
color-scheme: light dark;
accent-color: var(--color-text-accent);
scroll-padding-top: var(--layout-sticky-top);
}
body {
width: 100%;
min-height: 100vh;
display: flex;
line-height: var(--line-height);
overflow-x: hidden;
color: var(--color-text);
background-color: var(--color-bg);
font-family: lexend, sans-serif;
-moz-osx-font-smoothing: antialiased;
-webkit-font-smoothing: antialiased;
-webkit-tab-highlight-color: transparent;
-webkit-text-size-adjust: 100%;
}
h1,
h2,
h3,
h4,
h5,
h6,
p {
overflow-wrap: anywhere;
}
h1,
h2,
h3 {
text-wrap: balance;
}
p {
text-wrap: pretty;
}
img,
svg,
canvas,
video,
audio,
iframe,
embed,
object {
display: block;
max-width: 100%;
}
input,
button,
textarea,
select {
font: inherit;
color: inherit;
}
details {
& summary {
cursor: pointer;
user-select: none;
-webkit-user-select: none;
}
}
a {
color: var(--color-text-accent);
text-decoration: none;
border-radius: var(--radius-field);
&:focus-visible {
outline: var(--focus-ring);
outline-offset: 1px;
}
}
/* :not([name="text"]) workaround not to select textarea on map planner */
textarea:not([name="text"]) {
width: 100%;
min-height: 8rem;
padding: var(--field-padding);
border: var(--border-style);
border-radius: var(--radius-field);
background-color: var(--color-bg);
font-size: var(--font-sm);
outline: none;
resize: both;
&:focus-within {
outline: var(--focus-ring);
outline-offset: 1px;
}
}
.input-container {
display: flex;
border: var(--border-style);
border-radius: var(--radius-field);
background-color: var(--color-bg);
height: var(--field-size);
font-size: var(--font-sm);
outline: none;
&:focus-within {
outline: var(--focus-ring);
outline-offset: 1px;
}
}
.in-container {
width: 100%;
padding: 0 var(--field-padding);
border: none;
background: transparent;
margin: auto 0;
outline: none;
&:-webkit-autofill,
&:-webkit-autofill:hover,
&:-webkit-autofill:focus {
-webkit-text-fill-color: var(--color-text);
-webkit-background-clip: text;
caret-color: var(--color-text);
}
}
.input-addon {
--addon-radius: calc(var(--radius-field) - 2px);
display: grid;
border-radius: var(--addon-radius) 0 0 var(--addon-radius);
background-color: var(--color-bg-high);
color: var(--color-text-high);
font-size: var(--font-sm);
padding-inline: var(--field-padding);
place-items: center;
white-space: nowrap;
}
input:not(.in-container) {
width: 100%;
box-sizing: border-box;
border: var(--border-style);
border-radius: var(--radius-field);
background: var(--color-bg);
padding: 0 var(--field-padding);
height: var(--field-size);
font-size: var(--font-sm);
outline: none;
&:-webkit-autofill,
&:-webkit-autofill:hover,
&:-webkit-autofill:focus {
-webkit-text-fill-color: var(--color-text);
-webkit-background-clip: text;
caret-color: var(--color-text);
}
&::placeholder {
color: var(--color-text-high);
}
&:disabled {
pointer-events: none;
cursor: not-allowed;
opacity: 0.5;
outline: none;
}
&:focus-within:not(:read-only) {
outline: var(--focus-ring);
outline-offset: 1px;
}
}
input[type="checkbox"] {
appearance: none;
cursor: pointer;
padding: 0;
width: var(--selector-size-sm);
height: var(--selector-size-sm);
border-radius: calc(var(--radius-selector) / 2);
background-color: var(--color-bg);
border: var(--border-style);
&:focus-within {
outline: none;
}
&:focus-visible {
outline: var(--focus-ring);
outline-offset: 1px;
}
&:checked,
&:indeterminate {
border-color: var(--color-text-accent);
background-color: var(--color-text-accent);
background-repeat: no-repeat;
background-position: center;
background-size: var(--field-size-icon) auto;
}
&:checked {
background-image: var(--field-icon-checkbox);
}
&:indeterminate {
background-image: var(--field-icon-minus);
}
/* Hacky selector to remove the margin bottom from the container from Label.tsx */
&:has(+ div > label) + div {
margin-bottom: 0;
}
}
input[type="radio"] {
appearance: none;
cursor: pointer;
vertical-align: middle;
width: var(--selector-size-sm);
height: var(--selector-size-sm);
background-color: var(--color-bg);
border: var(--border-style);
border-radius: var(--radius-full);
padding: 0;
&:focus-within {
outline: none;
}
&:focus-visible {
outline: var(--focus-ring);
outline-offset: 1px;
}
&::after {
content: "";
display: block;
width: 50%;
height: 50%;
border-radius: var(--radius-full);
background-color: var(--color-bg);
margin: auto;
margin-top: 25%;
}
&:checked {
border-color: var(--color-text-accent);
&::after {
background-color: var(--color-text-accent);
}
}
/* Hacky selector to remove the margin bottom from the container from Label.tsx */
&:has(+ div > label) + div {
margin-bottom: 0;
}
}
label {
display: block;
font-size: var(--font-xs);
font-weight: var(--weight-bold);
margin-block-end: var(--label-margin);
}
fieldset {
border: none;
border-radius: var(--radius-box);
background-color: var(--color-bg-high);
font-size: var(--font-sm);
padding-block-end: var(--s-3);
padding-inline: var(--s-3);
}
legend {
border-radius: var(--radius-field);
background-color: transparent;
font-size: var(--font-xs);
font-weight: var(--weight-bold);
}
article {
white-space: pre-wrap;
}
select {
all: unset;
width: 100%;
box-sizing: border-box;
border: var(--border-style);
border-radius: var(--radius-field);
background-color: var(--color-bg);
cursor: pointer;
padding: 0 var(--field-padding);
padding-right: calc(
var(--field-size-icon) +
var(--field-padding) +
var(--s-2)
);
height: var(--field-size);
font-size: var(--font-sm);
display: inline-flex;
align-items: center;
text-overflow: ellipsis;
white-space: nowrap;
appearance: none;
overflow: hidden;
@supports (appearance: base-select) {
appearance: base-select;
}
&:disabled {
pointer-events: none;
cursor: not-allowed;
opacity: 0.5;
outline: none;
}
&:focus-within {
outline: var(--focus-ring);
outline-offset: 1px;
}
&::picker(select) {
@supports (appearance: base-select) {
appearance: base-select;
}
background-color: var(--color-bg);
border: var(--border-style);
border-radius: var(--radius-field);
padding: var(--s-1);
margin: 0.5rem;
translate: -0.5rem;
max-height: 50dvh;
scrollbar-width: thin;
scrollbar-color: var(--color-bg-higher) transparent;
}
&::picker-icon {
display: none;
}
optgroup {
color: var(--color-text);
}
option {
background-color: var(--color-bg);
color: var(--color-text);
border-radius: var(--radius-field);
font-size: var(--font-sm);
font-weight: var(--weight-semi);
padding: var(--s-1-5);
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
&[disabled] {
color: var(--color-text-high);
}
&:hover:not([disabled]) {
background-color: var(--color-bg-high);
}
}
}
input[type="date"],
input[type="datetime-local"],
input[type="month"],
input[type="time"],
input[type="week"],
select {
background-position: center right var(--field-padding);
background-size: var(--field-size-icon) auto;
background-repeat: no-repeat;
}
input[type="date"],
input[type="datetime-local"],
input[type="month"],
input[type="week"] {
background-image: var(--field-icon-date);
}
input[type="time"] {
background-image: var(--field-icon-time);
}
select {
background-image: var(--field-icon-chevron);
}
[type="date"]::-webkit-calendar-picker-indicator,
[type="datetime-local"]::-webkit-calendar-picker-indicator,
[type="month"]::-webkit-calendar-picker-indicator,
[type="time"]::-webkit-calendar-picker-indicator,
[type="week"]::-webkit-calendar-picker-indicator {
width: var(--field-size-icon);
opacity: 0;
}
@-moz-document url-prefix() {
[type="date"],
[type="datetime-local"],
[type="month"],
[type="time"],
[type="week"] {
background-image: none !important;
}
}
@-moz-document url-prefix() {
input[type="date"],
input[type="datetime-local"],
input[type="month"],
input[type="time"],
input[type="week"] {
background-image: none;
}
}
input[type="color"] {
padding: calc(var(--field-size) / 8) var(--field-padding);
&::-webkit-color-swatch {
border: 0;
border-radius: var(--radius-field);
}
&::-moz-color-swatch {
border: 0;
border-radius: var(--radius-field);
}
}
input[type="file"] {
padding: 0;
cursor: pointer;
font-size: var(--font-sm);
color: var(--color-text-high);
overflow: hidden;
&:focus-visible {
outline: var(--focus-ring);
outline-offset: 1px;
}
&::file-selector-button {
height: 100%;
border: none;
background-color: var(--color-bg-higher);
color: var(--color-text-high);
white-space: nowrap;
margin-right: var(--s-2);
}
}
input[type="range"] {
--track-color: var(--color-bg-higher);
--thumb-color: var(--color-text-high);
border: none;
padding: 0;
appearance: none;
background: 0 0;
width: 100%;
height: var(--selector-size);
&:focus {
outline: none;
}
&:focus-within {
--track-color: var(--color-bg-higher);
--thumb-color: var(--color-text-accent);
}
&::-webkit-slider-runnable-track {
width: 100%;
height: calc(var(--selector-size) / 4);
background-color: var(--track-color);
border-radius: var(--radius-full);
transition: 100ms background-color;
}
&::-moz-range-track {
width: 100%;
height: calc(var(--selector-size) / 4);
background-color: var(--track-color);
border-radius: var(--radius-full);
transition: 100ms background-color;
}
&::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: var(--selector-size);
height: var(--selector-size);
margin-top: calc(
(calc(var(--selector-size) / 4) - var(--selector-size)) /
2
);
background-color: var(--thumb-color);
border: 2px solid var(--color-bg);
border-radius: var(--radius-full);
cursor: pointer;
transition: 100ms background-color;
}
&::-moz-range-thumb {
-webkit-appearance: none;
appearance: none;
width: var(--selector-size);
height: var(--selector-size);
margin-top: calc(
(calc(var(--selector-size) / 4) - var(--selector-size)) /
2
);
background-color: var(--thumb-color);
border: 2px solid var(--color-bg);
border-radius: var(--radius-full);
cursor: pointer;
transition: 100ms background-color;
}
}
progress {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
display: inline-block;
width: 100%;
height: var(--selector-size);
overflow: hidden;
border: none;
border-radius: var(--radius-full);
background-color: var(--color-bg-high);
color: var(--color-text-accent);
vertical-align: baseline;
&::-webkit-progress-bar {
border-radius: var(--radius-full);
background: 0 0;
}
&::-moz-progress-bar {
background-color: var(--color-text-accent);
}
&[value]::-webkit-progress-value {
background-color: var(--color-text-accent);
transition: inline-size 0.2s ease;
}
}
td > input[type="checkbox"] {
vertical-align: middle;
}
hr {
border: 1px solid var(--color-bg-high);
}
abbr {
&:not([title]) {
text-decoration: none;
}
&[title] {
cursor: help;
}
}
.article {
& > p {
padding-block: var(--s-3);
}
& img {
height: auto;
}
}
/* Hack to deal with Safari bug when the image is loading. See: https://stackoverflow.com/a/73466877 */
@media not all and (min-resolution: 0.001dpcm) {
img[loading="lazy"] {
clip-path: inset(0.5px);
}
}
}
#nprogress {
& .bar {
background: var(--color-text-accent) !important;
}
& .spinner {
display: none !important;
}
& .peg {
display: none !important;
}
}
/* Track that NProgress renders its bar into (see NPROGRESS_ANCHOR_ID). It is a
* child of the header positioned just below the header's 1.5px bottom border, so
* it follows the header on scroll and in standalone (PWA) mode. It spans only the
* header width (the area between the sidebars), and its overflow: hidden clips the
* bar — which NProgress slides in from the left — so the bar can never extend over
* a sidebar. Unlayered + id selector so it beats NProgress's own unlayered
* .nprogress-custom-parent rules (and the @layer-wrapped CSS modules). */
#nprogress-anchor {
position: absolute;
top: calc(100% + 1.5px);
left: 0;
right: 0;
height: 2.5px;
overflow: hidden;
pointer-events: none;
}
.nprogress-custom-parent #nprogress .bar {
height: 100%;
}
.top-leaderboard {
min-height: 100px;
max-height: 100px;
overflow-y: clip;
margin-top: 10px;
display: grid;
place-items: center;
}
@media screen and (max-width: 599px) {
body:not(:has(.planner)) .publift-widget-sticky_footer-container {
bottom: calc(
var(--layout-nav-height) +
env(safe-area-inset-bottom)
) !important;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,32 @@
/*
Lexend variable font, self-hosted. The weight range is capped at 700 to match
`--weight-extra`, so `font-weight: bolder` keeps clamping there as it did when
the four static weights were requested from Google Fonts.
The vietnamese subset is intentionally omitted: no locale uses it.
*/
@font-face {
font-family: "Lexend";
font-style: normal;
font-weight: 400 700;
font-display: swap;
src: url("./fonts/lexend-latin.woff2") format("woff2");
unicode-range:
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122,
U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: "Lexend";
font-style: normal;
font-weight: 400 700;
font-display: swap;
src: url("./fonts/lexend-latin-ext.woff2") format("woff2");
unicode-range:
U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F,
U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
U+A720-A7FF;
}

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,378 @@
.frontPageContainer {
--card-width: 225px;
--card-height: 93px;
display: flex;
flex-direction: column;
gap: var(--s-10);
}
.changeLogImg {
max-height: 300px;
border-radius: var(--radius-field);
}
.changeLogIconButton {
display: flex;
flex-direction: row;
gap: var(--s-1-5);
justify-content: center;
align-items: center;
font-weight: var(--weight-bold);
font-size: var(--font-xs);
border-radius: 100%;
color: var(--color-text-high);
&:hover {
color: var(--color-text-accent);
}
}
.externalLinkIcon {
width: 18px;
stroke-width: 2px;
}
@property --l {
syntax: "<percentage>";
inherits: false;
initial-value: 50%;
}
.seasonBanner {
/* needed for firefox to have a valid output */
--l: 50%;
background: linear-gradient(
to right,
var(--color-bg-higher),
var(--l),
var(--color-bg)
);
border-radius: var(--radius-box);
padding: var(--s-2) var(--s-3);
line-height: 1.35;
position: relative;
color: var(--color-text);
border: var(--border-style-high);
transition: --l 0.2s ease-out;
margin-block-start: var(--s-6);
&:hover {
--l: 75%;
}
}
.seasonBannerHeader {
font-size: var(--font-xl);
font-weight: var(--weight-bold);
}
.seasonBannerDates {
font-size: var(--font-xs);
font-weight: var(--weight-semi);
}
.seasonBannerImg {
position: absolute;
width: 109px;
right: -5px;
bottom: 0;
}
.seasonBannerLink {
background-color: var(--color-bg-higher);
border-radius: var(--radius-field);
width: max-content;
height: var(--field-size-sm);
padding: 0 var(--s-1-5);
font-size: var(--font-xs);
color: var(--color-text);
display: flex;
gap: var(--s-2);
align-items: center;
& svg {
width: 24px;
transition: all 0.2s ease-out;
}
&:hover svg {
translate: 2px;
}
}
.seasonBannerMobileOnly {
display: flex;
flex-direction: column;
gap: var(--s-1);
}
.seasonCardDesktopOnly {
display: none;
flex-direction: column;
gap: var(--s-2);
text-align: center;
align-items: center;
}
@media screen and (min-width: 750px) {
.seasonBannerMobileOnly {
display: none;
}
.seasonCardDesktopOnly {
display: flex;
}
}
.tournamentCards {
display: flex;
justify-content: space-between;
gap: var(--s-2);
}
.tournamentCardsSpacer {
display: flex;
gap: var(--s-2);
height: 100%;
padding-block-start: 6px;
padding-inline-start: 6px;
margin-block-start: -6px;
margin-inline-start: -6px;
overflow-x: auto;
}
.tournamentCardsViewAllCard {
background-color: var(--color-bg-higher);
height: var(--card-height);
border-radius: var(--radius-box);
display: grid;
place-items: center;
padding: var(--s-2);
font-size: var(--font-2xs);
font-weight: var(--weight-bold);
text-align: center;
color: var(--color-text);
transition: background-color 0.2s ease-out;
min-width: 90px;
max-width: 90px;
&:hover {
background-color: var(--color-bg-high);
}
}
.resultHighlights {
display: flex;
gap: var(--s-2);
padding: var(--s-2);
& > div {
flex: 3 1 0;
width: 100%;
}
& > .seasonCardDesktopOnly {
flex: 2 1 0;
}
}
.resultHighlightsTop {
--card-width: 100%;
overflow-x: auto;
}
.resultHighlightsTitle {
font-size: var(--font-xs);
}
.resultHighlightsTitleTournaments {
align-self: flex-start;
margin-inline-start: 65px;
}
.seasonCard {
--l: 50%;
min-width: var(--card-width);
max-width: var(--card-width);
flex: 1;
background: linear-gradient(
to bottom,
var(--color-bg-higher),
var(--l),
var(--color-bg)
);
border-radius: var(--radius-box);
border: var(--border-style-high);
display: flex;
flex-direction: column;
padding: var(--s-2);
position: relative;
color: var(--color-text);
overflow: hidden;
transition: --l 0.2s ease-out;
&:hover {
--l: 75%;
}
}
.seasonCardHeader {
font-size: var(--font-lg);
font-weight: var(--weight-bold);
padding-block-start: var(--s-2);
}
.seasonCardDates {
font-size: var(--font-xs);
font-weight: var(--weight-semi);
color: var(--color-text-lighter);
}
.seasonCardImg {
position: absolute;
width: 175px;
bottom: 0;
right: 10px;
}
.seasonCardButton {
font-size: var(--font-2xs);
color: var(--color-text);
background-color: var(--color-bg-higher);
border-radius: var(--radius-selector);
width: max-content;
height: var(--selector-size);
display: flex;
align-items: center;
gap: var(--s-1);
padding: var(--s-0-5) var(--s-1-5);
}
.leaderboard {
width: 100%;
min-width: 14rem;
max-width: var(--card-width);
background-color: var(--color-bg-higher);
border-radius: var(--radius-box);
display: flex;
flex-direction: column;
gap: var(--s-2);
padding: var(--s-2);
}
.leaderboardName {
font-size: var(--font-sm);
font-weight: var(--weight-bold);
white-space: nowrap;
max-width: 140px;
text-overflow: ellipsis;
overflow: hidden;
}
.leaderboardViewAll {
font-size: var(--font-2xs);
color: var(--color-text);
background-color: var(--color-bg-higher);
border-radius: var(--radius-selector);
width: max-content;
height: var(--selector-size);
display: flex;
align-items: center;
gap: var(--s-1);
padding: var(--s-0-5) var(--s-1-5);
}
.welcomeBanner {
background-color: var(--color-bg-higher);
color: var(--color-text);
border-radius: var(--radius-box);
padding: var(--s-2);
justify-content: center;
align-items: center;
display: flex;
gap: var(--s-2);
flex-wrap: wrap;
font-size: var(--font-sm);
font-weight: var(--weight-semi);
&:hover {
background-color: var(--color-bg-high);
}
& svg {
width: 1em;
height: 1em;
}
}
.lutiBanner {
background-color: #4874a0;
color: #fff;
border-radius: var(--radius-box);
padding: var(--s-2);
justify-content: center;
display: flex;
gap: var(--s-2);
flex-wrap: wrap;
}
.weaponPills {
display: flex;
gap: var(--s-2);
justify-content: center;
flex-wrap: wrap;
}
.weaponPill {
display: flex;
align-items: center;
justify-content: center;
background-color: var(--color-bg-higher);
border-radius: var(--radius-full);
padding: var(--s-1);
transition: background-color 0.15s ease-out;
&:hover {
background-color: var(--color-bg-high);
}
}
.discoverGrid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: var(--s-3);
padding: var(--s-2);
}
@media (min-width: 600px) {
.discoverGrid {
grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
}
}
.discoverGridItemImage {
width: var(--field-size-lg);
aspect-ratio: 1 / 1;
border-radius: var(--radius-field);
background-color: var(--color-bg-higher);
display: grid;
place-items: center;
}
.discoverGridItem {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--s-1);
text-decoration: none;
color: var(--color-text);
font-size: var(--font-xs);
font-weight: var(--weight-semi);
text-align: center;
&:hover .discoverGridItemImage {
background-color: var(--color-bg-high);
}
}

217
apps/web-react/app/styles/normalize.css vendored Normal file
View File

@@ -0,0 +1,217 @@
@layer reset {
/*! modern-normalize v3.0.1 | MIT License | https://github.com/sindresorhus/modern-normalize */
/*
Document
========
*/
/**
Use a better box model (opinionated).
*/
*,
::before,
::after {
box-sizing: border-box;
}
/**
1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
2. Correct the line height in all browsers.
3. Prevent adjustments of font size after orientation changes in iOS.
4. Use a more readable tab size (opinionated).
*/
html {
font-family:
system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif,
"Apple Color Emoji", "Segoe UI Emoji"; /* 1 */
line-height: 1.15; /* 2 */
-webkit-text-size-adjust: 100%; /* 3 */
tab-size: 4; /* 4 */
}
/*
Sections
========
*/
/**
Remove the margin in all browsers.
*/
body {
margin: 0;
}
/*
Text-level semantics
====================
*/
/**
Add the correct font weight in Chrome and Safari.
*/
b,
strong {
font-weight: bolder;
}
/**
1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
2. Correct the odd 'em' font sizing in all browsers.
*/
code,
kbd,
samp,
pre {
font-family:
ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", Menlo,
monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/**
Prevent 'sub' and 'sup' elements from affecting the line height in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/*
Tabular data
============
*/
/**
Correct table border color inheritance in Chrome and Safari. (https://issues.chromium.org/issues/40615503, https://bugs.webkit.org/show_bug.cgi?id=195016)
*/
table {
border-color: currentcolor;
}
/*
Forms
=====
*/
/**
1. Change the font styles in all browsers.
2. Remove the margin in Firefox and Safari.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit; /* 1 */
font-size: 100%; /* 1 */
line-height: 1.15; /* 1 */
margin: 0; /* 2 */
}
/**
Correct the inability to style clickable types in iOS and Safari.
*/
button,
[type="button"],
[type="reset"],
[type="submit"] {
appearance: button;
-webkit-appearance: button;
}
/**
Remove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.
*/
legend {
padding: 0;
}
/**
Add the correct vertical alignment in Chrome and Firefox.
*/
progress {
vertical-align: baseline;
}
/**
Correct the cursor style of increment and decrement buttons in Safari.
*/
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
height: auto;
}
/**
1. Correct the odd appearance in Chrome and Safari.
2. Correct the outline style in Safari.
*/
[type="search"] {
appearance: textfield; /* 1 */
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
Remove the inner padding in Chrome and Safari on macOS.
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
1. Correct the inability to style clickable types in iOS and Safari.
2. Change font properties to 'inherit' in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/*
Interactive
===========
*/
/*
Add the correct display in Chrome and Safari.
*/
summary {
display: list-item;
}
}

View File

@@ -0,0 +1,537 @@
@layer utilities {
.text-xl {
font-size: var(--font-xl);
}
.text-lg {
font-size: var(--font-lg);
}
.text-sm {
font-size: var(--font-sm);
}
.text-md {
font-size: var(--font-md);
}
.text-xs {
font-size: var(--font-xs);
}
.text-xxs {
font-size: var(--font-2xs);
}
.text-center {
text-align: center;
}
.text-main-forced {
color: var(--color-text);
}
.text-lighter {
color: var(--color-text-high);
}
.text-error {
color: var(--color-error);
}
.text-success {
color: var(--color-success);
}
.text-accent-high {
color: var(--color-accent-high);
}
.text-warning {
color: var(--color-warning);
}
.text-theme {
color: var(--color-text-accent);
}
.text-theme-secondary {
color: var(--color-text-second);
}
.text-uppercase {
text-transform: uppercase;
}
.text-capitalize {
text-transform: capitalize;
}
.underline {
text-decoration: underline;
text-decoration-thickness: 2px;
}
.line-through {
text-decoration: line-through;
}
.color-success {
color: var(--color-success);
}
.color-warning {
color: var(--color-warning);
}
.color-error {
color: var(--color-error);
}
.color-info {
color: var(--color-info);
}
.bg {
background-color: var(--color-bg);
}
.bg-lighter {
background-color: var(--color-bg-high);
}
.rounded {
border-radius: var(--radius-box);
}
.rounded-sm {
border-radius: var(--radius-field);
}
.rounded-full {
border-radius: 100%;
}
.font-body {
font-weight: var(--weight-body);
}
.font-semi-bold {
font-weight: var(--weight-semi);
}
.font-bold {
font-weight: var(--weight-bold);
}
.h-max {
height: max-content;
}
.w-full {
width: 100%;
}
.w-4 {
width: var(--s-4);
}
.w-6 {
width: var(--s-6);
}
.w-24 {
width: var(--s-24);
}
.w-max {
width: max-content;
}
.p-1 {
padding: var(--s-1);
}
.py-4 {
padding-block: var(--s-4);
}
.pl-0 {
padding-inline-start: 0;
}
.pl-4 {
padding-inline-start: var(--s-4);
}
.pt-0 {
padding-block-start: 0;
}
.pt-0-5 {
padding-block-start: var(--s-0-5);
}
.m-auto-0 {
margin: auto 0;
}
.mt-1 {
margin-block-start: var(--s-1);
}
.mt-2 {
margin-block-start: var(--s-2);
}
.mt-3 {
margin-block-start: var(--s-3);
}
.mt-4 {
margin-block-start: var(--s-4);
}
.mt-6 {
margin-block-start: var(--s-6);
}
.mt-12 {
margin-block-start: var(--s-12);
}
.mb-0 {
margin-block-end: 0;
}
.mb-1 {
margin-block-end: var(--s-1);
}
.mb-2 {
margin-block-end: var(--s-2);
}
.mb-4 {
margin-block-end: var(--s-4);
}
.ml-auto {
margin-inline-start: auto;
}
.ml-1 {
margin-inline-start: var(--s-1);
}
.ml-2 {
margin-inline-start: var(--s-2);
}
.ml-6 {
margin-inline-start: var(--s-6);
}
.mr-auto {
margin-inline-end: auto;
}
.mr-1 {
margin-inline-end: var(--s-1);
}
.mr-2 {
margin-inline-end: var(--s-2);
}
.mx-auto {
margin-inline: auto;
}
.mx-1 {
margin-inline: var(--s-1);
}
.mx-2 {
margin-inline: var(--s-2);
}
.my-1 {
margin-block: var(--s-1);
}
.my-2 {
margin-block: var(--s-2);
}
.my-3 {
margin-block: var(--s-3);
}
.my-4 {
margin-block: var(--s-4);
}
.my-24 {
margin-block: var(--s-24);
}
.m-0-auto {
margin: 0 auto;
}
.line-height-tight {
line-height: 1.3;
}
.hidden {
display: none;
}
.block {
display: block;
}
.invisible {
visibility: hidden;
}
.whitespace-pre-wrap {
white-space: pre-wrap;
}
.whitespace-nowrap {
white-space: nowrap;
}
.overflow-x-auto {
overflow-x: auto;
}
.relative {
position: relative;
}
.italic {
font-style: italic;
}
.contents {
display: contents;
}
.flex {
display: flex;
}
.items-center {
align-items: center;
}
.items-start {
align-items: flex-start;
}
.items-end {
align-items: flex-end;
}
.justify-center {
justify-content: center;
}
.justify-end {
justify-content: flex-end;
}
.justify-between {
justify-content: space-between;
}
.justify-self-end {
justify-self: flex-end;
}
.justify-self-center {
justify-self: center;
}
.self-center {
align-self: center;
}
.self-start {
align-self: flex-start;
}
.justify-self-start {
justify-self: flex-start;
}
.flex-wrap {
flex-wrap: wrap;
}
.all-unset {
all: unset;
}
.focus-text-decoration {
&:focus-visible {
outline: none;
text-decoration: underline;
}
}
.label-no-spacing {
--label-margin: 0;
}
.cursor-pointer {
cursor: pointer;
}
.opaque {
opacity: 0.6;
}
.scrollbar,
textarea {
/* Firefox, Chrome 121+, Safari 18.2+ */
@supports (scrollbar-color: auto) {
scrollbar-width: thin;
scrollbar-color: var(--color-bg-higher) transparent;
}
/* Legacy */
@supports not (scrollbar-color: auto) {
&::-webkit-scrollbar,
&::-webkit-scrollbar-track {
background-color: transparent;
height: 14px;
width: 14px;
}
&::-webkit-scrollbar-thumb {
background-color: var(--color-base-4);
border-radius: var(--radius-full);
border: 4px solid transparent;
background-clip: content-box;
}
&::-webkit-scrollbar-corner {
background-color: transparent;
}
}
}
.stack {
display: flex;
flex-direction: column;
&.xxxs {
gap: var(--s-0-5);
}
&.xxs {
gap: var(--s-1);
}
&.xs {
gap: var(--s-1-5);
}
&.sm {
gap: var(--s-2);
}
&.sm-column {
column-gap: var(--s-2);
}
&.sm-plus {
gap: var(--s-3);
}
&.md {
gap: var(--s-4);
}
&.md-plus {
gap: var(--s-6);
}
&.lg {
gap: var(--s-8);
}
&.xs-row {
row-gap: var(--s-1-5);
}
&.lg-row {
row-gap: var(--s-8);
}
&.xl {
gap: var(--s-12);
}
&.xxl {
gap: var(--s-16);
}
&.horizontal {
flex-direction: row;
}
}
.flex-same-size {
flex: 1 1 0px;
}
.small-icon {
width: 1.2rem;
height: 1.2rem;
}
.small-text {
font-size: var(--font-2xs);
}
.dotted {
text-decoration-style: dotted;
text-decoration-line: underline;
text-decoration-thickness: 2px;
}
.summary {
border-radius: var(--radius-box);
background-color: var(--color-bg);
font-size: var(--font-xs);
font-weight: var(--weight-semi);
padding-block: var(--s-1);
padding-inline: var(--s-2);
}
html[dir="rtl"] .fix-rtl {
transform: rotate(180deg);
}
.clickable {
cursor: pointer;
}
.no-results {
text-align: center;
color: var(--color-text-high);
font-style: italic;
font-size: var(--font-xs);
}
.half-width {
width: 100%;
max-width: 24rem;
margin-inline: auto;
}
}

View File

@@ -0,0 +1,313 @@
@layer reset, base, elements, components, utilities;
/*
⚠️⚠️⚠️
Make sure to read styles.md before editing colors in this file,
it contains important information about how the styles work and how to edit them properly
⚠️⚠️⚠️
*/
/*
All the tokens that can be set by custom themes
and their default values are defined here
These should not be consumed directly, only used as a base for other vars!
The hue and chroma values should not be edited manually, instead
use oklch-gamut.ts to generate valid color palettes!
A subtree can force a color scheme regardless of the html class with
[data-theme="dark"|"light"] and opt out of an active custom theme with
[data-default-theme] (e.g. image export previews)
*/
html,
[data-default-theme] {
--_base-h: 268;
--_base-c-0: 0;
--_base-c-1: 0.02357547860966049;
--_base-c-2: 0.031;
--_base-c-3: 0.06999999999999999;
--_base-c-4: 0.0645;
--_base-c-5: 0.068;
--_base-c-6: 0.0645;
--_base-c-7: 0.0335;
--_acc-h: 253;
--_acc-c-0: 0.0801740871856143;
--_acc-c-1: 0.1603481743712286;
--_acc-c-2: 0.0816;
--_acc-c-3: 0.06;
--_acc-c-4: 0.16343179310913686;
--_acc-c-5: 0.09867579961306376;
--_second-h: 73;
--_second-c-0: 0.055379201356259726;
--_second-c-1: 0.11075840271251945;
--_second-c-2: 0.0816;
--_second-c-3: 0.06;
--_second-c-4: 0.11288837199545253;
--_second-c-5: 0.06815901705385813;
--_radius-box: 3;
--_radius-field: 2;
--_radius-selector: 2;
--_border-width: 2;
/*
Ommited from being overridden when viewing a page that loads a custom theme
to prevent accessibility issues and layout shifts
*/
--_size-field: 1;
--_size-selector: 1;
--_size-spacing: 1;
}
/*
'low' and 'high' do not indicate lightness!
This is important because dark goes from light to dark, and light goes from dark to light
--color-base-x should rarely be consumed directly
They mostly exist as a base for other vars like --color-text and --color-bg
--color-text-accent and --color-text-second can be used as a background
or highlight color that maintains a high contrast ratio in both light and dark modes
If used as a background color, --color-text-inverse should be used as the text color
Info, success, warning, and error colors:
Preffer using --color-x-high for text
It is recommended to use --color-x-low as the background to ensure a high contrast ratio
You can use --color-x for things like borders and icons
Field icons are defined for both dark and light mode because SVGs
cannot use currentColor inside data URLs
Any changes here NEED to be reflected in oklch-gamut.ts as well
*/
html.dark,
html.dark [data-custom-theme],
[data-theme="dark"] {
--color-base-0: oklch(100% var(--_base-c-0) var(--_base-h));
--color-base-1: oklch(95% var(--_base-c-1) var(--_base-h));
--color-base-2: oklch(90% var(--_base-c-2) var(--_base-h));
--color-base-3: oklch(64% var(--_base-c-3) var(--_base-h));
--color-base-4: oklch(46% var(--_base-c-4) var(--_base-h));
--color-base-5: oklch(32% var(--_base-c-5) var(--_base-h));
--color-base-6: oklch(25% var(--_base-c-6) var(--_base-h));
--color-base-7: oklch(17% var(--_base-c-7) var(--_base-h));
--color-accent-low: oklch(26% var(--_acc-c-0) var(--_acc-h));
--color-accent: oklch(52% var(--_acc-c-1) var(--_acc-h));
--color-accent-high: oklch(83% var(--_acc-c-2) var(--_acc-h));
--color-second-low: oklch(
from var(--color-accent-low) l var(--_second-c-0) var(--_second-h)
);
--color-second: oklch(
from var(--color-accent) l var(--_second-c-1) var(--_second-h)
);
--color-second-high: oklch(
from var(--color-accent-high) l var(--_second-c-2) var(--_second-h)
);
--color-text-accent: var(--color-accent-high);
--color-text-second: var(--color-second-high);
--color-info-low: oklch(26% 0.09 275);
--color-info: oklch(52% 0.27 275);
--color-info-high: oklch(83% 0.08 275);
--color-success-low: oklch(35% 0.08 135);
--color-success: oklch(85% 0.22 135);
--color-success-high: oklch(91% 0.12 135);
--color-warning-low: oklch(38% 0.05 85);
--color-warning: oklch(82% 0.14 85);
--color-warning-high: oklch(94% 0.05 85);
--color-error-low: oklch(31% 0.07 10);
--color-error: oklch(65% 0.25 10);
--color-error-high: oklch(87% 0.07 10);
--color-chart-alpha: #da5b76;
--color-chart-bravo: #6572e4;
--field-icon-checkbox: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(20, 20, 20)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
--field-icon-minus: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(20, 20, 20)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");
--field-icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(145, 145, 145)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
--field-icon-date: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(145, 145, 145)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");
--field-icon-time: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(145, 145, 145)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");
}
html.light,
html.light [data-custom-theme],
[data-theme="light"] {
--color-base-0: oklch(17% var(--_base-c-7) var(--_base-h));
--color-base-1: oklch(25% var(--_base-c-6) var(--_base-h));
--color-base-2: oklch(32% var(--_base-c-5) var(--_base-h));
--color-base-3: oklch(46% var(--_base-c-4) var(--_base-h));
--color-base-4: oklch(64% var(--_base-c-3) var(--_base-h));
--color-base-5: oklch(90% var(--_base-c-2) var(--_base-h));
--color-base-6: oklch(95% var(--_base-c-1) var(--_base-h));
--color-base-7: oklch(100% var(--_base-c-0) var(--_base-h));
--color-accent-low: oklch(88% var(--_acc-c-3) var(--_acc-h));
--color-accent: oklch(53% var(--_acc-c-4) var(--_acc-h));
--color-accent-high: oklch(32% var(--_acc-c-5) var(--_acc-h));
--color-second-low: oklch(
from var(--color-accent-low) l var(--_second-c-0) var(--_second-h)
);
--color-second: oklch(
from var(--color-accent) l var(--_second-c-1) var(--_second-h)
);
--color-second-high: oklch(
from var(--color-accent-high) l var(--_second-c-2) var(--_second-h)
);
--color-text-accent: var(--color-accent);
--color-text-second: var(--color-second);
--color-info-low: oklch(87.897% 0.0555 279.573);
--color-info: oklch(53.03% 0.24331 270.147);
--color-info-high: oklch(31.865% 0.1766 267.138);
--color-success-low: oklch(95.604% 0.06419 135.506);
--color-success: oklch(79.407% 0.25035 139.5);
--color-success-high: oklch(44.893% 0.13293 138.416);
--color-warning-low: oklch(94.216% 0.05193 85.101);
--color-warning: oklch(82.426% 0.15029 82.564);
--color-warning-high: oklch(46.236% 0.09033 79.825);
--color-error-low: oklch(89.949% 0.04928 355.498);
--color-error: oklch(65.223% 0.22164 5.216);
--color-error-high: oklch(41.268% 0.15511 8.446);
--color-chart-alpha: #b82851;
--color-chart-bravo: #4246c2;
--field-icon-checkbox: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
--field-icon-minus: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");
--field-icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(90, 90, 90)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
--field-icon-date: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(90, 90, 90)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");
--field-icon-time: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(90, 90, 90)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");
}
/*
These are the vars you mainly want to use
*/
html,
/* biome-ignore lint/style/noDescendingSpecificity: [data-custom-theme] and [data-theme] re-declare theme vars for subtrees; different properties than the html.dark/light blocks so no real override */
[data-custom-theme],
[data-theme] {
--color-text: var(--color-base-0);
--color-text-high: var(--color-base-3);
--color-text-inverse: var(--color-base-7);
--color-bg: var(--color-base-7);
--color-bg-high: var(--color-base-6);
--color-bg-higher: var(--color-base-5);
--color-bg-nav: color-mix(
in oklch,
var(--color-bg) 75%,
var(--color-bg-high) 25%
);
--color-bg-ability: oklch(11.736% 0.00867 215.976);
--color-bg-badge: oklch(0% 0 0);
--color-border: var(--color-base-5);
--color-border-high: var(--color-base-4);
--border-width: calc(var(--_border-width) * 1px);
--border-style: var(--border-width) solid var(--color-border);
--border-style-high: var(--border-width) solid var(--color-border-high);
--border-style-accent: var(--border-width) solid var(--color-text-accent);
--focus-ring: 2px solid var(--color-text-accent);
--focus-ring-error: 2px solid var(--color-error);
--font-xl: 1.5rem;
--font-lg: 1.2rem;
--font-md: 1rem;
--font-sm: 0.9rem;
--font-xs: 0.8rem;
--font-2xs: 0.7rem;
--font-3xs: 0.6rem;
--weight-extra: 700;
--weight-bold: 600;
--weight-semi: 500;
--weight-body: 400;
--line-height: 1.5;
/*
Tokens used for spacings
*/
--s-0-5: calc(var(--_size-spacing) * 0.5 * 0.25rem);
--s-1: calc(var(--_size-spacing) * 1 * 0.25rem);
--s-1-5: calc(var(--_size-spacing) * 1.5 * 0.25rem);
--s-2: calc(var(--_size-spacing) * 2 * 0.25rem);
--s-2-5: calc(var(--_size-spacing) * 2.5 * 0.25rem);
--s-3: calc(var(--_size-spacing) * 3 * 0.25rem);
--s-4: calc(var(--_size-spacing) * 4 * 0.25rem);
--s-5: calc(var(--_size-spacing) * 5 * 0.25rem);
--s-6: calc(var(--_size-spacing) * 6 * 0.25rem);
--s-8: calc(var(--_size-spacing) * 8 * 0.25rem);
--s-10: calc(var(--_size-spacing) * 10 * 0.25rem);
--s-12: calc(var(--_size-spacing) * 12 * 0.25rem);
--s-16: calc(var(--_size-spacing) * 16 * 0.25rem);
--s-24: calc(var(--_size-spacing) * 24 * 0.25rem);
--s-32: calc(var(--_size-spacing) * 32 * 0.25rem);
/*
Tokens used to define layout dimensions
--layout-sticky-top can be used by any element with position: sticky
that sticks relative to the document scroll to ensure
a smooth transition between sticking and un-sticking
Elements with position: sticky that do not stick relative
to the document scroll do not need to use this var
*/
--layout-nav-height: 55px;
--layout-sidenav-width: 250px;
--layout-fuse-bottom-height: 90px;
--layout-main-padding: var(--s-3);
--layout-sticky-top: calc(
var(--layout-nav-height) +
var(--layout-main-padding) +
env(safe-area-inset-top)
);
/*
Boxes are elements that contain other elements, like cards, containers, and modals
but can also be top level elements in a visual hierarchy
Fields are interactive elements like buttons, inputs, and selects
but also any child of a box that is interactable or contains content
Selectors are elements like checkboxes, radio buttons, and toggles
but can also be any small element like bages, tags, and pills
that are complementary to fields
*/
--field-size-xs: calc(var(--_size-field) * 6 * 0.25rem);
--field-size-sm: calc(var(--_size-field) * 8 * 0.25rem);
--field-size: calc(var(--_size-field) * 10 * 0.25rem);
--field-size-lg: calc(var(--_size-field) * 12 * 0.25rem);
--field-size-icon: 18px;
--field-padding: 0.6rem;
--selector-size-xs: calc(var(--_size-selector) * 4 * 0.25rem);
--selector-size-sm: calc(var(--_size-selector) * 5 * 0.25rem);
--selector-size: calc(var(--_size-selector) * 6 * 0.25rem);
--selector-size-lg: calc(var(--_size-selector) * 7 * 0.25rem);
--radius-box: calc(var(--_radius-box) * 4px);
--radius-field: calc(var(--_radius-field) * 4px);
--radius-selector: calc(var(--_radius-selector) * 4px);
--radius-full: 99999px;
--radius-avatar: var(--radius-full);
--label-margin: var(--s-1);
}