h2o-library 1.7.0 → 1.8.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 (48) hide show
  1. package/dist/components/index.d.ts +2 -0
  2. package/dist/components/src/chart-bar.d.ts +2 -1
  3. package/dist/components/src/chart-heatmap.d.ts +2 -1
  4. package/dist/components/src/chart-line.d.ts +2 -1
  5. package/dist/components/src/chart-pie.d.ts +2 -1
  6. package/dist/components/src/checkbox.d.ts +1 -0
  7. package/dist/components/src/chip.d.ts +13 -0
  8. package/dist/components/src/expandable-table.d.ts +2 -1
  9. package/dist/components/src/icon.d.ts +3 -2
  10. package/dist/components/src/message.d.ts +5 -2
  11. package/dist/components/src/modal.d.ts +7 -1
  12. package/dist/components/src/segmented-toggle.d.ts +20 -0
  13. package/dist/components/src/side-panel.d.ts +7 -1
  14. package/dist/components/src/textarea.d.ts +2 -0
  15. package/dist/components/src/tooltip.d.ts +2 -0
  16. package/dist/css/index.css +1 -1
  17. package/dist/css/src/charts.css +13 -0
  18. package/dist/css/src/chip.css +54 -0
  19. package/dist/css/src/expandable-table.css +28 -9
  20. package/dist/css/src/index.css +4 -0
  21. package/dist/css/src/message.css +6 -0
  22. package/dist/css/src/segmented-toggle.css +89 -0
  23. package/dist/css/src/side-panel.css +28 -3
  24. package/dist/css/src/textarea.css +23 -3
  25. package/dist/css/src/tooltip.css +37 -6
  26. package/dist/esm/components/index.d.ts +2 -0
  27. package/dist/esm/components/src/chart-bar.d.ts +2 -1
  28. package/dist/esm/components/src/chart-heatmap.d.ts +2 -1
  29. package/dist/esm/components/src/chart-line.d.ts +2 -1
  30. package/dist/esm/components/src/chart-pie.d.ts +2 -1
  31. package/dist/esm/components/src/checkbox.d.ts +1 -0
  32. package/dist/esm/components/src/chip.d.ts +13 -0
  33. package/dist/esm/components/src/expandable-table.d.ts +2 -1
  34. package/dist/esm/components/src/icon.d.ts +3 -2
  35. package/dist/esm/components/src/message.d.ts +5 -2
  36. package/dist/esm/components/src/modal.d.ts +7 -1
  37. package/dist/esm/components/src/segmented-toggle.d.ts +20 -0
  38. package/dist/esm/components/src/side-panel.d.ts +7 -1
  39. package/dist/esm/components/src/textarea.d.ts +2 -0
  40. package/dist/esm/components/src/tooltip.d.ts +2 -0
  41. package/dist/esm/css/index.css +1 -1
  42. package/dist/esm/index.js +4 -4
  43. package/dist/esm/index.js.map +1 -1
  44. package/dist/esm/types/src/icon.d.ts +1 -1
  45. package/dist/index.cjs.js +4 -4
  46. package/dist/index.cjs.js.map +1 -1
  47. package/dist/types/src/icon.d.ts +1 -1
  48. package/package.json +1 -1
@@ -37,3 +37,5 @@ export * from "./src/date-range-picker";
37
37
  export * from "./src/legend";
38
38
  export * from "./src/chart";
39
39
  export * from "./src/expandable-table";
40
+ export * from "./src/chip";
41
+ export * from "./src/segmented-toggle";
@@ -22,5 +22,6 @@ export interface BarChartProps {
22
22
  wrapLabels?: boolean;
23
23
  onXAxisTickClick?: (value: string | number) => void;
24
24
  onYAxisTickClick?: (value: string | number) => void;
25
+ onBarClick?: (dataPoint: BarChartDataPoint, index: number, dataKey: string) => void;
25
26
  }
26
- export declare const BarChart: ({ data, bars, layout, orientation, showGrid, showLegend, height, rotateLabels, wrapLabels, onXAxisTickClick, onYAxisTickClick, }: BarChartProps) => React.JSX.Element;
27
+ export declare const BarChart: ({ data, bars, layout, orientation, showGrid, showLegend, height, rotateLabels, wrapLabels, onXAxisTickClick, onYAxisTickClick, onBarClick, }: BarChartProps) => React.JSX.Element;
@@ -16,5 +16,6 @@ export interface HeatmapChartProps {
16
16
  showPercentageInTooltip?: boolean;
17
17
  onRowClick?: (row: string) => void;
18
18
  onColumnClick?: (column: string) => void;
19
+ onCellClick?: (row: string, column: string, cellData: HeatmapDataPoint) => void;
19
20
  }
