h2o-library 1.0.0 → 1.2.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 (56) hide show
  1. package/README.md +28 -0
  2. package/dist/components/index.d.ts +5 -1
  3. package/dist/components/src/accordion.d.ts +4 -1
  4. package/dist/components/src/button.d.ts +1 -1
  5. package/dist/components/src/calendar.d.ts +12 -0
  6. package/dist/components/src/expandable.d.ts +1 -1
  7. package/dist/components/src/icon.d.ts +1 -1
  8. package/dist/components/src/logo.d.ts +5 -0
  9. package/dist/components/src/pagination.d.ts +14 -0
  10. package/dist/components/src/popover.d.ts +7 -5
  11. package/dist/components/src/radio.d.ts +1 -1
  12. package/dist/components/src/side-panel.d.ts +1 -1
  13. package/dist/components/src/table.d.ts +27 -0
  14. package/dist/components/src/toast.d.ts +20 -0
  15. package/dist/components/src/toggle.d.ts +2 -1
  16. package/dist/css/index.css +1 -1
  17. package/dist/css/src/accordion.css +14 -8
  18. package/dist/css/src/button.css +35 -1
  19. package/dist/css/src/calendar.css +197 -7
  20. package/dist/css/src/content-switch.css +1 -0
  21. package/dist/css/src/dropdown.css +4 -4
  22. package/dist/css/src/index.css +7 -7
  23. package/dist/css/src/input.css +15 -6
  24. package/dist/css/src/modal.css +2 -2
  25. package/dist/css/src/multi-select.css +1 -1
  26. package/dist/css/src/pagination.css +80 -0
  27. package/dist/css/src/popover.css +4 -1
  28. package/dist/css/src/side-panel.css +3 -4
  29. package/dist/css/src/table.css +103 -0
  30. package/dist/css/src/tabs.css +1 -1
  31. package/dist/css/src/textarea.css +20 -5
  32. package/dist/css/src/toast.css +97 -0
  33. package/dist/css/src/toggle.css +23 -4
  34. package/dist/css/src/tooltip.css +5 -5
  35. package/dist/esm/components/index.d.ts +5 -1
  36. package/dist/esm/components/src/accordion.d.ts +4 -1
  37. package/dist/esm/components/src/button.d.ts +1 -1
  38. package/dist/esm/components/src/calendar.d.ts +12 -0
  39. package/dist/esm/components/src/expandable.d.ts +1 -1
  40. package/dist/esm/components/src/icon.d.ts +1 -1
  41. package/dist/esm/components/src/logo.d.ts +5 -0
  42. package/dist/esm/components/src/pagination.d.ts +14 -0
  43. package/dist/esm/components/src/popover.d.ts +7 -5
  44. package/dist/esm/components/src/radio.d.ts +1 -1
  45. package/dist/esm/components/src/side-panel.d.ts +1 -1
  46. package/dist/esm/components/src/table.d.ts +27 -0
  47. package/dist/esm/components/src/toast.d.ts +20 -0
  48. package/dist/esm/components/src/toggle.d.ts +2 -1
  49. package/dist/esm/css/index.css +1 -1
  50. package/dist/esm/index.js +1 -1
  51. package/dist/esm/index.js.map +1 -1
  52. package/dist/index.cjs.js +1 -1
  53. package/dist/index.cjs.js.map +1 -1
  54. package/package.json +8 -5
  55. package/dist/components/src/date-picker.d.ts +0 -13
  56. package/dist/esm/components/src/date-picker.d.ts +0 -13
@@ -41,7 +41,7 @@
41
41
  .modal-description {
42
42
  margin: 0.5rem 0 0;
43
43
  font-size: 0.875rem;
44
- color: hsl(var(--muted-100));
44
+ color: hsl(var(--muted-200));
45
45
  }
46
46
 
47
47
  .modal-close {
@@ -49,7 +49,7 @@
49
49
  background: none;
50
50
  border: none;
51
51
  border-radius: 0.375rem;
52
- color: hsl(var(--muted-100));
52
+ color: hsl(var(--muted-200));
53
53
  cursor: pointer;
54
54
  transition: all 0.2s;
55
55
  }
@@ -47,7 +47,7 @@
47
47
  }
48
48
 
49
49
  .multi-select-trigger-icon {
50
- color: hsl(var(--muted-100));
50
+ color: hsl(var(--muted-200));
51
51
  }
52
52
 
