UNPKG

@buun_group/brutalist-ui

Version:
301 lines (247 loc) 6.71 kB
/* ===== PIE CHART COMPONENT ===== */ .pieChart { display: flex; flex-direction: column; gap: var(--brutal-space-4); font-family: var(--brutal-font-mono); color: var(--brutal-foreground); background-color: var(--brutal-background); position: relative; } /* ===== VARIANTS ===== */ .pieChart[data-variant="minimal"] { --brutal-border-width: 1px; --brutal-shadow-size: 0px; } .pieChart[data-variant="minimal"] .title { font-weight: var(--brutal-font-medium); text-shadow: none; } .pieChart[data-variant="minimal"] .legendItem { border-width: 1px !important; box-shadow: none !important; background-color: transparent !important; } .pieChart[data-variant="minimal"] .legendColor { border-width: 1px !important; box-shadow: none !important; } .pieChart[data-variant="default"] { --brutal-border-width: 2px; --brutal-shadow-size: 4px; } .pieChart[data-variant="default"] .legendItem { border-width: 2px !important; box-shadow: 4px 4px 0 var(--brutal-foreground) !important; } .pieChart[data-variant="default"] .legendColor { border-width: 2px !important; box-shadow: 2px 2px 0 var(--brutal-foreground) !important; } .pieChart[data-variant="brutal"] { --brutal-border-width: 5px; --brutal-shadow-size: 8px; } .pieChart[data-variant="brutal"] .title { text-shadow: 3px 3px 0 var(--brutal-accent); font-weight: var(--brutal-font-black); font-size: var(--brutal-text-xl); } .pieChart[data-variant="brutal"] .legendItem { border-width: 5px !important; box-shadow: 8px 8px 0 var(--brutal-foreground) !important; background-color: var(--brutal-accent) !important; color: var(--brutal-background) !important; } .pieChart[data-variant="brutal"] .legendColor { border-width: 5px !important; box-shadow: 4px 4px 0 var(--brutal-foreground) !important; } .pieChart[data-variant="brutal"] .legendLabel, .pieChart[data-variant="brutal"] .legendValue { color: var(--brutal-background); font-weight: var(--brutal-font-black); } /* ===== HEADER ===== */ .header { display: flex; flex-direction: column; gap: var(--brutal-space-1); text-align: center; } .title { font-family: var(--brutal-font-mono); font-size: var(--brutal-text-lg); font-weight: var(--brutal-font-black); letter-spacing: var(--brutal-letter-spacing-wide); text-transform: uppercase; color: var(--brutal-foreground); margin: 0; line-height: 1.2; } .subtitle { font-family: var(--brutal-font-mono); font-size: var(--brutal-text-sm); font-weight: var(--brutal-font-medium); color: var(--brutal-muted-foreground); margin: 0; text-transform: uppercase; letter-spacing: var(--brutal-letter-spacing-wide); } /* ===== CHART CONTAINER ===== */ .chartContainer { position: relative; display: flex; align-items: center; justify-content: center; margin: 0 auto; } .chartContainer[data-show-container="true"] { border: var(--brutal-border-width) var(--brutal-border-style, solid) var(--brutal-foreground); box-shadow: var(--brutal-shadow-size) var(--brutal-shadow-size) 0 var(--brutal-foreground); background-color: var(--brutal-background); padding: var(--brutal-space-4); } /* ===== SVG STYLES ===== */ .pieSvg { display: block; overflow: visible; } .animatedSlice { animation: drawSlice 0.8s ease-out forwards; transform-origin: center; } @keyframes drawSlice { from { opacity: 0; transform: scale(0); } to { opacity: 1; transform: scale(1); } } /* ===== VALUE LABELS ===== */ .valueLabel { font-family: var(--brutal-font-mono); font-size: var(--brutal-text-xs); font-weight: var(--brutal-font-black); fill: var(--brutal-white); text-shadow: 1px 1px 0 var(--brutal-foreground); letter-spacing: var(--brutal-letter-spacing-wide); } .pieChart[data-variant="brutal"] .valueLabel { font-size: var(--brutal-text-sm); text-shadow: 2px 2px 0 var(--brutal-foreground); } .pieChart[data-animated="true"] .valueLabel { animation: fadeInValue 0.6s ease-out forwards; opacity: 0; } @keyframes fadeInValue { from { opacity: 0; transform: scale(0.8); } to { opacity: 1; transform: scale(1); } } /* ===== HOVER AREAS ===== */ .sliceHover { cursor: pointer; z-index: 10; } .sliceHover:hover { background-color: rgba(255, 255, 255, 0.1); } /* ===== LEGEND ===== */ .legend { display: flex; flex-direction: column; gap: var(--brutal-space-2); margin-top: var(--brutal-space-3); } .legendItem { display: flex; align-items: center; gap: var(--brutal-space-2); padding: var(--brutal-space-2); border: var(--brutal-border-width) solid var(--brutal-foreground); background-color: var(--brutal-background); font-family: var(--brutal-font-mono); box-shadow: var(--brutal-shadow-size) var(--brutal-shadow-size) 0 var(--brutal-foreground); } .legendColor { width: var(--brutal-space-4); height: var(--brutal-space-4); border: var(--brutal-border-width) solid var(--brutal-foreground); flex-shrink: 0; box-shadow: var(--brutal-shadow-size) var(--brutal-shadow-size) 0 var(--brutal-foreground); } .legendLabel { font-size: var(--brutal-text-sm); font-weight: var(--brutal-font-bold); text-transform: uppercase; letter-spacing: var(--brutal-letter-spacing-wide); flex: 1; } .legendValue { font-size: var(--brutal-text-sm); font-weight: var(--brutal-font-black); color: var(--brutal-muted-foreground); } /* ===== DATA COUNT ===== */ .dataCount { text-align: center; font-family: var(--brutal-font-mono); font-size: var(--brutal-text-xs); font-weight: var(--brutal-font-bold); color: var(--brutal-muted-foreground); text-transform: uppercase; letter-spacing: var(--brutal-letter-spacing-wide); margin-top: var(--brutal-space-2); } /* ===== EMPTY STATE ===== */ .empty { min-height: 200px; display: flex; align-items: center; justify-content: center; border: var(--brutal-border-width) dashed var(--brutal-muted-foreground); background-color: var(--brutal-muted); } .emptyState { text-align: center; } .emptyText { font-family: var(--brutal-font-mono); font-size: var(--brutal-text-sm); font-weight: var(--brutal-font-black); color: var(--brutal-muted-foreground); text-transform: uppercase; letter-spacing: var(--brutal-letter-spacing-wide); } /* ===== RESPONSIVE DESIGN ===== */ @media (max-width: 768px) { .pieChart { gap: var(--brutal-space-3); } .title { font-size: var(--brutal-text-base); } .subtitle { font-size: var(--brutal-text-xs); } .legend { gap: var(--brutal-space-1); } .legendItem { padding: var(--brutal-space-1); gap: var(--brutal-space-1); } .valueLabel { font-size: 10px; } }