20
- export declare const HeatmapChart: ({ data, showPercentage, height, showValue, showPercentageInTooltip, onRowClick, onColumnClick, }: HeatmapChartProps) => React.JSX.Element;
21
+ export declare const HeatmapChart: ({ data, showPercentage, height, showValue, showPercentageInTooltip, onRowClick, onColumnClick, onCellClick, }: HeatmapChartProps) => React.JSX.Element;
@@ -21,5 +21,6 @@ export interface LineChartProps {
21
21
  showXValue?: boolean;
22
22
  onXAxisTickClick?: (value: string | number) => void;
23
23
  onYAxisTickClick?: (value: string | number) => void;
24
+ onDataPointClick?: (point: LineChartDataPoint, index: number, dataKey: string) => void;
24
25
  }
25
- export declare const LineChart: ({ data, lines, showGrid, showLegend, showGradient, height, showXValue, onXAxisTickClick, onYAxisTickClick, }: LineChartProps) => React.JSX.Element;
26
+ export declare const LineChart: ({ data, lines, showGrid, showLegend, showGradient, height, showXValue, onXAxisTickClick, onYAxisTickClick, onDataPointClick, }: LineChartProps) => React.JSX.Element;
@@ -12,5 +12,6 @@ export interface PieChartProps {
12
12
  height?: number;
13
13
  showLabels?: boolean;
14
14
  showPercentageInTooltip?: boolean;
15
+ onSliceClick?: (dataPoint: PieChartDataPoint, index: number) => void;
15
16
  }
16
- export declare const PieChart: ({ data, variant, showLegend, height, showLabels, showPercentageInTooltip, }: PieChartProps) => React.JSX.Element;
17
+ export declare const PieChart: ({ data, variant, showLegend, height, showLabels, showPercentageInTooltip, onSliceClick, }: PieChartProps) => React.JSX.Element;
@@ -2,6 +2,7 @@ import React from "react";
2
2
  export interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "type"> {
3
3
  label?: string;
4
4
  className?: string;
5
+ labelClassName?: string;
5
6
  isCard?: boolean;
6
7
  isIndeterminate?: boolean;
7
8
  }
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ import { IconType } from "../../types";
3
+ type ChipProps = React.HTMLAttributes<HTMLDivElement> & {
4
+ className?: string;
5
+ label: string;
6
+ icon?: IconType;
7
+ variant?: "neutral" | "primary" | "success" | "warning" | "error";
8
+ iconStrokeWidth?: number;
9
+ iconClassName?: string;
10
+ iconSize?: number;
11
+ };
12
+ export declare const Chip: ({ className, label, icon, variant, iconStrokeWidth, iconClassName, iconSize, ...props }: ChipProps) => React.JSX.Element;
13
+ export {};
@@ -35,5 +35,6 @@ export interface ExpandableTableProps<T extends Record<string, any> & Expandable
35
35
  selectedRows?: T[];
36
36
  setSelectedRows?: (rows: T[]) => void;
37
37
  rowKey?: keyof T;
38
+ onRowClick?: (row: T, rowIndex: number) => void;
38
39
  }
39
- export declare function ExpandableTable<T extends Record<string, any> & ExpandableRow>({ columns, data, isLoading, className, rowHeight, sortKey, sortDirection, onSort, currentPage, totalPages, perPage, perPageOptions, onPageChange, onPerPageChange, maxHeight, containerClassName, selectedRows, setSelectedRows, rowKey, }: ExpandableTableProps<T>): React.JSX.Element;
40
+ export declare function ExpandableTable<T extends Record<string, any> & ExpandableRow>({ columns, data, isLoading, className, rowHeight, sortKey, sortDirection, onSort, currentPage, totalPages, perPage, perPageOptions, onPageChange, onPerPageChange, maxHeight, containerClassName, selectedRows, setSelectedRows, rowKey, onRowClick, }: ExpandableTableProps<T>): React.JSX.Element;
@@ -3,7 +3,8 @@ import { IconType, TooltipPosition } from "../../types";
3
3
  export interface IconProps extends React.SVGProps<SVGSVGElement> {
4
4
  icon: IconType;
5
5
  size?: number;
6
- tooltip?: string;
6
+ tooltip?: string | React.ReactNode;
7
7
  tooltipPosition?: TooltipPosition;
8
+ tooltipVariant?: "dark" | "light";
8
9
  }
