artefact-design-system 0.1.0 → 0.3.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.
@@ -48,7 +48,7 @@
48
48
  - `[data-slot="button"]`/`[data-slot="input"]`/`[data-slot="select-trigger"]` — высота/радиус пересчитаны в `brand-overrides.css` (см. `DESIGN.md` → Components).
49
49
  - Если конкретному месту нужно другое поведение (например, `Select`, который умеет очищаться крестиком) — это уже не «просто shadcn Select», это новый Components-тир композит (см. `FilterSelect` ниже), а не проп на самом `Select`.
50
50
 
51
- **⚠️ `Sparkline`/`ScoreRing` — не компоненты.** Демонстрационный код в `src/stories/Chart.stories.tsx` показывает, что Recharts+`ChartContainer` покрывает то, что раньше было кастомным SVG (mini-график, круговой индикатор прогресса). Ничего не экспортируется если понадобится настоящий спарклайн-компонент, его нужно сначала выделить в реальный файл.
51
+ `recharts` — реальная, объявленная зависимость этого пакета (не только внутренняя деталь реализации чартов ниже). Если для какой-то задачи не хватает ни одного из готовых чарт-компонентов можно писать напрямую на `recharts`, но объявляй его явной зависимостью в своём `package.json`, не рассчитывай, что он долетит транзитивно через хойстинг node_modules (он долетает сегодня, но это случайность конкретного дерева зависимостей, не гарантия).
52
52
 
53
53
  ## Components
54
54
 
@@ -68,7 +68,11 @@ Primitives + Foundation, собранные в конкретную повтор
68
68
  | `Search` | `placeholder?, value?, onChange?, className?` | `InputGroup` (shadcn) + `Icon` как leading addon. Всегда для полей поиска — не собирай Input + абсолютно-позиционированную иконку вручную. |
69
69
  | `BarChart` / `LineChart` / `AreaChart` | `data, xKey, series: {key,label,color}[], height?, showLegend?` (+`stacked?` у Area) | Настоящий Recharts через shadcn's `ChartContainer`. `showLegend` по умолчанию `series.length > 1`. Grid/оси — `color.input`, никогда `color.border` (тот прозрачный по правилу). |
70
70
  | `DonutChart` | `data: {key,label,value,color}[], height?, showLegend?` | Категориальная разбивка (Pie, `innerRadius:"60%"`). |
71
- | `DistributionChart` | `groups: {name,total,segments:{label,count,widthPct}[]}[], rowHeight?` | Горизонтальный stacked-bar на группу; если сегменты не сумма в 100% — остаток дорисовывается приглушённым `rest`. Заменил старый самописный `SegmentedBar` (визуально выглядел дешевле настоящих чартов). |
71
+ | `DistributionChart` | `groups: {name,total,segments:{label,count,widthPct}[]}[], rowHeight?` | Горизонтальный stacked-bar на группу; если сегменты не сумма в 100% — остаток дорисовывается приглушённым `rest`. |
72
+ | `ScatterChart` | `series: {key,label,color,data:{x,y}[]}[], xLabel?, yLabel?, height?, showLegend?` | Корреляция двух числовых величин, опционально по нескольким сериям. |
73
+ | `RadialChart` | `value(0–100), color, trackColor?, size?, label?` | Круговой гейдж. Это и есть формализованный «ScoreRing» — раньше пересобирался с нуля на каждом новом экране (в исходной странице, в Storybook-демо, в тестовой consumer-сессии) вместо того, чтобы быть готовым компонентом. |
74
+ | `ComposedChart` | `data, xKey, series: {key,label,color,type:"bar"\|"line"\|"area",axis?:"left"\|"right"}[], height?, showLegend?` | Смешивает типы серий на одном графике (например, объём как бары + тренд как линия). **`axis:"right"` — не опционально-декоративное**: если серии на сильно разных масштабах (штуки 0–60 и оценка 0–10), на общей оси меньшая серия визуально сплющивается в почти прямую линию — заметно прямо на демо-данных этого компонента. |
75
+ | `Sparkline` | `data: number[], color, width?, height?, showEndDot?` | Мини-линия тренда внутри строки/карточки (не полноценный `LineChart` — без осей/сетки/тултипа, фиксированный размер). Формализует паттерн, который до этого просто копипастили руками на каждом новом экране (в т.ч. в оригинальной странице-источнике и в тестовой consumer-сессии) — теперь настоящий экспорт, не «собери сам». **Без `ResponsiveContainer` намеренно** — процентный размер внутри auto-height Grid/Flex-строки не на что мерить, это реальный, воспроизводимый баг Recharts, не связанный с `Foundation/Grid` (был неверно приписан ему в одной из тестовых сессий). |
72
76
 
73
77
  ### shadcn/vendored, но на уровне Components (не Primitives)
74
78
 
package/context/DESIGN.md CHANGED
@@ -191,7 +191,8 @@ components:
191
191
  - `foreground` подобран по **измеренному** WCAG-контрасту, не по предположению «всегда белый» (у `warn` это тёмный ink, а не белый — белый давал хуже контраст).
192
192
  - `hover` всегда через `color-mix()` от `base` — пересчитывается сам, никогда не второй захардкоженный hex, который может разойтись с базой.
193
193
  - `soft`/`soft-foreground` — бледная плашка-беджик (светлый фон + текст цветом базы).