53
53
  .multi-select-options-container {
@@ -0,0 +1,80 @@
1
+ .pagination {
2
+ display: flex;
3
+ align-items: center;
4
+ justify-content: space-between;
5
+ gap: 1rem;
6
+ }
7
+
8
+ .pagination-per-page {
9
+ min-width: 140px;
10
+ }
11
+
12
+ .pagination-controls {
13
+ display: flex;
14
+ align-items: center;
15
+ gap: 0.25rem;
16
+ }
17
+
18
+ .pagination-arrow {
19
+ display: flex;
20
+ align-items: center;
21
+ justify-content: center;
22
+ padding: 0.5rem;
23
+ border: none;
24
+ background: none;
25
+ color: hsl(var(--foreground));
26
+ cursor: pointer;
27
+ border-radius: var(--radius-md);
28
+ position: relative;
29
+ }
30
+
31
+ .pagination-arrow:hover:not(:disabled) {
32
+ background-color: hsl(var(--muted-25));
33
+ }
34
+
35
+ .pagination-arrow:disabled {
36
+ color: hsl(var(--muted));
37
+ cursor: not-allowed;
38
+ }
39
+
40
+ .pagination-arrow .second-chevron {
41
+ position: absolute;
42
+ left: 8px;
43
+ }
44
+
45
+ .pagination-pages {
46
+ display: flex;
47
+ align-items: center;
48
+ gap: 0.25rem;
49
+ }
50
+
51
+ .pagination-page {
52
+ min-width: 2rem;
53
+ height: 2rem;
54
+ display: flex;
55
+ align-items: center;
56
+ justify-content: center;
57
+ border: none;
58
+ background: none;
59
+ border-radius: var(--radius-md);
60
+ color: hsl(var(--foreground));
61
+ cursor: pointer;
62
+ font-size: 0.875rem;
63
+ }
64
+
65
+ .pagination-page:hover:not(:disabled) {
66
+ background-color: hsl(var(--muted-25));
67
+ }
68
+
69
+ .pagination-page:disabled {
70
+ cursor: default;
71
+ }
72
+
73
+ .pagination-page-active {
74
+ background-color: hsl(var(--primary));
75
+ color: white;
76
+ }
77
+
78
+ .pagination-page-active:hover {
79
+ background-color: hsl(var(--primary-200)) !important;
80
+ }
@@ -1,6 +1,9 @@
1
+ .popover-trigger {
2
+ width: 100%;
3
+ }
4
+
1
5
  .popover-content {
2
6
  z-index: 50;
3
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
4
7
  animation: popoverShow 0.2s cubic-bezier(0.16, 1, 0.3, 1);
5
8
  transform-origin: var(--origin, top);
6
9
  }
@@ -11,7 +11,7 @@
11
11
  .side-panel {
12
12
  background-color: hsl(var(--background));
13
13
  width: 100%;
14
- max-width: 32rem;
14
+ max-width: 24rem;
15
15
  height: 100vh;
16
16
  display: flex;
17
17
  flex-direction: column;
@@ -40,7 +40,7 @@
40
40
  .side-panel-description {
41
41
  margin: 0.5rem 0 0;
42
42
  font-size: 0.875rem;
43
- color: hsl(var(--muted-100));
43
+ color: hsl(var(--muted-200));
44
44
  }
45
45
 
46
46
  .side-panel-close {
@@ -48,7 +48,7 @@
48
48
  background: none;
49
49
  border: none;
50
50
  border-radius: 0.375rem;
51
- color: hsl(var(--muted-100));
51
+ color: hsl(var(--muted-200));
52
52
  cursor: pointer;
53
53
  transition: all 0.2s;
54
54
  }
@@ -59,7 +59,6 @@
59
59
  }
60
60
 
61
61
  .side-panel-content {
62
- padding: 1.5rem;
63
62
  overflow-y: auto;
64
63
  flex: 1;
65
64
  }
@@ -0,0 +1,103 @@
1
+ .table-container {
2
+ width: 100%;
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: 1rem;
6
+ }
7
+
8
+ .table-wrapper {
9
+ width: 100%;
10
+ overflow-x: auto;
11
+ border: 1px solid hsl(var(--muted) / 60%);
12
+ border-radius: var(--radius-md);
13
+ }
14
+
15
+ .table {
16
+ width: 100%;
17
+ border-collapse: collapse;
18
+ text-align: left;
19
+ font-size: 0.875rem;
20
+ }
21
+
22
+ .table th {
23
+ font-weight: 600;
24
+ padding: 0.75rem 1rem;
25
+ color: hsl(var(--foreground));
26
+ border-bottom: 1px solid hsl(var(--muted) / 60%);
27
+ white-space: nowrap;
28
+ }
29
+
30
+ .table th.sortable {
31
+ cursor: pointer;
32
+ }
33
+
34
+ .table th.sortable:hover {
35
+ background-color: hsl(var(--muted-200));
36
+ }
37
+
38
+ .table-header-content {
39
+ display: flex;
40
+ align-items: center;
41
+ gap: 0.5rem;
42
+ }
43
+
44
+ .table-sort-icon {
45
+ display: flex;
46
+ align-items: center;
47
+ color: hsl(var(--muted));
48
+ }
49
+
50
+ .table-sort-icon.active {
51
+ color: hsl(var(--foreground));
52
+ }
53
+
54
+ .table-sort-icon .default {
55
+ opacity: 0.5;
56
+ }
57
+
58
+ .table td {
59
+ padding: 0.75rem 1rem;
60
+ border-bottom: 1px solid hsl(var(--muted) / 60%);
61
+ color: hsl(var(--foreground));
62
+ }
63
+
64
+ .table tr:last-child td {
65
+ border-bottom: none;
66
+ }
67
+
68
+ /* .table tbody tr:hover {
69
+ background-color: hsl(var(--muted-200));
70
+ } */
71
+
72
+ .table-loading,
73
+ .table-empty {
74
+ text-align: center;
75
+ color: hsl(var(--muted));
76
+ padding: 2rem !important;
77
+ }
78
+
79
+ .table-loading {
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ gap: 0.5rem;
84
+ }
85
+
86
+ .table-loader {
87
+ width: 1rem;
88
+ height: 1rem;
89
+ border: 2px solid hsl(var(--muted-50));
90
+ border-top-color: hsl(var(--primary));
91
+ border-radius: 50%;
92
+ animation: spin 1s linear infinite;
93
+ }
94
+
95
+ @keyframes spin {
96
+ to {
97
+ transform: rotate(360deg);
98
+ }
99
+ }
100
+
101
+ .table-pagination {
102
+ padding: 0 0.5rem;
103
+ }
@@ -8,7 +8,7 @@
8
8
  padding: 0.2rem;
9
9
  background: none;
10
10
  border: none;
11
- color: hsl(var(--muted-100));
11
+ color: hsl(var(--muted-200));
12
12
  font-weight: 500;
13
13
  cursor: pointer;
14
14
  transition: color 0.2s;
@@ -5,6 +5,12 @@
5
5
  width: 100%;
6
6
  }