9
- export declare const Icon: ({ icon, size, tooltip, tooltipPosition, ...props }: IconProps) => JSX.Element;
10
+ export declare const Icon: ({ icon, size, tooltip, tooltipPosition, tooltipVariant, ...props }: IconProps) => JSX.Element;
@@ -1,9 +1,12 @@
1
1
  import React from "react";
2
- export type MessageVariant = "info" | "muted" | "error" | "warning";
2
+ export type MessageVariant = "info" | "muted" | "error" | "warning" | "success";
3
3
  interface MessageProps {
4
4
  variant: MessageVariant;
5
5
  className?: string;
6
+ iconSize?: number;
7
+ iconStrokeWidth?: number;
8
+ iconClassName?: string;
6
9
  message?: string | null;
7
10
  }
8
- export declare const Message: ({ variant, className, message }: MessageProps) => React.JSX.Element | null;
11
+ export declare const Message: ({ variant, className, iconSize, iconStrokeWidth, iconClassName, message, }: MessageProps) => React.JSX.Element | null;
9
12
  export {};
@@ -6,5 +6,11 @@ export interface ModalProps {
6
6
  description?: string;
7
7
  children: React.ReactNode;
8
8
  className?: string;
9
+ titleContainerClassName?: string;
10
+ titleClassName?: string;
11
+ descriptionClassName?: string;
12
+ closeButtonClassName?: string;
13
+ headerClassName?: string;
14
+ contentClassName?: string;
9
15
  }
10
- export declare const Modal: ({ isOpen, onClose, title, description, children, className, }: ModalProps) => React.ReactPortal | null;
16
+ export declare const Modal: ({ isOpen, onClose, title, description, children, className, titleContainerClassName, titleClassName, descriptionClassName, closeButtonClassName, headerClassName, contentClassName, }: ModalProps) => React.ReactPortal | null;
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import { IconType } from "../../types";
3
+ import type { IconProps as IconPropsType } from "./icon";
4
+ export type SegmentedToggleOption = {
5
+ label: string;
6
+ value: string;
7
+ icon?: IconType;
8
+ iconProps?: Omit<IconPropsType, "icon">;
9
+ labelProps?: React.HTMLAttributes<HTMLSpanElement>;
10
+ };
11
+ export interface SegmentedToggleProps {
12
+ options: SegmentedToggleOption[];
13
+ size?: "sm" | "md" | "lg";
14
+ className?: string;
15
+ optionClassName?: string;
16
+ selected: string;
17
+ onChange: (value: string) => void;
18
+ disabled?: boolean;
19
+ }
20
+ export declare function SegmentedToggle({ options, size, className, optionClassName, selected, onChange, disabled, }: SegmentedToggleProps): React.JSX.Element;
@@ -2,9 +2,15 @@ import React from "react";
2
2
  export interface SidePanelProps {
3
3
  isOpen: boolean;
4
4
  onClose: () => void;
5
+ position?: "left" | "right";
5
6
  title?: string;
6
7
  description?: string;
7
8
  children: React.ReactNode;
8
9
  className?: string;
10
+ titleClassName?: string;
11
+ descriptionClassName?: string;
12
+ closeButtonClassName?: string;
13
+ headerClassName?: string;
14
+ contentClassName?: string;
9
15
  }
10
- export declare const SidePanel: ({ isOpen, onClose, title, description, children, className, }: SidePanelProps) => JSX.Element | null;
16
+ export declare const SidePanel: ({ isOpen, onClose, position, title, description, children, className, titleClassName, descriptionClassName, closeButtonClassName, headerClassName, contentClassName, }: SidePanelProps) => JSX.Element | null;
@@ -9,5 +9,7 @@ export interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTex
9
9
  containerClassName?: string;
10
10
  tooltip?: string;
11
11
  tooltipPosition?: TooltipPosition;
12
+ maxLength?: number;
13
+ enableResize?: boolean;
12
14
  }
13
15
  export declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
@@ -3,7 +3,9 @@ import { TooltipPosition } from "../../types";
3
3
  type BaseProps = {
4
4
  position?: TooltipPosition;
5
5
  className?: string;
6
+ contentClassName?: string;
6
7
  children: React.ReactNode;
8
+ variant?: "dark" | "light";
7
9
  };
