Switch
A switch control for toggling between on and off.
View source
import * as Switch from "@danielfrg/solid-ui/switch"
import styles from "./index.module.css"
export function DemoSwitchHero() {
return (
<Switch.Root class={styles.switch} defaultChecked>
<Switch.Label class={styles.label}>Notifications</Switch.Label>
<Switch.Input class={styles.input} />
<Switch.Control class={styles.control}>
<Switch.Thumb class={styles.thumb} />
</Switch.Control>
</Switch.Root>
)
}.switch {
display: inline-flex;
align-items: center;
gap: 0.5rem;
}
.control {
box-sizing: border-box;
position: relative;
display: flex;
align-items: center;
margin: 0;
padding: 1px;
width: 2.5rem;
height: 1.5rem;
border: 0;
border-radius: 1.5rem;
outline: 1px solid;
outline-offset: -1px;
background-color: transparent;
background-image: linear-gradient(to right, var(--color-gray-700) 35%, var(--color-gray-200) 65%);
background-size: 6.5rem 100%;
background-position-x: 100%;
background-repeat: no-repeat;
transition-property: background-position, box-shadow;
transition-timing-function: cubic-bezier(0.26, 0.75, 0.38, 0.45);
transition-duration: 125ms;
cursor: pointer;
flex-shrink: 0;
}
.control:active {
background-color: var(--color-gray-100);
}
.control[data-checked] {
background-position-x: 0%;
}
.control[data-checked]:active {
background-color: var(--color-gray-500);
}
@media (prefers-color-scheme: light) {
.control {
box-shadow: var(--color-gray-200) 0 1.5px 2px inset;
outline-color: var(--color-gray-200);
}
}
@media (prefers-color-scheme: dark) {
.control {
box-shadow: rgb(0 0 0 / 75%) 0 1.5px 2px inset;
outline-color: rgb(255 255 255 / 15%);
background-image: linear-gradient(to right, var(--color-gray-500) 35%, var(--color-gray-200) 65%);
}
.control[data-checked] {
box-shadow: none;
}
}
.control:focus-visible::before {
content: "";
inset: 0;
position: absolute;
border-radius: inherit;
outline: 2px solid var(--color-blue);
outline-offset: 2px;
}
.thumb {
aspect-ratio: 1 / 1;
height: 100%;
border-radius: 100%;
background-color: white;
transition: translate 150ms ease;
}
.thumb[data-checked] {
translate: 1rem 0;
}
@media (prefers-color-scheme: light) {
.thumb {
box-shadow:
0 0 1px 1px var(--color-gray-100),
0 1px 1px var(--color-gray-100),
1px 2px 4px -1px var(--color-gray-100);
}
}
@media (prefers-color-scheme: dark) {
.thumb {
box-shadow:
0 0 1px 1px rgb(0 0 0 / 25%),
0 1px 1px rgb(0 0 0 / 25%),
1px 2px 4px -1px rgb(0 0 0 / 25%);
}
}
.label {
color: var(--color-gray-900);
font-size: 1rem;
line-height: 1.5rem;
user-select: none;
}
.input {
position: absolute;
opacity: 0;
pointer-events: none;
width: 1px;
height: 1px;
}
.text {
display: flex;
flex-direction: column;
gap: 0.125rem;
}
.description {
font-size: 0.875rem;
line-height: 1.25rem;
color: var(--color-gray-600);
}
.error {
font-size: 0.875rem;
line-height: 1.25rem;
color: #dc2626;
}
.status {
margin: 1rem 0 0;
font-size: 0.875rem;
line-height: 1.25rem;
color: var(--color-gray-600);
}:root {
--color-blue: oklch(45% 50% 264deg);
--color-red: oklch(50% 55% 31deg);
--color-gray-50: oklch(98% 0.25% 264deg);
--color-gray-100: oklch(12% 9.5% 264deg / 5%);
--color-gray-200: oklch(12% 9% 264deg / 7%);
--color-gray-300: oklch(12% 8.5% 264deg / 17%);
--color-gray-400: oklch(12% 8% 264deg / 38%);
--color-gray-500: oklch(12% 7.5% 264deg / 50%);
--color-gray-600: oklch(12% 7% 264deg / 67%);
--color-gray-700: oklch(12% 6% 264deg / 77%);
--color-gray-800: oklch(12% 5% 264deg / 85%);
--color-gray-900: oklch(12% 5% 264deg / 90%);
--color-gray-950: oklch(12% 5% 264deg / 95%);
}
@media (prefers-color-scheme: dark) {
:root {
--color-blue: oklch(69% 50% 264deg);
--color-red: oklch(80% 55% 31deg);
--color-gray-50: oklch(17% 0.25% 264deg);
--color-gray-100: oklch(28% 0.75% 264deg / 65%);
--color-gray-200: oklch(29% 0.75% 264deg / 80%);
--color-gray-300: oklch(35% 0.75% 264deg / 80%);
--color-gray-400: oklch(47% 0.875% 264deg / 80%);
--color-gray-500: oklch(64% 1% 264deg / 80%);
--color-gray-600: oklch(82% 1% 264deg / 80%);
--color-gray-700: oklch(92% 1.125% 264deg / 80%);
--color-gray-800: oklch(93% 0.875% 264deg / 85%);
--color-gray-900: oklch(95% 0.5% 264deg / 90%);
--color-gray-950: oklch(94% 0.375% 264deg / 95%);
}
}Examples
Default checked
Use defaultChecked to set the initial state without controlling it.
View source
import * as Switch from "@danielfrg/solid-ui/switch"
import styles from "./index.module.css"
export function DemoSwitchDefaultChecked() {
return (
<Switch.Root class={styles.switch} defaultChecked>
<Switch.Label class={styles.label}>Notifications</Switch.Label>
<Switch.Input class={styles.input} />
<Switch.Control class={styles.control}>
<Switch.Thumb class={styles.thumb} />
</Switch.Control>
</Switch.Root>
)
}.switch {
display: inline-flex;
align-items: center;
gap: 0.5rem;
}
.control {
box-sizing: border-box;
position: relative;
display: flex;
align-items: center;
margin: 0;
padding: 1px;
width: 2.5rem;
height: 1.5rem;
border: 0;
border-radius: 1.5rem;
outline: 1px solid;
outline-offset: -1px;
background-color: transparent;
background-image: linear-gradient(to right, var(--color-gray-700) 35%, var(--color-gray-200) 65%);
background-size: 6.5rem 100%;
background-position-x: 100%;
background-repeat: no-repeat;
transition-property: background-position, box-shadow;
transition-timing-function: cubic-bezier(0.26, 0.75, 0.38, 0.45);
transition-duration: 125ms;
cursor: pointer;
flex-shrink: 0;
}
.control:active {
background-color: var(--color-gray-100);
}
.control[data-checked] {
background-position-x: 0%;
}
.control[data-checked]:active {
background-color: var(--color-gray-500);
}
@media (prefers-color-scheme: light) {
.control {
box-shadow: var(--color-gray-200) 0 1.5px 2px inset;
outline-color: var(--color-gray-200);
}
}
@media (prefers-color-scheme: dark) {
.control {
box-shadow: rgb(0 0 0 / 75%) 0 1.5px 2px inset;
outline-color: rgb(255 255 255 / 15%);
background-image: linear-gradient(to right, var(--color-gray-500) 35%, var(--color-gray-200) 65%);
}
.control[data-checked] {
box-shadow: none;
}
}
.control:focus-visible::before {
content: "";
inset: 0;
position: absolute;
border-radius: inherit;
outline: 2px solid var(--color-blue);
outline-offset: 2px;
}
.thumb {
aspect-ratio: 1 / 1;
height: 100%;
border-radius: 100%;
background-color: white;
transition: translate 150ms ease;
}
.thumb[data-checked] {
translate: 1rem 0;
}
@media (prefers-color-scheme: light) {
.thumb {
box-shadow:
0 0 1px 1px var(--color-gray-100),
0 1px 1px var(--color-gray-100),
1px 2px 4px -1px var(--color-gray-100);
}
}
@media (prefers-color-scheme: dark) {
.thumb {
box-shadow:
0 0 1px 1px rgb(0 0 0 / 25%),
0 1px 1px rgb(0 0 0 / 25%),
1px 2px 4px -1px rgb(0 0 0 / 25%);
}
}
.label {
color: var(--color-gray-900);
font-size: 1rem;
line-height: 1.5rem;
user-select: none;
}
.input {
position: absolute;
opacity: 0;
pointer-events: none;
width: 1px;
height: 1px;
}
.text {
display: flex;
flex-direction: column;
gap: 0.125rem;
}
.description {
font-size: 0.875rem;
line-height: 1.25rem;
color: var(--color-gray-600);
}
.error {
font-size: 0.875rem;
line-height: 1.25rem;
color: #dc2626;
}
.status {
margin: 1rem 0 0;
font-size: 0.875rem;
line-height: 1.25rem;
color: var(--color-gray-600);
}:root {
--color-blue: oklch(45% 50% 264deg);
--color-red: oklch(50% 55% 31deg);
--color-gray-50: oklch(98% 0.25% 264deg);
--color-gray-100: oklch(12% 9.5% 264deg / 5%);
--color-gray-200: oklch(12% 9% 264deg / 7%);
--color-gray-300: oklch(12% 8.5% 264deg / 17%);
--color-gray-400: oklch(12% 8% 264deg / 38%);
--color-gray-500: oklch(12% 7.5% 264deg / 50%);
--color-gray-600: oklch(12% 7% 264deg / 67%);
--color-gray-700: oklch(12% 6% 264deg / 77%);
--color-gray-800: oklch(12% 5% 264deg / 85%);
--color-gray-900: oklch(12% 5% 264deg / 90%);
--color-gray-950: oklch(12% 5% 264deg / 95%);
}
@media (prefers-color-scheme: dark) {
:root {
--color-blue: oklch(69% 50% 264deg);
--color-red: oklch(80% 55% 31deg);
--color-gray-50: oklch(17% 0.25% 264deg);
--color-gray-100: oklch(28% 0.75% 264deg / 65%);
--color-gray-200: oklch(29% 0.75% 264deg / 80%);
--color-gray-300: oklch(35% 0.75% 264deg / 80%);
--color-gray-400: oklch(47% 0.875% 264deg / 80%);
--color-gray-500: oklch(64% 1% 264deg / 80%);
--color-gray-600: oklch(82% 1% 264deg / 80%);
--color-gray-700: oklch(92% 1.125% 264deg / 80%);
--color-gray-800: oklch(93% 0.875% 264deg / 85%);
--color-gray-900: oklch(95% 0.5% 264deg / 90%);
--color-gray-950: oklch(94% 0.375% 264deg / 95%);
}
}Controlled
Use checked and onChange to control the switch state.
Notifications are off.
View source
import { createSignal } from "solid-js"
import * as Switch from "@danielfrg/solid-ui/switch"
import styles from "./index.module.css"
export function DemoSwitchControlled() {
const [checked, setChecked] = createSignal(false)
return (
<div>
<Switch.Root class={styles.switch} checked={checked()} onChange={setChecked}>
<Switch.Label class={styles.label}>Notifications</Switch.Label>
<Switch.Input class={styles.input} />
<Switch.Control class={styles.control}>
<Switch.Thumb class={styles.thumb} />
</Switch.Control>
</Switch.Root>
<p class={styles.status}>Notifications are {checked() ? "on" : "off"}.</p>
</div>
)
}.switch {
display: inline-flex;
align-items: center;
gap: 0.5rem;
}
.control {
box-sizing: border-box;
position: relative;
display: flex;
align-items: center;
margin: 0;
padding: 1px;
width: 2.5rem;
height: 1.5rem;
border: 0;
border-radius: 1.5rem;
outline: 1px solid;
outline-offset: -1px;
background-color: transparent;
background-image: linear-gradient(to right, var(--color-gray-700) 35%, var(--color-gray-200) 65%);
background-size: 6.5rem 100%;
background-position-x: 100%;
background-repeat: no-repeat;
transition-property: background-position, box-shadow;
transition-timing-function: cubic-bezier(0.26, 0.75, 0.38, 0.45);
transition-duration: 125ms;
cursor: pointer;
flex-shrink: 0;
}
.control:active {
background-color: var(--color-gray-100);
}
.control[data-checked] {
background-position-x: 0%;
}
.control[data-checked]:active {
background-color: var(--color-gray-500);
}
@media (prefers-color-scheme: light) {
.control {
box-shadow: var(--color-gray-200) 0 1.5px 2px inset;
outline-color: var(--color-gray-200);
}
}
@media (prefers-color-scheme: dark) {
.control {
box-shadow: rgb(0 0 0 / 75%) 0 1.5px 2px inset;
outline-color: rgb(255 255 255 / 15%);
background-image: linear-gradient(to right, var(--color-gray-500) 35%, var(--color-gray-200) 65%);
}
.control[data-checked] {
box-shadow: none;
}
}
.control:focus-visible::before {
content: "";
inset: 0;
position: absolute;
border-radius: inherit;
outline: 2px solid var(--color-blue);
outline-offset: 2px;
}
.thumb {
aspect-ratio: 1 / 1;
height: 100%;
border-radius: 100%;
background-color: white;
transition: translate 150ms ease;
}
.thumb[data-checked] {
translate: 1rem 0;
}
@media (prefers-color-scheme: light) {
.thumb {
box-shadow:
0 0 1px 1px var(--color-gray-100),
0 1px 1px var(--color-gray-100),
1px 2px 4px -1px var(--color-gray-100);
}
}
@media (prefers-color-scheme: dark) {
.thumb {
box-shadow:
0 0 1px 1px rgb(0 0 0 / 25%),
0 1px 1px rgb(0 0 0 / 25%),
1px 2px 4px -1px rgb(0 0 0 / 25%);
}
}
.label {
color: var(--color-gray-900);
font-size: 1rem;
line-height: 1.5rem;
user-select: none;
}
.input {
position: absolute;
opacity: 0;
pointer-events: none;
width: 1px;
height: 1px;
}
.text {
display: flex;
flex-direction: column;
gap: 0.125rem;
}
.description {
font-size: 0.875rem;
line-height: 1.25rem;
color: var(--color-gray-600);
}
.error {
font-size: 0.875rem;
line-height: 1.25rem;
color: #dc2626;
}
.status {
margin: 1rem 0 0;
font-size: 0.875rem;
line-height: 1.25rem;
color: var(--color-gray-600);
}:root {
--color-blue: oklch(45% 50% 264deg);
--color-red: oklch(50% 55% 31deg);
--color-gray-50: oklch(98% 0.25% 264deg);
--color-gray-100: oklch(12% 9.5% 264deg / 5%);
--color-gray-200: oklch(12% 9% 264deg / 7%);
--color-gray-300: oklch(12% 8.5% 264deg / 17%);
--color-gray-400: oklch(12% 8% 264deg / 38%);
--color-gray-500: oklch(12% 7.5% 264deg / 50%);
--color-gray-600: oklch(12% 7% 264deg / 67%);
--color-gray-700: oklch(12% 6% 264deg / 77%);
--color-gray-800: oklch(12% 5% 264deg / 85%);
--color-gray-900: oklch(12% 5% 264deg / 90%);
--color-gray-950: oklch(12% 5% 264deg / 95%);
}
@media (prefers-color-scheme: dark) {
:root {
--color-blue: oklch(69% 50% 264deg);
--color-red: oklch(80% 55% 31deg);
--color-gray-50: oklch(17% 0.25% 264deg);
--color-gray-100: oklch(28% 0.75% 264deg / 65%);
--color-gray-200: oklch(29% 0.75% 264deg / 80%);
--color-gray-300: oklch(35% 0.75% 264deg / 80%);
--color-gray-400: oklch(47% 0.875% 264deg / 80%);
--color-gray-500: oklch(64% 1% 264deg / 80%);
--color-gray-600: oklch(82% 1% 264deg / 80%);
--color-gray-700: oklch(92% 1.125% 264deg / 80%);
--color-gray-800: oklch(93% 0.875% 264deg / 85%);
--color-gray-900: oklch(95% 0.5% 264deg / 90%);
--color-gray-950: oklch(94% 0.375% 264deg / 95%);
}
}Description
Use Switch.Description to add a hint below the label.
Receive emails about account activity and security.
View source
import * as Switch from "@danielfrg/solid-ui/switch"
import styles from "./index.module.css"
export function DemoSwitchDescription() {
return (
<Switch.Root class={styles.switch} defaultChecked>
<div class={styles.text}>
<Switch.Label class={styles.label}>Email notifications</Switch.Label>
<Switch.Description class={styles.description}>
Receive emails about account activity and security.
</Switch.Description>
</div>
<Switch.Input class={styles.input} />
<Switch.Control class={styles.control}>
<Switch.Thumb class={styles.thumb} />
</Switch.Control>
</Switch.Root>
)
}.switch {
display: inline-flex;
align-items: center;
gap: 0.5rem;
}
.control {
box-sizing: border-box;
position: relative;
display: flex;
align-items: center;
margin: 0;
padding: 1px;
width: 2.5rem;
height: 1.5rem;
border: 0;
border-radius: 1.5rem;
outline: 1px solid;
outline-offset: -1px;
background-color: transparent;
background-image: linear-gradient(to right, var(--color-gray-700) 35%, var(--color-gray-200) 65%);
background-size: 6.5rem 100%;
background-position-x: 100%;
background-repeat: no-repeat;
transition-property: background-position, box-shadow;
transition-timing-function: cubic-bezier(0.26, 0.75, 0.38, 0.45);
transition-duration: 125ms;
cursor: pointer;
flex-shrink: 0;
}
.control:active {
background-color: var(--color-gray-100);
}
.control[data-checked] {
background-position-x: 0%;
}
.control[data-checked]:active {
background-color: var(--color-gray-500);
}
@media (prefers-color-scheme: light) {
.control {
box-shadow: var(--color-gray-200) 0 1.5px 2px inset;
outline-color: var(--color-gray-200);
}
}
@media (prefers-color-scheme: dark) {
.control {
box-shadow: rgb(0 0 0 / 75%) 0 1.5px 2px inset;
outline-color: rgb(255 255 255 / 15%);
background-image: linear-gradient(to right, var(--color-gray-500) 35%, var(--color-gray-200) 65%);
}
.control[data-checked] {
box-shadow: none;
}
}
.control:focus-visible::before {
content: "";
inset: 0;
position: absolute;
border-radius: inherit;
outline: 2px solid var(--color-blue);
outline-offset: 2px;
}
.thumb {
aspect-ratio: 1 / 1;
height: 100%;
border-radius: 100%;
background-color: white;
transition: translate 150ms ease;
}
.thumb[data-checked] {
translate: 1rem 0;
}
@media (prefers-color-scheme: light) {
.thumb {
box-shadow:
0 0 1px 1px var(--color-gray-100),
0 1px 1px var(--color-gray-100),
1px 2px 4px -1px var(--color-gray-100);
}
}
@media (prefers-color-scheme: dark) {
.thumb {
box-shadow:
0 0 1px 1px rgb(0 0 0 / 25%),
0 1px 1px rgb(0 0 0 / 25%),
1px 2px 4px -1px rgb(0 0 0 / 25%);
}
}
.label {
color: var(--color-gray-900);
font-size: 1rem;
line-height: 1.5rem;
user-select: none;
}
.input {
position: absolute;
opacity: 0;
pointer-events: none;
width: 1px;
height: 1px;
}
.text {
display: flex;
flex-direction: column;
gap: 0.125rem;
}
.description {
font-size: 0.875rem;
line-height: 1.25rem;
color: var(--color-gray-600);
}
.error {
font-size: 0.875rem;
line-height: 1.25rem;
color: #dc2626;
}
.status {
margin: 1rem 0 0;
font-size: 0.875rem;
line-height: 1.25rem;
color: var(--color-gray-600);
}:root {
--color-blue: oklch(45% 50% 264deg);
--color-red: oklch(50% 55% 31deg);
--color-gray-50: oklch(98% 0.25% 264deg);
--color-gray-100: oklch(12% 9.5% 264deg / 5%);
--color-gray-200: oklch(12% 9% 264deg / 7%);
--color-gray-300: oklch(12% 8.5% 264deg / 17%);
--color-gray-400: oklch(12% 8% 264deg / 38%);
--color-gray-500: oklch(12% 7.5% 264deg / 50%);
--color-gray-600: oklch(12% 7% 264deg / 67%);
--color-gray-700: oklch(12% 6% 264deg / 77%);
--color-gray-800: oklch(12% 5% 264deg / 85%);
--color-gray-900: oklch(12% 5% 264deg / 90%);
--color-gray-950: oklch(12% 5% 264deg / 95%);
}
@media (prefers-color-scheme: dark) {
:root {
--color-blue: oklch(69% 50% 264deg);
--color-red: oklch(80% 55% 31deg);
--color-gray-50: oklch(17% 0.25% 264deg);
--color-gray-100: oklch(28% 0.75% 264deg / 65%);
--color-gray-200: oklch(29% 0.75% 264deg / 80%);
--color-gray-300: oklch(35% 0.75% 264deg / 80%);
--color-gray-400: oklch(47% 0.875% 264deg / 80%);
--color-gray-500: oklch(64% 1% 264deg / 80%);
--color-gray-600: oklch(82% 1% 264deg / 80%);
--color-gray-700: oklch(92% 1.125% 264deg / 80%);
--color-gray-800: oklch(93% 0.875% 264deg / 85%);
--color-gray-900: oklch(95% 0.5% 264deg / 90%);
--color-gray-950: oklch(94% 0.375% 264deg / 95%);
}
}Error message
Use validationState and Switch.ErrorMessage to show validation feedback.
You must enable two-factor authentication to continue.
View source
import { createSignal } from "solid-js"
import * as Switch from "@danielfrg/solid-ui/switch"
import styles from "./index.module.css"
export function DemoSwitchErrorMessage() {
const [checked, setChecked] = createSignal(false)
return (
<Switch.Root
class={styles.switch}
checked={checked()}
onChange={setChecked}
validationState={!checked() ? "invalid" : "valid"}
>
<div class={styles.text}>
<Switch.Label class={styles.label}>Two-factor authentication</Switch.Label>
<Switch.ErrorMessage class={styles.error}>
You must enable two-factor authentication to continue.
</Switch.ErrorMessage>
</div>
<Switch.Input class={styles.input} />
<Switch.Control class={styles.control}>
<Switch.Thumb class={styles.thumb} />
</Switch.Control>
</Switch.Root>
)
}.switch {
display: inline-flex;
align-items: center;
gap: 0.5rem;
}
.control {
box-sizing: border-box;
position: relative;
display: flex;
align-items: center;
margin: 0;
padding: 1px;
width: 2.5rem;
height: 1.5rem;
border: 0;
border-radius: 1.5rem;
outline: 1px solid;
outline-offset: -1px;
background-color: transparent;
background-image: linear-gradient(to right, var(--color-gray-700) 35%, var(--color-gray-200) 65%);
background-size: 6.5rem 100%;
background-position-x: 100%;
background-repeat: no-repeat;
transition-property: background-position, box-shadow;
transition-timing-function: cubic-bezier(0.26, 0.75, 0.38, 0.45);
transition-duration: 125ms;
cursor: pointer;
flex-shrink: 0;
}
.control:active {
background-color: var(--color-gray-100);
}
.control[data-checked] {
background-position-x: 0%;
}
.control[data-checked]:active {
background-color: var(--color-gray-500);
}
@media (prefers-color-scheme: light) {
.control {
box-shadow: var(--color-gray-200) 0 1.5px 2px inset;
outline-color: var(--color-gray-200);
}
}
@media (prefers-color-scheme: dark) {
.control {
box-shadow: rgb(0 0 0 / 75%) 0 1.5px 2px inset;
outline-color: rgb(255 255 255 / 15%);
background-image: linear-gradient(to right, var(--color-gray-500) 35%, var(--color-gray-200) 65%);
}
.control[data-checked] {
box-shadow: none;
}
}
.control:focus-visible::before {
content: "";
inset: 0;
position: absolute;
border-radius: inherit;
outline: 2px solid var(--color-blue);
outline-offset: 2px;
}
.thumb {
aspect-ratio: 1 / 1;
height: 100%;
border-radius: 100%;
background-color: white;
transition: translate 150ms ease;
}
.thumb[data-checked] {
translate: 1rem 0;
}
@media (prefers-color-scheme: light) {
.thumb {
box-shadow:
0 0 1px 1px var(--color-gray-100),
0 1px 1px var(--color-gray-100),
1px 2px 4px -1px var(--color-gray-100);
}
}
@media (prefers-color-scheme: dark) {
.thumb {
box-shadow:
0 0 1px 1px rgb(0 0 0 / 25%),
0 1px 1px rgb(0 0 0 / 25%),
1px 2px 4px -1px rgb(0 0 0 / 25%);
}
}
.label {
color: var(--color-gray-900);
font-size: 1rem;
line-height: 1.5rem;
user-select: none;
}
.input {
position: absolute;
opacity: 0;
pointer-events: none;
width: 1px;
height: 1px;
}
.text {
display: flex;
flex-direction: column;
gap: 0.125rem;
}
.description {
font-size: 0.875rem;
line-height: 1.25rem;
color: var(--color-gray-600);
}
.error {
font-size: 0.875rem;
line-height: 1.25rem;
color: #dc2626;
}
.status {
margin: 1rem 0 0;
font-size: 0.875rem;
line-height: 1.25rem;
color: var(--color-gray-600);
}:root {
--color-blue: oklch(45% 50% 264deg);
--color-red: oklch(50% 55% 31deg);
--color-gray-50: oklch(98% 0.25% 264deg);
--color-gray-100: oklch(12% 9.5% 264deg / 5%);
--color-gray-200: oklch(12% 9% 264deg / 7%);
--color-gray-300: oklch(12% 8.5% 264deg / 17%);
--color-gray-400: oklch(12% 8% 264deg / 38%);
--color-gray-500: oklch(12% 7.5% 264deg / 50%);
--color-gray-600: oklch(12% 7% 264deg / 67%);
--color-gray-700: oklch(12% 6% 264deg / 77%);
--color-gray-800: oklch(12% 5% 264deg / 85%);
--color-gray-900: oklch(12% 5% 264deg / 90%);
--color-gray-950: oklch(12% 5% 264deg / 95%);
}
@media (prefers-color-scheme: dark) {
:root {
--color-blue: oklch(69% 50% 264deg);
--color-red: oklch(80% 55% 31deg);
--color-gray-50: oklch(17% 0.25% 264deg);
--color-gray-100: oklch(28% 0.75% 264deg / 65%);
--color-gray-200: oklch(29% 0.75% 264deg / 80%);
--color-gray-300: oklch(35% 0.75% 264deg / 80%);
--color-gray-400: oklch(47% 0.875% 264deg / 80%);
--color-gray-500: oklch(64% 1% 264deg / 80%);
--color-gray-600: oklch(82% 1% 264deg / 80%);
--color-gray-700: oklch(92% 1.125% 264deg / 80%);
--color-gray-800: oklch(93% 0.875% 264deg / 85%);
--color-gray-900: oklch(95% 0.5% 264deg / 90%);
--color-gray-950: oklch(94% 0.375% 264deg / 95%);
}
}