7
7
 
8
+ .textarea::placeholder {
9
+ color: hsl(var(--muted));
10
+ font-size: 0.875rem;
11
+ font-weight: 400;
12
+ }
13
+
8
14
  .textarea-header {
9
15
  display: flex;
10
16
  align-items: center;
@@ -22,7 +28,7 @@
22
28
 
23
29
  .textarea-clear {
24
30
  font-size: 0.875rem;
25
- color: hsl(var(--muted-100));
31
+ color: hsl(var(--muted-200));
26
32
  background: none;
27
33
  border: none;
28
34
  cursor: pointer;
@@ -43,8 +49,9 @@
43
49
  position: relative;
44
50
  display: flex;
45
51
  width: 100%;
46
- border-radius: 0.375rem;
52
+ border-radius: var(--radius-md);
47
53
  border: 1.5px solid hsl(var(--muted));
54
+ background: hsl(var(--background));
48
55
  transition: border-color 0.2s, background-color 0.2s;
49
56
  }
50
57
 
@@ -81,7 +88,7 @@
81
88
 
82
89
  .textarea-wrapper.textarea-error {
83
90
  border-color: hsl(var(--destructive));
84
- background-color: hsl(var(--destructive) / 0.05);
91
+ background-color: hsl(var(--destructive-bg) / 0.3);
85
92
  }
86
93
 
87
94
  .textarea-wrapper.textarea-error:hover,
@@ -97,10 +104,10 @@
97
104
  .textarea {
98
105
  width: 100%;
99
106
  min-height: 100px;
100
- background: transparent;
101
107
  border: none;
102
108
  outline: none;
103
109
  color: hsl(var(--foreground));
110
+ background: none;
104
111
  padding: 0.75rem 1rem;
105
112
  resize: vertical;
106
113
  appearance: none;
@@ -134,7 +141,7 @@
134
141
 
135
142
  .textarea-note {
136
143
  font-size: 0.875rem;
137
- color: hsl(var(--muted-100));
144
+ color: hsl(var(--muted-200));
138
145
  transition: color 0.2s;
139
146
  }
140
147
 
@@ -154,3 +161,11 @@
154
161
  font-size: 0.875rem;
155
162
  color: hsl(var(--destructive));
156
163
  }
164
+
165
+ .textarea-info-icon {
166
+ color: hsl(var(--muted-200));
167
+ }
168
+
169
+ .textarea-info-icon:hover {
170
+ color: hsl(var(--primary));
171
+ }
@@ -0,0 +1,97 @@
1
+ .toast-container {
2
+ position: fixed;
3
+ bottom: 1rem;
4
+ right: 1rem;
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: 0.5rem;
8
+ z-index: 50;
9
+ max-width: 420px;
10
+ width: calc(100% - 2rem);
11
+ }
12
+
13
+ .toast {
14
+ display: flex;
15
+ gap: 0.75rem;
16
+ padding: 1rem;
17
+ border-radius: var(--radius-md);
18
+ background: white;
19
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
20
+ animation: slideIn 0.2s ease-out;
21
+ }
22
+
23
+ @keyframes slideIn {
24
+ from {
25
+ transform: translateX(100%);
26
+ opacity: 0;
27
+ }
28
+ to {
29
+ transform: translateX(0);
30
+ opacity: 1;
31
+ }
32
+ }
33
+
34
+ .toast-content {
35
+ flex: 1;
36
+ min-width: 0;
37
+ }
38
+
39
+ .toast-header {
40
+ display: flex;
41
+ justify-content: space-between;
42
+ align-items: flex-start;
43
+ gap: 0.5rem;
44
+ }
45
+
46
+ .toast-title {
47
+ margin: 0;
48
+ font-size: 0.875rem;
49
+ font-weight: 600;
50
+ color: hsl(var(--foreground));
51
+ }
52
+
53
+ .toast-description {
54
+ margin: 0.25rem 0 0;
55
+ font-size: 0.875rem;
56
+ color: hsl(var(--muted-200));
57
+ }
58
+
59
+ .toast-close {
60
+ padding: 0;
61
+ background: none;
62
+ border: none;
63
+ color: hsl(var(--muted));
64
+ cursor: pointer;
65
+ display: flex;
66
+ align-items: center;
67
+ justify-content: center;
68
+ }
69
+
70
+ .toast-close:hover {
71
+ color: hsl(var(--foreground));
72
+ }
73
+
74
+ .toast-actions {
75
+ display: flex;
76
+ justify-content: flex-end;
77
+ gap: 0.5rem;
78
+ margin-top: 0.75rem;
79
+ }
80
+
81
+ /* Variant styles */
82
+
83
+ .toast-info .toast-icon {
84
+ color: hsl(var(--primary));
85
+ }
86
+
87
+ .toast-error .toast-icon {
88
+ color: hsl(var(--destructive));
89
+ }
90
+
91
+ .toast-warning .toast-icon {
92
+ color: hsl(var(--warning));
93
+ }
94
+
95
+ .toast-success .toast-icon {
96
+ color: hsl(var(--success));
97
+ }
@@ -4,16 +4,35 @@
4
4
  align-items: center;
5
5
  cursor: pointer;
6
6
  user-select: none;
7
+ width: 100%;
7
8
  }