8
10
  type TextTooltip = BaseProps & {
9
11
  text: string;
@@ -1 +1 @@
1
- :root{--primary-disabled:225 100% 88%;--primary-muted:221 100% 95%;--primary:225 91% 59%;--primary-200:225 100% 43%;--primary-300:225 91% 40%;--primary-400:225 91% 18%;--success-bg:143 26% 86%;--success:130 35% 46%;--success-200:130 76% 26%;--success-300:130 100% 18%;--warning-bg:45 100% 84%;--warning:45 100% 61%;--warning-200:45 100% 45%;--warning-300:45 100% 32%;--destructive-bg:357 100% 92%;--destructive:0 83% 60%;--destructive-200:0 100% 42%;--destructive-300:0 100% 29%;--muted-25:0 0 98%;--muted-50:0 0 96%;--muted:0 0 80%;--muted-200:0 0 67%;--radius-sm:0.25rem;--radius-md:0.375rem;--radius-lg:0.5rem;--radius-full:9999px}@import "./src/accordion.css";@import "./src/button.css";@import "./src/calendar.css";@import "./src/checkbox.css";@import "./src/content-switch.css";@import "./src/date-range-picker.css";@import "./src/dropdown.css";@import "./src/input.css";@import "./src/modal.css";@import "./src/multi-select.css";@import "./src/compact-multi-select.css";@import "./src/popover.css";@import "./src/radio.css";@import "./src/search.css";@import "./src/side-panel.css";@import "./src/status.css";@import "./src/tabs.css";@import "./src/tag.css";@import "./src/textarea.css";@import "./src/toggle.css";@import "./src/tooltip.css";@import "./src/pagination.css";@import "./src/table.css";@import "./src/toast.css";@import "./src/month-calendar.css";@import "./src/loader.css";@import "./src/message.css";@import "./src/multi-menu.css";@import "./src/charts.css";@import "./src/chart.css";@import "./src/legend.css";@import "./src/expandable-table.css";
1
+ :root{--primary-disabled:225 100% 88%;--primary-muted:221 100% 95%;--primary:225 91% 59%;--primary-200:225 100% 43%;--primary-300:225 91% 40%;--primary-400:225 91% 18%;--success-bg:143 26% 86%;--success:130 35% 46%;--success-200:130 76% 26%;--success-300:130 100% 18%;--warning-bg:45 100% 84%;--warning:45 100% 61%;--warning-200:45 100% 45%;--warning-300:45 100% 32%;--destructive-bg:357 100% 92%;--destructive:0 83% 60%;--destructive-200:0 100% 42%;--destructive-300:0 100% 29%;--muted-25:0 0 98%;--muted-50:0 0 96%;--muted:0 0 80%;--muted-200:0 0 67%;--secondary-bg:0 0% 98%;--radius-sm:0.25rem;--radius-md:0.375rem;--radius-lg:0.5rem;--radius-full:9999px}@import "./src/accordion.css";@import "./src/button.css";@import "./src/calendar.css";@import "./src/checkbox.css";@import "./src/content-switch.css";@import "./src/date-range-picker.css";@import "./src/dropdown.css";@import "./src/input.css";@import "./src/modal.css";@import "./src/multi-select.css";@import "./src/compact-multi-select.css";@import "./src/popover.css";@import "./src/radio.css";@import "./src/search.css";@import "./src/side-panel.css";@import "./src/status.css";@import "./src/tabs.css";@import "./src/tag.css";@import "./src/textarea.css";@import "./src/toggle.css";@import "./src/tooltip.css";@import "./src/pagination.css";@import "./src/table.css";@import "./src/toast.css";@import "./src/month-calendar.css";@import "./src/loader.css";@import "./src/message.css";@import "./src/multi-menu.css";@import "./src/charts.css";@import "./src/chart.css";@import "./src/legend.css";@import "./src/expandable-table.css";@import "./src/chip.css";@import "./src/segmented-toggle.css";
@@ -15,6 +15,19 @@
15
15
  text-align: center;
16
16
  }
17
17
 
