@fanvue/ui 1.18.1 → 1.19.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.
Files changed (69) hide show
  1. package/dist/charts.d.ts +372 -0
  2. package/dist/charts.mjs +28 -0
  3. package/dist/charts.mjs.map +1 -0
  4. package/dist/cjs/charts.cjs +28 -0
  5. package/dist/cjs/charts.cjs.map +1 -0
  6. package/dist/cjs/components/Accordion/AccordionContent.cjs +11 -3
  7. package/dist/cjs/components/Accordion/AccordionContent.cjs.map +1 -1
  8. package/dist/cjs/components/Accordion/AccordionItem.cjs +1 -5
  9. package/dist/cjs/components/Accordion/AccordionItem.cjs.map +1 -1
  10. package/dist/cjs/components/Autocomplete/useAutocomplete.cjs.map +1 -1
  11. package/dist/cjs/components/BottomNavigation/BottomNavigation.cjs +5 -17
  12. package/dist/cjs/components/BottomNavigation/BottomNavigation.cjs.map +1 -1
  13. package/dist/cjs/components/BottomNavigation/BottomNavigationAction.cjs +6 -22
  14. package/dist/cjs/components/BottomNavigation/BottomNavigationAction.cjs.map +1 -1
  15. package/dist/cjs/components/Chart/ChartCard.cjs +88 -0
  16. package/dist/cjs/components/Chart/ChartCard.cjs.map +1 -0
  17. package/dist/cjs/components/Chart/ChartCenterLabel.cjs +51 -0
  18. package/dist/cjs/components/Chart/ChartCenterLabel.cjs.map +1 -0
  19. package/dist/cjs/components/Chart/ChartContainer.cjs +64 -0
  20. package/dist/cjs/components/Chart/ChartContainer.cjs.map +1 -0
  21. package/dist/cjs/components/Chart/ChartLegend.cjs +69 -0
  22. package/dist/cjs/components/Chart/ChartLegend.cjs.map +1 -0
  23. package/dist/cjs/components/Chart/ChartLoadingOverlay.cjs +35 -0
  24. package/dist/cjs/components/Chart/ChartLoadingOverlay.cjs.map +1 -0
  25. package/dist/cjs/components/Chart/ChartPieLegend.cjs +54 -0
  26. package/dist/cjs/components/Chart/ChartPieLegend.cjs.map +1 -0
  27. package/dist/cjs/components/Chart/ChartSeriesToggle.cjs +65 -0
  28. package/dist/cjs/components/Chart/ChartSeriesToggle.cjs.map +1 -0
  29. package/dist/cjs/components/Chart/ChartStyle.cjs +40 -0
  30. package/dist/cjs/components/Chart/ChartStyle.cjs.map +1 -0
  31. package/dist/cjs/components/Chart/ChartTooltip.cjs +147 -0
  32. package/dist/cjs/components/Chart/ChartTooltip.cjs.map +1 -0
  33. package/dist/cjs/components/Chart/chartUtils.cjs +23 -0
  34. package/dist/cjs/components/Chart/chartUtils.cjs.map +1 -0
  35. package/dist/cjs/components/Chart/useChart.cjs +32 -0
  36. package/dist/cjs/components/Chart/useChart.cjs.map +1 -0
  37. package/dist/components/Accordion/AccordionContent.mjs +11 -3
  38. package/dist/components/Accordion/AccordionContent.mjs.map +1 -1
  39. package/dist/components/Accordion/AccordionItem.mjs +1 -5
  40. package/dist/components/Accordion/AccordionItem.mjs.map +1 -1
  41. package/dist/components/Autocomplete/useAutocomplete.mjs.map +1 -1
  42. package/dist/components/BottomNavigation/BottomNavigation.mjs +5 -17
  43. package/dist/components/BottomNavigation/BottomNavigation.mjs.map +1 -1
  44. package/dist/components/BottomNavigation/BottomNavigationAction.mjs +6 -22
  45. package/dist/components/BottomNavigation/BottomNavigationAction.mjs.map +1 -1
  46. package/dist/components/Chart/ChartCard.mjs +71 -0
  47. package/dist/components/Chart/ChartCard.mjs.map +1 -0
  48. package/dist/components/Chart/ChartCenterLabel.mjs +34 -0
  49. package/dist/components/Chart/ChartCenterLabel.mjs.map +1 -0
  50. package/dist/components/Chart/ChartContainer.mjs +47 -0
  51. package/dist/components/Chart/ChartContainer.mjs.map +1 -0
  52. package/dist/components/Chart/ChartLegend.mjs +52 -0
  53. package/dist/components/Chart/ChartLegend.mjs.map +1 -0
  54. package/dist/components/Chart/ChartLoadingOverlay.mjs +18 -0
  55. package/dist/components/Chart/ChartLoadingOverlay.mjs.map +1 -0
  56. package/dist/components/Chart/ChartPieLegend.mjs +37 -0
  57. package/dist/components/Chart/ChartPieLegend.mjs.map +1 -0
  58. package/dist/components/Chart/ChartSeriesToggle.mjs +48 -0
  59. package/dist/components/Chart/ChartSeriesToggle.mjs.map +1 -0
  60. package/dist/components/Chart/ChartStyle.mjs +23 -0
  61. package/dist/components/Chart/ChartStyle.mjs.map +1 -0
  62. package/dist/components/Chart/ChartTooltip.mjs +130 -0
  63. package/dist/components/Chart/ChartTooltip.mjs.map +1 -0
  64. package/dist/components/Chart/chartUtils.mjs +23 -0
  65. package/dist/components/Chart/chartUtils.mjs.map +1 -0
  66. package/dist/components/Chart/useChart.mjs +15 -0
  67. package/dist/components/Chart/useChart.mjs.map +1 -0
  68. package/dist/index.d.ts +2 -6
  69. package/package.json +18 -2
