@buun_group/brutalist-ui
Version:
A brutalist-styled component library
252 lines (217 loc) • 5.5 kB
CSS
.carousel {
--brutal-carousel-bg: var(--brutal-white);
--brutal-carousel-border: var(--brutal-black);
--brutal-carousel-border-width: 3px;
--brutal-carousel-shadow: 4px 4px 0 var(--brutal-black);
--brutal-carousel-button-bg: var(--brutal-white);
--brutal-carousel-button-hover-bg: var(--brutal-gray-light);
--brutal-carousel-button-disabled-bg: var(--brutal-gray-light);
--brutal-carousel-indicator-bg: var(--brutal-gray);
--brutal-carousel-indicator-active-bg: var(--brutal-black);
--brutal-carousel-transition: transform 0.3s ease-out;
position: relative;
display: flex;
flex-direction: column;
width: 100%;
background-color: var(--brutal-carousel-bg);
border: var(--brutal-carousel-border-width) solid var(--brutal-carousel-border);
box-shadow: var(--brutal-carousel-shadow);
overflow: hidden;
}
/* Size variants */
.carousel-sm {
--brutal-carousel-border-width: 2px;
--brutal-carousel-shadow: 2px 2px 0 var(--brutal-black);
}
.carousel-lg {
--brutal-carousel-border-width: 4px;
--brutal-carousel-shadow: 6px 6px 0 var(--brutal-black);
}
/* Style variants */
.carousel-brutal {
--brutal-carousel-bg: var(--brutal-accent);
--brutal-carousel-button-bg: var(--brutal-accent);
--brutal-carousel-button-hover-bg: var(--brutal-black);
--brutal-carousel-indicator-active-bg: var(--brutal-white);
background-color: var(--brutal-carousel-bg);
color: var(--brutal-white);
}
.carousel-brutal .carouselButton {
color: var(--brutal-black);
}
.carousel-brutal .carouselButton:hover:not(:disabled) {
color: var(--brutal-white);
}
.carousel-outline {
--brutal-carousel-bg: transparent;
--brutal-carousel-border: var(--brutal-black);
--brutal-carousel-shadow: none;
background-color: transparent;
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
}
/* Carousel Content */
.carouselContent {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
}
.carouselTrack {
display: flex;
height: 100%;
transition: var(--brutal-carousel-transition);
will-change: transform;
}
.carousel[data-orientation="vertical"] .carouselTrack {
flex-direction: column;
}
.carouselItem {
flex: 0 0 100%;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
/* Controls */
.carouselControls {
position: absolute;
top: 50%;
left: 0;
right: 0;
transform: translateY(-50%);
display: flex;
justify-content: space-between;
padding: 0 1rem;
pointer-events: none;
z-index: 1;
}
.carousel[data-orientation="vertical"] .carouselControls {
top: 0;
bottom: 0;
left: 50%;
right: auto;
transform: translateX(-50%);
flex-direction: column;
padding: 1rem 0;
}
/* Buttons */
.carouselButton {
pointer-events: auto;
display: flex;
align-items: center;
justify-content: center;
width: 48px;
height: 48px;
padding: 0;
background-color: var(--brutal-carousel-button-bg);
border: var(--brutal-carousel-border-width) solid var(--brutal-carousel-border);
box-shadow: 2px 2px 0 var(--brutal-black);
cursor: pointer;
transition: all 0.2s ease;
font-family: var(--brutal-font-mono);
font-weight: 700;
}
.carousel-sm .carouselButton {
width: 36px;
height: 36px;
}
.carousel-lg .carouselButton {
width: 56px;
height: 56px;
}
.carouselButton:hover:not(:disabled) {
background-color: var(--brutal-carousel-button-hover-bg);
transform: translate(-2px, -2px);
box-shadow: 4px 4px 0 var(--brutal-black);
}
.carouselButton:active:not(:disabled) {
transform: translate(2px, 2px);
box-shadow: 0 0 0 var(--brutal-black);
}
.carouselButton:disabled {
background-color: var(--brutal-carousel-button-disabled-bg);
cursor: not-allowed;
opacity: 0.5;
}
.carousel[data-orientation="vertical"] .carouselPrevious svg,
.carousel[data-orientation="vertical"] .carouselNext svg {
transform: rotate(90deg);
}
/* Indicators */
.carouselIndicators {
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
padding: 1rem;
}
.carousel[data-orientation="vertical"] .carouselIndicators {
flex-direction: column;
position: absolute;
right: 1rem;
top: 50%;
transform: translateY(-50%);
padding: 0;
}
.carouselIndicator {
width: 12px;
height: 12px;
padding: 0;
background-color: var(--brutal-carousel-indicator-bg);
border: 2px solid var(--brutal-carousel-border);
cursor: pointer;
transition: all 0.2s ease;
}
.carousel-sm .carouselIndicator {
width: 10px;
height: 10px;
}
.carousel-lg .carouselIndicator {
width: 14px;
height: 14px;
}
.carouselIndicator:hover {
transform: scale(1.2);
}
.carouselIndicatorActive {
background-color: var(--brutal-carousel-indicator-active-bg);
transform: scale(1.2);
}
/* Accessibility */
.carousel:focus-visible {
outline: 3px solid var(--brutal-focus);
outline-offset: 2px;
}
.carouselButton:focus-visible {
outline: 3px solid var(--brutal-focus);
outline-offset: 2px;
}
.carouselIndicator:focus-visible {
outline: 3px solid var(--brutal-focus);
outline-offset: 2px;
}
/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
.carouselTrack {
transition: none;
}
.carouselButton,
.carouselIndicator {
transition: none;
}
}
/* Responsive */
@media (max-width: 640px) {
.carouselControls {
padding: 0 0.5rem;
}
.carouselButton {
width: 36px;
height: 36px;
}
.carousel[data-orientation="vertical"] .carouselControls {
padding: 0.5rem 0;
}
}