18
+ /* Pointer cursor on slices when clickable */
19
+ .pie-chart-clickable path,
20
+ .pie-chart-clickable .recharts-pie-sector {
21
+ cursor: pointer;
22
+ }
23
+
24
+ /* Remove focus outline on pie slices after click */
25
+ .pie-chart-container path:focus,
26
+ .pie-chart-container .recharts-pie-sector:focus,
27
+ .pie-chart-container .recharts-layer path:focus {
28
+ outline: none;
29
+ }
30
+
18
31
  .stat-chart-container {
19
32
  font-family: sans-serif;
20
33
  text-align: center;
@@ -0,0 +1,54 @@
1
+ .chip-base {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ gap: 0.25rem;
5
+ padding: 0.25rem 0.5rem;
6
+ border-radius: 0.75rem;
7
+ font-size: 0.8rem;
8
+ font-weight: 500;
9
+ line-height: 1;
10
+ text-wrap: nowrap;
11
+ overflow: hidden;
12
+ text-overflow: ellipsis;
13
+ white-space: nowrap;
14
+ }
15
+
16
+ .chip-has-icon {
17
+ padding-left: 0.25rem;
18
+ }
19
+
20
+ .chip-label {
21
+ white-space: nowrap;
22
+ overflow: hidden;
23
+ text-overflow: ellipsis;
24
+ }
25
+
26
+ .chip-neutral {
27
+ background-color: hsl(var(--secondary-bg));
28
+ color: hsl(var(--foreground) / 0.8);
29
+ border: 1.5px solid hsl(var(--muted) / 0.6);
30
+ }
31
+
32
+ .chip-primary {
33
+ background-color: hsl(var(--primary-muted));
34
+ color: hsl(var(--primary));
35
+ border: 1.5px solid hsl(var(--primary) / 0.2);
36
+ }
37
+
38
+ .chip-success {
39
+ background-color: hsl(var(--success-bg) / 0.4);
40
+ color: hsl(var(--success));
41
+ border: 1.5px solid hsl(var(--success) / 0.5);
42
+ }
43
+
44
+ .chip-warning {
45
+ background-color: hsl(var(--warning-bg) / 0.4);
46
+ color: hsl(var(--warning-200));
47
+ border: 1.5px solid hsl(var(--warning-200) / 0.5);
48
+ }
49
+
50
+ .chip-error {
51
+ background-color: hsl(var(--destructive-bg) / 0.4);
52
+ color: hsl(var(--destructive));
53
+ border: 1.5px solid hsl(var(--destructive) / 0.5);
54
+ }
@@ -31,12 +31,26 @@
31
31
  color: hsl(var(--primary));
32
32
  }
33
33
 