@@ -0,0 +1,372 @@
1
+ import { Legend } from 'recharts';
2
+ import { LegendPayload } from 'recharts/types/component/DefaultLegendContent';
3
+ import { NameType } from 'recharts/types/component/DefaultTooltipContent';
4
+ import { Payload } from 'recharts/types/component/DefaultTooltipContent';
5
+ import * as React_2 from 'react';
6
+ import { ResponsiveContainer } from 'recharts';
7
+ import { Tooltip } from 'recharts';
8
+ import { ValueType } from 'recharts/types/component/DefaultTooltipContent';
9
+
10
+ /**
11
+ * Wraps any chart with a structured header containing title, subtitle,
12
+ * optional trend chip, date range label, info tooltip, and a loading
13
+ * skeleton state.
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * <ChartCard
18
+ * title="Revenue"
19
+ * subtitle="$4,523"
20
+ * trendChip={{ label: "+12.5%", trend: "positive" }}
21
+ * dateInfo="Jan 1 – Mar 17"
22
+ * tooltip="Total revenue for the selected period."
23
+ * >
24
+ * <MyLineChart />
25
+ * </ChartCard>
26
+ * ```
27
+ */
28
+ export declare const ChartCard: React_2.ForwardRefExoticComponent<ChartCardProps & React_2.RefAttributes<HTMLDivElement>>;
29
+
30
+ /** Props for {@link ChartCard}. */
31
+ export declare interface ChartCardProps extends Omit<React_2.HTMLAttributes<HTMLDivElement>, "title"> {
32
+ /** Card title text. Pass translated string for i18n. */
33
+ title: React_2.ReactNode;
34
+ /** Large subtitle value (e.g. formatted price or count). */
35
+ subtitle?: React_2.ReactNode;
36
+ /** Tooltip text shown next to the title. Pass translated string for i18n. */
37
+ tooltip?: React_2.ReactNode;
38
+ /** Accessible label for the info tooltip trigger. Override for i18n. @default "More info" */
39
+ tooltipAriaLabel?: string;
40
+ /** Date range or period label shown below the subtitle. */
41
+ dateInfo?: React_2.ReactNode;
42
+ /** Trend indicator chip config. */
43
+ trendChip?: {
44
+ /** Display label (e.g. "12.5%"). */
45
+ label: React_2.ReactNode;
46
+ /** Whether the trend is positive (green) or negative (red). */
47
+ trend: "positive" | "negative";
48
+ };
49
+ /** Show loading skeleton instead of content. @default false */
50
+ loading?: boolean;
51
+ /** Chart content rendered below the header. */
52
+ children?: React_2.ReactNode;
53
+ }
54
+
55
+ /**
56
+ * Centered label for radial/pie charts, rendered inside a Recharts `<Label>`.
57
+ *
58
+ * @example
59
+ * ```tsx
60
+ * <PolarRadiusAxis tick={false} tickLine={false} axisLine={false}>
61
+ * <Label content={({ viewBox }) => (
62
+ * <ChartCenterLabel viewBox={viewBox} value="78%" subtitle="Complete" />
63
+ * )} />
64
+ * </PolarRadiusAxis>
65
+ * ```
66
+ */
67
+ export declare const ChartCenterLabel: React_2.ForwardRefExoticComponent<ChartCenterLabelProps & React_2.RefAttributes<SVGTextElement>>;
68
+
69
+ /** Props for {@link ChartCenterLabel}. */
70
+ export declare interface ChartCenterLabelProps extends Omit<React_2.SVGAttributes<SVGTextElement>, "viewBox"> {
71
+ /** Recharts viewBox with center coordinates. */
72
+ viewBox?: {
73
+ cx?: number;
74
+ cy?: number;
75
+ [key: string]: unknown;
76
+ };
77
+ /** Primary value displayed in the center. */
78
+ value: React_2.ReactNode;
79
+ /** Secondary text below the value. */
80
+ subtitle: React_2.ReactNode;
81
+ /** Custom className for the value tspan. @default "fill-foreground-default font-bold text-3xl" */
82
+ valueClassName?: string;
83
+ }
84
+
85
+ /**
86
+ * Maps data keys to their display configuration (label, color, icon).
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * const config: ChartConfig = {
91
+ * revenue: {
92
+ * label: t("chart.revenue"),
93
+ * color: "var(--color-special-chart-teal)",
94
+ * },
95
+ * subscribers: {
96
+ * label: t("chart.subscribers"),
97
+ * theme: { light: "#2563eb", dark: "#60a5fa" },
98
+ * },
99
+ * };
100
+ * ```
101
+ */
102
+ export declare type ChartConfig = Record<string, ChartConfigEntry>;
103
+
104
+ /**
105
+ * Configuration for a single data series in a chart.
106
+ *
107
+ * Each key in a {@link ChartConfig} record maps to a data key used by Recharts.
108
+ * Provide a human-readable `label` (supports i18n — pass translated strings)
109
+ * and either a single `color` or a `theme` map for light/dark mode.
110
+ */
111
+ export declare type ChartConfigEntry = {
112
+ /** Human-readable label for this series. Pass a translated string for i18n. */
113
+ label?: React_2.ReactNode;
114
+ /** Optional icon component rendered in tooltips and legends. */
115
+ icon?: React_2.ComponentType;
116
+ /** Single color for all themes. */
117
+ color?: string;
118
+ /** Per-theme color overrides. Takes precedence over `color` when present. */
119
+ theme?: Record<ChartThemeKey, string>;
120
+ };
121
+
122
+ /**
123
+ * Wraps a Recharts chart with responsive sizing, design-token theming, and
124
+ * accessible config context for tooltips and legends.
125
+ *
126
+ * @example
127
+ * ```tsx
128
+ * <ChartContainer config={chartConfig} className="min-h-48">
129
+ * <LineChart data={data} accessibilityLayer>
130
+ * <Line dataKey="revenue" stroke="var(--color-revenue)" />
131
+ * </LineChart>
132
+ * </ChartContainer>
133
+ * ```
134
+ */
135
+ export declare const ChartContainer: React_2.ForwardRefExoticComponent<ChartContainerProps & React_2.RefAttributes<HTMLDivElement>>;
136
+
137
+ /** Props for {@link ChartContainer}. */
138
+ export declare interface ChartContainerProps extends React_2.HTMLAttributes<HTMLDivElement> {
139
+ /** Series configuration mapping data keys to labels, colors, and icons. */
140
+ config: ChartConfig;
141
+ /**
142
+ * Recharts chart element(s) to render inside the responsive container.
143
+ * Typically a single `<AreaChart>`, `<BarChart>`, `<LineChart>`, etc.
144
+ */
145
+ children: React_2.ComponentProps<typeof ResponsiveContainer>["children"];
146
+ }
147
+
148
+ declare type ChartContextValue = {
149
+ config: ChartConfig;
150
+ };
151
+
152
+ /** Re-export of Recharts `Legend` — use with `content={<ChartLegendContent />}`. */
153
+ export declare const ChartLegend: typeof Legend;
154
+
155
+ /**
156
+ * Styled legend content for use with `<ChartLegend content={<ChartLegendContent />} />`.
157
+ *
158
+ * Reads chart config from context to resolve labels and icons.
159
+ *
160
+ * @example
161
+ * ```tsx
162
+ * <ChartLegend content={<ChartLegendContent />} />
163
+ * ```
164
+ */
165
+ export declare const ChartLegendContent: React_2.ForwardRefExoticComponent<ChartLegendContentProps & React_2.RefAttributes<HTMLDivElement>>;
166
+
167
+ /** Props for {@link ChartLegendContent}. */
168
+ export declare interface ChartLegendContentProps extends React_2.HTMLAttributes<HTMLDivElement> {
169
+ /** Legend payload data. Passed by Recharts. */
170
+ payload?: readonly LegendPayload[];
171
+ /** Vertical alignment — controls padding direction. @default "bottom" */
172
+ verticalAlign?: "top" | "bottom";
173
+ /** Hide the color/icon indicator. @default false */
174
+ hideIcon?: boolean;
175
+ /** Data key used to resolve the display name from config. */
176
+ nameKey?: string;
177
+ }
178
+
179
+ /**
180
+ * A positioned overlay that displays a loading spinner on top of chart content.
181
+ * The children are always rendered to maintain layout dimensions; the overlay
182
+ * covers them with a semi-transparent background and a centered spinner.
183
+ *
184
+ * @example
185
+ * ```tsx
186
+ * <ChartLoadingOverlay loading={isFetching}>
187
+ * <ChartContainer config={config} className="min-h-48">
188
+ * <LineChart data={data}>...</LineChart>
189
+ * </ChartContainer>
190
+ * </ChartLoadingOverlay>
191
+ * ```
192
+ */
193
+ export declare const ChartLoadingOverlay: React_2.ForwardRefExoticComponent<ChartLoadingOverlayProps & React_2.RefAttributes<HTMLDivElement>>;
194
+
195
+ /** Props for {@link ChartLoadingOverlay}. */
196
+ export declare interface ChartLoadingOverlayProps extends React_2.HTMLAttributes<HTMLDivElement> {
197
+ /** Whether to show the loading overlay. @default false */
198
+ loading?: boolean;
199
+ /** Chart content to render underneath the overlay. */
200
+ children: React_2.ReactNode;
201
+ }
202
+
203
+ /**
204
+ * A side legend for pie/donut charts that shows each slice's label,
205
+ * formatted value, and a proportional progress bar.
206
+ *
207
+ * @example
208
+ * ```tsx
209
+ * <ChartPieLegend
210
+ * items={[
211
+ * { label: "Subscriptions", value: 4500, formattedValue: "$4,500", color: "var(--color-special-chart-teal)" },
212
+ * { label: "Messages", value: 2100, formattedValue: "$2,100", color: "var(--color-special-chart-sky)" },
213
+ * { label: "Tips", value: 1200, formattedValue: "$1,200", color: "var(--color-special-chart-orange)" },
214
+ * ]}
215
+ * />
216
+ * ```
217
+ */
218
+ export declare const ChartPieLegend: React_2.ForwardRefExoticComponent<ChartPieLegendProps & React_2.RefAttributes<HTMLDivElement>>;
219
+
220
+ /** A single item in a {@link ChartPieLegend}. */
221
+ export declare interface ChartPieLegendItem {
222
+ /** Display label. Pass translated string for i18n. */
223
+ label: React_2.ReactNode;
224
+ /** Numeric value for this slice. Used to calculate the proportional bar width. */
225
+ value: number;
226
+ /** Formatted display value (e.g. "$4,500"). If omitted, `value.toLocaleString()` is used. */
227
+ formattedValue?: React_2.ReactNode;
228
+ /** Slice color (CSS value). */
229
+ color: string;
230
+ /** Optional icon to show instead of the color dot. */
231
+ icon?: React_2.ReactNode;
232
+ }
233
+
234
+ /** Props for {@link ChartPieLegend}. */
235
+ export declare interface ChartPieLegendProps extends React_2.HTMLAttributes<HTMLDivElement> {
236
+ /** Legend items to display. */
237
+ items: ChartPieLegendItem[];
238
+ }
239
+
240
+ /**
241
+ * Renders a grid of toggleable chips that control which series are visible
242
+ * on a multi-series chart. Each toggle shows a color indicator dot and a label.
243
+ *
244
+ * @example
245
+ * ```tsx
246
+ * const [visible, setVisible] = useState(new Set(["subscription", "message", "tip"]));
247
+ *
248
+ * <ChartSeriesToggle
249
+ * items={[
250
+ * { key: "subscription", label: "Subscription", color: "var(--color-special-chart-teal)" },
251
+ * { key: "message", label: "Message", color: "var(--color-special-chart-sky)" },
252
+ * { key: "tip", label: "Tip", color: "var(--color-special-chart-orange)" },
253
+ * ]}
254
+ * value={visible}
255
+ * onValueChange={setVisible}
256
+ * />
257
+ * ```
258
+ */
259
+ export declare const ChartSeriesToggle: React_2.ForwardRefExoticComponent<ChartSeriesToggleProps & React_2.RefAttributes<HTMLDivElement>>;
260
+
261
+ /** A single toggleable series in a {@link ChartSeriesToggle}. */
262
+ export declare interface ChartSeriesToggleItem {
263
+ /** Unique key matching the data series key and ChartConfig key. */
264
+ key: string;
265
+ /** Human-readable label. Pass translated string for i18n. */
266
+ label: React_2.ReactNode;
267
+ /** Series color (CSS value). Shown as indicator dot. */
268
+ color: string;
269
+ }
270
+
271
+ /** Props for {@link ChartSeriesToggle}. */
272
+ export declare interface ChartSeriesToggleProps extends React_2.HTMLAttributes<HTMLDivElement> {
273
+ /** Available series that can be toggled. */
274
+ items: ChartSeriesToggleItem[];
275
+ /** Set of currently visible series keys. */
276
+ value: Set<string>;
277
+ /** Called when a series is toggled. Receives the updated Set. */
278
+ onValueChange: (value: Set<string>) => void;
279
+ }
280
+
281
+ /**
282
+ * Injects a scoped `<style>` tag that maps each config entry to a
283
+ * `--color-{key}` CSS custom property, with light/dark theme support.
284
+ *
285
+ * Rendered automatically by {@link ChartContainer} — you rarely need this directly.
286
+ */
287
+ export declare const ChartStyle: React_2.NamedExoticComponent<ChartStyleProps>;
288
+
289
+ /** Props for the scoped CSS variable injector used by {@link ChartContainer}. */
290
+ export declare interface ChartStyleProps {
291
+ /** Unique identifier scoped to the chart instance. */
292
+ id: string;
293
+ /** Chart configuration mapping data keys to colors and themes. */
294
+ config: ChartConfig;
295
+ }
296
+
297
+ /** Light/dark theme key for chart color resolution. */
298
+ export declare type ChartThemeKey = "light" | "dark";
299
+
300
+ /** Re-export of Recharts `Tooltip` — use with `content={<ChartTooltipContent />}`. */
301
+ export declare const ChartTooltip: typeof Tooltip;
302
+
303
+ /**
304
+ * Styled tooltip content for use with `<ChartTooltip content={<ChartTooltipContent />} />`.
305
+ *
306
+ * Reads chart config from context to resolve labels, colors, and icons.
307
+ * Supports dot/line/dashed indicators. Pass translated `label`s in config for i18n.
308
+ *
309
+ * @example
310
+ * ```tsx
311
+ * <ChartTooltip
312
+ * content={<ChartTooltipContent indicator="line" />}
313
+ * />
314
+ * ```
315
+ */
316
+ export declare const ChartTooltipContent: React_2.ForwardRefExoticComponent<ChartTooltipContentProps & React_2.RefAttributes<HTMLDivElement>>;
317
+
318
+ /** Props for {@link ChartTooltipContent}. */
319
+ export declare interface ChartTooltipContentProps extends React_2.HTMLAttributes<HTMLDivElement> {
320
+ /** Whether the tooltip is currently active/visible. Passed by Recharts. */
321
+ active?: boolean;
322
+ /** Tooltip payload data. Passed by Recharts. */
323
+ payload?: Payload<ValueType, NameType>[];
324
+ /** Axis label. Passed by Recharts. */
325
+ label?: string | number;
326
+ /** Custom label formatter. */
327
+ labelFormatter?: (label: string | number, payload: Payload<ValueType, NameType>[]) => React_2.ReactNode;
328
+ /** Custom value formatter. */
329
+ formatter?: (value: ValueType, name: NameType, item: Payload<ValueType, NameType>, index: number, payload: Payload<ValueType, NameType>[]) => React_2.ReactNode;
330
+ /** CSS class for the label element. */
331
+ labelClassName?: string;
332
+ /** Hide the tooltip header label. @default false */
333
+ hideLabel?: boolean;
334
+ /** Hide the color indicator beside each row. @default false */
335
+ hideIndicator?: boolean;
336
+ /** Visual style of the color indicator. @default "dot" */
337
+ indicator?: ChartTooltipIndicator;
338
+ /**
339
+ * Data key used to resolve the display name from config.
340
+ * Useful when the payload `name` differs from the config key.
341
+ */
342
+ nameKey?: string;
343
+ /**
344
+ * Data key used to resolve the header label from config.
345
+ * Falls back to the first payload item's `dataKey`.
346
+ */
347
+ labelKey?: string;
348
+ /** Override indicator color for all rows. */
349
+ color?: string;
350
+ }
351
+
352
+ /** Indicator shape rendered beside each tooltip row. */
353
+ export declare type ChartTooltipIndicator = "dot" | "line" | "dashed";
354
+
355
+ /**
356
+ * Resolves the {@link ChartConfig} entry for a given tooltip/legend payload
357
+ * item. Recharts wraps the original data point inside `payload.payload` —
358
+ * this function checks both levels before falling back to a direct `key` lookup.
359
+ */
360
+ export declare function resolveConfigEntry(config: ChartConfig, payload: unknown, key: string): ChartConfigEntry | undefined;
361
+
362
+ /** Access the nearest {@link ChartContainer}'s config. Throws if used outside a chart. */
363
+ export declare function useChart(): ChartContextValue;
364
+
365
+ export { }
366
+
367
+
368
+ declare module "vitest" {
369
+ interface Assertion<T> {
370
+ toHaveNoViolations(): T;
371
+ }
372
+ }
@@ -0,0 +1,28 @@
1
+ "use client";
2
+ import { ChartCard } from "./components/Chart/ChartCard.mjs";
3
+ import { ChartCenterLabel } from "./components/Chart/ChartCenterLabel.mjs";
4
+ import { ChartContainer } from "./components/Chart/ChartContainer.mjs";
5
+ import { ChartLegend, ChartLegendContent } from "./components/Chart/ChartLegend.mjs";
6
+ import { ChartLoadingOverlay } from "./components/Chart/ChartLoadingOverlay.mjs";
7
+ import { ChartPieLegend } from "./components/Chart/ChartPieLegend.mjs";
8
+ import { ChartSeriesToggle } from "./components/Chart/ChartSeriesToggle.mjs";
9
+ import { ChartStyle } from "./components/Chart/ChartStyle.mjs";
10
+ import { ChartTooltip, ChartTooltipContent } from "./components/Chart/ChartTooltip.mjs";
11
+ import { resolveConfigEntry } from "./components/Chart/chartUtils.mjs";
12
+ import { useChart } from "./components/Chart/useChart.mjs";
13
+ export {
14
+ ChartCard,
15
+ ChartCenterLabel,
16
+ ChartContainer,
17
+ ChartLegend,
18
+ ChartLegendContent,
19
+ ChartLoadingOverlay,
20
+ ChartPieLegend,
21
+ ChartSeriesToggle,
22
+ ChartStyle,
23
+ ChartTooltip,
24
+ ChartTooltipContent,
25
+ resolveConfigEntry,
26
+ useChart
27
+ };
28
+ //# sourceMappingURL=charts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"charts.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
@@ -0,0 +1,28 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const ChartCard = require("./components/Chart/ChartCard.cjs");
5
+ const ChartCenterLabel = require("./components/Chart/ChartCenterLabel.cjs");
6
+ const ChartContainer = require("./components/Chart/ChartContainer.cjs");
7
+ const ChartLegend = require("./components/Chart/ChartLegend.cjs");
8
+ const ChartLoadingOverlay = require("./components/Chart/ChartLoadingOverlay.cjs");
9
+ const ChartPieLegend = require("./components/Chart/ChartPieLegend.cjs");
10
+ const ChartSeriesToggle = require("./components/Chart/ChartSeriesToggle.cjs");
11
+ const ChartStyle = require("./components/Chart/ChartStyle.cjs");
12
+ const ChartTooltip = require("./components/Chart/ChartTooltip.cjs");
13
+ const chartUtils = require("./components/Chart/chartUtils.cjs");
14
+ const useChart = require("./components/Chart/useChart.cjs");
15
+ exports.ChartCard = ChartCard.ChartCard;
16
+ exports.ChartCenterLabel = ChartCenterLabel.ChartCenterLabel;
17
+ exports.ChartContainer = ChartContainer.ChartContainer;
18
+ exports.ChartLegend = ChartLegend.ChartLegend;
19
+ exports.ChartLegendContent = ChartLegend.ChartLegendContent;
20
+ exports.ChartLoadingOverlay = ChartLoadingOverlay.ChartLoadingOverlay;
21
+ exports.ChartPieLegend = ChartPieLegend.ChartPieLegend;
22
+ exports.ChartSeriesToggle = ChartSeriesToggle.ChartSeriesToggle;
23
+ exports.ChartStyle = ChartStyle.ChartStyle;
24
+ exports.ChartTooltip = ChartTooltip.ChartTooltip;
25
+ exports.ChartTooltipContent = ChartTooltip.ChartTooltipContent;
26
+ exports.resolveConfigEntry = chartUtils.resolveConfigEntry;
27
+ exports.useChart = useChart.useChart;
28
+ //# sourceMappingURL=charts.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"charts.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -29,14 +29,22 @@ const AccordionContent = React__namespace.forwardRef(({ className, children, noP
29
29
  ref,
