@tapizlabs/ui 0.1.1

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.
@@ -0,0 +1,576 @@
1
+ import * as react from 'react';
2
+ import react__default, { ReactNode, MouseEvent, ComponentType, InputHTMLAttributes, SelectHTMLAttributes, TextareaHTMLAttributes, LabelHTMLAttributes, HTMLAttributes, Component, ErrorInfo, CSSProperties } from 'react';
3
+
4
+ interface IconProps {
5
+ size?: number;
6
+ className?: string;
7
+ style?: react__default.CSSProperties;
8
+ }
9
+
10
+ declare const Clipboard: ({ size, className, style }: IconProps) => react.JSX.Element;
11
+ declare const Home: ({ size, className, style }: IconProps) => react.JSX.Element;
12
+ declare const Scan: ({ size, className, style }: IconProps) => react.JSX.Element;
13
+ declare const Users: ({ size, className, style }: IconProps) => react.JSX.Element;
14
+ declare const Book: ({ size, className, style }: IconProps) => react.JSX.Element;
15
+ declare const Calendar: ({ size, className, style }: IconProps) => react.JSX.Element;
16
+ declare const CheckSquare: ({ size, className, style }: IconProps) => react.JSX.Element;
17
+ declare const BarChart: ({ size, className, style }: IconProps) => react.JSX.Element;
18
+ declare const Table: ({ size, className, style }: IconProps) => react.JSX.Element;
19
+ declare const Report: ({ size, className, style }: IconProps) => react.JSX.Element;
20
+ declare const QrCode: ({ size, className, style }: IconProps) => react.JSX.Element;
21
+ declare const Layers: ({ size, className, style }: IconProps) => react.JSX.Element;
22
+ declare const OfficeHours: ({ size, className, style }: IconProps) => react.JSX.Element;
23
+ declare const FileUpload: ({ size, className, style }: IconProps) => react.JSX.Element;
24
+ declare const University: ({ size, className, style }: IconProps) => react.JSX.Element;
25
+ declare const Faculty: ({ size, className, style }: IconProps) => react.JSX.Element;
26
+ declare const GraduationCap: ({ size, className, style }: IconProps) => react.JSX.Element;
27
+ declare const Globe: ({ size, className, style }: IconProps) => react.JSX.Element;
28
+ declare const CreditCard: ({ size, className, style }: IconProps) => react.JSX.Element;
29
+ declare const HelpCircle: ({ size, className, style }: IconProps) => react.JSX.Element;
30
+ declare const NavQrAttendance: ({ size, className, style }: IconProps) => react.JSX.Element;
31
+ declare const NavScoresheet: ({ size, className, style }: IconProps) => react.JSX.Element;
32
+ declare const NavAnalytics: ({ size, className, style }: IconProps) => react.JSX.Element;
33
+ declare const NavSecurity: ({ size, className, style }: IconProps) => react.JSX.Element;
34
+
35
+ declare const Edit: ({ size, className, style }: IconProps) => react.JSX.Element;
36
+ declare const Trash: ({ size, className, style }: IconProps) => react.JSX.Element;
37
+ declare const Plus: ({ size, className, style }: IconProps) => react.JSX.Element;
38
+ declare const Download: ({ size, className, style }: IconProps) => react.JSX.Element;
39
+ declare const Refresh: ({ size, className, spinning, style }: IconProps & {
40
+ spinning?: boolean;
41
+ }) => react.JSX.Element;
42
+ declare const UserPlus: ({ size, className, style }: IconProps) => react.JSX.Element;
43
+ declare const UserMinus: ({ size, className, style }: IconProps) => react.JSX.Element;
44
+ declare const UserCog: ({ size, className, style }: IconProps) => react.JSX.Element;
45
+ declare const Check: ({ size, className, style }: IconProps) => react.JSX.Element;
46
+ declare const X: ({ size, className, style }: IconProps) => react.JSX.Element;
47
+ declare const Menu: ({ size, className, style }: IconProps) => react.JSX.Element;
48
+ declare const Grid: ({ size, className, style }: IconProps) => react.JSX.Element;
49
+ declare const History: ({ size, className, style }: IconProps) => react.JSX.Element;
50
+ declare const RotateCcw: ({ size, className, style }: IconProps) => react.JSX.Element;
51
+ declare const Pdf: ({ size, className, style }: IconProps) => react.JSX.Element;
52
+ declare const Printer: ({ size, className, style }: IconProps) => react.JSX.Element;
53
+ declare const ExternalLink: ({ size, className, style }: IconProps) => react.JSX.Element;
54
+ declare const Image: ({ size, className, style }: IconProps) => react.JSX.Element;
55
+ declare const Star: ({ size, className, style }: IconProps) => react.JSX.Element;
56
+ declare const AppleIcon: ({ size, className, style }: IconProps) => react.JSX.Element;
57
+ declare const GooglePlayIcon: ({ size, className, style }: IconProps) => react.JSX.Element;
58
+
59
+ declare const Mail: ({ size, className, style }: IconProps) => react.JSX.Element;
60
+ declare const LockIcon: ({ size, className, style }: IconProps) => react.JSX.Element;
61
+ declare const TwoFAIcon: ({ size, className, style }: IconProps) => react.JSX.Element;
62
+ declare const FingerprintIcon: ({ size, className, style }: IconProps) => react.JSX.Element;
63
+ declare const Eye: ({ size, className, style }: IconProps) => react.JSX.Element;
64
+ declare const EyeOff: ({ size, className, style }: IconProps) => react.JSX.Element;
65
+ declare const User: ({ size, className, style }: IconProps) => react.JSX.Element;
66
+ declare const UserCheck: ({ size, className, style }: IconProps) => react.JSX.Element;
67
+ declare const Hash: ({ size, className, style }: IconProps) => react.JSX.Element;
68
+ declare const LogOut: ({ size, className, style }: IconProps) => react.JSX.Element;
69
+
70
+ declare const Alert: ({ size, className, style }: IconProps) => react.JSX.Element;
71
+ declare const Info: ({ size, className, style }: IconProps) => react.JSX.Element;
72
+ declare const CheckCircle: ({ size, className, style }: IconProps) => react.JSX.Element;
73
+ declare const Ban: ({ size, className, style }: IconProps) => react.JSX.Element;
74
+ declare const ArrowRight: ({ size, className, style }: IconProps) => react.JSX.Element;
75
+ declare const ArrowLeft: ({ size, className, style }: IconProps) => react.JSX.Element;
76
+ declare const ChevronLeft: ({ size, className, style }: IconProps) => react.JSX.Element;
77
+ declare const ChevronRight: ({ size, className, style }: IconProps) => react.JSX.Element;
78
+ declare const ChevronDown: ({ size, className, style }: IconProps) => react.JSX.Element;
79
+ declare const ChevronUp: ({ size, className, style }: IconProps) => react.JSX.Element;
80
+ declare const Search: ({ size, className, style }: IconProps) => react.JSX.Element;
81
+ declare const Bell: ({ size, className, style }: IconProps) => react.JSX.Element;
82
+ declare const Shield: ({ size, className, style }: IconProps) => react.JSX.Element;
83
+ declare const Copy: ({ size, className, style }: IconProps) => react.JSX.Element;
84
+ declare const Repeat: ({ size, className, style }: IconProps) => react.JSX.Element;
85
+ declare const FileText: ({ size, className, style }: IconProps) => react.JSX.Element;
86
+ declare const Trophy: ({ size, className, style }: IconProps) => react.JSX.Element;
87
+ declare const Monitor: ({ size, className, style }: IconProps) => react.JSX.Element;
88
+ declare const Smartphone: ({ size, className, style }: IconProps) => react.JSX.Element;
89
+ declare const Tablet: ({ size, className, style }: IconProps) => react.JSX.Element;
90
+ declare const ActivityMenu: ({ size, className, style }: IconProps) => react.JSX.Element;
91
+ declare const Compare: ({ size, className, style }: IconProps) => react.JSX.Element;
92
+ declare const Intersect: ({ size, className, style }: IconProps) => react.JSX.Element;
93
+ declare const Megaphone: ({ size, className, style }: IconProps) => react.JSX.Element;
94
+
95
+ declare const Sun: ({ size, className, style }: IconProps) => react.JSX.Element;
96
+ declare const Moon: ({ size, className, style }: IconProps) => react.JSX.Element;
97
+ declare const Gear: ({ size, className, style }: IconProps) => react.JSX.Element;
98
+ declare const Clock: ({ size, className, style }: IconProps) => react.JSX.Element;
99
+
100
+ interface LogoMarkProps {
101
+ size?: number;
102
+ className?: string;
103
+ bgClassName?: string;
104
+ bgFill?: string;
105
+ bgOpacity?: number;
106
+ }
107
+ declare const LogoMark: ({ size, className, }: LogoMarkProps) => react.JSX.Element;
108
+
109
+ declare const FormIcon: ({ size, className, style }: IconProps) => react.JSX.Element;
110
+ declare const CalendarWeek: ({ size, className, style }: IconProps) => react.JSX.Element;
111
+ declare const CalendarMonth: ({ size, className, style }: IconProps) => react.JSX.Element;
112
+ declare const NumberIcon: ({ size, className, style }: IconProps) => react.JSX.Element;
113
+ declare const TextIcon: ({ size, className, style }: IconProps) => react.JSX.Element;
114
+ declare const FormulaIcon: ({ size, className, style }: IconProps) => react.JSX.Element;
115
+
116
+ declare const RefreshCw: ({ size, className, spinning, style }: IconProps & {
117
+ spinning?: boolean;
118
+ }) => react.JSX.Element;
119
+ declare const Database: ({ size, className, style }: IconProps) => react.JSX.Element;
120
+ declare const Server: ({ size, className, style }: IconProps) => react.JSX.Element;
121
+ declare const Activity: ({ size, className, style }: IconProps) => react.JSX.Element;
122
+ declare const Cpu: ({ size, className, style }: IconProps) => react.JSX.Element;
123
+ declare const Zap: ({ size, className, style }: IconProps) => react.JSX.Element;
124
+ declare const HardDrive: ({ size, className, style }: IconProps) => react.JSX.Element;
125
+
126
+ declare const SectionIcons: {
127
+ studenti: react.JSX.Element;
128
+ nastava: react.JSX.Element;
129
+ evidencija: react.JSX.Element;
130
+ analitika: react.JSX.Element;
131
+ forme: react.JSX.Element;
132
+ nastavaS: react.JSX.Element;
133
+ evidencijaS: react.JSX.Element;
134
+ };
135
+ declare const Icons: {
136
+ clipboard: react.JSX.Element;
137
+ postClipboard: react.JSX.Element;
138
+ university: react.JSX.Element;
139
+ users: react.JSX.Element;
140
+ book: react.JSX.Element;
141
+ layers: react.JSX.Element;
142
+ officeHours: react.JSX.Element;
143
+ calendar: react.JSX.Element;
144
+ calendarAlt: react.JSX.Element;
145
+ checkSquare: react.JSX.Element;
146
+ barChart: react.JSX.Element;
147
+ qrCode: react.JSX.Element;
148
+ home: react.JSX.Element;
149
+ scan: react.JSX.Element;
150
+ lock: react.JSX.Element;
151
+ logOut: react.JSX.Element;
152
+ logOutAlt: react.JSX.Element;
153
+ user: react.JSX.Element;
154
+ cancel: react.JSX.Element;
155
+ report: react.JSX.Element;
156
+ table: react.JSX.Element;
157
+ gear: react.JSX.Element;
158
+ formIcon: react.JSX.Element;
159
+ grades: react.JSX.Element;
160
+ activity: react.JSX.Element;
161
+ zap: react.JSX.Element;
162
+ compare: react.JSX.Element;
163
+ intersect: react.JSX.Element;
164
+ repeat: react.JSX.Element;
165
+ info: react.JSX.Element;
166
+ todos: react.JSX.Element;
167
+ eyeOff: react.JSX.Element;
168
+ userMinus: react.JSX.Element;
169
+ fileText: react.JSX.Element;
170
+ megaphone: react.JSX.Element;
171
+ grid: react.JSX.Element;
172
+ userCheck: react.JSX.Element;
173
+ fm: react.JSX.Element;
174
+ history: react.JSX.Element;
175
+ externalLink: react.JSX.Element;
176
+ };
177
+
178
+ type Variant$1 = "primary" | "secondary" | "danger" | "ghost" | "success" | "warning" | "info" | "muted-primary" | "outline-primary" | "outline-secondary" | "outline-danger" | "outline-success" | "link";
179
+ type Size = "xs" | "sm" | "md" | "lg" | "xl";
180
+ interface ButtonProps {
181
+ children?: ReactNode;
182
+ onClick?: (e: MouseEvent<HTMLButtonElement>) => void;
183
+ disabled?: boolean;
184
+ loading?: boolean;
185
+ variant?: Variant$1;
186
+ size?: Size;
187
+ icon?: ButtonIcon;
188
+ iconRight?: ButtonIcon;
189
+ className?: string;
190
+ type?: "button" | "submit" | "reset";
191
+ title?: string;
192
+ fullWidth?: boolean;
193
+ }
194
+ type ButtonIcon = ReactNode | ComponentType<{
195
+ size?: number | string;
196
+ strokeWidth?: number;
197
+ className?: string;
198
+ }>;
199
+ declare function Button({ children, onClick, disabled, loading, variant, size, icon, iconRight, className, type, title, fullWidth, }: ButtonProps): react.JSX.Element;
200
+
201
+ interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
202
+ invalid?: boolean;
203
+ }
204
+ declare function Input({ className, invalid, ...props }: InputProps): react.JSX.Element;
205
+
206
+ interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {
207
+ invalid?: boolean;
208
+ }
209
+ declare function Select({ className, invalid, ...props }: SelectProps): react.JSX.Element;
210
+
211
+ interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
212
+ invalid?: boolean;
213
+ }
214
+ declare function Textarea({ className, invalid, ...props }: TextareaProps): react.JSX.Element;
215
+
216
+ interface FieldLabelProps extends LabelHTMLAttributes<HTMLLabelElement> {
217
+ children: ReactNode;
218
+ }
219
+ declare function FieldLabel({ children, className, ...props }: FieldLabelProps): react.JSX.Element;
220
+
221
+ interface FieldHintProps extends HTMLAttributes<HTMLParagraphElement> {
222
+ children: ReactNode;
223
+ }
224
+ declare function FieldHint({ children, className, ...props }: FieldHintProps): react.JSX.Element;
225
+
226
+ interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "size"> {
227
+ label?: string;
228
+ size?: "sm" | "md" | "lg";
229
+ }
230
+ declare function Checkbox({ label, size, className, id: providedId, checked, defaultChecked, onChange, ...props }: CheckboxProps): react.JSX.Element;
231
+
232
+ interface RadioButtonProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "size"> {
233
+ label?: string;
234
+ size?: "sm" | "md" | "lg";
235
+ }
236
+ declare function RadioButton({ label, size, className, id: providedId, checked, defaultChecked, onChange, ...props }: RadioButtonProps): react.JSX.Element;
237
+
238
+ interface SpinnerProps {
239
+ size?: string;
240
+ color?: string;
241
+ }
242
+ declare const Spinner: ({ size, color }: SpinnerProps) => react.JSX.Element;
243
+
244
+ declare function PageSpinner(): react.JSX.Element;
245
+
246
+ interface ToastProps {
247
+ message: string;
248
+ ok: boolean;
249
+ durationMs?: number;
250
+ }
251
+ declare function Toast({ message, ok, durationMs }: ToastProps): react.ReactPortal;
252
+
253
+ interface ToastState {
254
+ message: string;
255
+ ok: boolean;
256
+ durationMs?: number;
257
+ }
258
+ interface ToastContextValue {
259
+ hideToast: () => void;
260
+ showToast: (message: string, ok: boolean, durationMs?: number) => void;
261
+ }
262
+ interface ToastProviderProps {
263
+ children?: ReactNode;
264
+ }
265
+ declare function ToastProvider({ children }: ToastProviderProps): react.JSX.Element;
266
+ declare function useToast(): ToastContextValue;
267
+
268
+ interface FormErrorProps {
269
+ message: string | null | undefined;
270
+ className?: string;
271
+ }
272
+ declare function FormError({ message, className }: FormErrorProps): react.JSX.Element | null;
273
+
274
+ interface ErrorBoundaryProps {
275
+ children: ReactNode;
276
+ fallback?: ReactNode;
277
+ }
278
+ interface ErrorBoundaryState {
279
+ hasError: boolean;
280
+ }
281
+ interface DefaultErrorFallbackProps {
282
+ title?: string;
283
+ description?: string;
284
+ label?: string;
285
+ reloadLabel?: string;
286
+ }
287
+ declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
288
+ state: ErrorBoundaryState;
289
+ static getDerivedStateFromError(): ErrorBoundaryState;
290
+ componentDidCatch(error: Error, info: ErrorInfo): void;
291
+ render(): string | number | bigint | boolean | react.JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
292
+ }
293
+ declare function DefaultErrorFallback({ title, description, label, reloadLabel, }: DefaultErrorFallbackProps): react.JSX.Element;
294
+ declare function GridBg(): react.JSX.Element;
295
+ declare function Spotlight({ color }: {
296
+ color: string;
297
+ }): react.JSX.Element;
298
+
299
+ interface BaseModalProps {
300
+ isOpen: boolean;
301
+ onClose: () => void;
302
+ title: string;
303
+ subtitle?: string;
304
+ children: ReactNode;
305
+ xShown?: boolean;
306
+ icon?: ReactNode;
307
+ size?: "sm" | "md" | "lg" | "xl";
308
+ closeLabel?: string;
309
+ }
310
+ declare function BaseModal({ isOpen, onClose, title, subtitle, children, icon, xShown, size, closeLabel, }: BaseModalProps): react.ReactPortal | null;
311
+
312
+ interface ConfirmDialogProps {
313
+ title: string;
314
+ description?: ReactNode;
315
+ message?: ReactNode;
316
+ confirmLabel?: string;
317
+ cancelLabel?: string;
318
+ loading?: boolean;
319
+ onConfirm: () => void;
320
+ onCancel: () => void;
321
+ icon?: ReactNode;
322
+ danger?: boolean;
323
+ open?: boolean;
324
+ }
325
+ declare function ConfirmDialog({ title, description, message, confirmLabel, cancelLabel, loading, onConfirm, onCancel, icon, danger, open, }: ConfirmDialogProps): react.ReactPortal | null;
326
+
327
+ interface TooltipProps {
328
+ text: string;
329
+ children: ReactNode;
330
+ position?: "top" | "bottom";
331
+ align?: "center" | "right";
332
+ width?: string;
333
+ wFull?: boolean;
334
+ }
335
+ declare function Tooltip({ text, children, position, align, width, wFull }: TooltipProps): react.JSX.Element;
336
+
337
+ interface CardProps {
338
+ children: ReactNode;
339
+ className?: string;
340
+ hover?: boolean;
341
+ style?: CSSProperties;
342
+ }
343
+ interface CardSectionProps {
344
+ children: ReactNode;
345
+ className?: string;
346
+ }
347
+ declare function Card({ children, className, hover, style }: CardProps): react.JSX.Element;
348
+ declare function CardHeader({ children, className }: CardSectionProps): react.JSX.Element;
349
+ declare function CardBody({ children, className }: CardSectionProps): react.JSX.Element;
350
+
351
+ interface SkeletonProps {
352
+ className?: string;
353
+ }
354
+ declare function Skeleton({ className }: SkeletonProps): react.JSX.Element;
355
+
356
+ declare function SkeletonCard({ className }: {
357
+ className?: string;
358
+ }): react.JSX.Element;
359
+ declare function SkeletonKpiCard({ delay }: {
360
+ delay?: number;
361
+ }): react.JSX.Element;
362
+ declare function SkeletonBanner(): react.JSX.Element;
363
+ declare function SkeletonTable({ rows, cols }: {
364
+ rows?: number;
365
+ cols?: number;
366
+ }): react.JSX.Element;
367
+ declare function SkeletonPageHeader(): react.JSX.Element;
368
+
369
+ type Variant = "default" | "success" | "warning" | "danger" | "muted";
370
+ interface BadgeProps {
371
+ children: ReactNode;
372
+ variant?: Variant;
373
+ className?: string;
374
+ }
375
+ declare function Badge({ children, variant, className }: BadgeProps): react.JSX.Element;
376
+
377
+ interface EmptyStateProps {
378
+ title?: string;
379
+ description?: string;
380
+ message?: string;
381
+ icon?: ReactNode;
382
+ }
383
+ declare function EmptyState({ title, description, message, icon }: EmptyStateProps): react.JSX.Element;
384
+ declare function ErrorState({ title, error, }: {
385
+ title?: string;
386
+ error: Error | null;
387
+ }): react.JSX.Element;
388
+
389
+ interface StructuredInfoBannerProps {
390
+ title: string;
391
+ description: string;
392
+ text?: never;
393
+ variant?: never;
394
+ className?: string;
395
+ }
396
+ interface InlineInfoBannerProps {
397
+ text: string;
398
+ variant?: "info" | "warn" | "lock";
399
+ className?: string;
400
+ title?: never;
401
+ description?: never;
402
+ }
403
+ type InfoBannerProps = StructuredInfoBannerProps | InlineInfoBannerProps;
404
+ declare function InfoBanner(props: InfoBannerProps): react.JSX.Element;
405
+
406
+ interface PageHeaderProps {
407
+ title: string;
408
+ subtitle?: string;
409
+ action?: ReactNode;
410
+ icon?: ReactNode;
411
+ className?: string;
412
+ }
413
+ declare function PageHeader({ title, subtitle, action, icon, className }: PageHeaderProps): react.JSX.Element;
414
+
415
+ interface SearchInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "value" | "onChange"> {
416
+ value: string;
417
+ onChange: (value: string) => void;
418
+ wrapperClassName?: string;
419
+ wrapperStyle?: CSSProperties;
420
+ inputClassName?: string;
421
+ iconClassName?: string;
422
+ clearable?: boolean;
423
+ clearTitle?: string;
424
+ }
425
+ declare function SearchInput({ value, onChange, placeholder, wrapperClassName, wrapperStyle, inputClassName, iconClassName, clearable, clearTitle, ...props }: SearchInputProps): react.JSX.Element;
426
+
427
+ interface PaginationLabels {
428
+ showing?: (args: {
429
+ from: number;
430
+ to: number;
431
+ total: number;
432
+ }) => string;
433
+ page?: (args: {
434
+ page: number;
435
+ totalPages: number;
436
+ }) => string;
437
+ prev?: string;
438
+ next?: string;
439
+ prevTitle?: string;
440
+ nextTitle?: string;
441
+ }
442
+ interface PaginationProps {
443
+ page: number;
444
+ totalPages: number;
445
+ onChange: (page: number) => void;
446
+ totalItems?: number;
447
+ pageSize?: number;
448
+ labels?: PaginationLabels;
449
+ }
450
+ declare function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }: PaginationProps): react.JSX.Element | null;
451
+
452
+ interface SectionTitleProps {
453
+ children: ReactNode;
454
+ className?: string;
455
+ }
456
+ declare function SectionTitle({ children, className }: SectionTitleProps): react.JSX.Element;
457
+
458
+ type StatusBadgeVariant = "default" | "active" | "inactive" | "warning" | "success" | "danger" | "pending";
459
+ interface StatusBadgeProps {
460
+ label: ReactNode;
461
+ variant?: StatusBadgeVariant;
462
+ className?: string;
463
+ }
464
+ declare function StatusBadge({ label, variant, className }: StatusBadgeProps): react.JSX.Element;
465
+
466
+ interface ActionMenuItem {
467
+ key: string;
468
+ label: string;
469
+ onSelect: () => void;
470
+ icon?: ReactNode;
471
+ danger?: boolean;
472
+ disabled?: boolean;
473
+ loading?: boolean;
474
+ }
475
+ interface ActionMenuProps {
476
+ label: string;
477
+ items: ActionMenuItem[];
478
+ icon?: ReactNode;
479
+ buttonSize?: "xs" | "sm" | "md" | "lg" | "xl";
480
+ buttonVariant?: "primary" | "secondary" | "danger" | "ghost" | "success" | "warning" | "info" | "muted-primary" | "outline-primary" | "outline-secondary" | "outline-danger" | "outline-success" | "link";
481
+ buttonClassName?: string;
482
+ menuClassName?: string;
483
+ menuStyle?: CSSProperties;
484
+ fullWidth?: boolean;
485
+ closeLabel?: string;
486
+ }
487
+ declare function ActionMenu({ label, items, icon, buttonSize, buttonVariant, buttonClassName, menuClassName, menuStyle, fullWidth, closeLabel, }: ActionMenuProps): react.JSX.Element;
488
+
489
+ type ColumnAlign = "left" | "center" | "right";
490
+ type SortDirection = "asc" | "desc";
491
+ /**
492
+ * Declarative description of a single column for {@link DataTable}.
493
+ *
494
+ * `header` and any user-facing text are passed in as `ReactNode` so callers
495
+ * own translation (i18n) — the component never hardcodes strings.
496
+ */
497
+ interface Column<T> {
498
+ /** Stable identifier, also used as the React key for the header cell. */
499
+ id: string;
500
+ /** Header content. Pass an already-translated string/node. */
501
+ header: ReactNode;
502
+ /** Renders the cell body for a given row. */
503
+ cell: (row: T) => ReactNode;
504
+ /** Enables client-side sorting on this column. Requires `sortAccessor`. */
505
+ sortable?: boolean;
506
+ /** Returns the comparable value used when sorting by this column. */
507
+ sortAccessor?: (row: T) => string | number | boolean | Date | null | undefined;
508
+ /** Text alignment for header and cells. Defaults to "left". */
509
+ align?: ColumnAlign;
510
+ /** Extra classes applied to the body cell (`<td>`). */
511
+ className?: string;
512
+ }
513
+ interface SortState {
514
+ columnId: string;
515
+ direction: SortDirection;
516
+ }
517
+ /** Controls server-driven sort when passed to {@link DataTable}. */
518
+ interface ServerSort {
519
+ /** The currently sorted column id. */
520
+ field: string;
521
+ /** Current sort direction. */
522
+ dir: SortDirection;
523
+ /** Called with the column id when a sortable header is clicked. */
524
+ onSort: (field: string) => void;
525
+ }
526
+
527
+ interface DataTableProps<T> {
528
+ data: T[];
529
+ columns: Column<T>[];
530
+ /** Stable unique key per row. */
531
+ rowKey: (row: T) => string;
532
+ isLoading?: boolean;
533
+ /** Rendered (inside a full-width row) when there is no data. */
534
+ emptyState?: ReactNode;
535
+ onRowClick?: (row: T) => void;
536
+ /** Number of skeleton rows shown while loading. Defaults to 8. */
537
+ loadingRows?: number;
538
+ /**
539
+ * When provided, renders an extra right-aligned column at the end of every
540
+ * row. The function receives the row and must return a `ReactNode` (e.g.
541
+ * action buttons). When omitted, no extra column is added.
542
+ */
543
+ rowActions?: (row: T) => ReactNode;
544
+ /**
545
+ * When provided, disables internal client-side sort and delegates sorting to
546
+ * the caller. Clicking a sortable column header calls `onSort(column.id)`.
547
+ * `aria-sort` reflects `field` and `dir`.
548
+ */
549
+ serverSort?: ServerSort;
550
+ /**
551
+ * When provided, renders the node below the `<table>` inside the outer
552
+ * border wrapper. No styling is added — callers own all padding/layout.
553
+ */
554
+ footer?: ReactNode;
555
+ /**
556
+ * When provided:
557
+ * - The `<table>` is hidden on small screens (`hidden md:table`).
558
+ * - A `<div className="md:hidden">` is rendered before the table, mapping
559
+ * each row to a card via this function (keyed by `rowKey(row)`).
560
+ */
561
+ mobileCard?: (row: T) => ReactNode;
562
+ }
563
+ /**
564
+ * Generic, accessible, client-sortable table.
565
+ *
566
+ * - Pass already-translated `ReactNode`s for headers and `emptyState`; the
567
+ * component never hardcodes user-facing strings (full i18n compatibility).
568
+ * - Sorting toggles asc/desc on sortable columns and is purely client-side
569
+ * unless `serverSort` is provided.
570
+ * - Rows are memoized and the sorted view is memoized via `useMemo`.
571
+ * - Optional `rowActions`, `serverSort`, `footer`, and `mobileCard` props are
572
+ * all additive — existing usages continue to work with zero changes.
573
+ */
574
+ declare function DataTable<T>({ data, columns, rowKey, isLoading, emptyState, onRowClick, loadingRows, rowActions, serverSort, footer, mobileCard, }: DataTableProps<T>): react.JSX.Element;
575
+
576
+ export { ActionMenu, type ActionMenuItem, type ActionMenuProps, Activity, ActivityMenu, Alert, AppleIcon, ArrowLeft, ArrowRight, Badge, Ban, BarChart, BaseModal, type BaseModalProps, Bell, Book, Button, type ButtonProps, Calendar, CalendarMonth, CalendarWeek, Card, CardBody, CardHeader, type CardProps, type CardSectionProps, Check, CheckCircle, CheckSquare, Checkbox, type CheckboxProps, ChevronDown, ChevronLeft, ChevronRight, ChevronUp, Clipboard, Clock, type Column, type ColumnAlign, Compare, ConfirmDialog, type ConfirmDialogProps, Copy, Cpu, CreditCard, DataTable, type DataTableProps, Database, DefaultErrorFallback, Download, Edit, EmptyState, type EmptyStateProps, ErrorBoundary, ErrorState, ExternalLink, Eye, EyeOff, Faculty, FieldHint, type FieldHintProps, FieldLabel, type FieldLabelProps, FileText, FileUpload, FingerprintIcon, FormError, type FormErrorProps, FormIcon, FormulaIcon, Gear, Globe, GooglePlayIcon, GraduationCap, Grid, GridBg, HardDrive, Hash, HelpCircle, History, Home, Icons, Image, Info, InfoBanner, type InfoBannerProps, Input, type InputProps, Intersect, Layers, LockIcon, LogOut, LogoMark, Mail, Megaphone, Menu, Monitor, Moon, NavAnalytics, NavQrAttendance, NavScoresheet, NavSecurity, NumberIcon, OfficeHours, PageHeader, type PageHeaderProps, PageSpinner, Pagination, type PaginationLabels, type PaginationProps, Pdf, Plus, Printer, QrCode, RadioButton, type RadioButtonProps, Refresh, RefreshCw, Repeat, Report, RotateCcw, Scan, Search, SearchInput, type SearchInputProps, SectionIcons, SectionTitle, type SectionTitleProps, Select, type SelectProps, Server, type ServerSort, Shield, Skeleton, SkeletonBanner, SkeletonCard, SkeletonKpiCard, SkeletonPageHeader, type SkeletonProps, SkeletonTable, Smartphone, type SortDirection, type SortState, Spinner, type SpinnerProps, Spotlight, Star, StatusBadge, type StatusBadgeProps, type StatusBadgeVariant, Sun, Table, Tablet, TextIcon, Textarea, type TextareaProps, Toast, type ToastProps, ToastProvider, type ToastProviderProps, type ToastState, Tooltip, type TooltipProps, Trash, Trophy, TwoFAIcon, University, User, UserCheck, UserCog, UserMinus, UserPlus, Users, X, Zap, useToast };