@buun_group/brutalist-ui
Version:
A brutalist-styled component library
213 lines (179 loc) • 3.88 kB
CSS
.tabs {
display: flex;
flex-direction: column;
width: 100%;
}
.tabs.fullWidth {
width: 100%;
}
/* Orientation */
.tabs.vertical {
flex-direction: row;
}
/* List container */
.list {
display: flex;
background-color: var(--brutal-gray-100);
border: 3px solid var(--brutal-black);
box-shadow: 4px 4px 0px var(--brutal-black);
}
.list.horizontal {
flex-direction: row;
border-bottom: none;
}
.list.vertical {
flex-direction: column;
border-right: none;
min-width: 200px;
}
/* Tab trigger */
.trigger {
position: relative;
padding: var(--brutal-space-3) var(--brutal-space-4);
background-color: transparent;
border: none;
font-family: var(--brutal-font-mono);
font-weight: var(--brutal-font-bold);
text-transform: uppercase;
cursor: pointer;
transition: var(--brutal-transition-fast);
user-select: none;
color: var(--brutal-black);
}
/* Size variants */
.trigger.sm {
padding: var(--brutal-space-2) var(--brutal-space-3);
font-size: var(--brutal-text-xs);
}
.trigger.md {
padding: var(--brutal-space-3) var(--brutal-space-4);
font-size: var(--brutal-text-sm);
}
.trigger.lg {
padding: var(--brutal-space-4) var(--brutal-space-6);
font-size: var(--brutal-text-base);
}
/* Horizontal triggers */
.horizontal .trigger {
border-right: 3px solid var(--brutal-black);
}
.horizontal .trigger:last-child {
border-right: none;
}
/* Vertical triggers */
.vertical .trigger {
border-bottom: 3px solid var(--brutal-black);
text-align: left;
width: 100%;
}
.vertical .trigger:last-child {
border-bottom: none;
}
/* States */
.trigger:hover:not(.disabled) {
background-color: var(--brutal-gray-300);
}
.trigger:focus {
outline: none;
background-color: var(--brutal-gray-300);
z-index: 1;
}
.trigger.active {
background-color: var(--brutal-black);
color: var(--brutal-white);
}
.trigger.active::after {
content: '';
position: absolute;
background-color: var(--brutal-white);
}
/* Active indicator for horizontal */
.horizontal .trigger.active::after {
bottom: -3px;
left: 0;
right: 0;
height: 3px;
}
/* Active indicator for vertical */
.vertical .trigger.active::after {
right: -3px;
top: 0;
bottom: 0;
width: 3px;
}
.trigger.disabled {
opacity: 0.5;
cursor: not-allowed;
}
/* Content */
.content {
padding: var(--brutal-space-6);
background-color: var(--brutal-white);
border: 3px solid var(--brutal-black);
box-shadow: 4px 4px 0px var(--brutal-black);
animation: contentEnter 0.2s ease-out;
}
.content:focus {
outline: none;
}
.content.inactive {
display: none;
}
@keyframes contentEnter {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Mobile responsive */
@media (max-width: 768px) {
.list {
border-width: 2px;
box-shadow: 2px 2px 0px var(--brutal-black);
}
.content {
padding: var(--brutal-space-4);
border-width: 2px;
box-shadow: 2px 2px 0px var(--brutal-black);
}
.trigger.sm {
padding: var(--brutal-space-1) var(--brutal-space-2);
font-size: 10px;
}
.trigger.md {
padding: var(--brutal-space-2) var(--brutal-space-3);
font-size: var(--brutal-text-xs);
}
.trigger.lg {
padding: var(--brutal-space-3) var(--brutal-space-4);
font-size: var(--brutal-text-sm);
}
/* Force horizontal on mobile for vertical tabs */
.tabs.vertical {
flex-direction: column;
}
.list.vertical {
flex-direction: row;
border-right: 3px solid var(--brutal-black);
border-bottom: none;
min-width: auto;
}
.vertical .trigger {
border-bottom: none;
border-right: 3px solid var(--brutal-black);
}
.vertical .trigger:last-child {
border-right: none;
}
.vertical .trigger.active::after {
right: auto;
bottom: -3px;
left: 0;
width: auto;
height: 3px;
}
}