bav-react-ui 0.1.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 (52) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +20 -0
  3. package/dist/bav-ui.cjs +2 -0
  4. package/dist/bav-ui.cjs.map +1 -0
  5. package/dist/bav-ui.mjs +1601 -0
  6. package/dist/bav-ui.mjs.map +1 -0
  7. package/dist/components/Alert.d.ts +11 -0
  8. package/dist/components/Avatar.d.ts +8 -0
  9. package/dist/components/Badge.d.ts +10 -0
  10. package/dist/components/Breadcrumbs.d.ts +11 -0
  11. package/dist/components/Button.d.ts +12 -0
  12. package/dist/components/Card.d.ts +16 -0
  13. package/dist/components/Checkbox.d.ts +5 -0
  14. package/dist/components/ConfirmDialog.d.ts +1 -0
  15. package/dist/components/DescriptionList.d.ts +12 -0
  16. package/dist/components/Divider.d.ts +7 -0
  17. package/dist/components/EmptyState.d.ts +9 -0
  18. package/dist/components/FileInput.d.ts +9 -0
  19. package/dist/components/Flex.d.ts +13 -0
  20. package/dist/components/FormField.d.ts +14 -0
  21. package/dist/components/IconButton.d.ts +8 -0
  22. package/dist/components/Input.d.ts +7 -0
  23. package/dist/components/Kbd.d.ts +6 -0
  24. package/dist/components/Layout.d.ts +19 -0
  25. package/dist/components/Menu.d.ts +20 -0
  26. package/dist/components/Modal.d.ts +13 -0
  27. package/dist/components/Pagination.d.ts +10 -0
  28. package/dist/components/Panel.d.ts +11 -0
  29. package/dist/components/ProgressBar.d.ts +8 -0
  30. package/dist/components/Radio.d.ts +19 -0
  31. package/dist/components/SearchInput.d.ts +8 -0
  32. package/dist/components/Select.d.ts +13 -0
  33. package/dist/components/Skeleton.d.ts +9 -0
  34. package/dist/components/Spinner.d.ts +5 -0
  35. package/dist/components/Stat.d.ts +10 -0
  36. package/dist/components/Switch.d.ts +5 -0
  37. package/dist/components/Table.d.ts +23 -0
  38. package/dist/components/Tabs.d.ts +16 -0
  39. package/dist/components/Tag.d.ts +7 -0
  40. package/dist/components/Textarea.d.ts +5 -0
  41. package/dist/components/Toast.d.ts +1 -0
  42. package/dist/components/Tooltip.d.ts +8 -0
  43. package/dist/components/Typography.d.ts +27 -0
  44. package/dist/components/confirmStore.d.ts +21 -0
  45. package/dist/components/toastStore.d.ts +25 -0
  46. package/dist/index.css +1 -0
  47. package/dist/index.d.ts +43 -0
  48. package/dist/theme/ThemeProvider.d.ts +5 -0
  49. package/dist/theme/tokens.d.ts +23 -0
  50. package/dist/theme/useThemeStore.d.ts +21 -0
  51. package/dist/utils/cx.d.ts +2 -0
  52. package/package.json +59 -0
