Category Bar
edgecom/category-barFreeComponent
The Edgecom Category Bar component.
Live preview
live · rendered by the registry
Rendered by edgecom on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://design.edgecom.ai/r/category-bar.jsonSource
1'use client'23import React from 'react'45import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'67import { cn } from '@/lib/utils'89const DEFAULT_BAR_COLOR = 'bg-muted'1011const getMarkerBgColor = (marker: number | undefined, values: number[], colors: string[]): string => {12 if (marker === undefined) return ''1314 if (marker === 0) {15 for (let index = 0; index < values.length; index++) {16 if (values[index] > 0) {17 return colors[index] ?? DEFAULT_BAR_COLOR18 }19 }20 }2122 let prefixSum = 02324 for (let index = 0; index < values.length; index++) {25 prefixSum += values[index]2627 if (prefixSum >= marker) {28 return colors[index] ?? DEFAULT_BAR_COLOR29 }30 }3132 return colors[values.length - 1] ?? DEFAULT_BAR_COLOR33}3435const getPositionLeft = (value: number | undefined, maxValue: number): number => (value ? (value / maxValue) * 100 : 0)3637const sumNumericArray = (arr: number[]) => arr.reduce((prefixSum, num) => prefixSum + num, 0)3839const formatNumber = (num: number): string => {40 if (Number.isInteger(num)) {41 return num.toString()42 }4344 return num.toFixed(1)45}4647const BarLabels = ({ values }: { values: number[] }) => {48 const sumValues = React.useMemo(() => sumNumericArray(values), [values])4950 const labels = React.useMemo(() => {51 type Label = { showLabel: boolean; prefixSum: number; widthPositionLeft: number }5253 return values.reduce<{ prefixSum: number; hidden: number; items: Label[] }>(54 (state, widthPercentage) => {55 const prefixSum = state.prefixSum + widthPercentage5657 const showLabel =58 (widthPercentage >= 0.1 * sumValues || state.hidden >= 0.09 * sumValues) &&59 sumValues - prefixSum >= 0.1 * sumValues &&60 prefixSum >= 0.1 * sumValues &&61 prefixSum < 0.9 * sumValues6263 return {64 prefixSum,65 hidden: showLabel ? 0 : state.hidden + widthPercentage,66 items: [...state.items, { showLabel, prefixSum, widthPositionLeft: getPositionLeft(widthPercentage, sumValues) }]67 }68 },69 { prefixSum: 0, hidden: 0, items: [] }70 ).items71 }, [values, sumValues])7273 return (74 <div75 className={cn(76 'relative mb-2 flex h-5 w-full text-sm font-medium',7778 // text color79 'text-muted-foreground'80 )}81 >82 <div className='absolute bottom-0 left-0 flex items-center'>0</div>83 {labels.map((label, index) => (84 <div85 key={`item-${index}`}86// … truncated
What it pulls in
Other registry items
Files it writes
More from edgecom
All 66 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | edgecom | Components | Free | 2 deps | |
| Alertalert | edgecom | Components | Free | 1 dep | |
| Alert Dialogalert-dialog | edgecom | Components | Free | 1 dep | |
| Avataravatar | edgecom | Components | Free | 1 dep | |
| Badgebadge | edgecom | Components | Free | 2 deps | |
| Bannerbanner | edgecom | Components | Free | 1 dep | |
| Breadcrumbbreadcrumb | edgecom | Components | Free | 2 deps | |
| Buttonbutton | edgecom | Components | Free | 2 deps |