34
- .expandable-table tr.expanded-row {
35
- border: 1px solid hsl(var(--primary));
34
+ /* Row immediately before an expanded row: bottom border primary (forms top edge of expanded block) */
35
+ .expandable-table tbody tr:has(+ tr.expanded-row) td {
36
+ border-bottom-color: hsl(var(--primary));
36
37
  }
37
38
 
38
- .expandable-table .expandable-row {
39
- border: 1px solid hsl(var(--primary));
39
+ /* Expanded main row: no vertical borders between cells; only outer left/right and top/bottom */
40
+ .expandable-table tr.expanded-row td {
41
+ border-bottom: 1px solid hsl(var(--primary));
42
+ border-left: none;
43
+ border-right: none;
44
+ }
45
+ .expandable-table tr.expanded-row td:first-child {
46
+ border-left: 1px solid hsl(var(--primary));
47
+ }
48
+ .expandable-table tr.expanded-row td:last-child {
49
+ border-right: 1px solid hsl(var(--primary));
50
+ }
51
+ /* Top border primary (below header when first row, or below previous row) */
52
+ .expandable-table tbody tr.expanded-row td {
53
+ border-top: 1px solid hsl(var(--primary));
40
54
  }
41
55
 
42
56
  .expandable-table tr.expanded-row .expand-button {
@@ -47,16 +61,21 @@
47
61
  padding: 1rem;
48
62
  }
49
63
 
64
+ /* Expandable content row: primary border on all sides (divider above + bottom/left/right) */
65
+ .expandable-table .expandable-row td {
66
+ padding: 0;
67
+ border: 1px solid hsl(var(--primary));
68
+ }
69
+ /* When expandable content row is last in table, keep bottom border (table.css removes it otherwise) */
70
+ .expandable-table tbody tr.expandable-row:last-child td {
71
+ border-bottom: 1px solid hsl(var(--primary));
72
+ }
73
+
50
74
  /* Animation for expanding/collapsing rows */
51
75
  .expandable-table .expandable-row {
52
76
  transition: all 0.3s ease-in-out;
53
77
  }
54
78
 
55
- .expandable-table .expandable-row td {
56
- padding: 0;
57
- border-bottom: none;
58
- }
59
-
60
79
  .expandable-table .expandable-content {
61
80
  animation: slideDown 0.3s ease-in-out;
62
81
  }
@@ -26,6 +26,8 @@
26
26
  --muted: 0 0 80%;
27
27
  --muted-200: 0 0 67%;
28
28
 
29
+ --secondary-bg: 0 0% 98%;
30
+
29
31
  --radius-sm: 0.25rem;
30
32
  --radius-md: 0.375rem;
31
33
  --radius-lg: 0.5rem;
@@ -64,3 +66,5 @@
64
66
  @import "./src/chart.css";
65
67
  @import "./src/legend.css";
66
68
  @import "./src/expandable-table.css";
69
+ @import "./src/chip.css";
70
+ @import "./src/segmented-toggle.css";
@@ -32,3 +32,9 @@
32
32
  color: hsl(var(--warning));
33
33
  border: 1px solid hsl(var(--warning) / 0.3);
34
34
  }
35
+
36
+ .message-success {
37
+ background-color: hsl(var(--success-bg) / 0.4);
38
+ color: hsl(var(--success));
39
+ border: 1px solid hsl(var(--success) / 0.3);
40
+ }
@@ -0,0 +1,89 @@
1
+ .segmented-toggle {
2
+ display: flex;
3
+ width: fit-content;
4
+ border-radius: 0.3rem;
5
+ border: 1.5px solid hsl(var(--muted) / 0.6);
6
+ background-color: hsl(var(--secondary-bg));
7
+ transition: border-color 0.2s ease-in-out;
8
+ padding: 0.2rem;
9
+ gap: 0.125rem;
10
+ overflow: hidden;
11
+ }
12
+
13
+ .segmented-toggle:hover {
14
+ border-color: hsl(var(--primary));
15
+ }
16
+
17
+ .segmented-toggle-option {
18
+ padding: 0.375rem 0.5rem;
19
+ color: hsl(var(--muted-200));
20
+ background: none;
21
+ border: none;
22
+ cursor: pointer;
23
+ font: inherit;
24
+ transition: all 0.2s ease-in-out;
25
+ border-radius: var(--radius-sm);
26
+ line-height: 1;
27
+ text-wrap: nowrap;
28
+ overflow: hidden;
29
+ text-overflow: ellipsis;
30
+ white-space: nowrap;
31
+ display: flex;
32
+ align-items: center;
33
+ }
34
+
35
+ .segmented-toggle-option:hover:not(.segmented-toggle-option-disabled):not(
36
+ .segmented-toggle-option-selected
37
+ ) {
38
+ color: hsl(var(--foreground));
39
+ }
40
+
41
+ .segmented-toggle-option-selected {
42
+ background-color: hsl(var(--primary));
43
+ color: white;
44
+ }
45
+
46
+ .segmented-toggle-option-selected:hover:not(.segmented-toggle-option-disabled) {
47
+ background-color: hsl(var(--primary-200));
48
+ }
49
+
50
+ .segmented-toggle-option-content {
51
+ display: inline-flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ gap: 0.3rem;
55
+ }
56
+
57
+ .segmented-toggle-option-icon {
58
+ flex-shrink: 0;
59
+ }
60
+
61
+ /* Sizes */
62
+ .segmented-toggle--sm .segmented-toggle-option {
63
+ font-size: 0.75rem;
64
+ padding: 0.25rem 0.5rem;
65
+ }
66
+
67
+ .segmented-toggle--md .segmented-toggle-option {
68
+ font-size: 0.875rem;
69
+ padding: 0.3rem 0.75rem;
70
+ }
71
+
72
+ .segmented-toggle--lg .segmented-toggle-option {
73
+ font-size: 1rem;
74
+ padding: 0.375rem 1rem;
75
+ }
76
+
77
+ .segmented-toggle-option-disabled {
78
+ opacity: 0.5;
79
+ cursor: not-allowed;
80
+ }
81
+
82
+ .segmented-toggle-option-disabled:hover {
83
+ background-color: inherit !important;
84
+ color: inherit !important;
85
+ }
86
+
87
+ .segmented-toggle-option-disabled.segmented-toggle-option-selected {
88
+ opacity: 0.7;
89
+ }
@@ -3,11 +3,18 @@
3
3
  inset: 0;
4
4
  background-color: rgba(0, 0, 0, 0.5);
5
5
  display: flex;
6
- justify-content: flex-end;
7
6
  z-index: 50;
8
7
  animation: overlayShow 0.15s ease-out;
9
8
  }
