@startsimpli/ui 0.1.0 → 0.1.3

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 (80) hide show
  1. package/dist/chunk-27YUQBOE.mjs +3954 -0
  2. package/dist/chunk-27YUQBOE.mjs.map +1 -0
  3. package/dist/chunk-G2AM3DBU.mjs +1026 -0
  4. package/dist/chunk-G2AM3DBU.mjs.map +1 -0
  5. package/dist/chunk-G4XBXCFH.mjs +63 -0
  6. package/dist/chunk-G4XBXCFH.mjs.map +1 -0
  7. package/dist/chunk-LZOMFHX3.mjs +35 -0
  8. package/dist/chunk-LZOMFHX3.mjs.map +1 -0
  9. package/dist/chunk-QYXFLOO7.mjs +210 -0
  10. package/dist/chunk-QYXFLOO7.mjs.map +1 -0
  11. package/dist/components/index.d.mts +472 -0
  12. package/dist/components/index.d.ts +472 -0
  13. package/dist/components/index.js +5149 -0
  14. package/dist/components/index.js.map +1 -0
  15. package/dist/components/index.mjs +6 -0
  16. package/dist/components/index.mjs.map +1 -0
  17. package/dist/components/unified-table/index.d.mts +725 -0
  18. package/dist/components/unified-table/index.d.ts +725 -0
  19. package/dist/components/unified-table/index.js +4000 -0
  20. package/dist/components/unified-table/index.js.map +1 -0
  21. package/dist/components/unified-table/index.mjs +5 -0
  22. package/dist/components/unified-table/index.mjs.map +1 -0
  23. package/dist/index.d.mts +26 -0
  24. package/dist/index.d.ts +26 -0
  25. package/dist/index.js +5448 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/index.mjs +12 -0
  28. package/dist/index.mjs.map +1 -0
  29. package/dist/theme/index.d.mts +20 -0
  30. package/dist/theme/index.d.ts +20 -0
  31. package/dist/theme/index.js +245 -0
  32. package/dist/theme/index.js.map +1 -0
  33. package/dist/theme/index.mjs +9 -0
  34. package/dist/theme/index.mjs.map +1 -0
  35. package/dist/utils/index.d.mts +38 -0
  36. package/dist/utils/index.d.ts +38 -0
  37. package/dist/utils/index.js +72 -0
  38. package/dist/utils/index.js.map +1 -0
  39. package/dist/utils/index.mjs +4 -0
  40. package/dist/utils/index.mjs.map +1 -0
  41. package/package.json +62 -21
  42. package/src/__mocks__/next/navigation.js +18 -0
  43. package/src/components/__tests__/safe-html.test.tsx +45 -0
  44. package/src/components/__tests__/states.test.tsx +94 -0
  45. package/src/components/__tests__/status-badge.test.tsx +101 -0
  46. package/src/components/__tests__/toast.test.tsx +124 -0
  47. package/src/components/badge/StatusBadge.tsx +55 -0
  48. package/src/components/badge/index.ts +2 -0
  49. package/src/components/dialog/BaseDialog.tsx +184 -0
  50. package/src/components/dialog/index.ts +8 -0
  51. package/src/components/index.ts +25 -0
  52. package/src/components/loading/DashboardSkeleton.tsx +27 -0
  53. package/src/components/loading/TableSkeleton.tsx +63 -0
  54. package/src/components/loading/index.ts +4 -0
  55. package/src/components/safe-html.tsx +18 -0
  56. package/src/components/states/EmptyState.tsx +48 -0
  57. package/src/components/states/ErrorState.tsx +76 -0
  58. package/src/components/states/index.ts +4 -0
  59. package/src/components/toast/Toaster.tsx +72 -0
  60. package/src/components/toast/index.ts +5 -0
  61. package/src/components/toast/use-notify.ts +45 -0
  62. package/src/components/toast/use-toast.ts +150 -0
  63. package/src/components/ui/api-error-boundary.tsx +64 -0
  64. package/src/components/ui/feature-gate.tsx +87 -0
  65. package/src/components/ui/index.ts +4 -0
  66. package/src/components/ui/page-loader.tsx +31 -0
  67. package/src/components/ui/query-provider.tsx +30 -0
  68. package/src/components/unified-table/components/Toolbar/StandardTableToolbar.tsx +1 -1
  69. package/src/components/unified-table/hooks/useFilters.ts +1 -0
  70. package/src/components/unified-table/hooks/usePagination.ts +1 -0
  71. package/src/components/unified-table/hooks/useSelection.ts +2 -1
  72. package/src/components/unified-table/hooks/useTableKeyboard.ts +2 -1
  73. package/src/components/unified-table/hooks/useTablePreferences.ts +1 -0
  74. package/src/components/unified-table/hooks/useTableState.ts +1 -0
  75. package/src/components/unified-table/hooks/useTableURL.test.tsx +1 -1
  76. package/src/components/unified-table/index.ts +4 -0
  77. package/src/components/wizard/StepIndicator.tsx +60 -0
  78. package/src/components/wizard/index.ts +2 -0
  79. package/src/theme/tailwind.config.d.ts +3 -0
  80. package/tailwind.preset.js +87 -0
