180 lines
3.6 KiB
CSS
180 lines
3.6 KiB
CSS
/* Slider styles */
|
|
|
|
.slider {
|
|
@apply grid w-full gap-1;
|
|
|
|
grid-template-areas:
|
|
"label output"
|
|
"track track";
|
|
grid-template-columns: 1fr auto;
|
|
|
|
[data-slot="label"] {
|
|
@apply w-fit text-sm font-medium;
|
|
|
|
grid-area: label;
|
|
}
|
|
|
|
.slider__output {
|
|
@apply text-sm font-medium tabular-nums;
|
|
|
|
grid-area: output;
|
|
}
|
|
|
|
.slider__track {
|
|
@apply relative rounded-xl bg-default;
|
|
|
|
grid-area: track;
|
|
}
|
|
|
|
.slider__fill {
|
|
@apply pointer-events-none absolute bg-accent;
|
|
}
|
|
|
|
.slider__thumb {
|
|
/* Flex container for centering pseudo-elements */
|
|
@apply absolute flex cursor-grab items-center justify-center rounded-xl bg-accent no-highlight;
|
|
|
|
/**
|
|
* Transitions
|
|
* CRITICAL: motion-reduce must be AFTER transition for correct override specificity
|
|
*/
|
|
transition:
|
|
background-color 250ms var(--ease-smooth),
|
|
transform 250ms var(--ease-out),
|
|
box-shadow 150ms var(--ease-out);
|
|
@apply motion-reduce:transition-none;
|
|
|
|
/* after: Visible thumb element */
|
|
&::after {
|
|
@apply relative z-10 rounded-lg bg-accent-foreground text-black shadow-field;
|
|
content: "";
|
|
|
|
/**
|
|
* Transitions
|
|
*/
|
|
@apply origin-center transition-all motion-reduce:transition-none;
|
|
}
|
|
|
|
/* Dragging state - cursor changes and thumb scales down */
|
|
&[data-dragging="true"] {
|
|
@apply cursor-grabbing;
|
|
|
|
&::after {
|
|
@apply scale-[0.9] motion-reduce:scale-100;
|
|
}
|
|
}
|
|
|
|
/* Focus state - increase z-index */
|
|
&[data-focus-visible="true"] {
|
|
@apply z-10 status-focused;
|
|
}
|
|
|
|
/* Disabled state */
|
|
&[data-disabled="true"] {
|
|
@apply cursor-default;
|
|
}
|
|
}
|
|
|
|
/* Disabled state */
|
|
&:disabled,
|
|
&[data-disabled="true"],
|
|
&[aria-disabled="true"] {
|
|
@apply status-disabled;
|
|
|
|
[data-slot="label"] {
|
|
@apply opacity-100;
|
|
}
|
|
}
|
|
|
|
/* Horizontal orientation */
|
|
&[data-orientation="horizontal"] {
|
|
flex-direction: column;
|
|
|
|
.slider__track {
|
|
@apply h-5 w-full;
|
|
/* Add transparent borders to provide space for thumb at edges */
|
|
/* Thumb width is 1.5rem (24px), so half is 0.75rem (12px) */
|
|
@apply border-x-[0.75rem] border-x-transparent;
|
|
|
|
&[data-fill-start="true"] {
|
|
@apply border-s-accent;
|
|
}
|
|
|
|
&[data-fill-end="true"] {
|
|
@apply border-e-accent;
|
|
}
|
|
}
|
|
|
|
.slider__fill,
|
|
.slider__thumb {
|
|
@apply h-full;
|
|
}
|
|
|
|
.slider__thumb {
|
|
@apply top-1/2;
|
|
|
|
/* Thumb width + border width */
|
|
width: calc(1.5rem + 0.25rem);
|
|
|
|
&::after {
|
|
width: 1.5rem;
|
|
height: 1rem;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Vertical orientation */
|
|
&[data-orientation="vertical"] {
|
|
@apply h-full gap-2;
|
|
|
|
flex-direction: row;
|
|
grid-template-areas:
|
|
"output"
|
|
"track"
|
|
"label";
|
|
grid-template-rows: auto 1fr auto;
|
|
grid-template-columns: 1fr;
|
|
|
|
.slider__output {
|
|
text-align: center;
|
|
}
|
|
|
|
[data-slot="label"] {
|
|
text-align: center;
|
|
}
|
|
|
|
.slider__track {
|
|
@apply h-full w-5;
|
|
/* Add transparent borders to provide space for thumb at edges */
|
|
/* Thumb height is 1.5rem (24px), so half is 0.75rem (12px) */
|
|
@apply border-y-[0.75rem] border-y-transparent;
|
|
justify-self: center;
|
|
|
|
&[data-fill-start="true"] {
|
|
@apply border-b-accent;
|
|
}
|
|
|
|
&[data-fill-end="true"] {
|
|
@apply border-t-accent;
|
|
}
|
|
}
|
|
|
|
.slider__fill,
|
|
.slider__thumb {
|
|
@apply w-full;
|
|
}
|
|
|
|
.slider__thumb {
|
|
@apply left-1/2;
|
|
|
|
/* Thumb height + border height */
|
|
height: calc(1.5rem + 0.25rem);
|
|
|
|
&::after {
|
|
width: 1rem;
|
|
height: 1.5rem;
|
|
}
|
|
}
|
|
}
|
|
}
|