
## Peak Week

### Peak Week

```svelte
<script lang="ts">
	import {
		EChartsBarChart,
		type ChartConfig
	} from '$lib/components/evilcharts/charts/echarts-bar-chart/index.js';
	const data = [
		{ week: 'W01', organic: 128, paid: 74 },
		{ week: 'W02', organic: 164, paid: 91 },
		{ week: 'W03', organic: 142, paid: 66 },
		{ week: 'W04', organic: 199, paid: 108 },
		{ week: 'W05', organic: 176, paid: 84 },
		{ week: 'W06', organic: 231, paid: 167 },
		{ week: 'W07', organic: 208, paid: 96 },
		{ week: 'W08', organic: 287, paid: 158 },
		{ week: 'W09', organic: 244, paid: 112 },
		{ week: 'W10', organic: 196, paid: 88 },
		{ week: 'W11', organic: 221, paid: 103 },
		{ week: 'W12', organic: 173, paid: 79 }
	];
	const config = {
		organic: { label: 'Organic', colors: { light: ['#7c3aed'], dark: ['#a78bfa'] } },
		paid: { label: 'Paid', colors: { light: ['#0891b2'], dark: ['#22d3ee'] } }
	} satisfies ChartConfig;
	const peak = data.reduce(
		(best, row) => (row.organic + row.paid > best.organic + best.paid ? row : best),
		data[0]
	);
</script>

<div class="flex h-full w-full flex-col p-4">
	<div class="flex items-start justify-between gap-4">
		<div class="flex flex-col gap-1">
			<span class="text-xs text-muted-foreground">Best week</span>
			<div class="flex items-baseline gap-2">
				<span class="text-2xl font-semibold tracking-tight text-primary sm:text-3xl"
					>{peak.organic + peak.paid}</span
				><span class="text-sm text-muted-foreground">signups in {peak.week}</span>
			</div>
		</div>
		<div class="flex shrink-0 flex-col items-end gap-1.5 pt-1">
			<span class="flex items-center gap-2 text-[11px] text-muted-foreground sm:text-xs"
				><span class="size-2.5 rounded-[3px] bg-[#7c3aed] dark:bg-[#a78bfa]"></span>Organic</span
			><span class="flex items-center gap-2 text-[11px] text-muted-foreground sm:text-xs"
				><span class="size-2.5 rounded-[3px] bg-[#0891b2] dark:bg-[#22d3ee]"></span>Paid</span
			>
		</div>
	</div>
	<div class="mt-3 min-h-0 w-full flex-1">
		<EChartsBarChart
			{data}
			{config}
			xDataKey="week"
			stackType="stacked"
			enableMaxValueHighlight
			class="h-full w-full"
		>
			<EChartsBarChart.XAxis dataKey="week" hideDots /><EChartsBarChart.Tooltip />
			<EChartsBarChart.Bar dataKey="paid" radius={6} /><EChartsBarChart.Bar
				dataKey="organic"
				radius={6}
			/>
		</EChartsBarChart>
	</div>
</div>
```
### npm

```bash
npx shadcn-svelte@latest add @evilcharts/peak-echarts-bar-chart
```

### yarn

```bash
yarn dlx shadcn-svelte@latest add @evilcharts/peak-echarts-bar-chart
```

### bun

```bash
bunx --bun shadcn-svelte@latest add @evilcharts/peak-echarts-bar-chart
```

### pnpm

```bash
pnpm dlx shadcn-svelte@latest add @evilcharts/peak-echarts-bar-chart
```

## Grid Bar Chart

### Grid Bar Chart