10
9
 
10
+ .side-panel-overlay-right {
11
+ justify-content: flex-end;
12
+ }
13
+
14
+ .side-panel-overlay-left {
15
+ justify-content: flex-start;
16
+ }
17
+
11
18
  .side-panel {
12
19
  background-color: hsl(var(--background));
13
20
  width: 100%;
@@ -15,7 +22,14 @@
15
22
  height: 100vh;
16
23
  display: flex;
17
24
  flex-direction: column;
18
- animation: sidePanelShow 0.3s cubic-bezier(0.16, 1, 0.3, 1);
25
+ }
26
+
27
+ .side-panel-right {
28
+ animation: sidePanelShowRight 0.3s cubic-bezier(0.16, 1, 0.3, 1);
29
+ }
30
+
31
+ .side-panel-left {
32
+ animation: sidePanelShowLeft 0.3s cubic-bezier(0.16, 1, 0.3, 1);
19
33
  }
20
34
 
21
35
  .side-panel-header {
@@ -63,7 +77,7 @@
63
77
  flex: 1;
64
78
  }
65
79
 
66
- @keyframes sidePanelShow {
80
+ @keyframes sidePanelShowRight {
67
81
  from {
68
82
  opacity: 0;
69
83
  transform: translateX(100%);
@@ -73,3 +87,14 @@
73
87
  transform: translateX(0);
74
88
  }
75
89
  }
90
+
91
+ @keyframes sidePanelShowLeft {
92
+ from {
93
+ opacity: 0;
94
+ transform: translateX(-100%);
95
+ }
96
+ to {
97
+ opacity: 1;
98
+ transform: translateX(0);
99
+ }
100
+ }
@@ -53,9 +53,10 @@
53
53
  border: 1.5px solid hsl(var(--muted));
54
54
  background: hsl(var(--background));
55
55
  transition: border-color 0.2s, background-color 0.2s;
56
+ height: 100%;
56
57
  }
57
58
 