30
30
  className: cn.cn(
31
31
  "overflow-hidden",
32
- "typography-regular-body-md text-foreground-secondary",
33
32
  "motion-safe:data-[state=closed]:animate-accordion-collapse",
34
33
  "motion-safe:data-[state=open]:animate-accordion-expand",
35
- !noPadding && "px-3 pb-3",
36
34
  className
37
35
  ),
38
36
  ...props,
39
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 overflow-wrap-anywhere", children })
37
+ children: /* @__PURE__ */ jsxRuntime.jsx(
38
+ "div",
39
+ {
40
+ className: cn.cn(
41
+ "overflow-wrap-anywhere min-w-0",
42
+ "typography-regular-body-md text-foreground-secondary",
43
+ !noPadding && "px-3 pt-2 pb-3"
44
+ ),
45
+ children
46
+ }
47
+ )
40
48
  }
41
49
  ));
42
50
  AccordionContent.displayName = "AccordionContent";
@@ -1 +1 @@
1
- {"version":3,"file":"AccordionContent.cjs","sources":["../../../../src/components/Accordion/AccordionContent.tsx"],"sourcesContent":["import * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Props for the {@link AccordionContent} panel component. */\nexport type AccordionContentProps = React.ComponentPropsWithoutRef<\n typeof AccordionPrimitive.Content\n> & {\n /** Remove the default inner padding (`px-3 pb-3`). Useful when you need custom content layout. */\n noPadding?: boolean;\n};\n\n/** Renders the collapsible content panel for an {@link AccordionItem}. Animates open and closed. */\nexport const AccordionContent = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Content>,\n AccordionContentProps\n>(({ className, children, noPadding, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className={cn(\n \"overflow-hidden\",\n \"typography-regular-body-md text-foreground-secondary\",\n \"motion-safe:data-[state=closed]:animate-accordion-collapse\",\n \"motion-safe:data-[state=open]:animate-accordion-expand\",\n !noPadding && \"px-3 pb-3\",\n className,\n )}\n {...props}\n >\n <div className=\"min-w-0 overflow-wrap-anywhere\">{children}</div>\n </AccordionPrimitive.Content>\n));\n\nAccordionContent.displayName = \"AccordionContent\";\n"],"names":["React","jsx","AccordionPrimitive","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAaO,MAAM,mBAAmBA,iBAAM,WAGpC,CAAC,EAAE,WAAW,UAAU,WAAW,GAAG,SAAS,QAC/CC,2BAAAA;AAAAA,EAACC,8BAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAWC,GAAAA;AAAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,aAAa;AAAA,MACd;AAAA,IAAA;AAAA,IAED,GAAG;AAAA,IAEJ,UAAAF,2BAAAA,IAAC,OAAA,EAAI,WAAU,kCAAkC,SAAA,CAAS;AAAA,EAAA;AAC5D,CACD;AAED,iBAAiB,cAAc;;"}
1
+ {"version":3,"file":"AccordionContent.cjs","sources":["../../../../src/components/Accordion/AccordionContent.tsx"],"sourcesContent":["import * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Props for the {@link AccordionContent} panel component. */\nexport type AccordionContentProps = React.ComponentPropsWithoutRef<\n typeof AccordionPrimitive.Content\n> & {\n /** Remove the default inner padding (`px-3 pb-3`). Useful when you need custom content layout. */\n noPadding?: boolean;\n};\n\n/** Renders the collapsible content panel for an {@link AccordionItem}. Animates open and closed. */\nexport const AccordionContent = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Content>,\n AccordionContentProps\n>(({ className, children, noPadding, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className={cn(\n \"overflow-hidden\",\n \"motion-safe:data-[state=closed]:animate-accordion-collapse\",\n \"motion-safe:data-[state=open]:animate-accordion-expand\",\n className,\n )}\n {...props}\n >\n <div\n className={cn(\n \"overflow-wrap-anywhere min-w-0\",\n \"typography-regular-body-md text-foreground-secondary\",\n !noPadding && \"px-3 pt-2 pb-3\",\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Content>\n));\n\nAccordionContent.displayName = \"AccordionContent\";\n"],"names":["React","jsx","AccordionPrimitive","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAaO,MAAM,mBAAmBA,iBAAM,WAGpC,CAAC,EAAE,WAAW,UAAU,WAAW,GAAG,SAAS,QAC/CC,2BAAAA;AAAAA,EAACC,8BAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAWC,GAAAA;AAAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAED,GAAG;AAAA,IAEJ,UAAAF,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWE,GAAAA;AAAAA,UACT;AAAA,UACA;AAAA,UACA,CAAC,aAAa;AAAA,QAAA;AAAA,QAGf;AAAA,MAAA;AAAA,IAAA;AAAA,EACH;AACF,CACD;AAED,iBAAiB,cAAc;;"}
@@ -27,11 +27,7 @@ const AccordionItem = React__namespace.forwardRef(({ className, ...props }, ref)
27
27
  AccordionPrimitive__namespace.Item,
28
28
  {
29
29
  ref,
30
- className: cn.cn(
31
- "overflow-hidden rounded-xl bg-surface-container",
32
- "border border-neutral-200",
33
- className
34
- ),
30
+ className: cn.cn("rounded-xl bg-surface-container", "border border-neutral-200", className),
35
31
  ...props
36
32
  }
37
33
  ));
@@ -1 +1 @@
1
- {"version":3,"file":"AccordionItem.cjs","sources":["../../../../src/components/Accordion/AccordionItem.tsx"],"sourcesContent":["import * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Props for the {@link AccordionItem} component. */\nexport type AccordionItemProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>;\n\n/** A single collapsible section within an {@link Accordion}. Contains an {@link AccordionTrigger} and {@link AccordionContent}. */\nexport const AccordionItem = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Item>,\n AccordionItemProps\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn(\n \"overflow-hidden rounded-xl bg-surface-container\",\n \"border border-neutral-200\",\n className,\n )}\n {...props}\n />\n));\n\nAccordionItem.displayName = \"AccordionItem\";\n"],"names":["React","jsx","AccordionPrimitive","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAQO,MAAM,gBAAgBA,iBAAM,WAGjC,CAAC,EAAE,WAAW,GAAG,MAAA,GAAS,QAC1BC,2BAAAA;AAAAA,EAACC,8BAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAWC,GAAAA;AAAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAED,GAAG;AAAA,EAAA;AACN,CACD;AAED,cAAc,cAAc;;"}
1
+ {"version":3,"file":"AccordionItem.cjs","sources":["../../../../src/components/Accordion/AccordionItem.tsx"],"sourcesContent":["import * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Props for the {@link AccordionItem} component. */\nexport type AccordionItemProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>;\n\n/** A single collapsible section within an {@link Accordion}. Contains an {@link AccordionTrigger} and {@link AccordionContent}. */\nexport const AccordionItem = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Item>,\n AccordionItemProps\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn(\"rounded-xl bg-surface-container\", \"border border-neutral-200\", className)}\n {...props}\n />\n));\n\nAccordionItem.displayName = \"AccordionItem\";\n"],"names":["React","jsx","AccordionPrimitive","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAQO,MAAM,gBAAgBA,iBAAM,WAGjC,CAAC,EAAE,WAAW,GAAG,MAAA,GAAS,QAC1BC,2BAAAA;AAAAA,EAACC,8BAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAWC,GAAAA,GAAG,mCAAmC,6BAA6B,SAAS;AAAA,IACtF,GAAG;AAAA,EAAA;AACN,CACD;AAED,cAAc,cAAc;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAutocomplete.cjs","sources":["../../../../src/components/Autocomplete/useAutocomplete.ts"],"sourcesContent":["import * as React from \"react\";\nimport type { AutocompleteOption, AutocompleteProps } from \"./Autocomplete\";\nimport { CREATE_PREFIX, defaultFilter, getLabel } from \"./constants\";\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Combobox hook managing interconnected controlled/uncontrolled state\nexport function useAutocomplete(props: AutocompleteProps) {\n const {\n id,\n options,\n disabled = false,\n filterFn,\n creatable = false,\n creatableLabel,\n onCreate,\n inputValue: inputValueProp,\n onInputChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n } = props;\n\n const generatedId = React.useId();\n const inputId = id ?? generatedId;\n const helperTextId = `${inputId}-helper`;\n const listboxId = `${inputId}-listbox`;\n\n const inputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLDivElement>(null);\n\n const isMulti = props.multiple === true;\n\n // --- single-select state ---\n const [internalValue, setInternalValue] = React.useState<string | null>(\n (!isMulti && props.defaultValue) || null,\n );\n const selectedValue: string | null = !isMulti\n ? props.value !== undefined\n ? props.value\n : internalValue\n : null;\n\n // --- multi-select state ---\n const [internalMultiValue, setInternalMultiValue] = React.useState<string[]>(\n isMulti && props.defaultValue ? props.defaultValue : [],\n );\n const selectedMultiValues: string[] = isMulti\n ? props.value !== undefined\n ? props.value\n : internalMultiValue\n : [];\n\n // --- input text ---\n const [internalInputValue, setInternalInputValue] = React.useState(\"\");\n const searchText = inputValueProp !== undefined ? inputValueProp : internalInputValue;\n\n // --- open state ---\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen);\n const isOpen = openProp !== undefined ? openProp : internalOpen;\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (openProp === undefined) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [openProp, onOpenChange],\n );\n\n // --- active index ---\n const [activeIndex, setActiveIndex] = React.useState(-1);\n\n // --- filtering ---\n const filter = filterFn ?? defaultFilter;\n\n const filteredOptions = React.useMemo(() => {\n if (!searchText) return options;\n return options.filter((o) => filter(o, searchText));\n }, [options, searchText, filter]);\n\n const showCreate =\n creatable &&\n searchText.length > 0 &&\n !options.some((o) => (o.label ?? o.value).toLowerCase() === searchText.toLowerCase());\n\n const visibleOptions = React.useMemo(() => {\n if (!showCreate) return filteredOptions;\n const createOption: AutocompleteOption = {\n value: `${CREATE_PREFIX}${searchText}`,\n label: creatableLabel ? creatableLabel(searchText) : searchText,\n };\n return [...filteredOptions, createOption];\n }, [filteredOptions, showCreate, searchText, creatableLabel]);\n\n const prevOptionsLengthRef = React.useRef(visibleOptions.length);\n const prevSearchTextRef = React.useRef(searchText);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: intentionally reset only when search text or option count actually changes\n React.useEffect(() => {\n if (\n searchText !== prevSearchTextRef.current ||\n visibleOptions.length !== prevOptionsLengthRef.current\n ) {\n setActiveIndex(-1);\n prevSearchTextRef.current = searchText;\n prevOptionsLengthRef.current = visibleOptions.length;\n }\n }, [searchText, visibleOptions.length]);\n\n // --- scroll active option into view ---\n React.useEffect(() => {\n if (activeIndex < 0 || !listRef.current) return;\n const el = listRef.current.querySelector(`[data-option-index=\"${activeIndex}\"]`);\n if (typeof el?.scrollIntoView === \"function\") {\n el.scrollIntoView({ block: \"nearest\" });\n }\n }, [activeIndex]);\n\n // --- helpers ---\n function clearInputText() {\n if (inputValueProp === undefined) setInternalInputValue(\"\");\n onInputChange?.(\"\");\n }\n\n function selectSingle(val: string | null) {\n if (!isMulti && props.value === undefined) setInternalValue(val);\n if (!isMulti) (props as { onChange?: (v: string | null) => void }).onChange?.(val);\n }\n\n function toggleMulti(val: string) {\n const next = selectedMultiValues.includes(val)\n ? selectedMultiValues.filter((v) => v !== val)\n : [...selectedMultiValues, val];\n if (isMulti && props.value === undefined) setInternalMultiValue(next);\n if (isMulti) (props as { onChange?: (v: string[]) => void }).onChange?.(next);\n }\n\n function handleSelect(option: AutocompleteOption) {\n if (option.value.startsWith(CREATE_PREFIX)) {\n const raw = option.value.slice(CREATE_PREFIX.length);\n onCreate?.(raw);\n if (isMulti) {\n toggleMulti(raw);\n } else {\n selectSingle(raw);\n setOpen(false);\n }\n clearInputText();\n return;\n }\n\n if (isMulti) {\n toggleMulti(option.value);\n clearInputText();\n } else {\n selectSingle(option.value);\n clearInputText();\n setOpen(false);\n }\n }\n\n function handleInputChange(e: React.ChangeEvent<HTMLInputElement>) {\n const val = e.target.value;\n if (inputValueProp === undefined) setInternalInputValue(val);\n onInputChange?.(val);\n if (!isOpen) setOpen(true);\n }\n\n function findNextEnabled(start: number, direction: 1 | -1): number | null {\n let idx = start;\n while (idx >= 0 && idx < visibleOptions.length && visibleOptions[idx]?.disabled) {\n idx += direction;\n }\n return idx >= 0 && idx < visibleOptions.length ? idx : null;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Flat switch is clearer than splitting into separate handler functions\n function handleKeyDown(e: React.KeyboardEvent) {\n if (disabled) return;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n if (!isOpen) {\n setOpen(true);\n return;\n }\n setActiveIndex((prev) => findNextEnabled(prev + 1, 1) ?? prev);\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n if (!isOpen) {\n setOpen(true);\n return;\n }\n setActiveIndex((prev) => findNextEnabled(prev - 1, -1) ?? prev);\n break;\n }\n case \"Enter\": {\n if (isOpen && activeIndex >= 0 && activeIndex < visibleOptions.length) {\n e.preventDefault();\n const opt = visibleOptions[activeIndex];\n if (opt && !opt.disabled) handleSelect(opt);\n }\n break;\n }\n case \"Escape\": {\n e.preventDefault();\n if (isOpen) setOpen(false);\n break;\n }\n case \"Backspace\": {\n if (isMulti && searchText === \"\" && selectedMultiValues.length > 0) {\n const lastVal = selectedMultiValues[selectedMultiValues.length - 1];\n if (lastVal !== undefined) toggleMulti(lastVal);\n }\n break;\n }\n case \"Home\": {\n if (isOpen) {\n e.preventDefault();\n const idx = findNextEnabled(0, 1);\n if (idx !== null) setActiveIndex(idx);\n }\n break;\n }\n case \"End\": {\n if (isOpen) {\n e.preventDefault();\n const idx = findNextEnabled(visibleOptions.length - 1, -1);\n if (idx !== null) setActiveIndex(idx);\n }\n break;\n }\n }\n }\n\n function handleClear(e: React.MouseEvent) {\n e.stopPropagation();\n if (isMulti) {\n if (props.value === undefined) setInternalMultiValue([]);\n if (isMulti) (props as { onChange?: (v: string[]) => void }).onChange?.([]);\n } else {\n selectSingle(null);\n }\n clearInputText();\n inputRef.current?.focus();\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n const container = e.currentTarget.closest(\"[data-autocomplete-root]\");\n if (container && e.relatedTarget instanceof Node && container.contains(e.relatedTarget)) {\n return;\n }\n if (\n e.relatedTarget instanceof Node &&\n (e.relatedTarget as Element).closest?.(\"[data-radix-popper-content-wrapper]\")\n ) {\n return;\n }\n if (isOpen) setOpen(false);\n }\n\n function handleFocus() {\n if (!disabled && !isOpen) setOpen(true);\n }\n\n function handleContainerClick() {\n if (!disabled) {\n inputRef.current?.focus();\n if (!isOpen) setOpen(true);\n }\n }\n\n function handleOpenChange(next: boolean) {\n setOpen(next);\n if (!next) {\n clearInputText();\n setActiveIndex(-1);\n }\n }\n\n const selectedOption = React.useMemo(\n () => options.find((o) => o.value === selectedValue),\n [options, selectedValue],\n );\n\n const selectedMultiOptions = React.useMemo(\n () =>\n selectedMultiValues\n .map((v) => options.find((o) => o.value === v))\n .filter(Boolean) as AutocompleteOption[],\n [options, selectedMultiValues],\n );\n\n const hasClearableValue = isMulti ? selectedMultiValues.length > 0 : selectedValue != null;\n\n const displayInputValue = React.useMemo(() => {\n if (searchText) return searchText;\n if (isMulti || isOpen) return \"\";\n return selectedOption ? getLabel(selectedOption) : \"\";\n }, [searchText, isMulti, isOpen, selectedOption]);\n\n const activeDescendantId = activeIndex >= 0 ? `${listboxId}-option-${activeIndex}` : undefined;\n\n return {\n inputId,\n helperTextId,\n listboxId,\n inputRef,\n listRef,\n isMulti,\n isOpen,\n selectedValue,\n selectedMultiValues,\n selectedMultiOptions,\n searchText,\n visibleOptions,\n activeIndex,\n activeDescendantId,\n hasClearableValue,\n displayInputValue,\n setActiveIndex,\n handleSelect,\n handleInputChange,\n handleKeyDown,\n handleClear,\n handleBlur,\n handleFocus,\n handleContainerClick,\n handleOpenChange,\n toggleMulti,\n };\n}\n"],"names":["React","defaultFilter","CREATE_PREFIX","getLabel"],"mappings":"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"}
1
+ {"version":3,"file":"useAutocomplete.cjs","sources":["../../../../src/components/Autocomplete/useAutocomplete.ts"],"sourcesContent":["import * as React from \"react\";\nimport type { AutocompleteOption, AutocompleteProps } from \"./Autocomplete\";\nimport { CREATE_PREFIX, defaultFilter, getLabel } from \"./constants\";\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Combobox hook managing interconnected controlled/uncontrolled state\nexport function useAutocomplete(props: AutocompleteProps) {\n const {\n id,\n options,\n disabled = false,\n filterFn,\n creatable = false,\n creatableLabel,\n onCreate,\n inputValue: inputValueProp,\n onInputChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n } = props;\n\n const generatedId = React.useId();\n const inputId = id ?? generatedId;\n const helperTextId = `${inputId}-helper`;\n const listboxId = `${inputId}-listbox`;\n\n const inputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLDivElement>(null);\n\n const isMulti = props.multiple === true;\n\n // --- single-select state ---\n const [internalValue, setInternalValue] = React.useState<string | null>(\n (!isMulti && props.defaultValue) || null,\n );\n const selectedValue: string | null = !isMulti\n ? props.value !== undefined\n ? props.value\n : internalValue\n : null;\n\n // --- multi-select state ---\n const [internalMultiValue, setInternalMultiValue] = React.useState<string[]>(\n isMulti && props.defaultValue ? props.defaultValue : [],\n );\n const selectedMultiValues: string[] = isMulti\n ? props.value !== undefined\n ? props.value\n : internalMultiValue\n : [];\n\n // --- input text ---\n const [internalInputValue, setInternalInputValue] = React.useState(\"\");\n const searchText = inputValueProp !== undefined ? inputValueProp : internalInputValue;\n\n // --- open state ---\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen);\n const isOpen = openProp !== undefined ? openProp : internalOpen;\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (openProp === undefined) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [openProp, onOpenChange],\n );\n\n // --- active index ---\n const [activeIndex, setActiveIndex] = React.useState(-1);\n\n // --- filtering ---\n const filter = filterFn ?? defaultFilter;\n\n const filteredOptions = React.useMemo(() => {\n if (!searchText) return options;\n return options.filter((o) => filter(o, searchText));\n }, [options, searchText, filter]);\n\n const showCreate =\n creatable &&\n searchText.length > 0 &&\n !options.some((o) => (o.label ?? o.value).toLowerCase() === searchText.toLowerCase());\n\n const visibleOptions = React.useMemo(() => {\n if (!showCreate) return filteredOptions;\n const createOption: AutocompleteOption = {\n value: `${CREATE_PREFIX}${searchText}`,\n label: creatableLabel ? creatableLabel(searchText) : searchText,\n };\n return [...filteredOptions, createOption];\n }, [filteredOptions, showCreate, searchText, creatableLabel]);\n\n const prevOptionsLengthRef = React.useRef(visibleOptions.length);\n const prevSearchTextRef = React.useRef(searchText);\n\n React.useEffect(() => {\n if (\n searchText !== prevSearchTextRef.current ||\n visibleOptions.length !== prevOptionsLengthRef.current\n ) {\n setActiveIndex(-1);\n prevSearchTextRef.current = searchText;\n prevOptionsLengthRef.current = visibleOptions.length;\n }\n }, [searchText, visibleOptions.length]);\n\n // --- scroll active option into view ---\n React.useEffect(() => {\n if (activeIndex < 0 || !listRef.current) return;\n const el = listRef.current.querySelector(`[data-option-index=\"${activeIndex}\"]`);\n if (typeof el?.scrollIntoView === \"function\") {\n el.scrollIntoView({ block: \"nearest\" });\n }\n }, [activeIndex]);\n\n // --- helpers ---\n function clearInputText() {\n if (inputValueProp === undefined) setInternalInputValue(\"\");\n onInputChange?.(\"\");\n }\n\n function selectSingle(val: string | null) {\n if (!isMulti && props.value === undefined) setInternalValue(val);\n if (!isMulti) (props as { onChange?: (v: string | null) => void }).onChange?.(val);\n }\n\n function toggleMulti(val: string) {\n const next = selectedMultiValues.includes(val)\n ? selectedMultiValues.filter((v) => v !== val)\n : [...selectedMultiValues, val];\n if (isMulti && props.value === undefined) setInternalMultiValue(next);\n if (isMulti) (props as { onChange?: (v: string[]) => void }).onChange?.(next);\n }\n\n function handleSelect(option: AutocompleteOption) {\n if (option.value.startsWith(CREATE_PREFIX)) {\n const raw = option.value.slice(CREATE_PREFIX.length);\n onCreate?.(raw);\n if (isMulti) {\n toggleMulti(raw);\n } else {\n selectSingle(raw);\n setOpen(false);\n }\n clearInputText();\n return;\n }\n\n if (isMulti) {\n toggleMulti(option.value);\n clearInputText();\n } else {\n selectSingle(option.value);\n clearInputText();\n setOpen(false);\n }\n }\n\n function handleInputChange(e: React.ChangeEvent<HTMLInputElement>) {\n const val = e.target.value;\n if (inputValueProp === undefined) setInternalInputValue(val);\n onInputChange?.(val);\n if (!isOpen) setOpen(true);\n }\n\n function findNextEnabled(start: number, direction: 1 | -1): number | null {\n let idx = start;\n while (idx >= 0 && idx < visibleOptions.length && visibleOptions[idx]?.disabled) {\n idx += direction;\n }\n return idx >= 0 && idx < visibleOptions.length ? idx : null;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Flat switch is clearer than splitting into separate handler functions\n function handleKeyDown(e: React.KeyboardEvent) {\n if (disabled) return;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n if (!isOpen) {\n setOpen(true);\n return;\n }\n setActiveIndex((prev) => findNextEnabled(prev + 1, 1) ?? prev);\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n if (!isOpen) {\n setOpen(true);\n return;\n }\n setActiveIndex((prev) => findNextEnabled(prev - 1, -1) ?? prev);\n break;\n }\n case \"Enter\": {\n if (isOpen && activeIndex >= 0 && activeIndex < visibleOptions.length) {\n e.preventDefault();\n const opt = visibleOptions[activeIndex];\n if (opt && !opt.disabled) handleSelect(opt);\n }\n break;\n }\n case \"Escape\": {\n e.preventDefault();\n if (isOpen) setOpen(false);\n break;\n }\n case \"Backspace\": {\n if (isMulti && searchText === \"\" && selectedMultiValues.length > 0) {\n const lastVal = selectedMultiValues[selectedMultiValues.length - 1];\n if (lastVal !== undefined) toggleMulti(lastVal);\n }\n break;\n }\n case \"Home\": {\n if (isOpen) {\n e.preventDefault();\n const idx = findNextEnabled(0, 1);\n if (idx !== null) setActiveIndex(idx);\n }\n break;\n }\n case \"End\": {\n if (isOpen) {\n e.preventDefault();\n const idx = findNextEnabled(visibleOptions.length - 1, -1);\n if (idx !== null) setActiveIndex(idx);\n }\n break;\n }\n }\n }\n\n function handleClear(e: React.MouseEvent) {\n e.stopPropagation();\n if (isMulti) {\n if (props.value === undefined) setInternalMultiValue([]);\n if (isMulti) (props as { onChange?: (v: string[]) => void }).onChange?.([]);\n } else {\n selectSingle(null);\n }\n clearInputText();\n inputRef.current?.focus();\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n const container = e.currentTarget.closest(\"[data-autocomplete-root]\");\n if (container && e.relatedTarget instanceof Node && container.contains(e.relatedTarget)) {\n return;\n }\n if (\n e.relatedTarget instanceof Node &&\n (e.relatedTarget as Element).closest?.(\"[data-radix-popper-content-wrapper]\")\n ) {\n return;\n }\n if (isOpen) setOpen(false);\n }\n\n function handleFocus() {\n if (!disabled && !isOpen) setOpen(true);\n }\n\n function handleContainerClick() {\n if (!disabled) {\n inputRef.current?.focus();\n if (!isOpen) setOpen(true);\n }\n }\n\n function handleOpenChange(next: boolean) {\n setOpen(next);\n if (!next) {\n clearInputText();\n setActiveIndex(-1);\n }\n }\n\n const selectedOption = React.useMemo(\n () => options.find((o) => o.value === selectedValue),\n [options, selectedValue],\n );\n\n const selectedMultiOptions = React.useMemo(\n () =>\n selectedMultiValues\n .map((v) => options.find((o) => o.value === v))\n .filter(Boolean) as AutocompleteOption[],\n [options, selectedMultiValues],\n );\n\n const hasClearableValue = isMulti ? selectedMultiValues.length > 0 : selectedValue != null;\n\n const displayInputValue = React.useMemo(() => {\n if (searchText) return searchText;\n if (isMulti || isOpen) return \"\";\n return selectedOption ? getLabel(selectedOption) : \"\";\n }, [searchText, isMulti, isOpen, selectedOption]);\n\n const activeDescendantId = activeIndex >= 0 ? `${listboxId}-option-${activeIndex}` : undefined;\n\n return {\n inputId,\n helperTextId,\n listboxId,\n inputRef,\n listRef,\n isMulti,\n isOpen,\n selectedValue,\n selectedMultiValues,\n selectedMultiOptions,\n searchText,\n visibleOptions,\n activeIndex,\n activeDescendantId,\n hasClearableValue,\n displayInputValue,\n setActiveIndex,\n handleSelect,\n handleInputChange,\n handleKeyDown,\n handleClear,\n handleBlur,\n handleFocus,\n handleContainerClick,\n handleOpenChange,\n toggleMulti,\n };\n}\n"],"names":["React","defaultFilter","CREATE_PREFIX","getLabel"],"mappings":"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"}
@@ -21,27 +21,15 @@ function _interopNamespaceDefault(e) {
21
21
  return Object.freeze(n);
22
22
  }
23
23
  const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
24
- const BottomNavigationContext = React__namespace.createContext({
25
- showLabelsOnlyWhenActive: false,
26
- hideLabels: false
27
- });
24
+ const BottomNavigationContext = React__namespace.createContext({});
28
25
  function useBottomNavigationContext() {
29
26
  return React__namespace.useContext(BottomNavigationContext);
30
27
  }
31
28
  const BottomNavigation = React__namespace.forwardRef(
32
- ({
33
- className,
34
- children,
35
- value,
36
- onValueChange,
37
- showLabelsOnlyWhenActive = false,
38
- hideLabels = false,
39
- hideOnDesktop = false,
40
- ...props
41
- }, ref) => {
29
+ ({ className, children, value, onValueChange, hideOnDesktop = false, ...props }, ref) => {
42
30
  const contextValue = React__namespace.useMemo(
43
- () => ({ value, onValueChange, showLabelsOnlyWhenActive, hideLabels }),
44
- [value, onValueChange, showLabelsOnlyWhenActive, hideLabels]
31
+ () => ({ value, onValueChange }),
32
+ [value, onValueChange]
45
33
  );
46
34
  return /* @__PURE__ */ jsxRuntime.jsx(BottomNavigationContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx(
47
35
  "nav",
@@ -50,7 +38,7 @@ const BottomNavigation = React__namespace.forwardRef(
50
38
  className: cn.cn(
51
39
  "fixed inset-x-0 bottom-0",
52
40
  "flex h-[calc(env(safe-area-inset-bottom,0px)+68px)] items-center justify-around",
53
- "border-neutral-200 border-t bg-surface-page/[.82] backdrop-blur-[16px]",
41
+ "border-neutral-200 border-t bg-surface-page",
54
42
  "pb-[env(safe-area-inset-bottom,0px)]",
55
43
  hideOnDesktop && "md:hidden",
56
44
  className
@@ -1 +1 @@
1
- {"version":3,"file":"BottomNavigation.cjs","sources":["../../../../src/components/BottomNavigation/BottomNavigation.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface BottomNavigationProps extends React.HTMLAttributes<HTMLElement> {\n /** The currently selected action value. */\n value?: string;\n /** Called when the selected action changes. */\n onValueChange?: (value: string) => void;\n /** When `true`, labels are only shown on the active action. @default false */\n showLabelsOnlyWhenActive?: boolean;\n /** When `true`, all labels are hidden. @default false */\n hideLabels?: boolean;\n /** When `true`, the navigation bar is hidden on viewports wider than `md` (768 px). @default false */\n hideOnDesktop?: boolean;\n}\n\ninterface BottomNavigationContextValue {\n value?: string;\n onValueChange?: (value: string) => void;\n showLabelsOnlyWhenActive: boolean;\n hideLabels: boolean;\n}\n\nconst BottomNavigationContext = React.createContext<BottomNavigationContextValue>({\n showLabelsOnlyWhenActive: false,\n hideLabels: false,\n});\n\nexport function useBottomNavigationContext(): BottomNavigationContextValue {\n return React.useContext(BottomNavigationContext);\n}\n\nexport const BottomNavigation = React.forwardRef<HTMLElement, BottomNavigationProps>(\n (\n {\n className,\n children,\n value,\n onValueChange,\n showLabelsOnlyWhenActive = false,\n hideLabels = false,\n hideOnDesktop = false,\n ...props\n },\n ref,\n ) => {\n const contextValue = React.useMemo<BottomNavigationContextValue>(\n () => ({ value, onValueChange, showLabelsOnlyWhenActive, hideLabels }),\n [value, onValueChange, showLabelsOnlyWhenActive, hideLabels],\n );\n\n return (\n <BottomNavigationContext.Provider value={contextValue}>\n <nav\n ref={ref}\n className={cn(\n \"fixed inset-x-0 bottom-0\",\n \"flex h-[calc(env(safe-area-inset-bottom,0px)+68px)] items-center justify-around\",\n \"border-neutral-200 border-t bg-surface-page/[.82] backdrop-blur-[16px]\",\n \"pb-[env(safe-area-inset-bottom,0px)]\",\n hideOnDesktop && \"md:hidden\",\n className,\n )}\n style={{ zIndex: \"var(--fanvue-ui-portal-z-index, 50)\", ...props.style }}\n {...props}\n >\n {children}\n </nav>\n </BottomNavigationContext.Provider>\n );\n },\n);\n\nBottomNavigation.displayName = \"BottomNavigation\";\n"],"names":["React","jsx","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAM,0BAA0BA,iBAAM,cAA4C;AAAA,EAChF,0BAA0B;AAAA,EAC1B,YAAY;AACd,CAAC;AAEM,SAAS,6BAA2D;AACzE,SAAOA,iBAAM,WAAW,uBAAuB;AACjD;AAEO,MAAM,mBAAmBA,iBAAM;AAAA,EACpC,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,2BAA2B;AAAA,IAC3B,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,eAAeA,iBAAM;AAAA,MACzB,OAAO,EAAE,OAAO,eAAe,0BAA0B,WAAA;AAAA,MACzD,CAAC,OAAO,eAAe,0BAA0B,UAAU;AAAA,IAAA;AAG7D,WACEC,2BAAAA,IAAC,wBAAwB,UAAxB,EAAiC,OAAO,cACvC,UAAAA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAWC,GAAAA;AAAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,iBAAiB;AAAA,UACjB;AAAA,QAAA;AAAA,QAEF,OAAO,EAAE,QAAQ,uCAAuC,GAAG,MAAM,MAAA;AAAA,QAChE,GAAG;AAAA,QAEH;AAAA,MAAA;AAAA,IAAA,GAEL;AAAA,EAEJ;AACF;AAEA,iBAAiB,cAAc;;;"}
1
+ {"version":3,"file":"BottomNavigation.cjs","sources":["../../../../src/components/BottomNavigation/BottomNavigation.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface BottomNavigationProps extends React.HTMLAttributes<HTMLElement> {\n /** The currently selected action value. */\n value?: string;\n /** Called when the selected action changes. */\n onValueChange?: (value: string) => void;\n /** When `true`, the navigation bar is hidden on viewports wider than `md` (768 px). @default false */\n hideOnDesktop?: boolean;\n}\n\ninterface BottomNavigationContextValue {\n value?: string;\n onValueChange?: (value: string) => void;\n}\n\nconst BottomNavigationContext = React.createContext<BottomNavigationContextValue>({});\n\nexport function useBottomNavigationContext(): BottomNavigationContextValue {\n return React.useContext(BottomNavigationContext);\n}\n\nexport const BottomNavigation = React.forwardRef<HTMLElement, BottomNavigationProps>(\n ({ className, children, value, onValueChange, hideOnDesktop = false, ...props }, ref) => {\n const contextValue = React.useMemo<BottomNavigationContextValue>(\n () => ({ value, onValueChange }),\n [value, onValueChange],\n );\n\n return (\n <BottomNavigationContext.Provider value={contextValue}>\n <nav\n ref={ref}\n className={cn(\n \"fixed inset-x-0 bottom-0\",\n \"flex h-[calc(env(safe-area-inset-bottom,0px)+68px)] items-center justify-around\",\n \"border-neutral-200 border-t bg-surface-page\",\n \"pb-[env(safe-area-inset-bottom,0px)]\",\n hideOnDesktop && \"md:hidden\",\n className,\n )}\n style={{ zIndex: \"var(--fanvue-ui-portal-z-index, 50)\", ...props.style }}\n {...props}\n >\n {children}\n </nav>\n </BottomNavigationContext.Provider>\n );\n },\n);\n\nBottomNavigation.displayName = \"BottomNavigation\";\n"],"names":["React","jsx","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAiBA,MAAM,0BAA0BA,iBAAM,cAA4C,EAAE;AAE7E,SAAS,6BAA2D;AACzE,SAAOA,iBAAM,WAAW,uBAAuB;AACjD;AAEO,MAAM,mBAAmBA,iBAAM;AAAA,EACpC,CAAC,EAAE,WAAW,UAAU,OAAO,eAAe,gBAAgB,OAAO,GAAG,MAAA,GAAS,QAAQ;AACvF,UAAM,eAAeA,iBAAM;AAAA,MACzB,OAAO,EAAE,OAAO;MAChB,CAAC,OAAO,aAAa;AAAA,IAAA;AAGvB,WACEC,2BAAAA,IAAC,wBAAwB,UAAxB,EAAiC,OAAO,cACvC,UAAAA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAWC,GAAAA;AAAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,iBAAiB;AAAA,UACjB;AAAA,QAAA;AAAA,QAEF,OAAO,EAAE,QAAQ,uCAAuC,GAAG,MAAM,MAAA;AAAA,QAChE,GAAG;AAAA,QAEH;AAAA,MAAA;AAAA,IAAA,GAEL;AAAA,EAEJ;AACF;AAEA,iBAAiB,cAAc;;;"}