```svelte
<script lang="ts">
	import {
		EChartsBarChart,
		type ChartConfig
	} from '$lib/components/evilcharts/charts/echarts-bar-chart/index.js';

	const chartData = [
		{ month: 'January', desktop: 186 },
		{ month: 'February', desktop: 305 },
		{ month: 'March', desktop: 237 },
		{ month: 'April', desktop: 273 },
		{ month: 'May', desktop: 209 },
		{ month: 'June', desktop: 346 },
		{ month: 'July', desktop: 181 },
		{ month: 'August', desktop: 392 },
		{ month: 'September', desktop: 298 },
		{ month: 'October', desktop: 215 },
		{ month: 'November', desktop: 327 },
		{ month: 'December', desktop: 162 }
	];

	const chartConfig = {
		desktop: {
			label: 'Desktop',
			colors: {
				light: ['#18181b'],
				dark: ['#fafafa']
			}
		}
	} satisfies ChartConfig;

	const total = chartData.reduce((sum, item) => sum + item.desktop, 0);
	const maxData = chartData.reduce(
		(max, item, index) =>
			item.desktop > max.value ? { index, month: item.month, value: item.desktop } : max,
		{ index: 0, month: chartData[0].month, value: chartData[0].desktop }
	);
</script>

<div class="flex h-full w-full flex-col p-4">
	<div class="flex flex-row justify-between">
		<div class="flex flex-row">
			<div class="flex flex-col gap-2">
				<span class="font-mono text-xs text-muted-foreground">[Σ] Total</span>
				<span class="font-mono text-3xl tracking-tighter text-primary">
					{total.toLocaleString()}
				</span>
			</div>
			<hr class="mx-4 h-full border-l border-dashed" />
			<div class="flex flex-col gap-2">
				<span class="font-mono text-xs text-muted-foreground">[⬆] Peak</span>
				<span class="font-mono text-3xl tracking-tighter text-primary">
					{maxData.month.slice(0, 3)}
				</span>
			</div>
		</div>
		<div class="flex flex-col justify-end gap-1">
			<span class="font-mono text-[10px] text-muted-foreground">
				// CELL: <span class="text-primary">10x10px</span>
			</span>
			<span class="font-mono text-[10px] text-muted-foreground">
				// TYPE: <span class="text-primary">GRID</span>
			</span>
		</div>
	</div>
	<hr class="my-4 border-t border-dashed" />
	<div class="min-h-0 w-full flex-1">
		<EChartsBarChart
			data={chartData}
			config={chartConfig}
			xDataKey="month"
			barCategoryGap={14}
			class="h-full w-full"
		>
			<EChartsBarChart.XAxis
				dataKey="month"
				tickFormatter={(value) => String(value).slice(0, 3)}
				hideDots
			/>
			<EChartsBarChart.Tooltip />
			<EChartsBarChart.Bar dataKey="desktop" variant="blocks" />
		</EChartsBarChart>
	</div>
</div>
```
### npm

```bash
npx shadcn-svelte@latest add @evilcharts/grid-echarts-bar-chart
```

### yarn

```bash
yarn dlx shadcn-svelte@latest add @evilcharts/grid-echarts-bar-chart
```

### bun

```bash
bunx --bun shadcn-svelte@latest add @evilcharts/grid-echarts-bar-chart
```

### pnpm

```bash
pnpm dlx shadcn-svelte@latest add @evilcharts/grid-echarts-bar-chart
```

## Monospace Bar Chart

### Monospace Bar Chart

```svelte
<script lang="ts">
	import {
		EChartsBarChart,
		type ChartConfig
	} from '$lib/components/evilcharts/charts/echarts-bar-chart/index.js';

	const chartData = [
		{ month: 'January', desktop: 342 },
		{ month: 'February', desktop: 876 },
		{ month: 'March', desktop: 512 },
		{ month: 'April', desktop: 629 },
		{ month: 'May', desktop: 458 },
		{ month: 'June', desktop: 781 },
		{ month: 'July', desktop: 394 },
		{ month: 'August', desktop: 925 },
		{ month: 'September', desktop: 647 },
		{ month: 'October', desktop: 532 },
		{ month: 'November', desktop: 803 },
		{ month: 'December', desktop: 271 },
		{ month: 'January', desktop: 342 },
		{ month: 'February', desktop: 876 },
		{ month: 'March', desktop: 512 },
		{ month: 'April', desktop: 629 },
		{ month: 'May', desktop: 458 },
		{ month: 'June', desktop: 781 },
		{ month: 'July', desktop: 394 },
		{ month: 'August', desktop: 925 },
		{ month: 'September', desktop: 647 },
		{ month: 'October', desktop: 532 },
		{ month: 'November', desktop: 803 },
		{ month: 'December', desktop: 271 }
	];

	const chartConfig = {
		desktop: {
			label: 'Desktop',
			colors: {
				light: ['#18181b'],
				dark: ['#fafafa']
			}
		}
	} satisfies ChartConfig;
</script>

<div class="flex h-full w-full flex-col p-4">
	<div class="flex flex-row justify-between">
		<div class="flex flex-row">
			<div class="flex flex-col gap-2">
				<span class="font-mono text-xs text-muted-foreground">[$] Total Sales</span>
				<span class="font-mono text-3xl text-primary">
					<span class="text-xl font-normal text-muted-foreground">$</span>
					<span class="tracking-tighter">14,340</span>
				</span>
			</div>
			<hr class="mx-4 h-full border-l border-dashed" />
			<div class="flex flex-col gap-2">
				<span class="font-mono text-xs text-muted-foreground">[⬆] Top Month</span>
				<span class="font-mono text-3xl text-primary">
					<span class="tracking-tighter">June</span>
				</span>
			</div>
		</div>
		<div class="flex flex-col justify-end gap-1">
			<span class="font-mono text-[10px] text-muted-foreground">
				// X-AXIS: <span class="text-primary">MONTHS</span>
			</span>
			<span class="font-mono text-[10px] text-muted-foreground">
				// Y-AXIS: <span class="text-primary">SALES</span>
			</span>
		</div>
	</div>
	<hr class="my-4 border-t border-dashed" />
	<div class="min-h-0 w-full flex-1">
		<EChartsBarChart data={chartData} config={chartConfig} xDataKey="month" class="h-full w-full">
			<EChartsBarChart.XAxis
				dataKey="month"
				tickFormatter={(value) => String(value).slice(0, 3)}
				hideDots
			/>
			<EChartsBarChart.Bar dataKey="desktop" variant="expandable" />
		</EChartsBarChart>
	</div>
</div>
```
### npm