8
9
 
9
10
  .toggle-text {
10
11
  color: hsl(var(--foreground));
11
- max-width: 80%;
12
+ max-width: 100%;
13
+ height: 24px;
12
14
  white-space: nowrap;
13
15
  overflow: hidden;
14
16
  text-overflow: ellipsis;
15
17
  }
16
18
 
19
+ .toggle-label-content {
20
+ display: flex;
21
+ flex-direction: column;
22
+ gap: 2px;
23
+ width: calc(100% - 56px);
24
+ }
25
+
26
+ .toggle-description {
27
+ color: hsl(var(--muted-200));
28
+ font-size: 0.875rem;
29
+ line-height: 1.25rem;
30
+ max-width: 100%;
31
+ white-space: normal;
32
+ overflow: hidden;
33
+ text-overflow: ellipsis;
34
+ }
35
+
17
36
  .toggle-label input {
18
37
  position: absolute;
19
38
  opacity: 0;
@@ -23,8 +42,8 @@
23
42
 
24
43
  .toggle-container {
25
44
  display: flex;
26
- align-items: center;
27
45
  gap: 12px;
46
+ width: 100%;
28
47
  }
29
48
 
30
49
  /* Toggle Switch */
@@ -99,7 +118,7 @@
99
118
  }
100
119
 