194
- - **`danger` (красный) — осознанное расширение палитры.** Подобран так, чтобы читаться как отдельный цвет, а не «грустный оранжевый» (другой тон и насыщенность, приземлённая к семье `accent/green/warn`, а не к выбивающейся насыщенности `accent`).
194
+ - **`plum` — роль-тинт для сетевого управляющего/точки, не «ещё один статус».** Это не про хорошо/плохо (как `green`/`warn`/`danger`) — это про РОЛЬ человека в структуре (управляющий сетью/точкой), визуально отличную от рядового сотрудника. Если строишь карточку/бейдж для такой роли бери `plum`, не `muted`: без этого указания легко не узнать, что токен вообще существует, и взять нейтральный цвет там, где задумано различие.
195
+ - **`danger` (красный) — для разрушительных действий и критических состояний, не для «просто плохой метрики».** Подобран так, чтобы читаться как отдельный цвет, а не «грустный оранжевый» (другой тон и насыщенность, приземлённая к семье `accent/green/warn`, а не к выбивающейся насыщенности `accent`). Но это не значит, что любой падающий показатель должен быть красным: обычная бизнес-метрика, которая просела за неделю (продажи, конверсия, чек) — это `accent` (та же роль, что и у CTA — «требует внимания»), не `danger`. `danger` — для реально разрушительных/подтверждающих-удаление действий и жёстких ошибок, где перепутать со «стандартным вниманием» было бы неверно считать некритичным.
195
196
  - **Единственный градиент во всей системе** — `components.assistant-dock-btn` (кнопка AI-ассистента). Живёт в `components`, не в `colors` — градиент не проходит как CSS-цвет (см. `Do's and Don'ts`). Не заводи второй градиент без такой же осознанной причины — иначе это быстро превращается в декоративный шум.
196
197
  - **`scrim` — тёмная подложка низкой прозрачности позади тяжёлого блюра** (панель ассистента). Отличается от `card` (светлое стекло) — не путать.
197
198
  - **`border: transparent` — правило, не забытое значение.** Разделение поверхностей — прозрачностью/тенью фона, а не рамкой. Если разделитель реально нужен видимым (инпут, `<hr>`-подобный разделитель) — используй `input` (единственный «настоящий» hairline-токен), никогда не включай `border` обратно.
package/dist/index.d.ts CHANGED
@@ -758,6 +758,22 @@ type AreaChartProps = {
758
758
  };
759
759
  declare function AreaChart({ data, xKey, series, height, showLegend, stacked }: AreaChartProps): React$1.JSX.Element;
760
760
 
761
+ type ComposedSeries = {
762
+ key: string;
763
+ label: string;
764
+ color: string;
765
+ type: "bar" | "line" | "area";
766
+ axis?: "left" | "right";
767
+ };
768
+ type ComposedChartProps = {
769
+ data: Record<string, unknown>[];
770
+ xKey: string;
771
+ series: ComposedSeries[];
772
+ height?: number;
773
+ showLegend?: boolean;
774
+ };
775
+ declare function ComposedChart({ data, xKey, series, height, showLegend }: ComposedChartProps): React$1.JSX.Element;
776
+
761
777
  type DistributionSegment = {
762
778
  label: string;
763
779
  count: string;
@@ -797,6 +813,47 @@ type LineChartProps = {
797
813
  };
798
814
  declare function LineChart({ data, xKey, series, height, showLegend }: LineChartProps): React$1.JSX.Element;
799
815
 
816
+ type RadialChartProps = {
817
+ /** 0–100 */
818
+ value: number;
819
+ color: string;
820
+ /** track color behind the filled arc; defaults to the muted token */
821
+ trackColor?: string;
822
+ size?: number;
823
+ /** centered content, e.g. the numeric score itself */
824
+ label?: ReactNode;
825
+ };
826
+ declare function RadialChart({ value, color: fillColor, trackColor, size, label }: RadialChartProps): React$1.JSX.Element;
827
+
828
+ type ScatterPoint = {
829
+ x: number;
830
+ y: number;
831
+ };
832
+ type ScatterSeries = {
833
+ key: string;
834
+ label: string;
835
+ color: string;
836
+ data: ScatterPoint[];
837
+ };
838
+ type ScatterChartProps = {
839
+ series: ScatterSeries[];
840
+ xLabel?: string;
841
+ yLabel?: string;
842
+ height?: number;
843
+ showLegend?: boolean;
844
+ };
845
+ declare function ScatterChart({ series, xLabel, yLabel, height, showLegend }: ScatterChartProps): React$1.JSX.Element;
846
+
847
+ type SparklineProps = {
848
+ data: number[];
849
+ color: string;
850
+ width?: number;
851
+ height?: number;
852
+ /** dot on the last point only, matching the source's own "value + trend" reading — not one dot per point */
853
+ showEndDot?: boolean;
854
+ };
855
+ declare function Sparkline({ data, color, width, height, showEndDot }: SparklineProps): React$1.JSX.Element;
856
+
800
857
  type ChipQuestion = {
801
858
  question: string;
802
859
  answer: ReactNode;
@@ -831,4 +888,4 @@ type SidebarNavProps = {
831
888
  };
832
889
  declare function SidebarNav({ active, items, avatarInitials, avatarTitle, showSettings, clientLabel, clientInitial, }: SidebarNavProps): React$1.JSX.Element;
833
890
 
834
- export { AdviceCard, type AdviceCardProps, Alert, AlertAction, AlertDescription, AlertTitle, AppShell, AreaChart, type AreaChartProps, AssistantDock, type AssistantDockProps, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, BarChart, type BarChartProps, Box, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, type ChartSeries, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, Chip, type ChipQuestion, Container, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DistributionChart, type DistributionGroup, type DistributionSegment, DonutChart, type DonutChartProps, type DonutSlice, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EXAMPLE_NAV_ITEMS, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, FilterSelect, type FilterSelectProps, Flex, FormField, Grid, ICON_NAMES, Icon, type IconName, type IconProps, Image, type ImageProps, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Label, LineChart, type LineChartProps, MessageBubble, type NavItem, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Progress, RadioGroup, RadioGroupItem, SURFACE_VARIANTS, Search, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, SidebarNav, type SidebarNavProps, type SpacingKey, Spinner, Stack, Surface, type SurfaceProps, type SurfaceVariant, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Text, type TextProps, Textarea, TitledRow, type TitledRowProps, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Toolbar, ToolbarButton, ToolbarGroup, ToolbarSeparator, ToolbarToggleGroup, ToolbarToggleItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, type TypeKey, TypingIndicator, badgeVariants, buttonGroupVariants, buttonVariants, chartKeys, cn, color, font, navigationMenuTriggerStyle, radius, semanticRoles, spacing, tabsListVariants, toggleVariants, type };
891
+ export { AdviceCard, type AdviceCardProps, Alert, AlertAction, AlertDescription, AlertTitle, AppShell, AreaChart, type AreaChartProps, AssistantDock, type AssistantDockProps, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, BarChart, type BarChartProps, Box, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, type ChartSeries, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, Chip, type ChipQuestion, ComposedChart, type ComposedChartProps, type ComposedSeries, Container, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DistributionChart, type DistributionGroup, type DistributionSegment, DonutChart, type DonutChartProps, type DonutSlice, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EXAMPLE_NAV_ITEMS, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, FilterSelect, type FilterSelectProps, Flex, FormField, Grid, ICON_NAMES, Icon, type IconName, type IconProps, Image, type ImageProps, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Label, LineChart, type LineChartProps, MessageBubble, type NavItem, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Progress, RadialChart, type RadialChartProps, RadioGroup, RadioGroupItem, SURFACE_VARIANTS, ScatterChart, type ScatterChartProps, type ScatterPoint, type ScatterSeries, Search, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, SidebarNav, type SidebarNavProps, type SpacingKey, Sparkline, type SparklineProps, Spinner, Stack, Surface, type SurfaceProps, type SurfaceVariant, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Text, type TextProps, Textarea, TitledRow, type TitledRowProps, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Toolbar, ToolbarButton, ToolbarGroup, ToolbarSeparator, ToolbarToggleGroup, ToolbarToggleItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, type TypeKey, TypingIndicator, badgeVariants, buttonGroupVariants, buttonVariants, chartKeys, cn, color, font, navigationMenuTriggerStyle, radius, semanticRoles, spacing, tabsListVariants, toggleVariants, type };
package/dist/index.js CHANGED
@@ -3492,15 +3492,55 @@ function BarChart({ data, xKey, series, height = 260, showLegend = series.length
3492
3492
  ] }) });