```bash
npx shadcn-svelte@latest add @evilcharts/monospace-echarts-bar-chart
```

### yarn

```bash
yarn dlx shadcn-svelte@latest add @evilcharts/monospace-echarts-bar-chart
```

### bun

```bash
bunx --bun shadcn-svelte@latest add @evilcharts/monospace-echarts-bar-chart
```

### pnpm

```bash
pnpm dlx shadcn-svelte@latest add @evilcharts/monospace-echarts-bar-chart
```

## Hover Trace Bar Chart

### Hover Trace Bar Chart

```svelte
<script lang="ts">
	import NumberFlow from '@number-flow/svelte';
	import {
		EChartsBarChart,
		type BarHoverDatum,
		type ChartConfig
	} from '$lib/components/evilcharts/charts/echarts-bar-chart/index.js';

	const chartData = [
		{ month: 'January', desktop: 342 },
		{ month: 'February', desktop: 676 },
		{ month: 'March', desktop: 512 },
		{ month: 'April', desktop: 629 },
		{ month: 'May', desktop: 458 },
		{ month: 'June', desktop: 781 },
		{ month: 'July', desktop: 394 },
		{ month: 'August', desktop: 924 },
		{ month: 'September', desktop: 647 },
		{ month: 'October', desktop: 532 },
		{ month: 'November', desktop: 803 },
		{ month: 'December', desktop: 271 },
		{ month: 'January', desktop: 342 },
		{ month: 'February', desktop: 876 },
		{ month: 'March', desktop: 512 },
		{ month: 'April', desktop: 629 }
	];

	const chartConfig = {
		desktop: {
			label: 'Desktop',
			colors: { light: ['#18181b'], dark: ['#fafafa'] }
		}
	} satisfies ChartConfig;

	const maxData = chartData.reduce(
		(max, item, index) =>
			item.desktop > max.value ? { index, month: item.month, value: item.desktop } : max,
		{ index: 0, month: chartData[0].month, value: chartData[0].desktop }
	);
	let hovered = $state<BarHoverDatum | null>(null);
	const selectedData = $derived.by(() => {
		const hover = hovered;
		const row = hover?.row;
		return row && typeof row.desktop === 'number'
			? { index: hover.index, month: String(row.month), value: row.desktop }
			: maxData;
	});
</script>

<div class="flex h-full flex-col p-4">
	<div class="mb-4 flex items-end justify-between">
		<div class="space-y-1">
			<p class="font-mono text-xs text-muted-foreground">[desktop] Value</p>
			<p class="font-mono text-3xl tracking-tighter text-primary">
				<NumberFlow
					value={selectedData.value}
					format={{ style: 'currency', currency: 'USD', currencyDisplay: 'narrowSymbol' }}
				/>
			</p>
		</div>

		<div class="space-y-1 text-right">
			<p class="font-mono text-[10px] text-muted-foreground">[month]</p>
			<p class="font-mono text-xs text-primary">{selectedData.month}</p>
		</div>
	</div>

	<div class="min-h-0 w-full flex-1">
		<EChartsBarChart
			data={chartData}
			config={chartConfig}
			xDataKey="month"
			class="h-full w-full"
			enableMaxValueHighlight
			referenceLine={selectedData.value}
			referenceLineFormatter={(value) => `$${value}`}
			onDataHover={(datum) => (hovered = datum)}
		>
			<EChartsBarChart.XAxis dataKey="month" tickFormatter={(value) => String(value).slice(0, 3)} />
			<EChartsBarChart.Tooltip />
			<EChartsBarChart.Bar dataKey="desktop" radius={4} enableHoverHighlight />
		</EChartsBarChart>
	</div>
</div>
```
### npm