101
120
  .toggle-drag-handle {
102
- color: hsl(var(--muted-100));
121
+ color: hsl(var(--muted-200));
103
122
  cursor: grab;
104
123
  }
105
124
 
@@ -118,5 +137,5 @@
118
137
  }
119
138
 
120
139
  .toggle-label:has(input:disabled) .toggle-text {
121
- color: hsl(var(--muted-100));
140
+ color: hsl(var(--muted-200));
122
141
  }
@@ -6,7 +6,7 @@
6
6
  .tooltip-container::before {
7
7
  content: attr(data-tooltip);
8
8
  position: absolute;
9
- background-color: hsl(var(--muted-50));
9
+ background-color: hsl(var(--muted));
10
10
  color: black;
11
11
  padding: 0.5rem 1rem;
12
12
  border-radius: 4px;
@@ -50,7 +50,7 @@
50
50
  bottom: 100%;
51
51
  left: 50%;
52
52
  transform: translateX(-50%);
53
- border-top-color: hsl(var(--muted-50));
53
+ border-top-color: hsl(var(--muted));
54
54
  margin-bottom: -8px;
55
55
  }
56
56
 
@@ -66,7 +66,7 @@
66
66
  top: 100%;
67
67
  left: 50%;
68
68
  transform: translateX(-50%);
69
- border-bottom-color: hsl(var(--muted-50));
69
+ border-bottom-color: hsl(var(--muted));
70
70
  margin-top: -8px;
71
71
  }
72
72
 
@@ -82,7 +82,7 @@
82
82
  right: 100%;
83
83
  top: 50%;
84
84
  transform: translateY(-50%);
85
- border-left-color: hsl(var(--muted-50));
85
+ border-left-color: hsl(var(--muted));
86
86
  margin-right: -8px;
87
87
  }
88
88
 
@@ -98,6 +98,6 @@
98
98
  left: 100%;
99
99
  top: 50%;
100
100
  transform: translateY(-50%);
101
- border-right-color: hsl(var(--muted-50));
101
+ border-right-color: hsl(var(--muted));
102
102
  margin-left: -8px;
103
103
  }
@@ -13,9 +13,13 @@ export * from "./src/side-panel";
13
13
  export * from "./src/modal";
14
14
  export * from "./src/tag";
15
15
  export * from "./src/accordion";
16
- export * from "./src/date-picker";
17
16
  export * from "./src/multi-select";
18
17
  export * from "./src/radio-group";
19
18
  export * from "./src/tabs";
20
19
  export * from "./src/status";
21
20
  export * from "./src/popover";
21
+ export * from "./src/pagination";
22
+ export * from "./src/table";
23
+ export * from "./src/toast";
24
+ export * from "./src/logo";
25
+ export * from "./src/calendar";
@@ -4,6 +4,9 @@ export interface AccordionProps {
4
4
  isOpen: boolean;
5
5
  setIsOpen: (isOpen: boolean) => void;
6
6
  children: React.ReactNode;
7
+ description?: string;
7
8
  className?: string;
9
+ titleClassName?: string;
10
+ descriptionClassName?: string;
8
11
  }
9
- export declare const Accordion: ({ title, isOpen, setIsOpen, children, className, }: AccordionProps) => React.JSX.Element;
12
+ export declare const Accordion: ({ title, isOpen, setIsOpen, children, description, className, titleClassName, descriptionClassName, }: AccordionProps) => React.JSX.Element;
@@ -1,7 +1,7 @@
1
1
  import { IconType, TooltipPosition } from "../../types";
2
2
  import React from "react";
3
3
  export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
4
- variant?: "primary" | "secondary" | "ghost" | "danger";
4
+ variant?: "primary" | "secondary" | "ghost" | "danger" | "warning" | "success";
5
5
  size?: "sm" | "md" | "lg";
6
6
  label?: string;
7
7
  icon?: IconType;
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ type CalendarMode = "single" | "range";
3
+ interface CalendarProps {
4
+ mode?: CalendarMode;
5
+ value?: Date | [Date | null, Date | null];
6
+ onChange?: (value: Date | [Date | null, Date | null]) => void;
7
+ minDate?: Date;
8
+ maxDate?: Date;
9
+ forceWeek?: boolean;
10
+ }
11
+ declare const Calendar: ({ mode, value, onChange, minDate, maxDate, forceWeek, }: CalendarProps) => JSX.Element | null;
12
+ export { Calendar };
@@ -5,4 +5,4 @@ export interface ExpandableSearchProps {
5
5
  className?: string;
6
6
  value?: string;
7
7
  }