@@ -0,0 +1,725 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React$1 from 'react';
3
+ import { ReactNode, RefObject } from 'react';
4
+ import { LucideIcon } from 'lucide-react';
5
+ import { DropResult } from '@hello-pangea/dnd';
6
+
7
+ interface UnifiedTableProps<TData> {
8
+ data: TData[];
9
+ columns: ColumnConfig<TData>[];
10
+ tableId: string;
11
+ getRowId: (row: TData) => string;
12
+ pagination?: PaginationConfig;
13
+ selection?: SelectionConfig;
14
+ filters?: FiltersConfig;
15
+ bulkActions?: BulkAction[];
16
+ rowActions?: RowAction<TData>[];
17
+ search?: SearchConfig;
18
+ sorting?: SortingConfig;
19
+ columnVisibility?: ColumnVisibilityConfig;
20
+ columnReorder?: ColumnReorderConfig;
21
+ columnResize?: ColumnResizeConfig;
22
+ inlineEdit?: InlineEditConfig<TData>;
23
+ savedViews?: SavedViewsConfig;
24
+ urlPersistence?: URLPersistenceConfig;
25
+ export?: ExportConfig;
26
+ onRowClick?: (row: TData) => void;
27
+ mobileConfig?: MobileCardConfig$1<TData>;
28
+ loading?: boolean;
29
+ loadingRows?: Set<string>;
30
+ className?: string;
31
+ emptyState?: ReactNode;
32
+ errorState?: ReactNode;
33
+ }
34
+ interface ColumnConfig<TData> {
35
+ id: string;
36
+ header: string | ((props: any) => ReactNode);
37
+ accessorKey?: string;
38
+ accessorFn?: (row: TData) => any;
39
+ cell?: (row: TData) => ReactNode;
40
+ sortable?: boolean;
41
+ sortingFn?: (a: TData, b: TData) => number;
42
+ width?: string | number;
43
+ minWidth?: string | number;
44
+ maxWidth?: string | number;
45
+ mobilePrimary?: boolean;
46
+ mobileSecondary?: boolean;
47
+ hideOnMobile?: boolean;
48
+ hideable?: boolean;
49
+ editable?: boolean;
50
+ editType?: 'text' | 'number' | 'select' | 'date';
51
+ editOptions?: string[];
52
+ validate?: (value: any, row: TData) => string | null;
53
+ }
54
+ interface PaginationConfig {
55
+ enabled: boolean;
56
+ pageSize: number;
57
+ totalCount: number;
58
+ currentPage: number;
59
+ serverSide: boolean;
60
+ onPageChange: (page: number) => void;
61
+ }
62
+ interface SelectionConfig {
63
+ enabled: boolean;
64
+ selectAllPages?: boolean;
65
+ selectedIds?: Set<string>;
66
+ onSelectionChange?: (ids: Set<string>) => void;
67
+ onSelectAllPages?: (enabled: boolean) => void;
68
+ renderSelectionCell?: (row: any) => ReactNode;
69
+ }
70
+ interface FiltersConfig {
71
+ enabled: boolean;
72
+ position: 'top' | 'side';
73
+ collapsible: boolean;
74
+ config: FilterConfig;
75
+ value: FilterState;
76
+ onChange: (filters: FilterState) => void;
77
+ presets?: FilterPreset[];
78
+ showPresets?: boolean;
79
+ }
80
+ interface FilterConfig {
81
+ sections: FilterSection[];
82
+ }
83
+ interface FilterSection {
84
+ id: string;
85
+ type: 'chips' | 'buckets' | 'dropdown' | 'search' | 'range' | 'date' | 'collapsible' | 'custom';
86
+ label?: string;
87
+ filters?: FilterItem[];
88
+ buckets?: FilterBucket[];
89
+ customFilter?: CustomFilterHandler;
90
+ }
91
+ interface CustomFilterHandler {
92
+ render: (value: any, onChange: (value: any) => void) => ReactNode;
93
+ apply?: <TData>(data: TData[], filterValue: any) => TData[];
94
+ toApiParams?: (filterValue: any) => Record<string, string>;
95
+ defaultValue?: any;
96
+ isActive?: (value: any) => boolean;
97
+ }
98
+ interface FilterItem {
99
+ id: string;
100
+ label: string;
101
+ type?: 'chips' | 'dropdown' | 'search' | 'checkbox';
102
+ options?: string[];
103
+ multiple?: boolean;
104
+ }
105
+ interface FilterBucket {
106
+ label: string;
107
+ min: number;
108
+ max: number;
109
+ }
110
+ interface FilterState {
111
+ [key: string]: any;
112
+ }
113
+ interface FilterPreset {
114
+ id: string;
115
+ label: string;
116
+ icon?: LucideIcon;
117
+ filters: FilterState;
118
+ description?: string;
119
+ }
120
+ interface BulkAction {
121
+ id: string;
122
+ label: string;
123
+ icon: LucideIcon;
124
+ variant: 'default' | 'gradient-purple' | 'gradient-green' | 'gradient-indigo' | 'gradient-orange' | 'gradient-blue';
125
+ onClick: (selectedIds: Set<string>) => Promise<void> | void;
126
+ maxSelection?: number;
127
+ confirmMessage?: string;
128
+ disabled?: (selectedIds: Set<string>) => boolean;
129
+ }
130
+ interface RowAction<TData> {
131
+ id: string;
132
+ label: string;
133
+ icon?: LucideIcon;
134
+ onClick: (row: TData) => void;
135
+ disabled?: (row: TData) => boolean;
136
+ destructive?: boolean;
137
+ separator?: boolean;
138
+ }
139
+ interface SearchConfig {
140
+ enabled: boolean;
141
+ placeholder: string;
142
+ value: string;
143
+ onChange: (value: string) => void;
144
+ debounceMs?: number;
145
+ autoFocus?: boolean;
146
+ preserveFocus?: boolean;
147
+ }
148
+ interface SortingConfig {
149
+ enabled: boolean;
150
+ serverSide: boolean;
151
+ value?: SortState;
152
+ onChange?: (sort: SortState) => void;
153
+ }
154
+ interface SortState {
155
+ sortBy: string | null;
156
+ sortDirection: 'asc' | 'desc';
157
+ }
158
+ interface URLPersistenceConfig {
159
+ enabled: boolean;
160
+ debounceMs?: number;
161
+ }
162
+ interface ColumnVisibilityConfig {
163
+ enabled: boolean;
164
+ defaultVisible?: string[];
165
+ alwaysVisible?: string[];
166
+ persistKey?: string;
167
+ }
168
+ interface ColumnVisibilityState {
169
+ [columnId: string]: boolean;
170
+ }
171
+ interface ColumnReorderConfig {
172
+ enabled: boolean;
173
+ initialOrder?: string[] | null;
174
+ onOrderChange?: (order: string[]) => void;
175
+ }
176
+ interface ColumnResizeConfig {
177
+ enabled: boolean;
178
+ initialWidths?: {
179
+ [columnId: string]: number;
180
+ } | null;
181
+ minWidth?: number;
182
+ onWidthChange?: (widths: {
183
+ [columnId: string]: number;
184
+ }) => void;
185
+ }
186
+ interface InlineEditConfig<TData> {
187
+ enabled: boolean;
188
+ onSave: (rowId: string, columnId: string, value: any, row: TData) => Promise<void>;
189
+ onCancel?: () => void;
190
+ optimisticUpdate?: boolean;
191
+ }
192
+ interface SavedView {
193
+ id: string;
194
+ name: string;
195
+ isDefault?: boolean;
196
+ createdAt: string;
197
+ columnVisibility?: {
198
+ [columnId: string]: boolean;
199
+ };
200
+ columnOrder?: string[];
201
+ sortBy?: string | null;
202
+ sortDirection?: 'asc' | 'desc';
203
+ filters?: {
204
+ [key: string]: any;
205
+ };
206
+ pageSize?: number;
207
+ }
208
+ interface SavedViewsConfig {
209
+ enabled: boolean;
210
+ views?: SavedView[];
211
+ currentViewId?: string | null;
212
+ onSaveView: (view: Omit<SavedView, 'id' | 'createdAt'>) => Promise<SavedView>;
213
+ onUpdateView?: (viewId: string, updates: Partial<SavedView>) => Promise<void>;
214
+ onDeleteView?: (viewId: string) => Promise<void>;
215
+ onLoadView?: (viewId: string) => void;
216
+ getCurrentViewState?: () => Omit<SavedView, 'id' | 'name' | 'createdAt'>;
217
+ }
218
+ interface ExportConfig {
219
+ enabled: boolean;
220
+ baseFilename?: string;
221
+ formats?: ('csv' | 'excel')[];
222
+ showProgress?: boolean;
223
+ onExportStart?: (format: 'csv' | 'excel', scope: 'all' | 'filtered' | 'selected') => void;
224
+ onExportComplete?: (format: 'csv' | 'excel', scope: 'all' | 'filtered' | 'selected', rowCount: number) => void;
225
+ onExportError?: (error: Error) => void;
226
+ }
227
+ interface MobileCardConfig$1<TData> {
228
+ titleKey: string;
229
+ subtitleKey?: string;
230
+ descriptionKey?: string;
231
+ primaryFields: string[];
232
+ secondaryFields?: string[];
233
+ renderCustomContent?: (row: TData) => ReactNode;
234
+ }
235
+ interface TableState<TData> {
236
+ data: TData[];
237
+ filteredData: TData[];
238
+ displayedData: TData[];
239
+ currentPage: number;
240
+ pageSize: number;
241
+ totalPages: number;
242
+ totalCount: number;
243
+ selectedIds: Set<string>;
244
+ selectAllPages: boolean;
245
+ activeFilters: FilterState;
246
+ sortBy: string | null;
247
+ sortDirection: 'asc' | 'desc';
248
+ searchTerm: string;
249
+ debouncedSearchTerm: string;
250
+ loading: boolean;
251
+ loadingRows: Set<string>;
252
+ error: Error | null;
253
+ viewMode: 'table' | 'card';
254
+ }
255
+ interface UseTableStateReturn<TData> {
256
+ state: TableState<TData>;
257
+ setData: (data: TData[]) => void;
258
+ setPage: (page: number) => void;
259
+ setPageSize: (size: number) => void;
260
+ setLoading: (loading: boolean) => void;
261
+ setLoadingRows: (ids: Set<string>) => void;
262
+ setError: (error: Error | null) => void;
263
+ setViewMode: (mode: 'table' | 'card') => void;
264
+ }
265
+ interface UseSelectionReturn {
266
+ selectedIds: Set<string>;
267
+ selectAllPages: boolean;
268
+ toggleRow: (id: string) => void;
269
+ toggleAll: () => void;
270
+ selectAllPagesToggle: () => void;
271
+ clearSelection: () => void;
272
+ getSelectedCount: () => number;
273
+ }
274
+ interface UsePaginationReturn {
275
+ currentPage: number;
276
+ pageSize: number;
277
+ totalPages: number;
278
+ totalCount: number;
279
+ canGoNext: boolean;
280
+ canGoPrevious: boolean;
281
+ goToPage: (page: number) => void;
282
+ goToFirstPage: () => void;
283
+ goToLastPage: () => void;
284
+ goToNextPage: () => void;
285
+ goToPreviousPage: () => void;
286
+ getPageNumbers: () => (number | '...')[];
287
+ getDisplayRange: () => {
288
+ start: number;
289
+ end: number;
290
+ };
291
+ }
292
+ interface UseFiltersReturn {
293
+ filters: FilterState;
294
+ setFilter: (key: string, value: any) => void;
295
+ clearFilter: (key: string) => void;
296
+ clearAllFilters: () => void;
297
+ hasActiveFilters: () => boolean;
298
+ getActiveFilterCount: () => number;
299
+ }
300
+
301
+ declare function UnifiedTable<TData>({ data, columns, tableId, getRowId, pagination: paginationConfig, selection: selectionConfig, filters: filtersConfig, bulkActions, rowActions, search: searchConfig, sorting: sortingConfig, columnVisibility: columnVisibilityConfig, columnReorder: columnReorderConfig, columnResize: columnResizeConfig, inlineEdit: inlineEditConfig, savedViews: savedViewsConfig, urlPersistence: urlPersistenceConfig, export: exportConfig, onRowClick, mobileConfig, loading, loadingRows, className, emptyState, errorState, }: UnifiedTableProps<TData>): react_jsx_runtime.JSX.Element;
302
+
303
+ interface MobileCardField {
304
+ key: string;
305
+ label?: string;
306
+ render?: (value: any, row: any) => ReactNode;
307
+ className?: string;
308
+ }
309
+ interface MobileCardAction {
310
+ id: string;
311
+ label: string;
312
+ icon?: React.ComponentType<{
313
+ className?: string;
314
+ }>;
315
+ onClick: (row: any) => void | Promise<void>;
316
+ variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';
317
+ disabled?: (row: any) => boolean;
318
+ hidden?: (row: any) => boolean;
319
+ className?: string;
320
+ }
321
+ interface MobileCardConfig<TData = any> {
322
+ titleKey: string;
323
+ titleRender?: (row: TData) => ReactNode;
324
+ subtitleKey?: string;
325
+ subtitleRender?: (row: TData) => ReactNode;
326
+ imageKey?: string;
327
+ imageRender?: (row: TData) => ReactNode;
328
+ primaryFields: MobileCardField[];
329
+ secondaryFields?: MobileCardField[];
330
+ actions?: MobileCardAction[];
331
+ renderCustomContent?: (row: TData) => ReactNode;
332
+ renderCustomHeader?: (row: TData) => ReactNode;
333
+ renderCustomFooter?: (row: TData) => ReactNode;
334
+ showSelection?: boolean;
335
+ onSelectionChange?: (id: string, selected: boolean) => void;
336
+ isSelected?: (row: TData) => boolean;
337
+ onClick?: (row: TData) => void;
338
+ className?: string;
339
+ headerClassName?: string;
340
+ contentClassName?: string;
341
+ footerClassName?: string;
342
+ }
343
+ interface MobileViewProps<TData = any> {
344
+ data: TData[];
345
+ config: MobileCardConfig<TData>;
346
+ getRowId?: (row: TData) => string;
347
+ loading?: boolean;
348
+ loadingRows?: Set<string>;
349
+ emptyState?: ReactNode;
350
+ className?: string;
351
+ }
352
+ interface CardProps<TData = any> {
353
+ row: TData;
354
+ config: MobileCardConfig<TData>;
355
+ rowId?: string;
356
+ isLoading?: boolean;
357
+ className?: string;
358
+ }
359
+ interface CardActionsProps {
360
+ actions: MobileCardAction[];
361
+ row: any;
362
+ className?: string;
363
+ maxVisibleActions?: number;
364
+ }
365
+ declare const MOBILE_BREAKPOINT = 768;
366
+
367
+ declare function Card<TData = any>({ row, config, rowId, isLoading, className }: CardProps<TData>): react_jsx_runtime.JSX.Element;
368
+
369
+ declare function CardActions({ actions, row, className, maxVisibleActions }: CardActionsProps): react_jsx_runtime.JSX.Element | null;
370
+
371
+ declare function MobileView<TData = any>({ data, config, getRowId, loading, loadingRows, emptyState, className }: MobileViewProps<TData>): react_jsx_runtime.JSX.Element;
372
+
373
+ interface UseTableStateProps<TData> {
374
+ initialData?: TData[];
375
+ initialPageSize?: number;
376
+ }
377
+ declare function useTableState<TData>({ initialData, initialPageSize, }: UseTableStateProps<TData>): UseTableStateReturn<TData>;
378
+
379
+ interface UseSelectionProps {
380
+ currentPageData: any[];
381
+ totalCount: number;
382
+ getRowId: (row: any) => string;
383
+ onSelectionChange?: (ids: Set<string>) => void;
384
+ onSelectAllPages?: (enabled: boolean) => void;
385
+ externalSelectedIds?: Set<string>;
386
+ externalSelectAllPages?: boolean;
387
+ }
388
+ declare function useSelection({ currentPageData, totalCount, getRowId, onSelectionChange, onSelectAllPages, externalSelectedIds, externalSelectAllPages, }: UseSelectionProps): UseSelectionReturn;
389
+
390
+ interface UsePaginationProps {
391
+ totalCount: number;
392
+ initialPageSize?: number;
393
+ initialPage?: number;
394
+ serverSide?: boolean;
395
+ onPageChange?: (page: number) => void;
396
+ }
397
+ declare function usePagination({ totalCount, initialPageSize, initialPage, serverSide, onPageChange, }: UsePaginationProps): UsePaginationReturn;
398
+
399
+ interface UseFiltersProps {
400
+ initialFilters?: FilterState;
401
+ onChange?: (filters: FilterState) => void;
402
+ }
403
+ declare function useFilters({ initialFilters, onChange, }: UseFiltersProps): UseFiltersReturn;
404
+
405
+ interface ResponsiveBreakpoints {
406
+ mobile: number;
407
+ tablet: number;
408
+ desktop: number;
409
+ }
410
+ type ViewMode = 'mobile' | 'tablet' | 'desktop';
411
+ declare function useResponsive(breakpoints?: ResponsiveBreakpoints): {
412
+ viewMode: ViewMode;
413
+ windowWidth: number;
414
+ isMobile: boolean;
415
+ isTablet: boolean;
416
+ isDesktop: boolean;
417
+ isMobileOrTablet: boolean;
418
+ };
419
+
420
+ interface UseColumnVisibilityOptions {
421
+ defaultVisibility?: ColumnVisibilityState;
422
+ persistKey?: string;
423
+ onVisibilityChange?: (visibility: ColumnVisibilityState) => void;
424
+ }
425
+ declare function useColumnVisibility({ defaultVisibility, persistKey, onVisibilityChange }?: UseColumnVisibilityOptions): {
426
+ columnVisibility: ColumnVisibilityState;
427
+ setColumnVisibility: React$1.Dispatch<React$1.SetStateAction<ColumnVisibilityState>>;
428
+ toggleColumn: (columnId: string) => void;
429
+ showColumn: (columnId: string) => void;
430
+ hideColumn: (columnId: string) => void;
431
+ showAllColumns: () => void;
432
+ hideAllColumns: (exceptColumns?: string[]) => void;
433
+ resetVisibility: () => void;
434
+ isColumnVisible: (columnId: string) => boolean;
435
+ };
436
+
437
+ interface TablePreferences {
438
+ columnVisibility: ColumnVisibilityState;
439
+ columnOrder: string[] | null;
440
+ defaultSortColumn: string | null;
441
+ defaultSortDirection: 'asc' | 'desc' | null;
442
+ pageSize: number;
443
+ }
444
+ interface UseTablePreferencesOptions {
445
+ tableId: string;
446
+ enabled?: boolean;
447
+ defaultColumnVisibility?: ColumnVisibilityState;
448
+ defaultPageSize?: number;
449
+ debounceMs?: number;
450
+ apiFetch?: typeof fetch;
451
+ }
452
+ interface UseTablePreferencesReturn {
453
+ preferences: TablePreferences | null;
454
+ isLoading: boolean;
455
+ error: Error | null;
456
+ updateColumnVisibility: (visibility: ColumnVisibilityState) => void;
457
+ updateColumnOrder: (order: string[]) => void;
458
+ updateSortPreference: (sort: SortState) => void;
459
+ updatePageSize: (size: number) => void;
460
+ resetPreferences: () => Promise<void>;
461
+ }
462
+ declare function useTablePreferences({ tableId, enabled, defaultColumnVisibility, defaultPageSize, debounceMs, apiFetch }: UseTablePreferencesOptions): UseTablePreferencesReturn;
463
+
464
+ interface UseTableKeyboardProps<TData> {
465
+ data: TData[];
466
+ getRowId: (row: TData) => string;
467
+ selectedIds?: Set<string>;
468
+ onToggleRow?: (id: string) => void;
469
+ onToggleAll?: () => void;
470
+ onRowClick?: (row: TData) => void;
471
+ onDelete?: (ids: Set<string>) => void;
472
+ tableRef: RefObject<HTMLElement | null>;
473
+ enabled?: boolean;
474
+ }
475
+ interface UseTableKeyboardReturn {
476
+ focusedRowIndex: number;
477
+ setFocusedRowIndex: (index: number) => void;
478
+ handleKeyDown: (event: React.KeyboardEvent) => void;
479
+ }
480
+ /**
481
+ * Hook for handling keyboard navigation in UnifiedTable
482
+ *
483
+ * Features:
484
+ * - Arrow Up/Down: Navigate between rows
485
+ * - Enter: Expand/click row (trigger onRowClick)
486
+ * - Space: Toggle row selection
487
+ * - Tab: Move between interactive elements (native browser behavior)
488
+ * - Escape: Close menus/dialogs (handled by menu components)
489
+ * - Ctrl/Cmd+A: Select all rows
490
+ * - Delete: Trigger delete action if available
491
+ */
492
+ declare function useTableKeyboard<TData>({ data, getRowId, selectedIds, onToggleRow, onToggleAll, onRowClick, onDelete, tableRef, enabled, }: UseTableKeyboardProps<TData>): UseTableKeyboardReturn;
493
+
494
+ interface UseTableURLConfig {
495
+ tableId: string;
496
+ persistToUrl: boolean;
497
+ debounceMs?: number;
498
+ }
499
+ interface TableURLState {
500
+ sortBy: string | null;
501
+ sortDirection: 'asc' | 'desc';
502
+ filters: FilterState;
503
+ page: number;
504
+ search: string;
505
+ }
506
+ interface UseTableURLReturn {
507
+ getURLState: () => TableURLState;
508
+ setSortToURL: (sort: SortState) => void;
509
+ setFiltersToURL: (filters: FilterState) => void;
510
+ setPageToURL: (page: number) => void;
511
+ setSearchToURL: (search: string) => void;
512
+ clearURLState: () => void;
513
+ hasURLState: () => boolean;
514
+ }
515
+ /**
516
+ * Hook for persisting table state to URL query parameters.
517
+ * Enables shareability and browser navigation for table state.
518
+ *
519
+ * URL params are namespaced with tableId prefix:
520
+ * - {tableId}_sortBy: column ID
521
+ * - {tableId}_sortDir: 'asc' | 'desc'
522
+ * - {tableId}_page: current page number
523
+ * - {tableId}_search: search term
524
+ * - {tableId}_filter_{filterKey}: filter values (JSON encoded)
525
+ *
526
+ * @example
527
+ * const urlState = useTableURL({
528
+ * tableId: 'firms',
529
+ * persistToUrl: true,
530
+ * debounceMs: 300
531
+ * })
532
+ *
533
+ * // Read initial state from URL
534
+ * const initialState = urlState.getURLState()
535
+ *
536
+ * // Update URL when state changes
537
+ * urlState.setSortToURL({ sortBy: 'name', sortDirection: 'asc' })
538
+ * urlState.setSearchToURL('acme')
539
+ */
540
+ declare function useTableURL({ tableId, persistToUrl, debounceMs, }: UseTableURLConfig): UseTableURLReturn;
541
+
542
+ interface UseColumnReorderOptions<TData> {
543
+ columns: ColumnConfig<TData>[];
544
+ initialOrder?: string[] | null;
545
+ enabled?: boolean;
546
+ onOrderChange?: (order: string[]) => void;
547
+ }
548
+ interface UseColumnReorderReturn<TData> {
549
+ orderedColumns: ColumnConfig<TData>[];
550
+ columnOrder: string[];
551
+ handleDragEnd: (result: DropResult) => void;
552
+ resetOrder: () => void;
553
+ }
554
+ declare function useColumnReorder<TData>({ columns, initialOrder, enabled, onOrderChange, }: UseColumnReorderOptions<TData>): UseColumnReorderReturn<TData>;
555
+
556
+ interface ColumnWidths {
557
+ [columnId: string]: number;
558
+ }
559
+ interface UseColumnResizeOptions {
560
+ enabled?: boolean;
561
+ initialWidths?: ColumnWidths | null;
562
+ minWidth?: number;
563
+ onWidthChange?: (widths: ColumnWidths) => void;
564
+ }
565
+ interface UseColumnResizeReturn {
566
+ columnWidths: ColumnWidths;
567
+ getColumnWidth: (columnId: string, defaultWidth?: number) => number | undefined;
568
+ startResize: (columnId: string, startX: number, startWidth: number) => void;
569
+ resetWidths: () => void;
570
+ isResizing: boolean;
571
+ resizingColumn: string | null;
572
+ }
573
+ declare function useColumnResize({ enabled, initialWidths, minWidth, onWidthChange, }?: UseColumnResizeOptions): UseColumnResizeReturn;
574
+
575
+ type CellRenderer<TData = any> = (value: any, row: TData) => ReactNode;
576
+ interface RendererConfig {
577
+ [columnId: string]: CellRenderer;
578
+ }
579
+ declare function createCellRenderer<TData = any>(render: (value: any, row: TData) => ReactNode): CellRenderer<TData>;
580
+ declare function getNestedValue(obj: any, path: string): any;
581
+ declare const commonRenderers: {
582
+ text: CellRenderer<any>;
583
+ number: CellRenderer<any>;
584
+ currency: CellRenderer<any>;
585
+ percentage: CellRenderer<any>;
586
+ date: CellRenderer<any>;
587
+ datetime: CellRenderer<any>;
588
+ boolean: CellRenderer<any>;
589
+ badge: CellRenderer<any>;
590
+ truncate: CellRenderer<any>;
591
+ array: CellRenderer<any>;
592
+ };
593
+ declare function combineRenderers<TData = any>(...renderers: CellRenderer<TData>[]): CellRenderer<TData>;
594
+
595
+ interface TableTheme {
596
+ name: string;
597
+ container: string;
598
+ header: string;
599
+ headerCell: string;
600
+ body: string;
601
+ row: string;
602
+ rowHover: string;
603
+ rowSelected: string;
604
+ cell: string;
605
+ pagination: string;
606
+ emptyState: string;
607
+ mobileCard: string;
608
+ mobileCardHeader: string;
609
+ mobileCardContent: string;
610
+ }
611
+ declare const defaultTheme: TableTheme;
612
+ declare const compactTheme: TableTheme;
613
+ declare const spaciousTheme: TableTheme;
614
+ declare const minimalTheme: TableTheme;
615
+ declare const themes: {
616
+ default: TableTheme;
617
+ compact: TableTheme;
618
+ spacious: TableTheme;
619
+ minimal: TableTheme;
620
+ };
621
+ type ThemeName = keyof typeof themes;
622
+ declare function getTheme(themeName?: ThemeName): TableTheme;
623
+ declare function createCustomTheme(baseTheme: ThemeName | undefined, overrides: Partial<TableTheme>): TableTheme;
624
+
625
+ interface ValidationResult {
626
+ valid: boolean;
627
+ errors: string[];
628
+ warnings: string[];
629
+ }
630
+ declare function validateMobileCardConfig<TData = any>(config: MobileCardConfig<TData>): ValidationResult;
631
+ declare function validateColumnConfig(columns: any[]): ValidationResult;
632
+ declare function logValidationResults(configName: string, result: ValidationResult, throwOnError?: boolean): void;
633
+
634
+ type ExportFormat = 'csv' | 'excel';
635
+ interface ExportOptions {
636
+ filename: string;
637
+ format: ExportFormat;
638
+ includeHeaders?: boolean;
639
+ dateFormat?: string;
640
+ }
641
+ /**
642
+ * Exports data to CSV format
643
+ * @param data Array of data to export
644
+ * @param columns Visible columns configuration
645
+ * @param filename Name of the file to download (without extension)
646
+ * @param includeHeaders Whether to include header row (default: true)
647
+ */
648
+ declare function exportToCSV<TData>(data: TData[], columns: ColumnConfig<TData>[], filename: string, includeHeaders?: boolean): void;
649
+ /**
650
+ * Exports data to Excel format (XLSX)
651
+ * @param data Array of data to export
652
+ * @param columns Visible columns configuration
653
+ * @param filename Name of the file to download (without extension)
654
+ * @param includeHeaders Whether to include header row (default: true)
655
+ */
656
+ declare function exportToExcel<TData>(data: TData[], columns: ColumnConfig<TData>[], filename: string, includeHeaders?: boolean): void;
657
+ /**
658
+ * Generic export function that routes to CSV or Excel based on format
659
+ * @param data Array of data to export
660
+ * @param columns Visible columns configuration
661
+ * @param options Export options including format and filename
662
+ */
663
+ declare function exportData<TData>(data: TData[], columns: ColumnConfig<TData>[], options: ExportOptions): void;
664
+ /**
665
+ * Helper to generate a filename with timestamp
666
+ */
667
+ declare function generateExportFilename(baseFilename: string): string;
668
+
669
+ type ExportScope = 'all' | 'filtered' | 'selected';
670
+ interface ExportButtonProps<TData> {
671
+ data: TData[];
672
+ filteredData?: TData[];
673
+ selectedData?: TData[];
674
+ columns: ColumnConfig<TData>[];
675
+ baseFilename?: string;
676
+ disabled?: boolean;
677
+ className?: string;
678
+ showProgress?: boolean;
679
+ onExportStart?: (format: 'csv' | 'excel', scope: ExportScope) => void;
680
+ onExportComplete?: (format: 'csv' | 'excel', scope: ExportScope, rowCount: number) => void;
681
+ onExportError?: (error: Error) => void;
682
+ }
683
+
684
+ interface SavedViewsDropdownProps {
685
+ views: SavedView[];
686
+ currentViewId?: string | null;
687
+ onSaveView: (view: Omit<SavedView, 'id' | 'createdAt'>) => Promise<SavedView>;
688
+ onUpdateView?: (viewId: string, updates: Partial<SavedView>) => Promise<void>;
689
+ onDeleteView?: (viewId: string) => Promise<void>;
690
+ onLoadView: (viewId: string) => void;
691
+ getCurrentViewState: () => Omit<SavedView, 'id' | 'name' | 'createdAt'>;
692
+ }
693
+
694
+ interface StandardTableToolbarProps<TData> {
695
+ searchEnabled?: boolean;
696
+ searchPlaceholder?: string;
697
+ searchValue?: string;
698
+ onSearchChange?: (value: string) => void;
699
+ searchInputRef?: RefObject<HTMLInputElement | null>;
700
+ searchAutoFocus?: boolean;
701
+ columnVisibilityEnabled?: boolean;
702
+ hideableColumns?: ColumnConfig<TData>[];
703
+ columnVisibility?: ColumnVisibilityState;
704
+ onToggleColumnVisibility?: (columnId: string) => void;
705
+ exportEnabled?: boolean;
706
+ exportProps?: Omit<ExportButtonProps<TData>, 'data' | 'columns'>;
707
+ exportData?: TData[];
708
+ exportColumns?: ColumnConfig<TData>[];
709
+ savedViewsEnabled?: boolean;
710
+ savedViews?: SavedView[];
711
+ currentViewId?: string | null;
712
+ savedViewsProps?: Omit<SavedViewsDropdownProps, 'views' | 'currentViewId'>;
713
+ className?: string;
714
+ }
715
+ /**
716
+ * StandardTableToolbar provides a consistent toolbar layout across all tables.
717
+ *
718
+ * Layout (left to right):
719
+ * - Search input (left)
720
+ * - Export button
721
+ * - Columns dropdown (right)
722
+ */
723
+ declare function StandardTableToolbar<TData>({ searchEnabled, searchPlaceholder, searchValue, onSearchChange, searchInputRef, searchAutoFocus, columnVisibilityEnabled, hideableColumns, columnVisibility, onToggleColumnVisibility, exportEnabled, exportProps, exportData, exportColumns, savedViewsEnabled, savedViews, currentViewId, savedViewsProps, className, }: StandardTableToolbarProps<TData>): react_jsx_runtime.JSX.Element;
724
+
725
+ export { type BulkAction, Card, CardActions, type CardActionsProps, type CardProps, type CellRenderer, type ColumnConfig, type ColumnReorderConfig, type ColumnResizeConfig, type ColumnVisibilityConfig, type ColumnVisibilityState, type CustomFilterHandler, type ExportConfig, type ExportFormat, type ExportOptions, type FilterBucket, type FilterConfig, type FilterItem, type FilterPreset, type FilterSection, type FilterState, type FiltersConfig, type InlineEditConfig, MOBILE_BREAKPOINT, type MobileCardAction, type MobileCardConfig, type MobileCardField, MobileView, type MobileViewProps, type PaginationConfig, type RendererConfig, type ResponsiveBreakpoints, type RowAction, type SavedView, type SavedViewsConfig, type SearchConfig, type SelectionConfig, type SortState, type SortingConfig, StandardTableToolbar, type StandardTableToolbarProps, type TableState, type TableTheme, type TableURLState, type ThemeName, type URLPersistenceConfig, UnifiedTable, type UnifiedTableProps, type UseColumnVisibilityOptions, type UseFiltersReturn, type UsePaginationReturn, type UseSelectionReturn, type UseTableKeyboardProps, type UseTableKeyboardReturn, type UseTableStateReturn, type UseTableURLConfig, type UseTableURLReturn, type ValidationResult, type ViewMode, combineRenderers, commonRenderers, compactTheme, createCellRenderer, createCustomTheme, defaultTheme, exportData, exportToCSV, exportToExcel, generateExportFilename, getNestedValue, getTheme, logValidationResults, minimalTheme, spaciousTheme, themes, useColumnReorder, useColumnResize, useColumnVisibility, useFilters, usePagination, useResponsive, useSelection, useTableKeyboard, useTablePreferences, useTableState, useTableURL, validateColumnConfig, validateMobileCardConfig };