UNPKG

@buun_group/brutalist-ui

Version:
546 lines (464 loc) 11.2 kB
/* LineChart CSS Module */ .lineChart { --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; /* Add missing text sizes for variants */ --brutal-text-2xs: 0.625rem; --brutal-text-2xl: 1.5rem; 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 */ .lineChart[data-size="sm"] { padding: var(--brutal-space-2); font-size: var(--brutal-text-xs); } .lineChart[data-size="sm"] .title { font-size: var(--brutal-text-sm); margin-bottom: var(--brutal-space-1); } .lineChart[data-size="sm"] .subtitle { font-size: var(--brutal-text-xs); } .lineChart[data-size="sm"] .lineContainer { left: 40px; bottom: 0; padding: 0 var(--brutal-space-1); } .lineChart[data-size="sm"] .yAxis { width: 35px; } .lineChart[data-size="sm"] .yAxisLabels { width: 30px; } .lineChart[data-size="sm"] .gridLines { left: 35px; } .lineChart[data-size="sm"] .xAxisLabels { margin-left: 35px; margin-right: 8px; } .lineChart[data-size="sm"] .yAxisLabel, .lineChart[data-size="sm"] .xAxisLabel, .lineChart[data-size="sm"] .valueLabel { font-size: var(--brutal-text-2xs); } .lineChart[data-size="sm"] .dataCount { font-size: var(--brutal-text-2xs); } .lineChart[data-size="md"] { padding: var(--brutal-space-4); font-size: var(--brutal-text-base); } .lineChart[data-size="md"] .title { font-size: var(--brutal-text-lg); } .lineChart[data-size="md"] .subtitle { font-size: var(--brutal-text-sm); } .lineChart[data-size="lg"] { padding: var(--brutal-space-6); font-size: var(--brutal-text-lg); } .lineChart[data-size="lg"] .title { font-size: var(--brutal-text-2xl); margin-bottom: var(--brutal-space-3); } .lineChart[data-size="lg"] .subtitle { font-size: var(--brutal-text-base); } .lineChart[data-size="lg"] .yAxisLabel, .lineChart[data-size="lg"] .xAxisLabel, .lineChart[data-size="lg"] .valueLabel { font-size: var(--brutal-text-sm); } .lineChart[data-size="lg"] .dataCount { font-size: var(--brutal-text-sm); } /* Style variants */ .lineChart[data-variant="minimal"] { border: var(--brutal-border-width-thin) var(--brutal-border-style) var(--brutal-chart-border); box-shadow: none; background-color: transparent; } .lineChart[data-variant="minimal"] .title { font-weight: var(--brutal-font-medium); font-size: var(--brutal-text-lg); } .lineChart[data-variant="minimal"] .subtitle { font-weight: var(--brutal-font-medium); } .lineChart[data-variant="minimal"] .valueLabel { border: var(--brutal-border-width-thin) var(--brutal-border-style) var(--brutal-chart-border); box-shadow: var(--brutal-shadow-sm); background-color: var(--brutal-white); } .lineChart[data-variant="brutal"] { border: 5px solid var(--brutal-chart-border); box-shadow: var(--brutal-shadow-lg); transform: translate(0, 0); background-color: var(--brutal-chart-bg); } .lineChart[data-variant="brutal"]:hover { transform: translate(-6px, -6px); box-shadow: 12px 12px 0px 0px rgba(0, 0, 0, 1); } .lineChart[data-variant="brutal"] .title { font-weight: var(--brutal-font-black); font-size: var(--brutal-text-2xl); text-shadow: 2px 2px 0px rgba(0, 0, 0, 0.3); } .lineChart[data-variant="brutal"] .subtitle { font-weight: var(--brutal-font-bold); font-size: var(--brutal-text-base); } .lineChart[data-variant="brutal"] .valueLabel { border: 3px solid var(--brutal-chart-border); box-shadow: var(--brutal-shadow); background-color: var(--brutal-yellow); color: var(--brutal-black); font-weight: var(--brutal-font-black); } .lineChart[data-variant="brutal"] .yAxisLabel, .lineChart[data-variant="brutal"] .xAxisLabel { font-weight: var(--brutal-font-black); color: var(--brutal-black); } .lineChart[data-variant="brutal"] .gridLine { background-color: var(--brutal-black); height: 2px; opacity: 0.8; } .lineChart[data-variant="brutal"] .footer { border-top: 3px solid var(--brutal-chart-border); } .lineChart[data-variant="brutal"] .dataCount { font-weight: var(--brutal-font-black); color: var(--brutal-black); } /* 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 */ .lineChart[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: 1; pointer-events: none; } .gridLine { height: 1px; background-color: var(--brutal-chart-grid); width: 100%; opacity: 0.7; z-index: 1; } /* Line Container */ .lineContainer { position: absolute; left: 70px; right: 16px; bottom: 0; top: 0; z-index: 2; padding: 0 var(--brutal-space-2); } /* When grid is hidden, line should start from left edge */ .lineChart:not([data-show-grid="true"]) .lineContainer { left: 16px; right: 16px; padding: 0 var(--brutal-space-2); } .lineChart:not([data-show-grid="true"]) .xAxisLabels { margin-left: 16px; margin-right: 16px; padding: var(--brutal-space-2) 0; } .lineSvg { width: 100%; height: 100%; position: absolute; top: 0; left: 0; } .dataPointHover { position: absolute; width: 20px; height: 20px; z-index: 4; cursor: pointer; border-radius: 50%; } .dataPointHover:hover { background-color: rgba(0, 0, 0, 0.1); } .valueLabel { position: absolute; font-size: var(--brutal-text-xs); font-weight: var(--brutal-font-bold); color: var(--brutal-chart-text); text-align: center; background-color: var(--brutal-white); border: var(--brutal-border-width) var(--brutal-border-style) var(--brutal-black); padding: var(--brutal-space-1); border-radius: 2px; box-shadow: var(--brutal-shadow-sm); white-space: nowrap; z-index: 3; pointer-events: none; } .lineChart[data-animated="true"] .valueLabel { animation: fadeInScale 0.5s ease-out forwards; opacity: 0; transform: translate(-50%, -150%) scale(0.8); } /* 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 fadeInScale { to { opacity: 1; transform: translate(-50%, -150%) scale(1); } } @keyframes drawLine { from { stroke-dasharray: 1000; stroke-dashoffset: 1000; } to { stroke-dasharray: 1000; stroke-dashoffset: 0; } } @keyframes fadeInDot { from { opacity: 0; transform: scale(0); } to { opacity: 1; transform: scale(1); } } .animatedLine { stroke-dasharray: 1000; stroke-dashoffset: 1000; animation: drawLine 1.5s ease-out forwards; } .animatedDot { opacity: 0; transform: scale(0); animation: fadeInDot 0.5s ease-out forwards; } /* Responsive Design */ @media (max-width: 768px) { .lineChart[data-size="lg"] { padding: var(--brutal-space-4); font-size: var(--brutal-text-base); } .title { font-size: var(--brutal-text-lg); } .lineContainer { padding-left: 50px; } .yAxis { width: 45px; } .yAxisLabels { width: 40px; } .gridLines { left: 40px; } } @media (max-width: 480px) { .lineChart { padding: var(--brutal-space-3); } .title { font-size: var(--brutal-text-base); } .subtitle { font-size: var(--brutal-text-xs); } .lineContainer { padding-left: 40px; } .yAxis { width: 35px; } .yAxisLabels { width: 30px; } .gridLines { left: 30px; } .yAxisLabel, .valueLabel, .xAxisLabel { font-size: 9px; } } /* High Contrast Mode Support */ @media (prefers-contrast: high) { .lineChart { border-width: var(--brutal-border-width-thick); } .valueLabel { border-width: var(--brutal-border-width); } .gridLine { background-color: var(--brutal-black); opacity: 1; } } /* Reduced Motion Support */ @media (prefers-reduced-motion: reduce) { .lineChart[data-animated="true"] .valueLabel, .animatedLine, .animatedDot { animation: none; opacity: 1; transform: none; stroke-dasharray: none; stroke-dashoffset: 0; } .lineChart[data-variant="brutal"] { transition: none; } }