```bash
npx shadcn-svelte@latest add @evilcharts/hover-trace-echarts-bar-chart
```

### yarn

```bash
yarn dlx shadcn-svelte@latest add @evilcharts/hover-trace-echarts-bar-chart
```

### bun

```bash
bunx --bun shadcn-svelte@latest add @evilcharts/hover-trace-echarts-bar-chart
```

### pnpm

```bash
pnpm dlx shadcn-svelte@latest add @evilcharts/hover-trace-echarts-bar-chart
```

## Isometric Bar Chart

### Isometric Bar Chart

```svelte
<script lang="ts">
	import {
		EChartsBarChart,
		type ChartConfig
	} from '$lib/components/evilcharts/charts/echarts-bar-chart/index.js';

	const chartData = [
		{ month: 'January', revenue: 28 },
		{ month: 'February', revenue: 34 },
		{ month: 'March', revenue: 22 },
		{ month: 'April', revenue: 41 },
		{ month: 'May', revenue: 47 },
		{ month: 'June', revenue: 31 },
		{ month: 'July', revenue: 38 }
	];

	const chartConfig = {
		revenue: {
			label: 'Revenue',
			colors: { light: ['#18181b'], dark: ['#fafafa'] }
		}
	} satisfies ChartConfig;

	const maxValue = chartData.reduce((maximum, row) => Math.max(maximum, row.revenue), 0);
	const total = chartData.reduce((sum, row) => sum + row.revenue, 0);
	const peak = chartData.find((row) => row.revenue === maxValue)!;
</script>

<div class="flex h-full w-full flex-col p-4">
	<div class="flex flex-row justify-between">
		<div class="flex flex-row">
			<div class="flex flex-col gap-2">
				<span class="font-mono text-xs text-muted-foreground">[$] Total</span>
				<span class="font-mono text-3xl text-primary">
					<span class="text-xl font-normal text-muted-foreground">$</span>
					<span class="tracking-tighter">{total}K</span>
				</span>
			</div>
			<hr class="mx-4 h-full border-l border-dashed" />
			<div class="flex flex-col gap-2">
				<span class="font-mono text-xs text-muted-foreground">[⬆] Peak</span>
				<span class="font-mono text-3xl tracking-tighter text-primary">
					{peak.month.slice(0, 3)}
				</span>
			</div>
		</div>
		<div class="flex flex-col justify-end gap-1">
			<span class="font-mono text-[10px] text-muted-foreground">
				// PROJECTION: <span class="text-primary">ISOMETRIC</span>
			</span>
			<span class="font-mono text-[10px] text-muted-foreground">
				// HIGHLIGHT: <span class="text-primary">MAX</span>
			</span>
		</div>
	</div>
	<hr class="my-4 border-t border-dashed" />
	<div class="min-h-0 w-full flex-1">
		<EChartsBarChart
			data={chartData}
			config={chartConfig}
			xDataKey="month"
			class="h-full w-full"
			barCategoryGap={25}
			enableMaxValueHighlight
		>
			<EChartsBarChart.XAxis dataKey="month" tickFormatter={(value) => String(value).slice(0, 3)} />
			<EChartsBarChart.Tooltip />
			<EChartsBarChart.Bar dataKey="revenue" variant="isometric" enableHoverHighlight />
		</EChartsBarChart>
	</div>
</div>
```
### npm

```bash
npx shadcn-svelte@latest add @evilcharts/isometric-echarts-bar-chart
```

### yarn

```bash
yarn dlx shadcn-svelte@latest add @evilcharts/isometric-echarts-bar-chart
```

### bun

```bash
bunx --bun shadcn-svelte@latest add @evilcharts/isometric-echarts-bar-chart
```

### pnpm

```bash
pnpm dlx shadcn-svelte@latest add @evilcharts/isometric-echarts-bar-chart
```
