@turtleclub/core 0.1.0-beta.100

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,574 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import { PaginationState, SortingState } from '@tanstack/react-table';
4
+
5
+ interface RangeSliderFilterProps {
6
+ /** Query key for minimum value (default: 'min') */
7
+ minQueryKey?: string;
8
+ /** Query key for maximum value (default: 'max') */
9
+ maxQueryKey?: string;
10
+ /** Minimum value (default: 0) */
11
+ min?: number;
12
+ /** Maximum value (default: 100) */
13
+ max?: number;
14
+ /** Step value for slider (default: 1) */
15
+ step?: number;
16
+ /** Whether the filter is disabled */
17
+ disabled?: boolean;
18
+ /** Custom label for the filter */
19
+ label: string;
20
+ /** Whether to show values (default: true) */
21
+ showValues?: boolean;
22
+ /** Value formatter function */
23
+ formatValue?: (value: number) => string;
24
+ /** Custom className for the container */
25
+ className?: string;
26
+ /** Whether to render in a popover (default: false) */
27
+ usePopover?: boolean;
28
+ }
29
+ declare function RangeSliderFilter({ minQueryKey, maxQueryKey, min, max, step, disabled, label, showValues, formatValue, className, usePopover, }: RangeSliderFilterProps): react_jsx_runtime.JSX.Element;
30
+
31
+ interface BooleanSwitchFilterProps {
32
+ /** Query key for the boolean value (default: 'enabled') */
33
+ queryKey?: string;
34
+ /** Default value when not set (default: false) */
35
+ defaultValue?: boolean;
36
+ /** Whether the switch is disabled */
37
+ disabled?: boolean;
38
+ /** Label for the switch */
39
+ label: string;
40
+ /** Description text (optional) */
41
+ description?: string;
42
+ /** Custom className for the container */
43
+ className?: string;
44
+ }
45
+ declare function BooleanFilter({ queryKey, defaultValue, disabled, label, description, className, }: BooleanSwitchFilterProps): react_jsx_runtime.JSX.Element;
46
+
47
+ interface FilterProps {
48
+ /** Query parameter key */
49
+ queryKey: string;
50
+ /** Child component to render (selector) */
51
+ children: (props: {
52
+ value: string;
53
+ onValueChange: (value: string) => void;
54
+ }) => React.ReactNode;
55
+ /** Callback when value changes */
56
+ onValueChange?: (value: string) => void;
57
+ }
58
+ /**
59
+ * Generic Filter component that handles nuqs URL state management for single values.
60
+ *
61
+ * Provides value and onValueChange props to child components,
62
+ * decoupling selector logic from URL state management.
63
+ *
64
+ * @example Basic Single Selection
65
+ * ```tsx
66
+ * // Single chain selection - persists to URL as ?chainId=ethereum
67
+ * <Filter queryKey="chainId">
68
+ * {({ value, onValueChange }) => (
69
+ * <ChainSelector
70
+ * value={value}
71
+ * onValueChange={onValueChange}
72
+ * placeholder="Select chain"
73
+ * />
74
+ * )}
75
+ * </Filter>
76
+ * ```
77
+ */
78
+ declare function Filter({ queryKey, children, onValueChange }: FilterProps): react_jsx_runtime.JSX.Element;
79
+
80
+ interface MultiSelectFilterProps {
81
+ /** Query parameter key */
82
+ queryKey: string;
83
+ /** Child component to render (selector) */
84
+ children: (props: {
85
+ value: string[];
86
+ onValueChange: (values: string[]) => void;
87
+ }) => React.ReactNode;
88
+ /** Callback when values change */
89
+ onValueChange?: (values: string[]) => void;
90
+ }
91
+ /**
92
+ * Generic MultiSelectFilter component that handles nuqs URL state management for array values.
93
+ *
94
+ * Provides value and onValueChange props to child components,
95
+ * decoupling selector logic from URL state management.
96
+ *
97
+ * @example
98
+ * ```tsx
99
+ * <MultiSelectFilter queryKey="chainId">
100
+ * {({ value, onValueChange }) => (
101
+ * <ChainsSelector
102
+ * value={value}
103
+ * onValueChange={onValueChange}
104
+ * placeholder="Select chains"
105
+ * />
106
+ * )}
107
+ * </MultiSelectFilter>
108
+ * ```
109
+ */
110
+ declare function MultiSelectFilter({ queryKey, children, onValueChange }: MultiSelectFilterProps): react_jsx_runtime.JSX.Element;
111
+
112
+ interface FilterConfig {
113
+ key: string;
114
+ label: string;
115
+ component: React.ReactNode;
116
+ enabled: boolean;
117
+ section?: string;
118
+ }
119
+ interface FiltersGridProps {
120
+ filters: FilterConfig[];
121
+ columns?: number;
122
+ className?: string;
123
+ sectionClassName?: string;
124
+ }
125
+ declare function FiltersGrid({ filters, columns, className, sectionClassName, }: FiltersGridProps): react_jsx_runtime.JSX.Element | null;
126
+
127
+ interface FiltersPopoverProps {
128
+ filters: FilterConfig[];
129
+ triggerLabel?: React.ReactNode;
130
+ columns?: number;
131
+ className?: string;
132
+ popoverClassName?: string;
133
+ sectionClassName?: string;
134
+ align?: "start" | "center" | "end";
135
+ /** Callback function to clear all filters */
136
+ onClearAll?: () => void;
137
+ }
138
+ declare function FiltersPopover({ filters, triggerLabel, columns, className, popoverClassName, sectionClassName, align, onClearAll, }: FiltersPopoverProps): react_jsx_runtime.JSX.Element | null;
139
+
140
+ interface ActiveFilterConfig {
141
+ /** Unique key for the filter */
142
+ key: string;
143
+ /** Display label for the filter */
144
+ label: string;
145
+ /** Current filter value to display */
146
+ value: string;
147
+ /** Query parameter key(s) this filter uses */
148
+ queryKeys: string | string[];
149
+ /** Whether this filter is currently active */
150
+ isActive: boolean;
151
+ }
152
+ interface ActiveFilterBadgesProps {
153
+ /** Array of filter configurations */
154
+ filters: ActiveFilterConfig[];
155
+ /** Custom className for the container */
156
+ className?: string;
157
+ /** Label for clear all button (default: "Clear All") */
158
+ clearAllLabel?: string;
159
+ /** Whether to show clear all button (default: true) */
160
+ showClearAll?: boolean;
161
+ /** Custom render function for individual badges */
162
+ renderBadge?: (filter: ActiveFilterConfig, clearFilter: () => void) => React.ReactNode;
163
+ /** Callback function to clear individual filter */
164
+ onClearFilter: (queryKeys: string | string[]) => void;
165
+ /** Callback function to clear all filters */
166
+ onClearAll: (allQueryKeys: (string | string[])[]) => void;
167
+ }
168
+ /**
169
+ * Component that displays active filter badges with individual clear buttons
170
+ * and an optional "clear all" button.
171
+ *
172
+ * @example
173
+ * ```tsx
174
+ * const activeFilters = [
175
+ * {
176
+ * key: 'chain',
177
+ * label: 'Chain',
178
+ * value: 'Ethereum',
179
+ * queryKeys: 'chainId',
180
+ * isActive: true,
181
+ * },
182
+ * {
183
+ * key: 'sorting',
184
+ * label: 'Sort',
185
+ * value: 'Name (A-Z)',
186
+ * queryKeys: ['sortBy', 'sortOrder'],
187
+ * isActive: true,
188
+ * },
189
+ * ];
190
+ *
191
+ * <ActiveFilterBadges filters={activeFilters} />
192
+ * ```
193
+ */
194
+ declare function ActiveFilterBadges({ filters, className, clearAllLabel, showClearAll, renderBadge, onClearFilter, onClearAll, }: ActiveFilterBadgesProps): react_jsx_runtime.JSX.Element | null;
195
+
196
+ interface FiltersWrapperProps {
197
+ /** Array of filter configurations */
198
+ filters: FilterConfig[];
199
+ /** Array of active filter configurations for badges */
200
+ activeFilters: ActiveFilterConfig[];
201
+ /** Layout type: 'grid' or 'popover' */
202
+ layout: "grid" | "popover";
203
+ /** Custom className for the wrapper */
204
+ className?: string;
205
+ /** Custom className for the active badges section */
206
+ badgesClassName?: string;
207
+ /** Custom className for the slot container */
208
+ slotClassName?: string;
209
+ /** Optional content to render on the left side of filters */
210
+ leftSlot?: React.ReactNode;
211
+ /** Optional content to render on the right side of filters */
212
+ rightSlot?: React.ReactNode;
213
+ /** Number of columns for grid layout (default: 3) */
214
+ columns?: number;
215
+ /** Button label for popover trigger (default: "Filters") */
216
+ triggerLabel?: string;
217
+ /** Number of columns in popover (default: 2) */
218
+ popoverColumns?: number;
219
+ /** Custom className for popover trigger button */
220
+ popoverClassName?: string;
221
+ /** Custom className for popover content */
222
+ popoverContentClassName?: string;
223
+ /** Alignment for popover (default: "start") */
224
+ align?: "start" | "center" | "end";
225
+ /** Label for clear all button (default: "Clear All") */
226
+ clearAllLabel?: string;
227
+ /** Whether to show clear all button (default: true) */
228
+ showClearAll?: boolean;
229
+ /** Custom render function for individual badges */
230
+ renderBadge?: (filter: ActiveFilterConfig, clearFilter: () => void) => React.ReactNode;
231
+ /** Whether to show active filter badges (default: true) */
232
+ showActiveBadges?: boolean;
233
+ /** Callback function to clear individual filter */
234
+ onClearFilter: (queryKeys: string | string[]) => void;
235
+ /** Callback function to clear all filters */
236
+ onClearAll: (allQueryKeys: (string | string[])[]) => void;
237
+ }
238
+ /**
239
+ * Unified wrapper component that combines filter controls with active filter badges.
240
+ *
241
+ * Supports both grid and popover layouts, automatically displays active filter badges
242
+ * below the filter controls with individual and bulk clear functionality.
243
+ *
244
+ * @example
245
+ * ```tsx
246
+ * const filters = [
247
+ * {
248
+ * key: 'chain',
249
+ * label: 'Chain',
250
+ * component: <ChainFilter />,
251
+ * enabled: true,
252
+ * },
253
+ * ];
254
+ *
255
+ * const activeFilters = [
256
+ * {
257
+ * key: 'chain',
258
+ * label: 'Chain',
259
+ * value: 'Ethereum',
260
+ * queryKeys: 'chainId',
261
+ * isActive: true,
262
+ * },
263
+ * ];
264
+ *
265
+ * <FiltersWrapper
266
+ * layout="grid"
267
+ * filters={filters}
268
+ * activeFilters={activeFilters}
269
+ * />
270
+ * ```
271
+ */
272
+ declare function FiltersWrapper({ filters, activeFilters, layout, className, badgesClassName, slotClassName, leftSlot, rightSlot, columns, triggerLabel, popoverColumns, popoverClassName, popoverContentClassName, align, clearAllLabel, showClearAll, renderBadge, showActiveBadges, onClearFilter, onClearAll, }: FiltersWrapperProps): react_jsx_runtime.JSX.Element;
273
+
274
+ interface UsePaginationOptions {
275
+ /** Default page size (default: 10) */
276
+ defaultPageSize?: number;
277
+ /** Default page index (default: 0) */
278
+ defaultPageIndex?: number;
279
+ /** Query param key for page index (default: 'page') */
280
+ pageIndexKey?: string;
281
+ /** Query param key for page size (default: 'pageSize') */
282
+ pageSizeKey?: string;
283
+ }
284
+ interface UsePaginationReturn {
285
+ /** Current pagination state for TanStack Table */
286
+ pagination: PaginationState;
287
+ /** Function to update pagination state */
288
+ setPagination: (updater: PaginationState | ((prev: PaginationState) => PaginationState)) => void;
289
+ /** Current page index (0-based) */
290
+ pageIndex: number;
291
+ /** Current page size */
292
+ pageSize: number;
293
+ /** Set page index directly */
294
+ setPageIndex: (pageIndex: number) => void;
295
+ /** Set page size directly */
296
+ setPageSize: (pageSize: number) => void;
297
+ /** Go to next page */
298
+ nextPage: (totalPages?: number) => void;
299
+ /** Go to previous page */
300
+ previousPage: () => void;
301
+ /** Go to first page */
302
+ firstPage: () => void;
303
+ /** Go to last page */
304
+ lastPage: (totalPages: number) => void;
305
+ /** Reset pagination to defaults */
306
+ reset: () => void;
307
+ /** Check if can go to next page */
308
+ canNextPage: (totalPages?: number) => boolean;
309
+ /** Check if can go to previous page */
310
+ canPreviousPage: boolean;
311
+ }
312
+ /**
313
+ * Hook for managing server-side pagination state using nuqs.
314
+ *
315
+ * This hook synchronizes pagination state with URL query parameters,
316
+ * making it perfect for server-side pagination where the URL should
317
+ * reflect the current page and page size.
318
+ *
319
+ * @example
320
+ * ```tsx
321
+ * function MyTable() {
322
+ * const {
323
+ * pagination,
324
+ * setPagination,
325
+ * pageIndex,
326
+ * pageSize,
327
+ * setPageIndex,
328
+ * setPageSize
329
+ * } = usePagination({
330
+ * defaultPageSize: 20,
331
+ * pageIndexKey: 'page',
332
+ * pageSizeKey: 'limit'
333
+ * });
334
+ *
335
+ * // Use with TanStack Table
336
+ * const table = useReactTable({
337
+ * data,
338
+ * columns,
339
+ * manualPagination: true,
340
+ * pagination,
341
+ * onPaginationChange: setPagination,
342
+ * pageCount: Math.ceil(totalCount / pageSize),
343
+ * });
344
+ *
345
+ * return <DataTable table={table} />;
346
+ * }
347
+ * ```
348
+ */
349
+ declare function usePagination(options?: UsePaginationOptions): UsePaginationReturn;
350
+
351
+ interface UseSortingOptions {
352
+ /** Default sort column (default: undefined - no sorting) */
353
+ defaultSortBy?: string;
354
+ /** Default sort order (default: 'asc') */
355
+ defaultSortOrder?: "asc" | "desc";
356
+ /** Query param key for sort column (default: 'sortBy') */
357
+ sortByKey?: string;
358
+ /** Query param key for sort order (default: 'sortOrder') */
359
+ sortOrderKey?: string;
360
+ }
361
+ interface UseSortingReturn {
362
+ /** Current sorting state for TanStack Table */
363
+ sorting: SortingState;
364
+ /** Function to update sorting state */
365
+ setSorting: (updater: SortingState | ((prev: SortingState) => SortingState)) => void;
366
+ /** Current sort column (undefined if no sorting) */
367
+ sortBy: string | undefined;
368
+ /** Current sort order */
369
+ sortOrder: "asc" | "desc";
370
+ /** Set sort column and order directly */
371
+ setSort: (column: string, order?: "asc" | "desc") => void;
372
+ /** Clear all sorting */
373
+ clearSort: () => void;
374
+ /** Toggle sort order for a column */
375
+ toggleSort: (column: string) => void;
376
+ /** Check if a column is currently sorted */
377
+ isSorted: (column: string) => boolean;
378
+ /** Get sort order for a column */
379
+ getSortOrder: (column: string) => "asc" | "desc" | undefined;
380
+ }
381
+ /**
382
+ * Hook for managing server-side sorting state using nuqs.
383
+ *
384
+ * This hook synchronizes sorting state with URL query parameters,
385
+ * making it perfect for server-side sorting where the URL should
386
+ * reflect the current sort state.
387
+ *
388
+ * @example
389
+ * ```tsx
390
+ * function MyTable() {
391
+ * const {
392
+ * sorting,
393
+ * setSorting,
394
+ * sortBy,
395
+ * sortOrder,
396
+ * setSort,
397
+ * toggleSort
398
+ * } = useSorting({
399
+ * defaultSortBy: 'name',
400
+ * defaultSortOrder: 'asc'
401
+ * });
402
+ *
403
+ * // Use with TanStack Table
404
+ * const table = useReactTable({
405
+ * data,
406
+ * columns,
407
+ * manualSorting: true,
408
+ * sorting,
409
+ * onSortingChange: setSorting,
410
+ * });
411
+ *
412
+ * return <DataTable table={table} />;
413
+ * }
414
+ * ```
415
+ */
416
+ declare function useSorting(options?: UseSortingOptions): UseSortingReturn;
417
+
418
+ interface ChainSelectorProps$1 {
419
+ /** Selected chain IDs */
420
+ value: string[];
421
+ /** Callback when selection changes */
422
+ onValueChange: (values: string[]) => void;
423
+ /** Placeholder text */
424
+ placeholder?: string;
425
+ /** Whether the selector is disabled */
426
+ disabled?: boolean;
427
+ /** Custom className */
428
+ className?: string;
429
+ /** Maximum count to show in trigger */
430
+ maxCount?: number;
431
+ /** Whether to close on select */
432
+ closeOnSelect?: boolean;
433
+ /** Whether to show search */
434
+ searchable?: boolean;
435
+ }
436
+ declare function ChainsSelector({ value, onValueChange, placeholder, disabled, className, maxCount, closeOnSelect, searchable, }: ChainSelectorProps$1): react_jsx_runtime.JSX.Element;
437
+
438
+ interface TokenSelectorProps$1 {
439
+ /** Selected token IDs */
440
+ value: string[];
441
+ /** Callback when selection changes */
442
+ onValueChange: (values: string[]) => void;
443
+ /** Selected chain ID to filter tokens */
444
+ chainId?: string;
445
+ /** Placeholder text */
446
+ placeholder?: string;
447
+ /** Whether the selector is disabled */
448
+ disabled?: boolean;
449
+ /** Custom className */
450
+ className?: string;
451
+ /** Maximum count to show in trigger */
452
+ maxCount?: number;
453
+ /** Whether to close on select */
454
+ closeOnSelect?: boolean;
455
+ /** Whether to show search */
456
+ searchable?: boolean;
457
+ }
458
+ declare function TokensSelector({ value, onValueChange, chainId, placeholder, disabled, className, maxCount, closeOnSelect, searchable, }: TokenSelectorProps$1): react_jsx_runtime.JSX.Element;
459
+
460
+ interface ProductSelectorProps$1 {
461
+ /** Selected product IDs */
462
+ value: string[];
463
+ /** Callback when selection changes */
464
+ onValueChange: (values: string[]) => void;
465
+ /** Placeholder text */
466
+ placeholder?: string;
467
+ /** Whether the selector is disabled */
468
+ disabled?: boolean;
469
+ /** Custom className */
470
+ className?: string;
471
+ /** Maximum count to show in trigger */
472
+ maxCount?: number;
473
+ /** Whether to close on select */
474
+ closeOnSelect?: boolean;
475
+ /** Whether to show search */
476
+ searchable?: boolean;
477
+ }
478
+ declare function ProductsSelector({ value, onValueChange, placeholder, disabled, className, maxCount, closeOnSelect, searchable, }: ProductSelectorProps$1): react_jsx_runtime.JSX.Element;
479
+
480
+ interface OpportunitySelectorProps$1 {
481
+ /** Selected opportunity IDs */
482
+ value: string[];
483
+ /** Callback when selection changes */
484
+ onValueChange: (values: string[]) => void;
485
+ /** Placeholder text */
486
+ placeholder?: string;
487
+ /** Whether the selector is disabled */
488
+ disabled?: boolean;
489
+ /** Custom className */
490
+ className?: string;
491
+ /** Maximum count to show in trigger */
492
+ maxCount?: number;
493
+ /** Whether to close on select */
494
+ closeOnSelect?: boolean;
495
+ /** Whether to show search */
496
+ searchable?: boolean;
497
+ }
498
+ declare function OpportunitiesSelector({ value, onValueChange, placeholder, disabled, className, maxCount, closeOnSelect, searchable, }: OpportunitySelectorProps$1): react_jsx_runtime.JSX.Element;
499
+
500
+ interface ChainSelectorProps {
501
+ /** Selected chain ID */
502
+ value: string;
503
+ /** Callback when selection changes */
504
+ onValueChange: (value: string) => void;
505
+ /** Placeholder text */
506
+ placeholder?: string;
507
+ /** Whether the selector is disabled */
508
+ disabled?: boolean;
509
+ /** Custom className */
510
+ className?: string;
511
+ /** Whether to close on select */
512
+ closeOnSelect?: boolean;
513
+ /** Whether to show search */
514
+ searchable?: boolean;
515
+ }
516
+ declare function ChainSelector({ value, onValueChange, placeholder, disabled, className, closeOnSelect, searchable, }: ChainSelectorProps): react_jsx_runtime.JSX.Element;
517
+
518
+ interface TokenSelectorProps {
519
+ /** Selected token ID */
520
+ value: string;
521
+ /** Callback when selection changes */
522
+ onValueChange: (value: string) => void;
523
+ /** Selected chain ID to filter tokens */
524
+ chainId?: string;
525
+ /** Placeholder text */
526
+ placeholder?: string;
527
+ /** Whether the selector is disabled */
528
+ disabled?: boolean;
529
+ /** Custom className */
530
+ className?: string;
531
+ /** Whether to close on select */
532
+ closeOnSelect?: boolean;
533
+ /** Whether to show search */
534
+ searchable?: boolean;
535
+ }
536
+ declare function TokenSelector({ value, onValueChange, chainId, placeholder, disabled, className, closeOnSelect, searchable, }: TokenSelectorProps): react_jsx_runtime.JSX.Element;
537
+
538
+ interface ProductSelectorProps {
539
+ /** Selected product ID */
540
+ value: string;
541
+ /** Callback when selection changes */
542
+ onValueChange: (value: string) => void;
543
+ /** Placeholder text */
544
+ placeholder?: string;
545
+ /** Whether the selector is disabled */
546
+ disabled?: boolean;
547
+ /** Custom className */
548
+ className?: string;
549
+ /** Whether to close on select */
550
+ closeOnSelect?: boolean;
551
+ /** Whether to show search */
552
+ searchable?: boolean;
553
+ }
554
+ declare function ProductSelector({ value, onValueChange, placeholder, disabled, className, closeOnSelect, searchable, }: ProductSelectorProps): react_jsx_runtime.JSX.Element;
555
+
556
+ interface OpportunitySelectorProps {
557
+ /** Selected opportunity ID */
558
+ value: string;
559
+ /** Callback when selection changes */
560
+ onValueChange: (value: string) => void;
561
+ /** Placeholder text */
562
+ placeholder?: string;
563
+ /** Whether the selector is disabled */
564
+ disabled?: boolean;
565
+ /** Custom className */
566
+ className?: string;
567
+ /** Whether to close on select */
568
+ closeOnSelect?: boolean;
569
+ /** Whether to show search */
570
+ searchable?: boolean;
571
+ }
572
+ declare function OpportunitySelector({ value, onValueChange, placeholder, disabled, className, closeOnSelect, searchable, }: OpportunitySelectorProps): react_jsx_runtime.JSX.Element;
573
+
574
+ export { ActiveFilterBadges, type ActiveFilterBadgesProps, type ActiveFilterConfig, BooleanFilter, ChainSelector, ChainsSelector, Filter, type FilterConfig, FiltersGrid, type FiltersGridProps, FiltersPopover, type FiltersPopoverProps, FiltersWrapper, type FiltersWrapperProps, MultiSelectFilter, OpportunitiesSelector, OpportunitySelector, ProductSelector, ProductsSelector, RangeSliderFilter, TokenSelector, TokensSelector, type UsePaginationOptions, type UsePaginationReturn, type UseSortingOptions, type UseSortingReturn, usePagination, useSorting };