@heyramzi/ui 6.0.1 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COMPONENTS.md +7 -26
- package/README.md +12 -5
- package/package.json +14 -16
- package/scripts/sync-shadcn.mjs +12 -3
- package/src/agents/agent-avatar.svelte +639 -0
- package/src/agents/agent-cast.svelte +173 -0
- package/src/agents/demo.svelte +78 -0
- package/src/agents/index.ts +11 -0
- package/src/agents/types.ts +72 -0
- package/{LICENSE → src/agents/vendor/LICENSE} +1 -1
- package/src/agents/vendor/color.ts +155 -0
- package/src/agents/vendor/draw.ts +840 -0
- package/src/agents/vendor/engine.ts +845 -0
- package/src/agents/vendor/mesh.ts +838 -0
- package/src/agents/vendor/plastic.ts +4958 -0
- package/src/agents/vendor/presets.ts +103 -0
- package/src/agents/vendor/shapes.ts +41 -0
- package/src/agents/vendor/ticker.ts +67 -0
- package/src/agents/vendor/types.ts +261 -0
- package/src/agents/vendor/wear.ts +1699 -0
- package/src/ai/index.ts +0 -18
- package/src/animations/README.md +3 -3
- package/src/lib/sliding-pill.ts +68 -0
- package/src/lib/theme-transition.ts +4 -2
- package/src/shadcn/code-block/code-block-actions.svelte +23 -0
- package/src/shadcn/code-block/code-block-content.svelte +55 -0
- package/src/shadcn/code-block/code-block-copy-button.svelte +59 -0
- package/src/shadcn/code-block/code-block-footer.svelte +20 -0
- package/src/shadcn/code-block/code-block-header.svelte +23 -0
- package/src/shadcn/code-block/code-block-line.svelte +71 -0
- package/src/shadcn/code-block/code-block-title.svelte +23 -0
- package/src/shadcn/code-block/code-block.svelte +47 -0
- package/src/shadcn/code-block/index.ts +42 -0
- package/src/shadcn/hooks/highlighter.ts +132 -0
- package/src/shadcn/hooks/use-highlighted-code.svelte.ts +98 -0
- package/src/shadcn/kbd/index.ts +10 -0
- package/src/shadcn/kbd/kbd-group.svelte +20 -0
- package/src/shadcn/kbd/kbd.svelte +23 -0
- package/src/shadcn/message-scroller/index.ts +28 -0
- package/src/shadcn/message-scroller/message-scroller-button.svelte +52 -0
- package/src/shadcn/message-scroller/message-scroller-content.svelte +17 -0
- package/src/shadcn/message-scroller/message-scroller-item.svelte +22 -0
- package/src/shadcn/message-scroller/message-scroller-provider.svelte +7 -0
- package/src/shadcn/message-scroller/message-scroller-viewport.svelte +20 -0
- package/src/shadcn/message-scroller/message-scroller.svelte +20 -0
- package/src/shadcn/tabs/tabs-list.svelte +13 -2
- package/src/shadcn/tabs/tabs-trigger.svelte +1 -1
- package/src/shadcn/trace/index.ts +29 -0
- package/src/shadcn/trace/trace-collapsible-content.svelte +29 -0
- package/src/shadcn/trace/trace-collapsible-trigger.svelte +29 -0
- package/src/shadcn/trace/trace-collapsible.svelte +20 -0
- package/src/shadcn/trace/trace-description.svelte +20 -0
- package/src/shadcn/trace/trace-icon.svelte +24 -0
- package/src/shadcn/trace/trace-line.svelte +31 -0
- package/src/shadcn/trace/trace-title.svelte +20 -0
- package/src/shadcn/trace/trace.svelte +23 -0
- package/src/showcase/AiSection.svelte +0 -7
- package/src/showcase/demos/shadcn/code-block.svelte +80 -0
- package/src/showcase/demos/shadcn/index.ts +24 -0
- package/src/showcase/demos/shadcn/message-scroller.svelte +44 -0
- package/src/showcase/demos/shadcn/trace.svelte +51 -0
- package/src/showcase/kit.ts +1 -2
- package/src/ai/conversation/Conversation.svelte +0 -28
- package/src/ai/conversation/ConversationContent.svelte +0 -35
- package/src/ai/conversation/ConversationEmptyState.svelte +0 -46
- package/src/ai/conversation/ConversationScrollButton.svelte +0 -51
- package/src/ai/conversation/index.ts +0 -33
- package/src/ai/conversation/stick-to-bottom-context.svelte.ts +0 -131
- package/src/charts/animated-value.css +0 -7
- package/src/charts/animated-value.svelte +0 -110
- package/src/charts/area-chart.css +0 -29
- package/src/charts/area-chart.svelte +0 -195
- package/src/charts/bar-chart.css +0 -119
- package/src/charts/bar-chart.svelte +0 -269
- package/src/charts/charts.css +0 -201
- package/src/charts/crosshair.svelte +0 -35
- package/src/charts/donut-chart.css +0 -56
- package/src/charts/donut-chart.svelte +0 -158
- package/src/charts/edge-fade.svelte +0 -43
- package/src/charts/edge-fade.ts +0 -16
- package/src/charts/figure.css +0 -100
- package/src/charts/figure.svelte +0 -122
- package/src/charts/gauge-chart.css +0 -94
- package/src/charts/gauge-chart.svelte +0 -303
- package/src/charts/hover-band.test.ts +0 -30
- package/src/charts/hover-band.ts +0 -21
- package/src/charts/hover-focus.svelte +0 -85
- package/src/charts/index.ts +0 -30
- package/src/charts/legend.css +0 -131
- package/src/charts/legend.svelte +0 -112
- package/src/charts/line-chart.css +0 -26
- package/src/charts/line-chart.svelte +0 -256
- package/src/charts/motion.ts +0 -19
- package/src/charts/number-chart.css +0 -168
- package/src/charts/number-chart.svelte +0 -177
- package/src/charts/primitives/chart-container.svelte +0 -57
- package/src/charts/primitives/chart-style.svelte +0 -36
- package/src/charts/primitives/chart-tooltip.svelte +0 -161
- package/src/charts/primitives/chart-utils.ts +0 -54
- package/src/charts/primitives/index.ts +0 -11
- package/src/charts/reveal.svelte +0 -61
- package/src/charts/ring-chart.css +0 -96
- package/src/charts/ring-chart.svelte +0 -158
- package/src/charts/sparkline.css +0 -45
- package/src/charts/sparkline.svelte +0 -140
- package/src/charts/stat-card.css +0 -103
- package/src/charts/stat-card.svelte +0 -267
- package/src/charts/time-series-chart.css +0 -28
- package/src/charts/time-series-chart.svelte +0 -179
- package/src/charts/trend-pill.css +0 -38
- package/src/charts/trend-pill.svelte +0 -48
- package/src/lib/hooks/is-mobile.svelte.ts +0 -11
- package/src/showcase/ChartsSection.svelte +0 -458
- package/src/showcase/demos/ai/conversation.svelte +0 -59
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
// =========================
|
|
3
|
-
// IMPORTS
|
|
4
|
-
// =========================
|
|
5
|
-
import "./animated-value.css";
|
|
6
|
-
import { untrack } from "svelte";
|
|
7
|
-
import { cn } from "@heyramzi/utils";
|
|
8
|
-
|
|
9
|
-
// =========================
|
|
10
|
-
// TYPES
|
|
11
|
-
// =========================
|
|
12
|
-
type Props = {
|
|
13
|
-
/** Target number. The display counts up to it on mount and tweens on change. */
|
|
14
|
-
value: number;
|
|
15
|
-
/** Fixed decimal places when no `formatOptions` is given. */
|
|
16
|
-
decimals?: number;
|
|
17
|
-
/** Count-up duration in ms. */
|
|
18
|
-
duration?: number;
|
|
19
|
-
/** Custom formatter for the live number. Wins over `formatOptions`/`decimals`. */
|
|
20
|
-
format?: (value: number) => string;
|
|
21
|
-
/** Intl number formatting (currency, compact, percent, ...). Wins over `decimals`. */
|
|
22
|
-
formatOptions?: Intl.NumberFormatOptions;
|
|
23
|
-
/** BCP-47 locale for `formatOptions`. */
|
|
24
|
-
locale?: string;
|
|
25
|
-
/** Rendered before the number. */
|
|
26
|
-
prefix?: string;
|
|
27
|
-
/** Rendered after the number. */
|
|
28
|
-
suffix?: string;
|
|
29
|
-
class?: string;
|
|
30
|
-
style?: string;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
// =========================
|
|
34
|
-
// PROPS
|
|
35
|
-
// =========================
|
|
36
|
-
let {
|
|
37
|
-
value,
|
|
38
|
-
decimals = 0,
|
|
39
|
-
duration = 800,
|
|
40
|
-
format,
|
|
41
|
-
formatOptions,
|
|
42
|
-
locale,
|
|
43
|
-
prefix,
|
|
44
|
-
suffix,
|
|
45
|
-
class: className,
|
|
46
|
-
style,
|
|
47
|
-
}: Props = $props();
|
|
48
|
-
|
|
49
|
-
// =========================
|
|
50
|
-
// STATE
|
|
51
|
-
// =========================
|
|
52
|
-
let displayed = $state(0);
|
|
53
|
-
let started = $state(false);
|
|
54
|
-
|
|
55
|
-
// =========================
|
|
56
|
-
// DERIVED
|
|
57
|
-
// =========================
|
|
58
|
-
const formatter = $derived(formatOptions ? new Intl.NumberFormat(locale, formatOptions) : null);
|
|
59
|
-
const currentValue = $derived(started ? displayed : value);
|
|
60
|
-
const text = $derived(
|
|
61
|
-
format
|
|
62
|
-
? format(currentValue)
|
|
63
|
-
: formatter
|
|
64
|
-
? formatter.format(currentValue)
|
|
65
|
-
: currentValue.toFixed(decimals),
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
// ========================= EFFECTS ========================= WHY: $effect only runs in the browser, so SSR renders the final value (no flash).
|
|
69
|
-
|
|
70
|
-
// `value` is the sole tracked dependency; `displayed` is read and written inside untrack() so the per-frame writes don't retrigger the effect (that self-dependency loops and Svelte bails, freezing the number).
|
|
71
|
-
|
|
72
|
-
// The first run sweeps from 0; later value changes tween from the current display.
|
|
73
|
-
$effect(() => {
|
|
74
|
-
const target = value;
|
|
75
|
-
let raf = 0;
|
|
76
|
-
untrack(() => {
|
|
77
|
-
const reduced =
|
|
78
|
-
typeof window !== "undefined" &&
|
|
79
|
-
window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
80
|
-
|
|
81
|
-
const from = started ? displayed : 0;
|
|
82
|
-
started = true;
|
|
83
|
-
|
|
84
|
-
// WHY: snap (no tween) when motion is off, the delta is tiny, or the tab
|
|
85
|
-
|
|
86
|
-
// is hidden. rAF is paused in background tabs, so animating there would leave the number stale until the tab is shown; snapping keeps it correct.
|
|
87
|
-
if (reduced || document.hidden || Math.abs(target - from) < 0.005) {
|
|
88
|
-
displayed = target;
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const start = performance.now();
|
|
93
|
-
const tick = (now: number) => {
|
|
94
|
-
const t = Math.min((now - start) / duration, 1);
|
|
95
|
-
const eased = 1 - (1 - t) ** 3;
|
|
96
|
-
displayed = from + (target - from) * eased;
|
|
97
|
-
if (t < 1) raf = requestAnimationFrame(tick);
|
|
98
|
-
};
|
|
99
|
-
raf = requestAnimationFrame(tick);
|
|
100
|
-
});
|
|
101
|
-
return () => cancelAnimationFrame(raf);
|
|
102
|
-
});
|
|
103
|
-
</script>
|
|
104
|
-
|
|
105
|
-
<!-- =========================== -->
|
|
106
|
-
<!-- MARKUP -->
|
|
107
|
-
<!-- =========================== -->
|
|
108
|
-
<span class={cn("hr-animated-value tabular-nums", className)} {style}
|
|
109
|
-
>{prefix ?? ""}{text}{suffix ?? ""}</span
|
|
110
|
-
>
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/* Styles for AreaChart. Shipped as a plain stylesheet (imported by the
|
|
2
|
-
component) instead of a Svelte `<style>` block: a `<style>` block becomes a
|
|
3
|
-
`?type=style&lang.css` virtual module that Tailwind v4's Vite plugin mis-parses
|
|
4
|
-
when this package is consumed as source from node_modules (tailwindlabs/
|
|
5
|
-
tailwindcss#20000). Selectors are namespaced under `.hr-area-chart`. */
|
|
6
|
-
|
|
7
|
-
.hr-area-chart {
|
|
8
|
-
width: 100%;
|
|
9
|
-
display: flex;
|
|
10
|
-
flex-direction: column;
|
|
11
|
-
gap: 0.5rem;
|
|
12
|
-
}
|
|
13
|
-
.hr-area-chart .hr-chart-body {
|
|
14
|
-
width: 100%;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
.hr-area-chart .empty {
|
|
18
|
-
display: flex;
|
|
19
|
-
align-items: center;
|
|
20
|
-
justify-content: center;
|
|
21
|
-
height: 100%;
|
|
22
|
-
border: 1px dashed var(--chart-grid, oklch(0.5 0.01 286 / 0.2));
|
|
23
|
-
border-radius: 0.5rem;
|
|
24
|
-
}
|
|
25
|
-
.hr-area-chart .empty p {
|
|
26
|
-
font-size: 0.8125rem;
|
|
27
|
-
color: var(--chart-label, oklch(0.5 0.01 286));
|
|
28
|
-
margin: 0;
|
|
29
|
-
}
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
<script lang="ts" generics="TData extends Record<string, unknown>">
|
|
2
|
-
// =========================
|
|
3
|
-
// IMPORTS
|
|
4
|
-
// =========================
|
|
5
|
-
import "./area-chart.css";
|
|
6
|
-
import { Area, Axis, Chart, Highlight, LinearGradient, Spline, Svg, Tooltip } from "layerchart";
|
|
7
|
-
import { curveMonotoneX } from "d3-shape";
|
|
8
|
-
import Crosshair from "./crosshair.svelte";
|
|
9
|
-
import EdgeFade from "./edge-fade.svelte";
|
|
10
|
-
import { resolveEdgeFade } from "./edge-fade.js";
|
|
11
|
-
import Figure from "./figure.svelte";
|
|
12
|
-
import HoverFocus from "./hover-focus.svelte";
|
|
13
|
-
import { DOMAIN_MOTION, TOOLTIP_GAP, TOOLTIP_TOP } from "./motion.js";
|
|
14
|
-
import Reveal from "./reveal.svelte";
|
|
15
|
-
|
|
16
|
-
// =========================
|
|
17
|
-
// TYPES
|
|
18
|
-
// =========================
|
|
19
|
-
type Series = {
|
|
20
|
-
key: keyof TData & string;
|
|
21
|
-
label?: string;
|
|
22
|
-
color?: string;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
type Props = {
|
|
26
|
-
data: TData[];
|
|
27
|
-
xKey: keyof TData & string;
|
|
28
|
-
yKey?: keyof TData & string;
|
|
29
|
-
series?: Series[];
|
|
30
|
-
color?: string;
|
|
31
|
-
height?: number;
|
|
32
|
-
stacked?: boolean;
|
|
33
|
-
smooth?: boolean;
|
|
34
|
-
/**
|
|
35
|
-
* Softens the left and right ends of the filled area instead of cutting them off at the plot edge.
|
|
36
|
-
*/
|
|
37
|
-
|
|
38
|
-
/*
|
|
39
|
-
* `true` fades 8% of the width per side, a number sets the fraction (0-0.45), `false` keeps the hard edges.
|
|
40
|
-
*/
|
|
41
|
-
edgeFade?: boolean | number;
|
|
42
|
-
formatValue?: (v: number) => string;
|
|
43
|
-
formatX?: (v: unknown) => string;
|
|
44
|
-
xTicks?: number;
|
|
45
|
-
class?: string;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
// =========================
|
|
49
|
-
// PROPS
|
|
50
|
-
// =========================
|
|
51
|
-
let {
|
|
52
|
-
data,
|
|
53
|
-
xKey,
|
|
54
|
-
yKey,
|
|
55
|
-
series: seriesInput,
|
|
56
|
-
color = "var(--chart-1)",
|
|
57
|
-
height = 240,
|
|
58
|
-
stacked = false,
|
|
59
|
-
smooth = true,
|
|
60
|
-
edgeFade = true,
|
|
61
|
-
formatValue = (v) => v.toLocaleString(),
|
|
62
|
-
formatX = (v) => String(v),
|
|
63
|
-
xTicks = 6,
|
|
64
|
-
class: className,
|
|
65
|
-
}: Props = $props();
|
|
66
|
-
|
|
67
|
-
// =========================
|
|
68
|
-
// STATE
|
|
69
|
-
// =========================
|
|
70
|
-
let active = $state<TData | null>(null);
|
|
71
|
-
|
|
72
|
-
// ========================= FUNCTIONS ========================= WHY: called from the tooltip header's value expression so it re-runs on every active-point change; an unread {@const} side effect only evaluates once.
|
|
73
|
-
|
|
74
|
-
// The microtask defers the state write out of template evaluation.
|
|
75
|
-
function trackActive(d: TData): string {
|
|
76
|
-
queueMicrotask(() => {
|
|
77
|
-
active = d;
|
|
78
|
-
});
|
|
79
|
-
return formatX(d[xKey]);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// =========================
|
|
83
|
-
// DERIVED
|
|
84
|
-
// =========================
|
|
85
|
-
const uid = `hr-area-${Math.random().toString(36).slice(2, 8)}`;
|
|
86
|
-
const series = $derived(
|
|
87
|
-
seriesInput && seriesInput.length > 0
|
|
88
|
-
? seriesInput.map((s, i) => ({
|
|
89
|
-
key: s.key,
|
|
90
|
-
label: s.label ?? s.key,
|
|
91
|
-
color: s.color ?? `var(--chart-${(i % 5) + 1})`,
|
|
92
|
-
}))
|
|
93
|
-
: yKey
|
|
94
|
-
? [{ key: yKey, label: yKey, color }]
|
|
95
|
-
: [],
|
|
96
|
-
);
|
|
97
|
-
const yMax = $derived.by(() => {
|
|
98
|
-
if (stacked) {
|
|
99
|
-
return Math.max(0, ...data.map((d) => series.reduce((s, k) => s + Number(d[k.key] ?? 0), 0)));
|
|
100
|
-
}
|
|
101
|
-
return Math.max(0, ...data.flatMap((d) => series.map((s) => Number(d[s.key] ?? 0))));
|
|
102
|
-
});
|
|
103
|
-
const curve = $derived(smooth ? curveMonotoneX : undefined);
|
|
104
|
-
const fade = $derived(resolveEdgeFade(edgeFade));
|
|
105
|
-
const fadeMask = $derived(fade > 0 ? `url(#${uid}-fade)` : undefined);
|
|
106
|
-
const fallback = $derived(data.length > 0 ? data[data.length - 1] : null);
|
|
107
|
-
const display = $derived(active ?? fallback);
|
|
108
|
-
const figureRows = $derived(
|
|
109
|
-
display
|
|
110
|
-
? series.map((s) => ({ value: Number(display[s.key]), label: s.label, color: s.color }))
|
|
111
|
-
: null,
|
|
112
|
-
);
|
|
113
|
-
</script>
|
|
114
|
-
|
|
115
|
-
<!-- =========================== -->
|
|
116
|
-
<!-- AREA CHART -->
|
|
117
|
-
<!-- =========================== -->
|
|
118
|
-
<div
|
|
119
|
-
class="hr-area-chart {className ?? ''}"
|
|
120
|
-
role="img"
|
|
121
|
-
aria-label="Area chart"
|
|
122
|
-
onpointerleave={() => (active = null)}
|
|
123
|
-
>
|
|
124
|
-
{#if figureRows && display}
|
|
125
|
-
<Figure series={figureRows} eyebrow={formatX(display[xKey])} format={formatValue} size="md" />
|
|
126
|
-
{:else}
|
|
127
|
-
<Figure value="—" eyebrow="Latest" size="md" />
|
|
128
|
-
{/if}
|
|
129
|
-
|
|
130
|
-
<div class="hr-chart-body" style:height="{height}px">
|
|
131
|
-
{#if data.length === 0}
|
|
132
|
-
<div class="empty"><p>No data</p></div>
|
|
133
|
-
{:else}
|
|
134
|
-
<Chart
|
|
135
|
-
{data}
|
|
136
|
-
x={xKey}
|
|
137
|
-
y={series[0]?.key}
|
|
138
|
-
yDomain={[0, yMax || 1]}
|
|
139
|
-
yNice
|
|
140
|
-
padding={{ left: 48, bottom: 28, top: 8, right: 12 }}
|
|
141
|
-
tooltipContext={{ mode: "quadtree-x" }}
|
|
142
|
-
motion={DOMAIN_MOTION}
|
|
143
|
-
>
|
|
144
|
-
<Svg>
|
|
145
|
-
<Axis placement="left" format={(v) => formatValue(Number(v))} ticks={4} />
|
|
146
|
-
<Axis placement="bottom" format={(v) => formatX(v)} ticks={xTicks} />
|
|
147
|
-
<g class="hr-area-grid">
|
|
148
|
-
<Axis placement="left" grid rule={false} ticks={4} format={() => ""} />
|
|
149
|
-
</g>
|
|
150
|
-
{#if fade > 0}
|
|
151
|
-
<EdgeFade id="{uid}-fade" amount={fade} />
|
|
152
|
-
{/if}
|
|
153
|
-
<Crosshair id="{uid}-cross" />
|
|
154
|
-
<HoverFocus>
|
|
155
|
-
<Reveal>
|
|
156
|
-
{#each series as s, i (s.key)}
|
|
157
|
-
<LinearGradient id="{uid}-{i}" vertical>
|
|
158
|
-
{#snippet stopsContent()}
|
|
159
|
-
<stop offset="0%" stop-color={s.color} stop-opacity="0.45" />
|
|
160
|
-
<stop offset="100%" stop-color={s.color} stop-opacity="0.04" />
|
|
161
|
-
{/snippet}
|
|
162
|
-
</LinearGradient>
|
|
163
|
-
<!-- WHY `y1` and not `y`: layerchart's Area has no `y` prop, so every
|
|
164
|
-
series drew the first series' shape and the gradients stacked on
|
|
165
|
-
one path. See `Area.shared.svelte.js`. -->
|
|
166
|
-
<Area y1={s.key} {curve} fill="url(#{uid}-{i})" mask={fadeMask} />
|
|
167
|
-
<Spline y={s.key} {curve} style="stroke: {s.color}; fill: none" stroke-width="2" />
|
|
168
|
-
{/each}
|
|
169
|
-
</Reveal>
|
|
170
|
-
{#snippet segment()}
|
|
171
|
-
{#each series as s (s.key)}
|
|
172
|
-
<Spline y={s.key} {curve} style="stroke: {s.color}; fill: none" stroke-width="2" />
|
|
173
|
-
{/each}
|
|
174
|
-
{/snippet}
|
|
175
|
-
</HoverFocus>
|
|
176
|
-
<Highlight points lines={{ style: `stroke: url(#${uid}-cross)` }} />
|
|
177
|
-
</Svg>
|
|
178
|
-
<Tooltip.Root x="data" y={TOOLTIP_TOP} xOffset={TOOLTIP_GAP}>
|
|
179
|
-
{#snippet children({ data: d })}
|
|
180
|
-
<Tooltip.Header value={trackActive(d as TData)} />
|
|
181
|
-
<Tooltip.List>
|
|
182
|
-
{#each series as s (s.key)}
|
|
183
|
-
<Tooltip.Item
|
|
184
|
-
label={s.label}
|
|
185
|
-
value={formatValue(Number(d[s.key]))}
|
|
186
|
-
color={s.color}
|
|
187
|
-
/>
|
|
188
|
-
{/each}
|
|
189
|
-
</Tooltip.List>
|
|
190
|
-
{/snippet}
|
|
191
|
-
</Tooltip.Root>
|
|
192
|
-
</Chart>
|
|
193
|
-
{/if}
|
|
194
|
-
</div>
|
|
195
|
-
</div>
|
package/src/charts/bar-chart.css
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/* Styles for BarChart. Plain stylesheet (see area-chart.css for why). Selectors
|
|
2
|
-
are namespaced under `.hr-bar-chart`. */
|
|
3
|
-
|
|
4
|
-
/* WHY: self-contained visually-hidden styling so the data table reaches
|
|
5
|
-
screen readers without depending on the consumer's CSS framework. */
|
|
6
|
-
.hr-sr-only {
|
|
7
|
-
position: absolute;
|
|
8
|
-
width: 1px;
|
|
9
|
-
height: 1px;
|
|
10
|
-
padding: 0;
|
|
11
|
-
margin: -1px;
|
|
12
|
-
overflow: hidden;
|
|
13
|
-
clip: rect(0, 0, 0, 0);
|
|
14
|
-
white-space: nowrap;
|
|
15
|
-
border: 0;
|
|
16
|
-
}
|
|
17
|
-
.hr-bar-chart {
|
|
18
|
-
width: 100%;
|
|
19
|
-
display: flex;
|
|
20
|
-
flex-direction: column;
|
|
21
|
-
gap: 0.5rem;
|
|
22
|
-
}
|
|
23
|
-
.hr-bar-chart .hr-chart-body {
|
|
24
|
-
width: 100%;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/* WHY: height="fill" grows the chart to its parent's height (e.g. a card that
|
|
28
|
-
stretches to match a taller sibling) instead of the fixed body height. The
|
|
29
|
-
parent must be a flex column that gives this a determinate height. */
|
|
30
|
-
.hr-bar-chart.hr-bar-fill {
|
|
31
|
-
flex: 1 1 auto;
|
|
32
|
-
min-height: 0;
|
|
33
|
-
}
|
|
34
|
-
.hr-bar-chart.hr-bar-fill .hr-chart-body {
|
|
35
|
-
flex: 1 1 auto;
|
|
36
|
-
min-height: 0;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
.hr-bar-chart .empty {
|
|
40
|
-
display: flex;
|
|
41
|
-
align-items: center;
|
|
42
|
-
justify-content: center;
|
|
43
|
-
height: 100%;
|
|
44
|
-
border: 1px dashed var(--chart-grid, oklch(0.5 0.01 286 / 0.2));
|
|
45
|
-
border-radius: 0.5rem;
|
|
46
|
-
}
|
|
47
|
-
.hr-bar-chart .empty p {
|
|
48
|
-
font-size: 0.8125rem;
|
|
49
|
-
color: var(--chart-label, oklch(0.5 0.01 286));
|
|
50
|
-
margin: 0;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/* WHY: Bars render as <path> elements, not <rect>. Selectors target the path's class directly. */
|
|
54
|
-
.hr-bar-chart .hr-bar-bars {
|
|
55
|
-
transform-box: fill-box;
|
|
56
|
-
transform-origin: bottom;
|
|
57
|
-
animation: hr-bar-grow var(--chart-motion-reveal, 1100ms)
|
|
58
|
-
var(--chart-ease-reveal, cubic-bezier(0.85, 0, 0.15, 1)) both;
|
|
59
|
-
transition: opacity var(--chart-motion-fast, 150ms) ease-in-out;
|
|
60
|
-
}
|
|
61
|
-
.hr-bar-chart .hr-bar-bars:nth-of-type(2) {
|
|
62
|
-
animation-delay: var(--chart-stagger, 30ms);
|
|
63
|
-
}
|
|
64
|
-
.hr-bar-chart .hr-bar-bars:nth-of-type(3) {
|
|
65
|
-
animation-delay: calc(var(--chart-stagger, 30ms) * 2);
|
|
66
|
-
}
|
|
67
|
-
.hr-bar-chart .hr-bar-bars:nth-of-type(4) {
|
|
68
|
-
animation-delay: calc(var(--chart-stagger, 30ms) * 3);
|
|
69
|
-
}
|
|
70
|
-
.hr-bar-chart .hr-bar-bars:nth-of-type(5) {
|
|
71
|
-
animation-delay: calc(var(--chart-stagger, 30ms) * 4);
|
|
72
|
-
}
|
|
73
|
-
.hr-bar-chart .hr-bar-bars:nth-of-type(6) {
|
|
74
|
-
animation-delay: calc(var(--chart-stagger, 30ms) * 5);
|
|
75
|
-
}
|
|
76
|
-
.hr-bar-chart .hr-bar-bars:nth-of-type(7) {
|
|
77
|
-
animation-delay: calc(var(--chart-stagger, 30ms) * 6);
|
|
78
|
-
}
|
|
79
|
-
.hr-bar-chart .hr-bar-bars:nth-of-type(8) {
|
|
80
|
-
animation-delay: calc(var(--chart-stagger, 30ms) * 7);
|
|
81
|
-
}
|
|
82
|
-
.hr-bar-chart .hr-bar-bars:nth-of-type(9) {
|
|
83
|
-
animation-delay: calc(var(--chart-stagger, 30ms) * 8);
|
|
84
|
-
}
|
|
85
|
-
.hr-bar-chart .hr-bar-bars:nth-of-type(10) {
|
|
86
|
-
animation-delay: calc(var(--chart-stagger, 30ms) * 9);
|
|
87
|
-
}
|
|
88
|
-
.hr-bar-chart .hr-bar-bars:nth-of-type(11) {
|
|
89
|
-
animation-delay: calc(var(--chart-stagger, 30ms) * 10);
|
|
90
|
-
}
|
|
91
|
-
.hr-bar-chart .hr-bar-bars:nth-of-type(n + 12) {
|
|
92
|
-
animation-delay: calc(var(--chart-stagger, 30ms) * 11);
|
|
93
|
-
}
|
|
94
|
-
@keyframes hr-bar-grow {
|
|
95
|
-
from {
|
|
96
|
-
transform: scaleY(0);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
.hr-bar-horizontal .hr-bar-bars {
|
|
100
|
-
transform-origin: left;
|
|
101
|
-
animation-name: hr-bar-grow-x;
|
|
102
|
-
}
|
|
103
|
-
@keyframes hr-bar-grow-x {
|
|
104
|
-
from {
|
|
105
|
-
transform: scaleX(0);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
.hr-bar-chart.hr-bar-has-active .hr-bar-bars {
|
|
109
|
-
opacity: 0.3;
|
|
110
|
-
}
|
|
111
|
-
.hr-bar-chart .hr-bar-active {
|
|
112
|
-
pointer-events: none;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
@media (prefers-reduced-motion: reduce) {
|
|
116
|
-
.hr-bar-chart .hr-bar-bars {
|
|
117
|
-
animation: none;
|
|
118
|
-
}
|
|
119
|
-
}
|