UNPKG

@buun_group/brutalist-ui

Version:
267 lines (227 loc) 4.88 kB
.button { position: relative; display: inline-flex; align-items: center; justify-content: center; gap: var(--brutal-space-2); font-family: var(--brutal-font-mono); font-weight: var(--brutal-font-bold); text-transform: uppercase; letter-spacing: 0.05em; border: var(--brutal-border-width) var(--brutal-border-style) var(--brutal-black); cursor: pointer; transition: var(--brutal-transition-base); user-select: none; white-space: nowrap; outline: none; } /* Sizes */ .sm { padding: var(--brutal-space-2) var(--brutal-space-4); font-size: var(--brutal-text-xs); } .md { padding: var(--brutal-space-3) var(--brutal-space-6); font-size: var(--brutal-text-sm); } .lg { padding: var(--brutal-space-4) var(--brutal-space-8); font-size: var(--brutal-text-base); } .xl { padding: var(--brutal-space-6) var(--brutal-space-10); font-size: var(--brutal-text-lg); } /* Variants */ .default { background-color: var(--brutal-white); color: var(--brutal-black); } .default:hover:not(.disabled) { background-color: var(--brutal-white); color: var(--brutal-accent); border-color: var(--brutal-accent); } .destructive { background-color: var(--brutal-accent); color: var(--brutal-white); border-color: var(--brutal-accent-dark); } .destructive:hover:not(.disabled) { background-color: var(--brutal-accent-dark); } .outline { background-color: transparent; color: var(--brutal-black); } .outline:hover:not(.disabled) { background-color: transparent; color: var(--brutal-accent); border-color: var(--brutal-accent); } .ghost { background-color: transparent; color: var(--brutal-black); border-color: transparent; } .ghost:hover:not(.disabled) { background-color: transparent; color: var(--brutal-accent); border-color: var(--brutal-accent); } .brutal { background-color: var(--brutal-black); color: var(--brutal-white); } .brutal:hover:not(.disabled) { background-color: var(--brutal-gray-900); } .primary { background-color: var(--brutal-accent); color: var(--brutal-white); border-color: var(--brutal-accent-dark); } .primary:hover:not(.disabled) { background-color: var(--brutal-accent-dark); } .secondary { background-color: var(--brutal-gray-200); color: var(--brutal-gray-800); border-color: var(--brutal-gray-400); } .secondary:hover:not(.disabled) { background-color: var(--brutal-gray-200); color: var(--brutal-accent); border-color: var(--brutal-accent); } .danger { background-color: var(--brutal-error); color: var(--brutal-white); border-color: #DC2626; } .danger:hover:not(.disabled) { background-color: #DC2626; } /* Shadow effect */ .withShadow { box-shadow: var(--brutal-shadow); } .withShadow:hover:not(.disabled) { transform: translate(-4px, -4px); box-shadow: var(--brutal-shadow-lg); } .withShadow:active:not(.disabled) { transform: translate(0, 0); box-shadow: var(--brutal-shadow-sm); } /* States */ .fullWidth { width: 100%; } .disabled { opacity: 0.5; cursor: not-allowed; } .disabled:hover { transform: none; box-shadow: var(--brutal-shadow); } .loading { color: transparent; } /* Loading spinner */ .loader { position: absolute; width: 1em; height: 1em; border: 2px solid currentColor; border-right-color: transparent; animation: spin 0.6s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* Focus */ .button:focus-visible { outline: var(--brutal-border-width) var(--brutal-border-style) var(--brutal-accent); outline-offset: 2px; } /* Icon spacing */ .icon { display: inline-flex; align-items: center; justify-content: center; } .content { display: inline-flex; align-items: center; } /* Glitch effect */ .glitch { position: relative; } .glitch::before, .glitch::after { content: attr(data-text); position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; padding: inherit; } .glitch::before { animation: brutal-glitch-1 0.5s infinite; color: var(--brutal-accent); z-index: -1; opacity: 0.8; } .glitch::after { animation: brutal-glitch-2 0.5s infinite; color: var(--brutal-info); z-index: -2; opacity: 0.8; } .glitch:hover::before, .glitch:hover::after { animation-duration: 0.2s; } @keyframes brutal-glitch-1 { 0%, 100% { transform: translate(0); } 20% { transform: translate(-2px, 2px); } 40% { transform: translate(-2px, -2px); } 60% { transform: translate(2px, 2px); } 80% { transform: translate(2px, -2px); } } @keyframes brutal-glitch-2 { 0%, 100% { transform: translate(0); } 20% { transform: translate(2px, -2px); } 40% { transform: translate(2px, 2px); } 60% { transform: translate(-2px, -2px); } 80% { transform: translate(-2px, 2px); } }