3493
3493
  }
3494
3494
 
3495
+ // src/components/composed/charts/ComposedChart.tsx
3496
+ import { ComposedChart as RComposedChart, Bar as Bar2, Line, Area as Area2, XAxis as XAxis3, YAxis as YAxis3, CartesianGrid as CartesianGrid3 } from "recharts";
3497
+ import { jsx as jsx49, jsxs as jsxs18 } from "react/jsx-runtime";
3498
+ function ComposedChart({ data, xKey, series, height = 260, showLegend = series.length > 1 }) {
3499
+ const config = Object.fromEntries(series.map((s) => [s.key, { label: s.label, color: s.color }]));
3500
+ const hasRightAxis = series.some((s) => s.axis === "right");
3501
+ return /* @__PURE__ */ jsx49(ChartContainer, { config, style: { height }, className: "w-full", children: /* @__PURE__ */ jsxs18(RComposedChart, { data, children: [
3502
+ /* @__PURE__ */ jsx49(CartesianGrid3, { vertical: false, stroke: color.input }),
3503
+ /* @__PURE__ */ jsx49(XAxis3, { dataKey: xKey, tickLine: false, axisLine: false, fontSize: 12 }),
3504
+ /* @__PURE__ */ jsx49(YAxis3, { yAxisId: "left", tickLine: false, axisLine: false, fontSize: 12, width: 32 }),
3505
+ hasRightAxis && /* @__PURE__ */ jsx49(YAxis3, { yAxisId: "right", orientation: "right", tickLine: false, axisLine: false, fontSize: 12, width: 32 }),
3506
+ /* @__PURE__ */ jsx49(ChartTooltip, { content: /* @__PURE__ */ jsx49(ChartTooltipContent, {}) }),
3507
+ showLegend && /* @__PURE__ */ jsx49(ChartLegend, { content: /* @__PURE__ */ jsx49(ChartLegendContent, {}) }),
3508
+ series.map((s) => {
3509
+ const paint = `var(--color-${s.key})`;
3510
+ const yAxisId = s.axis === "right" ? "right" : "left";
3511
+ if (s.type === "bar") {
3512
+ return /* @__PURE__ */ jsx49(Bar2, { yAxisId, dataKey: s.key, fill: paint, radius: 4, isAnimationActive: false }, s.key);
3513
+ }
3514
+ if (s.type === "area") {
3515
+ return /* @__PURE__ */ jsx49(
3516
+ Area2,
3517
+ {
3518
+ yAxisId,
3519
+ dataKey: s.key,
3520
+ type: "monotone",
3521
+ stroke: paint,
3522
+ fill: paint,
3523
+ fillOpacity: 0.2,
3524
+ strokeWidth: 2,
3525
+ isAnimationActive: false
3526
+ },
3527
+ s.key
3528
+ );
3529
+ }
3530
+ return /* @__PURE__ */ jsx49(Line, { yAxisId, dataKey: s.key, type: "monotone", stroke: paint, strokeWidth: 2, dot: false, isAnimationActive: false }, s.key);
3531
+ })
3532
+ ] }) });
3533
+ }
3534
+
3495
3535
  // src/components/composed/charts/DistributionChart.tsx
3496
3536
  import {
3497
3537
  BarChart as BarChart2,
3498
- Bar as Bar2,
3499
- XAxis as XAxis3,
3500
- YAxis as YAxis3,
3501
- CartesianGrid as CartesianGrid3
3538
+ Bar as Bar3,
3539
+ XAxis as XAxis4,
3540
+ YAxis as YAxis4,
3541
+ CartesianGrid as CartesianGrid4
3502
3542
  } from "recharts";
