@craftzbay/ui 0.10.0 → 0.11.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/README.md +14 -8
- package/dist-lib/__tests__/helpers/color.d.ts +9 -0
- package/dist-lib/__tests__/helpers/theme.d.ts +18 -0
- package/dist-lib/components/ui/Accordion.js +18 -7
- package/dist-lib/components/ui/Accordion.js.map +1 -1
- package/dist-lib/components/ui/Alert.d.ts +16 -0
- package/dist-lib/components/ui/Alert.js +47 -34
- package/dist-lib/components/ui/Alert.js.map +1 -1
- package/dist-lib/components/ui/Avatar.d.ts +1 -1
- package/dist-lib/components/ui/Avatar.js +45 -47
- package/dist-lib/components/ui/Avatar.js.map +1 -1
- package/dist-lib/components/ui/Badge.d.ts +3 -1
- package/dist-lib/components/ui/Badge.js +24 -15
- package/dist-lib/components/ui/Badge.js.map +1 -1
- package/dist-lib/components/ui/Breadcrumbs.d.ts +2 -0
- package/dist-lib/components/ui/Breadcrumbs.js +46 -28
- package/dist-lib/components/ui/Breadcrumbs.js.map +1 -1
- package/dist-lib/components/ui/Button.d.ts +5 -3
- package/dist-lib/components/ui/Button.js +59 -45
- package/dist-lib/components/ui/Button.js.map +1 -1
- package/dist-lib/components/ui/Calendar.d.ts +1 -1
- package/dist-lib/components/ui/Calendar.js +87 -59
- package/dist-lib/components/ui/Calendar.js.map +1 -1
- package/dist-lib/components/ui/Card.d.ts +2 -0
- package/dist-lib/components/ui/Card.js +48 -67
- package/dist-lib/components/ui/Card.js.map +1 -1
- package/dist-lib/components/ui/Carousel.d.ts +6 -6
- package/dist-lib/components/ui/Carousel.js +133 -102
- package/dist-lib/components/ui/Carousel.js.map +1 -1
- package/dist-lib/components/ui/Chart.d.ts +49 -10
- package/dist-lib/components/ui/Chart.js +415 -181
- package/dist-lib/components/ui/Chart.js.map +1 -1
- package/dist-lib/components/ui/Checkbox.js +42 -28
- package/dist-lib/components/ui/Checkbox.js.map +1 -1
- package/dist-lib/components/ui/Combobox.d.ts +2 -0
- package/dist-lib/components/ui/Combobox.js +142 -111
- package/dist-lib/components/ui/Combobox.js.map +1 -1
- package/dist-lib/components/ui/CommandPalette.d.ts +6 -3
- package/dist-lib/components/ui/CommandPalette.js +92 -87
- package/dist-lib/components/ui/CommandPalette.js.map +1 -1
- package/dist-lib/components/ui/ContextMenu.d.ts +7 -2
- package/dist-lib/components/ui/ContextMenu.js +77 -62
- package/dist-lib/components/ui/ContextMenu.js.map +1 -1
- package/dist-lib/components/ui/DataGrid.d.ts +17 -4
- package/dist-lib/components/ui/DataGrid.js +65 -50
- package/dist-lib/components/ui/DataGrid.js.map +1 -1
- package/dist-lib/components/ui/DatePicker.js +118 -99
- package/dist-lib/components/ui/DatePicker.js.map +1 -1
- package/dist-lib/components/ui/DesignSystemProvider.d.ts +94 -40
- package/dist-lib/components/ui/DesignSystemProvider.js +111 -55
- package/dist-lib/components/ui/DesignSystemProvider.js.map +1 -1
- package/dist-lib/components/ui/Dialog.d.ts +18 -3
- package/dist-lib/components/ui/Dialog.js +105 -80
- package/dist-lib/components/ui/Dialog.js.map +1 -1
- package/dist-lib/components/ui/Drawer.d.ts +17 -2
- package/dist-lib/components/ui/Drawer.js +89 -55
- package/dist-lib/components/ui/Drawer.js.map +1 -1
- package/dist-lib/components/ui/DropdownMenu.js +14 -9
- package/dist-lib/components/ui/DropdownMenu.js.map +1 -1
- package/dist-lib/components/ui/EmptyState.d.ts +2 -0
- package/dist-lib/components/ui/EmptyState.js +30 -16
- package/dist-lib/components/ui/EmptyState.js.map +1 -1
- package/dist-lib/components/ui/ErrorState.d.ts +13 -2
- package/dist-lib/components/ui/ErrorState.js +44 -23
- package/dist-lib/components/ui/ErrorState.js.map +1 -1
- package/dist-lib/components/ui/FileUpload.js +59 -56
- package/dist-lib/components/ui/FileUpload.js.map +1 -1
- package/dist-lib/components/ui/Form.d.ts +15 -2
- package/dist-lib/components/ui/Form.js +97 -71
- package/dist-lib/components/ui/Form.js.map +1 -1
- package/dist-lib/components/ui/Icon.d.ts +1 -1
- package/dist-lib/components/ui/Icon.js +20 -14
- package/dist-lib/components/ui/Icon.js.map +1 -1
- package/dist-lib/components/ui/IconButton.d.ts +2 -2
- package/dist-lib/components/ui/IconButton.js +28 -20
- package/dist-lib/components/ui/IconButton.js.map +1 -1
- package/dist-lib/components/ui/Input.d.ts +3 -1
- package/dist-lib/components/ui/Input.js +92 -78
- package/dist-lib/components/ui/Input.js.map +1 -1
- package/dist-lib/components/ui/Kbd.js +1 -1
- package/dist-lib/components/ui/Kbd.js.map +1 -1
- package/dist-lib/components/ui/MultiSelect.js +121 -107
- package/dist-lib/components/ui/MultiSelect.js.map +1 -1
- package/dist-lib/components/ui/Pagination.js +67 -62
- package/dist-lib/components/ui/Pagination.js.map +1 -1
- package/dist-lib/components/ui/Popover.js +14 -14
- package/dist-lib/components/ui/Popover.js.map +1 -1
- package/dist-lib/components/ui/Progress.d.ts +3 -3
- package/dist-lib/components/ui/Progress.js +77 -72
- package/dist-lib/components/ui/Progress.js.map +1 -1
- package/dist-lib/components/ui/RadioGroup.d.ts +1 -1
- package/dist-lib/components/ui/RadioGroup.js +69 -52
- package/dist-lib/components/ui/RadioGroup.js.map +1 -1
- package/dist-lib/components/ui/RelativeTime.d.ts +19 -0
- package/dist-lib/components/ui/RelativeTime.js +31 -0
- package/dist-lib/components/ui/RelativeTime.js.map +1 -0
- package/dist-lib/components/ui/ScrollArea.d.ts +9 -1
- package/dist-lib/components/ui/ScrollArea.js +43 -27
- package/dist-lib/components/ui/ScrollArea.js.map +1 -1
- package/dist-lib/components/ui/Select.d.ts +6 -1
- package/dist-lib/components/ui/Select.js +79 -71
- package/dist-lib/components/ui/Select.js.map +1 -1
- package/dist-lib/components/ui/Separator.js +1 -1
- package/dist-lib/components/ui/Separator.js.map +1 -1
- package/dist-lib/components/ui/Sheet.d.ts +9 -0
- package/dist-lib/components/ui/Sheet.js +69 -46
- package/dist-lib/components/ui/Sheet.js.map +1 -1
- package/dist-lib/components/ui/Sidebar.d.ts +12 -9
- package/dist-lib/components/ui/Sidebar.js +152 -109
- package/dist-lib/components/ui/Sidebar.js.map +1 -1
- package/dist-lib/components/ui/Skeleton.d.ts +13 -2
- package/dist-lib/components/ui/Skeleton.js +15 -14
- package/dist-lib/components/ui/Skeleton.js.map +1 -1
- package/dist-lib/components/ui/Slider.js +41 -29
- package/dist-lib/components/ui/Slider.js.map +1 -1
- package/dist-lib/components/ui/Snackbar.js +23 -22
- package/dist-lib/components/ui/Snackbar.js.map +1 -1
- package/dist-lib/components/ui/Spinner.js +18 -6
- package/dist-lib/components/ui/Spinner.js.map +1 -1
- package/dist-lib/components/ui/Stepper.d.ts +6 -0
- package/dist-lib/components/ui/Stepper.js +71 -48
- package/dist-lib/components/ui/Stepper.js.map +1 -1
- package/dist-lib/components/ui/Switch.js +46 -43
- package/dist-lib/components/ui/Switch.js.map +1 -1
- package/dist-lib/components/ui/Table.d.ts +33 -5
- package/dist-lib/components/ui/Table.js +141 -119
- package/dist-lib/components/ui/Table.js.map +1 -1
- package/dist-lib/components/ui/Tabs.js +50 -48
- package/dist-lib/components/ui/Tabs.js.map +1 -1
- package/dist-lib/components/ui/TagInput.js +45 -45
- package/dist-lib/components/ui/TagInput.js.map +1 -1
- package/dist-lib/components/ui/Textarea.js +65 -54
- package/dist-lib/components/ui/Textarea.js.map +1 -1
- package/dist-lib/components/ui/Timeline.js +39 -35
- package/dist-lib/components/ui/Timeline.js.map +1 -1
- package/dist-lib/components/ui/Toast.js +44 -57
- package/dist-lib/components/ui/Toast.js.map +1 -1
- package/dist-lib/components/ui/Tooltip.d.ts +4 -1
- package/dist-lib/components/ui/Tooltip.js +24 -22
- package/dist-lib/components/ui/Tooltip.js.map +1 -1
- package/dist-lib/components/ui/TopNav.d.ts +7 -3
- package/dist-lib/components/ui/TopNav.js +35 -25
- package/dist-lib/components/ui/TopNav.js.map +1 -1
- package/dist-lib/components/ui/Tree.d.ts +15 -10
- package/dist-lib/components/ui/Tree.js +82 -79
- package/dist-lib/components/ui/Tree.js.map +1 -1
- package/dist-lib/hooks/use-debounce.d.ts +19 -0
- package/dist-lib/hooks/use-debounce.js +36 -0
- package/dist-lib/hooks/use-debounce.js.map +1 -0
- package/dist-lib/hooks/use-delayed-loading.d.ts +21 -0
- package/dist-lib/hooks/use-delayed-loading.js +20 -0
- package/dist-lib/hooks/use-delayed-loading.js.map +1 -0
- package/dist-lib/hooks/use-field-ids.d.ts +2 -1
- package/dist-lib/hooks/use-field-ids.js +9 -9
- package/dist-lib/hooks/use-field-ids.js.map +1 -1
- package/dist-lib/hooks/use-media-query.d.ts +3 -1
- package/dist-lib/hooks/use-media-query.js +16 -12
- package/dist-lib/hooks/use-media-query.js.map +1 -1
- package/dist-lib/hooks/use-modifier-key.d.ts +13 -0
- package/dist-lib/hooks/use-modifier-key.js +19 -0
- package/dist-lib/hooks/use-modifier-key.js.map +1 -0
- package/dist-lib/hooks/use-toast.d.ts +7 -2
- package/dist-lib/hooks/use-toast.js +61 -30
- package/dist-lib/hooks/use-toast.js.map +1 -1
- package/dist-lib/icons/index.d.ts +9 -0
- package/dist-lib/icons/index.js +148 -130
- package/dist-lib/icons/index.js.map +1 -1
- package/dist-lib/illustrations/index.d.ts +1 -0
- package/dist-lib/illustrations/index.js +15 -6
- package/dist-lib/illustrations/index.js.map +1 -1
- package/dist-lib/index.d.ts +6 -0
- package/dist-lib/index.js +280 -260
- package/dist-lib/index.js.map +1 -1
- package/dist-lib/lib/format.d.ts +65 -0
- package/dist-lib/lib/format.js +95 -0
- package/dist-lib/lib/format.js.map +1 -0
- package/dist-lib/lib/return-focus.d.ts +11 -0
- package/dist-lib/lib/return-focus.js +12 -0
- package/dist-lib/lib/return-focus.js.map +1 -0
- package/dist-lib/lib/strings.d.ts +62 -1
- package/dist-lib/lib/strings.js +75 -19
- package/dist-lib/lib/strings.js.map +1 -1
- package/dist-lib/lib/strings.mn.js +50 -5
- package/dist-lib/lib/strings.mn.js.map +1 -1
- package/dist-lib/styles.css +1 -1
- package/dist-lib/theme.css +141 -78
- package/package.json +10 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chart.js","sources":["../../../src/components/ui/Chart.tsx"],"sourcesContent":["'use client';\n\nimport { useId, type ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\n/**\n * Tiny, dependency-free chart primitives for inline dashboards — sparklines,\n * KPI cards, at-a-glance trends. For heavy interactive visualisations reach for\n * a charting library. These render as responsive SVG (the line/area stretch to\n * the container width; strokes stay crisp via non-scaling-stroke).\n */\n\nexport interface ChartPoint {\n x: string | number;\n y: number;\n}\n\nexport interface ChartSeries {\n /** Name used in the accessible summary and tooltips. */\n name?: string;\n data: ChartPoint[];\n}\n\nexport interface ChartProps {\n /** Primary series. Ignored when `series` is provided. */\n data?: ChartPoint[];\n /** Multiple series drawn on the same scale. */\n series?: ChartSeries[];\n /**\n * Per-series colours. Defaults to the categorical token list below.\n * TODO(globals.css): add `--chart-1..6` tokens and switch the defaults.\n */\n colors?: string[];\n /** Drawing height in px. */\n height?: number;\n /** Defaults to fluid 100%. */\n width?: number | string;\n /** Visible caption rendered above the chart. Doubles as the accessible name. */\n caption?: ReactNode;\n /** Accessible name when there is no `caption`. */\n 'aria-label'?: string;\n /** Alias of `aria-label` (SVG `<title>`). */\n title?: string;\n /** Faint horizontal gridlines. Default true. */\n grid?: boolean;\n /** Y-axis tick labels + first/last x labels. Default true. */\n showAxis?: boolean;\n className?: string;\n}\n\nexport const DEFAULT_CHART_COLORS = [\n 'var(--chart-1)',\n 'var(--chart-2)',\n 'var(--chart-3)',\n 'var(--chart-4)',\n 'var(--chart-5)',\n 'var(--chart-6)',\n];\n\n// Fixed internal coordinate space; preserveAspectRatio=\"none\" stretches it to\n// the container, so this only controls smoothing resolution, not the aspect.\nconst VB_W = 600;\nconst PAD = 6;\nconst GRID_LINES = 4;\nconst MAX_TICKS = 5;\n\n/** 1234 → \"1.2K\", 3_400_000 → \"3.4M\". */\nexport function abbreviateNumber(n: number): string {\n const abs = Math.abs(n);\n const fmt = (v: number, s: string) => `${(Math.round(v * 10) / 10).toString()}${s}`;\n if (abs >= 1e9) return fmt(n / 1e9, 'B');\n if (abs >= 1e6) return fmt(n / 1e6, 'M');\n if (abs >= 1e3) return fmt(n / 1e3, 'K');\n return Number.isInteger(n) ? String(n) : (Math.round(n * 100) / 100).toString();\n}\n\nfunction resolveSeries(data?: ChartPoint[], series?: ChartSeries[]): ChartSeries[] {\n if (series && series.length) return series;\n return [{ data: data ?? [] }];\n}\n\nfunction domain(all: ChartSeries[], includeZero = true) {\n const ys = all.flatMap((s) => s.data.map((d) => d.y));\n const min = includeZero ? Math.min(0, ...ys) : Math.min(...ys);\n const max = Math.max(...ys, includeZero ? 1 : -Infinity);\n return { min, max: max === -Infinity ? 1 : max, range: max - min || 1 };\n}\n\nfunction scales(length: number, h: number, min: number, range: number) {\n const innerW = VB_W - PAD * 2;\n const innerH = h - PAD * 2;\n const sx = (i: number) => (length <= 1 ? PAD + innerW / 2 : PAD + (i / (length - 1)) * innerW);\n const sy = (v: number) => PAD + innerH - ((v - min) / range) * innerH;\n return { sx, sy };\n}\n\n/** Catmull-Rom → cubic bézier: a smooth curve through every point. */\nfunction smoothPath(pts: [number, number][]): string {\n if (pts.length === 0) return '';\n if (pts.length < 3) return pts.map((p, i) => `${i ? 'L' : 'M'}${p[0]},${p[1]}`).join(' ');\n let d = `M${pts[0][0]},${pts[0][1]}`;\n for (let i = 0; i < pts.length - 1; i++) {\n const p0 = pts[i - 1] ?? pts[i];\n const p1 = pts[i];\n const p2 = pts[i + 1];\n const p3 = pts[i + 2] ?? p2;\n const c1x = p1[0] + (p2[0] - p0[0]) / 6;\n const c1y = p1[1] + (p2[1] - p0[1]) / 6;\n const c2x = p2[0] - (p3[0] - p1[0]) / 6;\n const c2y = p2[1] - (p3[1] - p1[1]) / 6;\n d += ` C${c1x.toFixed(1)},${c1y.toFixed(1)} ${c2x.toFixed(1)},${c2y.toFixed(1)} ${p2[0].toFixed(1)},${p2[1].toFixed(1)}`;\n }\n return d;\n}\n\n/** Plain-language summary for the `<desc>` element. */\nfunction describe(all: ChartSeries[]): string {\n return all\n .map((s, i) => {\n const ys = s.data.map((d) => d.y);\n if (!ys.length) return `${s.name ?? `Series ${i + 1}`}: no data`;\n const min = Math.min(...ys);\n const max = Math.max(...ys);\n const last = s.data[s.data.length - 1];\n return `${s.name ?? `Series ${i + 1}`}: ${ys.length} points, min ${min}, max ${max}, last ${last.x}: ${last.y}`;\n })\n .join('. ');\n}\n\nfunction Grid({ height }: { height: number }) {\n const innerH = height - PAD * 2;\n return (\n <g aria-hidden>\n {Array.from({ length: GRID_LINES + 1 }, (_, i) => {\n const y = PAD + (i / GRID_LINES) * innerH;\n return (\n <line\n key={i}\n x1={0}\n x2={VB_W}\n y1={y}\n y2={y}\n stroke=\"var(--color-border)\"\n strokeWidth={1}\n vectorEffect=\"non-scaling-stroke\"\n opacity={0.6}\n />\n );\n })}\n </g>\n );\n}\n\n/**\n * Axis labels are rendered in HTML (not inside the stretched SVG) so the text\n * is never distorted by `preserveAspectRatio=\"none\"`.\n */\nfunction YAxis({ min, max }: { min: number; max: number }) {\n const ticks = Array.from(\n { length: MAX_TICKS },\n (_, i) => max - ((max - min) * i) / (MAX_TICKS - 1),\n );\n return (\n <div\n aria-hidden\n className=\"tabular text-foreground-subtle pointer-events-none flex shrink-0 flex-col justify-between py-[6px] pr-1.5 text-right text-xs\"\n >\n {ticks.map((t, i) => (\n <span key={i} className=\"leading-none\">\n {abbreviateNumber(t)}\n </span>\n ))}\n </div>\n );\n}\n\nfunction XAxis({ first, last }: { first?: ChartPoint; last?: ChartPoint }) {\n if (!first) return null;\n return (\n <div aria-hidden className=\"text-foreground-subtle flex justify-between text-xs\">\n <span>{String(first.x)}</span>\n {last && last !== first && <span>{String(last.x)}</span>}\n </div>\n );\n}\n\nfunction Frame({\n caption,\n ariaLabel,\n title,\n desc,\n height,\n width,\n className,\n showAxis,\n yDomain,\n xFirst,\n xLast,\n children,\n}: {\n caption?: ReactNode;\n ariaLabel?: string;\n title?: string;\n desc: string;\n height: number;\n width: number | string;\n className?: string;\n showAxis: boolean;\n yDomain: { min: number; max: number };\n xFirst?: ChartPoint;\n xLast?: ChartPoint;\n children: ReactNode;\n}) {\n const id = useId().replace(/:/g, '');\n const captionId = `chart-cap-${id}`;\n const titleId = `chart-title-${id}`;\n const descId = `chart-desc-${id}`;\n const name = ariaLabel ?? title;\n\n if (import.meta.env?.DEV && !name && !caption) {\n console.warn(\n '[craftzbay/ui] Chart: provide `caption`, `aria-label`, or `title` so the chart has an accessible name.',\n );\n }\n\n return (\n <figure className={cn('flex flex-col gap-1.5', className)} style={{ width }}>\n {caption && (\n <figcaption id={captionId} className=\"text-foreground-muted text-xs\">\n {caption}\n </figcaption>\n )}\n <div className=\"flex\">\n {showAxis && <YAxis min={yDomain.min} max={yDomain.max} />}\n <svg\n viewBox={`0 0 ${VB_W} ${height}`}\n width=\"100%\"\n height={height}\n preserveAspectRatio=\"none\"\n role=\"img\"\n aria-labelledby={caption ? captionId : name ? titleId : undefined}\n aria-describedby={descId}\n className=\"min-w-0 flex-1 overflow-visible\"\n >\n {name && <title id={titleId}>{name}</title>}\n <desc id={descId}>{desc}</desc>\n {children}\n </svg>\n </div>\n {showAxis && <XAxis first={xFirst} last={xLast} />}\n </figure>\n );\n}\n\nexport function LineChart({\n data,\n series,\n colors = DEFAULT_CHART_COLORS,\n height = 160,\n width = '100%',\n caption,\n 'aria-label': ariaLabel,\n title,\n grid = true,\n showAxis = true,\n className,\n}: ChartProps) {\n const all = resolveSeries(data, series);\n const { min, max, range } = domain(all);\n const longest = Math.max(...all.map((s) => s.data.length));\n const primary = all[0].data;\n\n return (\n <Frame\n caption={caption}\n ariaLabel={ariaLabel}\n title={title}\n desc={describe(all)}\n height={height}\n width={width}\n className={className}\n showAxis={showAxis}\n yDomain={{ min, max }}\n xFirst={primary[0]}\n xLast={primary[primary.length - 1]}\n >\n {grid && <Grid height={height} />}\n {all.map((s, si) => {\n const color = colors[si % colors.length];\n const { sx, sy } = scales(longest, height, min, range);\n const pts = s.data.map((d, i) => [sx(i), sy(d.y)] as [number, number]);\n const line = smoothPath(pts);\n const baseline = sy(Math.max(min, 0));\n const area = pts.length\n ? `${line} L${pts[pts.length - 1][0].toFixed(1)},${baseline.toFixed(1)} L${pts[0][0].toFixed(1)},${baseline.toFixed(1)} Z`\n : '';\n const last = pts[pts.length - 1];\n const lastPoint = s.data[s.data.length - 1];\n return (\n <g key={si}>\n {area && <path d={area} fill={color} fillOpacity={0.08} />}\n <path\n d={line}\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n {last && (\n <circle\n cx={last[0]}\n cy={last[1]}\n r={3.5}\n fill={color}\n vectorEffect=\"non-scaling-stroke\"\n >\n <title>{`${s.name ? `${s.name} — ` : ''}${lastPoint.x}: ${lastPoint.y}`}</title>\n </circle>\n )}\n </g>\n );\n })}\n </Frame>\n );\n}\n\nexport function AreaChart(props: ChartProps) {\n // The line chart already renders a flat low-opacity area; alias for intent / naming.\n return <LineChart {...props} />;\n}\n\nexport function BarChart({\n data,\n series,\n colors = DEFAULT_CHART_COLORS,\n height = 160,\n width = '100%',\n caption,\n 'aria-label': ariaLabel,\n title,\n grid = true,\n showAxis = true,\n className,\n}: ChartProps) {\n const all = resolveSeries(data, series);\n const innerW = VB_W - PAD * 2;\n const innerH = height - PAD * 2;\n const longest = Math.max(...all.map((s) => s.data.length));\n const slot = innerW / Math.max(1, longest);\n const groupW = slot * 0.62;\n const barW = Math.max(2, groupW / all.length);\n const { max } = domain(all);\n const primary = all[0].data;\n\n return (\n <Frame\n caption={caption}\n ariaLabel={ariaLabel}\n title={title}\n desc={describe(all)}\n height={height}\n width={width}\n className={className}\n showAxis={showAxis}\n yDomain={{ min: 0, max }}\n xFirst={primary[0]}\n xLast={primary[primary.length - 1]}\n >\n {grid && <Grid height={height} />}\n {all.map((s, si) =>\n s.data.map((d, i) => {\n const h = (Math.max(0, d.y) / max) * innerH;\n const x = PAD + i * slot + (slot - groupW) / 2 + si * barW;\n return (\n <rect\n key={`${si}-${i}`}\n x={x}\n y={PAD + innerH - h}\n width={barW}\n height={Math.max(0, h)}\n fill={colors[si % colors.length]}\n rx={2}\n className=\"transition-opacity hover:opacity-80\"\n >\n <title>{`${s.name ? `${s.name} — ` : ''}${d.x}: ${d.y}`}</title>\n </rect>\n );\n }),\n )}\n </Frame>\n );\n}\n"],"names":["DEFAULT_CHART_COLORS","VB_W","PAD","GRID_LINES","MAX_TICKS","abbreviateNumber","n","abs","fmt","v","s","resolveSeries","data","series","domain","all","includeZero","ys","d","min","max","scales","length","h","range","innerW","innerH","i","smoothPath","pts","p","p0","p1","p2","p3","c1x","c1y","c2x","c2y","describe","last","Grid","height","jsx","_","y","YAxis","ticks","t","XAxis","first","Frame","caption","ariaLabel","title","desc","width","className","showAxis","yDomain","xFirst","xLast","children","id","useId","captionId","titleId","descId","name","jsxs","cn","LineChart","colors","grid","longest","primary","si","color","sx","sy","line","baseline","area","lastPoint","AreaChart","props","BarChart","slot","groupW","barW","x"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Chart.js","sources":["../../../src/components/ui/Chart.tsx"],"sourcesContent":["'use client';\n\nimport {\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\nimport { formatString, type UiStrings } from '@/lib/strings';\nimport { Skeleton } from './Skeleton';\n\n/**\n * Tiny, dependency-free chart primitives for inline dashboards — sparklines,\n * KPI cards, at-a-glance trends. For heavy interactive visualisations reach for\n * a charting library. The SVG is drawn in real pixels: a ResizeObserver\n * measures the container width, so points and bars are never distorted.\n *\n * Keyboard: one tab stop per series; ←/→ (Home/End) move between points and\n * the active point is announced via a polite live region.\n */\n\nexport interface ChartPoint {\n x: string | number;\n /** `null` breaks the line (a gap) and is skipped in bars/tables. */\n y: number | null;\n}\n\nexport interface ChartSeries {\n /** Name used in the accessible summary, table header and tooltips. */\n name?: string;\n data: ChartPoint[];\n}\n\nexport type ChartState = 'loading' | 'empty' | 'error';\n\n/** Text builders for the accessible summary + point labels (i18n). */\nexport interface ChartLabels {\n /** `<desc>` sentence per series. */\n summary: (s: {\n name: string;\n count: number;\n min: number;\n max: number;\n lastX: string | number | undefined;\n lastY: number | undefined;\n }) => string;\n /** Label of one data point (tooltip, live region). */\n point: (name: string | undefined, x: string | number, y: number) => string;\n /** Accessible name of a series' tab stop. */\n series: (name: string, count: number) => string;\n}\n\nexport const defaultChartLabels: ChartLabels = {\n summary: ({ name, count, min, max, lastX, lastY }) =>\n `${name}: ${count} points, min ${min}, max ${max}, last ${lastX}: ${lastY}`,\n point: (name, x, y) => `${name ? `${name} — ` : ''}${x}: ${y}`,\n series: (name, count) => `${name}, ${count} points. Use arrow keys to move between points.`,\n};\n\nfunction chartLabelsFromStrings(t: UiStrings['chart']): ChartLabels {\n return {\n summary: ({ name, count, min, max, lastX, lastY }) =>\n formatString(t.summary, { name, count, min, max, x: lastX, y: lastY }),\n point: (name, x, y) => (name ? `${name} — ` : '') + formatString(t.point, { x, y }),\n series: (name, count) => formatString(t.seriesNav, { name, count }),\n };\n}\n\nexport interface ChartProps {\n /** Primary series. Ignored when `series` is provided. */\n data?: ChartPoint[];\n /** Multiple series drawn on the same scale. */\n series?: ChartSeries[];\n /** Per-series colours. Defaults to `--chart-1..6` (categorical; never the accent). */\n colors?: string[];\n /** Drawing height in px. */\n height?: number;\n /** Defaults to fluid 100%. */\n width?: number | string;\n /** Visible caption rendered above the chart. Doubles as the accessible name. */\n caption?: ReactNode;\n /** Accessible name when there is no `caption`. */\n 'aria-label'?: string;\n /** Alias of `aria-label` (SVG `<title>`). */\n title?: string;\n /** Faint horizontal gridlines. Default true. */\n grid?: boolean;\n /** Y-axis tick labels + first/last x labels. Default true. */\n showAxis?: boolean;\n /**\n * Render a visually-hidden `<table>` of the data after the SVG so screen\n * readers and copy/paste get the numbers. Default true.\n */\n tableFallback?: boolean;\n /** Show a small \"View as table\" toggle that reveals the fallback table. */\n showTableToggle?: boolean;\n /** Replace the drawing with a loading skeleton / empty / error message. */\n state?: ChartState;\n /** Override the generated accessible text (English defaults). */\n labels?: Partial<ChartLabels>;\n className?: string;\n}\n\nexport const DEFAULT_CHART_COLORS = [\n 'var(--chart-1)',\n 'var(--chart-2)',\n 'var(--chart-3)',\n 'var(--chart-4)',\n 'var(--chart-5)',\n 'var(--chart-6)',\n];\n\n// Width used before the container has been measured (SSR / first paint).\nconst FALLBACK_W = 600;\nconst PAD = 6;\n\n/** Measure the container's content width; re-renders on resize. */\nfunction useMeasuredWidth<T extends HTMLElement>() {\n const ref = useRef<T>(null);\n const [width, setWidth] = useState(0);\n const useIso = typeof window === 'undefined' ? useEffect : useLayoutEffect;\n useIso(() => {\n const el = ref.current;\n if (!el) return;\n const update = () => setWidth(el.clientWidth);\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n return { ref, width: width || FALLBACK_W };\n}\nconst MAX_TICKS = 5;\n\n/** 1234 → \"1.2K\", 3_400_000 → \"3.4M\". */\nexport function abbreviateNumber(n: number): string {\n const abs = Math.abs(n);\n const fmt = (v: number, s: string) => `${(Math.round(v * 10) / 10).toString()}${s}`;\n if (abs >= 1e9) return fmt(n / 1e9, 'B');\n if (abs >= 1e6) return fmt(n / 1e6, 'M');\n if (abs >= 1e3) return fmt(n / 1e3, 'K');\n return Number.isInteger(n) ? String(n) : (Math.round(n * 100) / 100).toString();\n}\n\n/** Round a raw step up to 1 / 2 / 2.5 / 5 × 10^n. */\nfunction niceStep(raw: number): number {\n if (raw <= 0) return 1;\n const exp = Math.floor(Math.log10(raw));\n const base = 10 ** exp;\n const f = raw / base;\n const nice = f <= 1 ? 1 : f <= 2 ? 2 : f <= 2.5 ? 2.5 : f <= 5 ? 5 : 10;\n return nice * base;\n}\n\n/**\n * \"Nice\" axis: expands [min, max] to multiples of a 1/2/2.5/5 step so ticks\n * read as round numbers (never `754.5`).\n */\nexport function niceTicks(min: number, max: number, maxTicks = MAX_TICKS) {\n if (max === min) max = min + 1;\n const step = niceStep((max - min) / Math.max(1, maxTicks - 1));\n const lo = Math.floor(min / step) * step;\n const hi = Math.ceil(max / step) * step;\n const ticks: number[] = [];\n // +step/2 guards float drift; toFixed strips 0.30000000000000004-style noise.\n for (let v = hi; v >= lo - step / 2; v -= step) ticks.push(Number(v.toFixed(10)));\n return { min: lo, max: hi, ticks };\n}\n\nfunction resolveSeries(data?: ChartPoint[], series?: ChartSeries[]): ChartSeries[] {\n if (series && series.length) return series;\n return [{ data: data ?? [] }];\n}\n\nconst isNum = (v: number | null | undefined): v is number => typeof v === 'number';\n\nfunction domain(all: ChartSeries[], includeZero = true) {\n const ys = all.flatMap((s) => s.data.map((d) => d.y).filter(isNum));\n const rawMin = includeZero ? Math.min(0, ...ys) : Math.min(...ys);\n const rawMax = Math.max(...ys, includeZero ? 1 : -Infinity);\n const { min, max, ticks } = niceTicks(\n Number.isFinite(rawMin) ? rawMin : 0,\n rawMax === -Infinity ? 1 : rawMax,\n );\n return { min, max, range: max - min || 1, ticks };\n}\n\nfunction scales(length: number, w: number, h: number, min: number, range: number) {\n const innerW = w - PAD * 2;\n const innerH = h - PAD * 2;\n const sx = (i: number) => (length <= 1 ? PAD + innerW / 2 : PAD + (i / (length - 1)) * innerW);\n const sy = (v: number) => PAD + innerH - ((v - min) / range) * innerH;\n return { sx, sy };\n}\n\n/** Catmull-Rom → cubic bézier: a smooth curve through every point. */\nfunction smoothPath(pts: [number, number][]): string {\n if (pts.length === 0) return '';\n if (pts.length < 3) return pts.map((p, i) => `${i ? 'L' : 'M'}${p[0]},${p[1]}`).join(' ');\n let d = `M${pts[0][0]},${pts[0][1]}`;\n for (let i = 0; i < pts.length - 1; i++) {\n const p0 = pts[i - 1] ?? pts[i];\n const p1 = pts[i];\n const p2 = pts[i + 1];\n const p3 = pts[i + 2] ?? p2;\n const c1x = p1[0] + (p2[0] - p0[0]) / 6;\n const c1y = p1[1] + (p2[1] - p0[1]) / 6;\n const c2x = p2[0] - (p3[0] - p1[0]) / 6;\n const c2y = p2[1] - (p3[1] - p1[1]) / 6;\n d += ` C${c1x.toFixed(1)},${c1y.toFixed(1)} ${c2x.toFixed(1)},${c2y.toFixed(1)} ${p2[0].toFixed(1)},${p2[1].toFixed(1)}`;\n }\n return d;\n}\n\n/** Split at `null` gaps → one smooth sub-path per run of real values. */\nfunction segments(\n data: ChartPoint[],\n sx: (i: number) => number,\n sy: (v: number) => number,\n): [number, number][][] {\n const out: [number, number][][] = [];\n let run: [number, number][] = [];\n data.forEach((d, i) => {\n if (isNum(d.y)) run.push([sx(i), sy(d.y)]);\n else if (run.length) {\n out.push(run);\n run = [];\n }\n });\n if (run.length) out.push(run);\n return out;\n}\n\nconst seriesName = (s: ChartSeries, i: number, t: UiStrings['chart']) =>\n s.name ?? formatString(t.series, { n: i + 1 });\n\n/** Plain-language summary for the `<desc>` element. */\nfunction describe(all: ChartSeries[], t: UiStrings['chart'], labels: ChartLabels): string {\n return all\n .map((s, i) => {\n const ys = s.data.map((d) => d.y).filter(isNum);\n const name = seriesName(s, i, t);\n if (!ys.length) return `${name}: ${t.noData}`;\n const last = [...s.data].reverse().find((d) => isNum(d.y));\n return labels.summary({\n name,\n count: ys.length,\n min: Math.min(...ys),\n max: Math.max(...ys),\n lastX: last?.x,\n lastY: last?.y ?? undefined,\n });\n })\n .join('. ');\n}\n\nfunction Grid({ width, height, lines }: { width: number; height: number; lines: number }) {\n const innerH = height - PAD * 2;\n const n = Math.max(1, lines);\n return (\n <g aria-hidden>\n {Array.from({ length: n + 1 }, (_, i) => {\n const y = PAD + (i / n) * innerH;\n return (\n <line\n key={i}\n x1={0}\n x2={width}\n y1={y}\n y2={y}\n stroke=\"var(--color-border)\"\n strokeWidth={1}\n opacity={0.6}\n />\n );\n })}\n </g>\n );\n}\n\n/** Axis labels are HTML so they follow the document font and wrap normally. */\nfunction YAxis({ ticks }: { ticks: number[] }) {\n return (\n <div\n aria-hidden\n className=\"tabular text-foreground-subtle pointer-events-none flex shrink-0 flex-col justify-between py-1.5 pr-1.5 text-right text-xs\"\n >\n {ticks.map((t, i) => (\n <span key={i} className=\"leading-none\">\n {abbreviateNumber(t)}\n </span>\n ))}\n </div>\n );\n}\n\nfunction XAxis({ first, last }: { first?: ChartPoint; last?: ChartPoint }) {\n if (!first) return null;\n return (\n <div aria-hidden className=\"text-foreground-subtle flex justify-between text-xs\">\n <span>{String(first.x)}</span>\n {last && last !== first && <span>{String(last.x)}</span>}\n </div>\n );\n}\n\nfunction DataTable({\n id,\n all,\n name,\n visible,\n t,\n}: {\n id: string;\n all: ChartSeries[];\n name?: string;\n visible: boolean;\n t: UiStrings['chart'];\n}) {\n const longest = Math.max(...all.map((s) => s.data.length));\n const xs = all.find((s) => s.data.length === longest)?.data ?? [];\n // A <table> ignores `sr-only`'s 1px width (min-content wins) and can widen\n // the document on narrow viewports — hide it inside a wrapper instead.\n const table = (\n <table\n id={id}\n data-chart-table\n className={cn(visible && 'tabular text-foreground-muted mt-2 w-full text-left text-xs')}\n >\n <caption className={cn(visible && 'text-foreground-subtle pb-1 text-left')}>\n {formatString(t.tableCaption, { name: name ?? '' }).trim()}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\" className={cn(visible && 'border-border border-b py-1 pr-3 font-medium')}>\n x\n </th>\n {all.map((s, i) => (\n <th\n key={i}\n scope=\"col\"\n className={cn(visible && 'border-border border-b py-1 pr-3 font-medium')}\n >\n {seriesName(s, i, t)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {xs.map((p, i) => (\n <tr key={i}>\n <th scope=\"row\" className={cn(visible && 'py-0.5 pr-3 font-normal')}>\n {String(p.x)}\n </th>\n {all.map((s, si) => (\n <td key={si} className={cn(visible && 'py-0.5 pr-3')}>\n {isNum(s.data[i]?.y) ? String(s.data[i]?.y) : '—'}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n return visible ? table : <div className=\"sr-only\">{table}</div>;\n}\n\nfunction Frame({\n caption,\n ariaLabel,\n title,\n all,\n height,\n width,\n className,\n showAxis,\n ticks,\n xFirst,\n xLast,\n tableFallback,\n showTableToggle,\n state,\n labels,\n children,\n}: {\n caption?: ReactNode;\n ariaLabel?: string;\n title?: string;\n all: ChartSeries[];\n height: number;\n width: number | string;\n className?: string;\n showAxis: boolean;\n ticks: number[];\n xFirst?: ChartPoint;\n xLast?: ChartPoint;\n tableFallback: boolean;\n showTableToggle?: boolean;\n state?: ChartState;\n labels: ChartLabels;\n children: (ctx: FrameContext) => ReactNode;\n}) {\n const t = useStrings().chart;\n const id = useId().replace(/:/g, '');\n const captionId = `chart-cap-${id}`;\n const titleId = `chart-title-${id}`;\n const descId = `chart-desc-${id}`;\n const tableId = `chart-table-${id}`;\n const name = ariaLabel ?? title;\n const [tableOpen, setTableOpen] = useState(false);\n const { ref: plotRef, width: plotW } = useMeasuredWidth<HTMLDivElement>();\n const roving = useRovingPoints(all, t, labels);\n\n if (process.env.NODE_ENV !== 'production' && !name && !caption) {\n console.warn(\n '[craftzbay/ui] Chart: provide `caption`, `aria-label`, or `title` so the chart has an accessible name.',\n );\n }\n\n const tableRendered = (tableFallback || tableOpen) && !state;\n\n const stateNode =\n state === 'loading' ? (\n <div role=\"status\" aria-label={t.loading} style={{ height }} className=\"w-full\">\n <Skeleton style={{ height }} className=\"w-full\" />\n <span className=\"sr-only\">{t.loading}</span>\n </div>\n ) : state ? (\n <div\n role={state === 'error' ? 'alert' : 'status'}\n style={{ height }}\n className=\"text-foreground-subtle flex w-full items-center justify-center text-sm\"\n >\n {state === 'error' ? t.error : t.empty}\n </div>\n ) : null;\n\n return (\n <figure className={cn('flex flex-col gap-1.5', className)} style={{ width }}>\n {caption && (\n <figcaption id={captionId} className=\"text-foreground-muted text-xs\">\n {caption}\n </figcaption>\n )}\n {stateNode ?? (\n <>\n <div className=\"flex\">\n {showAxis && <YAxis ticks={ticks} />}\n {/* The plot area is measured; the SVG is drawn 1:1 in px inside it. */}\n <div ref={plotRef} className=\"min-w-0 flex-1\">\n {/* role=group (not img): series inside are focusable and carry their own labels. */}\n <svg\n viewBox={`0 0 ${plotW} ${height}`}\n width={plotW}\n height={height}\n role=\"group\"\n aria-labelledby={caption ? captionId : name ? titleId : undefined}\n aria-describedby={descId}\n className=\"block max-w-full overflow-visible\"\n >\n {name && <title id={titleId}>{name}</title>}\n <desc id={descId}>{describe(all, t, labels)}</desc>\n {children({ width: plotW, ...roving })}\n </svg>\n </div>\n </div>\n {showAxis && <XAxis first={xFirst} last={xLast} />}\n <span className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n {roving.announcement}\n </span>\n </>\n )}\n {showTableToggle && !state && (\n <button\n type=\"button\"\n onClick={() => setTableOpen((v) => !v)}\n aria-expanded={tableOpen}\n aria-controls={tableRendered ? tableId : undefined}\n className={cn(\n 'text-foreground-subtle hover:text-foreground self-start rounded-sm text-xs underline-offset-2 outline-none hover:underline',\n 'focus-visible:ring-ring focus-visible:ring-offset-background focus-visible:ring-2 focus-visible:ring-offset-2',\n )}\n >\n {tableOpen ? t.hideTable : t.viewAsTable}\n </button>\n )}\n {tableRendered && (\n <DataTable\n id={tableId}\n all={all}\n name={name ?? (typeof caption === 'string' ? caption : undefined)}\n visible={tableOpen}\n t={t}\n />\n )}\n </figure>\n );\n}\n\ninterface FrameContext {\n width: number;\n active: { series: number; index: number } | null;\n seriesProps: (si: number) => {\n tabIndex: number;\n role: 'group';\n 'aria-label': string;\n 'data-chart-series': true;\n onKeyDown: (e: KeyboardEvent<SVGGElement>) => void;\n onFocus: () => void;\n onBlur: () => void;\n className: string;\n };\n}\n\n/**\n * Roving focus: each series is a single tab stop; ←/→/Home/End move the\n * active point and the live region announces it. Per-point tab stops would\n * make a 200-point chart a 200-tab ordeal.\n */\nfunction useRovingPoints(all: ChartSeries[], t: UiStrings['chart'], labels: ChartLabels) {\n const [active, setActive] = useState<{ series: number; index: number } | null>(null);\n const [announcement, setAnnouncement] = useState('');\n\n const announce = useCallback(\n (si: number, idx: number) => {\n const s = all[si];\n const d = s?.data[idx];\n if (!d || !isNum(d.y)) return;\n setActive({ series: si, index: idx });\n setAnnouncement(labels.point(s.name, d.x, d.y));\n },\n [all, labels],\n );\n\n const validIndices = (si: number) =>\n all[si].data.map((d, i) => (isNum(d.y) ? i : -1)).filter((i) => i >= 0);\n\n const seriesProps = (si: number) => ({\n tabIndex: 0,\n role: 'group' as const,\n 'aria-label': labels.series(seriesName(all[si], si, t), validIndices(si).length),\n // Focus ring comes from theme.css `[data-chart-series]:focus-visible`\n // (CSS outline — Tailwind's box-shadow ring does not paint on SVG <g>).\n 'data-chart-series': true as const,\n className: cn(\n '[&:focus-visible_[data-active]]:stroke-[var(--ring)] [&:focus-visible_[data-active]]:stroke-[3px]',\n ),\n onFocus: () => {\n const idxs = validIndices(si);\n if (idxs.length) announce(si, active?.series === si ? active.index : idxs[idxs.length - 1]);\n },\n onBlur: () => {\n setActive(null);\n setAnnouncement('');\n },\n onKeyDown: (e: KeyboardEvent<SVGGElement>) => {\n const idxs = validIndices(si);\n if (!idxs.length) return;\n const pos = active?.series === si ? idxs.indexOf(active.index) : idxs.length - 1;\n let next = pos;\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') next = Math.min(idxs.length - 1, pos + 1);\n else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') next = Math.max(0, pos - 1);\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = idxs.length - 1;\n else return;\n e.preventDefault();\n announce(si, idxs[next]);\n },\n });\n\n return { active, announcement, seriesProps };\n}\n\n/** Labelled data point. Invisible until hovered / active unless `always`. */\nfunction Point({\n x,\n y,\n color,\n label,\n always,\n active,\n}: {\n x: number;\n y: number;\n color: string;\n label: string;\n always?: boolean;\n active?: boolean;\n}) {\n return (\n <circle\n cx={x}\n cy={y}\n r={3.5}\n fill={color}\n data-active={active || undefined}\n className={cn(!always && !active && 'opacity-0 hover:opacity-100')}\n >\n <title>{label}</title>\n </circle>\n );\n}\n\nexport function LineChart({\n data,\n series,\n colors = DEFAULT_CHART_COLORS,\n height = 160,\n width = '100%',\n caption,\n 'aria-label': ariaLabel,\n title,\n grid = true,\n showAxis = true,\n tableFallback = true,\n showTableToggle,\n state,\n labels: labelsProp,\n className,\n}: ChartProps) {\n const t = useStrings().chart;\n const labels = { ...chartLabelsFromStrings(t), ...labelsProp };\n const all = resolveSeries(data, series);\n const { min, range, ticks } = domain(all);\n const longest = Math.max(...all.map((s) => s.data.length));\n const primary = all[0].data;\n\n return (\n <Frame\n caption={caption}\n ariaLabel={ariaLabel}\n title={title}\n all={all}\n height={height}\n width={width}\n className={className}\n showAxis={showAxis}\n ticks={ticks}\n xFirst={primary[0]}\n xLast={primary[primary.length - 1]}\n tableFallback={tableFallback}\n showTableToggle={showTableToggle}\n state={state}\n labels={labels}\n >\n {({ width: w, active, seriesProps }) => (\n <>\n {grid && <Grid width={w} height={height} lines={ticks.length - 1} />}\n {all.map((s, si) => {\n const color = colors[si % colors.length];\n const { sx, sy } = scales(longest, w, height, min, range);\n const segs = segments(s.data, sx, sy);\n const line = segs.map(smoothPath).join(' ');\n const baseline = sy(Math.max(min, 0));\n const area = segs\n .map(\n (pts) =>\n `${smoothPath(pts)} L${pts[pts.length - 1][0].toFixed(1)},${baseline.toFixed(1)} L${pts[0][0].toFixed(1)},${baseline.toFixed(1)} Z`,\n )\n .join(' ');\n const lastIdx = s.data.map((d) => isNum(d.y)).lastIndexOf(true);\n return (\n <g key={si} {...seriesProps(si)}>\n {area && <path d={area} fill={color} fillOpacity={0.08} />}\n <path\n d={line}\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n {s.data.map((d, i) =>\n isNum(d.y) ? (\n <Point\n key={i}\n x={sx(i)}\n y={sy(d.y)}\n color={color}\n always={i === lastIdx}\n active={active?.series === si && active.index === i}\n label={labels.point(s.name, d.x, d.y)}\n />\n ) : null,\n )}\n </g>\n );\n })}\n </>\n )}\n </Frame>\n );\n}\n\nexport function AreaChart(props: ChartProps) {\n // The line chart already renders a flat low-opacity area; alias for intent / naming.\n return <LineChart {...props} />;\n}\n\nexport function BarChart({\n data,\n series,\n colors = DEFAULT_CHART_COLORS,\n height = 160,\n width = '100%',\n caption,\n 'aria-label': ariaLabel,\n title,\n grid = true,\n showAxis = true,\n tableFallback = true,\n showTableToggle,\n state,\n labels: labelsProp,\n className,\n}: ChartProps) {\n const t = useStrings().chart;\n const labels = { ...chartLabelsFromStrings(t), ...labelsProp };\n const all = resolveSeries(data, series);\n const longest = Math.max(...all.map((s) => s.data.length));\n const { min, range, ticks } = domain(all);\n const primary = all[0].data;\n\n return (\n <Frame\n caption={caption}\n ariaLabel={ariaLabel}\n title={title}\n all={all}\n height={height}\n width={width}\n className={className}\n showAxis={showAxis}\n ticks={ticks}\n xFirst={primary[0]}\n xLast={primary[primary.length - 1]}\n tableFallback={tableFallback}\n showTableToggle={showTableToggle}\n state={state}\n labels={labels}\n >\n {({ width: w, active, seriesProps }) => {\n const innerW = w - PAD * 2;\n const slot = innerW / Math.max(1, longest);\n const groupW = slot * 0.62;\n const barW = Math.max(2, groupW / all.length);\n const { sy } = scales(longest, w, height, min, range);\n // Bars grow from the zero line, so negatives hang below it.\n const zeroY = sy(Math.min(Math.max(0, min), min + range));\n return (\n <>\n {grid && <Grid width={w} height={height} lines={ticks.length - 1} />}\n {min < 0 && (\n <line\n aria-hidden\n x1={0}\n x2={w}\n y1={zeroY}\n y2={zeroY}\n stroke=\"var(--color-border-strong)\"\n strokeWidth={1}\n />\n )}\n {all.map((s, si) => (\n <g key={si} {...seriesProps(si)}>\n {s.data.map((d, i) => {\n if (!isNum(d.y)) return null;\n const yv = sy(d.y);\n const x = PAD + i * slot + (slot - groupW) / 2 + si * barW;\n const label = labels.point(s.name, d.x, d.y);\n const isActive = active?.series === si && active.index === i;\n return (\n <rect\n key={i}\n x={x}\n y={Math.min(zeroY, yv)}\n width={barW}\n height={Math.abs(zeroY - yv)}\n fill={colors[si % colors.length]}\n rx={2}\n data-active={isActive || undefined}\n className=\"transition-opacity hover:opacity-80\"\n >\n <title>{label}</title>\n </rect>\n );\n })}\n </g>\n ))}\n </>\n );\n }}\n </Frame>\n );\n}\n"],"names":["defaultChartLabels","name","count","min","max","lastX","lastY","x","y","chartLabelsFromStrings","t","formatString","DEFAULT_CHART_COLORS","FALLBACK_W","PAD","useMeasuredWidth","ref","useRef","width","setWidth","useState","useEffect","useLayoutEffect","el","update","ro","MAX_TICKS","abbreviateNumber","n","abs","fmt","v","s","niceStep","raw","base","f","niceTicks","maxTicks","step","lo","hi","ticks","resolveSeries","data","series","isNum","domain","all","includeZero","ys","d","rawMin","rawMax","scales","length","w","h","range","innerW","innerH","i","smoothPath","pts","p","p0","p1","p2","p3","c1x","c1y","c2x","c2y","segments","sx","sy","out","run","seriesName","describe","labels","last","Grid","height","lines","jsx","_","YAxis","XAxis","first","jsxs","DataTable","id","visible","longest","xs","_a","table","cn","si","_b","Frame","caption","ariaLabel","title","className","showAxis","xFirst","xLast","tableFallback","showTableToggle","state","children","useStrings","useId","captionId","titleId","descId","tableId","tableOpen","setTableOpen","plotRef","plotW","roving","useRovingPoints","tableRendered","stateNode","Skeleton","Fragment","active","setActive","announcement","setAnnouncement","announce","useCallback","idx","validIndices","idxs","e","pos","next","Point","color","label","always","LineChart","colors","grid","labelsProp","primary","seriesProps","segs","line","baseline","area","lastIdx","AreaChart","props","BarChart","slot","groupW","barW","zeroY","yv","isActive"],"mappings":";;;;;;;AA0DO,MAAMA,KAAkC;AAAA,EAC7C,SAAS,CAAC,EAAE,MAAAC,GAAM,OAAAC,GAAO,KAAAC,GAAK,KAAAC,GAAK,OAAAC,GAAO,OAAAC,EAAA,MACxC,GAAGL,CAAI,KAAKC,CAAK,gBAAgBC,CAAG,SAASC,CAAG,UAAUC,CAAK,KAAKC,CAAK;AAAA,EAC3E,OAAO,CAACL,GAAMM,GAAGC,MAAM,GAAGP,IAAO,GAAGA,CAAI,QAAQ,EAAE,GAAGM,CAAC,KAAKC,CAAC;AAAA,EAC5D,QAAQ,CAACP,GAAMC,MAAU,GAAGD,CAAI,KAAKC,CAAK;AAC5C;AAEA,SAASO,EAAuBC,GAAoC;AAClE,SAAO;AAAA,IACL,SAAS,CAAC,EAAE,MAAAT,GAAM,OAAAC,GAAO,KAAAC,GAAK,KAAAC,GAAK,OAAAC,GAAO,OAAAC,EAAA,MACxCK,EAAaD,EAAE,SAAS,EAAE,MAAAT,GAAM,OAAAC,GAAO,KAAAC,GAAK,KAAAC,GAAK,GAAGC,GAAO,GAAGC,GAAO;AAAA,IACvE,OAAO,CAACL,GAAMM,GAAGC,OAAOP,IAAO,GAAGA,CAAI,QAAQ,MAAMU,EAAaD,EAAE,OAAO,EAAE,GAAAH,GAAG,GAAAC,GAAG;AAAA,IAClF,QAAQ,CAACP,GAAMC,MAAUS,EAAaD,EAAE,WAAW,EAAE,MAAAT,GAAM,OAAAC,EAAA,CAAO;AAAA,EAAA;AAEtE;AAqCO,MAAMU,IAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAGMC,KAAa,KACbC,IAAM;AAGZ,SAASC,KAA0C;AACjD,QAAMC,IAAMC,GAAU,IAAI,GACpB,CAACC,GAAOC,CAAQ,IAAIC,EAAS,CAAC;AAEpC,UADe,OAAO,SAAW,MAAcC,KAAYC,IACpD,MAAM;AACX,UAAMC,IAAKP,EAAI;AACf,QAAI,CAACO,EAAI;AACT,UAAMC,IAAS,MAAML,EAASI,EAAG,WAAW;AAE5C,QADAC,EAAA,GACI,OAAO,iBAAmB,IAAa;AAC3C,UAAMC,IAAK,IAAI,eAAeD,CAAM;AACpC,WAAAC,EAAG,QAAQF,CAAE,GACN,MAAME,EAAG,WAAA;AAAA,EAClB,GAAG,CAAA,CAAE,GACE,EAAE,KAAAT,GAAK,OAAOE,KAASL,GAAA;AAChC;AACA,MAAMa,KAAY;AAGX,SAASC,GAAiBC,GAAmB;AAClD,QAAMC,IAAM,KAAK,IAAID,CAAC,GAChBE,IAAM,CAACC,GAAWC,MAAc,IAAI,KAAK,MAAMD,IAAI,EAAE,IAAI,IAAI,SAAA,CAAU,GAAGC,CAAC;AACjF,SAAIH,KAAO,MAAYC,EAAIF,IAAI,KAAK,GAAG,IACnCC,KAAO,MAAYC,EAAIF,IAAI,KAAK,GAAG,IACnCC,KAAO,MAAYC,EAAIF,IAAI,KAAK,GAAG,IAChC,OAAO,UAAUA,CAAC,IAAI,OAAOA,CAAC,KAAK,KAAK,MAAMA,IAAI,GAAG,IAAI,KAAK,SAAA;AACvE;AAGA,SAASK,GAASC,GAAqB;AACrC,MAAIA,KAAO,EAAG,QAAO;AAErB,QAAMC,IAAO,MADD,KAAK,MAAM,KAAK,MAAMD,CAAG,CAAC,GAEhCE,IAAIF,IAAMC;AAEhB,UADaC,KAAK,IAAI,IAAIA,KAAK,IAAI,IAAIA,KAAK,MAAM,MAAMA,KAAK,IAAI,IAAI,MACvDD;AAChB;AAMO,SAASE,GAAUlC,GAAaC,GAAakC,IAAWZ,IAAW;AACxE,EAAItB,MAAQD,MAAKC,IAAMD,IAAM;AAC7B,QAAMoC,IAAON,IAAU7B,IAAMD,KAAO,KAAK,IAAI,GAAGmC,IAAW,CAAC,CAAC,GACvDE,IAAK,KAAK,MAAMrC,IAAMoC,CAAI,IAAIA,GAC9BE,IAAK,KAAK,KAAKrC,IAAMmC,CAAI,IAAIA,GAC7BG,IAAkB,CAAA;AAExB,WAASX,IAAIU,GAAIV,KAAKS,IAAKD,IAAO,GAAGR,KAAKQ,EAAM,CAAAG,EAAM,KAAK,OAAOX,EAAE,QAAQ,EAAE,CAAC,CAAC;AAChF,SAAO,EAAE,KAAKS,GAAI,KAAKC,GAAI,OAAAC,EAAA;AAC7B;AAEA,SAASC,EAAcC,GAAqBC,GAAuC;AACjF,SAAIA,KAAUA,EAAO,SAAeA,IAC7B,CAAC,EAAE,MAAMD,KAAQ,CAAA,GAAI;AAC9B;AAEA,MAAME,IAAQ,CAACf,MAA8C,OAAOA,KAAM;AAE1E,SAASgB,EAAOC,GAAoBC,IAAc,IAAM;AACtD,QAAMC,IAAKF,EAAI,QAAQ,CAAChB,MAAMA,EAAE,KAAK,IAAI,CAACmB,MAAMA,EAAE,CAAC,EAAE,OAAOL,CAAK,CAAC,GAC5DM,IAASH,IAAc,KAAK,IAAI,GAAG,GAAGC,CAAE,IAAI,KAAK,IAAI,GAAGA,CAAE,GAC1DG,IAAS,KAAK,IAAI,GAAGH,GAAID,IAAc,IAAI,MAAS,GACpD,EAAE,KAAA9C,GAAK,KAAAC,GAAK,OAAAsC,EAAA,IAAUL;AAAA,IAC1B,OAAO,SAASe,CAAM,IAAIA,IAAS;AAAA,IACnCC,MAAW,SAAY,IAAIA;AAAA,EAAA;AAE7B,SAAO,EAAE,KAAAlD,GAAK,KAAAC,GAAK,OAAOA,IAAMD,KAAO,GAAG,OAAAuC,EAAA;AAC5C;AAEA,SAASY,EAAOC,GAAgBC,GAAWC,GAAWtD,GAAauD,GAAe;AAChF,QAAMC,IAASH,IAAI1C,IAAM,GACnB8C,IAASH,IAAI3C,IAAM;AAGzB,SAAO,EAAE,IAFE,CAAC+C,MAAeN,KAAU,IAAIzC,IAAM6C,IAAS,IAAI7C,IAAO+C,KAAKN,IAAS,KAAMI,GAE1E,IADF,CAAC5B,MAAcjB,IAAM8C,KAAW7B,IAAI5B,KAAOuD,IAASE,EAClD;AACf;AAGA,SAASE,EAAWC,GAAiC;AACnD,MAAIA,EAAI,WAAW,EAAG,QAAO;AAC7B,MAAIA,EAAI,SAAS,EAAG,QAAOA,EAAI,IAAI,CAACC,GAAGH,MAAM,GAAGA,IAAI,MAAM,GAAG,GAAGG,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AACxF,MAAIb,IAAI,IAAIY,EAAI,CAAC,EAAE,CAAC,CAAC,IAAIA,EAAI,CAAC,EAAE,CAAC,CAAC;AAClC,WAASF,IAAI,GAAGA,IAAIE,EAAI,SAAS,GAAGF,KAAK;AACvC,UAAMI,IAAKF,EAAIF,IAAI,CAAC,KAAKE,EAAIF,CAAC,GACxBK,IAAKH,EAAIF,CAAC,GACVM,IAAKJ,EAAIF,IAAI,CAAC,GACdO,IAAKL,EAAIF,IAAI,CAAC,KAAKM,GACnBE,IAAMH,EAAG,CAAC,KAAKC,EAAG,CAAC,IAAIF,EAAG,CAAC,KAAK,GAChCK,IAAMJ,EAAG,CAAC,KAAKC,EAAG,CAAC,IAAIF,EAAG,CAAC,KAAK,GAChCM,IAAMJ,EAAG,CAAC,KAAKC,EAAG,CAAC,IAAIF,EAAG,CAAC,KAAK,GAChCM,IAAML,EAAG,CAAC,KAAKC,EAAG,CAAC,IAAIF,EAAG,CAAC,KAAK;AACtC,IAAAf,KAAK,KAAKkB,EAAI,QAAQ,CAAC,CAAC,IAAIC,EAAI,QAAQ,CAAC,CAAC,IAAIC,EAAI,QAAQ,CAAC,CAAC,IAAIC,EAAI,QAAQ,CAAC,CAAC,IAAIL,EAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAIA,EAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACxH;AACA,SAAOhB;AACT;AAGA,SAASsB,GACP7B,GACA8B,GACAC,GACsB;AACtB,QAAMC,IAA4B,CAAA;AAClC,MAAIC,IAA0B,CAAA;AAC9B,SAAAjC,EAAK,QAAQ,CAACO,GAAG,MAAM;AACrB,IAAIL,EAAMK,EAAE,CAAC,MAAO,KAAK,CAACuB,EAAG,CAAC,GAAGC,EAAGxB,EAAE,CAAC,CAAC,CAAC,IAChC0B,EAAI,WACXD,EAAI,KAAKC,CAAG,GACZA,IAAM,CAAA;AAAA,EAEV,CAAC,GACGA,EAAI,UAAQD,EAAI,KAAKC,CAAG,GACrBD;AACT;AAEA,MAAME,IAAa,CAAC9C,GAAgB6B,GAAWnD,MAC7CsB,EAAE,QAAQrB,EAAaD,EAAE,QAAQ,EAAE,GAAGmD,IAAI,GAAG;AAG/C,SAASkB,GAAS/B,GAAoBtC,GAAuBsE,GAA6B;AACxF,SAAOhC,EACJ,IAAI,CAAChB,GAAG6B,MAAM;AACb,UAAMX,IAAKlB,EAAE,KAAK,IAAI,CAACmB,MAAMA,EAAE,CAAC,EAAE,OAAOL,CAAK,GACxC7C,IAAO6E,EAAW9C,GAAG6B,GAAGnD,CAAC;AAC/B,QAAI,CAACwC,EAAG,OAAQ,QAAO,GAAGjD,CAAI,KAAKS,EAAE,MAAM;AAC3C,UAAMuE,IAAO,CAAC,GAAGjD,EAAE,IAAI,EAAE,QAAA,EAAU,KAAK,CAACmB,MAAML,EAAMK,EAAE,CAAC,CAAC;AACzD,WAAO6B,EAAO,QAAQ;AAAA,MACpB,MAAA/E;AAAA,MACA,OAAOiD,EAAG;AAAA,MACV,KAAK,KAAK,IAAI,GAAGA,CAAE;AAAA,MACnB,KAAK,KAAK,IAAI,GAAGA,CAAE;AAAA,MACnB,OAAO+B,KAAA,gBAAAA,EAAM;AAAA,MACb,QAAOA,KAAA,gBAAAA,EAAM,MAAK;AAAA,IAAA,CACnB;AAAA,EACH,CAAC,EACA,KAAK,IAAI;AACd;AAEA,SAASC,GAAK,EAAE,OAAAhE,GAAO,QAAAiE,GAAQ,OAAAC,KAA2D;AACxF,QAAMxB,IAASuB,IAASrE,IAAM,GACxBc,IAAI,KAAK,IAAI,GAAGwD,CAAK;AAC3B,SACE,gBAAAC,EAAC,KAAA,EAAE,eAAW,IACX,UAAA,MAAM,KAAK,EAAE,QAAQzD,IAAI,EAAA,GAAK,CAAC0D,GAAG,MAAM;AACvC,UAAM9E,IAAIM,IAAO,IAAIc,IAAKgC;AAC1B,WACE,gBAAAyB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,IAAI;AAAA,QACJ,IAAInE;AAAA,QACJ,IAAIV;AAAA,QACJ,IAAIA;AAAA,QACJ,QAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,MAAA;AAAA,MAPJ;AAAA,IAAA;AAAA,EAUX,CAAC,EAAA,CACH;AAEJ;AAGA,SAAS+E,GAAM,EAAE,OAAA7C,KAA8B;AAC7C,SACE,gBAAA2C;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAW;AAAA,MACX,WAAU;AAAA,MAET,UAAA3C,EAAM,IAAI,CAAChC,GAAGmD,MACb,gBAAAwB,EAAC,QAAA,EAAa,WAAU,gBACrB,UAAA1D,GAAiBjB,CAAC,EAAA,GADVmD,CAEX,CACD;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAAS2B,GAAM,EAAE,OAAAC,GAAO,MAAAR,KAAmD;AACzE,SAAKQ,IAEH,gBAAAC,EAAC,OAAA,EAAI,eAAW,IAAC,WAAU,uDACzB,UAAA;AAAA,IAAA,gBAAAL,EAAC,QAAA,EAAM,UAAA,OAAOI,EAAM,CAAC,GAAE;AAAA,IACtBR,KAAQA,MAASQ,KAAS,gBAAAJ,EAAC,UAAM,UAAA,OAAOJ,EAAK,CAAC,EAAA,CAAE;AAAA,EAAA,GACnD,IALiB;AAOrB;AAEA,SAASU,GAAU;AAAA,EACjB,IAAAC;AAAA,EACA,KAAA5C;AAAA,EACA,MAAA/C;AAAA,EACA,SAAA4F;AAAA,EACA,GAAAnF;AACF,GAMG;;AACD,QAAMoF,IAAU,KAAK,IAAI,GAAG9C,EAAI,IAAI,CAAChB,MAAMA,EAAE,KAAK,MAAM,CAAC,GACnD+D,MAAKC,IAAAhD,EAAI,KAAK,CAAChB,MAAMA,EAAE,KAAK,WAAW8D,CAAO,MAAzC,gBAAAE,EAA4C,SAAQ,CAAA,GAGzDC,IACJ,gBAAAP;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAE;AAAA,MACA,oBAAgB;AAAA,MAChB,WAAWM,EAAGL,KAAW,6DAA6D;AAAA,MAEtF,UAAA;AAAA,QAAA,gBAAAR,EAAC,aAAQ,WAAWa,EAAGL,KAAW,uCAAuC,GACtE,UAAAlF,EAAaD,EAAE,cAAc,EAAE,MAAMT,KAAQ,IAAI,EAAE,QACtD;AAAA,QACA,gBAAAoF,EAAC,SAAA,EACC,UAAA,gBAAAK,EAAC,MAAA,EACC,UAAA;AAAA,UAAA,gBAAAL,EAAC,MAAA,EAAG,OAAM,OAAM,WAAWa,EAAGL,KAAW,8CAA8C,GAAG,UAAA,IAAA,CAE1F;AAAA,UACC7C,EAAI,IAAI,CAAChB,GAAG6B,MACX,gBAAAwB;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,OAAM;AAAA,cACN,WAAWa,EAAGL,KAAW,8CAA8C;AAAA,cAEtE,UAAAf,EAAW9C,GAAG6B,GAAGnD,CAAC;AAAA,YAAA;AAAA,YAJdmD;AAAA,UAAA,CAMR;AAAA,QAAA,EAAA,CACH,EAAA,CACF;AAAA,QACA,gBAAAwB,EAAC,WACE,UAAAU,EAAG,IAAI,CAAC/B,GAAGH,wBACT,MAAA,EACC,UAAA;AAAA,UAAA,gBAAAwB,EAAC,MAAA,EAAG,OAAM,OAAM,WAAWa,EAAGL,KAAW,yBAAyB,GAC/D,UAAA,OAAO7B,EAAE,CAAC,EAAA,CACb;AAAA,UACChB,EAAI,IAAI,CAAChB,GAAGmE,MAAA;;AACX,mCAAAd,EAAC,MAAA,EAAY,WAAWa,EAAGL,KAAW,aAAa,GAChD,UAAA/C,GAAMkD,IAAAhE,EAAE,KAAK6B,CAAC,MAAR,gBAAAmC,EAAW,CAAC,IAAI,QAAOI,IAAApE,EAAE,KAAK6B,CAAC,MAAR,gBAAAuC,EAAW,CAAC,IAAI,IAAA,GADvCD,CAET;AAAA,WACD;AAAA,QAAA,EAAA,GARMtC,CAST,CACD,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGJ,SAAOgC,IAAUI,IAAQ,gBAAAZ,EAAC,OAAA,EAAI,WAAU,WAAW,UAAAY,GAAM;AAC3D;AAEA,SAASI,GAAM;AAAA,EACb,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,KAAAxD;AAAA,EACA,QAAAmC;AAAA,EACA,OAAAjE;AAAA,EACA,WAAAuF;AAAA,EACA,UAAAC;AAAA,EACA,OAAAhE;AAAA,EACA,QAAAiE;AAAA,EACA,OAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAA/B;AAAA,EACA,UAAAgC;AACF,GAiBG;AACD,QAAMtG,IAAIuG,IAAa,OACjBrB,IAAKsB,GAAA,EAAQ,QAAQ,MAAM,EAAE,GAC7BC,IAAY,aAAavB,CAAE,IAC3BwB,IAAU,eAAexB,CAAE,IAC3ByB,IAAS,cAAczB,CAAE,IACzB0B,IAAU,eAAe1B,CAAE,IAC3B3F,IAAOsG,KAAaC,GACpB,CAACe,GAAWC,CAAY,IAAIpG,EAAS,EAAK,GAC1C,EAAE,KAAKqG,GAAS,OAAOC,EAAA,IAAU3G,GAAA,GACjC4G,IAASC,GAAgB5E,GAAKtC,GAAGsE,CAAM;AAE7C,EAAI,QAAQ,IAAI,aAAa,gBAAgB,CAAC/E,KAAQ,CAACqG,KACrD,QAAQ;AAAA,IACN;AAAA,EAAA;AAIJ,QAAMuB,KAAiBhB,KAAiBU,MAAc,CAACR,GAEjDe,IACJf,MAAU,YACR,gBAAArB,EAAC,SAAI,MAAK,UAAS,cAAYhF,EAAE,SAAS,OAAO,EAAE,QAAAyE,EAAA,GAAU,WAAU,UACrE,UAAA;AAAA,IAAA,gBAAAE,EAAC0C,MAAS,OAAO,EAAE,QAAA5C,KAAU,WAAU,UAAS;AAAA,IAChD,gBAAAE,EAAC,QAAA,EAAK,WAAU,WAAW,YAAE,QAAA,CAAQ;AAAA,EAAA,EAAA,CACvC,IACE0B,IACF,gBAAA1B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAM0B,MAAU,UAAU,UAAU;AAAA,MACpC,OAAO,EAAE,QAAA5B,EAAA;AAAA,MACT,WAAU;AAAA,MAET,UAAA4B,MAAU,UAAUrG,EAAE,QAAQA,EAAE;AAAA,IAAA;AAAA,EAAA,IAEjC;AAEN,SACE,gBAAAgF,EAAC,UAAA,EAAO,WAAWQ,EAAG,yBAAyBO,CAAS,GAAG,OAAO,EAAE,OAAAvF,EAAA,GACjE,UAAA;AAAA,IAAAoF,uBACE,cAAA,EAAW,IAAIa,GAAW,WAAU,iCAClC,UAAAb,GACH;AAAA,IAEDwB,KACC,gBAAApC,EAAAsC,GAAA,EACE,UAAA;AAAA,MAAA,gBAAAtC,EAAC,OAAA,EAAI,WAAU,QACZ,UAAA;AAAA,QAAAgB,KAAY,gBAAArB,EAACE,MAAM,OAAA7C,EAAA,CAAc;AAAA,QAElC,gBAAA2C,EAAC,OAAA,EAAI,KAAKoC,GAAS,WAAU,kBAE3B,UAAA,gBAAA/B;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,OAAOgC,CAAK,IAAIvC,CAAM;AAAA,YAC/B,OAAOuC;AAAA,YACP,QAAAvC;AAAA,YACA,MAAK;AAAA,YACL,mBAAiBmB,IAAUa,IAAYlH,IAAOmH,IAAU;AAAA,YACxD,oBAAkBC;AAAA,YAClB,WAAU;AAAA,YAET,UAAA;AAAA,cAAApH,KAAQ,gBAAAoF,EAAC,SAAA,EAAM,IAAI+B,GAAU,UAAAnH,GAAK;AAAA,cACnC,gBAAAoF,EAAC,UAAK,IAAIgC,GAAS,aAASrE,GAAKtC,GAAGsE,CAAM,GAAE;AAAA,cAC3CgC,EAAS,EAAE,OAAOU,GAAO,GAAGC,GAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,EACvC,CACF;AAAA,MAAA,GACF;AAAA,MACCjB,KAAY,gBAAArB,EAACG,IAAA,EAAM,OAAOmB,GAAQ,MAAMC,GAAO;AAAA,MAChD,gBAAAvB,EAAC,UAAK,WAAU,WAAU,aAAU,UAAS,eAAY,QACtD,UAAAsC,EAAO,aAAA,CACV;AAAA,IAAA,GACF;AAAA,IAEDb,KAAmB,CAACC,KACnB,gBAAA1B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAMmC,EAAa,CAACzF,MAAM,CAACA,CAAC;AAAA,QACrC,iBAAewF;AAAA,QACf,iBAAeM,IAAgBP,IAAU;AAAA,QACzC,WAAWpB;AAAA,UACT;AAAA,UACA;AAAA,QAAA;AAAA,QAGD,UAAAqB,IAAY7G,EAAE,YAAYA,EAAE;AAAA,MAAA;AAAA,IAAA;AAAA,IAGhCmH,KACC,gBAAAxC;AAAA,MAACM;AAAA,MAAA;AAAA,QACC,IAAI2B;AAAA,QACJ,KAAAtE;AAAA,QACA,MAAM/C,MAAS,OAAOqG,KAAY,WAAWA,IAAU;AAAA,QACvD,SAASiB;AAAA,QACT,GAAA7G;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ;AAsBA,SAASkH,GAAgB5E,GAAoBtC,GAAuBsE,GAAqB;AACvF,QAAM,CAACiD,GAAQC,CAAS,IAAI9G,EAAmD,IAAI,GAC7E,CAAC+G,GAAcC,CAAe,IAAIhH,EAAS,EAAE,GAE7CiH,IAAWC;AAAA,IACf,CAACnC,GAAYoC,MAAgB;AAC3B,YAAMvG,IAAIgB,EAAImD,CAAE,GACVhD,IAAInB,KAAA,gBAAAA,EAAG,KAAKuG;AAClB,MAAI,CAACpF,KAAK,CAACL,EAAMK,EAAE,CAAC,MACpB+E,EAAU,EAAE,QAAQ/B,GAAI,OAAOoC,GAAK,GACpCH,EAAgBpD,EAAO,MAAMhD,EAAE,MAAMmB,EAAE,GAAGA,EAAE,CAAC,CAAC;AAAA,IAChD;AAAA,IACA,CAACH,GAAKgC,CAAM;AAAA,EAAA,GAGRwD,IAAe,CAACrC,MACpBnD,EAAImD,CAAE,EAAE,KAAK,IAAI,CAAC,GAAGtC,MAAOf,EAAM,EAAE,CAAC,IAAIe,IAAI,EAAG,EAAE,OAAO,CAACA,MAAMA,KAAK,CAAC;AAmCxE,SAAO,EAAE,QAAAoE,GAAQ,cAAAE,GAAc,aAjCX,CAAChC,OAAgB;AAAA,IACnC,UAAU;AAAA,IACV,MAAM;AAAA,IACN,cAAcnB,EAAO,OAAOF,EAAW9B,EAAImD,CAAE,GAAGA,GAAIzF,CAAC,GAAG8H,EAAarC,CAAE,EAAE,MAAM;AAAA;AAAA;AAAA,IAG/E,qBAAqB;AAAA,IACrB,WAAWD;AAAA,MACT;AAAA,IAAA;AAAA,IAEF,SAAS,MAAM;AACb,YAAMuC,IAAOD,EAAarC,CAAE;AAC5B,MAAIsC,EAAK,UAAQJ,EAASlC,IAAI8B,KAAA,gBAAAA,EAAQ,YAAW9B,IAAK8B,EAAO,QAAQQ,EAAKA,EAAK,SAAS,CAAC,CAAC;AAAA,IAC5F;AAAA,IACA,QAAQ,MAAM;AACZ,MAAAP,EAAU,IAAI,GACdE,EAAgB,EAAE;AAAA,IACpB;AAAA,IACA,WAAW,CAACM,MAAkC;AAC5C,YAAMD,IAAOD,EAAarC,CAAE;AAC5B,UAAI,CAACsC,EAAK,OAAQ;AAClB,YAAME,KAAMV,KAAA,gBAAAA,EAAQ,YAAW9B,IAAKsC,EAAK,QAAQR,EAAO,KAAK,IAAIQ,EAAK,SAAS;AAC/E,UAAIG,IAAOD;AACX,UAAID,EAAE,QAAQ,gBAAgBA,EAAE,QAAQ,UAAW,CAAAE,IAAO,KAAK,IAAIH,EAAK,SAAS,GAAGE,IAAM,CAAC;AAAA,eAClFD,EAAE,QAAQ,eAAeA,EAAE,QAAQ,YAAa,CAAAE,IAAO,KAAK,IAAI,GAAGD,IAAM,CAAC;AAAA,eAC1ED,EAAE,QAAQ,OAAQ,CAAAE,IAAO;AAAA,eACzBF,EAAE,QAAQ,MAAO,CAAAE,IAAOH,EAAK,SAAS;AAAA,UAC1C;AACL,MAAAC,EAAE,eAAA,GACFL,EAASlC,GAAIsC,EAAKG,CAAI,CAAC;AAAA,IACzB;AAAA,EAAA,GAG6B;AACjC;AAGA,SAASC,GAAM;AAAA,EACb,GAAAtI;AAAA,EACA,GAAAC;AAAA,EACA,OAAAsI;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAf;AACF,GAOG;AACD,SACE,gBAAA5C;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAI9E;AAAA,MACJ,IAAIC;AAAA,MACJ,GAAG;AAAA,MACH,MAAMsI;AAAA,MACN,eAAab,KAAU;AAAA,MACvB,WAAW/B,EAAG,CAAC8C,KAAU,CAACf,KAAU,6BAA6B;AAAA,MAEjE,UAAA,gBAAA5C,EAAC,WAAO,UAAA0D,EAAA,CAAM;AAAA,IAAA;AAAA,EAAA;AAGpB;AAEO,SAASE,GAAU;AAAA,EACxB,MAAArG;AAAA,EACA,QAAAC;AAAA,EACA,QAAAqG,IAAStI;AAAA,EACT,QAAAuE,IAAS;AAAA,EACT,OAAAjE,IAAQ;AAAA,EACR,SAAAoF;AAAA,EACA,cAAcC;AAAA,EACd,OAAAC;AAAA,EACA,MAAA2C,IAAO;AAAA,EACP,UAAAzC,IAAW;AAAA,EACX,eAAAG,IAAgB;AAAA,EAChB,iBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAQqC;AAAA,EACR,WAAA3C;AACF,GAAe;AACb,QAAM/F,IAAIuG,IAAa,OACjBjC,IAAS,EAAE,GAAGvE,EAAuBC,CAAC,GAAG,GAAG0I,EAAA,GAC5CpG,IAAML,EAAcC,GAAMC,CAAM,GAChC,EAAE,KAAA1C,GAAK,OAAAuD,GAAO,OAAAhB,EAAA,IAAUK,EAAOC,CAAG,GAClC8C,IAAU,KAAK,IAAI,GAAG9C,EAAI,IAAI,CAAChB,MAAMA,EAAE,KAAK,MAAM,CAAC,GACnDqH,IAAUrG,EAAI,CAAC,EAAE;AAEvB,SACE,gBAAAqC;AAAA,IAACgB;AAAA,IAAA;AAAA,MACC,SAAAC;AAAA,MACA,WAAAC;AAAA,MACA,OAAAC;AAAA,MACA,KAAAxD;AAAA,MACA,QAAAmC;AAAA,MACA,OAAAjE;AAAA,MACA,WAAAuF;AAAA,MACA,UAAAC;AAAA,MACA,OAAAhE;AAAA,MACA,QAAQ2G,EAAQ,CAAC;AAAA,MACjB,OAAOA,EAAQA,EAAQ,SAAS,CAAC;AAAA,MACjC,eAAAxC;AAAA,MACA,iBAAAC;AAAA,MACA,OAAAC;AAAA,MACA,QAAA/B;AAAA,MAEC,WAAC,EAAE,OAAOxB,GAAG,QAAAyE,GAAQ,aAAAqB,EAAA,MACpB,gBAAA5D,EAAAsC,GAAA,EACG,UAAA;AAAA,QAAAmB,KAAQ,gBAAA9D,EAACH,MAAK,OAAO1B,GAAG,QAAA2B,GAAgB,OAAOzC,EAAM,SAAS,EAAA,CAAG;AAAA,QACjEM,EAAI,IAAI,CAAChB,GAAGmE,MAAO;AAClB,gBAAM2C,IAAQI,EAAO/C,IAAK+C,EAAO,MAAM,GACjC,EAAE,IAAAxE,GAAI,IAAAC,EAAA,IAAOrB,EAAOwC,GAAStC,GAAG2B,GAAQhF,GAAKuD,CAAK,GAClD6F,IAAO9E,GAASzC,EAAE,MAAM0C,GAAIC,CAAE,GAC9B6E,IAAOD,EAAK,IAAIzF,CAAU,EAAE,KAAK,GAAG,GACpC2F,IAAW9E,EAAG,KAAK,IAAIxE,GAAK,CAAC,CAAC,GAC9BuJ,IAAOH,EACV;AAAA,YACC,CAACxF,MACC,GAAGD,EAAWC,CAAG,CAAC,KAAKA,EAAIA,EAAI,SAAS,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI0F,EAAS,QAAQ,CAAC,CAAC,KAAK1F,EAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI0F,EAAS,QAAQ,CAAC,CAAC;AAAA,UAAA,EAElI,KAAK,GAAG,GACLE,IAAU3H,EAAE,KAAK,IAAI,CAACmB,MAAML,EAAMK,EAAE,CAAC,CAAC,EAAE,YAAY,EAAI;AAC9D,iBACE,gBAAAuC,EAAC,KAAA,EAAY,GAAG4D,EAAYnD,CAAE,GAC3B,UAAA;AAAA,YAAAuD,uBAAS,QAAA,EAAK,GAAGA,GAAM,MAAMZ,GAAO,aAAa,MAAM;AAAA,YACxD,gBAAAzD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,GAAGmE;AAAA,gBACH,MAAK;AAAA,gBACL,QAAQV;AAAA,gBACR,aAAa;AAAA,gBACb,eAAc;AAAA,gBACd,gBAAe;AAAA,cAAA;AAAA,YAAA;AAAA,YAEhB9G,EAAE,KAAK;AAAA,cAAI,CAACmB,GAAGU,MACdf,EAAMK,EAAE,CAAC,IACP,gBAAAkC;AAAA,gBAACwD;AAAA,gBAAA;AAAA,kBAEC,GAAGnE,EAAGb,CAAC;AAAA,kBACP,GAAGc,EAAGxB,EAAE,CAAC;AAAA,kBACT,OAAA2F;AAAA,kBACA,QAAQjF,MAAM8F;AAAA,kBACd,SAAQ1B,KAAA,gBAAAA,EAAQ,YAAW9B,KAAM8B,EAAO,UAAUpE;AAAA,kBAClD,OAAOmB,EAAO,MAAMhD,EAAE,MAAMmB,EAAE,GAAGA,EAAE,CAAC;AAAA,gBAAA;AAAA,gBAN/BU;AAAA,cAAA,IAQL;AAAA,YAAA;AAAA,UACN,EAAA,GAtBMsC,CAuBR;AAAA,QAEJ,CAAC;AAAA,MAAA,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAIR;AAEO,SAASyD,GAAUC,GAAmB;AAE3C,SAAO,gBAAAxE,EAAC4D,IAAA,EAAW,GAAGY,EAAA,CAAO;AAC/B;AAEO,SAASC,GAAS;AAAA,EACvB,MAAAlH;AAAA,EACA,QAAAC;AAAA,EACA,QAAAqG,IAAStI;AAAA,EACT,QAAAuE,IAAS;AAAA,EACT,OAAAjE,IAAQ;AAAA,EACR,SAAAoF;AAAA,EACA,cAAcC;AAAA,EACd,OAAAC;AAAA,EACA,MAAA2C,IAAO;AAAA,EACP,UAAAzC,IAAW;AAAA,EACX,eAAAG,IAAgB;AAAA,EAChB,iBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAQqC;AAAA,EACR,WAAA3C;AACF,GAAe;AACb,QAAM/F,IAAIuG,IAAa,OACjBjC,IAAS,EAAE,GAAGvE,EAAuBC,CAAC,GAAG,GAAG0I,EAAA,GAC5CpG,IAAML,EAAcC,GAAMC,CAAM,GAChCiD,IAAU,KAAK,IAAI,GAAG9C,EAAI,IAAI,CAAChB,MAAMA,EAAE,KAAK,MAAM,CAAC,GACnD,EAAE,KAAA7B,GAAK,OAAAuD,GAAO,OAAAhB,EAAA,IAAUK,EAAOC,CAAG,GAClCqG,IAAUrG,EAAI,CAAC,EAAE;AAEvB,SACE,gBAAAqC;AAAA,IAACgB;AAAA,IAAA;AAAA,MACC,SAAAC;AAAA,MACA,WAAAC;AAAA,MACA,OAAAC;AAAA,MACA,KAAAxD;AAAA,MACA,QAAAmC;AAAA,MACA,OAAAjE;AAAA,MACA,WAAAuF;AAAA,MACA,UAAAC;AAAA,MACA,OAAAhE;AAAA,MACA,QAAQ2G,EAAQ,CAAC;AAAA,MACjB,OAAOA,EAAQA,EAAQ,SAAS,CAAC;AAAA,MACjC,eAAAxC;AAAA,MACA,iBAAAC;AAAA,MACA,OAAAC;AAAA,MACA,QAAA/B;AAAA,MAEC,WAAC,EAAE,OAAOxB,GAAG,QAAAyE,GAAQ,aAAAqB,QAAkB;AAEtC,cAAMS,KADSvG,IAAI1C,IAAM,KACH,KAAK,IAAI,GAAGgF,CAAO,GACnCkE,IAASD,IAAO,MAChBE,IAAO,KAAK,IAAI,GAAGD,IAAShH,EAAI,MAAM,GACtC,EAAE,IAAA2B,MAAOrB,EAAOwC,GAAStC,GAAG2B,GAAQhF,GAAKuD,CAAK,GAE9CwG,IAAQvF,EAAG,KAAK,IAAI,KAAK,IAAI,GAAGxE,CAAG,GAAGA,IAAMuD,CAAK,CAAC;AACxD,eACE,gBAAAgC,EAAAsC,GAAA,EACG,UAAA;AAAA,UAAAmB,KAAQ,gBAAA9D,EAACH,MAAK,OAAO1B,GAAG,QAAA2B,GAAgB,OAAOzC,EAAM,SAAS,EAAA,CAAG;AAAA,UACjEvC,IAAM,KACL,gBAAAkF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,eAAW;AAAA,cACX,IAAI;AAAA,cACJ,IAAI7B;AAAA,cACJ,IAAI0G;AAAA,cACJ,IAAIA;AAAA,cACJ,QAAO;AAAA,cACP,aAAa;AAAA,YAAA;AAAA,UAAA;AAAA,UAGhBlH,EAAI,IAAI,CAAChB,GAAGmE,wBACV,KAAA,EAAY,GAAGmD,EAAYnD,CAAE,GAC3B,UAAAnE,EAAE,KAAK,IAAI,CAACmB,GAAGU,MAAM;AACpB,gBAAI,CAACf,EAAMK,EAAE,CAAC,EAAG,QAAO;AACxB,kBAAMgH,IAAKxF,EAAGxB,EAAE,CAAC,GACX5C,IAAIO,IAAM+C,IAAIkG,KAAQA,IAAOC,KAAU,IAAI7D,IAAK8D,GAChDlB,KAAQ/D,EAAO,MAAMhD,EAAE,MAAMmB,EAAE,GAAGA,EAAE,CAAC,GACrCiH,MAAWnC,KAAA,gBAAAA,EAAQ,YAAW9B,KAAM8B,EAAO,UAAUpE;AAC3D,mBACE,gBAAAwB;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,GAAA9E;AAAA,gBACA,GAAG,KAAK,IAAI2J,GAAOC,CAAE;AAAA,gBACrB,OAAOF;AAAA,gBACP,QAAQ,KAAK,IAAIC,IAAQC,CAAE;AAAA,gBAC3B,MAAMjB,EAAO/C,IAAK+C,EAAO,MAAM;AAAA,gBAC/B,IAAI;AAAA,gBACJ,eAAakB,MAAY;AAAA,gBACzB,WAAU;AAAA,gBAEV,UAAA,gBAAA/E,EAAC,WAAO,UAAA0D,GAAA,CAAM;AAAA,cAAA;AAAA,cAVTlF;AAAA,YAAA;AAAA,UAaX,CAAC,EAAA,GAtBKsC,CAuBR,CACD;AAAA,QAAA,GACH;AAAA,MAEJ;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -1,56 +1,70 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsxs as
|
|
3
|
-
import { forwardRef as
|
|
2
|
+
import { jsxs as s, jsx as e } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as N, useId as y } from "react";
|
|
4
4
|
import * as m from "@radix-ui/react-checkbox";
|
|
5
|
-
import { Minus as
|
|
6
|
-
import { cn as
|
|
7
|
-
const
|
|
8
|
-
function({
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
import { Minus as j, Check as C } from "../../icons/index.js";
|
|
6
|
+
import { cn as o } from "../../lib/utils.js";
|
|
7
|
+
const I = N(
|
|
8
|
+
function({
|
|
9
|
+
className: u,
|
|
10
|
+
label: c,
|
|
11
|
+
description: a,
|
|
12
|
+
error: t,
|
|
13
|
+
hideLabel: b,
|
|
14
|
+
id: x,
|
|
15
|
+
disabled: n,
|
|
16
|
+
"aria-describedby": h,
|
|
17
|
+
"aria-invalid": i,
|
|
18
|
+
...d
|
|
19
|
+
}, g) {
|
|
20
|
+
const v = y(), r = x ?? v, l = a ? `${r}-desc` : void 0, f = t ? `${r}-error` : void 0, k = [f, l, h].filter(Boolean).join(" ") || void 0, p = !!t || i === !0 || i === "true";
|
|
21
|
+
return /* @__PURE__ */ s("div", { className: o("flex flex-col gap-1", u), children: [
|
|
22
|
+
/* @__PURE__ */ s("div", { className: "flex items-start gap-2.5", children: [
|
|
12
23
|
/* @__PURE__ */ e(
|
|
13
24
|
m.Root,
|
|
14
25
|
{
|
|
15
|
-
ref:
|
|
16
|
-
id:
|
|
17
|
-
disabled:
|
|
18
|
-
"aria-describedby":
|
|
19
|
-
"aria-invalid":
|
|
20
|
-
className:
|
|
21
|
-
"peer mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-sm border",
|
|
26
|
+
ref: g,
|
|
27
|
+
id: r,
|
|
28
|
+
disabled: n,
|
|
29
|
+
"aria-describedby": k,
|
|
30
|
+
"aria-invalid": p ? !0 : i,
|
|
31
|
+
className: o(
|
|
32
|
+
"peer relative mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-sm border",
|
|
33
|
+
// WCAG 2.5.8: 16px visual box, ≥24px hit area via an invisible inset halo.
|
|
34
|
+
'before:absolute before:-inset-1.5 before:content-[""]',
|
|
22
35
|
"transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]",
|
|
23
|
-
"
|
|
36
|
+
"focus-visible:ring-ring focus-visible:ring-offset-background outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
|
|
24
37
|
"data-[state=checked]:bg-accent data-[state=checked]:border-accent data-[state=checked]:text-on-accent",
|
|
25
38
|
"data-[state=indeterminate]:bg-accent data-[state=indeterminate]:border-accent data-[state=indeterminate]:text-on-accent",
|
|
26
39
|
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
27
|
-
|
|
40
|
+
"border-border-input aria-invalid:border-danger"
|
|
28
41
|
),
|
|
29
42
|
...d,
|
|
30
|
-
children: /* @__PURE__ */ e(m.Indicator, { className: "flex items-center justify-center", children: d.checked === "indeterminate" ? /* @__PURE__ */ e(
|
|
43
|
+
children: /* @__PURE__ */ e(m.Indicator, { className: "flex items-center justify-center", children: d.checked === "indeterminate" ? /* @__PURE__ */ e(j, { className: "size-3", "aria-hidden": !0, strokeWidth: 3 }) : /* @__PURE__ */ e(C, { className: "size-3", "aria-hidden": !0, strokeWidth: 3 }) })
|
|
31
44
|
}
|
|
32
45
|
),
|
|
33
|
-
c && /* @__PURE__ */
|
|
46
|
+
c && /* @__PURE__ */ s("div", { className: "flex flex-col gap-0.5", children: [
|
|
34
47
|
/* @__PURE__ */ e(
|
|
35
48
|
"label",
|
|
36
49
|
{
|
|
37
|
-
htmlFor:
|
|
38
|
-
className:
|
|
39
|
-
"text-
|
|
40
|
-
|
|
50
|
+
htmlFor: r,
|
|
51
|
+
className: o(
|
|
52
|
+
"text-foreground text-sm select-none",
|
|
53
|
+
n && "cursor-not-allowed opacity-50",
|
|
54
|
+
b && "sr-only"
|
|
41
55
|
),
|
|
42
56
|
children: c
|
|
43
57
|
}
|
|
44
58
|
),
|
|
45
|
-
|
|
59
|
+
a && /* @__PURE__ */ e("p", { id: l, className: "text-foreground-subtle text-xs", children: a })
|
|
46
60
|
] })
|
|
47
61
|
] }),
|
|
48
|
-
t && /* @__PURE__ */ e("p", { id:
|
|
62
|
+
t && /* @__PURE__ */ e("p", { id: f, className: "text-danger-text text-xs", children: t })
|
|
49
63
|
] });
|
|
50
64
|
}
|
|
51
65
|
);
|
|
52
|
-
|
|
66
|
+
I.displayName = "Checkbox";
|
|
53
67
|
export {
|
|
54
|
-
|
|
68
|
+
I as Checkbox
|
|
55
69
|
};
|
|
56
70
|
//# sourceMappingURL=Checkbox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.js","sources":["../../../src/components/ui/Checkbox.tsx"],"sourcesContent":["'use client';\n\nimport {
|
|
1
|
+
{"version":3,"file":"Checkbox.js","sources":["../../../src/components/ui/Checkbox.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n useId,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type ReactNode,\n} from 'react';\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox';\nimport { Check, Minus } from '@/icons';\nimport { cn } from '@/lib/utils';\n\nexport interface CheckboxProps extends Omit<\n ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>,\n 'asChild'\n> {\n /** Visible label rendered to the right of the box. */\n label?: ReactNode;\n /** Secondary description rendered below the label. */\n description?: ReactNode;\n /** Validation error message. */\n error?: ReactNode;\n /** Hide the label visually while keeping it in the a11y tree. */\n hideLabel?: boolean;\n}\n\n/**\n * Checkbox with optional inline label + description. Pass `checked=\"indeterminate\"`\n * for the indeterminate state — Radix renders a `Minus` icon automatically.\n *\n * @example Single\n * <Checkbox label=\"I agree to the terms\" checked={ok} onCheckedChange={setOk} />\n *\n * @example Tri-state header\n * <Checkbox aria-label=\"Select all\"\n * checked={allSelected ? true : someSelected ? 'indeterminate' : false}\n * onCheckedChange={toggleAll} />\n *\n * @do Use indeterminate to summarise child rows in a table header.\n * @dont Use a Checkbox for mutually exclusive choices — use RadioGroup.\n */\nexport const Checkbox = forwardRef<ElementRef<typeof CheckboxPrimitive.Root>, CheckboxProps>(\n function Checkbox(\n {\n className,\n label,\n description,\n error,\n hideLabel,\n id,\n disabled,\n 'aria-describedby': ariaDescribedby,\n 'aria-invalid': ariaInvalid,\n ...props\n },\n ref,\n ) {\n const autoId = useId();\n const fieldId = id ?? autoId;\n const descId = description ? `${fieldId}-desc` : undefined;\n const errorId = error ? `${fieldId}-error` : undefined;\n const describedBy = [errorId, descId, ariaDescribedby].filter(Boolean).join(' ') || undefined;\n const isError = Boolean(error) || ariaInvalid === true || ariaInvalid === 'true';\n\n return (\n <div className={cn('flex flex-col gap-1', className)}>\n <div className=\"flex items-start gap-2.5\">\n <CheckboxPrimitive.Root\n ref={ref}\n id={fieldId}\n disabled={disabled}\n aria-describedby={describedBy}\n aria-invalid={isError ? true : ariaInvalid}\n className={cn(\n 'peer relative mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-sm border',\n // WCAG 2.5.8: 16px visual box, ≥24px hit area via an invisible inset halo.\n 'before:absolute before:-inset-1.5 before:content-[\"\"]',\n 'transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]',\n 'focus-visible:ring-ring focus-visible:ring-offset-background outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n 'data-[state=checked]:bg-accent data-[state=checked]:border-accent data-[state=checked]:text-on-accent',\n 'data-[state=indeterminate]:bg-accent data-[state=indeterminate]:border-accent data-[state=indeterminate]:text-on-accent',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'border-border-input aria-invalid:border-danger',\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center\">\n {props.checked === 'indeterminate' ? (\n <Minus className=\"size-3\" aria-hidden strokeWidth={3} />\n ) : (\n <Check className=\"size-3\" aria-hidden strokeWidth={3} />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n\n {label && (\n <div className=\"flex flex-col gap-0.5\">\n <label\n htmlFor={fieldId}\n className={cn(\n 'text-foreground text-sm select-none',\n disabled && 'cursor-not-allowed opacity-50',\n hideLabel && 'sr-only',\n )}\n >\n {label}\n </label>\n {description && (\n <p id={descId} className=\"text-foreground-subtle text-xs\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n {error && (\n <p id={errorId} className=\"text-danger-text text-xs\">\n {error}\n </p>\n )}\n </div>\n );\n },\n);\n\nCheckbox.displayName = 'Checkbox';\n"],"names":["Checkbox","forwardRef","className","label","description","error","hideLabel","id","disabled","ariaDescribedby","ariaInvalid","props","ref","autoId","useId","fieldId","descId","errorId","describedBy","isError","cn","jsxs","jsx","CheckboxPrimitive","Minus","Check"],"mappings":";;;;;;AA0CO,MAAMA,IAAWC;AAAA,EACtB,SACE;AAAA,IACE,WAAAC;AAAA,IACA,OAAAC;AAAA,IACA,aAAAC;AAAA,IACA,OAAAC;AAAA,IACA,WAAAC;AAAA,IACA,IAAAC;AAAA,IACA,UAAAC;AAAA,IACA,oBAAoBC;AAAA,IACpB,gBAAgBC;AAAA,IAChB,GAAGC;AAAA,EAAA,GAELC,GACA;AACA,UAAMC,IAASC,EAAA,GACTC,IAAUR,KAAMM,GAChBG,IAASZ,IAAc,GAAGW,CAAO,UAAU,QAC3CE,IAAUZ,IAAQ,GAAGU,CAAO,WAAW,QACvCG,IAAc,CAACD,GAASD,GAAQP,CAAe,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK,QAC9EU,IAAU,EAAQd,KAAUK,MAAgB,MAAQA,MAAgB;AAE1E,6BACG,OAAA,EAAI,WAAWU,EAAG,uBAAuBlB,CAAS,GACjD,UAAA;AAAA,MAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,QAAA,gBAAAC;AAAA,UAACC,EAAkB;AAAA,UAAlB;AAAA,YACC,KAAAX;AAAA,YACA,IAAIG;AAAA,YACJ,UAAAP;AAAA,YACA,oBAAkBU;AAAA,YAClB,gBAAcC,IAAU,KAAOT;AAAA,YAC/B,WAAWU;AAAA,cACT;AAAA;AAAA,cAEA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,YAED,GAAGT;AAAA,YAEJ,UAAA,gBAAAW,EAACC,EAAkB,WAAlB,EAA4B,WAAU,oCACpC,UAAAZ,EAAM,YAAY,kBACjB,gBAAAW,EAACE,GAAA,EAAM,WAAU,UAAS,eAAW,IAAC,aAAa,EAAA,CAAG,IAEtD,gBAAAF,EAACG,GAAA,EAAM,WAAU,UAAS,eAAW,IAAC,aAAa,EAAA,CAAG,EAAA,CAE1D;AAAA,UAAA;AAAA,QAAA;AAAA,QAGDtB,KACC,gBAAAkB,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASP;AAAA,cACT,WAAWK;AAAA,gBACT;AAAA,gBACAZ,KAAY;AAAA,gBACZF,KAAa;AAAA,cAAA;AAAA,cAGd,UAAAH;AAAA,YAAA;AAAA,UAAA;AAAA,UAEFC,KACC,gBAAAkB,EAAC,KAAA,EAAE,IAAIN,GAAQ,WAAU,kCACtB,UAAAZ,EAAA,CACH;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,GAEJ;AAAA,MACCC,KACC,gBAAAiB,EAAC,KAAA,EAAE,IAAIL,GAAS,WAAU,4BACvB,UAAAZ,EAAA,CACH;AAAA,IAAA,GAEJ;AAAA,EAEJ;AACF;AAEAL,EAAS,cAAc;"}
|
|
@@ -34,6 +34,8 @@ export interface ComboboxProps {
|
|
|
34
34
|
searchPlaceholder?: string;
|
|
35
35
|
/** Empty state copy when nothing matches. */
|
|
36
36
|
emptyText?: string;
|
|
37
|
+
/** Message shown when `loadOptions` rejects. */
|
|
38
|
+
loadErrorText?: string;
|
|
37
39
|
/** Allow clearing the selection with an inline ×. */
|
|
38
40
|
clearable?: boolean;
|
|
39
41
|
/** Disable the entire field. */
|