58
- .textarea-wrapper::after {
59
+ .textarea-wrapper-resizable::after {
59
60
  content: "";
60
61
  position: absolute;
61
62
  right: 0;
@@ -72,7 +73,7 @@
72
73
  transition: opacity 0.2s;
73
74
  }
74
75
 
75
- .textarea-wrapper:hover::after {
76
+ .textarea-wrapper-resizable:hover::after {
76
77
  opacity: 1;
77
78
  }
78
79
 
@@ -109,12 +110,16 @@
109
110
  color: hsl(var(--foreground));
110
111
  background: none;
111
112
  padding: 0.75rem 1rem;
112
- resize: vertical;
113
+ resize: none;
113
114
  appearance: none;
114
115
  -webkit-appearance: none;
115
116
  font-family: inherit;
116
117
  }
117
118
 
119
+ .textarea-wrapper-resizable .textarea {
120
+ resize: vertical;
121
+ }
122
+
118
123
  .textarea::-webkit-resizer {
119
124
  display: none;
120
125
  }
@@ -169,3 +174,18 @@
169
174
  .textarea-info-icon:hover {
170
175
  color: hsl(var(--primary));
171
176
  }
177
+
178
+ /* Character counter (when maxLength is set) */
179
+ .textarea-counter {
180
+ position: absolute;
181
+ right: 0.5rem;
182
+ bottom: 0.5rem;
183
+ font-size: 0.75rem;
184
+ color: hsl(var(--muted-200));
185
+ pointer-events: none;
186
+ line-height: 1;
187
+ }
188
+
189
+ .textarea-wrapper-resizable .textarea-counter {
190
+ right: 1.75rem;
191
+ }
@@ -5,8 +5,6 @@
5
5
 
6
6
  .tooltip-box {
7
7
  position: fixed;
8
- background-color: #1f2937;
9
- color: #ffffff;
10
8
  padding: 0.5rem 0.75rem;
11
9
  border-radius: 6px;
12
10
  font-size: 0.8125rem;
@@ -19,6 +17,19 @@
19
17
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
20
18
  }
21
19
 
20
+ /* Dark variant (default) */
21
+ .tooltip-box--dark {
22
+ background-color: #1f2937;
23
+ color: #ffffff;
24
+ }
25
+
26
+ /* Light variant */
27
+ .tooltip-box--light {
28
+ background-color: #ffffff;
29
+ color: #1f2937;
30
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
31
+ }
32
+
22
33
  /* Arrow */
23
34
  .tooltip-box::after {
24
35
  content: "";
@@ -36,33 +47,53 @@
36
47
  }
37
48
 
38
49
  /* Position: Top - Arrow at bottom */
50
+ .tooltip-box--dark[data-position="top"]::after {
51
+ border-top-color: #1f2937;
52
+ }
53
+ .tooltip-box--light[data-position="top"]::after {
54
+ border-top-color: #ffffff;
55
+ }
39
56
  .tooltip-box[data-position="top"]::after {
40
57
  top: 100%;
41
58
  left: 50%;
42
59
  transform: translateX(-50%);
43
- border-top-color: #1f2937;
44
60
  }
45
61
 
46
62
  /* Position: Bottom - Arrow at top */
63
+ .tooltip-box--dark[data-position="bottom"]::after {
64
+ border-bottom-color: #1f2937;
65
+ }
66
+ .tooltip-box--light[data-position="bottom"]::after {
67
+ border-bottom-color: #ffffff;
68
+ }
47
69
  .tooltip-box[data-position="bottom"]::after {
48
70
  bottom: 100%;
49
71
  left: 50%;
50
72
  transform: translateX(-50%);
51
- border-bottom-color: #1f2937;
52
73
  }
53
74
 
54
75
  /* Position: Left - Arrow at right */
76
+ .tooltip-box--dark[data-position="left"]::after {
77
+ border-left-color: #1f2937;
78
+ }
79
+ .tooltip-box--light[data-position="left"]::after {
80
+ border-left-color: #ffffff;
81
+ }
55
82
  .tooltip-box[data-position="left"]::after {
56
83
  left: 100%;
57
84
  top: 50%;
58
85
  transform: translateY(-50%);
59
- border-left-color: #1f2937;
60
86
  }
61
87
 
62
88
  /* Position: Right - Arrow at left */
89
+ .tooltip-box--dark[data-position="right"]::after {
90
+ border-right-color: #1f2937;
91
+ }
92
+ .tooltip-box--light[data-position="right"]::after {
93
+ border-right-color: #ffffff;
94
+ }
63
95
  .tooltip-box[data-position="right"]::after {
64
96
  right: 100%;
65
97
  top: 50%;
66
98
  transform: translateY(-50%);
67
- border-right-color: #1f2937;
68
99
  }
@@ -37,3 +37,5 @@ export * from "./src/date-range-picker";
37
37
  export * from "./src/legend";
38
38
  export * from "./src/chart";
39
39
  export * from "./src/expandable-table";
40
+ export * from "./src/chip";
41
+ export * from "./src/segmented-toggle";
@@ -22,5 +22,6 @@ export interface BarChartProps {
22
22
  wrapLabels?: boolean;
23
23
  onXAxisTickClick?: (value: string | number) => void;
24
24
  onYAxisTickClick?: (value: string | number) => void;
25
+ onBarClick?: (dataPoint: BarChartDataPoint, index: number, dataKey: string) => void;
25
26
  }
26
- export declare const BarChart: ({ data, bars, layout, orientation, showGrid, showLegend, height, rotateLabels, wrapLabels, onXAxisTickClick, onYAxisTickClick, }: BarChartProps) => React.JSX.Element;
27
+ export declare const BarChart: ({ data, bars, layout, orientation, showGrid, showLegend, height, rotateLabels, wrapLabels, onXAxisTickClick, onYAxisTickClick, onBarClick, }: BarChartProps) => React.JSX.Element;
@@ -16,5 +16,6 @@ export interface HeatmapChartProps {
16
16
  showPercentageInTooltip?: boolean;
17
17
  onRowClick?: (row: string) => void;
18
18
  onColumnClick?: (column: string) => void;
19
+ onCellClick?: (row: string, column: string, cellData: HeatmapDataPoint) => void;
19
20
  }
20
- export declare const HeatmapChart: ({ data, showPercentage, height, showValue, showPercentageInTooltip, onRowClick, onColumnClick, }: HeatmapChartProps) => React.JSX.Element;
21
+ export declare const HeatmapChart: ({ data, showPercentage, height, showValue, showPercentageInTooltip, onRowClick, onColumnClick, onCellClick, }: HeatmapChartProps) => React.JSX.Element;