8
- export declare const ExpandableSearch: React.FC<ExpandableSearchProps>;
8
+ export declare const ExpandableSearch: ({ onSearch, placeholder, className, value, }: ExpandableSearchProps) => React.JSX.Element;
@@ -6,4 +6,4 @@ export interface IconProps extends React.SVGProps<SVGSVGElement> {
6
6
  tooltip?: string;
7
7
  tooltipPosition?: TooltipPosition;
8
8
  }
9
- export declare const Icon: React.FC<IconProps>;
9
+ export declare const Icon: ({ icon, size, tooltip, tooltipPosition, ...props }: IconProps) => JSX.Element;
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ export declare function Logo({ className, size, }: {
3
+ className?: string;
4
+ size?: number;
5
+ }): React.JSX.Element;
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ export interface PaginationProps {
3
+ currentPage: number;
4
+ totalPages: number;
5
+ perPage: number;
6
+ perPageOptions?: {
7
+ label: string;
8
+ value: string;
9
+ }[];
10
+ onPageChange: (page: number) => void;
11
+ onPerPageChange: (perPage: string) => void;
12
+ className?: string;
13
+ }
14
+ export declare const Pagination: React.FC<PaginationProps>;
@@ -1,14 +1,16 @@
1
- import React from "react";
1
+ import React, { ReactNode } from "react";
2
2
  interface PopOverProps {
3
3
  isOpen: boolean;
4
4
  setIsOpen: (isOpen: boolean) => void;
5
5
  children: React.ReactNode;
6
+ alignment?: "left" | "right";
7
+ className?: string;
6
8
  }
7
- export declare const PopOver: ({ children, isOpen, setIsOpen }: PopOverProps) => React.JSX.Element;
9
+ export declare const PopOver: ({ children, isOpen, setIsOpen, alignment, className, }: PopOverProps) => React.JSX.Element;
8
10
  export declare const PopOverTrigger: ({ children }: {
9
11
  children: React.ReactNode;
10
12
  }) => React.JSX.Element;
11
- export declare const PopOverContent: ({ children }: {
12
- children: React.ReactNode;
13
- }) => React.ReactPortal | null;
13
+ export declare const PopOverContent: ({ children, }: {
14
+ children: ReactNode;
15
+ }) => JSX.Element | null;
14
16
  export {};
@@ -3,4 +3,4 @@ export interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElem
3
3
  label?: string;
4
4
  className?: string;
5
5
  }
6
- export declare const Radio: React.FC<RadioProps>;
6
+ export declare const Radio: ({ label, className, ...props }: RadioProps) => JSX.Element;
@@ -7,4 +7,4 @@ export interface SidePanelProps {
7
7
  children: React.ReactNode;
8
8
  className?: string;
9
9
  }
10
- export declare const SidePanel: ({ isOpen, onClose, title, description, children, className, }: SidePanelProps) => React.ReactPortal | null;
10
+ export declare const SidePanel: ({ isOpen, onClose, title, description, children, className, }: SidePanelProps) => JSX.Element | null;
@@ -0,0 +1,27 @@
1
+ import React from "react";
2
+ export type SortDirection = "asc" | "desc" | null;
3
+ export interface TableColumn<T> {
4
+ key: string;
5
+ label: string;
6
+ sortable?: boolean;
7
+ render?: (value: any, row: T) => React.ReactNode;
8
+ }
9
+ export interface TableProps<T extends Record<string, any>> {
10
+ columns: TableColumn<T>[];
11
+ data: T[];
12
+ isLoading?: boolean;
13
+ className?: string;
14
+ sortKey?: string;
15
+ sortDirection?: SortDirection;
16
+ onSort?: (key: string, direction: SortDirection) => void;
17
+ currentPage?: number;
18
+ totalPages?: number;
19
+ perPage?: number;
20
+ perPageOptions?: {
21
+ label: string;
22
+ value: string;
23
+ }[];
24
+ onPageChange?: (page: number) => void;
25
+ onPerPageChange?: (perPage: string) => void;
26
+ }
27
+ export declare function Table<T extends Record<string, any>>({ columns, data, isLoading, className, sortKey, sortDirection, onSort, currentPage, totalPages, perPage, perPageOptions, onPageChange, onPerPageChange, }: TableProps<T>): React.JSX.Element;