UNPKG

@buun_group/brutalist-ui

Version:
481 lines (412 loc) 9.36 kB
/* BarChart CSS Module */ .barChart { --brutal-chart-bg: var(--brutal-white); --brutal-chart-border: var(--brutal-black); --brutal-chart-text: var(--brutal-black); --brutal-chart-grid: var(--brutal-gray-200); --brutal-chart-accent: var(--brutal-accent); --brutal-blue: #0066FF; --brutal-green: #00FF41; --brutal-yellow: #FFFF00; --brutal-red: #FF073A; --brutal-orange: #FF6600; --brutal-purple: #8B00FF; font-family: var(--brutal-font-mono); background-color: var(--brutal-chart-bg); border: var(--brutal-border-width-thick) var(--brutal-border-style) var(--brutal-chart-border); box-shadow: var(--brutal-shadow); transition: var(--brutal-transition-base); position: relative; overflow: hidden; width: 100%; } /* Size variants */ .barChart[data-size="sm"] { padding: var(--brutal-space-2); font-size: var(--brutal-text-xs); } .barChart[data-size="sm"] .title { font-size: var(--brutal-text-base); margin-bottom: var(--brutal-space-1); } .barChart[data-size="sm"] .subtitle { font-size: var(--brutal-text-xs); } .barChart[data-size="sm"] .barsContainer { left: 50px; bottom: 0; gap: var(--brutal-space-1); padding: 0 var(--brutal-space-1); } .barChart[data-size="sm"] .yAxis { width: 45px; } .barChart[data-size="sm"] .yAxisLabels { width: 40px; } .barChart[data-size="sm"] .gridLines { left: 45px; } .barChart[data-size="sm"] .barWrapper { min-width: 35px; max-width: 70px; } .barChart[data-size="sm"] .barLabel { font-size: var(--brutal-text-2xs); } .barChart[data-size="md"] { padding: var(--brutal-space-4); font-size: var(--brutal-text-base); } .barChart[data-size="lg"] { padding: var(--brutal-space-6); font-size: var(--brutal-text-lg); } /* Style variants */ .barChart[data-variant="minimal"] { border: var(--brutal-border-width-thin) var(--brutal-border-style) var(--brutal-chart-border); box-shadow: none; } .barChart[data-variant="brutal"] { border: var(--brutal-border-width-thick) var(--brutal-border-style) var(--brutal-chart-border); box-shadow: var(--brutal-shadow-lg); transform: translate(0, 0); } .barChart[data-variant="brutal"]:hover { transform: translate(-4px, -4px); box-shadow: var(--brutal-shadow-xl); } /* Header Section */ .header { margin-bottom: var(--brutal-space-4); text-align: center; } .title { margin: 0 0 var(--brutal-space-2) 0; font-size: var(--brutal-text-xl); font-weight: var(--brutal-font-black); color: var(--brutal-chart-text); text-transform: uppercase; letter-spacing: 0.1em; line-height: 1.2; } .subtitle { margin: 0; font-size: var(--brutal-text-sm); font-weight: var(--brutal-font-medium); color: var(--brutal-gray-700); text-transform: uppercase; letter-spacing: 0.05em; } /* Chart Container */ .chartContainer { position: relative; width: 100%; } /* Optional chart container border */ .barChart[data-show-container="true"] .chartContainer { border: var(--brutal-border-width) var(--brutal-border-style) var(--brutal-chart-border); padding: var(--brutal-space-4); margin: var(--brutal-space-2); overflow: hidden; } /* Y-Axis */ .yAxis { position: absolute; left: 0; top: 0; bottom: 0; width: 60px; z-index: 1; } .yAxisLabels { position: absolute; left: 0; top: 0; bottom: 0; width: 50px; display: flex; flex-direction: column; justify-content: space-between; align-items: flex-end; padding-right: var(--brutal-space-2); } .yAxisLabel { font-size: var(--brutal-text-xs); font-weight: var(--brutal-font-bold); color: var(--brutal-gray-700); text-transform: uppercase; } .gridLines { position: absolute; left: 70px; top: 0; bottom: 0; right: 16px; display: flex; flex-direction: column; justify-content: space-between; z-index: 10; pointer-events: none; } .gridLine { height: 1px; background-color: var(--brutal-chart-grid); width: 100%; opacity: 0.7; z-index: 1; } /* Bars Container */ .barsContainer { position: absolute; left: 70px; right: 16px; bottom: 0; top: 0; display: flex; align-items: flex-end; justify-content: space-around; gap: var(--brutal-space-2); z-index: 2; padding: 0 var(--brutal-space-2); } /* When grid is hidden, bars should start from left edge */ .barChart:not([data-show-grid="true"]) .barsContainer { left: 16px; right: 16px; padding: 0 var(--brutal-space-2); } .barChart:not([data-show-grid="true"]) .xAxisLabels { margin-left: 16px; margin-right: 16px; padding: var(--brutal-space-2) 0; } .barWrapper { display: flex; flex-direction: column; align-items: center; justify-content: flex-start; gap: var(--brutal-space-1); flex: 1; min-width: 50px; max-width: 100px; height: 100%; } .barChart[data-animated="true"] .barWrapper { animation: slideInUp 0.6s ease-out forwards; opacity: 0; transform: translateY(20px); } .barValue { font-size: var(--brutal-text-xs); font-weight: var(--brutal-font-bold); color: var(--brutal-chart-text); text-align: center; min-height: 16px; display: flex; align-items: center; justify-content: center; white-space: nowrap; overflow: hidden; } .bar { width: 100%; min-height: 8px; border: var(--brutal-border-width) var(--brutal-border-style) var(--brutal-chart-border); box-shadow: var(--brutal-shadow-sm); transition: var(--brutal-transition-fast); cursor: pointer; position: relative; } .barChart[data-animated="true"] .bar { animation: growHeight 0.8s ease-out forwards; transform-origin: bottom; } .bar:hover { transform: translate(-2px, -2px); box-shadow: var(--brutal-shadow); } .bar:active { transform: translate(0, 0); box-shadow: var(--brutal-shadow-sm); } .barLabel { font-size: var(--brutal-text-xs); font-weight: var(--brutal-font-bold); color: var(--brutal-chart-text); text-align: center; text-transform: uppercase; letter-spacing: 0.05em; line-height: 1.2; max-width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: help; height: 16px; display: flex; align-items: center; justify-content: center; } /* X-axis labels in footer */ .xAxisLabels { display: flex; align-items: center; justify-content: space-around; gap: var(--brutal-space-2); margin-bottom: var(--brutal-space-2); padding: var(--brutal-space-2) 0; margin-left: 70px; margin-right: 16px; } .xAxisLabel { font-size: var(--brutal-text-xs); font-weight: var(--brutal-font-bold); color: var(--brutal-chart-text); text-align: center; text-transform: uppercase; letter-spacing: 0.05em; line-height: 1.2; flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: help; padding: var(--brutal-space-1); } /* Footer */ .footer { margin-top: var(--brutal-space-4); padding-top: var(--brutal-space-3); border-top: var(--brutal-border-width-thin) var(--brutal-border-style) var(--brutal-chart-border); text-align: center; } .dataCount { font-size: var(--brutal-text-xs); font-weight: var(--brutal-font-bold); color: var(--brutal-gray-700); text-transform: uppercase; letter-spacing: 0.1em; } /* Empty State */ .empty { display: flex; align-items: center; justify-content: center; min-height: 200px; } .emptyState { text-align: center; } .emptyText { font-size: var(--brutal-text-lg); font-weight: var(--brutal-font-black); color: var(--brutal-gray-500); text-transform: uppercase; letter-spacing: 0.1em; } /* Animations */ @keyframes slideInUp { to { opacity: 1; transform: translateY(0); } } @keyframes growHeight { from { transform: scaleY(0); } to { transform: scaleY(1); } } /* Responsive Design */ @media (max-width: 768px) { .barChart[data-size="lg"] { padding: var(--brutal-space-4); font-size: var(--brutal-text-base); } .title { font-size: var(--brutal-text-lg); } .barsContainer { padding-left: 50px; gap: var(--brutal-space-1); } .yAxis { width: 45px; } .yAxisLabels { width: 40px; } .gridLines { left: 40px; } .barWrapper { min-width: 30px; max-width: 60px; } .barLabel { font-size: 10px; } } @media (max-width: 480px) { .barChart { padding: var(--brutal-space-3); } .title { font-size: var(--brutal-text-base); } .subtitle { font-size: var(--brutal-text-xs); } .barsContainer { padding-left: 40px; } .yAxis { width: 35px; } .yAxisLabels { width: 30px; } .gridLines { left: 30px; } .barWrapper { min-width: 25px; max-width: 50px; } .yAxisLabel, .barValue, .barLabel { font-size: 9px; } } /* High Contrast Mode Support */ @media (prefers-contrast: high) { .barChart { border-width: var(--brutal-border-width-thick); } .bar { border-width: var(--brutal-border-width); } .gridLine { background-color: var(--brutal-black); border-top-color: var(--brutal-black); } } /* Reduced Motion Support */ @media (prefers-reduced-motion: reduce) { .barChart[data-animated="true"] .barWrapper, .barChart[data-animated="true"] .bar { animation: none; opacity: 1; transform: none; } .bar { transition: none; } .barChart[data-variant="brutal"] { transition: none; } }