3503
- import { jsx as jsx49, jsxs as jsxs18 } from "react/jsx-runtime";
3543
+ import { jsx as jsx50, jsxs as jsxs19 } from "react/jsx-runtime";
3504
3544
  var SEGMENT_COLORS = [color.accent, color.chart2, color.chart3, color.chart4, color.chart5];
3505
3545
  var MAX_SEGMENTS = 5;
3506
3546
  function DistributionChart({ groups, rowHeight = 40 }) {
@@ -3520,14 +3560,14 @@ function DistributionChart({ groups, rowHeight = 40 }) {
3520
3560
  row.rest = Math.max(0, 100 - sum);
3521
3561
  return row;
3522
3562
  });
3523
- return /* @__PURE__ */ jsx49(ChartContainer, { config, style: { height: groups.length * rowHeight + 24 }, className: "w-full", children: /* @__PURE__ */ jsxs18(BarChart2, { data, layout: "vertical", margin: { left: 0, right: 12, top: 4, bottom: 4 }, children: [
3524
- /* @__PURE__ */ jsx49(CartesianGrid3, { horizontal: false, stroke: color.input }),
3525
- /* @__PURE__ */ jsx49(XAxis3, { type: "number", domain: [0, 100], hide: true }),
3526
- /* @__PURE__ */ jsx49(YAxis3, { type: "category", dataKey: "name", tickLine: false, axisLine: false, width: 130, fontSize: 12 }),
3527
- /* @__PURE__ */ jsx49(
3563
+ return /* @__PURE__ */ jsx50(ChartContainer, { config, style: { height: groups.length * rowHeight + 24 }, className: "w-full", children: /* @__PURE__ */ jsxs19(BarChart2, { data, layout: "vertical", margin: { left: 0, right: 12, top: 4, bottom: 4 }, children: [
3564
+ /* @__PURE__ */ jsx50(CartesianGrid4, { horizontal: false, stroke: color.input }),
3565
+ /* @__PURE__ */ jsx50(XAxis4, { type: "number", domain: [0, 100], hide: true }),
3566
+ /* @__PURE__ */ jsx50(YAxis4, { type: "category", dataKey: "name", tickLine: false, axisLine: false, width: 130, fontSize: 12 }),
3567
+ /* @__PURE__ */ jsx50(
3528
3568
  ChartTooltip,
3529
3569
  {
3530
- content: /* @__PURE__ */ jsx49(
3570
+ content: /* @__PURE__ */ jsx50(
3531
3571
  ChartTooltipContent,
3532
3572
  {
3533
3573
  hideLabel: true,
@@ -3540,41 +3580,89 @@ function DistributionChart({ groups, rowHeight = 40 }) {
3540
3580
  )
3541
3581
  }
3542
3582
  ),
3543
- Array.from({ length: MAX_SEGMENTS }, (_, i) => /* @__PURE__ */ jsx49(Bar2, { dataKey: `seg${i}`, stackId: "dist", fill: `var(--color-seg${i})`, isAnimationActive: false }, i)),
3544
- /* @__PURE__ */ jsx49(Bar2, { dataKey: "rest", stackId: "dist", fill: "var(--color-rest)", isAnimationActive: false })
3583
+ Array.from({ length: MAX_SEGMENTS }, (_, i) => /* @__PURE__ */ jsx50(Bar3, { dataKey: `seg${i}`, stackId: "dist", fill: `var(--color-seg${i})`, isAnimationActive: false }, i)),
3584
+ /* @__PURE__ */ jsx50(Bar3, { dataKey: "rest", stackId: "dist", fill: "var(--color-rest)", isAnimationActive: false })
3545
3585
  ] }) });
3546
3586
  }
3547
3587
 
3548
3588
  // src/components/composed/charts/DonutChart.tsx
3549
3589
  import { PieChart, Pie, Cell } from "recharts";
3550
- import { jsx as jsx50, jsxs as jsxs19 } from "react/jsx-runtime";
3590
+ import { jsx as jsx51, jsxs as jsxs20 } from "react/jsx-runtime";
3551
3591
  function DonutChart({ data, height = 260, showLegend = true }) {
3552
3592
  const config = Object.fromEntries(data.map((d) => [d.key, { label: d.label, color: d.color }]));
3553
- return /* @__PURE__ */ jsx50(ChartContainer, { config, style: { height }, className: "w-full", children: /* @__PURE__ */ jsxs19(PieChart, { children: [
3554
- /* @__PURE__ */ jsx50(ChartTooltip, { content: /* @__PURE__ */ jsx50(ChartTooltipContent, { nameKey: "key" }) }),
3555
- showLegend && /* @__PURE__ */ jsx50(ChartLegend, { content: /* @__PURE__ */ jsx50(ChartLegendContent, { nameKey: "key" }) }),
3556
- /* @__PURE__ */ jsx50(Pie, { data, dataKey: "value", nameKey: "key", innerRadius: "60%", outerRadius: "90%", strokeWidth: 2, isAnimationActive: false, children: data.map((d) => /* @__PURE__ */ jsx50(Cell, { fill: `var(--color-${d.key})` }, d.key)) })
3593
+ return /* @__PURE__ */ jsx51(ChartContainer, { config, style: { height }, className: "w-full", children: /* @__PURE__ */ jsxs20(PieChart, { children: [
3594
+ /* @__PURE__ */ jsx51(ChartTooltip, { content: /* @__PURE__ */ jsx51(ChartTooltipContent, { nameKey: "key" }) }),
3595
+ showLegend && /* @__PURE__ */ jsx51(ChartLegend, { content: /* @__PURE__ */ jsx51(ChartLegendContent, { nameKey: "key" }) }),
3596
+ /* @__PURE__ */ jsx51(Pie, { data, dataKey: "value", nameKey: "key", innerRadius: "60%", outerRadius: "90%", strokeWidth: 2, isAnimationActive: false, children: data.map((d) => /* @__PURE__ */ jsx51(Cell, { fill: `var(--color-${d.key})` }, d.key)) })
3557
3597
  ] }) });
3558
3598
  }
3559
3599
 
3560
3600
  // src/components/composed/charts/LineChart.tsx
3561
- import { LineChart as RLineChart, Line, XAxis as XAxis4, YAxis as YAxis4, CartesianGrid as CartesianGrid4 } from "recharts";
3562
- import { jsx as jsx51, jsxs as jsxs20 } from "react/jsx-runtime";
3601
+ import { LineChart as RLineChart, Line as Line2, XAxis as XAxis5, YAxis as YAxis5, CartesianGrid as CartesianGrid5 } from "recharts";
3602
+ import { jsx as jsx52, jsxs as jsxs21 } from "react/jsx-runtime";
3563
3603
  function LineChart({ data, xKey, series, height = 260, showLegend = series.length > 1 }) {
3564
3604
  const config = Object.fromEntries(series.map((s) => [s.key, { label: s.label, color: s.color }]));
3565
- return /* @__PURE__ */ jsx51(ChartContainer, { config, style: { height }, className: "w-full", children: /* @__PURE__ */ jsxs20(RLineChart, { data, children: [
3566
- /* @__PURE__ */ jsx51(CartesianGrid4, { vertical: false, stroke: color.input }),
3567
- /* @__PURE__ */ jsx51(XAxis4, { dataKey: xKey, tickLine: false, axisLine: false, fontSize: 12 }),
3568
- /* @__PURE__ */ jsx51(YAxis4, { tickLine: false, axisLine: false, fontSize: 12, width: 32 }),
3569
- /* @__PURE__ */ jsx51(ChartTooltip, { content: /* @__PURE__ */ jsx51(ChartTooltipContent, {}) }),
3570
- showLegend && /* @__PURE__ */ jsx51(ChartLegend, { content: /* @__PURE__ */ jsx51(ChartLegendContent, {}) }),
3571
- series.map((s) => /* @__PURE__ */ jsx51(Line, { dataKey: s.key, type: "monotone", stroke: `var(--color-${s.key})`, strokeWidth: 2, dot: false, isAnimationActive: false }, s.key))
3605
+ return /* @__PURE__ */ jsx52(ChartContainer, { config, style: { height }, className: "w-full", children: /* @__PURE__ */ jsxs21(RLineChart, { data, children: [
3606
+ /* @__PURE__ */ jsx52(CartesianGrid5, { vertical: false, stroke: color.input }),
3607
+ /* @__PURE__ */ jsx52(XAxis5, { dataKey: xKey, tickLine: false, axisLine: false, fontSize: 12 }),
3608
+ /* @__PURE__ */ jsx52(YAxis5, { tickLine: false, axisLine: false, fontSize: 12, width: 32 }),
3609
+ /* @__PURE__ */ jsx52(ChartTooltip, { content: /* @__PURE__ */ jsx52(ChartTooltipContent, {}) }),
3610
+ showLegend && /* @__PURE__ */ jsx52(ChartLegend, { content: /* @__PURE__ */ jsx52(ChartLegendContent, {}) }),
3611
+ series.map((s) => /* @__PURE__ */ jsx52(Line2, { dataKey: s.key, type: "monotone", stroke: `var(--color-${s.key})`, strokeWidth: 2, dot: false, isAnimationActive: false }, s.key))
3572
3612
  ] }) });
3573
3613
  }
3574
3614
 
3615
+ // src/components/composed/charts/RadialChart.tsx
3616
+ import { RadialBarChart as RRadialBarChart, RadialBar, PolarAngleAxis } from "recharts";
3617
+ import { jsx as jsx53, jsxs as jsxs22 } from "react/jsx-runtime";
3618
+ function RadialChart({ value, color: fillColor, trackColor = color.muted, size = 96, label }) {
3619
+ const config = {};
3620
+ return /* @__PURE__ */ jsxs22("div", { style: { position: "relative", width: size, height: size }, children: [
3621
+ /* @__PURE__ */ jsx53(ChartContainer, { config, style: { width: size, height: size }, children: /* @__PURE__ */ jsxs22(RRadialBarChart, { data: [{ value }], innerRadius: "72%", outerRadius: "100%", startAngle: 90, endAngle: -270, children: [
3622
+ /* @__PURE__ */ jsx53(PolarAngleAxis, { type: "number", domain: [0, 100], tick: false, axisLine: false }),
3623
+ /* @__PURE__ */ jsx53(RadialBar, { dataKey: "value", cornerRadius: 999, fill: fillColor, background: { fill: trackColor }, isAnimationActive: false })
3624
+ ] }) }),
3625
+ label && /* @__PURE__ */ jsx53("div", { style: { position: "absolute", inset: 0, display: "flex", alignItems: "center", justifyContent: "center" }, children: label })
3626
+ ] });
3627
+ }
3628
+
3629
+ // src/components/composed/charts/ScatterChart.tsx
3630
+ import { ScatterChart as RScatterChart, Scatter, XAxis as XAxis6, YAxis as YAxis6, CartesianGrid as CartesianGrid6 } from "recharts";
3631
+ import { jsx as jsx54, jsxs as jsxs23 } from "react/jsx-runtime";
3632
+ function ScatterChart({ series, xLabel, yLabel, height = 260, showLegend = series.length > 1 }) {
3633
+ const config = Object.fromEntries(series.map((s) => [s.key, { label: s.label, color: s.color }]));
3634
+ return /* @__PURE__ */ jsx54(ChartContainer, { config, style: { height }, className: "w-full", children: /* @__PURE__ */ jsxs23(RScatterChart, { children: [
3635
+ /* @__PURE__ */ jsx54(CartesianGrid6, { stroke: color.input }),
3636
+ /* @__PURE__ */ jsx54(XAxis6, { type: "number", dataKey: "x", name: xLabel, tickLine: false, axisLine: false, fontSize: 12 }),
3637
+ /* @__PURE__ */ jsx54(YAxis6, { type: "number", dataKey: "y", name: yLabel, tickLine: false, axisLine: false, fontSize: 12, width: 32 }),
3638
+ /* @__PURE__ */ jsx54(ChartTooltip, { content: /* @__PURE__ */ jsx54(ChartTooltipContent, {}), cursor: { strokeDasharray: "3 3" } }),
3639
+ showLegend && /* @__PURE__ */ jsx54(ChartLegend, { content: /* @__PURE__ */ jsx54(ChartLegendContent, {}) }),
3640
+ series.map((s) => /* @__PURE__ */ jsx54(Scatter, { name: s.label, data: s.data, fill: `var(--color-${s.key})`, isAnimationActive: false }, s.key))
3641
+ ] }) });
3642
+ }
3643
+
3644
+ // src/components/composed/charts/Sparkline.tsx
3645
+ import { Line as Line3, LineChart as RLineChart2 } from "recharts";
3646
+ import { jsx as jsx55 } from "react/jsx-runtime";
3647
+ function Sparkline({ data, color: color2, width = 64, height = 24, showEndDot = true }) {
3648
+ const points = data.map((value, index) => ({ index, value }));
3649
+ const lastIndex = points.length - 1;
3650
+ return /* @__PURE__ */ jsx55(RLineChart2, { width, height, data: points, margin: { top: 2, right: 2, bottom: 2, left: 2 }, style: { flexShrink: 0 }, children: /* @__PURE__ */ jsx55(
3651
+ Line3,
3652
+ {
3653
+ dataKey: "value",
3654
+ type: "monotone",
3655
+ stroke: color2,
3656
+ strokeWidth: 2,
3657
+ isAnimationActive: false,
3658
+ dot: showEndDot ? (props) => props.index === lastIndex ? /* @__PURE__ */ jsx55("circle", { cx: props.cx, cy: props.cy, r: 2.5, fill: color2 }, props.index) : /* @__PURE__ */ jsx55("g", {}, props.index) : false
3659
+ }
3660
+ ) });
3661
+ }
3662
+
3575
3663
  // src/sections/AssistantDock.tsx
3576
3664
  import { useEffect, useRef, useState } from "react";
3577
- import { Fragment as Fragment3, jsx as jsx52, jsxs as jsxs21 } from "react/jsx-runtime";
3665
+ import { Fragment as Fragment3, jsx as jsx56, jsxs as jsxs24 } from "react/jsx-runtime";
3578
3666
  var msgId = 0;
3579
3667
  function AssistantDock({
3580
3668
  title = "\u0410\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442",
@@ -3641,17 +3729,17 @@ function AssistantDock({
3641
3729
  close();
3642
3730
  }
3643
3731
  };
3644
- return /* @__PURE__ */ jsxs21("div", { className: `assistant-dock assistant-dock--${mode === "open" ? "open" : mode === "orb" ? "orb" : "idle"}`, children: [
3645
- /* @__PURE__ */ jsxs21("div", { className: "assistant-dock-panel", children: [
3646
- /* @__PURE__ */ jsxs21("div", { className: "assistant-dock-glow", "aria-hidden": "true", children: [
3647
- /* @__PURE__ */ jsx52("span", { className: "blob blob1" }),
3648
- /* @__PURE__ */ jsx52("span", { className: "blob blob2" }),
3649
- /* @__PURE__ */ jsx52("span", { className: "blob blob3" })
3732
+ return /* @__PURE__ */ jsxs24("div", { className: `assistant-dock assistant-dock--${mode === "open" ? "open" : mode === "orb" ? "orb" : "idle"}`, children: [
3733
+ /* @__PURE__ */ jsxs24("div", { className: "assistant-dock-panel", children: [
3734
+ /* @__PURE__ */ jsxs24("div", { className: "assistant-dock-glow", "aria-hidden": "true", children: [
3735
+ /* @__PURE__ */ jsx56("span", { className: "blob blob1" }),
3736
+ /* @__PURE__ */ jsx56("span", { className: "blob blob2" }),
3737
+ /* @__PURE__ */ jsx56("span", { className: "blob blob3" })
3650
3738
  ] }),
3651
- /* @__PURE__ */ jsxs21("div", { className: "assistant-dock-inner", children: [
3652
- /* @__PURE__ */ jsxs21("div", { className: "assistant-dock-head", children: [
3653
- /* @__PURE__ */ jsx52("span", { className: "assistant-dock-title", children: title }),
3654
- /* @__PURE__ */ jsx52(
3739
+ /* @__PURE__ */ jsxs24("div", { className: "assistant-dock-inner", children: [
3740
+ /* @__PURE__ */ jsxs24("div", { className: "assistant-dock-head", children: [
3741
+ /* @__PURE__ */ jsx56("span", { className: "assistant-dock-title", children: title }),
3742
+ /* @__PURE__ */ jsx56(
3655
3743
  "button",
3656
3744
  {
3657
3745
  type: "button",
@@ -3659,14 +3747,14 @@ function AssistantDock({
3659
3747
  "aria-label": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
3660
3748
  onMouseDown: (e) => e.preventDefault(),
3661
3749
  onClick: close,
3662
- children: /* @__PURE__ */ jsx52(Icon, { name: "close", size: 16 })
3750
+ children: /* @__PURE__ */ jsx56(Icon, { name: "close", size: 16 })
3663
3751
  }
3664
3752
  )
3665
3753
  ] }),
3666
- /* @__PURE__ */ jsxs21("div", { className: "assistant-dock-msgs", ref: msgsRef, children: [
3667
- messages.length === 0 && /* @__PURE__ */ jsxs21(Fragment3, { children: [
3668
- /* @__PURE__ */ jsx52("div", { className: "assistant-dock-sub", children: intro }),
3669
- /* @__PURE__ */ jsx52("div", { className: "assistant-dock-chips", children: chips.map((c) => /* @__PURE__ */ jsx52(
3754
+ /* @__PURE__ */ jsxs24("div", { className: "assistant-dock-msgs", ref: msgsRef, children: [
3755
+ messages.length === 0 && /* @__PURE__ */ jsxs24(Fragment3, { children: [
3756
+ /* @__PURE__ */ jsx56("div", { className: "assistant-dock-sub", children: intro }),
3757
+ /* @__PURE__ */ jsx56("div", { className: "assistant-dock-chips", children: chips.map((c) => /* @__PURE__ */ jsx56(
3670
3758
  Chip,
3671
3759
  {
3672
3760
  onMouseDown: (e) => e.preventDefault(),
@@ -3679,13 +3767,13 @@ function AssistantDock({
3679
3767
  c.question
3680
3768
  )) })
3681
3769
  ] }),
3682
- messages.map((m) => /* @__PURE__ */ jsx52(MessageBubble, { from: m.from, children: m.content }, m.id)),
3683
- typing && /* @__PURE__ */ jsx52(TypingIndicator, {})
3770
+ messages.map((m) => /* @__PURE__ */ jsx56(MessageBubble, { from: m.from, children: m.content }, m.id)),
3771
+ typing && /* @__PURE__ */ jsx56(TypingIndicator, {})
3684
3772
  ] })
3685
3773
  ] })
3686
3774
  ] }),
3687
- /* @__PURE__ */ jsxs21("div", { className: "assistant-dock-input", children: [
3688
- /* @__PURE__ */ jsx52(
3775
+ /* @__PURE__ */ jsxs24("div", { className: "assistant-dock-input", children: [
3776
+ /* @__PURE__ */ jsx56(
3689
3777
  "input",
3690
3778
  {
3691
3779
  ref: fieldRef,
@@ -3697,13 +3785,13 @@ function AssistantDock({
3697
3785
  onKeyDown: handleKey
3698
3786
  }
3699
3787
  ),
3700
- /* @__PURE__ */ jsxs21("div", { className: "assistant-dock-blob", "aria-hidden": "true", children: [
3701
- /* @__PURE__ */ jsx52("i", {}),
3702
- /* @__PURE__ */ jsx52("i", {}),
3703
- /* @__PURE__ */ jsx52("i", {}),
3704
- /* @__PURE__ */ jsx52("i", {})
3788
+ /* @__PURE__ */ jsxs24("div", { className: "assistant-dock-blob", "aria-hidden": "true", children: [
3789
+ /* @__PURE__ */ jsx56("i", {}),
3790
+ /* @__PURE__ */ jsx56("i", {}),
3791
+ /* @__PURE__ */ jsx56("i", {}),
3792
+ /* @__PURE__ */ jsx56("i", {})
3705
3793
  ] }),
3706
- /* @__PURE__ */ jsxs21(
3794
+ /* @__PURE__ */ jsxs24(
3707
3795
  "button",
3708
3796
  {
3709
3797
  type: "button",
@@ -3712,12 +3800,12 @@ function AssistantDock({
3712
3800
  onMouseDown: (e) => e.preventDefault(),
3713
3801
  onClick: handleBtnClick,
3714
3802
  children: [
3715
- /* @__PURE__ */ jsxs21("span", { className: "assistant-dock-btn-label", children: [
3716
- /* @__PURE__ */ jsx52(Icon, { name: "spark", size: 16 }),
3803
+ /* @__PURE__ */ jsxs24("span", { className: "assistant-dock-btn-label", children: [
3804
+ /* @__PURE__ */ jsx56(Icon, { name: "spark", size: 16 }),
3717
3805
  " \u0421\u043F\u0440\u043E\u0441\u0438\u0442\u044C \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430"
3718
3806
  ] }),
3719
- /* @__PURE__ */ jsx52("span", { className: "assistant-dock-miniico", children: /* @__PURE__ */ jsx52(Icon, { name: "spark", size: 16 }) }),
3720
- /* @__PURE__ */ jsx52(Icon, { name: "send", size: 22, className: "assistant-dock-send" })
3807
+ /* @__PURE__ */ jsx56("span", { className: "assistant-dock-miniico", children: /* @__PURE__ */ jsx56(Icon, { name: "spark", size: 16 }) }),
3808
+ /* @__PURE__ */ jsx56(Icon, { name: "send", size: 22, className: "assistant-dock-send" })
3721
3809
  ]
3722
3810
  }
3723
3811
  )
@@ -3726,7 +3814,7 @@ function AssistantDock({
3726
3814
  }
3727
3815
 
3728
3816
  // src/sections/SidebarNav.tsx
3729
- import { jsx as jsx53, jsxs as jsxs22 } from "react/jsx-runtime";
3817
+ import { jsx as jsx57, jsxs as jsxs25 } from "react/jsx-runtime";
3730
3818
  var BRAND_LOGO_PATH = "M450.313 0C769.313 0 944.528 245.166 864.813 542.666C852.313 581.666 848.967 591.728 838.813 623.165L872.813 664.166C962.596 778.457 980.313 929.666 937.814 1104.77H624.813C746.313 944.666 814.313 782.166 825.313 711.666L814.313 696.165C714.974 976.165 548.411 1115.92 359.862 1115.92C151.313 1115.92 0 972.665 0 794.466C0 582.558 193.313 444.512 450.313 444.512C625.327 444.512 730.313 526.666 783.813 571.665L796.313 532.666C781.813 463.166 613.813 360.364 436.813 360.364C329.862 360.364 239.313 386.166 144.313 437.165L20 114.335C134.313 49.6655 286.313 0 450.313 0ZM543.813 547.665C425.012 547.665 349.862 633.349 349.862 720.165C349.862 791.982 413.313 872.992 493.663 872.992C605.327 872.992 712.813 785.665 764.813 639.665C704.313 582.666 621.859 547.665 543.813 547.665Z";
3731
3819
  var EXAMPLE_NAV_ITEMS = [
3732
3820
  { key: "home", label: "\u0413\u043B\u0430\u0432\u043D\u0430\u044F", icon: "home" },
@@ -3744,22 +3832,22 @@ function SidebarNav({
3744
3832
  clientLabel,
3745
3833
  clientInitial
3746
3834
  }) {
3747
- return /* @__PURE__ */ jsxs22("aside", { className: "sidebar", children: [
3748
- /* @__PURE__ */ jsx53("div", { className: "brand", title: "\u0410\u0440\u0442\u0435\u0444\u0430\u043A\u0442", children: /* @__PURE__ */ jsx53(
3835
+ return /* @__PURE__ */ jsxs25("aside", { className: "sidebar", children: [
3836
+ /* @__PURE__ */ jsx57("div", { className: "brand", title: "\u0410\u0440\u0442\u0435\u0444\u0430\u043A\u0442", children: /* @__PURE__ */ jsx57(
3749
3837
  "svg",
3750
3838
  {
3751
3839
  className: "brand-logo",
3752
3840
  viewBox: "0 0 960 1116",
3753
3841
  fill: "currentColor",
3754
3842
  "aria-hidden": "true",
3755
- children: /* @__PURE__ */ jsx53("path", { fillRule: "evenodd", clipRule: "evenodd", d: BRAND_LOGO_PATH })
3843
+ children: /* @__PURE__ */ jsx57("path", { fillRule: "evenodd", clipRule: "evenodd", d: BRAND_LOGO_PATH })
3756
3844
  }
3757
3845
  ) }),
3758
- clientLabel && /* @__PURE__ */ jsxs22("div", { className: "client", "aria-label": clientLabel, children: [
3759
- /* @__PURE__ */ jsx53("span", { className: "bd", children: (clientInitial ?? clientLabel.charAt(0)).toUpperCase() }),
3760
- /* @__PURE__ */ jsx53("span", { className: "tip", children: clientLabel })
3846
+ clientLabel && /* @__PURE__ */ jsxs25("div", { className: "client", "aria-label": clientLabel, children: [
3847
+ /* @__PURE__ */ jsx57("span", { className: "bd", children: (clientInitial ?? clientLabel.charAt(0)).toUpperCase() }),
3848
+ /* @__PURE__ */ jsx57("span", { className: "tip", children: clientLabel })
3761
3849
  ] }),
3762
- /* @__PURE__ */ jsx53("nav", { className: "nav", "aria-label": "\u041D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F", children: items.map((item) => /* @__PURE__ */ jsxs22(
3850
+ /* @__PURE__ */ jsx57("nav", { className: "nav", "aria-label": "\u041D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F", children: items.map((item) => /* @__PURE__ */ jsxs25(
3763
3851
  "a",
3764
3852
  {
3765
3853
  href: "#",
@@ -3767,17 +3855,17 @@ function SidebarNav({
3767
3855
  "aria-label": item.label,
3768
3856
  "aria-current": item.key === active ? "page" : void 0,
3769
3857
  children: [
3770
- /* @__PURE__ */ jsx53(Icon, { name: item.icon, size: NI }),
3771
- /* @__PURE__ */ jsx53("span", { className: "tip", children: item.label })
3858
+ /* @__PURE__ */ jsx57(Icon, { name: item.icon, size: NI }),
3859
+ /* @__PURE__ */ jsx57("span", { className: "tip", children: item.label })
3772
3860
  ]
3773
3861
  },
3774
3862
  item.key
3775
3863
  )) }),
3776
- /* @__PURE__ */ jsxs22("div", { className: "side-foot", children: [
3777
- /* @__PURE__ */ jsx53("span", { className: "avatar", title: avatarTitle, children: avatarInitials }),
3778
- showSettings && /* @__PURE__ */ jsxs22("span", { className: "ico-btn", "aria-label": "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438", children: [
3779
- /* @__PURE__ */ jsx53(Icon, { name: "settings", size: NI }),
3780
- /* @__PURE__ */ jsx53("span", { className: "tip", children: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438" })
3864
+ /* @__PURE__ */ jsxs25("div", { className: "side-foot", children: [
3865
+ /* @__PURE__ */ jsx57("span", { className: "avatar", title: avatarTitle, children: avatarInitials }),
3866
+ showSettings && /* @__PURE__ */ jsxs25("span", { className: "ico-btn", "aria-label": "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438", children: [
3867
+ /* @__PURE__ */ jsx57(Icon, { name: "settings", size: NI }),
3868
+ /* @__PURE__ */ jsx57("span", { className: "tip", children: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438" })
3781
3869
  ] })
3782
3870
  ] })
3783
3871
  ] });
@@ -3819,6 +3907,7 @@ export {
3819
3907
  ChartTooltipContent,
3820
3908
  Checkbox,
3821
3909
  Chip,
3910
+ ComposedChart,
3822
3911
  Container,
3823
3912
  Dialog,
3824
3913
  DialogClose,
@@ -3907,9 +3996,11 @@ export {
3907
3996
  PaginationNext,
3908
3997
  PaginationPrevious,
3909
3998
  Progress,
3999
+ RadialChart,
3910
4000
  RadioGroup,
3911
4001
  RadioGroupItem,
3912
4002
  SURFACE_VARIANTS,
4003
+ ScatterChart,
3913
4004
  Search,
3914
4005
  Select,
3915
4006
  SelectContent,
@@ -3923,6 +4014,7 @@ export {
3923
4014
  SelectValue,
3924
4015
  Separator,
3925
4016
  SidebarNav,
4017
+ Sparkline,
3926
4018
  Spinner,
3927
4019
  Stack,
3928
4020
  Surface,