@@ -0,0 +1,11 @@
1
+ import { ReactNode } from 'react';
2
+ export interface PanelProps {
3
+ headerTitle?: ReactNode;
4
+ headerChildren?: ReactNode;
5
+ headerActions?: ReactNode;
6
+ disableHeader?: boolean;
7
+ flush?: boolean;
8
+ className?: string;
9
+ children?: ReactNode;
10
+ }
11
+ export declare function Panel({ headerTitle, headerChildren, headerActions, disableHeader, flush, className, children, }: PanelProps): import("react").JSX.Element;
@@ -0,0 +1,8 @@
1
+ export interface ProgressBarProps {
2
+ value?: number | null;
3
+ size?: "sm" | "md" | "lg";
4
+ label?: string;
5
+ showValue?: boolean;
6
+ className?: string;
7
+ }
8
+ export declare function ProgressBar({ value, size, label, showValue, className, }: ProgressBarProps): import("react").JSX.Element;
@@ -0,0 +1,19 @@
1
+ import { InputHTMLAttributes, ReactNode } from 'react';
2
+ export interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type"> {
3
+ children?: ReactNode;
4
+ }
5
+ export declare function Radio({ children, className, disabled, ...rest }: RadioProps): import("react").JSX.Element;
6
+ export interface RadioOption {
7
+ label: string;
8
+ value: string;
9
+ disabled?: boolean;
10
+ }
11
+ export interface RadioGroupProps {
12
+ name: string;
13
+ value?: string;
14
+ options: RadioOption[];
15
+ onChange?: (value: string) => void;
16
+ horizontal?: boolean;
17
+ className?: string;
18
+ }
19
+ export declare function RadioGroup({ name, value, options, onChange, horizontal, className, }: RadioGroupProps): import("react").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import { InputHTMLAttributes } from 'react';
2
+ export interface SearchInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "value" | "onChange"> {
3
+ value: string;
4
+ onValueChange: (value: string) => void;
5
+ shortcut?: string;
6
+ className?: string;
7
+ }
8
+ export declare const SearchInput: import('react').ForwardRefExoticComponent<SearchInputProps & import('react').RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,13 @@
1
+ import { SelectHTMLAttributes } from 'react';
2
+ export interface SelectOption {
3
+ label: string;
4
+ value: string;
5
+ disabled?: boolean;
6
+ }
7
+ export interface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, "size"> {
8
+ selectSize?: "sm" | "md";
9
+ invalid?: boolean;
10
+ options?: SelectOption[];
11
+ placeholder?: string;
12
+ }
13
+ export declare const Select: import('react').ForwardRefExoticComponent<SelectProps & import('react').RefAttributes<HTMLSelectElement>>;
@@ -0,0 +1,9 @@
1
+ export interface SkeletonProps {
2
+ variant?: "rect" | "text" | "circle";
3
+ width?: number | string;
4
+ height?: number | string;
5
+ lines?: number;
6
+ radius?: number | string;
7
+ className?: string;
8
+ }
9
+ export declare function Skeleton({ variant, width, height, lines, radius, className, }: SkeletonProps): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ export interface SpinnerProps {
2
+ size?: number;
3
+ className?: string;
4
+ }
5
+ export declare function Spinner({ size, className }: SpinnerProps): import("react").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import { ReactNode } from 'react';
2
+ export interface StatProps {
3
+ label: ReactNode;
4
+ value: ReactNode;
5
+ delta?: string;
6
+ trend?: "up" | "down";
7
+ hint?: ReactNode;
8
+ className?: string;
9
+ }
10
+ export declare function Stat({ label, value, delta, trend, hint, className }: StatProps): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { InputHTMLAttributes, ReactNode } from 'react';
2
+ export interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type"> {
3
+ children?: ReactNode;
4
+ }
5
+ export declare const Switch: import('react').ForwardRefExoticComponent<SwitchProps & import('react').RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,23 @@
1
+ import { HTMLAttributes, TdHTMLAttributes, ThHTMLAttributes } from 'react';
2
+ export interface TableProps extends HTMLAttributes<HTMLTableElement> {
3
+ compact?: boolean;
4
+ clickableRows?: boolean;
5
+ }
6
+ export declare function Table({ compact, clickableRows, className, children, ...rest }: TableProps): import("react").JSX.Element;
7
+ export declare function TableHeader({ className, ...rest }: HTMLAttributes<HTMLTableSectionElement>): import("react").JSX.Element;
8
+ export declare function TableBody({ className, ...rest }: HTMLAttributes<HTMLTableSectionElement>): import("react").JSX.Element;
9
+ export declare function TableRow({ className, ...rest }: HTMLAttributes<HTMLTableRowElement>): import("react").JSX.Element;
10
+ export interface TableHeadProps extends ThHTMLAttributes<HTMLTableCellElement> {
11
+ numeric?: boolean;
12
+ }
13
+ export declare function TableHead({ numeric, className, ...rest }: TableHeadProps): import("react").JSX.Element;
14
+ export interface TableCellProps extends TdHTMLAttributes<HTMLTableCellElement> {
15
+ numeric?: boolean;
16
+ mono?: boolean;
17
+ muted?: boolean;
18
+ }
19
+ export declare function TableCell({ numeric, mono, muted, className, ...rest }: TableCellProps): import("react").JSX.Element;
20
+ export declare function TableEmpty({ colSpan, children }: {
21
+ colSpan: number;
22
+ children: React.ReactNode;
23
+ }): import("react").JSX.Element;
@@ -0,0 +1,16 @@
1
+ import { ReactNode } from 'react';
2
+ export interface TabItem {
3
+ value: string;
4
+ label: ReactNode;
5
+ icon?: ReactNode;
6
+ count?: number;
7
+ disabled?: boolean;
8
+ }
9
+ export interface TabsProps {
10
+ items: TabItem[];
11
+ value: string;
12
+ onChange: (value: string) => void;
13
+ fitted?: boolean;
14
+ className?: string;
15
+ }
16
+ export declare function Tabs({ items, value, onChange, fitted, className }: TabsProps): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { ReactNode } from 'react';
2
+ export interface TagProps {
3
+ children: ReactNode;
4
+ onRemove?: () => void;
5
+ className?: string;
6
+ }
7
+ export declare function Tag({ children, onRemove, className }: TagProps): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { TextareaHTMLAttributes } from 'react';
2
+ export interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
3
+ invalid?: boolean;
4
+ }
5
+ export declare const Textarea: import('react').ForwardRefExoticComponent<TextareaProps & import('react').RefAttributes<HTMLTextAreaElement>>;
@@ -0,0 +1 @@
1
+ export declare function ToastViewport(): import("react").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import { ReactNode } from 'react';
2
+ export interface TooltipProps {
3
+ label: ReactNode;
4
+ placement?: "top" | "bottom" | "left" | "right";
5
+ children: ReactNode;
6
+ className?: string;
7
+ }
8
+ export declare function Tooltip({ label, placement, children, className }: TooltipProps): import("react").JSX.Element;
@@ -0,0 +1,27 @@
1
+ import { HTMLAttributes } from 'react';
2
+ export type TextTone = "default" | "secondary" | "success" | "warning" | "danger" | "accent";
3
+ export type TextSize = "xs" | "sm" | "md" | "lg";
4
+ export interface TitleProps extends HTMLAttributes<HTMLHeadingElement> {
5
+ level?: 1 | 2 | 3 | 4 | 5;
6
+ type?: TextTone;
7
+ noMargin?: boolean;
8
+ }
9
+ export declare function Title({ level, type, noMargin, className, ...rest }: TitleProps): import("react").JSX.Element;
10
+ export interface TextProps extends HTMLAttributes<HTMLSpanElement> {
11
+ type?: TextTone;
12
+ size?: TextSize;
13
+ strong?: boolean;
14
+ code?: boolean;
15
+ mono?: boolean;
16
+ uppercase?: boolean;
17
+ }
18
+ export declare function Text({ type, size, strong, code, mono, uppercase, className, ...rest }: TextProps): import("react").JSX.Element;
19
+ export interface ParagraphProps extends HTMLAttributes<HTMLParagraphElement> {
20
+ type?: TextTone;
21
+ }
22
+ export declare function Paragraph({ type, className, ...rest }: ParagraphProps): import("react").JSX.Element;
23
+ export declare const Typography: {
24
+ Title: typeof Title;
25
+ Text: typeof Text;
26
+ Paragraph: typeof Paragraph;
27
+ };
@@ -0,0 +1,21 @@
1
+ import { ReactNode } from 'react';
2
+ export interface ConfirmOptions {
3
+ title: string;
4
+ message: ReactNode;
5
+ confirmText?: string;
6
+ cancelText?: string;
7
+ danger?: boolean;
8
+ onConfirm: () => void | Promise<void>;
9
+ onCancel?: () => void;
10
+ }
11
+ interface ConfirmState {
12
+ isOpen: boolean;
13
+ options: ConfirmOptions | null;
14
+ isLoading: boolean;
15
+ confirm: (options: ConfirmOptions) => void;
16
+ close: () => void;
17
+ setLoading: (loading: boolean) => void;
18
+ }
19
+ export declare const useConfirmStore: import('zustand').UseBoundStore<import('zustand').StoreApi<ConfirmState>>;
20
+ export declare const confirm: (options: ConfirmOptions) => void;
21
+ export {};
@@ -0,0 +1,25 @@
1
+ import { ReactNode } from 'react';
2
+ export type ToastType = "error" | "success" | "info" | "warning";
3
+ export interface ToastItem {
4
+ id: string;
5
+ message: ReactNode;
6
+ type: ToastType;
7
+ duration: number;
8
+ }
9
+ interface ToastState {
10
+ toasts: ToastItem[];
11
+ push: (message: ReactNode, opts?: {
12
+ type?: ToastType;
13
+ duration?: number;
14
+ }) => string;
15
+ dismiss: (id: string) => void;
16
+ }
17
+ export declare const useToastStore: import('zustand').UseBoundStore<import('zustand').StoreApi<ToastState>>;
18
+ export declare const toast: {
19
+ show: (message: ReactNode, type?: ToastType, duration?: number) => string;
20
+ success: (message: ReactNode, duration?: number) => string;
21
+ error: (message: ReactNode, duration?: number) => string;
22
+ info: (message: ReactNode, duration?: number) => string;
23
+ warning: (message: ReactNode, duration?: number) => string;
24
+ };
25
+ export {};
package/dist/index.css ADDED
@@ -0,0 +1 @@
1
+ ._spinner_102nw_1{border:2px solid var(--chips-background-active);border-top-color:var(--accent);border-radius:50%;animation:.7s linear infinite _bav-spin_102nw_1;display:inline-block}._button_1ejsq_1{justify-content:center;align-items:center;gap:var(--space-2);border:1px solid var(--border);background:var(--buttons);color:var(--text);border-radius:var(--radius-md);white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background var(--dur) ease, border-color var(--dur) ease, transform var(--dur-fast) ease, opacity var(--dur) ease, color var(--dur) ease;font-weight:500;line-height:1;display:inline-flex;position:relative}._button_1ejsq_1:hover:not(:disabled){background:var(--chips-background-active);border-color:var(--focus)}._button_1ejsq_1:active:not(:disabled){transform:scale(.97)}._button_1ejsq_1:focus-visible{box-shadow:var(--ring);outline:none}._button_1ejsq_1:disabled{opacity:.5;cursor:not-allowed}._sm_1ejsq_40{height:32px;font-size:var(--fs-sm);padding:0 12px}._md_1ejsq_45{height:40px;font-size:var(--fs-sm);padding:0 18px}._lg_1ejsq_50{height:48px;font-size:var(--fs-md);padding:0 24px}._primary_1ejsq_56{background:var(--accent);border-color:var(--accent);color:#fff}._primary_1ejsq_56:hover:not(:disabled){filter:brightness(1.08);background:var(--accent);border-color:var(--accent)}._danger_1ejsq_66{background:var(--danger);border-color:var(--danger);color:#fff}._danger_1ejsq_66:hover:not(:disabled){filter:brightness(1.08);background:var(--danger);border-color:var(--danger)}._subtle_1ejsq_76{background:var(--chips-background);border-color:#0000}._ghost_1ejsq_80{background:0 0;border-color:#0000}._ghost_1ejsq_80:hover:not(:disabled){background:var(--chips-background);border-color:#0000}._block_1ejsq_89{width:100%}._loading_1ejsq_93{pointer-events:none;color:#0000!important}._spinner_1ejsq_97{justify-content:center;align-items:center;display:flex;position:absolute;inset:0}._icon_1ejsq_105{justify-content:center;align-items:center;display:inline-flex}._icon_1ejsq_105 svg{width:1em;height:1em}._button_1bhk3_1{color:var(--muted);border-radius:var(--radius-md);cursor:pointer;transition:background var(--dur-fast) ease, color var(--dur-fast) ease, border-color var(--dur-fast) ease, transform var(--dur-fast) ease;background:0 0;border:1px solid #0000;justify-content:center;align-items:center;display:inline-flex}._button_1bhk3_1:hover:not(:disabled){background:var(--chips-background-active);color:var(--text)}._button_1bhk3_1:active:not(:disabled){transform:scale(.92)}._button_1bhk3_1:focus-visible{box-shadow:var(--ring);outline:none}._button_1bhk3_1:disabled{opacity:.4;cursor:not-allowed}._solid_1bhk3_32{background:var(--chips-background)}._danger_1bhk3_35:hover:not(:disabled){color:var(--danger);background:#ff444426}._sm_1bhk3_40{width:28px;height:28px}._md_1bhk3_44{width:34px;height:34px}._lg_1bhk3_48{width:42px;height:42px}._button_1bhk3_1 svg{width:60%;height:60%}._wrap_mj8y3_1{align-items:center;width:100%;display:flex;position:relative}._input_mj8y3_8{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);width:100%;color:var(--text);transition:border-color var(--dur) ease, box-shadow var(--dur) ease;outline:none}._input_mj8y3_8::placeholder{color:var(--muted);opacity:.65}._input_mj8y3_8:focus{border-color:var(--accent);box-shadow:var(--ring)}._input_mj8y3_8:disabled{opacity:.55;cursor:not-allowed}._sm_mj8y3_32{height:36px;font-size:var(--fs-sm);padding:0 12px}._md_mj8y3_37{height:44px;font-size:var(--fs-md);padding:0 14px}._invalid_mj8y3_43{border-color:var(--danger)}._invalid_mj8y3_43:focus{border-color:var(--danger);box-shadow:0 0 0 3px #ff44442e}._hasIcon_mj8y3_51._sm_mj8y3_32{padding-left:36px}._hasIcon_mj8y3_51._md_mj8y3_37{padding-left:42px}._icon_mj8y3_57{color:var(--muted);pointer-events:none;align-items:center;display:flex;position:absolute;left:14px}._icon_mj8y3_57 svg{width:16px;height:16px}._wrap_mj8y3_1:focus-within ._icon_mj8y3_57{color:var(--text)}._textarea_1v6em_1{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);width:100%;min-height:96px;color:var(--text);font-size:var(--fs-sm);resize:vertical;transition:border-color var(--dur) ease, box-shadow var(--dur) ease;outline:none;padding:12px 14px;line-height:1.5}._textarea_1v6em_1::placeholder{color:var(--muted);opacity:.65}._textarea_1v6em_1:focus{border-color:var(--accent);box-shadow:var(--ring)}._textarea_1v6em_1:disabled{opacity:.55;cursor:not-allowed}._invalid_1v6em_29{border-color:var(--danger)}._invalid_1v6em_29:focus{border-color:var(--danger);box-shadow:0 0 0 3px #ff44442e}._wrap_6tkeb_1{align-items:center;width:100%;display:inline-flex;position:relative}._select_6tkeb_8{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);width:100%;height:44px;color:var(--text);font-size:var(--fs-sm);cursor:pointer;appearance:none;transition:border-color var(--dur) ease, box-shadow var(--dur) ease;outline:none;padding:0 38px 0 14px}._select_6tkeb_8:focus{border-color:var(--accent);box-shadow:var(--ring)}._select_6tkeb_8:disabled{opacity:.55;cursor:not-allowed}._sm_6tkeb_32{height:36px;font-size:var(--fs-sm)}._invalid_6tkeb_36{border-color:var(--danger)}._chevron_6tkeb_40{width:16px;height:16px;color:var(--muted);pointer-events:none;position:absolute;right:12px}._label_glwcp_1{align-items:center;gap:var(--space-2);cursor:pointer;color:var(--text);font-size:var(--fs-sm);-webkit-user-select:none;user-select:none;display:inline-flex}._label_glwcp_1._disabled_glwcp_10{opacity:.5;cursor:not-allowed}._native_glwcp_15{opacity:0;width:0;height:0;position:absolute}._box_glwcp_22{border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--card);color:#0000;width:18px;height:18px;transition:background var(--dur-fast) ease, border-color var(--dur-fast) ease, color var(--dur-fast) ease;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}._box_glwcp_22 svg{stroke-width:3px;width:13px;height:13px}._native_glwcp_15:checked+._box_glwcp_22{background:var(--accent);border-color:var(--accent);color:#fff}._native_glwcp_15:focus-visible+._box_glwcp_22{box-shadow:var(--ring)}._label_1qs2n_1{align-items:center;gap:var(--space-2);cursor:pointer;color:var(--text);font-size:var(--fs-sm);-webkit-user-select:none;user-select:none;display:inline-flex}._label_1qs2n_1._disabled_1qs2n_10{opacity:.5;cursor:not-allowed}._native_1qs2n_15{opacity:0;width:0;height:0;position:absolute}._track_1qs2n_22{border-radius:var(--radius-pill);background:var(--chips-background-active);border:1px solid var(--border);width:38px;height:22px;transition:background var(--dur) ease, border-color var(--dur) ease;flex-shrink:0;position:relative}._thumb_1qs2n_34{background:var(--muted);width:16px;height:16px;transition:transform var(--dur) var(--ease-out), background var(--dur) ease;border-radius:50%;position:absolute;top:2px;left:2px}._native_1qs2n_15:checked+._track_1qs2n_22{background:var(--accent);border-color:var(--accent)}._native_1qs2n_15:checked+._track_1qs2n_22 ._thumb_1qs2n_34{background:#fff;transform:translate(16px)}._native_1qs2n_15:focus-visible+._track_1qs2n_22{box-shadow:var(--ring)}._group_vvdcv_1{gap:var(--space-2);flex-direction:column;display:flex}._group_vvdcv_1._horizontal_vvdcv_6{gap:var(--space-4);flex-flow:wrap}._label_vvdcv_12{align-items:center;gap:var(--space-2);cursor:pointer;color:var(--text);font-size:var(--fs-sm);-webkit-user-select:none;user-select:none;display:inline-flex}._label_vvdcv_12._disabled_vvdcv_21{opacity:.5;cursor:not-allowed}._native_vvdcv_26{opacity:0;width:0;height:0;position:absolute}._dot_vvdcv_33{border:1px solid var(--border);background:var(--card);width:18px;height:18px;transition:border-color var(--dur-fast) ease;border-radius:50%;flex-shrink:0;display:inline-flex;position:relative}._dot_vvdcv_33:after{content:"";background:var(--accent);width:8px;height:8px;transition:transform var(--dur-fast) var(--ease-out);border-radius:50%;margin:auto;position:absolute;inset:0;transform:scale(0)}._native_vvdcv_26:checked+._dot_vvdcv_33{border-color:var(--accent)}._native_vvdcv_26:checked+._dot_vvdcv_33:after{transform:scale(1)}._native_vvdcv_26:focus-visible+._dot_vvdcv_33{box-shadow:var(--ring)}._field_1toma_1{gap:var(--space-2);flex-direction:column;width:100%;display:flex}._labelRow_1toma_8{justify-content:space-between;align-items:baseline;gap:var(--space-2);display:flex}._label_1toma_8{font-size:var(--fs-sm);color:var(--text);font-weight:500}._required_1toma_20{color:var(--danger);margin-left:2px}._optional_1toma_25,._hint_1toma_30{font-size:var(--fs-xs);color:var(--muted)}._error_1toma_34{font-size:var(--fs-xs);color:var(--danger)}._drop_4v9xi_1{border:1px dashed var(--border);border-radius:var(--radius-lg);background:var(--card);color:var(--muted);cursor:pointer;transition:border-color var(--dur) ease, color var(--dur) ease;align-items:center;gap:12px;padding:14px 16px;display:flex;position:relative}._drop_4v9xi_1:hover{border-color:var(--accent);color:var(--text)}._drop_4v9xi_1[data-has-file=true]{color:var(--text);border-style:solid}._input_4v9xi_27{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}._input_4v9xi_27:disabled{cursor:not-allowed}._disabled_4v9xi_40{opacity:.55;cursor:not-allowed}._invalid_4v9xi_45{border-color:var(--danger)}._icon_4v9xi_49{color:var(--muted);flex-shrink:0;align-items:center;display:flex}._icon_4v9xi_49 svg{width:18px;height:18px}._label_4v9xi_61{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--fs-sm);overflow:hidden}._row_1vo45_1{align-items:center;width:100%;display:flex;position:relative}._icon_1vo45_7{color:var(--muted);pointer-events:none;transition:color var(--dur) ease;align-items:center;display:flex;position:absolute;left:14px}._icon_1vo45_7 svg{width:16px;height:16px}._input_1vo45_20{border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--card);width:100%;height:44px;color:var(--text);font-size:var(--fs-md);transition:border-color var(--dur) ease, box-shadow var(--dur) ease;outline:none;padding:0 44px}._input_1vo45_20::placeholder{color:var(--muted);opacity:.65}._input_1vo45_20::-webkit-search-cancel-button{display:none}._input_1vo45_20:focus{border-color:var(--accent);box-shadow:var(--ring)}._row_1vo45_1:focus-within ._icon_1vo45_7{color:var(--text)}._clear_1vo45_49{background:var(--chips-background-active);width:24px;height:24px;color:var(--muted);cursor:pointer;transition:background var(--dur-fast) ease, color var(--dur-fast) ease;border:none;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;right:12px}._clear_1vo45_49:hover{color:var(--text)}._clear_1vo45_49 svg{width:14px;height:14px}._shortcut_1vo45_74{border-radius:var(--radius-sm);border:1px solid var(--border);color:var(--muted);font-family:var(--font-mono);font-size:var(--fs-xs);pointer-events:none;opacity:.6;transition:opacity var(--dur) ease;align-items:center;padding:3px 7px;display:inline-flex;position:absolute;right:12px}._row_1vo45_1:focus-within ._shortcut_1vo45_74{opacity:0}._badge_1u5ss_1{border-radius:var(--radius-pill);font-size:var(--fs-xs);white-space:nowrap;border:1px solid #0000;align-items:center;gap:4px;padding:2px 8px;font-weight:600;line-height:1.5;display:inline-flex}._square_1u5ss_13{border-radius:var(--radius-sm)}._mono_1u5ss_16{font-family:var(--font-mono)}._neutral_1u5ss_20{background:var(--chips-background-active);color:var(--text)}._accent_1u5ss_24{background:color-mix(in srgb, var(--accent) 16%, transparent);color:var(--accent);border-color:color-mix(in srgb, var(--accent) 35%, transparent)}._success_1u5ss_29{color:var(--success);background:#4caf5024;border-color:#4caf5066}._warning_1u5ss_34{color:var(--warning);background:#f59e0b24;border-color:#f59e0b66}._danger_1u5ss_39{color:var(--danger);background:#ff444424;border-color:#f446}._dot_1u5ss_45{background:currentColor;border-radius:50%;width:6px;height:6px}._tag_i8fnf_1{border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--chips-background);height:26px;color:var(--text);font-size:var(--fs-xs);white-space:nowrap;align-items:center;gap:6px;padding:0 4px 0 10px;font-weight:500;display:inline-flex}._noClose_i8fnf_15{padding-right:10px}._close_i8fnf_18{border-radius:var(--radius-sm);width:18px;height:18px;color:var(--muted);cursor:pointer;transition:background var(--dur-fast) ease, color var(--dur-fast) ease;background:0 0;border:none;justify-content:center;align-items:center;display:inline-flex}._close_i8fnf_18:hover{background:var(--chips-background-active);color:var(--text)}._close_i8fnf_18 svg{width:12px;height:12px}._kbd_1b6zb_1{border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--chips-background);color:var(--muted);font-family:var(--font-mono);font-size:var(--fs-xs);letter-spacing:.03em;align-items:center;padding:3px 7px;font-weight:500;line-height:1;display:inline-flex}._avatar_ernyw_1{background:var(--chips-background-active);color:var(--text);text-transform:uppercase;-webkit-user-select:none;user-select:none;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-weight:600;line-height:1;display:inline-flex;overflow:hidden}._square_ernyw_15{border-radius:var(--radius-md)}._img_ernyw_18{object-fit:cover;width:100%;height:100%}._sm_ernyw_24{width:28px;height:28px;font-size:11px}._md_ernyw_29{width:38px;height:38px;font-size:14px}._lg_ernyw_34{width:52px;height:52px;font-size:18px}._skeleton_n45ub_1{background:linear-gradient(90deg, var(--chips-background) 25%, var(--chips-background-active) 37%, var(--chips-background) 63%);border-radius:var(--radius-sm);background-size:400% 100%;animation:1.4s infinite _bav-skeleton_n45ub_1;display:block}._text_n45ub_13{border-radius:var(--radius-sm);height:.8em;margin:.2em 0}._circle_n45ub_18{border-radius:50%}._divider_xkemn_1{background:var(--border);border:none}._horizontal_xkemn_5{width:100%;height:1px;margin:var(--space-4) 0}._vertical_xkemn_10{width:1px;margin:0 var(--space-3);align-self:stretch}._labelled_xkemn_16{align-items:center;gap:var(--space-3);width:100%;margin:var(--space-4) 0;color:var(--muted);font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.06em;display:flex}._labelled_xkemn_16:before,._labelled_xkemn_16:after{content:"";background:var(--border);flex:1;height:1px}._wrap_1fpxy_1{flex-direction:column;gap:6px;width:100%;display:flex}._head_1fpxy_7{font-size:var(--fs-xs);color:var(--muted);justify-content:space-between;align-items:baseline;display:flex}._value_1fpxy_14{color:var(--text);font-variant-numeric:tabular-nums;font-weight:600}._track_1fpxy_20{border-radius:var(--radius-pill);background:var(--chips-background-active);width:100%;height:6px;overflow:hidden}._sm_1fpxy_27{height:3px}._lg_1fpxy_30{height:10px}._bar_1fpxy_34{border-radius:var(--radius-pill);background:var(--accent);height:100%;transition:width .3s var(--ease-out)}._indeterminate_1fpxy_41{background:linear-gradient(90deg, var(--accent) 0%, color-mix(in srgb, var(--accent) 50%, #fff) 50%, var(--accent) 100%);background-size:200% 100%;animation:1.2s ease-in-out infinite _bav-indeterminate_1fpxy_1,1.5s linear infinite _bav-shimmer_1fpxy_1;width:40%!important}@keyframes _bav-indeterminate_1fpxy_1{0%{margin-left:-40%}to{margin-left:100%}}._stat_12af2_1{flex-direction:column;gap:4px;display:flex}._label_12af2_6{font-size:var(--fs-xs);color:var(--muted);text-transform:uppercase;letter-spacing:.04em}._valueRow_12af2_12{align-items:baseline;gap:var(--space-2);display:flex}._value_12af2_12{font-size:var(--fs-xl);color:var(--text);font-variant-numeric:tabular-nums;font-weight:700;line-height:1.1}._delta_12af2_24{font-size:var(--fs-xs);font-weight:600}._up_12af2_28{color:var(--success)}._down_12af2_31{color:var(--danger)}._hint_12af2_34{font-size:var(--fs-xs);color:var(--muted)}._card_8qptx_1{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);flex-direction:column;display:flex;overflow:hidden}._interactive_8qptx_10{cursor:pointer;transition:border-color var(--dur) ease, box-shadow .25s ease, transform .25s ease}._interactive_8qptx_10:hover{border-color:var(--focus);box-shadow:var(--shadow-md);transform:translateY(-2px)}._header_8qptx_23{align-items:center;gap:var(--space-3);padding:var(--space-4);border-bottom:1px solid var(--border);display:flex}._headTitles_8qptx_30{flex-direction:column;gap:2px;min-width:0;display:flex}._title_8qptx_36{font-size:var(--fs-md);color:var(--text);margin:0;font-weight:600}._subtitle_8qptx_42{font-size:var(--fs-xs);color:var(--muted)}._headEnd_8qptx_46{margin-left:auto}._body_8qptx_50{padding:var(--space-4);gap:var(--space-3);flex-direction:column;flex:1;display:flex}._footer_8qptx_58{align-items:center;gap:var(--space-2);padding:var(--space-3) var(--space-4);border-top:1px solid var(--border);background:var(--chips-background);display:flex}._panel_1ahhx_1{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);flex-direction:column;display:flex;overflow:hidden}._header_1ahhx_11{align-items:center;gap:var(--space-3);min-height:46px;padding:var(--space-2) var(--space-4);background:var(--chips-background);border-bottom:1px solid var(--border);display:flex}._title_1ahhx_21{font-size:var(--fs-sm);color:var(--text);margin:0;font-weight:600}._headerEnd_1ahhx_28{align-items:center;gap:var(--space-2);margin-left:auto;display:flex}._body_1ahhx_35{padding:var(--space-3)}._noPadding_1ahhx_39 ._body_1ahhx_35{padding:0}._container_1lpv0_1{width:100%;overflow-x:auto}._table_1lpv0_6{border-collapse:collapse;width:100%;font-size:var(--fs-sm);caption-side:bottom}._table_1lpv0_6 th{text-align:left;font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.05em;color:var(--muted);background:var(--chips-background);border-bottom:1px solid var(--border);white-space:nowrap;padding:10px 14px;font-weight:600}._table_1lpv0_6 td{border-bottom:1px solid var(--border);color:var(--text);padding:10px 14px}._table_1lpv0_6 tbody tr{transition:background var(--dur-fast) ease}._table_1lpv0_6 tbody tr:hover{background:var(--chips-background)}._table_1lpv0_6 tbody tr:last-child td{border-bottom:none}._clickable_1lpv0_44 tbody tr{cursor:pointer}._compact_1lpv0_48 th,._compact_1lpv0_48 td{padding:6px 10px}._numeric_1lpv0_53{font-variant-numeric:tabular-nums;text-align:right!important}._mono_1lpv0_58{font-family:var(--font-mono)}._muted_1lpv0_62{color:var(--muted)!important}._empty_1lpv0_66{text-align:center;color:var(--muted);padding:var(--space-6)!important}._list_jq2cc_1{gap:var(--space-4) var(--space-5);grid-template-columns:repeat(auto-fill,minmax(160px,1fr));margin:0;display:grid}._columns2_jq2cc_8{grid-template-columns:repeat(auto-fill,minmax(220px,1fr))}._row_jq2cc_12{flex-direction:column;gap:3px;min-width:0;display:flex}._label_jq2cc_19{font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.05em;color:var(--muted);font-weight:600}._value_jq2cc_27{font-size:var(--fs-sm);color:var(--text);overflow-wrap:anywhere;margin:0}._mono_jq2cc_34{font-family:var(--font-mono)}._title_4aj6y_1{color:var(--text);margin:0 0 .4em;font-weight:700;line-height:1.25}._h1_4aj6y_8{font-size:28px}._h2_4aj6y_11{font-size:24px}._h3_4aj6y_14{font-size:20px}._h4_4aj6y_17{font-size:16px;font-weight:600}._h5_4aj6y_21{font-size:14px;font-weight:600}._noMargin_4aj6y_26{margin-bottom:0}._text_4aj6y_30{color:var(--text)}._secondary_4aj6y_34{color:var(--muted)}._success_4aj6y_37{color:var(--success)}._warning_4aj6y_40{color:var(--warning)}._danger_4aj6y_43{color:var(--danger)}._accent_4aj6y_46{color:var(--accent)}._strong_4aj6y_50{font-weight:600}._code_4aj6y_54{font-family:var(--font-mono);background:var(--chips-background);border:1px solid var(--border);border-radius:var(--radius-sm);padding:1px 5px;font-size:.92em}._mono_4aj6y_63{font-family:var(--font-mono)}._xs_4aj6y_67{font-size:var(--fs-xs)}._sm_4aj6y_70{font-size:var(--fs-sm)}._lg_4aj6y_73{font-size:var(--fs-lg)}._uppercase_4aj6y_77{text-transform:uppercase;letter-spacing:.05em}._paragraph_4aj6y_82{color:var(--text);font-size:var(--fs-sm);margin:0 0 1em;line-height:1.6}._paragraph_4aj6y_82:last-child{margin-bottom:0}._nav_13bns_1{align-items:center;gap:var(--space-2);font-size:var(--fs-sm);color:var(--muted);display:flex}._list_13bns_9{align-items:center;gap:var(--space-2);margin:0;padding:0;list-style:none;display:flex}._item_13bns_18{align-items:center;gap:var(--space-2);display:flex}._link_13bns_24{color:var(--muted);transition:color var(--dur-fast) ease;text-decoration:none}._link_13bns_24:hover{color:var(--text);text-underline-offset:3px;text-decoration:underline}._current_13bns_36{color:var(--text);font-weight:500}._separator_13bns_41{color:var(--muted);opacity:.5;display:flex}._separator_13bns_41 svg{width:13px;height:13px}._list_mc9sc_1{border-bottom:1px solid var(--border);align-items:center;gap:2px;display:flex}._fitted_mc9sc_7{width:100%}._fitted_mc9sc_7 ._tab_mc9sc_10{flex:1;justify-content:center}._tab_mc9sc_10{color:var(--muted);font-size:var(--fs-sm);cursor:pointer;transition:color var(--dur) ease;background:0 0;border:none;align-items:center;gap:6px;padding:10px 14px;font-weight:500;display:inline-flex;position:relative}._tab_mc9sc_10:after{content:"";background:var(--accent);height:2px;transition:transform var(--dur) var(--ease-out);border-radius:2px;position:absolute;bottom:-1px;left:8px;right:8px;transform:scaleX(0)}._tab_mc9sc_10:hover:not(:disabled){color:var(--text)}._tab_mc9sc_10:focus-visible{color:var(--text);outline:none}._tab_mc9sc_10:disabled{opacity:.4;cursor:not-allowed}._active_mc9sc_52{color:var(--text)}._active_mc9sc_52:after{transform:scaleX(1)}._tab_mc9sc_10 svg{width:15px;height:15px}._count_mc9sc_62{font-size:var(--fs-xs);color:var(--muted);background:var(--chips-background-active);border-radius:var(--radius-pill);margin-left:2px;padding:1px 7px}._bar_mwt55_1{justify-content:space-between;align-items:center;gap:var(--space-3);padding:8px 4px;display:flex}._count_mwt55_8{font-size:var(--fs-sm);color:var(--muted);white-space:nowrap}._count_mwt55_8 strong{color:var(--text);font-variant-numeric:tabular-nums;font-weight:600}._nav_mwt55_18{align-items:center;gap:4px;display:flex}._arrow_mwt55_23{border-radius:var(--radius-md);width:32px;height:32px;color:var(--muted);cursor:pointer;transition:background var(--dur-fast) ease, border-color var(--dur-fast) ease, color var(--dur-fast) ease;background:0 0;border:1px solid #0000;justify-content:center;align-items:center;display:flex}._arrow_mwt55_23:hover:not(:disabled){background:var(--chips-background-active);border-color:var(--border);color:var(--text)}._arrow_mwt55_23:disabled{opacity:.3;cursor:not-allowed}._arrow_mwt55_23 svg{width:16px;height:16px}._pages_mwt55_52{align-items:center;gap:2px;margin:0 4px;display:flex}._page_mwt55_52{border-radius:var(--radius-md);min-width:32px;height:32px;color:var(--muted);font-size:var(--fs-sm);font-variant-numeric:tabular-nums;cursor:pointer;transition:background var(--dur-fast) ease, border-color var(--dur-fast) ease, color var(--dur-fast) ease;background:0 0;border:1px solid #0000;justify-content:center;align-items:center;padding:0 6px;font-weight:500;display:flex}._page_mwt55_52:hover:not(._active_mwt55_78){background:var(--chips-background);color:var(--text)}._active_mwt55_78{background:var(--chips-background-active);border-color:var(--focus);color:var(--text);cursor:default;font-weight:600}._ellipsis_mwt55_89{width:28px;height:32px;color:var(--muted);opacity:.6;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;display:flex}._root_mpq46_1{display:inline-flex;position:relative}._panel_mpq46_5{z-index:var(--z-dropdown);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);min-width:200px;box-shadow:var(--shadow-md);animation:_bav-pop-in_mpq46_1 .16s var(--ease-out);padding:6px;position:absolute;top:calc(100% + 6px)}._start_mpq46_17{left:0}._end_mpq46_20{right:0}._item_mpq46_24{align-items:center;gap:var(--space-2);border-radius:var(--radius-sm);width:100%;color:var(--text);font-size:var(--fs-sm);text-align:left;cursor:pointer;transition:background var(--dur-fast) ease, color var(--dur-fast) ease;background:0 0;border:none;padding:8px 10px;display:flex}._item_mpq46_24:hover:not(:disabled),._item_mpq46_24:focus-visible{background:var(--chips-background-active);outline:none}._item_mpq46_24:disabled{opacity:.45;cursor:not-allowed}._itemIcon_mpq46_50{color:var(--muted);display:inline-flex}._itemIcon_mpq46_50 svg{width:16px;height:16px}._danger_mpq46_58,._danger_mpq46_58 ._itemIcon_mpq46_50{color:var(--danger)}._danger_mpq46_58:hover:not(:disabled){background:#ff444424}._separator_mpq46_68{background:var(--border);height:1px;margin:6px 4px}._label_mpq46_73{font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.05em;color:var(--muted);padding:6px 10px 4px;font-weight:600}._backdrop_2jxpm_1{z-index:var(--z-modal);padding:var(--space-6);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);animation:_bav-fade-in_2jxpm_1 var(--dur) ease;background:#0000008c;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}._modal_2jxpm_14{width:100%;max-height:calc(100vh - 2 * var(--space-6));background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-xl);box-shadow:var(--shadow-lg);animation:_bav-pop-in_2jxpm_1 .22s var(--ease-out);flex-direction:column;display:flex;overflow:hidden}._sm_2jxpm_26{max-width:380px}._md_2jxpm_29{max-width:520px}._lg_2jxpm_32{max-width:760px}._header_2jxpm_36{align-items:center;gap:var(--space-3);padding:var(--space-5) var(--space-5) var(--space-3);display:flex}._title_2jxpm_42{font-size:var(--fs-lg);color:var(--text);margin:0;font-weight:600}._close_2jxpm_48{border-radius:var(--radius-md);background:var(--chips-background);width:30px;height:30px;color:var(--muted);cursor:pointer;transition:background var(--dur-fast) ease, color var(--dur-fast) ease;border:none;justify-content:center;align-items:center;margin-left:auto;display:inline-flex}._close_2jxpm_48:hover{background:var(--chips-background-active);color:var(--text)}._close_2jxpm_48 svg{width:16px;height:16px}._body_2jxpm_73{padding:var(--space-3) var(--space-5) var(--space-5);color:var(--text);font-size:var(--fs-sm);line-height:1.55;overflow-y:auto}._footer_2jxpm_81{justify-content:flex-end;align-items:center;gap:var(--space-2);padding:var(--space-4) var(--space-5);border-top:1px solid var(--border);display:flex}._wrap_i3jd9_1{display:inline-flex;position:relative}._bubble_i3jd9_5{z-index:var(--z-tooltip);border-radius:var(--radius-sm);background:var(--text);color:var(--bg);font-size:var(--fs-xs);white-space:nowrap;pointer-events:none;opacity:0;transition:opacity var(--dur-fast) ease, transform var(--dur-fast) ease;box-shadow:var(--shadow-sm);padding:5px 9px;font-weight:500;line-height:1.3;position:absolute;transform:scale(.96)}._wrap_i3jd9_1:hover ._bubble_i3jd9_5,._wrap_i3jd9_1:focus-within ._bubble_i3jd9_5{opacity:1;transform:scale(1)}._top_i3jd9_30{bottom:calc(100% + 6px);left:50%;translate:-50%}._bottom_i3jd9_35{top:calc(100% + 6px);left:50%;translate:-50%}._left_i3jd9_40{top:50%;right:calc(100% + 6px);translate:0 -50%}._right_i3jd9_45{top:50%;left:calc(100% + 6px);translate:0 -50%}._alert_11x8q_1{align-items:flex-start;gap:var(--space-3);padding:var(--space-3) var(--space-4);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--chips-background);color:var(--text);font-size:var(--fs-sm);line-height:1.5;display:flex}._icon_11x8q_13{flex-shrink:0;margin-top:1px;display:flex}._icon_11x8q_13 svg{width:18px;height:18px}._content_11x8q_22{flex:1;min-width:0}._title_11x8q_26{margin-bottom:2px;font-weight:600}._close_11x8q_30{border-radius:var(--radius-sm);width:24px;height:24px;color:inherit;opacity:.7;cursor:pointer;background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}._close_11x8q_30:hover{opacity:1;background:var(--chips-background-active)}._close_11x8q_30 svg{width:14px;height:14px}._info_11x8q_53 ._icon_11x8q_13{color:var(--accent)}._info_11x8q_53{border-color:color-mix(in srgb, var(--accent) 35%, transparent);background:color-mix(in srgb, var(--accent) 8%, var(--chips-background))}._success_11x8q_60 ._icon_11x8q_13{color:var(--success)}._success_11x8q_60{background:#4caf5014;border-color:#4caf5066}._warning_11x8q_67 ._icon_11x8q_13{color:var(--warning)}._warning_11x8q_67{background:#f59e0b14;border-color:#f59e0b66}._danger_11x8q_74 ._icon_11x8q_13{color:var(--danger)}._danger_11x8q_74{background:#ff444414;border-color:#f446}._empty_gusco_1{text-align:center;justify-content:center;align-items:center;gap:var(--space-3);padding:var(--space-8) var(--space-4);flex-direction:column;display:flex}._icon_gusco_10{border-radius:var(--radius-lg);background:var(--chips-background);width:48px;height:48px;color:var(--muted);justify-content:center;align-items:center;display:flex}._icon_gusco_10 svg{width:24px;height:24px}._title_gusco_24{font-size:var(--fs-md);color:var(--text);margin:0;font-weight:600}._description_gusco_30{max-width:360px;font-size:var(--fs-sm);color:var(--muted);margin:0;line-height:1.5}._actions_gusco_37{gap:var(--space-2);margin-top:var(--space-2);display:flex}._viewport_10jk7_1{z-index:1000;pointer-events:none;width:min(360px,100vw - 32px);position:fixed;top:16px;right:16px}._viewport_10jk7_1>*{pointer-events:auto}._toast_10jk7_14{background:var(--card);border:1px solid var(--border);box-shadow:0 8px 32px var(--shadow);opacity:0;border-radius:12px;align-items:center;gap:12px;margin-bottom:14px;padding:14px 16px;transition:transform .3s cubic-bezier(.34,1.56,.64,1),opacity .3s;display:flex;position:relative;overflow:hidden;transform:translateY(-20px)}._toast_10jk7_14._visible_10jk7_33{opacity:1;transform:translateY(0)}._toast_10jk7_14._leaving_10jk7_38{opacity:0;transition:transform .25s ease-in,opacity .25s ease-in;transform:translateY(-20px)scale(.95)}._error_10jk7_46{border-color:#f446}._error_10jk7_46 ._iconWrapper_10jk7_49,._error_10jk7_46 ._progressBar_10jk7_50{color:var(--danger);background-color:var(--danger)}._success_10jk7_54{border-color:#4caf5066}._success_10jk7_54 ._iconWrapper_10jk7_49,._success_10jk7_54 ._progressBar_10jk7_50{color:var(--success);background-color:var(--success)}._info_10jk7_62{border-color:#60a5fa66}._info_10jk7_62 ._iconWrapper_10jk7_49,._info_10jk7_62 ._progressBar_10jk7_50{color:var(--accent);background-color:var(--accent)}._warning_10jk7_70{border-color:#f59e0b66}._warning_10jk7_70 ._iconWrapper_10jk7_49,._warning_10jk7_70 ._progressBar_10jk7_50{color:#f59e0b;background-color:#f59e0b}._iconWrapper_10jk7_49{flex-shrink:0;justify-content:center;align-items:center;width:24px;height:24px;display:flex;background:0 0!important}._iconWrapper_10jk7_49 svg{width:100%;height:100%}._message_10jk7_94{color:var(--text);flex:1;margin:0;font-size:14px;line-height:1.4}._closeButton_10jk7_102{background:var(--chips-background);width:28px;height:28px;color:var(--muted);cursor:pointer;border:none;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;padding:0;transition:background .2s,color .2s,transform .15s;display:flex}._closeButton_10jk7_102:hover{background:var(--chips-background-active);color:var(--text);transform:scale(1.1)}._closeButton_10jk7_102 svg{width:14px;height:14px}._progressTrack_10jk7_132{background:var(--chips-background);height:3px;position:absolute;bottom:0;left:0;right:0;overflow:hidden}._progressBar_10jk7_50{transform-origin:0;width:100%;height:100%;animation:linear forwards _shrink_10jk7_1}@keyframes _shrink_10jk7_1{0%{transform:scaleX(1)}to{transform:scaleX(0)}}._backdrop_u5sma_1{z-index:1100;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#0000008c;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}._modal_u5sma_13{background:var(--panel);border:1px solid var(--border);width:min(420px,100%);box-shadow:0 24px 64px var(--shadow);border-radius:16px;overflow:hidden}._header_u5sma_22{padding:20px 20px 0}._headerContent_u5sma_26{align-items:center;gap:12px;display:flex}._icon_u5sma_32{color:var(--accent);flex-shrink:0}._danger_u5sma_37 ._icon_u5sma_32{color:var(--danger)}._title_u5sma_41{color:var(--text);margin:0;font-size:18px;font-weight:600}._body_u5sma_48{color:var(--muted);padding:14px 20px 4px;font-size:14px;line-height:1.5}._error_u5sma_55{color:var(--danger);background:#ff44441a;border-radius:8px;align-items:center;gap:8px;margin-top:12px;padding:8px 10px;font-size:13px;display:flex}._actions_u5sma_67{justify-content:flex-end;gap:10px;padding:16px 20px 20px;display:flex}
@@ -0,0 +1,43 @@
1
+ export { darkTheme, lightTheme, themes, toCssVars, type ThemeTokens, type ThemeName, } from './theme/tokens';
2
+ export { useThemeStore } from './theme/useThemeStore';
3
+ export { ThemeProvider, type ThemeProviderProps } from './theme/ThemeProvider';
4
+ export { cx, type ClassValue } from './utils/cx';
5
+ export { Button, type ButtonProps, type ButtonVariant, type ButtonSize } from './components/Button';
6
+ export { IconButton, type IconButtonProps } from './components/IconButton';
7
+ export { Input, type InputProps } from './components/Input';
8
+ export { Textarea, type TextareaProps } from './components/Textarea';
9
+ export { Select, type SelectProps, type SelectOption } from './components/Select';
10
+ export { Checkbox, type CheckboxProps } from './components/Checkbox';
11
+ export { Switch, type SwitchProps } from './components/Switch';
12
+ export { Radio, RadioGroup, type RadioProps, type RadioGroupProps, type RadioOption, } from './components/Radio';
13
+ export { FormField, type FormFieldProps } from './components/FormField';
14
+ export { FileInput, type FileInputProps } from './components/FileInput';
15
+ export { SearchInput, type SearchInputProps } from './components/SearchInput';
16
+ export { Badge, type BadgeProps, type BadgeTone } from './components/Badge';
17
+ export { Tag, type TagProps } from './components/Tag';
18
+ export { Kbd, type KbdProps } from './components/Kbd';
19
+ export { Avatar, type AvatarProps } from './components/Avatar';
20
+ export { Spinner, type SpinnerProps } from './components/Spinner';
21
+ export { Skeleton, type SkeletonProps } from './components/Skeleton';
22
+ export { Divider, type DividerProps } from './components/Divider';
23
+ export { ProgressBar, type ProgressBarProps } from './components/ProgressBar';
24
+ export { Stat, type StatProps } from './components/Stat';
25
+ export { Card, CardHeader, CardBody, CardFooter, type CardProps, type CardHeaderProps, } from './components/Card';
26
+ export { Panel, type PanelProps } from './components/Panel';
27
+ export { Table, TableHeader, TableBody, TableRow, TableHead, TableCell, TableEmpty, type TableProps, type TableHeadProps, type TableCellProps, } from './components/Table';
28
+ export { DescriptionList, type DescriptionListProps, type DescriptionItem, } from './components/DescriptionList';
29
+ export { Flex, type FlexProps, type FlexGap } from './components/Flex';
30
+ export { Stack, Inline } from './components/Layout';
31
+ export { Typography, Title, Text, Paragraph, type TitleProps, type TextProps, type ParagraphProps, type TextTone, type TextSize, } from './components/Typography';
32
+ export { Breadcrumbs, type BreadcrumbsProps, type BreadcrumbItem } from './components/Breadcrumbs';
33
+ export { Tabs, type TabsProps, type TabItem } from './components/Tabs';
34
+ export { Pagination, type PaginationProps } from './components/Pagination';
35
+ export { Menu, MenuItem, MenuSeparator, MenuLabel, type MenuProps, type MenuItemProps, } from './components/Menu';
36
+ export { Modal, type ModalProps } from './components/Modal';
37
+ export { Tooltip, type TooltipProps } from './components/Tooltip';
38
+ export { Alert, type AlertProps, type AlertTone } from './components/Alert';
39
+ export { EmptyState, type EmptyStateProps } from './components/EmptyState';
40
+ export { ToastViewport } from './components/Toast';
41
+ export { useToastStore, toast, type ToastItem, type ToastType } from './components/toastStore';
42
+ export { ConfirmDialog } from './components/ConfirmDialog';
43
+ export { useConfirmStore, confirm, type ConfirmOptions } from './components/confirmStore';
@@ -0,0 +1,5 @@
1
+ import { ReactNode } from 'react';
2
+ export interface ThemeProviderProps {
3
+ children: ReactNode;
4
+ }
5
+ export declare function ThemeProvider({ children }: ThemeProviderProps): import("react").JSX.Element;
@@ -0,0 +1,23 @@
1
+ export interface ThemeTokens {
2
+ primary: string;
3
+ bg: string;
4
+ panel: string;
5
+ card: string;
6
+ border: string;
7
+ text: string;
8
+ muted: string;
9
+ accent: string;
10
+ danger: string;
11
+ success: string;
12
+ warning: string;
13
+ focus: string;
14
+ chipsBackground: string;
15
+ chipsBackgroundActive: string;
16
+ buttons: string;
17
+ shadow: string;
18
+ }
19
+ export type ThemeName = "dark" | "light";
20
+ export declare const darkTheme: ThemeTokens;
21
+ export declare const lightTheme: ThemeTokens;
22
+ export declare const themes: Record<ThemeName, ThemeTokens>;
23
+ export declare function toCssVars(tokens: ThemeTokens): Record<string, string>;
@@ -0,0 +1,21 @@
1
+ import { ThemeName, ThemeTokens } from './tokens';
2
+ interface ThemeStore {
3
+ currentTheme: ThemeName;
4
+ tokens: ThemeTokens;
5
+ setTheme: (theme: ThemeName) => void;
6
+ toggleTheme: () => void;
7
+ }
8
+ export declare const useThemeStore: import('zustand').UseBoundStore<Omit<import('zustand').StoreApi<ThemeStore>, "setState" | "persist"> & {
9
+ setState(partial: ThemeStore | Partial<ThemeStore> | ((state: ThemeStore) => ThemeStore | Partial<ThemeStore>), replace?: false | undefined): unknown;
10
+ setState(state: ThemeStore | ((state: ThemeStore) => ThemeStore), replace: true): unknown;
11
+ persist: {
12
+ setOptions: (options: Partial<import('zustand/middleware').PersistOptions<ThemeStore, ThemeStore, unknown>>) => void;
13
+ clearStorage: () => void;
14
+ rehydrate: () => Promise<void> | void;
15
+ hasHydrated: () => boolean;
16
+ onHydrate: (fn: (state: ThemeStore) => void) => () => void;
17
+ onFinishHydration: (fn: (state: ThemeStore) => void) => () => void;
18
+ getOptions: () => Partial<import('zustand/middleware').PersistOptions<ThemeStore, ThemeStore, unknown>>;
19
+ };
20
+ }>;
21
+ export {};
@@ -0,0 +1,2 @@
1
+ export type ClassValue = unknown;
2
+ export declare const cx: (...values: ClassValue[]) => string;
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "bav-react-ui",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "./dist/bav-ui.cjs",
6
+ "module": "./dist/bav-ui.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/bav-ui.mjs",
11
+ "require": "./dist/bav-ui.cjs",
12
+ "types": "./dist/index.d.ts"
13
+ },
14
+ "./styles/global.css": "./dist/global.css"
15
+ },
16
+ "files": ["dist"],
17
+ "workspaces": [
18
+ "playground"
19
+ ],
20
+ "scripts": {
21
+ "build": "vite build",
22
+ "typecheck": "tsc --noEmit",
23
+ "lint": "eslint .",
24
+ "lint:fix": "eslint . --fix",
25
+ "playground:dev": "cd playground && bun run dev",
26
+ "playground:build": "cd playground && bun run build",
27
+ "playground:build:docs": "cd playground && bun run build && rm -rf ../docs && mv storybook-static ../docs",
28
+ "playground:deploy:gh-pages": "npm run playground:build:docs && bunx gh-pages -d docs"
29
+ },
30
+ "dependencies": {
31
+ "react-feather": "^2.0.10"
32
+ },
33
+ "peerDependencies": {
34
+ "react": ">=18",
35
+ "react-dom": ">=18",
36
+ "zustand": ">=5"
37
+ },
38
+ "devDependencies": {
39
+ "@eslint/js": "^10.0.1",
40
+ "@types/node": "^25.9.3",
41
+ "@types/react": "^19.0.0",
42
+ "@types/react-dom": "^19.0.0",
43
+ "@vitejs/plugin-react": "^6.0.2",
44
+ "eslint": "^9.22.0",
45
+ "eslint-config-prettier": "^10.1.8",
46
+ "eslint-plugin-react": "^7.37.5",
47
+ "eslint-plugin-react-hooks": "^7.1.1",
48
+ "globals": "^17.6.0",
49
+ "path": "^0.12.7",
50
+ "react": "^19.2.6",
51
+ "react-dom": "^19.2.6",
52
+ "typescript": "^5.7.2",
53
+ "typescript-eslint": "^8.61.0",
54
+ "vite": "^8.0.16",
55
+ "vite-plugin-dts": "^5.0.2",
56
+ "vite-plugin-lib-inject-css": "^2.2.2",
57
+ "zustand": "^5.0.13"
58
+ }
59
+ }