UNPKG

@buun_group/brutalist-ui

Version:
252 lines (217 loc) 5.5 kB
.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; } }